(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o> 6]; var primitive = (tag & 0x20) === 0; // Multi-octet tag - load if ((tag & 0x1f) === 0x1f) { var oct = tag; tag = 0; while ((oct & 0x80) === 0x80) { oct = buf.readUInt8(fail); if (buf.isError(oct)) return oct; tag <<= 7;="" tag="" |="oct" &="" 0x7f;="" }="" else="" {="" var="" tagstr="der.tag[tag];" return="" cls:="" cls,="" primitive:="" primitive,="" tag:="" tag,="" tagstr:="" };="" function="" derdecodelen(buf,="" fail)="" len="buf.readUInt8(fail);" if="" (buf.iserror(len))="" len;="" indefinite="" form="" (!primitive="" &&="" 0x80)="" null;="" definite="" ((len="" 0)="" short="" long="" num="len" (num="">= 4) return buf.error('length octect is too long'); len = 0; for (var i = 0; i < num; i++) { len <<= 8;="" var="" j="buf.readUInt8(fail);" if="" (buf.iserror(j))="" return="" j;="" len="" |="j;" }="" len;="" },{"..="" ..="" asn1":2,"inherits":92}],11:[function(require,module,exports){="" decoders="exports;" decoders.der="require('./der');" decoders.pem="require('./pem');" },{".="" der":10,".="" pem":12}],12:[function(require,module,exports){="" inherits="require('inherits');" buffer="require('buffer').Buffer;" asn1="require('../../asn1');" derdecoder="require('./der');" function="" pemdecoder(entity)="" {="" derdecoder.call(this,="" entity);="" this.enc="pem" ;="" };="" inherits(pemdecoder,="" derdecoder);="" module.exports="PEMDecoder;" pemdecoder.prototype.decode="function" decode(data,="" options)="" lines="data.toString().split(/[\r\n]+/g);" label="options.label.toUpperCase();" re="/^-----(BEGIN|END)" ([^-]+)-----$="" start="-1;" end="-1;" for="" (var="" i="0;" <="" lines.length;="" i++)="" match="lines[i].match(re);" (match="==" null)="" continue;="" (match[2]="" !="=" label)="" (start="==" -1)="" (match[1]="" 'begin')="" break;="" else="" 'end')="" -1="" ||="" throw="" new="" error('pem="" section="" not="" found="" for:="" '="" +="" label);="" base64="lines.slice(start" 1,="" end).join('');="" remove="" excessive="" symbols="" base64.replace(="" [^a-z0-9\+\="" =]+="" gi,="" '');="" input="new" buffer(base64,="" 'base64');="" derdecoder.prototype.decode.call(this,="" input,="" options);="" asn1":2,".="" der":10,"buffer":45,"inherits":92}],13:[function(require,module,exports){="" base="asn1.base;" bignum="asn1.bignum;" import="" der="" constants="" derencoder(entity)="" this.name="entity.name;" this.entity="entity;" construct="" tree="" this.tree="new" dernode();="" this.tree._init(entity.body);="" derencoder.prototype.encode="function" encode(data,="" reporter)="" this.tree._encode(data,="" reporter).join();="" methods="" dernode(parent)="" base.node.call(this,="" 'der',="" parent);="" inherits(dernode,="" base.node);="" dernode.prototype._encodecomposite="function" encodecomposite(tag,="" primitive,="" cls,="" content)="" encodedtag="encodeTag(tag," this.reporter);="" short="" form="" (content.length="" 0x80)="" header="new" buffer(2);="" header[0]="encodedTag;" header[1]="content.length;" this._createencoderbuffer([="" header,="" content="" ]);="" long="" count="" octets="" required to="" store="" length="" lenoctets="1;">= 0x100; i >>= 8) lenOctets++; var header = new Buffer(1 + 1 + lenOctets); header[0] = encodedTag; header[1] = 0x80 | lenOctets; for (var i = 1 + lenOctets, j = content.length; j > 0; i--, j >>= 8) header[i] = j & 0xff; return this._createEncoderBuffer([ header, content ]); }; DERNode.prototype._encodeStr = function encodeStr(str, tag) { if (tag === 'octstr') { return this._createEncoderBuffer(str); } else if (tag === 'bitstr') { return this._createEncoderBuffer([ str.unused | 0, str.data ]); } else if (tag === 'ia5str' || tag === 'utf8str') { return this._createEncoderBuffer(str); } else if (tag === 'bmpstr') { var buf = new Buffer(str.length * 2); for (var i = 0; i < str.length; i++) { buf.writeUInt16BE(str.charCodeAt(i), i * 2); } return this._createEncoderBuffer(buf); } else if (tag === 'numstr') { if (!this._isNumstr(str)) { return this.reporter.error('Encoding of string type: numstr supports ' + 'only digits and space'); } return this._createEncoderBuffer(str); } else if (tag === 'printstr') { if (!this._isPrintstr(str)) { return this.reporter.error('Encoding of string type: printstr supports ' + 'only latin upper and lower case letters, ' + 'digits, space, apostrophe, left and rigth ' + 'parenthesis, plus sign, comma, hyphen, ' + 'dot, slash, colon, equal sign, ' + 'question mark'); } return this._createEncoderBuffer(str); } else { return this.reporter.error('Encoding of string type: ' + tag + ' unsupported'); } }; DERNode.prototype._encodeObjid = function encodeObjid(id, values, relative) { if (typeof id === 'string') { if (!values) return this.reporter.error('string objid given, but no values map found'); if (!values.hasOwnProperty(id)) return this.reporter.error('objid not found in values map'); id = values[id].split(/[\s\.]+/g); for (var i = 0; i < id.length; i++) id[i] |= 0; } else if (Array.isArray(id)) { id = id.slice(); for (var i = 0; i < id.length; i++) id[i] |= 0; } if (!Array.isArray(id)) { return this.reporter.error('objid() should be either array or string, ' + 'got: ' + JSON.stringify(id)); } if (!relative) { if (id[1] >= 40) return this.reporter.error('Second objid identifier OOB'); id.splice(0, 2, id[0] * 40 + id[1]); } // Count number of octets var size = 0; for (var i = 0; i < id.length; i++) { var ident = id[i]; for (size++; ident >= 0x80; ident >>= 7) size++; } var objid = new Buffer(size); var offset = objid.length - 1; for (var i = id.length - 1; i >= 0; i--) { var ident = id[i]; objid[offset--] = ident & 0x7f; while ((ident >>= 7) > 0) objid[offset--] = 0x80 | (ident & 0x7f); } return this._createEncoderBuffer(objid); }; function two(num) { if (num < 10) return '0' + num; else return num; } DERNode.prototype._encodeTime = function encodeTime(time, tag) { var str; var date = new Date(time); if (tag === 'gentime') { str = [ two(date.getFullYear()), two(date.getUTCMonth() + 1), two(date.getUTCDate()), two(date.getUTCHours()), two(date.getUTCMinutes()), two(date.getUTCSeconds()), 'Z' ].join(''); } else if (tag === 'utctime') { str = [ two(date.getFullYear() % 100), two(date.getUTCMonth() + 1), two(date.getUTCDate()), two(date.getUTCHours()), two(date.getUTCMinutes()), two(date.getUTCSeconds()), 'Z' ].join(''); } else { this.reporter.error('Encoding ' + tag + ' time is not supported yet'); } return this._encodeStr(str, 'octstr'); }; DERNode.prototype._encodeNull = function encodeNull() { return this._createEncoderBuffer(''); }; DERNode.prototype._encodeInt = function encodeInt(num, values) { if (typeof num === 'string') { if (!values) return this.reporter.error('String int or enum given, but no values map'); if (!values.hasOwnProperty(num)) { return this.reporter.error('Values map doesn\'t contain: ' + JSON.stringify(num)); } num = values[num]; } // Bignum, assume big endian if (typeof num !== 'number' && !Buffer.isBuffer(num)) { var numArray = num.toArray(); if (!num.sign && numArray[0] & 0x80) { numArray.unshift(0); } num = new Buffer(numArray); } if (Buffer.isBuffer(num)) { var size = num.length; if (num.length === 0) size++; var out = new Buffer(size); num.copy(out); if (num.length === 0) out[0] = 0 return this._createEncoderBuffer(out); } if (num < 0x80) return this._createEncoderBuffer(num); if (num < 0x100) return this._createEncoderBuffer([0, num]); var size = 1; for (var i = num; i >= 0x100; i >>= 8) size++; var out = new Array(size); for (var i = out.length - 1; i >= 0; i--) { out[i] = num & 0xff; num >>= 8; } if(out[0] & 0x80) { out.unshift(0); } return this._createEncoderBuffer(new Buffer(out)); }; DERNode.prototype._encodeBool = function encodeBool(value) { return this._createEncoderBuffer(value ? 0xff : 0); }; DERNode.prototype._use = function use(entity, obj) { if (typeof entity === 'function') entity = entity(obj); return entity._getEncoder('der').tree; }; DERNode.prototype._skipDefault = function skipDefault(dataBuffer, reporter, parent) { var state = this._baseState; var i; if (state['default'] === null) return false; var data = dataBuffer.join(); if (state.defaultBuffer === undefined) state.defaultBuffer = this._encodeValue(state['default'], reporter, parent).join(); if (data.length !== state.defaultBuffer.length) return false; for (i=0; i < data.length; i++) if (data[i] !== state.defaultBuffer[i]) return false; return true; }; // Utility methods function encodeTag(tag, primitive, cls, reporter) { var res; if (tag === 'seqof') tag = 'seq'; else if (tag === 'setof') tag = 'set'; if (der.tagByName.hasOwnProperty(tag)) res = der.tagByName[tag]; else if (typeof tag === 'number' && (tag | 0) === tag) res = tag; else return reporter.error('Unknown tag: ' + tag); if (res >= 0x1f) return reporter.error('Multi-octet tag encoding unsupported'); if (!primitive) res |= 0x20; res |= (der.tagClassByName[cls || 'universal'] << 6); return res; } },{"../../asn1":2,"buffer":45,"inherits":92}],14:[function(require,module,exports){ var encoders = exports; encoders.der = require('./der'); encoders.pem = require('./pem'); },{"./der":13,"./pem":15}],15:[function(require,module,exports){ var inherits = require('inherits'); var Buffer = require('buffer').Buffer; var asn1 = require('../../asn1'); var DEREncoder = require('./der'); function PEMEncoder(entity) { DEREncoder.call(this, entity); this.enc = 'pem'; }; inherits(PEMEncoder, DEREncoder); module.exports = PEMEncoder; PEMEncoder.prototype.encode = function encode(data, options) { var buf = DEREncoder.prototype.encode.call(this, data); var p = buf.toString('base64'); var out = [ '-----BEGIN ' + options.label + '-----' ]; for (var i = 0; i < p.length; i += 64) out.push(p.slice(i, i + 64)); out.push('-----END ' + options.label + '-----'); return out.join('\n'); }; },{"../../asn1":2,"./der":13,"buffer":45,"inherits":92}],16:[function(require,module,exports){ ;(function (exports) { 'use strict' var lookup = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' var Arr = (typeof Uint8Array !== 'undefined') ? Uint8Array : Array var PLUS = '+'.charCodeAt(0) var SLASH = '/'.charCodeAt(0) var NUMBER = '0'.charCodeAt(0) var LOWER = 'a'.charCodeAt(0) var UPPER = 'A'.charCodeAt(0) var PLUS_URL_SAFE = '-'.charCodeAt(0) var SLASH_URL_SAFE = '_'.charCodeAt(0) function decode (elt) { var code = elt.charCodeAt(0) if (code === PLUS || code === PLUS_URL_SAFE) return 62 // '+' if (code === SLASH || code === SLASH_URL_SAFE) return 63 // '/' if (code < NUMBER) return -1 // no match if (code < NUMBER + 10) return code - NUMBER + 26 + 26 if (code < UPPER + 26) return code - UPPER if (code < LOWER + 26) return code - LOWER + 26 } function b64ToByteArray (b64) { var i, j, l, tmp, placeHolders, arr if (b64.length % 4 > 0) { throw new Error('Invalid string. Length must be a multiple of 4') } // the number of equal signs (place holders) // if there are two placeholders, than the two characters before it // represent one byte // if there is only one, then the three characters before it represent 2 bytes // this is just a cheap hack to not do indexOf twice var len = b64.length placeHolders = b64.charAt(len - 2) === '=' ? 2 : b64.charAt(len - 1) === '=' ? 1 : 0 // base64 is 4/3 + up to two characters of the original data arr = new Arr(b64.length * 3 / 4 - placeHolders) // if there are placeholders, only get up to the last complete 4 chars l = placeHolders > 0 ? b64.length - 4 : b64.length var L = 0 function push (v) { arr[L++] = v } for (i = 0, j = 0; i < l; i += 4, j += 3) { tmp = (decode(b64.charAt(i)) << 18) | (decode(b64.charAt(i + 1)) << 12) | (decode(b64.charAt(i + 2)) << 6) | decode(b64.charAt(i + 3)) push((tmp & 0xFF0000) >> 16) push((tmp & 0xFF00) >> 8) push(tmp & 0xFF) } if (placeHolders === 2) { tmp = (decode(b64.charAt(i)) << 2) | (decode(b64.charAt(i + 1)) >> 4) push(tmp & 0xFF) } else if (placeHolders === 1) { tmp = (decode(b64.charAt(i)) << 10) | (decode(b64.charAt(i + 1)) << 4) | (decode(b64.charAt(i + 2)) >> 2) push((tmp >> 8) & 0xFF) push(tmp & 0xFF) } return arr } function uint8ToBase64 (uint8) { var i var extraBytes = uint8.length % 3 // if we have 1 byte left, pad 2 bytes var output = '' var temp, length function encode (num) { return lookup.charAt(num) } function tripletToBase64 (num) { return encode(num >> 18 & 0x3F) + encode(num >> 12 & 0x3F) + encode(num >> 6 & 0x3F) + encode(num & 0x3F) } // go through the array every three bytes, we'll deal with trailing stuff later for (i = 0, length = uint8.length - extraBytes; i < length; i += 3) { temp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2]) output += tripletToBase64(temp) } // pad the end with zeros, but make sure to not forget the extra bytes switch (extraBytes) { case 1: temp = uint8[uint8.length - 1] output += encode(temp >> 2) output += encode((temp << 4) & 0x3F) output += '==' break case 2: temp = (uint8[uint8.length - 2] << 8) + (uint8[uint8.length - 1]) output += encode(temp >> 10) output += encode((temp >> 4) & 0x3F) output += encode((temp << 2) & 0x3F) output += '=' break default: break } return output } exports.toByteArray = b64ToByteArray exports.fromByteArray = uint8ToBase64 }(typeof exports === 'undefined' ? (this.base64js = {}) : exports)) },{}],17:[function(require,module,exports){ (function (module, exports) { 'use strict'; // Utils function assert (val, msg) { if (!val) throw new Error(msg || 'Assertion failed'); } // Could use `inherits` module, but don't want to move from single file // architecture yet. function inherits (ctor, superCtor) { ctor.super_ = superCtor; var TempCtor = function () {}; TempCtor.prototype = superCtor.prototype; ctor.prototype = new TempCtor(); ctor.prototype.constructor = ctor; } // BN function BN (number, base, endian) { // May be `new BN(bn)` ? if (number !== null && typeof number === 'object' && Array.isArray(number.words)) { return number; } this.negative = 0; this.words = null; this.length = 0; // Reduction context this.red = null; if (number !== null) { if (base === 'le' || base === 'be') { endian = base; base = 10; } this._init(number || 0, base || 10, endian || 'be'); } } if (typeof module === 'object') { module.exports = BN; } else { exports.BN = BN; } BN.BN = BN; BN.wordSize = 26; var Buffer; try { Buffer = require('buf' + 'fer').Buffer; } catch (e) { } BN.max = function max (left, right) { if (left.cmp(right) > 0) return left; return right; }; BN.min = function min (left, right) { if (left.cmp(right) < 0) return left; return right; }; BN.prototype._init = function init (number, base, endian) { if (typeof number === 'number') { return this._initNumber(number, base, endian); } if (typeof number === 'object') { return this._initArray(number, base, endian); } if (base === 'hex') { base = 16; } assert(base === (base | 0) && base >= 2 && base <= 0="" 1="" 2="" 53="" 36);="" number="number.toString().replace(/\s+/g," '');="" var="" start="0;" if="" (number[0]="==" '-')="" {="" start++;="" }="" (base="==" 16)="" this._parsehex(number,="" start);="" else="" this._parsebase(number,="" base,="" this.negative="1;" this.strip();="" (endian="" !="=" 'le')="" return;="" this._initarray(this.toarray(),="" endian);="" };="" bn.prototype._initnumber="function" _initnumber="" (number,="" endian)="" (number="" <="" 0)="" 0x4000000)="" this.words="[" &="" 0x3ffffff="" ];="" this.length="1;" 0x10000000000000)="" 0x3ffffff,="" assert(number="" 0x20000000000000);="" ^="" (unsafe)="" reverse="" the="" bytes="" bn.prototype._initarray="function" _initarray="" perhaps="" a="" uint8array="" assert(typeof="" number.length="==" 'number');="" (number.length="" return="" this;="" 3);="" array(this.length);="" for="" (var="" i="0;" this.length;="" i++)="" this.words[i]="0;" j,="" w;="" off="0;" 'be')="" (i="number.length" -="" 1,="" j="0;">= 0; i -= 3) { w = number[i] | (number[i - 1] << 8) | (number[i - 2] << 16); this.words[j] |= (w << off) & 0x3ffffff; this.words[j + 1] = (w >>> (26 - off)) & 0x3ffffff; off += 24; if (off >= 26) { off -= 26; j++; } } } else if (endian === 'le') { for (i = 0, j = 0; i < number.length; i += 3) { w = number[i] | (number[i + 1] << 8) | (number[i + 2] << 16); this.words[j] |= (w << off) & 0x3ffffff; this.words[j + 1] = (w >>> (26 - off)) & 0x3ffffff; off += 24; if (off >= 26) { off -= 26; j++; } } } return this.strip(); }; function parseHex (str, start, end) { var r = 0; var len = Math.min(str.length, end); for (var i = start; i < len; i++) { var c = str.charCodeAt(i) - 48; r <<= 4;="" 'a'="" -="" 'f'="" if="" (c="">= 49 && c <= 49="" 54)="" {="" r="" |="c" -="" +="" 0xa;="" 'a'="" 'f'="" }="" else="" if="" (c="">= 17 && c <= 17="" 22)="" {="" r="" |="c" -="" +="" 0xa;="" '0'="" '9'="" }="" else="" &="" 0xf;="" return="" r;="" bn.prototype._parsehex="function" _parsehex="" (number,="" start)="" create="" possibly="" bigger="" array="" to="" ensure="" that="" it="" fits="" the="" number="" this.length="Math.ceil((number.length" 6);="" this.words="new" array(this.length);="" for="" (var="" i="0;" <="" this.length;="" i++)="" this.words[i]="0;" var="" j,="" w;="" scan="" 24-bit="" chunks="" and="" add="" them="" off="0;" (i="number.length" 6,="" j="0;">= start; i -= 6) { w = parseHex(number, i, i + 6); this.words[j] |= (w << off) & 0x3ffffff; this.words[j + 1] |= w >>> (26 - off) & 0x3fffff; off += 24; if (off >= 26) { off -= 26; j++; } } if (i + 6 !== start) { w = parseHex(number, start, i + 6); this.words[j] |= (w << off) & 0x3ffffff; this.words[j + 1] |= w >>> (26 - off) & 0x3fffff; } this.strip(); }; function parseBase (str, start, end, mul) { var r = 0; var len = Math.min(str.length, end); for (var i = start; i < len; i++) { var c = str.charCodeAt(i) - 48; r *= mul; // 'a' if (c >= 49) { r += c - 49 + 0xa; // 'A' } else if (c >= 17) { r += c - 17 + 0xa; // '0' - '9' } else { r += c; } } return r; } BN.prototype._parseBase = function _parseBase (number, base, start) { // Initialize as zero this.words = [ 0 ]; this.length = 1; // Find length of limb in base for (var limbLen = 0, limbPow = 1; limbPow <= 0x3ffffff;="" limbpow="" *="base)" {="" limblen++;="" }="" limblen--;="" base)="" |="" 0;="" var="" total="number.length" -="" start;="" mod="total" %="" limblen;="" end="Math.min(total," mod)="" +="" word="0;" for="" (var="" i="start;" <="" end;="" i,="" limblen,="" base);="" this.imuln(limbpow);="" if="" (this.words[0]="" 0x4000000)="" this.words[0]="" else="" this._iaddn(word);="" (mod="" !="=" 0)="" pow="1;" number.length,="" (i="0;" mod;="" i++)="" this.imuln(pow);="" };="" bn.prototype.copy="function" copy="" (dest)="" dest.words="new" array(this.length);="" this.length;="" dest.words[i]="this.words[i];" dest.length="this.length;" dest.negative="this.negative;" dest.red="this.red;" bn.prototype.clone="function" clone="" ()="" r="new" bn(null);="" this.copy(r);="" return="" r;="" remove="" leading="" `0`="" from="" `this`="" bn.prototype.strip="function" strip="" while="" (this.length=""> 1 && this.words[this.length - 1] === 0) { this.length--; } return this._normSign(); }; BN.prototype._normSign = function _normSign () { // -0 = 0 if (this.length === 1 && this.words[0] === 0) { this.negative = 0; } return this; }; BN.prototype.inspect = function inspect () { return (this.red ? ''; }; /* var zeros = []; var groupSizes = []; var groupBases = []; var s = ''; var i = -1; while (++i < BN.wordSize) { zeros[i] = s; s += '0'; } groupSizes[0] = 0; groupSizes[1] = 0; groupBases[0] = 0; groupBases[1] = 0; var base = 2 - 1; while (++base < 36 + 1) { var groupSize = 0; var groupBase = 1; while (groupBase < (1 << BN.wordSize) / base) { groupBase *= base; groupSize += 1; } groupSizes[base] = groupSize; groupBases[base] = groupBase; } */ var zeros = [ '', '0', '00', '000', '0000', '00000', '000000', '0000000', '00000000', '000000000', '0000000000', '00000000000', '000000000000', '0000000000000', '00000000000000', '000000000000000', '0000000000000000', '00000000000000000', '000000000000000000', '0000000000000000000', '00000000000000000000', '000000000000000000000', '0000000000000000000000', '00000000000000000000000', '000000000000000000000000', '0000000000000000000000000' ]; var groupSizes = [ 0, 0, 25, 16, 12, 11, 10, 9, 8, 8, 7, 7, 7, 7, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 ]; var groupBases = [ 0, 0, 33554432, 43046721, 16777216, 48828125, 60466176, 40353607, 16777216, 43046721, 10000000, 19487171, 35831808, 62748517, 7529536, 11390625, 16777216, 24137569, 34012224, 47045881, 64000000, 4084101, 5153632, 6436343, 7962624, 9765625, 11881376, 14348907, 17210368, 20511149, 24300000, 28629151, 33554432, 39135393, 45435424, 52521875, 60466176 ]; BN.prototype.toString = function toString (base, padding) { base = base || 10; padding = padding | 0 || 1; var out; if (base === 16 || base === 'hex') { out = ''; var off = 0; var carry = 0; for (var i = 0; i < this.length; i++) { var w = this.words[i]; var word = (((w << off) | carry) & 0xffffff).toString(16); carry = (w >>> (24 - off)) & 0xffffff; if (carry !== 0 || i !== this.length - 1) { out = zeros[6 - word.length] + word + out; } else { out = word + out; } off += 2; if (off >= 26) { off -= 26; i--; } } if (carry !== 0) { out = carry.toString(16) + out; } while (out.length % padding !== 0) { out = '0' + out; } if (this.negative !== 0) { out = '-' + out; } return out; } if (base === (base | 0) && base >= 2 && base <= 2="" 53="" 36)="" {="" var="" groupsize="Math.floor(BN.wordSize" *="" math.ln2="" math.log(base));="" groupbase="Math.pow(base," groupsize);="" out="" ;="" c="this.clone();" c.negative="0;" while="" (!c.iszero())="" r="c.modn(groupBase).toString(base);" if="" -="" r.length]="" +="" out;="" }="" else="" (this.iszero())="" (out.length="" %="" padding="" !="=" 0)="" (this.negative="" return="" assert(false,="" 'base="" should="" be="" between="" and="" 36');="" };="" bn.prototype.tonumber="function" tonumber="" ()="" length="this.bitLength();" ret;="" (length="" <="26)" ret="this.words[0];" 0x4000000)="" this.words[0];="" 53)="" note:="" at="" this="" stage="" it="" is="" known="" that="" the="" top="" bit="" set="" (this.words[1]="" 'number="" can="" only="" safely="" store="" up="" to="" bits');="" ?="" -ret="" :="" bn.prototype.tojson="function" tojson="" this.tostring(16);="" bn.prototype.tobuffer="function" tobuffer="" (endian,="" length)="" assert(typeof="" buffer="" 'undefined');="" this.toarraylike(buffer,="" endian,="" length);="" bn.prototype.toarray="function" toarray="" this.toarraylike(array,="" bn.prototype.toarraylike="function" toarraylike="" (arraytype,="" bytelength="this.byteLength();" reqlength="length" ||="" math.max(1,="" bytelength);="" assert(bytelength="" 'byte="" array="" longer="" than="" desired="" length');="" assert(reqlength=""> 0, 'Requested array length <= 32="" 0');="" this.strip();="" var="" littleendian="endian" =="=" 'le';="" res="new" arraytype(reqlength);="" b,="" i;="" q="this.clone();" if="" (!littleendian)="" {="" assume="" big-endian="" for="" (i="0;" i="" <="" reqlength="" -="" bytelength;="" i++)="" res[i]="0;" }="" !q.iszero();="" b="q.andln(0xff);" q.iushrn(8);="" res[reqlength="" 1]="b;" else="" (;="" reqlength;="" return="" res;="" };="" (math.clz32)="" bn.prototype._countbits="function" _countbits="" (w)="" math.clz32(w);="" t="w;" r="0;" (t="">= 0x1000) { r += 13; t >>>= 13; } if (t >= 0x40) { r += 7; t >>>= 7; } if (t >= 0x8) { r += 4; t >>>= 4; } if (t >= 0x02) { r += 2; t >>>= 2; } return r + t; }; } BN.prototype._zeroBits = function _zeroBits (w) { // Short-cut if (w === 0) return 26; var t = w; var r = 0; if ((t & 0x1fff) === 0) { r += 13; t >>>= 13; } if ((t & 0x7f) === 0) { r += 7; t >>>= 7; } if ((t & 0xf) === 0) { r += 4; t >>>= 4; } if ((t & 0x3) === 0) { r += 2; t >>>= 2; } if ((t & 0x1) === 0) { r++; } return r; }; // Return number of used bits in a BN BN.prototype.bitLength = function bitLength () { var w = this.words[this.length - 1]; var hi = this._countBits(w); return (this.length - 1) * 26 + hi; }; function toBitArray (num) { var w = new Array(num.bitLength()); for (var bit = 0; bit < w.length; bit++) { var off = (bit / 26) | 0; var wbit = bit % 26; w[bit] = (num.words[off] & (1 << wbit)) >>> wbit; } return w; } // Number of trailing zero bits BN.prototype.zeroBits = function zeroBits () { if (this.isZero()) return 0; var r = 0; for (var i = 0; i < this.length; i++) { var b = this._zeroBits(this.words[i]); r += b; if (b !== 26) break; } return r; }; BN.prototype.byteLength = function byteLength () { return Math.ceil(this.bitLength() / 8); }; BN.prototype.toTwos = function toTwos (width) { if (this.negative !== 0) { return this.abs().inotn(width).iaddn(1); } return this.clone(); }; BN.prototype.fromTwos = function fromTwos (width) { if (this.testn(width - 1)) { return this.notn(width).iaddn(1).ineg(); } return this.clone(); }; BN.prototype.isNeg = function isNeg () { return this.negative !== 0; }; // Return negative clone of `this` BN.prototype.neg = function neg () { return this.clone().ineg(); }; BN.prototype.ineg = function ineg () { if (!this.isZero()) { this.negative ^= 1; } return this; }; // Or `num` with `this` in-place BN.prototype.iuor = function iuor (num) { while (this.length < num.length) { this.words[this.length++] = 0; } for (var i = 0; i < num.length; i++) { this.words[i] = this.words[i] | num.words[i]; } return this.strip(); }; BN.prototype.ior = function ior (num) { assert((this.negative | num.negative) === 0); return this.iuor(num); }; // Or `num` with `this` BN.prototype.or = function or (num) { if (this.length > num.length) return this.clone().ior(num); return num.clone().ior(this); }; BN.prototype.uor = function uor (num) { if (this.length > num.length) return this.clone().iuor(num); return num.clone().iuor(this); }; // And `num` with `this` in-place BN.prototype.iuand = function iuand (num) { // b = min-length(num, this) var b; if (this.length > num.length) { b = num; } else { b = this; } for (var i = 0; i < b.length; i++) { this.words[i] = this.words[i] & num.words[i]; } this.length = b.length; return this.strip(); }; BN.prototype.iand = function iand (num) { assert((this.negative | num.negative) === 0); return this.iuand(num); }; // And `num` with `this` BN.prototype.and = function and (num) { if (this.length > num.length) return this.clone().iand(num); return num.clone().iand(this); }; BN.prototype.uand = function uand (num) { if (this.length > num.length) return this.clone().iuand(num); return num.clone().iuand(this); }; // Xor `num` with `this` in-place BN.prototype.iuxor = function iuxor (num) { // a.length > b.length var a; var b; if (this.length > num.length) { a = this; b = num; } else { a = num; b = this; } for (var i = 0; i < b.length; i++) { this.words[i] = a.words[i] ^ b.words[i]; } if (this !== a) { for (; i < a.length; i++) { this.words[i] = a.words[i]; } } this.length = a.length; return this.strip(); }; BN.prototype.ixor = function ixor (num) { assert((this.negative | num.negative) === 0); return this.iuxor(num); }; // Xor `num` with `this` BN.prototype.xor = function xor (num) { if (this.length > num.length) return this.clone().ixor(num); return num.clone().ixor(this); }; BN.prototype.uxor = function uxor (num) { if (this.length > num.length) return this.clone().iuxor(num); return num.clone().iuxor(this); }; // Not ``this`` with ``width`` bitwidth BN.prototype.inotn = function inotn (width) { assert(typeof width === 'number' && width >= 0); var bytesNeeded = Math.ceil(width / 26) | 0; var bitsLeft = width % 26; // Extend the buffer with leading zeroes while (this.length < bytesNeeded) { this.words[this.length++] = 0; } if (bitsLeft > 0) { bytesNeeded--; } // Handle complete words for (var i = 0; i < bytesNeeded; i++) { this.words[i] = ~this.words[i] & 0x3ffffff; } // Handle the residue if (bitsLeft > 0) { this.words[i] = ~this.words[i] & (0x3ffffff >> (26 - bitsLeft)); } // And remove leading zeroes return this.strip(); }; BN.prototype.notn = function notn (width) { return this.clone().inotn(width); }; // Set `bit` of `this` BN.prototype.setn = function setn (bit, val) { assert(typeof bit === 'number' && bit >= 0); var off = (bit / 26) | 0; var wbit = bit % 26; while (this.length <= 0="" off)="" {="" this.words[this.length++]="0;" }="" if="" (val)="" this.words[off]="this.words[off]" |="" (1="" <<="" wbit);="" else="" &="" ~(1="" return="" this.strip();="" };="" add="" `num`="" to="" `this`="" in-place="" bn.prototype.iadd="function" iadd="" (num)="" var="" r;="" negative="" +="" positive="" (this.negative="" !="=" &&="" num.negative="==" 0)="" this.negative="0;" r="this.isub(num);" ^="1;" this._normsign();="" r._normsign();="" a.length=""> b.length var a, b; if (this.length > num.length) { a = this; b = num; } else { a = num; b = this; } var carry = 0; for (var i = 0; i < b.length; i++) { r = (a.words[i] | 0) + (b.words[i] | 0) + carry; this.words[i] = r & 0x3ffffff; carry = r >>> 26; } for (; carry !== 0 && i < a.length; i++) { r = (a.words[i] | 0) + carry; this.words[i] = r & 0x3ffffff; carry = r >>> 26; } this.length = a.length; if (carry !== 0) { this.words[this.length] = carry; this.length++; // Copy the rest of the words } else if (a !== this) { for (; i < a.length; i++) { this.words[i] = a.words[i]; } } return this; }; // Add `num` to `this` BN.prototype.add = function add (num) { var res; if (num.negative !== 0 && this.negative === 0) { num.negative = 0; res = this.sub(num); num.negative ^= 1; return res; } else if (num.negative === 0 && this.negative !== 0) { this.negative = 0; res = num.sub(this); this.negative = 1; return res; } if (this.length > num.length) return this.clone().iadd(num); return num.clone().iadd(this); }; // Subtract `num` from `this` in-place BN.prototype.isub = function isub (num) { // this - (-num) = this + num if (num.negative !== 0) { num.negative = 0; var r = this.iadd(num); num.negative = 1; return r._normSign(); // -this - num = -(this + num) } else if (this.negative !== 0) { this.negative = 0; this.iadd(num); this.negative = 1; return this._normSign(); } // At this point both numbers are positive var cmp = this.cmp(num); // Optimization - zeroify if (cmp === 0) { this.negative = 0; this.length = 1; this.words[0] = 0; return this; } // a > b var a, b; if (cmp > 0) { a = this; b = num; } else { a = num; b = this; } var carry = 0; for (var i = 0; i < b.length; i++) { r = (a.words[i] | 0) - (b.words[i] | 0) + carry; carry = r >> 26; this.words[i] = r & 0x3ffffff; } for (; carry !== 0 && i < a.length; i++) { r = (a.words[i] | 0) + carry; carry = r >> 26; this.words[i] = r & 0x3ffffff; } // Copy rest of the words if (carry === 0 && i < a.length && a !== this) { for (; i < a.length; i++) { this.words[i] = a.words[i]; } } this.length = Math.max(this.length, i); if (a !== this) { this.negative = 1; } return this.strip(); }; // Subtract `num` from `this` BN.prototype.sub = function sub (num) { return this.clone().isub(num); }; function smallMulTo (self, num, out) { out.negative = num.negative ^ self.negative; var len = (self.length + num.length) | 0; out.length = len; len = (len - 1) | 0; // Peel one iteration (compiler can't do it, because of code complexity) var a = self.words[0] | 0; var b = num.words[0] | 0; var r = a * b; var lo = r & 0x3ffffff; var carry = (r / 0x4000000) | 0; out.words[0] = lo; for (var k = 1; k < len; k++) { // Sum all words with the same `i + j = k` and accumulate `ncarry`, // note that ncarry could be >= 0x3ffffff var ncarry = carry >>> 26; var rword = carry & 0x3ffffff; var maxJ = Math.min(k, num.length - 1); for (var j = Math.max(0, k - self.length + 1); j <= maxj;="" j++)="" {="" var="" i="(k" -="" j)="" |="" 0;="" a="self.words[i]" b="num.words[j]" r="a" *="" +="" rword;="" ncarry="" 0x4000000)="" rword="r" &="" 0x3ffffff;="" }="" out.words[k]="rword" carry="ncarry" if="" (carry="" !="=" 0)="" else="" out.length--;="" return="" out.strip();="" todo(indutny):="" it="" may="" be="" reasonable="" to="" omit="" for="" users="" who="" don't="" need="" work="" with="" 256-bit="" numbers,="" otherwise="" gives="" 20%="" improvement="" multiplication="" (like="" elliptic="" secp256k1).="" comb10multo="function" (self,="" num,="" out)="" o="out.words;" c="0;" lo;="" mid;="" hi;="" a0="a[0]" al0="a0" 0x1fff;="" ah0="a0">>> 13; var a1 = a[1] | 0; var al1 = a1 & 0x1fff; var ah1 = a1 >>> 13; var a2 = a[2] | 0; var al2 = a2 & 0x1fff; var ah2 = a2 >>> 13; var a3 = a[3] | 0; var al3 = a3 & 0x1fff; var ah3 = a3 >>> 13; var a4 = a[4] | 0; var al4 = a4 & 0x1fff; var ah4 = a4 >>> 13; var a5 = a[5] | 0; var al5 = a5 & 0x1fff; var ah5 = a5 >>> 13; var a6 = a[6] | 0; var al6 = a6 & 0x1fff; var ah6 = a6 >>> 13; var a7 = a[7] | 0; var al7 = a7 & 0x1fff; var ah7 = a7 >>> 13; var a8 = a[8] | 0; var al8 = a8 & 0x1fff; var ah8 = a8 >>> 13; var a9 = a[9] | 0; var al9 = a9 & 0x1fff; var ah9 = a9 >>> 13; var b0 = b[0] | 0; var bl0 = b0 & 0x1fff; var bh0 = b0 >>> 13; var b1 = b[1] | 0; var bl1 = b1 & 0x1fff; var bh1 = b1 >>> 13; var b2 = b[2] | 0; var bl2 = b2 & 0x1fff; var bh2 = b2 >>> 13; var b3 = b[3] | 0; var bl3 = b3 & 0x1fff; var bh3 = b3 >>> 13; var b4 = b[4] | 0; var bl4 = b4 & 0x1fff; var bh4 = b4 >>> 13; var b5 = b[5] | 0; var bl5 = b5 & 0x1fff; var bh5 = b5 >>> 13; var b6 = b[6] | 0; var bl6 = b6 & 0x1fff; var bh6 = b6 >>> 13; var b7 = b[7] | 0; var bl7 = b7 & 0x1fff; var bh7 = b7 >>> 13; var b8 = b[8] | 0; var bl8 = b8 & 0x1fff; var bh8 = b8 >>> 13; var b9 = b[9] | 0; var bl9 = b9 & 0x1fff; var bh9 = b9 >>> 13; out.negative = self.negative ^ num.negative; out.length = 19; /* k = 0 */ lo = Math.imul(al0, bl0); mid = Math.imul(al0, bh0); mid += Math.imul(ah0, bl0); hi = Math.imul(ah0, bh0); var w0 = c + lo + ((mid & 0x1fff) << 13); c = hi + (mid >>> 13) + (w0 >>> 26); w0 &= 0x3ffffff; /* k = 1 */ lo = Math.imul(al1, bl0); mid = Math.imul(al1, bh0); mid += Math.imul(ah1, bl0); hi = Math.imul(ah1, bh0); lo += Math.imul(al0, bl1); mid += Math.imul(al0, bh1); mid += Math.imul(ah0, bl1); hi += Math.imul(ah0, bh1); var w1 = c + lo + ((mid & 0x1fff) << 13); c = hi + (mid >>> 13) + (w1 >>> 26); w1 &= 0x3ffffff; /* k = 2 */ lo = Math.imul(al2, bl0); mid = Math.imul(al2, bh0); mid += Math.imul(ah2, bl0); hi = Math.imul(ah2, bh0); lo += Math.imul(al1, bl1); mid += Math.imul(al1, bh1); mid += Math.imul(ah1, bl1); hi += Math.imul(ah1, bh1); lo += Math.imul(al0, bl2); mid += Math.imul(al0, bh2); mid += Math.imul(ah0, bl2); hi += Math.imul(ah0, bh2); var w2 = c + lo + ((mid & 0x1fff) << 13); c = hi + (mid >>> 13) + (w2 >>> 26); w2 &= 0x3ffffff; /* k = 3 */ lo = Math.imul(al3, bl0); mid = Math.imul(al3, bh0); mid += Math.imul(ah3, bl0); hi = Math.imul(ah3, bh0); lo += Math.imul(al2, bl1); mid += Math.imul(al2, bh1); mid += Math.imul(ah2, bl1); hi += Math.imul(ah2, bh1); lo += Math.imul(al1, bl2); mid += Math.imul(al1, bh2); mid += Math.imul(ah1, bl2); hi += Math.imul(ah1, bh2); lo += Math.imul(al0, bl3); mid += Math.imul(al0, bh3); mid += Math.imul(ah0, bl3); hi += Math.imul(ah0, bh3); var w3 = c + lo + ((mid & 0x1fff) << 13); c = hi + (mid >>> 13) + (w3 >>> 26); w3 &= 0x3ffffff; /* k = 4 */ lo = Math.imul(al4, bl0); mid = Math.imul(al4, bh0); mid += Math.imul(ah4, bl0); hi = Math.imul(ah4, bh0); lo += Math.imul(al3, bl1); mid += Math.imul(al3, bh1); mid += Math.imul(ah3, bl1); hi += Math.imul(ah3, bh1); lo += Math.imul(al2, bl2); mid += Math.imul(al2, bh2); mid += Math.imul(ah2, bl2); hi += Math.imul(ah2, bh2); lo += Math.imul(al1, bl3); mid += Math.imul(al1, bh3); mid += Math.imul(ah1, bl3); hi += Math.imul(ah1, bh3); lo += Math.imul(al0, bl4); mid += Math.imul(al0, bh4); mid += Math.imul(ah0, bl4); hi += Math.imul(ah0, bh4); var w4 = c + lo + ((mid & 0x1fff) << 13); c = hi + (mid >>> 13) + (w4 >>> 26); w4 &= 0x3ffffff; /* k = 5 */ lo = Math.imul(al5, bl0); mid = Math.imul(al5, bh0); mid += Math.imul(ah5, bl0); hi = Math.imul(ah5, bh0); lo += Math.imul(al4, bl1); mid += Math.imul(al4, bh1); mid += Math.imul(ah4, bl1); hi += Math.imul(ah4, bh1); lo += Math.imul(al3, bl2); mid += Math.imul(al3, bh2); mid += Math.imul(ah3, bl2); hi += Math.imul(ah3, bh2); lo += Math.imul(al2, bl3); mid += Math.imul(al2, bh3); mid += Math.imul(ah2, bl3); hi += Math.imul(ah2, bh3); lo += Math.imul(al1, bl4); mid += Math.imul(al1, bh4); mid += Math.imul(ah1, bl4); hi += Math.imul(ah1, bh4); lo += Math.imul(al0, bl5); mid += Math.imul(al0, bh5); mid += Math.imul(ah0, bl5); hi += Math.imul(ah0, bh5); var w5 = c + lo + ((mid & 0x1fff) << 13); c = hi + (mid >>> 13) + (w5 >>> 26); w5 &= 0x3ffffff; /* k = 6 */ lo = Math.imul(al6, bl0); mid = Math.imul(al6, bh0); mid += Math.imul(ah6, bl0); hi = Math.imul(ah6, bh0); lo += Math.imul(al5, bl1); mid += Math.imul(al5, bh1); mid += Math.imul(ah5, bl1); hi += Math.imul(ah5, bh1); lo += Math.imul(al4, bl2); mid += Math.imul(al4, bh2); mid += Math.imul(ah4, bl2); hi += Math.imul(ah4, bh2); lo += Math.imul(al3, bl3); mid += Math.imul(al3, bh3); mid += Math.imul(ah3, bl3); hi += Math.imul(ah3, bh3); lo += Math.imul(al2, bl4); mid += Math.imul(al2, bh4); mid += Math.imul(ah2, bl4); hi += Math.imul(ah2, bh4); lo += Math.imul(al1, bl5); mid += Math.imul(al1, bh5); mid += Math.imul(ah1, bl5); hi += Math.imul(ah1, bh5); lo += Math.imul(al0, bl6); mid += Math.imul(al0, bh6); mid += Math.imul(ah0, bl6); hi += Math.imul(ah0, bh6); var w6 = c + lo + ((mid & 0x1fff) << 13); c = hi + (mid >>> 13) + (w6 >>> 26); w6 &= 0x3ffffff; /* k = 7 */ lo = Math.imul(al7, bl0); mid = Math.imul(al7, bh0); mid += Math.imul(ah7, bl0); hi = Math.imul(ah7, bh0); lo += Math.imul(al6, bl1); mid += Math.imul(al6, bh1); mid += Math.imul(ah6, bl1); hi += Math.imul(ah6, bh1); lo += Math.imul(al5, bl2); mid += Math.imul(al5, bh2); mid += Math.imul(ah5, bl2); hi += Math.imul(ah5, bh2); lo += Math.imul(al4, bl3); mid += Math.imul(al4, bh3); mid += Math.imul(ah4, bl3); hi += Math.imul(ah4, bh3); lo += Math.imul(al3, bl4); mid += Math.imul(al3, bh4); mid += Math.imul(ah3, bl4); hi += Math.imul(ah3, bh4); lo += Math.imul(al2, bl5); mid += Math.imul(al2, bh5); mid += Math.imul(ah2, bl5); hi += Math.imul(ah2, bh5); lo += Math.imul(al1, bl6); mid += Math.imul(al1, bh6); mid += Math.imul(ah1, bl6); hi += Math.imul(ah1, bh6); lo += Math.imul(al0, bl7); mid += Math.imul(al0, bh7); mid += Math.imul(ah0, bl7); hi += Math.imul(ah0, bh7); var w7 = c + lo + ((mid & 0x1fff) << 13); c = hi + (mid >>> 13) + (w7 >>> 26); w7 &= 0x3ffffff; /* k = 8 */ lo = Math.imul(al8, bl0); mid = Math.imul(al8, bh0); mid += Math.imul(ah8, bl0); hi = Math.imul(ah8, bh0); lo += Math.imul(al7, bl1); mid += Math.imul(al7, bh1); mid += Math.imul(ah7, bl1); hi += Math.imul(ah7, bh1); lo += Math.imul(al6, bl2); mid += Math.imul(al6, bh2); mid += Math.imul(ah6, bl2); hi += Math.imul(ah6, bh2); lo += Math.imul(al5, bl3); mid += Math.imul(al5, bh3); mid += Math.imul(ah5, bl3); hi += Math.imul(ah5, bh3); lo += Math.imul(al4, bl4); mid += Math.imul(al4, bh4); mid += Math.imul(ah4, bl4); hi += Math.imul(ah4, bh4); lo += Math.imul(al3, bl5); mid += Math.imul(al3, bh5); mid += Math.imul(ah3, bl5); hi += Math.imul(ah3, bh5); lo += Math.imul(al2, bl6); mid += Math.imul(al2, bh6); mid += Math.imul(ah2, bl6); hi += Math.imul(ah2, bh6); lo += Math.imul(al1, bl7); mid += Math.imul(al1, bh7); mid += Math.imul(ah1, bl7); hi += Math.imul(ah1, bh7); lo += Math.imul(al0, bl8); mid += Math.imul(al0, bh8); mid += Math.imul(ah0, bl8); hi += Math.imul(ah0, bh8); var w8 = c + lo + ((mid & 0x1fff) << 13); c = hi + (mid >>> 13) + (w8 >>> 26); w8 &= 0x3ffffff; /* k = 9 */ lo = Math.imul(al9, bl0); mid = Math.imul(al9, bh0); mid += Math.imul(ah9, bl0); hi = Math.imul(ah9, bh0); lo += Math.imul(al8, bl1); mid += Math.imul(al8, bh1); mid += Math.imul(ah8, bl1); hi += Math.imul(ah8, bh1); lo += Math.imul(al7, bl2); mid += Math.imul(al7, bh2); mid += Math.imul(ah7, bl2); hi += Math.imul(ah7, bh2); lo += Math.imul(al6, bl3); mid += Math.imul(al6, bh3); mid += Math.imul(ah6, bl3); hi += Math.imul(ah6, bh3); lo += Math.imul(al5, bl4); mid += Math.imul(al5, bh4); mid += Math.imul(ah5, bl4); hi += Math.imul(ah5, bh4); lo += Math.imul(al4, bl5); mid += Math.imul(al4, bh5); mid += Math.imul(ah4, bl5); hi += Math.imul(ah4, bh5); lo += Math.imul(al3, bl6); mid += Math.imul(al3, bh6); mid += Math.imul(ah3, bl6); hi += Math.imul(ah3, bh6); lo += Math.imul(al2, bl7); mid += Math.imul(al2, bh7); mid += Math.imul(ah2, bl7); hi += Math.imul(ah2, bh7); lo += Math.imul(al1, bl8); mid += Math.imul(al1, bh8); mid += Math.imul(ah1, bl8); hi += Math.imul(ah1, bh8); lo += Math.imul(al0, bl9); mid += Math.imul(al0, bh9); mid += Math.imul(ah0, bl9); hi += Math.imul(ah0, bh9); var w9 = c + lo + ((mid & 0x1fff) << 13); c = hi + (mid >>> 13) + (w9 >>> 26); w9 &= 0x3ffffff; /* k = 10 */ lo = Math.imul(al9, bl1); mid = Math.imul(al9, bh1); mid += Math.imul(ah9, bl1); hi = Math.imul(ah9, bh1); lo += Math.imul(al8, bl2); mid += Math.imul(al8, bh2); mid += Math.imul(ah8, bl2); hi += Math.imul(ah8, bh2); lo += Math.imul(al7, bl3); mid += Math.imul(al7, bh3); mid += Math.imul(ah7, bl3); hi += Math.imul(ah7, bh3); lo += Math.imul(al6, bl4); mid += Math.imul(al6, bh4); mid += Math.imul(ah6, bl4); hi += Math.imul(ah6, bh4); lo += Math.imul(al5, bl5); mid += Math.imul(al5, bh5); mid += Math.imul(ah5, bl5); hi += Math.imul(ah5, bh5); lo += Math.imul(al4, bl6); mid += Math.imul(al4, bh6); mid += Math.imul(ah4, bl6); hi += Math.imul(ah4, bh6); lo += Math.imul(al3, bl7); mid += Math.imul(al3, bh7); mid += Math.imul(ah3, bl7); hi += Math.imul(ah3, bh7); lo += Math.imul(al2, bl8); mid += Math.imul(al2, bh8); mid += Math.imul(ah2, bl8); hi += Math.imul(ah2, bh8); lo += Math.imul(al1, bl9); mid += Math.imul(al1, bh9); mid += Math.imul(ah1, bl9); hi += Math.imul(ah1, bh9); var w10 = c + lo + ((mid & 0x1fff) << 13); c = hi + (mid >>> 13) + (w10 >>> 26); w10 &= 0x3ffffff; /* k = 11 */ lo = Math.imul(al9, bl2); mid = Math.imul(al9, bh2); mid += Math.imul(ah9, bl2); hi = Math.imul(ah9, bh2); lo += Math.imul(al8, bl3); mid += Math.imul(al8, bh3); mid += Math.imul(ah8, bl3); hi += Math.imul(ah8, bh3); lo += Math.imul(al7, bl4); mid += Math.imul(al7, bh4); mid += Math.imul(ah7, bl4); hi += Math.imul(ah7, bh4); lo += Math.imul(al6, bl5); mid += Math.imul(al6, bh5); mid += Math.imul(ah6, bl5); hi += Math.imul(ah6, bh5); lo += Math.imul(al5, bl6); mid += Math.imul(al5, bh6); mid += Math.imul(ah5, bl6); hi += Math.imul(ah5, bh6); lo += Math.imul(al4, bl7); mid += Math.imul(al4, bh7); mid += Math.imul(ah4, bl7); hi += Math.imul(ah4, bh7); lo += Math.imul(al3, bl8); mid += Math.imul(al3, bh8); mid += Math.imul(ah3, bl8); hi += Math.imul(ah3, bh8); lo += Math.imul(al2, bl9); mid += Math.imul(al2, bh9); mid += Math.imul(ah2, bl9); hi += Math.imul(ah2, bh9); var w11 = c + lo + ((mid & 0x1fff) << 13); c = hi + (mid >>> 13) + (w11 >>> 26); w11 &= 0x3ffffff; /* k = 12 */ lo = Math.imul(al9, bl3); mid = Math.imul(al9, bh3); mid += Math.imul(ah9, bl3); hi = Math.imul(ah9, bh3); lo += Math.imul(al8, bl4); mid += Math.imul(al8, bh4); mid += Math.imul(ah8, bl4); hi += Math.imul(ah8, bh4); lo += Math.imul(al7, bl5); mid += Math.imul(al7, bh5); mid += Math.imul(ah7, bl5); hi += Math.imul(ah7, bh5); lo += Math.imul(al6, bl6); mid += Math.imul(al6, bh6); mid += Math.imul(ah6, bl6); hi += Math.imul(ah6, bh6); lo += Math.imul(al5, bl7); mid += Math.imul(al5, bh7); mid += Math.imul(ah5, bl7); hi += Math.imul(ah5, bh7); lo += Math.imul(al4, bl8); mid += Math.imul(al4, bh8); mid += Math.imul(ah4, bl8); hi += Math.imul(ah4, bh8); lo += Math.imul(al3, bl9); mid += Math.imul(al3, bh9); mid += Math.imul(ah3, bl9); hi += Math.imul(ah3, bh9); var w12 = c + lo + ((mid & 0x1fff) << 13); c = hi + (mid >>> 13) + (w12 >>> 26); w12 &= 0x3ffffff; /* k = 13 */ lo = Math.imul(al9, bl4); mid = Math.imul(al9, bh4); mid += Math.imul(ah9, bl4); hi = Math.imul(ah9, bh4); lo += Math.imul(al8, bl5); mid += Math.imul(al8, bh5); mid += Math.imul(ah8, bl5); hi += Math.imul(ah8, bh5); lo += Math.imul(al7, bl6); mid += Math.imul(al7, bh6); mid += Math.imul(ah7, bl6); hi += Math.imul(ah7, bh6); lo += Math.imul(al6, bl7); mid += Math.imul(al6, bh7); mid += Math.imul(ah6, bl7); hi += Math.imul(ah6, bh7); lo += Math.imul(al5, bl8); mid += Math.imul(al5, bh8); mid += Math.imul(ah5, bl8); hi += Math.imul(ah5, bh8); lo += Math.imul(al4, bl9); mid += Math.imul(al4, bh9); mid += Math.imul(ah4, bl9); hi += Math.imul(ah4, bh9); var w13 = c + lo + ((mid & 0x1fff) << 13); c = hi + (mid >>> 13) + (w13 >>> 26); w13 &= 0x3ffffff; /* k = 14 */ lo = Math.imul(al9, bl5); mid = Math.imul(al9, bh5); mid += Math.imul(ah9, bl5); hi = Math.imul(ah9, bh5); lo += Math.imul(al8, bl6); mid += Math.imul(al8, bh6); mid += Math.imul(ah8, bl6); hi += Math.imul(ah8, bh6); lo += Math.imul(al7, bl7); mid += Math.imul(al7, bh7); mid += Math.imul(ah7, bl7); hi += Math.imul(ah7, bh7); lo += Math.imul(al6, bl8); mid += Math.imul(al6, bh8); mid += Math.imul(ah6, bl8); hi += Math.imul(ah6, bh8); lo += Math.imul(al5, bl9); mid += Math.imul(al5, bh9); mid += Math.imul(ah5, bl9); hi += Math.imul(ah5, bh9); var w14 = c + lo + ((mid & 0x1fff) << 13); c = hi + (mid >>> 13) + (w14 >>> 26); w14 &= 0x3ffffff; /* k = 15 */ lo = Math.imul(al9, bl6); mid = Math.imul(al9, bh6); mid += Math.imul(ah9, bl6); hi = Math.imul(ah9, bh6); lo += Math.imul(al8, bl7); mid += Math.imul(al8, bh7); mid += Math.imul(ah8, bl7); hi += Math.imul(ah8, bh7); lo += Math.imul(al7, bl8); mid += Math.imul(al7, bh8); mid += Math.imul(ah7, bl8); hi += Math.imul(ah7, bh8); lo += Math.imul(al6, bl9); mid += Math.imul(al6, bh9); mid += Math.imul(ah6, bl9); hi += Math.imul(ah6, bh9); var w15 = c + lo + ((mid & 0x1fff) << 13); c = hi + (mid >>> 13) + (w15 >>> 26); w15 &= 0x3ffffff; /* k = 16 */ lo = Math.imul(al9, bl7); mid = Math.imul(al9, bh7); mid += Math.imul(ah9, bl7); hi = Math.imul(ah9, bh7); lo += Math.imul(al8, bl8); mid += Math.imul(al8, bh8); mid += Math.imul(ah8, bl8); hi += Math.imul(ah8, bh8); lo += Math.imul(al7, bl9); mid += Math.imul(al7, bh9); mid += Math.imul(ah7, bl9); hi += Math.imul(ah7, bh9); var w16 = c + lo + ((mid & 0x1fff) << 13); c = hi + (mid >>> 13) + (w16 >>> 26); w16 &= 0x3ffffff; /* k = 17 */ lo = Math.imul(al9, bl8); mid = Math.imul(al9, bh8); mid += Math.imul(ah9, bl8); hi = Math.imul(ah9, bh8); lo += Math.imul(al8, bl9); mid += Math.imul(al8, bh9); mid += Math.imul(ah8, bl9); hi += Math.imul(ah8, bh9); var w17 = c + lo + ((mid & 0x1fff) << 13); c = hi + (mid >>> 13) + (w17 >>> 26); w17 &= 0x3ffffff; /* k = 18 */ lo = Math.imul(al9, bl9); mid = Math.imul(al9, bh9); mid += Math.imul(ah9, bl9); hi = Math.imul(ah9, bh9); var w18 = c + lo + ((mid & 0x1fff) << 13); c = hi + (mid >>> 13) + (w18 >>> 26); w18 &= 0x3ffffff; o[0] = w0; o[1] = w1; o[2] = w2; o[3] = w3; o[4] = w4; o[5] = w5; o[6] = w6; o[7] = w7; o[8] = w8; o[9] = w9; o[10] = w10; o[11] = w11; o[12] = w12; o[13] = w13; o[14] = w14; o[15] = w15; o[16] = w16; o[17] = w17; o[18] = w18; if (c !== 0) { o[19] = c; out.length++; } return out; }; // Polyfill comb if (!Math.imul) { comb10MulTo = smallMulTo; } function bigMulTo (self, num, out) { out.negative = num.negative ^ self.negative; out.length = self.length + num.length; var carry = 0; var hncarry = 0; for (var k = 0; k < out.length - 1; k++) { // Sum all words with the same `i + j = k` and accumulate `ncarry`, // note that ncarry could be >= 0x3ffffff var ncarry = hncarry; hncarry = 0; var rword = carry & 0x3ffffff; var maxJ = Math.min(k, num.length - 1); for (var j = Math.max(0, k - self.length + 1); j <= maxj;="" j++)="" {="" var="" i="k" -="" j;="" a="self.words[i]" |="" 0;="" b="num.words[j]" r="a" *="" b;="" lo="r" &="" 0x3ffffff;="" ncarry="(ncarry" +="" ((r="" 0x4000000)="" 0))="" rword)="" rword="lo" (lo="">>> 26)) | 0; hncarry += ncarry >>> 26; ncarry &= 0x3ffffff; } out.words[k] = rword; carry = ncarry; ncarry = hncarry; } if (carry !== 0) { out.words[k] = carry; } else { out.length--; } return out.strip(); } function jumboMulTo (self, num, out) { var fftm = new FFTM(); return fftm.mulp(self, num, out); } BN.prototype.mulTo = function mulTo (num, out) { var res; var len = this.length + num.length; if (this.length === 10 && num.length === 10) { res = comb10MulTo(this, num, out); } else if (len < 63) { res = smallMulTo(this, num, out); } else if (len < 1024) { res = bigMulTo(this, num, out); } else { res = jumboMulTo(this, num, out); } return res; }; // Cooley-Tukey algorithm for FFT // slightly revisited to rely on looping instead of recursion function FFTM (x, y) { this.x = x; this.y = y; } FFTM.prototype.makeRBT = function makeRBT (N) { var t = new Array(N); var l = BN.prototype._countBits(N) - 1; for (var i = 0; i < N; i++) { t[i] = this.revBin(i, l, N); } return t; }; // Returns binary-reversed representation of `x` FFTM.prototype.revBin = function revBin (x, l, N) { if (x === 0 || x === N - 1) return x; var rb = 0; for (var i = 0; i < l; i++) { rb |= (x & 1) << (l - i - 1); x >>= 1; } return rb; }; // Performs "tweedling" phase, therefore 'emulating' // behaviour of the recursive algorithm FFTM.prototype.permute = function permute (rbt, rws, iws, rtws, itws, N) { for (var i = 0; i < N; i++) { rtws[i] = rws[rbt[i]]; itws[i] = iws[rbt[i]]; } }; FFTM.prototype.transform = function transform (rws, iws, rtws, itws, N, rbt) { this.permute(rbt, rws, iws, rtws, itws, N); for (var s = 1; s < N; s <<= 2="" 1)="" {="" var="" l="s" <<="" 1;="" rtwdf="Math.cos(2" *="" math.pi="" l);="" itwdf="Math.sin(2" for="" (var="" p="0;" <="" n;="" +="l)" rtwdf_="rtwdf;" itwdf_="itwdf;" j="0;" s;="" j++)="" re="rtws[p" j];="" ie="itws[p" ro="rtws[p" s];="" io="itws[p" rx="rtwdf_" -="" io;="" ro;="" rtws[p="" j]="re" itws[p="" s]="re" jshint="" maxdepth="" :="" false="" if="" (j="" !="=" l)="" itwdf_;="" rtwdf_;="" }="" };="" fftm.prototype.guesslen13b="function" guesslen13b="" (n,="" m)="" n="Math.max(m," n)="" |="" odd="N" &="" i="0;" (n="N" 0;="">>> 1) { i++; } return 1 << i + 1 + odd; }; FFTM.prototype.conjugate = function conjugate (rws, iws, N) { if (N <= 1)="" return;="" for="" (var="" i="0;" <="" n="" 2;="" i++)="" {="" var="" t="rws[i];" rws[i]="rws[N" -="" 1];="" rws[n="" 1]="t;" iws[i]="-iws[N" iws[n="" }="" };="" fftm.prototype.normalize13b="function" normalize13b="" (ws,="" n)="" carry="0;" w="Math.round(ws[2" *="" +="" 0x2000="" math.round(ws[2="" i]="" carry;="" ws[i]="w" &="" 0x3ffffff;="" if="" (w="" 0x4000000)="" else="" 0x4000000="" |="" 0;="" return="" ws;="" fftm.prototype.convert13b="function" convert13b="" len,="" rws,="" len;="" (ws[i]="" 0);="" rws[2="" 0x1fff;="">>> 13; rws[2 * i + 1] = carry & 0x1fff; carry = carry >>> 13; } // Pad with zeroes for (i = 2 * len; i < N; ++i) { rws[i] = 0; } assert(carry === 0); assert((carry & ~0x1fff) === 0); }; FFTM.prototype.stub = function stub (N) { var ph = new Array(N); for (var i = 0; i < N; i++) { ph[i] = 0; } return ph; }; FFTM.prototype.mulp = function mulp (x, y, out) { var N = 2 * this.guessLen13b(x.length, y.length); var rbt = this.makeRBT(N); var _ = this.stub(N); var rws = new Array(N); var rwst = new Array(N); var iwst = new Array(N); var nrws = new Array(N); var nrwst = new Array(N); var niwst = new Array(N); var rmws = out.words; rmws.length = N; this.convert13b(x.words, x.length, rws, N); this.convert13b(y.words, y.length, nrws, N); this.transform(rws, _, rwst, iwst, N, rbt); this.transform(nrws, _, nrwst, niwst, N, rbt); for (var i = 0; i < N; i++) { var rx = rwst[i] * nrwst[i] - iwst[i] * niwst[i]; iwst[i] = rwst[i] * niwst[i] + iwst[i] * nrwst[i]; rwst[i] = rx; } this.conjugate(rwst, iwst, N); this.transform(rwst, iwst, rmws, _, N, rbt); this.conjugate(rmws, _, N); this.normalize13b(rmws, N); out.negative = x.negative ^ y.negative; out.length = x.length + y.length; return out.strip(); }; // Multiply `this` by `num` BN.prototype.mul = function mul (num) { var out = new BN(null); out.words = new Array(this.length + num.length); return this.mulTo(num, out); }; // Multiply employing FFT BN.prototype.mulf = function mulf (num) { var out = new BN(null); out.words = new Array(this.length + num.length); return jumboMulTo(this, num, out); }; // In-place Multiplication BN.prototype.imul = function imul (num) { return this.clone().mulTo(num, this); }; BN.prototype.imuln = function imuln (num) { assert(typeof num === 'number'); assert(num < 0x4000000); // Carry var carry = 0; for (var i = 0; i < this.length; i++) { var w = (this.words[i] | 0) * num; var lo = (w & 0x3ffffff) + (carry & 0x3ffffff); carry >>= 26; carry += (w / 0x4000000) | 0; // NOTE: lo is 27bit maximum carry += lo >>> 26; this.words[i] = lo & 0x3ffffff; } if (carry !== 0) { this.words[i] = carry; this.length++; } return this; }; BN.prototype.muln = function muln (num) { return this.clone().imuln(num); }; // `this` * `this` BN.prototype.sqr = function sqr () { return this.mul(this); }; // `this` * `this` in-place BN.prototype.isqr = function isqr () { return this.imul(this.clone()); }; // Math.pow(`this`, `num`) BN.prototype.pow = function pow (num) { var w = toBitArray(num); if (w.length === 0) return new BN(1); // Skip leading zeroes var res = this; for (var i = 0; i < w.length; i++, res = res.sqr()) { if (w[i] !== 0) break; } if (++i < w.length) { for (var q = res.sqr(); i < w.length; i++, q = q.sqr()) { if (w[i] === 0) continue; res = res.mul(q); } } return res; }; // Shift-left in-place BN.prototype.iushln = function iushln (bits) { assert(typeof bits === 'number' && bits >= 0); var r = bits % 26; var s = (bits - r) / 26; var carryMask = (0x3ffffff >>> (26 - r)) << (26 - r); var i; if (r !== 0) { var carry = 0; for (i = 0; i < this.length; i++) { var newCarry = this.words[i] & carryMask; var c = ((this.words[i] | 0) - newCarry) << r; this.words[i] = c | carry; carry = newCarry >>> (26 - r); } if (carry) { this.words[i] = carry; this.length++; } } if (s !== 0) { for (i = this.length - 1; i >= 0; i--) { this.words[i + s] = this.words[i]; } for (i = 0; i < s; i++) { this.words[i] = 0; } this.length += s; } return this.strip(); }; BN.prototype.ishln = function ishln (bits) { // TODO(indutny): implement me assert(this.negative === 0); return this.iushln(bits); }; // Shift-right in-place // NOTE: `hint` is a lowest bit before trailing zeroes // NOTE: if `extended` is present - it will be filled with destroyed bits BN.prototype.iushrn = function iushrn (bits, hint, extended) { assert(typeof bits === 'number' && bits >= 0); var h; if (hint) { h = (hint - (hint % 26)) / 26; } else { h = 0; } var r = bits % 26; var s = Math.min((bits - r) / 26, this.length); var mask = 0x3ffffff ^ ((0x3ffffff >>> r) << r); var maskedWords = extended; h -= s; h = Math.max(0, h); // Extended mode, copy masked part if (maskedWords) { for (var i = 0; i < s; i++) { maskedWords.words[i] = this.words[i]; } maskedWords.length = s; } if (s === 0) { // No-op, we should not move anything at all } else if (this.length > s) { this.length -= s; for (i = 0; i < this.length; i++) { this.words[i] = this.words[i + s]; } } else { this.words[0] = 0; this.length = 1; } var carry = 0; for (i = this.length - 1; i >= 0 && (carry !== 0 || i >= h); i--) { var word = this.words[i] | 0; this.words[i] = (carry << (26 - r)) | (word >>> r); carry = word & mask; } // Push carried bits as a mask if (maskedWords && carry !== 0) { maskedWords.words[maskedWords.length++] = carry; } if (this.length === 0) { this.words[0] = 0; this.length = 1; } return this.strip(); }; BN.prototype.ishrn = function ishrn (bits, hint, extended) { // TODO(indutny): implement me assert(this.negative === 0); return this.iushrn(bits, hint, extended); }; // Shift-left BN.prototype.shln = function shln (bits) { return this.clone().ishln(bits); }; BN.prototype.ushln = function ushln (bits) { return this.clone().iushln(bits); }; // Shift-right BN.prototype.shrn = function shrn (bits) { return this.clone().ishrn(bits); }; BN.prototype.ushrn = function ushrn (bits) { return this.clone().iushrn(bits); }; // Test if n bit is set BN.prototype.testn = function testn (bit) { assert(typeof bit === 'number' && bit >= 0); var r = bit % 26; var s = (bit - r) / 26; var q = 1 << r; // Fast case: bit is much higher than all existing words if (this.length <= s)="" return="" false;="" check="" bit="" and="" var="" w="this.words[s];" !!(w="" &="" q);="" };="" only="" lowers="" bits="" of="" number="" (in-place)="" bn.prototype.imaskn="function" imaskn="" (bits)="" {="" assert(typeof="" 'number'="" &&="">= 0); var r = bits % 26; var s = (bits - r) / 26; assert(this.negative === 0, 'imaskn works only with positive numbers'); if (r !== 0) { s++; } this.length = Math.min(s, this.length); if (r !== 0) { var mask = 0x3ffffff ^ ((0x3ffffff >>> r) << r); this.words[this.length - 1] &= mask; } return this.strip(); }; // Return only lowers bits of number BN.prototype.maskn = function maskn (bits) { return this.clone().imaskn(bits); }; // Add plain number `num` to `this` BN.prototype.iaddn = function iaddn (num) { assert(typeof num === 'number'); assert(num < 0x4000000); if (num < 0) return this.isubn(-num); // Possible sign change if (this.negative !== 0) { if (this.length === 1 && (this.words[0] | 0) < num) { this.words[0] = num - (this.words[0] | 0); this.negative = 0; return this; } this.negative = 0; this.isubn(num); this.negative = 1; return this; } // Add without checks return this._iaddn(num); }; BN.prototype._iaddn = function _iaddn (num) { this.words[0] += num; // Carry for (var i = 0; i < this.length && this.words[i] >= 0x4000000; i++) { this.words[i] -= 0x4000000; if (i === this.length - 1) { this.words[i + 1] = 1; } else { this.words[i + 1]++; } } this.length = Math.max(this.length, i + 1); return this; }; // Subtract plain number `num` from `this` BN.prototype.isubn = function isubn (num) { assert(typeof num === 'number'); assert(num < 0x4000000); if (num < 0) return this.iaddn(-num); if (this.negative !== 0) { this.negative = 0; this.iaddn(num); this.negative = 1; return this; } this.words[0] -= num; if (this.length === 1 && this.words[0] < 0) { this.words[0] = -this.words[0]; this.negative = 1; } else { // Carry for (var i = 0; i < this.length && this.words[i] < 0; i++) { this.words[i] += 0x4000000; this.words[i + 1] -= 1; } } return this.strip(); }; BN.prototype.addn = function addn (num) { return this.clone().iaddn(num); }; BN.prototype.subn = function subn (num) { return this.clone().isubn(num); }; BN.prototype.iabs = function iabs () { this.negative = 0; return this; }; BN.prototype.abs = function abs () { return this.clone().iabs(); }; BN.prototype._ishlnsubmul = function _ishlnsubmul (num, mul, shift) { // Bigger storage is needed var len = num.length + shift; var i; if (this.words.length < len) { var t = new Array(len); for (i = 0; i < this.length; i++) { t[i] = this.words[i]; } this.words = t; } else { i = this.length; } // Zeroify rest this.length = Math.max(this.length, len); for (; i < this.length; i++) { this.words[i] = 0; } var w; var carry = 0; for (i = 0; i < num.length; i++) { w = (this.words[i + shift] | 0) + carry; var right = (num.words[i] | 0) * mul; w -= right & 0x3ffffff; carry = (w >> 26) - ((right / 0x4000000) | 0); this.words[i + shift] = w & 0x3ffffff; } for (; i < this.length - shift; i++) { w = (this.words[i + shift] | 0) + carry; carry = w >> 26; this.words[i + shift] = w & 0x3ffffff; } if (carry === 0) return this.strip(); // Subtraction overflow assert(carry === -1); carry = 0; for (i = 0; i < this.length; i++) { w = -(this.words[i] | 0) + carry; carry = w >> 26; this.words[i] = w & 0x3ffffff; } this.negative = 1; return this.strip(); }; BN.prototype._wordDiv = function _wordDiv (num, mode) { var shift = this.length - num.length; var a = this.clone(); var b = num; // Normalize var bhi = b.words[b.length - 1] | 0; var bhiBits = this._countBits(bhi); shift = 26 - bhiBits; if (shift !== 0) { b = b.ushln(shift); a.iushln(shift); bhi = b.words[b.length - 1] | 0; } // Initialize quotient var m = a.length - b.length; var q; if (mode !== 'mod') { q = new BN(null); q.length = m + 1; q.words = new Array(q.length); for (var i = 0; i < q.length; i++) { q.words[i] = 0; } } var diff = a.clone()._ishlnsubmul(b, 1, m); if (diff.negative === 0) { a = diff; if (q) { q.words[m] = 1; } } for (var j = m - 1; j >= 0; j--) { var qj = (a.words[b.length + j] | 0) * 0x4000000 + (a.words[b.length + j - 1] | 0); // NOTE: (qj / bhi) is (0x3ffffff * 0x4000000 + 0x3ffffff) / 0x2000000 max // (0x7ffffff) qj = Math.min((qj / bhi) | 0, 0x3ffffff); a._ishlnsubmul(b, qj, j); while (a.negative !== 0) { qj--; a.negative = 0; a._ishlnsubmul(b, 1, j); if (!a.isZero()) { a.negative ^= 1; } } if (q) { q.words[j] = qj; } } if (q) { q.strip(); } a.strip(); // Denormalize if (mode !== 'div' && shift !== 0) { a.iushrn(shift); } return { div: q || null, mod: a }; }; BN.prototype.divmod = function divmod (num, mode, positive) { assert(!num.isZero()); var div, mod, res; if (this.negative !== 0 && num.negative === 0) { res = this.neg().divmod(num, mode); if (mode !== 'mod') { div = res.div.neg(); } if (mode !== 'div') { mod = res.mod.neg(); if (positive && mod.negative !== 0) { mod.iadd(num); } } return { div: div, mod: mod }; } if (this.negative === 0 && num.negative !== 0) { res = this.divmod(num.neg(), mode); if (mode !== 'mod') { div = res.div.neg(); } return { div: div, mod: res.mod }; } if ((this.negative & num.negative) !== 0) { res = this.neg().divmod(num.neg(), mode); if (mode !== 'div') { mod = res.mod.neg(); if (positive && mod.negative !== 0) { mod.isub(num); } } return { div: res.div, mod: mod }; } // Both numbers are positive at this point // Strip both numbers to approximate shift value if (num.length > this.length || this.cmp(num) < 0) { return { div: new BN(0), mod: this }; } // Very short reduction if (num.length === 1) { if (mode === 'div') { return { div: this.divn(num.words[0]), mod: null }; } if (mode === 'mod') { return { div: null, mod: new BN(this.modn(num.words[0])) }; } return { div: this.divn(num.words[0]), mod: new BN(this.modn(num.words[0])) }; } return this._wordDiv(num, mode); }; // Find `this` / `num` BN.prototype.div = function div (num) { return this.divmod(num, 'div', false).div; }; // Find `this` % `num` BN.prototype.mod = function mod (num) { return this.divmod(num, 'mod', false).mod; }; BN.prototype.umod = function umod (num) { return this.divmod(num, 'mod', true).mod; }; // Find Round(`this` / `num`) BN.prototype.divRound = function divRound (num) { var dm = this.divmod(num); // Fast case - exact division if (dm.mod.isZero()) return dm.div; var mod = dm.div.negative !== 0 ? dm.mod.isub(num) : dm.mod; var half = num.ushrn(1); var r2 = num.andln(1); var cmp = mod.cmp(half); // Round down if (cmp < 0 || r2 === 1 && cmp === 0) return dm.div; // Round up return dm.div.negative !== 0 ? dm.div.isubn(1) : dm.div.iaddn(1); }; BN.prototype.modn = function modn (num) { assert(num <= 0x3ffffff);="" var="" p="(1" <<="" 26)="" %="" num;="" acc="0;" for="" (var="" i="this.length" -="" 1;="">= 0; i--) { acc = (p * acc + (this.words[i] | 0)) % num; } return acc; }; // In-place division by number BN.prototype.idivn = function idivn (num) { assert(num <= 0x3ffffff);="" var="" carry="0;" for="" (var="" i="this.length" -="" 1;="">= 0; i--) { var w = (this.words[i] | 0) + carry * 0x4000000; this.words[i] = (w / num) | 0; carry = w % num; } return this.strip(); }; BN.prototype.divn = function divn (num) { return this.clone().idivn(num); }; BN.prototype.egcd = function egcd (p) { assert(p.negative === 0); assert(!p.isZero()); var x = this; var y = p.clone(); if (x.negative !== 0) { x = x.umod(p); } else { x = x.clone(); } // A * x + B * y = x var A = new BN(1); var B = new BN(0); // C * x + D * y = y var C = new BN(0); var D = new BN(1); var g = 0; while (x.isEven() && y.isEven()) { x.iushrn(1); y.iushrn(1); ++g; } var yp = y.clone(); var xp = x.clone(); while (!x.isZero()) { for (var i = 0, im = 1; (x.words[0] & im) === 0 && i < 26; ++i, im <<= 1);="" if="" (i=""> 0) { x.iushrn(i); while (i-- > 0) { if (A.isOdd() || B.isOdd()) { A.iadd(yp); B.isub(xp); } A.iushrn(1); B.iushrn(1); } } for (var j = 0, jm = 1; (y.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1);="" if="" (j=""> 0) { y.iushrn(j); while (j-- > 0) { if (C.isOdd() || D.isOdd()) { C.iadd(yp); D.isub(xp); } C.iushrn(1); D.iushrn(1); } } if (x.cmp(y) >= 0) { x.isub(y); A.isub(C); B.isub(D); } else { y.isub(x); C.isub(A); D.isub(B); } } return { a: C, b: D, gcd: y.iushln(g) }; }; // This is reduced incarnation of the binary EEA // above, designated to invert members of the // _prime_ fields F(p) at a maximal speed BN.prototype._invmp = function _invmp (p) { assert(p.negative === 0); assert(!p.isZero()); var a = this; var b = p.clone(); if (a.negative !== 0) { a = a.umod(p); } else { a = a.clone(); } var x1 = new BN(1); var x2 = new BN(0); var delta = b.clone(); while (a.cmpn(1) > 0 && b.cmpn(1) > 0) { for (var i = 0, im = 1; (a.words[0] & im) === 0 && i < 26; ++i, im <<= 1);="" if="" (i=""> 0) { a.iushrn(i); while (i-- > 0) { if (x1.isOdd()) { x1.iadd(delta); } x1.iushrn(1); } } for (var j = 0, jm = 1; (b.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1);="" if="" (j=""> 0) { b.iushrn(j); while (j-- > 0) { if (x2.isOdd()) { x2.iadd(delta); } x2.iushrn(1); } } if (a.cmp(b) >= 0) { a.isub(b); x1.isub(x2); } else { b.isub(a); x2.isub(x1); } } var res; if (a.cmpn(1) === 0) { res = x1; } else { res = x2; } if (res.cmpn(0) < 0) { res.iadd(p); } return res; }; BN.prototype.gcd = function gcd (num) { if (this.isZero()) return num.clone(); if (num.isZero()) return this.clone(); var a = this.clone(); var b = num.clone(); a.negative = 0; b.negative = 0; // Remove common factor of two for (var shift = 0; a.isEven() && b.isEven(); shift++) { a.iushrn(1); b.iushrn(1); } do { while (a.isEven()) { a.iushrn(1); } while (b.isEven()) { b.iushrn(1); } var r = a.cmp(b); if (r < 0) { // Swap `a` and `b` to make `a` always bigger than `b` var t = a; a = b; b = t; } else if (r === 0 || b.cmpn(1) === 0) { break; } a.isub(b); } while (true); return b.iushln(shift); }; // Invert number in the field F(num) BN.prototype.invm = function invm (num) { return this.egcd(num).a.umod(num); }; BN.prototype.isEven = function isEven () { return (this.words[0] & 1) === 0; }; BN.prototype.isOdd = function isOdd () { return (this.words[0] & 1) === 1; }; // And first word and num BN.prototype.andln = function andln (num) { return this.words[0] & num; }; // Increment at the bit position in-line BN.prototype.bincn = function bincn (bit) { assert(typeof bit === 'number'); var r = bit % 26; var s = (bit - r) / 26; var q = 1 << r; // Fast case: bit is much higher than all existing words if (this.length <= 0="" s)="" {="" for="" (var="" i="this.length;" <="" s="" +="" 1;="" i++)="" this.words[i]="0;" }="" this.words[s]="" |="q;" this.length="s" return="" this;="" add="" bit="" and="" propagate,="" if="" needed="" var="" carry="q;" (i="s;" !="=" &&="" this.length;="" w="this.words[i]" 0;="">>> 26; w &= 0x3ffffff; this.words[i] = w; } if (carry !== 0) { this.words[i] = carry; this.length++; } return this; }; BN.prototype.isZero = function isZero () { return this.length === 1 && this.words[0] === 0; }; BN.prototype.cmpn = function cmpn (num) { var negative = num < 0; if (this.negative !== 0 && !negative) return -1; if (this.negative === 0 && negative) return 1; this.strip(); var res; if (this.length > 1) { res = 1; } else { if (negative) { num = -num; } assert(num <= 0="" 1="" 0x3ffffff,="" 'number="" is="" too="" big');="" var="" w="this.words[0]" |="" 0;="" res="w" =="=" num="" ?="" :="" <="" -1="" 1;="" }="" if="" (this.negative="" !="=" 0)="" {="" return="" res;="" };="" compare="" two="" numbers="" and="" return:="" -="" `this`=""> `num` // 0 - if `this` == `num` // -1 - if `this` < `num` BN.prototype.cmp = function cmp (num) { if (this.negative !== 0 && num.negative === 0) return -1; if (this.negative === 0 && num.negative !== 0) return 1; var res = this.ucmp(num); if (this.negative !== 0) return -res; return res; }; // Unsigned comparison BN.prototype.ucmp = function ucmp (num) { // At this point both numbers have the same sign if (this.length > num.length) return 1; if (this.length < num.length) return -1; var res = 0; for (var i = this.length - 1; i >= 0; i--) { var a = this.words[i] | 0; var b = num.words[i] | 0; if (a === b) continue; if (a < b) { res = -1; } else if (a > b) { res = 1; } break; } return res; }; BN.prototype.gtn = function gtn (num) { return this.cmpn(num) === 1; }; BN.prototype.gt = function gt (num) { return this.cmp(num) === 1; }; BN.prototype.gten = function gten (num) { return this.cmpn(num) >= 0; }; BN.prototype.gte = function gte (num) { return this.cmp(num) >= 0; }; BN.prototype.ltn = function ltn (num) { return this.cmpn(num) === -1; }; BN.prototype.lt = function lt (num) { return this.cmp(num) === -1; }; BN.prototype.lten = function lten (num) { return this.cmpn(num) <= 0;="" };="" bn.prototype.lte="function" lte="" (num)="" {="" return="" this.cmp(num)="" <="0;" bn.prototype.eqn="function" eqn="" this.cmpn(num)="==" bn.prototype.eq="function" eq="" a="" reduce="" context,="" could="" be="" using="" montgomery="" or="" something="" better,="" depending="" on="" the="" `m`="" itself.="" bn.red="function" red="" new="" red(num);="" bn.prototype.tored="function" tored="" (ctx)="" assert(!this.red,="" 'already="" number="" in="" reduction="" context');="" assert(this.negative="==" 0,="" 'red="" works="" only="" with="" positives');="" ctx.convertto(this)._forcered(ctx);="" bn.prototype.fromred="function" fromred="" ()="" assert(this.red,="" 'fromred="" numbers="" this.red.convertfrom(this);="" bn.prototype._forcered="function" _forcered="" this.red="ctx;" this;="" bn.prototype.forcered="function" forcered="" this._forcered(ctx);="" bn.prototype.redadd="function" redadd="" 'redadd="" numbers');="" this.red.add(this,="" num);="" bn.prototype.rediadd="function" rediadd="" 'rediadd="" this.red.iadd(this,="" bn.prototype.redsub="function" redsub="" 'redsub="" this.red.sub(this,="" bn.prototype.redisub="function" redisub="" 'redisub="" this.red.isub(this,="" bn.prototype.redshl="function" redshl="" 'redshl="" this.red.ushl(this,="" bn.prototype.redmul="function" redmul="" 'redmul="" this.red._verify2(this,="" this.red.mul(this,="" bn.prototype.redimul="function" redimul="" this.red.imul(this,="" bn.prototype.redsqr="function" redsqr="" 'redsqr="" this.red._verify1(this);="" this.red.sqr(this);="" bn.prototype.redisqr="function" redisqr="" 'redisqr="" this.red.isqr(this);="" square="" root="" over="" p="" bn.prototype.redsqrt="function" redsqrt="" 'redsqrt="" this.red.sqrt(this);="" bn.prototype.redinvm="function" redinvm="" 'redinvm="" this.red.invm(this);="" negative="" clone="" of="" `this`="" %="" `red="" modulo`="" bn.prototype.redneg="function" redneg="" 'redneg="" this.red.neg(this);="" bn.prototype.redpow="function" redpow="" assert(this.red="" &&="" !num.red,="" 'redpow(normalnum)');="" this.red.pow(this,="" prime="" efficient="" var="" primes="{" k256:="" null,="" p224:="" p192:="" p25519:="" null="" pseudo-mersenne="" function="" mprime="" (name,="" p)="" ^="" n="" -="" k="" this.name="name;" this.p="new" bn(p,="" 16);="" this.n="this.p.bitLength();" this.k="new" bn(1).iushln(this.n).isub(this.p);="" this.tmp="this._tmp();" }="" mprime.prototype._tmp="function" _tmp="" tmp="new" bn(null);="" tmp.words="new" array(math.ceil(this.n="" 13));="" tmp;="" mprime.prototype.ireduce="function" ireduce="" assumes="" that="" `num`="" is="" less="" than="" `p^2`="" num="HI" *="" (2="" k)="" +="" hi="" lo="HI" (mod="" r="num;" rlen;="" do="" this.split(r,="" this.tmp);="" rlen="r.bitLength();" while="" (rlen=""> this.n); var cmp = rlen < this.n ? -1 : r.ucmp(this.p); if (cmp === 0) { r.words[0] = 0; r.length = 1; } else if (cmp > 0) { r.isub(this.p); } else { r.strip(); } return r; }; MPrime.prototype.split = function split (input, out) { input.iushrn(this.n, 0, out); }; MPrime.prototype.imulK = function imulK (num) { return num.imul(this.k); }; function K256 () { MPrime.call( this, 'k256', 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f'); } inherits(K256, MPrime); K256.prototype.split = function split (input, output) { // 256 = 9 * 26 + 22 var mask = 0x3fffff; var outLen = Math.min(input.length, 9); for (var i = 0; i < outLen; i++) { output.words[i] = input.words[i]; } output.length = outLen; if (input.length <= 9="" 9)="" {="" input.words[0]="0;" input.length="1;" return;="" }="" shift="" by="" limbs="" var="" prev="input.words[9];" output.words[output.length++]="prev" &="" mask;="" for="" (i="10;" i="" <="" input.length;="" i++)="" next="input.words[i]" |="" 0;="" input.words[i="" -="" 10]="((next" mask)="" <<="" 4)="" (prev="">>> 22); prev = next; } prev >>>= 22; input.words[i - 10] = prev; if (prev === 0 && input.length > 10) { input.length -= 10; } else { input.length -= 9; } }; K256.prototype.imulK = function imulK (num) { // K = 0x1000003d1 = [ 0x40, 0x3d1 ] num.words[num.length] = 0; num.words[num.length + 1] = 0; num.length += 2; // bounded at: 0x40 * 0x3ffffff + 0x3d0 = 0x100000390 var lo = 0; for (var i = 0; i < num.length; i++) { var w = num.words[i] | 0; lo += w * 0x3d1; num.words[i] = lo & 0x3ffffff; lo = w * 0x40 + ((lo / 0x4000000) | 0); } // Fast length reduction if (num.words[num.length - 1] === 0) { num.length--; if (num.words[num.length - 1] === 0) { num.length--; } } return num; }; function P224 () { MPrime.call( this, 'p224', 'ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001'); } inherits(P224, MPrime); function P192 () { MPrime.call( this, 'p192', 'ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff'); } inherits(P192, MPrime); function P25519 () { // 2 ^ 255 - 19 MPrime.call( this, '25519', '7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed'); } inherits(P25519, MPrime); P25519.prototype.imulK = function imulK (num) { // K = 0x13 var carry = 0; for (var i = 0; i < num.length; i++) { var hi = (num.words[i] | 0) * 0x13 + carry; var lo = hi & 0x3ffffff; hi >>>= 26; num.words[i] = lo; carry = hi; } if (carry !== 0) { num.words[num.length++] = carry; } return num; }; // Exported mostly for testing purposes, use plain name instead BN._prime = function prime (name) { // Cached version of prime if (primes[name]) return primes[name]; var prime; if (name === 'k256') { prime = new K256(); } else if (name === 'p224') { prime = new P224(); } else if (name === 'p192') { prime = new P192(); } else if (name === 'p25519') { prime = new P25519(); } else { throw new Error('Unknown prime ' + name); } primes[name] = prime; return prime; }; // // Base reduction engine // function Red (m) { if (typeof m === 'string') { var prime = BN._prime(m); this.m = prime.p; this.prime = prime; } else { this.m = m; this.prime = null; } } Red.prototype._verify1 = function _verify1 (a) { assert(a.negative === 0, 'red works only with positives'); assert(a.red, 'red works only with red numbers'); }; Red.prototype._verify2 = function _verify2 (a, b) { assert((a.negative | b.negative) === 0, 'red works only with positives'); assert(a.red && a.red === b.red, 'red works only with red numbers'); }; Red.prototype.imod = function imod (a) { if (this.prime) return this.prime.ireduce(a)._forceRed(this); return a.umod(this.m)._forceRed(this); }; Red.prototype.neg = function neg (a) { if (a.isZero()) { return a.clone(); } return this.m.sub(a)._forceRed(this); }; Red.prototype.add = function add (a, b) { this._verify2(a, b); var res = a.add(b); if (res.cmp(this.m) >= 0) { res.isub(this.m); } return res._forceRed(this); }; Red.prototype.iadd = function iadd (a, b) { this._verify2(a, b); var res = a.iadd(b); if (res.cmp(this.m) >= 0) { res.isub(this.m); } return res; }; Red.prototype.sub = function sub (a, b) { this._verify2(a, b); var res = a.sub(b); if (res.cmpn(0) < 0) { res.iadd(this.m); } return res._forceRed(this); }; Red.prototype.isub = function isub (a, b) { this._verify2(a, b); var res = a.isub(b); if (res.cmpn(0) < 0) { res.iadd(this.m); } return res; }; Red.prototype.shl = function shl (a, num) { this._verify1(a); return this.imod(a.ushln(num)); }; Red.prototype.imul = function imul (a, b) { this._verify2(a, b); return this.imod(a.imul(b)); }; Red.prototype.mul = function mul (a, b) { this._verify2(a, b); return this.imod(a.mul(b)); }; Red.prototype.isqr = function isqr (a) { return this.imul(a, a.clone()); }; Red.prototype.sqr = function sqr (a) { return this.mul(a, a); }; Red.prototype.sqrt = function sqrt (a) { if (a.isZero()) return a.clone(); var mod3 = this.m.andln(3); assert(mod3 % 2 === 1); // Fast case if (mod3 === 3) { var pow = this.m.add(new BN(1)).iushrn(2); return this.pow(a, pow); } // Tonelli-Shanks algorithm (Totally unoptimized and slow) // // Find Q and S, that Q * 2 ^ S = (P - 1) var q = this.m.subn(1); var s = 0; while (!q.isZero() && q.andln(1) === 0) { s++; q.iushrn(1); } assert(!q.isZero()); var one = new BN(1).toRed(this); var nOne = one.redNeg(); // Find quadratic non-residue // NOTE: Max is such because of generalized Riemann hypothesis. var lpow = this.m.subn(1).iushrn(1); var z = this.m.bitLength(); z = new BN(2 * z * z).toRed(this); while (this.pow(z, lpow).cmp(nOne) !== 0) { z.redIAdd(nOne); } var c = this.pow(z, q); var r = this.pow(a, q.addn(1).iushrn(1)); var t = this.pow(a, q); var m = s; while (t.cmp(one) !== 0) { var tmp = t; for (var i = 0; tmp.cmp(one) !== 0; i++) { tmp = tmp.redSqr(); } assert(i < m); var b = this.pow(c, new BN(1).iushln(m - i - 1)); r = r.redMul(b); c = b.redSqr(); t = t.redMul(c); m = i; } return r; }; Red.prototype.invm = function invm (a) { var inv = a._invmp(this.m); if (inv.negative !== 0) { inv.negative = 0; return this.imod(inv).redNeg(); } else { return this.imod(inv); } }; Red.prototype.pow = function pow (a, num) { if (num.isZero()) return new BN(1); if (num.cmpn(1) === 0) return a.clone(); var windowSize = 4; var wnd = new Array(1 << windowSize); wnd[0] = new BN(1).toRed(this); wnd[1] = a; for (var i = 2; i < wnd.length; i++) { wnd[i] = this.mul(wnd[i - 1], a); } var res = wnd[0]; var current = 0; var currentLen = 0; var start = num.bitLength() % 26; if (start === 0) { start = 26; } for (i = num.length - 1; i >= 0; i--) { var word = num.words[i]; for (var j = start - 1; j >= 0; j--) { var bit = (word >> j) & 1; if (res !== wnd[0]) { res = this.sqr(res); } if (bit === 0 && current === 0) { currentLen = 0; continue; } current <<= 0="" 26="" 1;="" current="" |="bit;" currentlen++;="" if="" (currentlen="" !="=" windowsize="" &&="" (i="" ||="" j="" 0))="" continue;="" res="this.mul(res," wnd[current]);="" currentlen="0;" }="" start="26;" return="" res;="" };="" red.prototype.convertto="function" convertto="" (num)="" {="" var="" r="num.umod(this.m);" num="" ?="" r.clone()="" :="" r;="" red.prototype.convertfrom="function" convertfrom="" res.red="null;" montgomery="" method="" engine="" bn.mont="function" mont="" new="" mont(num);="" function="" (m)="" red.call(this,="" m);="" this.shift="this.m.bitLength();" (this.shift="" %="" 0)="" +="26" -="" 26);="" this.r="new" bn(1).iushln(this.shift);="" this.r2="this.imod(this.r.sqr());" this.rinv="this.r._invmp(this.m);" this.minv="this.rinv.mul(this.r).isubn(1).div(this.m);" inherits(mont,="" red);="" mont.prototype.convertto="function" this.imod(num.ushln(this.shift));="" mont.prototype.convertfrom="function" r.red="null;" mont.prototype.imul="function" imul="" (a,="" b)="" (a.iszero()="" b.iszero())="" a.words[0]="0;" a.length="1;" a;="" t="a.imul(b);" c="t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m);" u="t.isub(c).iushrn(this.shift);" (u.cmp(this.m)="">= 0) { res = u.isub(this.m); } else if (u.cmpn(0) < 0) { res = u.iadd(this.m); } return res._forceRed(this); }; Mont.prototype.mul = function mul (a, b) { if (a.isZero() || b.isZero()) return new BN(0)._forceRed(this); var t = a.mul(b); var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m); var u = t.isub(c).iushrn(this.shift); var res = u; if (u.cmp(this.m) >= 0) { res = u.isub(this.m); } else if (u.cmpn(0) < 0) { res = u.iadd(this.m); } return res._forceRed(this); }; Mont.prototype.invm = function invm (a) { // (AR)^-1 * R^2 = (A^-1 * R^-1) * R^2 = A^-1 * R var res = this.imod(a._invmp(this.m).mul(this.r2)); return res._forceRed(this); }; })(typeof module === 'undefined' || module, this); },{}],18:[function(require,module,exports){ var r; module.exports = function rand(len) { if (!r) r = new Rand(null); return r.generate(len); }; function Rand(rand) { this.rand = rand; } module.exports.Rand = Rand; Rand.prototype.generate = function generate(len) { return this._rand(len); }; if (typeof window === 'object') { if (window.crypto && window.crypto.getRandomValues) { // Modern browsers Rand.prototype._rand = function _rand(n) { var arr = new Uint8Array(n); window.crypto.getRandomValues(arr); return arr; }; } else if (window.msCrypto && window.msCrypto.getRandomValues) { // IE Rand.prototype._rand = function _rand(n) { var arr = new Uint8Array(n); window.msCrypto.getRandomValues(arr); return arr; }; } else { // Old junk Rand.prototype._rand = function() { throw new Error('Not implemented yet'); }; } } else { // Node.js or Web worker try { var crypto = require('cry' + 'pto'); Rand.prototype._rand = function _rand(n) { return crypto.randomBytes(n); }; } catch (e) { // Emulate crypto API using randy Rand.prototype._rand = function _rand(n) { var res = new Uint8Array(n); for (var i = 0; i < res.length; i++) res[i] = this.rand.getByte(); return res; }; } } },{}],19:[function(require,module,exports){ arguments[4][1][0].apply(exports,arguments) },{"dup":1}],20:[function(require,module,exports){ (function (Buffer){ // based on the aes implimentation in triple sec // https://github.com/keybase/triplesec // which is in turn based on the one from crypto-js // https://code.google.com/p/crypto-js/ var uint_max = Math.pow(2, 32) function fixup_uint32 (x) { var ret, x_pos ret = x > uint_max || x < 0 ? (x_pos = Math.abs(x) % uint_max, x < 0 ? uint_max - x_pos : x_pos) : x return ret } function scrub_vec (v) { for (var i = 0; i < v.length; v++) { v[i] = 0 } return false } function Global () { this.SBOX = [] this.INV_SBOX = [] this.SUB_MIX = [[], [], [], []] this.INV_SUB_MIX = [[], [], [], []] this.init() this.RCON = [0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36] } Global.prototype.init = function () { var d, i, sx, t, x, x2, x4, x8, xi, _i d = (function () { var _i, _results _results = [] for (i = _i = 0; _i < 256; i = ++_i) { if (i < 128) { _results.push(i << 1) } else { _results.push((i << 1) ^ 0x11b) } } return _results })() x = 0 xi = 0 for (i = _i = 0; _i < 256; i = ++_i) { sx = xi ^ (xi << 1) ^ (xi << 2) ^ (xi << 3) ^ (xi << 4) sx = (sx >>> 8) ^ (sx & 0xff) ^ 0x63 this.SBOX[x] = sx this.INV_SBOX[sx] = x x2 = d[x] x4 = d[x2] x8 = d[x4] t = (d[sx] * 0x101) ^ (sx * 0x1010100) this.SUB_MIX[0][x] = (t << 24) | (t >>> 8) this.SUB_MIX[1][x] = (t << 16) | (t >>> 16) this.SUB_MIX[2][x] = (t << 8) | (t >>> 24) this.SUB_MIX[3][x] = t t = (x8 * 0x1010101) ^ (x4 * 0x10001) ^ (x2 * 0x101) ^ (x * 0x1010100) this.INV_SUB_MIX[0][sx] = (t << 24) | (t >>> 8) this.INV_SUB_MIX[1][sx] = (t << 16) | (t >>> 16) this.INV_SUB_MIX[2][sx] = (t << 8) | (t >>> 24) this.INV_SUB_MIX[3][sx] = t if (x === 0) { x = xi = 1 } else { x = x2 ^ d[d[d[x8 ^ x2]]] xi ^= d[d[xi]] } } return true } var G = new Global() AES.blockSize = 4 * 4 AES.prototype.blockSize = AES.blockSize AES.keySize = 256 / 8 AES.prototype.keySize = AES.keySize function bufferToArray (buf) { var len = buf.length / 4 var out = new Array(len) var i = -1 while (++i < len) { out[i] = buf.readUInt32BE(i * 4) } return out } function AES (key) { this._key = bufferToArray(key) this._doReset() } AES.prototype._doReset = function () { var invKsRow, keySize, keyWords, ksRow, ksRows, t keyWords = this._key keySize = keyWords.length this._nRounds = keySize + 6 ksRows = (this._nRounds + 1) * 4 this._keySchedule = [] for (ksRow = 0; ksRow < ksRows; ksRow++) { this._keySchedule[ksRow] = ksRow < keySize ? keyWords[ksRow] : (t = this._keySchedule[ksRow - 1], (ksRow % keySize) === 0 ? (t = (t << 8) | (t >>> 24), t = (G.SBOX[t >>> 24] << 24) | (G.SBOX[(t >>> 16) & 0xff] << 16) | (G.SBOX[(t >>> 8) & 0xff] << 8) | G.SBOX[t & 0xff], t ^= G.RCON[(ksRow / keySize) | 0] << 24) : keySize > 6 && ksRow % keySize === 4 ? t = (G.SBOX[t >>> 24] << 24) | (G.SBOX[(t >>> 16) & 0xff] << 16) | (G.SBOX[(t >>> 8) & 0xff] << 8) | G.SBOX[t & 0xff] : void 0, this._keySchedule[ksRow - keySize] ^ t) } this._invKeySchedule = [] for (invKsRow = 0; invKsRow < ksRows; invKsRow++) { ksRow = ksRows - invKsRow t = this._keySchedule[ksRow - (invKsRow % 4 ? 0 : 4)] this._invKeySchedule[invKsRow] = invKsRow < 4 || ksRow <= 4="" ?="" t="" :="" g.inv_sub_mix[0][g.sbox[t="">>> 24]] ^ G.INV_SUB_MIX[1][G.SBOX[(t >>> 16) & 0xff]] ^ G.INV_SUB_MIX[2][G.SBOX[(t >>> 8) & 0xff]] ^ G.INV_SUB_MIX[3][G.SBOX[t & 0xff]] } return true } AES.prototype.encryptBlock = function (M) { M = bufferToArray(new Buffer(M)) var out = this._doCryptBlock(M, this._keySchedule, G.SUB_MIX, G.SBOX) var buf = new Buffer(16) buf.writeUInt32BE(out[0], 0) buf.writeUInt32BE(out[1], 4) buf.writeUInt32BE(out[2], 8) buf.writeUInt32BE(out[3], 12) return buf } AES.prototype.decryptBlock = function (M) { M = bufferToArray(new Buffer(M)) var temp = [M[3], M[1]] M[1] = temp[0] M[3] = temp[1] var out = this._doCryptBlock(M, this._invKeySchedule, G.INV_SUB_MIX, G.INV_SBOX) var buf = new Buffer(16) buf.writeUInt32BE(out[0], 0) buf.writeUInt32BE(out[3], 4) buf.writeUInt32BE(out[2], 8) buf.writeUInt32BE(out[1], 12) return buf } AES.prototype.scrub = function () { scrub_vec(this._keySchedule) scrub_vec(this._invKeySchedule) scrub_vec(this._key) } AES.prototype._doCryptBlock = function (M, keySchedule, SUB_MIX, SBOX) { var ksRow, s0, s1, s2, s3, t0, t1, t2, t3 s0 = M[0] ^ keySchedule[0] s1 = M[1] ^ keySchedule[1] s2 = M[2] ^ keySchedule[2] s3 = M[3] ^ keySchedule[3] ksRow = 4 for (var round = 1; round < this._nRounds; round++) { t0 = SUB_MIX[0][s0 >>> 24] ^ SUB_MIX[1][(s1 >>> 16) & 0xff] ^ SUB_MIX[2][(s2 >>> 8) & 0xff] ^ SUB_MIX[3][s3 & 0xff] ^ keySchedule[ksRow++] t1 = SUB_MIX[0][s1 >>> 24] ^ SUB_MIX[1][(s2 >>> 16) & 0xff] ^ SUB_MIX[2][(s3 >>> 8) & 0xff] ^ SUB_MIX[3][s0 & 0xff] ^ keySchedule[ksRow++] t2 = SUB_MIX[0][s2 >>> 24] ^ SUB_MIX[1][(s3 >>> 16) & 0xff] ^ SUB_MIX[2][(s0 >>> 8) & 0xff] ^ SUB_MIX[3][s1 & 0xff] ^ keySchedule[ksRow++] t3 = SUB_MIX[0][s3 >>> 24] ^ SUB_MIX[1][(s0 >>> 16) & 0xff] ^ SUB_MIX[2][(s1 >>> 8) & 0xff] ^ SUB_MIX[3][s2 & 0xff] ^ keySchedule[ksRow++] s0 = t0 s1 = t1 s2 = t2 s3 = t3 } t0 = ((SBOX[s0 >>> 24] << 24) | (SBOX[(s1 >>> 16) & 0xff] << 16) | (SBOX[(s2 >>> 8) & 0xff] << 8) | SBOX[s3 & 0xff]) ^ keySchedule[ksRow++] t1 = ((SBOX[s1 >>> 24] << 24) | (SBOX[(s2 >>> 16) & 0xff] << 16) | (SBOX[(s3 >>> 8) & 0xff] << 8) | SBOX[s0 & 0xff]) ^ keySchedule[ksRow++] t2 = ((SBOX[s2 >>> 24] << 24) | (SBOX[(s3 >>> 16) & 0xff] << 16) | (SBOX[(s0 >>> 8) & 0xff] << 8) | SBOX[s1 & 0xff]) ^ keySchedule[ksRow++] t3 = ((SBOX[s3 >>> 24] << 24) | (SBOX[(s0 >>> 16) & 0xff] << 16) | (SBOX[(s1 >>> 8) & 0xff] << 8) | SBOX[s2 & 0xff]) ^ keySchedule[ksRow++] return [ fixup_uint32(t0), fixup_uint32(t1), fixup_uint32(t2), fixup_uint32(t3) ] } exports.AES = AES }).call(this,require("buffer").Buffer) },{"buffer":45}],21:[function(require,module,exports){ (function (Buffer){ var aes = require('./aes') var Transform = require('cipher-base') var inherits = require('inherits') var GHASH = require('./ghash') var xor = require('buffer-xor') inherits(StreamCipher, Transform) module.exports = StreamCipher function StreamCipher (mode, key, iv, decrypt) { if (!(this instanceof StreamCipher)) { return new StreamCipher(mode, key, iv) } Transform.call(this) this._finID = Buffer.concat([iv, new Buffer([0, 0, 0, 1])]) iv = Buffer.concat([iv, new Buffer([0, 0, 0, 2])]) this._cipher = new aes.AES(key) this._prev = new Buffer(iv.length) this._cache = new Buffer('') this._secCache = new Buffer('') this._decrypt = decrypt this._alen = 0 this._len = 0 iv.copy(this._prev) this._mode = mode var h = new Buffer(4) h.fill(0) this._ghash = new GHASH(this._cipher.encryptBlock(h)) this._authTag = null this._called = false } StreamCipher.prototype._update = function (chunk) { if (!this._called && this._alen) { var rump = 16 - (this._alen % 16) if (rump < 16) { rump = new Buffer(rump) rump.fill(0) this._ghash.update(rump) } } this._called = true var out = this._mode.encrypt(this, chunk) if (this._decrypt) { this._ghash.update(chunk) } else { this._ghash.update(out) } this._len += chunk.length return out } StreamCipher.prototype._final = function () { if (this._decrypt && !this._authTag) { throw new Error('Unsupported state or unable to authenticate data') } var tag = xor(this._ghash.final(this._alen * 8, this._len * 8), this._cipher.encryptBlock(this._finID)) if (this._decrypt) { if (xorTest(tag, this._authTag)) { throw new Error('Unsupported state or unable to authenticate data') } } else { this._authTag = tag } this._cipher.scrub() } StreamCipher.prototype.getAuthTag = function getAuthTag () { if (!this._decrypt && Buffer.isBuffer(this._authTag)) { return this._authTag } else { throw new Error('Attempting to get auth tag in unsupported state') } } StreamCipher.prototype.setAuthTag = function setAuthTag (tag) { if (this._decrypt) { this._authTag = tag } else { throw new Error('Attempting to set auth tag in unsupported state') } } StreamCipher.prototype.setAAD = function setAAD (buf) { if (!this._called) { this._ghash.update(buf) this._alen += buf.length } else { throw new Error('Attempting to set AAD in unsupported state') } } function xorTest (a, b) { var out = 0 if (a.length !== b.length) { out++ } var len = Math.min(a.length, b.length) var i = -1 while (++i < len) { out += (a[i] ^ b[i]) } return out } }).call(this,require("buffer").Buffer) },{"./aes":20,"./ghash":25,"buffer":45,"buffer-xor":44,"cipher-base":47,"inherits":92}],22:[function(require,module,exports){ var ciphers = require('./encrypter') exports.createCipher = exports.Cipher = ciphers.createCipher exports.createCipheriv = exports.Cipheriv = ciphers.createCipheriv var deciphers = require('./decrypter') exports.createDecipher = exports.Decipher = deciphers.createDecipher exports.createDecipheriv = exports.Decipheriv = deciphers.createDecipheriv var modes = require('./modes') function getCiphers () { return Object.keys(modes) } exports.listCiphers = exports.getCiphers = getCiphers },{"./decrypter":23,"./encrypter":24,"./modes":26}],23:[function(require,module,exports){ (function (Buffer){ var aes = require('./aes') var Transform = require('cipher-base') var inherits = require('inherits') var modes = require('./modes') var StreamCipher = require('./streamCipher') var AuthCipher = require('./authCipher') var ebtk = require('evp_bytestokey') inherits(Decipher, Transform) function Decipher (mode, key, iv) { if (!(this instanceof Decipher)) { return new Decipher(mode, key, iv) } Transform.call(this) this._cache = new Splitter() this._last = void 0 this._cipher = new aes.AES(key) this._prev = new Buffer(iv.length) iv.copy(this._prev) this._mode = mode this._autopadding = true } Decipher.prototype._update = function (data) { this._cache.add(data) var chunk var thing var out = [] while ((chunk = this._cache.get(this._autopadding))) { thing = this._mode.decrypt(this, chunk) out.push(thing) } return Buffer.concat(out) } Decipher.prototype._final = function () { var chunk = this._cache.flush() if (this._autopadding) { return unpad(this._mode.decrypt(this, chunk)) } else if (chunk) { throw new Error('data not multiple of block length') } } Decipher.prototype.setAutoPadding = function (setTo) { this._autopadding = !!setTo return this } function Splitter () { if (!(this instanceof Splitter)) { return new Splitter() } this.cache = new Buffer('') } Splitter.prototype.add = function (data) { this.cache = Buffer.concat([this.cache, data]) } Splitter.prototype.get = function (autoPadding) { var out if (autoPadding) { if (this.cache.length > 16) { out = this.cache.slice(0, 16) this.cache = this.cache.slice(16) return out } } else { if (this.cache.length >= 16) { out = this.cache.slice(0, 16) this.cache = this.cache.slice(16) return out } } return null } Splitter.prototype.flush = function () { if (this.cache.length) { return this.cache } } function unpad (last) { var padded = last[15] var i = -1 while (++i < padded) { if (last[(i + (16 - padded))] !== padded) { throw new Error('unable to decrypt data') } } if (padded === 16) { return } return last.slice(0, 16 - padded) } var modelist = { ECB: require('./modes/ecb'), CBC: require('./modes/cbc'), CFB: require('./modes/cfb'), CFB8: require('./modes/cfb8'), CFB1: require('./modes/cfb1'), OFB: require('./modes/ofb'), CTR: require('./modes/ctr'), GCM: require('./modes/ctr') } function createDecipheriv (suite, password, iv) { var config = modes[suite.toLowerCase()] if (!config) { throw new TypeError('invalid suite type') } if (typeof iv === 'string') { iv = new Buffer(iv) } if (typeof password === 'string') { password = new Buffer(password) } if (password.length !== config.key / 8) { throw new TypeError('invalid key length ' + password.length) } if (iv.length !== config.iv) { throw new TypeError('invalid iv length ' + iv.length) } if (config.type === 'stream') { return new StreamCipher(modelist[config.mode], password, iv, true) } else if (config.type === 'auth') { return new AuthCipher(modelist[config.mode], password, iv, true) } return new Decipher(modelist[config.mode], password, iv) } function createDecipher (suite, password) { var config = modes[suite.toLowerCase()] if (!config) { throw new TypeError('invalid suite type') } var keys = ebtk(password, false, config.key, config.iv) return createDecipheriv(suite, keys.key, keys.iv) } exports.createDecipher = createDecipher exports.createDecipheriv = createDecipheriv }).call(this,require("buffer").Buffer) },{"./aes":20,"./authCipher":21,"./modes":26,"./modes/cbc":27,"./modes/cfb":28,"./modes/cfb1":29,"./modes/cfb8":30,"./modes/ctr":31,"./modes/ecb":32,"./modes/ofb":33,"./streamCipher":34,"buffer":45,"cipher-base":47,"evp_bytestokey":83,"inherits":92}],24:[function(require,module,exports){ (function (Buffer){ var aes = require('./aes') var Transform = require('cipher-base') var inherits = require('inherits') var modes = require('./modes') var ebtk = require('evp_bytestokey') var StreamCipher = require('./streamCipher') var AuthCipher = require('./authCipher') inherits(Cipher, Transform) function Cipher (mode, key, iv) { if (!(this instanceof Cipher)) { return new Cipher(mode, key, iv) } Transform.call(this) this._cache = new Splitter() this._cipher = new aes.AES(key) this._prev = new Buffer(iv.length) iv.copy(this._prev) this._mode = mode this._autopadding = true } Cipher.prototype._update = function (data) { this._cache.add(data) var chunk var thing var out = [] while ((chunk = this._cache.get())) { thing = this._mode.encrypt(this, chunk) out.push(thing) } return Buffer.concat(out) } Cipher.prototype._final = function () { var chunk = this._cache.flush() if (this._autopadding) { chunk = this._mode.encrypt(this, chunk) this._cipher.scrub() return chunk } else if (chunk.toString('hex') !== '10101010101010101010101010101010') { this._cipher.scrub() throw new Error('data not multiple of block length') } } Cipher.prototype.setAutoPadding = function (setTo) { this._autopadding = !!setTo return this } function Splitter () { if (!(this instanceof Splitter)) { return new Splitter() } this.cache = new Buffer('') } Splitter.prototype.add = function (data) { this.cache = Buffer.concat([this.cache, data]) } Splitter.prototype.get = function () { if (this.cache.length > 15) { var out = this.cache.slice(0, 16) this.cache = this.cache.slice(16) return out } return null } Splitter.prototype.flush = function () { var len = 16 - this.cache.length var padBuff = new Buffer(len) var i = -1 while (++i < len) { padBuff.writeUInt8(len, i) } var out = Buffer.concat([this.cache, padBuff]) return out } var modelist = { ECB: require('./modes/ecb'), CBC: require('./modes/cbc'), CFB: require('./modes/cfb'), CFB8: require('./modes/cfb8'), CFB1: require('./modes/cfb1'), OFB: require('./modes/ofb'), CTR: require('./modes/ctr'), GCM: require('./modes/ctr') } function createCipheriv (suite, password, iv) { var config = modes[suite.toLowerCase()] if (!config) { throw new TypeError('invalid suite type') } if (typeof iv === 'string') { iv = new Buffer(iv) } if (typeof password === 'string') { password = new Buffer(password) } if (password.length !== config.key / 8) { throw new TypeError('invalid key length ' + password.length) } if (iv.length !== config.iv) { throw new TypeError('invalid iv length ' + iv.length) } if (config.type === 'stream') { return new StreamCipher(modelist[config.mode], password, iv) } else if (config.type === 'auth') { return new AuthCipher(modelist[config.mode], password, iv) } return new Cipher(modelist[config.mode], password, iv) } function createCipher (suite, password) { var config = modes[suite.toLowerCase()] if (!config) { throw new TypeError('invalid suite type') } var keys = ebtk(password, false, config.key, config.iv) return createCipheriv(suite, keys.key, keys.iv) } exports.createCipheriv = createCipheriv exports.createCipher = createCipher }).call(this,require("buffer").Buffer) },{"./aes":20,"./authCipher":21,"./modes":26,"./modes/cbc":27,"./modes/cfb":28,"./modes/cfb1":29,"./modes/cfb8":30,"./modes/ctr":31,"./modes/ecb":32,"./modes/ofb":33,"./streamCipher":34,"buffer":45,"cipher-base":47,"evp_bytestokey":83,"inherits":92}],25:[function(require,module,exports){ (function (Buffer){ var zeros = new Buffer(16) zeros.fill(0) module.exports = GHASH function GHASH (key) { this.h = key this.state = new Buffer(16) this.state.fill(0) this.cache = new Buffer('') } // from http://bitwiseshiftleft.github.io/sjcl/doc/symbols/src/core_gcm.js.html // by Juho Vähä-Herttua GHASH.prototype.ghash = function (block) { var i = -1 while (++i < block.length) { this.state[i] ^= block[i] } this._multiply() } GHASH.prototype._multiply = function () { var Vi = toArray(this.h) var Zi = [0, 0, 0, 0] var j, xi, lsb_Vi var i = -1 while (++i < 128) { xi = (this.state[~~(i / 8)] & (1 << (7 - i % 8))) !== 0 if (xi) { // Z_i+1 = Z_i ^ V_i Zi = xor(Zi, Vi) } // Store the value of LSB(V_i) lsb_Vi = (Vi[3] & 1) !== 0 // V_i+1 = V_i >> 1 for (j = 3; j > 0; j--) { Vi[j] = (Vi[j] >>> 1) | ((Vi[j - 1] & 1) << 31) } Vi[0] = Vi[0] >>> 1 // If LSB(V_i) is 1, V_i+1 = (V_i >> 1) ^ R if (lsb_Vi) { Vi[0] = Vi[0] ^ (0xe1 << 24) } } this.state = fromArray(Zi) } GHASH.prototype.update = function (buf) { this.cache = Buffer.concat([this.cache, buf]) var chunk while (this.cache.length >= 16) { chunk = this.cache.slice(0, 16) this.cache = this.cache.slice(16) this.ghash(chunk) } } GHASH.prototype.final = function (abl, bl) { if (this.cache.length) { this.ghash(Buffer.concat([this.cache, zeros], 16)) } this.ghash(fromArray([ 0, abl, 0, bl ])) return this.state } function toArray (buf) { return [ buf.readUInt32BE(0), buf.readUInt32BE(4), buf.readUInt32BE(8), buf.readUInt32BE(12) ] } function fromArray (out) { out = out.map(fixup_uint32) var buf = new Buffer(16) buf.writeUInt32BE(out[0], 0) buf.writeUInt32BE(out[1], 4) buf.writeUInt32BE(out[2], 8) buf.writeUInt32BE(out[3], 12) return buf } var uint_max = Math.pow(2, 32) function fixup_uint32 (x) { var ret, x_pos ret = x > uint_max || x < 0 ? (x_pos = Math.abs(x) % uint_max, x < 0 ? uint_max - x_pos : x_pos) : x return ret } function xor (a, b) { return [ a[0] ^ b[0], a[1] ^ b[1], a[2] ^ b[2], a[3] ^ b[3] ] } }).call(this,require("buffer").Buffer) },{"buffer":45}],26:[function(require,module,exports){ exports['aes-128-ecb'] = { cipher: 'AES', key: 128, iv: 0, mode: 'ECB', type: 'block' } exports['aes-192-ecb'] = { cipher: 'AES', key: 192, iv: 0, mode: 'ECB', type: 'block' } exports['aes-256-ecb'] = { cipher: 'AES', key: 256, iv: 0, mode: 'ECB', type: 'block' } exports['aes-128-cbc'] = { cipher: 'AES', key: 128, iv: 16, mode: 'CBC', type: 'block' } exports['aes-192-cbc'] = { cipher: 'AES', key: 192, iv: 16, mode: 'CBC', type: 'block' } exports['aes-256-cbc'] = { cipher: 'AES', key: 256, iv: 16, mode: 'CBC', type: 'block' } exports['aes128'] = exports['aes-128-cbc'] exports['aes192'] = exports['aes-192-cbc'] exports['aes256'] = exports['aes-256-cbc'] exports['aes-128-cfb'] = { cipher: 'AES', key: 128, iv: 16, mode: 'CFB', type: 'stream' } exports['aes-192-cfb'] = { cipher: 'AES', key: 192, iv: 16, mode: 'CFB', type: 'stream' } exports['aes-256-cfb'] = { cipher: 'AES', key: 256, iv: 16, mode: 'CFB', type: 'stream' } exports['aes-128-cfb8'] = { cipher: 'AES', key: 128, iv: 16, mode: 'CFB8', type: 'stream' } exports['aes-192-cfb8'] = { cipher: 'AES', key: 192, iv: 16, mode: 'CFB8', type: 'stream' } exports['aes-256-cfb8'] = { cipher: 'AES', key: 256, iv: 16, mode: 'CFB8', type: 'stream' } exports['aes-128-cfb1'] = { cipher: 'AES', key: 128, iv: 16, mode: 'CFB1', type: 'stream' } exports['aes-192-cfb1'] = { cipher: 'AES', key: 192, iv: 16, mode: 'CFB1', type: 'stream' } exports['aes-256-cfb1'] = { cipher: 'AES', key: 256, iv: 16, mode: 'CFB1', type: 'stream' } exports['aes-128-ofb'] = { cipher: 'AES', key: 128, iv: 16, mode: 'OFB', type: 'stream' } exports['aes-192-ofb'] = { cipher: 'AES', key: 192, iv: 16, mode: 'OFB', type: 'stream' } exports['aes-256-ofb'] = { cipher: 'AES', key: 256, iv: 16, mode: 'OFB', type: 'stream' } exports['aes-128-ctr'] = { cipher: 'AES', key: 128, iv: 16, mode: 'CTR', type: 'stream' } exports['aes-192-ctr'] = { cipher: 'AES', key: 192, iv: 16, mode: 'CTR', type: 'stream' } exports['aes-256-ctr'] = { cipher: 'AES', key: 256, iv: 16, mode: 'CTR', type: 'stream' } exports['aes-128-gcm'] = { cipher: 'AES', key: 128, iv: 12, mode: 'GCM', type: 'auth' } exports['aes-192-gcm'] = { cipher: 'AES', key: 192, iv: 12, mode: 'GCM', type: 'auth' } exports['aes-256-gcm'] = { cipher: 'AES', key: 256, iv: 12, mode: 'GCM', type: 'auth' } },{}],27:[function(require,module,exports){ var xor = require('buffer-xor') exports.encrypt = function (self, block) { var data = xor(block, self._prev) self._prev = self._cipher.encryptBlock(data) return self._prev } exports.decrypt = function (self, block) { var pad = self._prev self._prev = block var out = self._cipher.decryptBlock(block) return xor(out, pad) } },{"buffer-xor":44}],28:[function(require,module,exports){ (function (Buffer){ var xor = require('buffer-xor') exports.encrypt = function (self, data, decrypt) { var out = new Buffer('') var len while (data.length) { if (self._cache.length === 0) { self._cache = self._cipher.encryptBlock(self._prev) self._prev = new Buffer('') } if (self._cache.length <= 0="" data.length)="" {="" len="self._cache.length" out="Buffer.concat([out," encryptstart(self,="" data.slice(0,="" len),="" decrypt)])="" data="data.slice(len)" }="" else="" data,="" break="" return="" function="" encryptstart="" (self,="" decrypt)="" var="" self._cache)="" self._cache="self._cache.slice(len)" self._prev="Buffer.concat([self._prev," decrypt="" ?="" :="" out])="" }).call(this,require("buffer").buffer)="" },{"buffer":45,"buffer-xor":44}],29:[function(require,module,exports){="" (function="" (buffer){="" encryptbyte="" byteparam,="" pad="" i="-1" bit,="" value="" while="" (++i="" <="" len)="" bit="(byteParam" &="" (1="" <<="" (7="" -="" i)))="" 0x80="" ^="" +="((value" 0x80)="">> (i % 8)) self._prev = shiftIn(self._prev, decrypt ? bit : value) } return out } exports.encrypt = function (self, chunk, decrypt) { var len = chunk.length var out = new Buffer(len) var i = -1 while (++i < len) { out[i] = encryptByte(self, chunk[i], decrypt) } return out } function shiftIn (buffer, value) { var len = buffer.length var i = -1 var out = new Buffer(buffer.length) buffer = Buffer.concat([buffer, new Buffer([value])]) while (++i < len) { out[i] = buffer[i] << 1 | buffer[i + 1] >> (7) } return out } }).call(this,require("buffer").Buffer) },{"buffer":45}],30:[function(require,module,exports){ (function (Buffer){ function encryptByte (self, byteParam, decrypt) { var pad = self._cipher.encryptBlock(self._prev) var out = pad[0] ^ byteParam self._prev = Buffer.concat([self._prev.slice(1), new Buffer([decrypt ? byteParam : out])]) return out } exports.encrypt = function (self, chunk, decrypt) { var len = chunk.length var out = new Buffer(len) var i = -1 while (++i < len) { out[i] = encryptByte(self, chunk[i], decrypt) } return out } }).call(this,require("buffer").Buffer) },{"buffer":45}],31:[function(require,module,exports){ (function (Buffer){ var xor = require('buffer-xor') function incr32 (iv) { var len = iv.length var item while (len--) { item = iv.readUInt8(len) if (item === 255) { iv.writeUInt8(0, len) } else { item++ iv.writeUInt8(item, len) break } } } function getBlock (self) { var out = self._cipher.encryptBlock(self._prev) incr32(self._prev) return out } exports.encrypt = function (self, chunk) { while (self._cache.length < chunk.length) { self._cache = Buffer.concat([self._cache, getBlock(self)]) } var pad = self._cache.slice(0, chunk.length) self._cache = self._cache.slice(chunk.length) return xor(chunk, pad) } }).call(this,require("buffer").Buffer) },{"buffer":45,"buffer-xor":44}],32:[function(require,module,exports){ exports.encrypt = function (self, block) { return self._cipher.encryptBlock(block) } exports.decrypt = function (self, block) { return self._cipher.decryptBlock(block) } },{}],33:[function(require,module,exports){ (function (Buffer){ var xor = require('buffer-xor') function getBlock (self) { self._prev = self._cipher.encryptBlock(self._prev) return self._prev } exports.encrypt = function (self, chunk) { while (self._cache.length < chunk.length) { self._cache = Buffer.concat([self._cache, getBlock(self)]) } var pad = self._cache.slice(0, chunk.length) self._cache = self._cache.slice(chunk.length) return xor(chunk, pad) } }).call(this,require("buffer").Buffer) },{"buffer":45,"buffer-xor":44}],34:[function(require,module,exports){ (function (Buffer){ var aes = require('./aes') var Transform = require('cipher-base') var inherits = require('inherits') inherits(StreamCipher, Transform) module.exports = StreamCipher function StreamCipher (mode, key, iv, decrypt) { if (!(this instanceof StreamCipher)) { return new StreamCipher(mode, key, iv) } Transform.call(this) this._cipher = new aes.AES(key) this._prev = new Buffer(iv.length) this._cache = new Buffer('') this._secCache = new Buffer('') this._decrypt = decrypt iv.copy(this._prev) this._mode = mode } StreamCipher.prototype._update = function (chunk) { return this._mode.encrypt(this, chunk, this._decrypt) } StreamCipher.prototype._final = function () { this._cipher.scrub() } }).call(this,require("buffer").Buffer) },{"./aes":20,"buffer":45,"cipher-base":47,"inherits":92}],35:[function(require,module,exports){ var ebtk = require('evp_bytestokey') var aes = require('browserify-aes/browser') var DES = require('browserify-des') var desModes = require('browserify-des/modes') var aesModes = require('browserify-aes/modes') function createCipher (suite, password) { var keyLen, ivLen suite = suite.toLowerCase() if (aesModes[suite]) { keyLen = aesModes[suite].key ivLen = aesModes[suite].iv } else if (desModes[suite]) { keyLen = desModes[suite].key * 8 ivLen = desModes[suite].iv } else { throw new TypeError('invalid suite type') } var keys = ebtk(password, false, keyLen, ivLen) return createCipheriv(suite, keys.key, keys.iv) } function createDecipher (suite, password) { var keyLen, ivLen suite = suite.toLowerCase() if (aesModes[suite]) { keyLen = aesModes[suite].key ivLen = aesModes[suite].iv } else if (desModes[suite]) { keyLen = desModes[suite].key * 8 ivLen = desModes[suite].iv } else { throw new TypeError('invalid suite type') } var keys = ebtk(password, false, keyLen, ivLen) return createDecipheriv(suite, keys.key, keys.iv) } function createCipheriv (suite, key, iv) { suite = suite.toLowerCase() if (aesModes[suite]) { return aes.createCipheriv(suite, key, iv) } else if (desModes[suite]) { return new DES({ key: key, iv: iv, mode: suite }) } else { throw new TypeError('invalid suite type') } } function createDecipheriv (suite, key, iv) { suite = suite.toLowerCase() if (aesModes[suite]) { return aes.createDecipheriv(suite, key, iv) } else if (desModes[suite]) { return new DES({ key: key, iv: iv, mode: suite, decrypt: true }) } else { throw new TypeError('invalid suite type') } } exports.createCipher = exports.Cipher = createCipher exports.createCipheriv = exports.Cipheriv = createCipheriv exports.createDecipher = exports.Decipher = createDecipher exports.createDecipheriv = exports.Decipheriv = createDecipheriv function getCiphers () { return Object.keys(desModes).concat(aes.getCiphers()) } exports.listCiphers = exports.getCiphers = getCiphers },{"browserify-aes/browser":22,"browserify-aes/modes":26,"browserify-des":36,"browserify-des/modes":37,"evp_bytestokey":83}],36:[function(require,module,exports){ (function (Buffer){ var CipherBase = require('cipher-base') var des = require('des.js') var inherits = require('inherits') var modes = { 'des-ede3-cbc': des.CBC.instantiate(des.EDE), 'des-ede3': des.EDE, 'des-ede-cbc': des.CBC.instantiate(des.EDE), 'des-ede': des.EDE, 'des-cbc': des.CBC.instantiate(des.DES), 'des-ecb': des.DES } modes.des = modes['des-cbc'] modes.des3 = modes['des-ede3-cbc'] module.exports = DES inherits(DES, CipherBase) function DES (opts) { CipherBase.call(this) var modeName = opts.mode.toLowerCase() var mode = modes[modeName] var type if (opts.decrypt) { type = 'decrypt' } else { type = 'encrypt' } var key = opts.key if (modeName === 'des-ede' || modeName === 'des-ede-cbc') { key = Buffer.concat([key, key.slice(0, 8)]) } var iv = opts.iv this._des = mode.create({ key: key, iv: iv, type: type }) } DES.prototype._update = function (data) { return new Buffer(this._des.update(data)) } DES.prototype._final = function () { return new Buffer(this._des.final()) } }).call(this,require("buffer").Buffer) },{"buffer":45,"cipher-base":47,"des.js":55,"inherits":92}],37:[function(require,module,exports){ exports['des-ecb'] = { key: 8, iv: 0 } exports['des-cbc'] = exports.des = { key: 8, iv: 8 } exports['des-ede3-cbc'] = exports.des3 = { key: 24, iv: 8 } exports['des-ede3'] = { key: 24, iv: 0 } exports['des-ede-cbc'] = { key: 16, iv: 8 } exports['des-ede'] = { key: 16, iv: 0 } },{}],38:[function(require,module,exports){ (function (Buffer){ var bn = require('bn.js'); var randomBytes = require('randombytes'); module.exports = crt; function blind(priv) { var r = getr(priv); var blinder = r.toRed(bn.mont(priv.modulus)) .redPow(new bn(priv.publicExponent)).fromRed(); return { blinder: blinder, unblinder:r.invm(priv.modulus) }; } function crt(msg, priv) { var blinds = blind(priv); var len = priv.modulus.byteLength(); var mod = bn.mont(priv.modulus); var blinded = new bn(msg).mul(blinds.blinder).umod(priv.modulus); var c1 = blinded.toRed(bn.mont(priv.prime1)); var c2 = blinded.toRed(bn.mont(priv.prime2)); var qinv = priv.coefficient; var p = priv.prime1; var q = priv.prime2; var m1 = c1.redPow(priv.exponent1); var m2 = c2.redPow(priv.exponent2); m1 = m1.fromRed(); m2 = m2.fromRed(); var h = m1.isub(m2).imul(qinv).umod(p); h.imul(q); m2.iadd(h); return new Buffer(m2.imul(blinds.unblinder).umod(priv.modulus).toArray(false, len)); } crt.getr = getr; function getr(priv) { var len = priv.modulus.byteLength(); var r = new bn(randomBytes(len)); while (r.cmp(priv.modulus) >= 0 || !r.umod(priv.prime1) || !r.umod(priv.prime2)) { r = new bn(randomBytes(len)); } return r; } }).call(this,require("buffer").Buffer) },{"bn.js":17,"buffer":45,"randombytes":111}],39:[function(require,module,exports){ (function (Buffer){ 'use strict' exports['RSA-SHA224'] = exports.sha224WithRSAEncryption = { sign: 'rsa', hash: 'sha224', id: new Buffer('302d300d06096086480165030402040500041c', 'hex') } exports['RSA-SHA256'] = exports.sha256WithRSAEncryption = { sign: 'rsa', hash: 'sha256', id: new Buffer('3031300d060960864801650304020105000420', 'hex') } exports['RSA-SHA384'] = exports.sha384WithRSAEncryption = { sign: 'rsa', hash: 'sha384', id: new Buffer('3041300d060960864801650304020205000430', 'hex') } exports['RSA-SHA512'] = exports.sha512WithRSAEncryption = { sign: 'rsa', hash: 'sha512', id: new Buffer('3051300d060960864801650304020305000440', 'hex') } exports['RSA-SHA1'] = { sign: 'rsa', hash: 'sha1', id: new Buffer('3021300906052b0e03021a05000414', 'hex') } exports['ecdsa-with-SHA1'] = { sign: 'ecdsa', hash: 'sha1', id: new Buffer('', 'hex') } exports.DSA = exports['DSA-SHA1'] = exports['DSA-SHA'] = { sign: 'dsa', hash: 'sha1', id: new Buffer('', 'hex') } exports['DSA-SHA224'] = exports['DSA-WITH-SHA224'] = { sign: 'dsa', hash: 'sha224', id: new Buffer('', 'hex') } exports['DSA-SHA256'] = exports['DSA-WITH-SHA256'] = { sign: 'dsa', hash: 'sha256', id: new Buffer('', 'hex') } exports['DSA-SHA384'] = exports['DSA-WITH-SHA384'] = { sign: 'dsa', hash: 'sha384', id: new Buffer('', 'hex') } exports['DSA-SHA512'] = exports['DSA-WITH-SHA512'] = { sign: 'dsa', hash: 'sha512', id: new Buffer('', 'hex') } exports['DSA-RIPEMD160'] = { sign: 'dsa', hash: 'rmd160', id: new Buffer('', 'hex') } exports['RSA-RIPEMD160'] = exports.ripemd160WithRSA = { sign: 'rsa', hash: 'rmd160', id: new Buffer('3021300906052b2403020105000414', 'hex') } exports['RSA-MD5'] = exports.md5WithRSAEncryption = { sign: 'rsa', hash: 'md5', id: new Buffer('3020300c06082a864886f70d020505000410', 'hex') } }).call(this,require("buffer").Buffer) },{"buffer":45}],40:[function(require,module,exports){ (function (Buffer){ var _algos = require('./algos') var createHash = require('create-hash') var inherits = require('inherits') var sign = require('./sign') var stream = require('stream') var verify = require('./verify') var algos = {} Object.keys(_algos).forEach(function (key) { algos[key] = algos[key.toLowerCase()] = _algos[key] }) function Sign (algorithm) { stream.Writable.call(this) var data = algos[algorithm] if (!data) { throw new Error('Unknown message digest') } this._hashType = data.hash this._hash = createHash(data.hash) this._tag = data.id this._signType = data.sign } inherits(Sign, stream.Writable) Sign.prototype._write = function _write (data, _, done) { this._hash.update(data) done() } Sign.prototype.update = function update (data, enc) { if (typeof data === 'string') { data = new Buffer(data, enc) } this._hash.update(data) return this } Sign.prototype.sign = function signMethod (key, enc) { this.end() var hash = this._hash.digest() var sig = sign(Buffer.concat([this._tag, hash]), key, this._hashType, this._signType) return enc ? sig.toString(enc) : sig } function Verify (algorithm) { stream.Writable.call(this) var data = algos[algorithm] if (!data) { throw new Error('Unknown message digest') } this._hash = createHash(data.hash) this._tag = data.id this._signType = data.sign } inherits(Verify, stream.Writable) Verify.prototype._write = function _write (data, _, done) { this._hash.update(data) done() } Verify.prototype.update = function update (data, enc) { if (typeof data === 'string') { data = new Buffer(data, enc) } this._hash.update(data) return this } Verify.prototype.verify = function verifyMethod (key, sig, enc) { if (typeof sig === 'string') { sig = new Buffer(sig, enc) } this.end() var hash = this._hash.digest() return verify(sig, Buffer.concat([this._tag, hash]), key, this._signType) } function createSign (algorithm) { return new Sign(algorithm) } function createVerify (algorithm) { return new Verify(algorithm) } module.exports = { Sign: createSign, Verify: createVerify, createSign: createSign, createVerify: createVerify } }).call(this,require("buffer").Buffer) },{"./algos":39,"./sign":42,"./verify":43,"buffer":45,"create-hash":50,"inherits":92,"stream":131}],41:[function(require,module,exports){ 'use strict' exports['1.3.132.0.10'] = 'secp256k1' exports['1.3.132.0.33'] = 'p224' exports['1.2.840.10045.3.1.1'] = 'p192' exports['1.2.840.10045.3.1.7'] = 'p256' exports['1.3.132.0.34'] = 'p384' exports['1.3.132.0.35'] = 'p521' },{}],42:[function(require,module,exports){ (function (Buffer){ // much of this based on https://github.com/indutny/self-signed/blob/gh-pages/lib/rsa.js var createHmac = require('create-hmac') var crt = require('browserify-rsa') var curves = require('./curves') var elliptic = require('elliptic') var parseKeys = require('parse-asn1') var BN = require('bn.js') var EC = elliptic.ec function sign (hash, key, hashType, signType) { var priv = parseKeys(key) if (priv.curve) { if (signType !== 'ecdsa') throw new Error('wrong private key type') return ecSign(hash, priv) } else if (priv.type === 'dsa') { if (signType !== 'dsa') { throw new Error('wrong private key type') } return dsaSign(hash, priv, hashType) } else { if (signType !== 'rsa') throw new Error('wrong private key type') } var len = priv.modulus.byteLength() var pad = [ 0, 1 ] while (hash.length + pad.length + 1 < len) { pad.push(0xff) } pad.push(0x00) var i = -1 while (++i < hash.length) { pad.push(hash[i]) } var out = crt(pad, priv) return out } function ecSign (hash, priv) { var curveId = curves[priv.curve.join('.')] if (!curveId) throw new Error('unknown curve ' + priv.curve.join('.')) var curve = new EC(curveId) var key = curve.genKeyPair() key._importPrivate(priv.privateKey) var out = key.sign(hash) return new Buffer(out.toDER()) } function dsaSign (hash, priv, algo) { var x = priv.params.priv_key var p = priv.params.p var q = priv.params.q var g = priv.params.g var r = new BN(0) var k var H = bits2int(hash, q).mod(q) var s = false var kv = getKey(x, q, hash, algo) while (s === false) { k = makeKey(q, kv, algo) r = makeR(g, k, p, q) s = k.invm(q).imul(H.add(x.mul(r))).mod(q) if (!s.cmpn(0)) { s = false r = new BN(0) } } return toDER(r, s) } function toDER (r, s) { r = r.toArray() s = s.toArray() // Pad values if (r[0] & 0x80) { r = [ 0 ].concat(r) } // Pad values if (s[0] & 0x80) { s = [0].concat(s) } var total = r.length + s.length + 4 var res = [ 0x30, total, 0x02, r.length ] res = res.concat(r, [ 0x02, s.length ], s) return new Buffer(res) } function getKey (x, q, hash, algo) { x = new Buffer(x.toArray()) if (x.length < q.byteLength()) { var zeros = new Buffer(q.byteLength() - x.length) zeros.fill(0) x = Buffer.concat([zeros, x]) } var hlen = hash.length var hbits = bits2octets(hash, q) var v = new Buffer(hlen) v.fill(1) var k = new Buffer(hlen) k.fill(0) k = createHmac(algo, k) .update(v) .update(new Buffer([0])) .update(x) .update(hbits) .digest() v = createHmac(algo, k) .update(v) .digest() k = createHmac(algo, k) .update(v) .update(new Buffer([1])) .update(x) .update(hbits) .digest() v = createHmac(algo, k) .update(v) .digest() return { k: k, v: v } } function bits2int (obits, q) { var bits = new BN(obits) var shift = (obits.length << 3) - q.bitLength() if (shift > 0) { bits.ishrn(shift) } return bits } function bits2octets (bits, q) { bits = bits2int(bits, q) bits = bits.mod(q) var out = new Buffer(bits.toArray()) if (out.length < q.byteLength()) { var zeros = new Buffer(q.byteLength() - out.length) zeros.fill(0) out = Buffer.concat([zeros, out]) } return out } function makeKey (q, kv, algo) { var t, k do { t = new Buffer('') while (t.length * 8 < q.bitLength()) { kv.v = createHmac(algo, kv.k) .update(kv.v) .digest() t = Buffer.concat([t, kv.v]) } k = bits2int(t, q) kv.k = createHmac(algo, kv.k) .update(kv.v) .update(new Buffer([0])) .digest() kv.v = createHmac(algo, kv.k) .update(kv.v) .digest() } while (k.cmp(q) !== -1) return k } function makeR (g, k, p, q) { return g.toRed(BN.mont(p)).redPow(k).fromRed().mod(q) } module.exports = sign module.exports.getKey = getKey module.exports.makeKey = makeKey }).call(this,require("buffer").Buffer) },{"./curves":41,"bn.js":17,"browserify-rsa":38,"buffer":45,"create-hmac":53,"elliptic":65,"parse-asn1":100}],43:[function(require,module,exports){ (function (Buffer){ // much of this based on https://github.com/indutny/self-signed/blob/gh-pages/lib/rsa.js var curves = require('./curves') var elliptic = require('elliptic') var parseKeys = require('parse-asn1') var BN = require('bn.js') var EC = elliptic.ec function verify (sig, hash, key, signType) { var pub = parseKeys(key) if (pub.type === 'ec') { if (signType !== 'ecdsa') { throw new Error('wrong public key type') } return ecVerify(sig, hash, pub) } else if (pub.type === 'dsa') { if (signType !== 'dsa') { throw new Error('wrong public key type') } return dsaVerify(sig, hash, pub) } else { if (signType !== 'rsa') { throw new Error('wrong public key type') } } var len = pub.modulus.byteLength() var pad = [ 1 ] var padNum = 0 while (hash.length + pad.length + 2 < len) { pad.push(0xff) padNum++ } pad.push(0x00) var i = -1 while (++i < hash.length) { pad.push(hash[i]) } pad = new Buffer(pad) var red = BN.mont(pub.modulus) sig = new BN(sig).toRed(red) sig = sig.redPow(new BN(pub.publicExponent)) sig = new Buffer(sig.fromRed().toArray()) var out = 0 if (padNum < 8) { out = 1 } len = Math.min(sig.length, pad.length) if (sig.length !== pad.length) { out = 1 } i = -1 while (++i < len) { out |= (sig[i] ^ pad[i]) } return out === 0 } function ecVerify (sig, hash, pub) { var curveId = curves[pub.data.algorithm.curve.join('.')] if (!curveId) throw new Error('unknown curve ' + pub.data.algorithm.curve.join('.')) var curve = new EC(curveId) var pubkey = pub.data.subjectPrivateKey.data return curve.verify(hash, sig, pubkey) } function dsaVerify (sig, hash, pub) { var p = pub.data.p var q = pub.data.q var g = pub.data.g var y = pub.data.pub_key var unpacked = parseKeys.signature.decode(sig, 'der') var s = unpacked.s var r = unpacked.r checkValue(s, q) checkValue(r, q) var montp = BN.mont(p) var w = s.invm(q) var v = g.toRed(montp) .redPow(new BN(hash).mul(w).mod(q)) .fromRed() .mul( y.toRed(montp) .redPow(r.mul(w).mod(q)) .fromRed() ).mod(p).mod(q) return !v.cmp(r) } function checkValue (b, q) { if (b.cmpn(0) <= 0)="" {="" throw="" new="" error('invalid="" sig')="" }="" if="" (b.cmp(q)="">= q) { throw new Error('invalid sig') } } module.exports = verify }).call(this,require("buffer").Buffer) },{"./curves":41,"bn.js":17,"buffer":45,"elliptic":65,"parse-asn1":100}],44:[function(require,module,exports){ (function (Buffer){ module.exports = function xor (a, b) { var length = Math.min(a.length, b.length) var buffer = new Buffer(length) for (var i = 0; i < length; ++i) { buffer[i] = a[i] ^ b[i] } return buffer } }).call(this,require("buffer").Buffer) },{"buffer":45}],45:[function(require,module,exports){ (function (global){ /*! * The buffer module from node.js, for the browser. * * @author Feross Aboukhadijeh * @license MIT */ /* eslint-disable no-proto */ 'use strict' var base64 = require('base64-js') var ieee754 = require('ieee754') var isArray = require('isarray') exports.Buffer = Buffer exports.SlowBuffer = SlowBuffer exports.INSPECT_MAX_BYTES = 50 Buffer.poolSize = 8192 // not used by this implementation var rootParent = {} /** * If `Buffer.TYPED_ARRAY_SUPPORT`: * === true Use Uint8Array implementation (fastest) * === false Use Object implementation (most compatible, even IE6) * * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+, * Opera 11.6+, iOS 4.2+. * * Due to various browser bugs, sometimes the Object implementation will be used even * when the browser supports typed arrays. * * Note: * * - Firefox 4-29 lacks support for adding new properties to `Uint8Array` instances, * See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438. * * - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function. * * - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of * incorrect length in some situations. * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they * get the Object implementation, which is slower but behaves correctly. */ Buffer.TYPED_ARRAY_SUPPORT = global.TYPED_ARRAY_SUPPORT !== undefined ? global.TYPED_ARRAY_SUPPORT : typedArraySupport() function typedArraySupport () { try { var arr = new Uint8Array(1) arr.foo = function () { return 42 } return arr.foo() === 42 && // typed array instances can be augmented typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray` arr.subarray(1, 1).byteLength === 0 // ie10 has broken `subarray` } catch (e) { return false } } function kMaxLength () { return Buffer.TYPED_ARRAY_SUPPORT ? 0x7fffffff : 0x3fffffff } /** * The Buffer constructor returns instances of `Uint8Array` that have their * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of * `Uint8Array`, so the returned instances will have all the node `Buffer` methods * and the `Uint8Array` methods. Square bracket notation works as expected -- it * returns a single octet. * * The `Uint8Array` prototype remains unmodified. */ function Buffer (arg) { if (!(this instanceof Buffer)) { // Avoid going through an ArgumentsAdaptorTrampoline in the common case. if (arguments.length > 1) return new Buffer(arg, arguments[1]) return new Buffer(arg) } if (!Buffer.TYPED_ARRAY_SUPPORT) { this.length = 0 this.parent = undefined } // Common case. if (typeof arg === 'number') { return fromNumber(this, arg) } // Slightly less common case. if (typeof arg === 'string') { return fromString(this, arg, arguments.length > 1 ? arguments[1] : 'utf8') } // Unusual. return fromObject(this, arg) } // TODO: Legacy, not needed anymore. Remove in next major version. Buffer._augment = function (arr) { arr.__proto__ = Buffer.prototype return arr } function fromNumber (that, length) { that = allocate(that, length < 0 ? 0 : checked(length) | 0) if (!Buffer.TYPED_ARRAY_SUPPORT) { for (var i = 0; i < length; i++) { that[i] = 0 } } return that } function fromString (that, string, encoding) { if (typeof encoding !== 'string' || encoding === '') encoding = 'utf8' // Assumption: byteLength() return value is always < kMaxLength. var length = byteLength(string, encoding) | 0 that = allocate(that, length) that.write(string, encoding) return that } function fromObject (that, object) { if (Buffer.isBuffer(object)) return fromBuffer(that, object) if (isArray(object)) return fromArray(that, object) if (object == null) { throw new TypeError('must start with number, buffer, array or string') } if (typeof ArrayBuffer !== 'undefined') { if (object.buffer instanceof ArrayBuffer) { return fromTypedArray(that, object) } if (object instanceof ArrayBuffer) { return fromArrayBuffer(that, object) } } if (object.length) return fromArrayLike(that, object) return fromJsonObject(that, object) } function fromBuffer (that, buffer) { var length = checked(buffer.length) | 0 that = allocate(that, length) buffer.copy(that, 0, 0, length) return that } function fromArray (that, array) { var length = checked(array.length) | 0 that = allocate(that, length) for (var i = 0; i < length; i += 1) { that[i] = array[i] & 255 } return that } // Duplicate of fromArray() to keep fromArray() monomorphic. function fromTypedArray (that, array) { var length = checked(array.length) | 0 that = allocate(that, length) // Truncating the elements is probably not what people expect from typed // arrays with BYTES_PER_ELEMENT > 1 but it's compatible with the behavior // of the old Buffer constructor. for (var i = 0; i < length; i += 1) { that[i] = array[i] & 255 } return that } function fromArrayBuffer (that, array) { array.byteLength // this throws if `array` is not a valid ArrayBuffer if (Buffer.TYPED_ARRAY_SUPPORT) { // Return an augmented `Uint8Array` instance, for best performance that = new Uint8Array(array) that.__proto__ = Buffer.prototype } else { // Fallback: Return an object instance of the Buffer class that = fromTypedArray(that, new Uint8Array(array)) } return that } function fromArrayLike (that, array) { var length = checked(array.length) | 0 that = allocate(that, length) for (var i = 0; i < length; i += 1) { that[i] = array[i] & 255 } return that } // Deserialize { type: 'Buffer', data: [1,2,3,...] } into a Buffer object. // Returns a zero-length buffer for inputs that don't conform to the spec. function fromJsonObject (that, object) { var array var length = 0 if (object.type === 'Buffer' && isArray(object.data)) { array = object.data length = checked(array.length) | 0 } that = allocate(that, length) for (var i = 0; i < length; i += 1) { that[i] = array[i] & 255 } return that } if (Buffer.TYPED_ARRAY_SUPPORT) { Buffer.prototype.__proto__ = Uint8Array.prototype Buffer.__proto__ = Uint8Array } else { // pre-set for values that may exist in the future Buffer.prototype.length = undefined Buffer.prototype.parent = undefined } function allocate (that, length) { if (Buffer.TYPED_ARRAY_SUPPORT) { // Return an augmented `Uint8Array` instance, for best performance that = new Uint8Array(length) that.__proto__ = Buffer.prototype } else { // Fallback: Return an object instance of the Buffer class that.length = length } var fromPool = length !== 0 && length <= buffer.poolsize="">>> 1 if (fromPool) that.parent = rootParent return that } function checked (length) { // Note: cannot use `length < kMaxLength` here because that fails when // length is NaN (which is otherwise coerced to zero.) if (length >= kMaxLength()) { throw new RangeError('Attempt to allocate Buffer larger than maximum ' + 'size: 0x' + kMaxLength().toString(16) + ' bytes') } return length | 0 } function SlowBuffer (subject, encoding) { if (!(this instanceof SlowBuffer)) return new SlowBuffer(subject, encoding) var buf = new Buffer(subject, encoding) delete buf.parent return buf } Buffer.isBuffer = function isBuffer (b) { return !!(b != null && b._isBuffer) } Buffer.compare = function compare (a, b) { if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) { throw new TypeError('Arguments must be Buffers') } if (a === b) return 0 var x = a.length var y = b.length var i = 0 var len = Math.min(x, y) while (i < len) { if (a[i] !== b[i]) break ++i } if (i !== len) { x = a[i] y = b[i] } if (x < y) return -1 if (y < x) return 1 return 0 } Buffer.isEncoding = function isEncoding (encoding) { switch (String(encoding).toLowerCase()) { case 'hex': case 'utf8': case 'utf-8': case 'ascii': case 'binary': case 'base64': case 'raw': case 'ucs2': case 'ucs-2': case 'utf16le': case 'utf-16le': return true default: return false } } Buffer.concat = function concat (list, length) { if (!isArray(list)) throw new TypeError('list argument must be an Array of Buffers.') if (list.length === 0) { return new Buffer(0) } var i if (length === undefined) { length = 0 for (i = 0; i < list.length; i++) { length += list[i].length } } var buf = new Buffer(length) var pos = 0 for (i = 0; i < list.length; i++) { var item = list[i] item.copy(buf, pos) pos += item.length } return buf } function byteLength (string, encoding) { if (typeof string !== 'string') string = '' + string var len = string.length if (len === 0) return 0 // Use a for loop to avoid recursion var loweredCase = false for (;;) { switch (encoding) { case 'ascii': case 'binary': // Deprecated case 'raw': case 'raws': return len case 'utf8': case 'utf-8': return utf8ToBytes(string).length case 'ucs2': case 'ucs-2': case 'utf16le': case 'utf-16le': return len * 2 case 'hex': return len >>> 1 case 'base64': return base64ToBytes(string).length default: if (loweredCase) return utf8ToBytes(string).length // assume utf8 encoding = ('' + encoding).toLowerCase() loweredCase = true } } } Buffer.byteLength = byteLength function slowToString (encoding, start, end) { var loweredCase = false start = start | 0 end = end === undefined || end === Infinity ? this.length : end | 0 if (!encoding) encoding = 'utf8' if (start < 0) start = 0 if (end > this.length) end = this.length if (end <= 0="" start)="" return="" ''="" while="" (true)="" {="" switch="" (encoding)="" case="" 'hex':="" hexslice(this,="" start,="" end)="" 'utf8':="" 'utf-8':="" utf8slice(this,="" 'ascii':="" asciislice(this,="" 'binary':="" binaryslice(this,="" 'base64':="" base64slice(this,="" 'ucs2':="" 'ucs-2':="" 'utf16le':="" 'utf-16le':="" utf16leslice(this,="" default:="" if="" (loweredcase)="" throw="" new="" typeerror('unknown="" encoding:="" '="" +="" encoding)="" encoding="(encoding" '').tolowercase()="" loweredcase="true" }="" the="" property="" is="" used="" by="" `buffer.isbuffer`="" and="" `is-buffer`="" (in="" safari="" 5-7)="" to="" detect="" buffer="" instances.="" buffer.prototype._isbuffer="true" buffer.prototype.tostring="function" tostring="" ()="" var="" length="this.length" |="" (length="==" 0)="" (arguments.length="==" 0,="" length)="" slowtostring.apply(this,="" arguments)="" buffer.prototype.equals="function" equals="" (b)="" (!buffer.isbuffer(b))="" typeerror('argument="" must="" be="" a="" buffer')="" (this="==" b)="" true="" buffer.compare(this,="" buffer.prototype.inspect="function" inspect="" str="" max="exports.INSPECT_MAX_BYTES" (this.length=""> 0) { str = this.toString('hex', 0, max).match(/.{2}/g).join(' ') if (this.length > max) str += ' ... ' } return '' } Buffer.prototype.compare = function compare (b) { if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer') if (this === b) return 0 return Buffer.compare(this, b) } Buffer.prototype.indexOf = function indexOf (val, byteOffset) { if (byteOffset > 0x7fffffff) byteOffset = 0x7fffffff else if (byteOffset < -0x80000000) byteOffset = -0x80000000 byteOffset >>= 0 if (this.length === 0) return -1 if (byteOffset >= this.length) return -1 // Negative offsets start from the end of the buffer if (byteOffset < 0) byteOffset = Math.max(this.length + byteOffset, 0) if (typeof val === 'string') { if (val.length === 0) return -1 // special case: looking for empty string always fails return String.prototype.indexOf.call(this, val, byteOffset) } if (Buffer.isBuffer(val)) { return arrayIndexOf(this, val, byteOffset) } if (typeof val === 'number') { if (Buffer.TYPED_ARRAY_SUPPORT && Uint8Array.prototype.indexOf === 'function') { return Uint8Array.prototype.indexOf.call(this, val, byteOffset) } return arrayIndexOf(this, [ val ], byteOffset) } function arrayIndexOf (arr, val, byteOffset) { var foundIndex = -1 for (var i = 0; byteOffset + i < arr.length; i++) { if (arr[byteOffset + i] === val[foundIndex === -1 ? 0 : i - foundIndex]) { if (foundIndex === -1) foundIndex = i if (i - foundIndex + 1 === val.length) return byteOffset + foundIndex } else { foundIndex = -1 } } return -1 } throw new TypeError('val must be string, number or Buffer') } function hexWrite (buf, string, offset, length) { offset = Number(offset) || 0 var remaining = buf.length - offset if (!length) { length = remaining } else { length = Number(length) if (length > remaining) { length = remaining } } // must be an even number of digits var strLen = string.length if (strLen % 2 !== 0) throw new Error('Invalid hex string') if (length > strLen / 2) { length = strLen / 2 } for (var i = 0; i < length; i++) { var parsed = parseInt(string.substr(i * 2, 2), 16) if (isNaN(parsed)) throw new Error('Invalid hex string') buf[offset + i] = parsed } return i } function utf8Write (buf, string, offset, length) { return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length) } function asciiWrite (buf, string, offset, length) { return blitBuffer(asciiToBytes(string), buf, offset, length) } function binaryWrite (buf, string, offset, length) { return asciiWrite(buf, string, offset, length) } function base64Write (buf, string, offset, length) { return blitBuffer(base64ToBytes(string), buf, offset, length) } function ucs2Write (buf, string, offset, length) { return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length) } Buffer.prototype.write = function write (string, offset, length, encoding) { // Buffer#write(string) if (offset === undefined) { encoding = 'utf8' length = this.length offset = 0 // Buffer#write(string, encoding) } else if (length === undefined && typeof offset === 'string') { encoding = offset length = this.length offset = 0 // Buffer#write(string, offset[, length][, encoding]) } else if (isFinite(offset)) { offset = offset | 0 if (isFinite(length)) { length = length | 0 if (encoding === undefined) encoding = 'utf8' } else { encoding = length length = undefined } // legacy write(string, encoding, offset, length) - remove in v0.13 } else { var swap = encoding encoding = offset offset = length | 0 length = swap } var remaining = this.length - offset if (length === undefined || length > remaining) length = remaining if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) { throw new RangeError('attempt to write outside buffer bounds') } if (!encoding) encoding = 'utf8' var loweredCase = false for (;;) { switch (encoding) { case 'hex': return hexWrite(this, string, offset, length) case 'utf8': case 'utf-8': return utf8Write(this, string, offset, length) case 'ascii': return asciiWrite(this, string, offset, length) case 'binary': return binaryWrite(this, string, offset, length) case 'base64': // Warning: maxLength not taken into account in base64Write return base64Write(this, string, offset, length) case 'ucs2': case 'ucs-2': case 'utf16le': case 'utf-16le': return ucs2Write(this, string, offset, length) default: if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding) encoding = ('' + encoding).toLowerCase() loweredCase = true } } } Buffer.prototype.toJSON = function toJSON () { return { type: 'Buffer', data: Array.prototype.slice.call(this._arr || this, 0) } } function base64Slice (buf, start, end) { if (start === 0 && end === buf.length) { return base64.fromByteArray(buf) } else { return base64.fromByteArray(buf.slice(start, end)) } } function utf8Slice (buf, start, end) { end = Math.min(buf.length, end) var res = [] var i = start while (i < end) { var firstByte = buf[i] var codePoint = null var bytesPerSequence = (firstByte > 0xEF) ? 4 : (firstByte > 0xDF) ? 3 : (firstByte > 0xBF) ? 2 : 1 if (i + bytesPerSequence <= end)="" {="" var="" secondbyte,="" thirdbyte,="" fourthbyte,="" tempcodepoint="" switch="" (bytespersequence)="" case="" 1:="" if="" (firstbyte="" <="" 0x80)="" codepoint="firstByte" }="" break="" 2:="" secondbyte="buf[i" +="" 1]="" ((secondbyte="" &="" 0xc0)="==" 0x1f)="" <<="" 0x6="" |="" (secondbyte="" 0x3f)="" (tempcodepoint=""> 0x7F) { codePoint = tempCodePoint } } break case 3: secondByte = buf[i + 1] thirdByte = buf[i + 2] if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) { tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F) if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) { codePoint = tempCodePoint } } break case 4: secondByte = buf[i + 1] thirdByte = buf[i + 2] fourthByte = buf[i + 3] if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) { tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F) if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) { codePoint = tempCodePoint } } } } if (codePoint === null) { // we did not generate a valid codePoint so insert a // replacement char (U+FFFD) and advance only 1 byte codePoint = 0xFFFD bytesPerSequence = 1 } else if (codePoint > 0xFFFF) { // encode to utf16 (surrogate pair dance) codePoint -= 0x10000 res.push(codePoint >>> 10 & 0x3FF | 0xD800) codePoint = 0xDC00 | codePoint & 0x3FF } res.push(codePoint) i += bytesPerSequence } return decodeCodePointsArray(res) } // Based on http://stackoverflow.com/a/22747272/680742, the browser with // the lowest limit is Chrome, with 0x10000 args. // We go 1 magnitude less, for safety var MAX_ARGUMENTS_LENGTH = 0x1000 function decodeCodePointsArray (codePoints) { var len = codePoints.length if (len <= 0="" max_arguments_length)="" {="" return="" string.fromcharcode.apply(string,="" codepoints)="" avoid="" extra="" slice()="" }="" decode="" in="" chunks="" to="" "call="" stack="" size="" exceeded".="" var="" res="" i="0" while="" (i="" <="" len)="" +="String.fromCharCode.apply(" string,="" codepoints.slice(i,="" )="" function="" asciislice="" (buf,="" start,="" end)="" ret="" end="Math.min(buf.length," for="" (var="" end;="" i++)="" &="" 0x7f)="" binaryslice="" hexslice="" len="buf.length" if="" (!start="" ||="" start="" 0)="" (!end=""> len) end = len var out = '' for (var i = start; i < end; i++) { out += toHex(buf[i]) } return out } function utf16leSlice (buf, start, end) { var bytes = buf.slice(start, end) var res = '' for (var i = 0; i < bytes.length; i += 2) { res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256) } return res } Buffer.prototype.slice = function slice (start, end) { var len = this.length start = ~~start end = end === undefined ? len : ~~end if (start < 0) { start += len if (start < 0) start = 0 } else if (start > len) { start = len } if (end < 0) { end += len if (end < 0) end = 0 } else if (end > len) { end = len } if (end < start) end = start var newBuf if (Buffer.TYPED_ARRAY_SUPPORT) { newBuf = this.subarray(start, end) newBuf.__proto__ = Buffer.prototype } else { var sliceLen = end - start newBuf = new Buffer(sliceLen, undefined) for (var i = 0; i < sliceLen; i++) { newBuf[i] = this[i + start] } } if (newBuf.length) newBuf.parent = this.parent || this return newBuf } /* * Need to make sure that buffer isn't trying to write out of bounds. */ function checkOffset (offset, ext, length) { if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint') if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length') } Buffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) { offset = offset | 0 byteLength = byteLength | 0 if (!noAssert) checkOffset(offset, byteLength, this.length) var val = this[offset] var mul = 1 var i = 0 while (++i < byteLength && (mul *= 0x100)) { val += this[offset + i] * mul } return val } Buffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) { offset = offset | 0 byteLength = byteLength | 0 if (!noAssert) { checkOffset(offset, byteLength, this.length) } var val = this[offset + --byteLength] var mul = 1 while (byteLength > 0 && (mul *= 0x100)) { val += this[offset + --byteLength] * mul } return val } Buffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) { if (!noAssert) checkOffset(offset, 1, this.length) return this[offset] } Buffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) { if (!noAssert) checkOffset(offset, 2, this.length) return this[offset] | (this[offset + 1] << 8) } Buffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) { if (!noAssert) checkOffset(offset, 2, this.length) return (this[offset] << 8) | this[offset + 1] } Buffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) { if (!noAssert) checkOffset(offset, 4, this.length) return ((this[offset]) | (this[offset + 1] << 8) | (this[offset + 2] << 16)) + (this[offset + 3] * 0x1000000) } Buffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) { if (!noAssert) checkOffset(offset, 4, this.length) return (this[offset] * 0x1000000) + ((this[offset + 1] << 16) | (this[offset + 2] << 8) | this[offset + 3]) } Buffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) { offset = offset | 0 byteLength = byteLength | 0 if (!noAssert) checkOffset(offset, byteLength, this.length) var val = this[offset] var mul = 1 var i = 0 while (++i < byteLength && (mul *= 0x100)) { val += this[offset + i] * mul } mul *= 0x80 if (val >= mul) val -= Math.pow(2, 8 * byteLength) return val } Buffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) { offset = offset | 0 byteLength = byteLength | 0 if (!noAssert) checkOffset(offset, byteLength, this.length) var i = byteLength var mul = 1 var val = this[offset + --i] while (i > 0 && (mul *= 0x100)) { val += this[offset + --i] * mul } mul *= 0x80 if (val >= mul) val -= Math.pow(2, 8 * byteLength) return val } Buffer.prototype.readInt8 = function readInt8 (offset, noAssert) { if (!noAssert) checkOffset(offset, 1, this.length) if (!(this[offset] & 0x80)) return (this[offset]) return ((0xff - this[offset] + 1) * -1) } Buffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) { if (!noAssert) checkOffset(offset, 2, this.length) var val = this[offset] | (this[offset + 1] << 8) return (val & 0x8000) ? val | 0xFFFF0000 : val } Buffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) { if (!noAssert) checkOffset(offset, 2, this.length) var val = this[offset + 1] | (this[offset] << 8) return (val & 0x8000) ? val | 0xFFFF0000 : val } Buffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) { if (!noAssert) checkOffset(offset, 4, this.length) return (this[offset]) | (this[offset + 1] << 8) | (this[offset + 2] << 16) | (this[offset + 3] << 24) } Buffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) { if (!noAssert) checkOffset(offset, 4, this.length) return (this[offset] << 24) | (this[offset + 1] << 16) | (this[offset + 2] << 8) | (this[offset + 3]) } Buffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) { if (!noAssert) checkOffset(offset, 4, this.length) return ieee754.read(this, offset, true, 23, 4) } Buffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) { if (!noAssert) checkOffset(offset, 4, this.length) return ieee754.read(this, offset, false, 23, 4) } Buffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) { if (!noAssert) checkOffset(offset, 8, this.length) return ieee754.read(this, offset, true, 52, 8) } Buffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) { if (!noAssert) checkOffset(offset, 8, this.length) return ieee754.read(this, offset, false, 52, 8) } function checkInt (buf, value, offset, ext, max, min) { if (!Buffer.isBuffer(buf)) throw new TypeError('buffer must be a Buffer instance') if (value > max || value < min) throw new RangeError('value is out of bounds') if (offset + ext > buf.length) throw new RangeError('index out of range') } Buffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) { value = +value offset = offset | 0 byteLength = byteLength | 0 if (!noAssert) checkInt(this, value, offset, byteLength, Math.pow(2, 8 * byteLength), 0) var mul = 1 var i = 0 this[offset] = value & 0xFF while (++i < byteLength && (mul *= 0x100)) { this[offset + i] = (value / mul) & 0xFF } return offset + byteLength } Buffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) { value = +value offset = offset | 0 byteLength = byteLength | 0 if (!noAssert) checkInt(this, value, offset, byteLength, Math.pow(2, 8 * byteLength), 0) var i = byteLength - 1 var mul = 1 this[offset + i] = value & 0xFF while (--i >= 0 && (mul *= 0x100)) { this[offset + i] = (value / mul) & 0xFF } return offset + byteLength } Buffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) { value = +value offset = offset | 0 if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0) if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value) this[offset] = (value & 0xff) return offset + 1 } function objectWriteUInt16 (buf, value, offset, littleEndian) { if (value < 0) value = 0xffff + value + 1 for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; i++) { buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>> (littleEndian ? i : 1 - i) * 8 } } Buffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) { value = +value offset = offset | 0 if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0) if (Buffer.TYPED_ARRAY_SUPPORT) { this[offset] = (value & 0xff) this[offset + 1] = (value >>> 8) } else { objectWriteUInt16(this, value, offset, true) } return offset + 2 } Buffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) { value = +value offset = offset | 0 if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0) if (Buffer.TYPED_ARRAY_SUPPORT) { this[offset] = (value >>> 8) this[offset + 1] = (value & 0xff) } else { objectWriteUInt16(this, value, offset, false) } return offset + 2 } function objectWriteUInt32 (buf, value, offset, littleEndian) { if (value < 0) value = 0xffffffff + value + 1 for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; i++) { buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff } } Buffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) { value = +value offset = offset | 0 if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0) if (Buffer.TYPED_ARRAY_SUPPORT) { this[offset + 3] = (value >>> 24) this[offset + 2] = (value >>> 16) this[offset + 1] = (value >>> 8) this[offset] = (value & 0xff) } else { objectWriteUInt32(this, value, offset, true) } return offset + 4 } Buffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) { value = +value offset = offset | 0 if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0) if (Buffer.TYPED_ARRAY_SUPPORT) { this[offset] = (value >>> 24) this[offset + 1] = (value >>> 16) this[offset + 2] = (value >>> 8) this[offset + 3] = (value & 0xff) } else { objectWriteUInt32(this, value, offset, false) } return offset + 4 } Buffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) { value = +value offset = offset | 0 if (!noAssert) { var limit = Math.pow(2, 8 * byteLength - 1) checkInt(this, value, offset, byteLength, limit - 1, -limit) } var i = 0 var mul = 1 var sub = value < 0 ? 1 : 0 this[offset] = value & 0xFF while (++i < byteLength && (mul *= 0x100)) { this[offset + i] = ((value / mul) >> 0) - sub & 0xFF } return offset + byteLength } Buffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) { value = +value offset = offset | 0 if (!noAssert) { var limit = Math.pow(2, 8 * byteLength - 1) checkInt(this, value, offset, byteLength, limit - 1, -limit) } var i = byteLength - 1 var mul = 1 var sub = value < 0 ? 1 : 0 this[offset + i] = value & 0xFF while (--i >= 0 && (mul *= 0x100)) { this[offset + i] = ((value / mul) >> 0) - sub & 0xFF } return offset + byteLength } Buffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) { value = +value offset = offset | 0 if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80) if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value) if (value < 0) value = 0xff + value + 1 this[offset] = (value & 0xff) return offset + 1 } Buffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) { value = +value offset = offset | 0 if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000) if (Buffer.TYPED_ARRAY_SUPPORT) { this[offset] = (value & 0xff) this[offset + 1] = (value >>> 8) } else { objectWriteUInt16(this, value, offset, true) } return offset + 2 } Buffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) { value = +value offset = offset | 0 if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000) if (Buffer.TYPED_ARRAY_SUPPORT) { this[offset] = (value >>> 8) this[offset + 1] = (value & 0xff) } else { objectWriteUInt16(this, value, offset, false) } return offset + 2 } Buffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) { value = +value offset = offset | 0 if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000) if (Buffer.TYPED_ARRAY_SUPPORT) { this[offset] = (value & 0xff) this[offset + 1] = (value >>> 8) this[offset + 2] = (value >>> 16) this[offset + 3] = (value >>> 24) } else { objectWriteUInt32(this, value, offset, true) } return offset + 4 } Buffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) { value = +value offset = offset | 0 if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000) if (value < 0) value = 0xffffffff + value + 1 if (Buffer.TYPED_ARRAY_SUPPORT) { this[offset] = (value >>> 24) this[offset + 1] = (value >>> 16) this[offset + 2] = (value >>> 8) this[offset + 3] = (value & 0xff) } else { objectWriteUInt32(this, value, offset, false) } return offset + 4 } function checkIEEE754 (buf, value, offset, ext, max, min) { if (offset + ext > buf.length) throw new RangeError('index out of range') if (offset < 0) throw new RangeError('index out of range') } function writeFloat (buf, value, offset, littleEndian, noAssert) { if (!noAssert) { checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38) } ieee754.write(buf, value, offset, littleEndian, 23, 4) return offset + 4 } Buffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) { return writeFloat(this, value, offset, true, noAssert) } Buffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) { return writeFloat(this, value, offset, false, noAssert) } function writeDouble (buf, value, offset, littleEndian, noAssert) { if (!noAssert) { checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308) } ieee754.write(buf, value, offset, littleEndian, 52, 8) return offset + 8 } Buffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) { return writeDouble(this, value, offset, true, noAssert) } Buffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) { return writeDouble(this, value, offset, false, noAssert) } // copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length) Buffer.prototype.copy = function copy (target, targetStart, start, end) { if (!start) start = 0 if (!end && end !== 0) end = this.length if (targetStart >= target.length) targetStart = target.length if (!targetStart) targetStart = 0 if (end > 0 && end < start) end = start // Copy 0 bytes; we're done if (end === start) return 0 if (target.length === 0 || this.length === 0) return 0 // Fatal error conditions if (targetStart < 0) { throw new RangeError('targetStart out of bounds') } if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds') if (end < 0) throw new RangeError('sourceEnd out of bounds') // Are we oob? if (end > this.length) end = this.length if (target.length - targetStart < end - start) { end = target.length - targetStart + start } var len = end - start var i if (this === target && start < targetStart && targetStart < end) { // descending copy from end for (i = len - 1; i >= 0; i--) { target[i + targetStart] = this[i + start] } } else if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) { // ascending copy from start for (i = 0; i < len; i++) { target[i + targetStart] = this[i + start] } } else { Uint8Array.prototype.set.call( target, this.subarray(start, start + len), targetStart ) } return len } // fill(value, start=0, end=buffer.length) Buffer.prototype.fill = function fill (value, start, end) { if (!value) value = 0 if (!start) start = 0 if (!end) end = this.length if (end < start) throw new RangeError('end < start') // Fill 0 bytes; we're done if (end === start) return if (this.length === 0) return if (start < 0 || start >= this.length) throw new RangeError('start out of bounds') if (end < 0 || end > this.length) throw new RangeError('end out of bounds') var i if (typeof value === 'number') { for (i = start; i < end; i++) { this[i] = value } } else { var bytes = utf8ToBytes(value.toString()) var len = bytes.length for (i = start; i < end; i++) { this[i] = bytes[i % len] } } return this } // HELPER FUNCTIONS // ================ var INVALID_BASE64_RE = /[^+\/0-9A-Za-z-_]/g function base64clean (str) { // Node strips out invalid characters like \n and \t from the string, base64-js does not str = stringtrim(str).replace(INVALID_BASE64_RE, '') // Node converts strings with length < 2 to '' if (str.length < 2) return '' // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not while (str.length % 4 !== 0) { str = str + '=' } return str } function stringtrim (str) { if (str.trim) return str.trim() return str.replace(/^\s+|\s+$/g, '') } function toHex (n) { if (n < 16) return '0' + n.toString(16) return n.toString(16) } function utf8ToBytes (string, units) { units = units || Infinity var codePoint var length = string.length var leadSurrogate = null var bytes = [] for (var i = 0; i < length; i++) { codePoint = string.charCodeAt(i) // is surrogate component if (codePoint > 0xD7FF && codePoint < 0xE000) { // last char was a lead if (!leadSurrogate) { // no lead yet if (codePoint > 0xDBFF) { // unexpected trail if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) continue } else if (i + 1 === length) { // unpaired lead if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) continue } // valid lead leadSurrogate = codePoint continue } // 2 leads in a row if (codePoint < 0xDC00) { if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) leadSurrogate = codePoint continue } // valid surrogate pair codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000 } else if (leadSurrogate) { // valid bmp char, but last char was a lead if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) } leadSurrogate = null // encode utf8 if (codePoint < 0x80) { if ((units -= 1) < 0) break bytes.push(codePoint) } else if (codePoint < 0x800) { if ((units -= 2) < 0) break bytes.push( codePoint >> 0x6 | 0xC0, codePoint & 0x3F | 0x80 ) } else if (codePoint < 0x10000) { if ((units -= 3) < 0) break bytes.push( codePoint >> 0xC | 0xE0, codePoint >> 0x6 & 0x3F | 0x80, codePoint & 0x3F | 0x80 ) } else if (codePoint < 0x110000) { if ((units -= 4) < 0) break bytes.push( codePoint >> 0x12 | 0xF0, codePoint >> 0xC & 0x3F | 0x80, codePoint >> 0x6 & 0x3F | 0x80, codePoint & 0x3F | 0x80 ) } else { throw new Error('Invalid code point') } } return bytes } function asciiToBytes (str) { var byteArray = [] for (var i = 0; i < str.length; i++) { // Node's code seems to be doing this and not & 0x7F.. byteArray.push(str.charCodeAt(i) & 0xFF) } return byteArray } function utf16leToBytes (str, units) { var c, hi, lo var byteArray = [] for (var i = 0; i < str.length; i++) { if ((units -= 2) < 0) break c = str.charCodeAt(i) hi = c >> 8 lo = c % 256 byteArray.push(lo) byteArray.push(hi) } return byteArray } function base64ToBytes (str) { return base64.toByteArray(base64clean(str)) } function blitBuffer (src, dst, offset, length) { for (var i = 0; i < length; i++) { if ((i + offset >= dst.length) || (i >= src.length)) break dst[i + offset] = src[i] } return i } }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) },{"base64-js":16,"ieee754":90,"isarray":46}],46:[function(require,module,exports){ var toString = {}.toString; module.exports = Array.isArray || function (arr) { return toString.call(arr) == '[object Array]'; }; },{}],47:[function(require,module,exports){ (function (Buffer){ var Transform = require('stream').Transform var inherits = require('inherits') var StringDecoder = require('string_decoder').StringDecoder module.exports = CipherBase inherits(CipherBase, Transform) function CipherBase (hashMode) { Transform.call(this) this.hashMode = typeof hashMode === 'string' if (this.hashMode) { this[hashMode] = this._finalOrDigest } else { this.final = this._finalOrDigest } this._decoder = null this._encoding = null } CipherBase.prototype.update = function (data, inputEnc, outputEnc) { if (typeof data === 'string') { data = new Buffer(data, inputEnc) } var outData = this._update(data) if (this.hashMode) { return this } if (outputEnc) { outData = this._toString(outData, outputEnc) } return outData } CipherBase.prototype.setAutoPadding = function () {} CipherBase.prototype.getAuthTag = function () { throw new Error('trying to get auth tag in unsupported state') } CipherBase.prototype.setAuthTag = function () { throw new Error('trying to set auth tag in unsupported state') } CipherBase.prototype.setAAD = function () { throw new Error('trying to set aad in unsupported state') } CipherBase.prototype._transform = function (data, _, next) { var err try { if (this.hashMode) { this._update(data) } else { this.push(this._update(data)) } } catch (e) { err = e } finally { next(err) } } CipherBase.prototype._flush = function (done) { var err try { this.push(this._final()) } catch (e) { err = e } finally { done(err) } } CipherBase.prototype._finalOrDigest = function (outputEnc) { var outData = this._final() || new Buffer('') if (outputEnc) { outData = this._toString(outData, outputEnc, true) } return outData } CipherBase.prototype._toString = function (value, enc, final) { if (!this._decoder) { this._decoder = new StringDecoder(enc) this._encoding = enc } if (this._encoding !== enc) { throw new Error('can\'t switch encodings') } var out = this._decoder.write(value) if (final) { out += this._decoder.end() } return out } }).call(this,require("buffer").Buffer) },{"buffer":45,"inherits":92,"stream":131,"string_decoder":132}],48:[function(require,module,exports){ (function (Buffer){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a // copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to permit // persons to whom the Software is furnished to do so, subject to the // following conditions: // // The above copyright notice and this permission notice shall be included // in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE // USE OR OTHER DEALINGS IN THE SOFTWARE. // NOTE: These type checking functions intentionally don't use `instanceof` // because it is fragile and can be easily faked with `Object.create()`. function isArray(arg) { if (Array.isArray) { return Array.isArray(arg); } return objectToString(arg) === '[object Array]'; } exports.isArray = isArray; function isBoolean(arg) { return typeof arg === 'boolean'; } exports.isBoolean = isBoolean; function isNull(arg) { return arg === null; } exports.isNull = isNull; function isNullOrUndefined(arg) { return arg == null; } exports.isNullOrUndefined = isNullOrUndefined; function isNumber(arg) { return typeof arg === 'number'; } exports.isNumber = isNumber; function isString(arg) { return typeof arg === 'string'; } exports.isString = isString; function isSymbol(arg) { return typeof arg === 'symbol'; } exports.isSymbol = isSymbol; function isUndefined(arg) { return arg === void 0; } exports.isUndefined = isUndefined; function isRegExp(re) { return objectToString(re) === '[object RegExp]'; } exports.isRegExp = isRegExp; function isObject(arg) { return typeof arg === 'object' && arg !== null; } exports.isObject = isObject; function isDate(d) { return objectToString(d) === '[object Date]'; } exports.isDate = isDate; function isError(e) { return (objectToString(e) === '[object Error]' || e instanceof Error); } exports.isError = isError; function isFunction(arg) { return typeof arg === 'function'; } exports.isFunction = isFunction; function isPrimitive(arg) { return arg === null || typeof arg === 'boolean' || typeof arg === 'number' || typeof arg === 'string' || typeof arg === 'symbol' || // ES6 symbol typeof arg === 'undefined'; } exports.isPrimitive = isPrimitive; exports.isBuffer = Buffer.isBuffer; function objectToString(o) { return Object.prototype.toString.call(o); } }).call(this,{"isBuffer":require("../../is-buffer/index.js")}) },{"../../is-buffer/index.js":93}],49:[function(require,module,exports){ (function (Buffer){ var elliptic = require('elliptic'); var BN = require('bn.js'); module.exports = function createECDH(curve) { return new ECDH(curve); }; var aliases = { secp256k1: { name: 'secp256k1', byteLength: 32 }, secp224r1: { name: 'p224', byteLength: 28 }, prime256v1: { name: 'p256', byteLength: 32 }, prime192v1: { name: 'p192', byteLength: 24 }, ed25519: { name: 'ed25519', byteLength: 32 }, secp384r1: { name: 'p384', byteLength: 48 }, secp521r1: { name: 'p521', byteLength: 66 } }; aliases.p224 = aliases.secp224r1; aliases.p256 = aliases.secp256r1 = aliases.prime256v1; aliases.p192 = aliases.secp192r1 = aliases.prime192v1; aliases.p384 = aliases.secp384r1; aliases.p521 = aliases.secp521r1; function ECDH(curve) { this.curveType = aliases[curve]; if (!this.curveType ) { this.curveType = { name: curve }; } this.curve = new elliptic.ec(this.curveType.name); this.keys = void 0; } ECDH.prototype.generateKeys = function (enc, format) { this.keys = this.curve.genKeyPair(); return this.getPublicKey(enc, format); }; ECDH.prototype.computeSecret = function (other, inenc, enc) { inenc = inenc || 'utf8'; if (!Buffer.isBuffer(other)) { other = new Buffer(other, inenc); } var otherPub = this.curve.keyFromPublic(other).getPublic(); var out = otherPub.mul(this.keys.getPrivate()).getX(); return formatReturnValue(out, enc, this.curveType.byteLength); }; ECDH.prototype.getPublicKey = function (enc, format) { var key = this.keys.getPublic(format === 'compressed', true); if (format === 'hybrid') { if (key[key.length - 1] % 2) { key[0] = 7; } else { key [0] = 6; } } return formatReturnValue(key, enc); }; ECDH.prototype.getPrivateKey = function (enc) { return formatReturnValue(this.keys.getPrivate(), enc); }; ECDH.prototype.setPublicKey = function (pub, enc) { enc = enc || 'utf8'; if (!Buffer.isBuffer(pub)) { pub = new Buffer(pub, enc); } this.keys._importPublic(pub); return this; }; ECDH.prototype.setPrivateKey = function (priv, enc) { enc = enc || 'utf8'; if (!Buffer.isBuffer(priv)) { priv = new Buffer(priv, enc); } var _priv = new BN(priv); _priv = _priv.toString(16); this.keys._importPrivate(_priv); return this; }; function formatReturnValue(bn, enc, len) { if (!Array.isArray(bn)) { bn = bn.toArray(); } var buf = new Buffer(bn); if (len && buf.length < len) { var zeros = new Buffer(len - buf.length); zeros.fill(0); buf = Buffer.concat([zeros, buf]); } if (!enc) { return buf; } else { return buf.toString(enc); } } }).call(this,require("buffer").Buffer) },{"bn.js":17,"buffer":45,"elliptic":65}],50:[function(require,module,exports){ (function (Buffer){ 'use strict'; var inherits = require('inherits') var md5 = require('./md5') var rmd160 = require('ripemd160') var sha = require('sha.js') var Base = require('cipher-base') function HashNoConstructor(hash) { Base.call(this, 'digest') this._hash = hash this.buffers = [] } inherits(HashNoConstructor, Base) HashNoConstructor.prototype._update = function (data) { this.buffers.push(data) } HashNoConstructor.prototype._final = function () { var buf = Buffer.concat(this.buffers) var r = this._hash(buf) this.buffers = null return r } function Hash(hash) { Base.call(this, 'digest') this._hash = hash } inherits(Hash, Base) Hash.prototype._update = function (data) { this._hash.update(data) } Hash.prototype._final = function () { return this._hash.digest() } module.exports = function createHash (alg) { alg = alg.toLowerCase() if ('md5' === alg) return new HashNoConstructor(md5) if ('rmd160' === alg || 'ripemd160' === alg) return new HashNoConstructor(rmd160) return new Hash(sha(alg)) } }).call(this,require("buffer").Buffer) },{"./md5":52,"buffer":45,"cipher-base":47,"inherits":92,"ripemd160":122,"sha.js":124}],51:[function(require,module,exports){ (function (Buffer){ 'use strict'; var intSize = 4; var zeroBuffer = new Buffer(intSize); zeroBuffer.fill(0); var chrsz = 8; function toArray(buf, bigEndian) { if ((buf.length % intSize) !== 0) { var len = buf.length + (intSize - (buf.length % intSize)); buf = Buffer.concat([buf, zeroBuffer], len); } var arr = []; var fn = bigEndian ? buf.readInt32BE : buf.readInt32LE; for (var i = 0; i < buf.length; i += intSize) { arr.push(fn.call(buf, i)); } return arr; } function toBuffer(arr, size, bigEndian) { var buf = new Buffer(size); var fn = bigEndian ? buf.writeInt32BE : buf.writeInt32LE; for (var i = 0; i < arr.length; i++) { fn.call(buf, arr[i], i * 4, true); } return buf; } function hash(buf, fn, hashSize, bigEndian) { if (!Buffer.isBuffer(buf)) buf = new Buffer(buf); var arr = fn(toArray(buf, bigEndian), buf.length * chrsz); return toBuffer(arr, hashSize, bigEndian); } exports.hash = hash; }).call(this,require("buffer").Buffer) },{"buffer":45}],52:[function(require,module,exports){ 'use strict'; /* * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message * Digest Algorithm, as defined in RFC 1321. * Version 2.1 Copyright (C) Paul Johnston 1999 - 2002. * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet * Distributed under the BSD License * See http://pajhome.org.uk/crypt/md5 for more info. */ var helpers = require('./helpers'); /* * Calculate the MD5 of an array of little-endian words, and a bit length */ function core_md5(x, len) { /* append padding */ x[len >> 5] |= 0x80 << ((len) % 32); x[(((len + 64) >>> 9) << 4) + 14] = len; var a = 1732584193; var b = -271733879; var c = -1732584194; var d = 271733878; for(var i = 0; i < x.length; i += 16) { var olda = a; var oldb = b; var oldc = c; var oldd = d; a = md5_ff(a, b, c, d, x[i+ 0], 7 , -680876936); d = md5_ff(d, a, b, c, x[i+ 1], 12, -389564586); c = md5_ff(c, d, a, b, x[i+ 2], 17, 606105819); b = md5_ff(b, c, d, a, x[i+ 3], 22, -1044525330); a = md5_ff(a, b, c, d, x[i+ 4], 7 , -176418897); d = md5_ff(d, a, b, c, x[i+ 5], 12, 1200080426); c = md5_ff(c, d, a, b, x[i+ 6], 17, -1473231341); b = md5_ff(b, c, d, a, x[i+ 7], 22, -45705983); a = md5_ff(a, b, c, d, x[i+ 8], 7 , 1770035416); d = md5_ff(d, a, b, c, x[i+ 9], 12, -1958414417); c = md5_ff(c, d, a, b, x[i+10], 17, -42063); b = md5_ff(b, c, d, a, x[i+11], 22, -1990404162); a = md5_ff(a, b, c, d, x[i+12], 7 , 1804603682); d = md5_ff(d, a, b, c, x[i+13], 12, -40341101); c = md5_ff(c, d, a, b, x[i+14], 17, -1502002290); b = md5_ff(b, c, d, a, x[i+15], 22, 1236535329); a = md5_gg(a, b, c, d, x[i+ 1], 5 , -165796510); d = md5_gg(d, a, b, c, x[i+ 6], 9 , -1069501632); c = md5_gg(c, d, a, b, x[i+11], 14, 643717713); b = md5_gg(b, c, d, a, x[i+ 0], 20, -373897302); a = md5_gg(a, b, c, d, x[i+ 5], 5 , -701558691); d = md5_gg(d, a, b, c, x[i+10], 9 , 38016083); c = md5_gg(c, d, a, b, x[i+15], 14, -660478335); b = md5_gg(b, c, d, a, x[i+ 4], 20, -405537848); a = md5_gg(a, b, c, d, x[i+ 9], 5 , 568446438); d = md5_gg(d, a, b, c, x[i+14], 9 , -1019803690); c = md5_gg(c, d, a, b, x[i+ 3], 14, -187363961); b = md5_gg(b, c, d, a, x[i+ 8], 20, 1163531501); a = md5_gg(a, b, c, d, x[i+13], 5 , -1444681467); d = md5_gg(d, a, b, c, x[i+ 2], 9 , -51403784); c = md5_gg(c, d, a, b, x[i+ 7], 14, 1735328473); b = md5_gg(b, c, d, a, x[i+12], 20, -1926607734); a = md5_hh(a, b, c, d, x[i+ 5], 4 , -378558); d = md5_hh(d, a, b, c, x[i+ 8], 11, -2022574463); c = md5_hh(c, d, a, b, x[i+11], 16, 1839030562); b = md5_hh(b, c, d, a, x[i+14], 23, -35309556); a = md5_hh(a, b, c, d, x[i+ 1], 4 , -1530992060); d = md5_hh(d, a, b, c, x[i+ 4], 11, 1272893353); c = md5_hh(c, d, a, b, x[i+ 7], 16, -155497632); b = md5_hh(b, c, d, a, x[i+10], 23, -1094730640); a = md5_hh(a, b, c, d, x[i+13], 4 , 681279174); d = md5_hh(d, a, b, c, x[i+ 0], 11, -358537222); c = md5_hh(c, d, a, b, x[i+ 3], 16, -722521979); b = md5_hh(b, c, d, a, x[i+ 6], 23, 76029189); a = md5_hh(a, b, c, d, x[i+ 9], 4 , -640364487); d = md5_hh(d, a, b, c, x[i+12], 11, -421815835); c = md5_hh(c, d, a, b, x[i+15], 16, 530742520); b = md5_hh(b, c, d, a, x[i+ 2], 23, -995338651); a = md5_ii(a, b, c, d, x[i+ 0], 6 , -198630844); d = md5_ii(d, a, b, c, x[i+ 7], 10, 1126891415); c = md5_ii(c, d, a, b, x[i+14], 15, -1416354905); b = md5_ii(b, c, d, a, x[i+ 5], 21, -57434055); a = md5_ii(a, b, c, d, x[i+12], 6 , 1700485571); d = md5_ii(d, a, b, c, x[i+ 3], 10, -1894986606); c = md5_ii(c, d, a, b, x[i+10], 15, -1051523); b = md5_ii(b, c, d, a, x[i+ 1], 21, -2054922799); a = md5_ii(a, b, c, d, x[i+ 8], 6 , 1873313359); d = md5_ii(d, a, b, c, x[i+15], 10, -30611744); c = md5_ii(c, d, a, b, x[i+ 6], 15, -1560198380); b = md5_ii(b, c, d, a, x[i+13], 21, 1309151649); a = md5_ii(a, b, c, d, x[i+ 4], 6 , -145523070); d = md5_ii(d, a, b, c, x[i+11], 10, -1120210379); c = md5_ii(c, d, a, b, x[i+ 2], 15, 718787259); b = md5_ii(b, c, d, a, x[i+ 9], 21, -343485551); a = safe_add(a, olda); b = safe_add(b, oldb); c = safe_add(c, oldc); d = safe_add(d, oldd); } return Array(a, b, c, d); } /* * These functions implement the four basic operations the algorithm uses. */ function md5_cmn(q, a, b, x, s, t) { return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s),b); } function md5_ff(a, b, c, d, x, s, t) { return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t); } function md5_gg(a, b, c, d, x, s, t) { return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t); } function md5_hh(a, b, c, d, x, s, t) { return md5_cmn(b ^ c ^ d, a, b, x, s, t); } function md5_ii(a, b, c, d, x, s, t) { return md5_cmn(c ^ (b | (~d)), a, b, x, s, t); } /* * Add integers, wrapping at 2^32. This uses 16-bit operations internally * to work around bugs in some JS interpreters. */ function safe_add(x, y) { var lsw = (x & 0xFFFF) + (y & 0xFFFF); var msw = (x >> 16) + (y >> 16) + (lsw >> 16); return (msw << 16) | (lsw & 0xFFFF); } /* * Bitwise rotate a 32-bit number to the left. */ function bit_rol(num, cnt) { return (num << cnt) | (num >>> (32 - cnt)); } module.exports = function md5(buf) { return helpers.hash(buf, core_md5, 16); }; },{"./helpers":51}],53:[function(require,module,exports){ (function (Buffer){ 'use strict'; var createHash = require('create-hash/browser'); var inherits = require('inherits') var Transform = require('stream').Transform var ZEROS = new Buffer(128) ZEROS.fill(0) function Hmac(alg, key) { Transform.call(this) alg = alg.toLowerCase() if (typeof key === 'string') { key = new Buffer(key) } var blocksize = (alg === 'sha512' || alg === 'sha384') ? 128 : 64 this._alg = alg this._key = key if (key.length > blocksize) { key = createHash(alg).update(key).digest() } else if (key.length < blocksize) { key = Buffer.concat([key, ZEROS], blocksize) } var ipad = this._ipad = new Buffer(blocksize) var opad = this._opad = new Buffer(blocksize) for (var i = 0; i < blocksize; i++) { ipad[i] = key[i] ^ 0x36 opad[i] = key[i] ^ 0x5C } this._hash = createHash(alg).update(ipad) } inherits(Hmac, Transform) Hmac.prototype.update = function (data, enc) { this._hash.update(data, enc) return this } Hmac.prototype._transform = function (data, _, next) { this._hash.update(data) next() } Hmac.prototype._flush = function (next) { this.push(this.digest()) next() } Hmac.prototype.digest = function (enc) { var h = this._hash.digest() return createHash(this._alg).update(this._opad).update(h).digest(enc) } module.exports = function createHmac(alg, key) { return new Hmac(alg, key) } }).call(this,require("buffer").Buffer) },{"buffer":45,"create-hash/browser":50,"inherits":92,"stream":131}],54:[function(require,module,exports){ 'use strict' exports.randomBytes = exports.rng = exports.pseudoRandomBytes = exports.prng = require('randombytes') exports.createHash = exports.Hash = require('create-hash') exports.createHmac = exports.Hmac = require('create-hmac') var hashes = ['sha1', 'sha224', 'sha256', 'sha384', 'sha512', 'md5', 'rmd160'].concat(Object.keys(require('browserify-sign/algos'))) exports.getHashes = function () { return hashes } var p = require('pbkdf2') exports.pbkdf2 = p.pbkdf2 exports.pbkdf2Sync = p.pbkdf2Sync var aes = require('browserify-cipher') ;[ 'Cipher', 'createCipher', 'Cipheriv', 'createCipheriv', 'Decipher', 'createDecipher', 'Decipheriv', 'createDecipheriv', 'getCiphers', 'listCiphers' ].forEach(function (key) { exports[key] = aes[key] }) var dh = require('diffie-hellman') ;[ 'DiffieHellmanGroup', 'createDiffieHellmanGroup', 'getDiffieHellman', 'createDiffieHellman', 'DiffieHellman' ].forEach(function (key) { exports[key] = dh[key] }) var sign = require('browserify-sign') ;[ 'createSign', 'Sign', 'createVerify', 'Verify' ].forEach(function (key) { exports[key] = sign[key] }) exports.createECDH = require('create-ecdh') var publicEncrypt = require('public-encrypt') ;[ 'publicEncrypt', 'privateEncrypt', 'publicDecrypt', 'privateDecrypt' ].forEach(function (key) { exports[key] = publicEncrypt[key] }) // the least I can do is make error messages for the rest of the node.js/crypto api. ;[ 'createCredentials' ].forEach(function (name) { exports[name] = function () { throw new Error([ 'sorry, ' + name + ' is not implemented yet', 'we accept pull requests', 'https://github.com/crypto-browserify/crypto-browserify' ].join('\n')) } }) },{"browserify-cipher":35,"browserify-sign":40,"browserify-sign/algos":39,"create-ecdh":49,"create-hash":50,"create-hmac":53,"diffie-hellman":61,"pbkdf2":102,"public-encrypt":105,"randombytes":111}],55:[function(require,module,exports){ 'use strict'; exports.utils = require('./des/utils'); exports.Cipher = require('./des/cipher'); exports.DES = require('./des/des'); exports.CBC = require('./des/cbc'); exports.EDE = require('./des/ede'); },{"./des/cbc":56,"./des/cipher":57,"./des/des":58,"./des/ede":59,"./des/utils":60}],56:[function(require,module,exports){ 'use strict'; var assert = require('minimalistic-assert'); var inherits = require('inherits'); var proto = {}; function CBCState(iv) { assert.equal(iv.length, 8, 'Invalid IV length'); this.iv = new Array(8); for (var i = 0; i < this.iv.length; i++) this.iv[i] = iv[i]; } function instantiate(Base) { function CBC(options) { Base.call(this, options); this._cbcInit(); } inherits(CBC, Base); var keys = Object.keys(proto); for (var i = 0; i < keys.length; i++) { var key = keys[i]; CBC.prototype[key] = proto[key]; } CBC.create = function create(options) { return new CBC(options); }; return CBC; } exports.instantiate = instantiate; proto._cbcInit = function _cbcInit() { var state = new CBCState(this.options.iv); this._cbcState = state; }; proto._update = function _update(inp, inOff, out, outOff) { var state = this._cbcState; var superProto = this.constructor.super_.prototype; var iv = state.iv; if (this.type === 'encrypt') { for (var i = 0; i < this.blockSize; i++) iv[i] ^= inp[inOff + i]; superProto._update.call(this, iv, 0, out, outOff); for (var i = 0; i < this.blockSize; i++) iv[i] = out[outOff + i]; } else { superProto._update.call(this, inp, inOff, out, outOff); for (var i = 0; i < this.blockSize; i++) out[outOff + i] ^= iv[i]; for (var i = 0; i < this.blockSize; i++) iv[i] = inp[inOff + i]; } }; },{"inherits":92,"minimalistic-assert":96}],57:[function(require,module,exports){ 'use strict'; var assert = require('minimalistic-assert'); function Cipher(options) { this.options = options; this.type = this.options.type; this.blockSize = 8; this._init(); this.buffer = new Array(this.blockSize); this.bufferOff = 0; } module.exports = Cipher; Cipher.prototype._init = function _init() { // Might be overrided }; Cipher.prototype.update = function update(data) { if (data.length === 0) return []; if (this.type === 'decrypt') return this._updateDecrypt(data); else return this._updateEncrypt(data); }; Cipher.prototype._buffer = function _buffer(data, off) { // Append data to buffer var min = Math.min(this.buffer.length - this.bufferOff, data.length - off); for (var i = 0; i < min; i++) this.buffer[this.bufferOff + i] = data[off + i]; this.bufferOff += min; // Shift next return min; }; Cipher.prototype._flushBuffer = function _flushBuffer(out, off) { this._update(this.buffer, 0, out, off); this.bufferOff = 0; return this.blockSize; }; Cipher.prototype._updateEncrypt = function _updateEncrypt(data) { var inputOff = 0; var outputOff = 0; var count = ((this.bufferOff + data.length) / this.blockSize) | 0; var out = new Array(count * this.blockSize); if (this.bufferOff !== 0) { inputOff += this._buffer(data, inputOff); if (this.bufferOff === this.buffer.length) outputOff += this._flushBuffer(out, outputOff); } // Write blocks var max = data.length - ((data.length - inputOff) % this.blockSize); for (; inputOff < max; inputOff += this.blockSize) { this._update(data, inputOff, out, outputOff); outputOff += this.blockSize; } // Queue rest for (; inputOff < data.length; inputOff++, this.bufferOff++) this.buffer[this.bufferOff] = data[inputOff]; return out; }; Cipher.prototype._updateDecrypt = function _updateDecrypt(data) { var inputOff = 0; var outputOff = 0; var count = Math.ceil((this.bufferOff + data.length) / this.blockSize) - 1; var out = new Array(count * this.blockSize); // TODO(indutny): optimize it, this is far from optimal for (; count > 0; count--) { inputOff += this._buffer(data, inputOff); outputOff += this._flushBuffer(out, outputOff); } // Buffer rest of the input inputOff += this._buffer(data, inputOff); return out; }; Cipher.prototype.final = function final(buffer) { var first; if (buffer) first = this.update(buffer); var last; if (this.type === 'encrypt') last = this._finalEncrypt(); else last = this._finalDecrypt(); if (first) return first.concat(last); else return last; }; Cipher.prototype._pad = function _pad(buffer, off) { if (off === 0) return false; while (off < buffer.length) buffer[off++] = 0; return true; }; Cipher.prototype._finalEncrypt = function _finalEncrypt() { if (!this._pad(this.buffer, this.bufferOff)) return []; var out = new Array(this.blockSize); this._update(this.buffer, 0, out, 0); return out; }; Cipher.prototype._unpad = function _unpad(buffer) { return buffer; }; Cipher.prototype._finalDecrypt = function _finalDecrypt() { assert.equal(this.bufferOff, this.blockSize, 'Not enough data to decrypt'); var out = new Array(this.blockSize); this._flushBuffer(out, 0); return this._unpad(out); }; },{"minimalistic-assert":96}],58:[function(require,module,exports){ 'use strict'; var assert = require('minimalistic-assert'); var inherits = require('inherits'); var des = require('../des'); var utils = des.utils; var Cipher = des.Cipher; function DESState() { this.tmp = new Array(2); this.keys = null; } function DES(options) { Cipher.call(this, options); var state = new DESState(); this._desState = state; this.deriveKeys(state, options.key); } inherits(DES, Cipher); module.exports = DES; DES.create = function create(options) { return new DES(options); }; var shiftTable = [ 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1 ]; DES.prototype.deriveKeys = function deriveKeys(state, key) { state.keys = new Array(16 * 2); assert.equal(key.length, this.blockSize, 'Invalid key length'); var kL = utils.readUInt32BE(key, 0); var kR = utils.readUInt32BE(key, 4); utils.pc1(kL, kR, state.tmp, 0); kL = state.tmp[0]; kR = state.tmp[1]; for (var i = 0; i < state.keys.length; i += 2) { var shift = shiftTable[i >>> 1]; kL = utils.r28shl(kL, shift); kR = utils.r28shl(kR, shift); utils.pc2(kL, kR, state.keys, i); } }; DES.prototype._update = function _update(inp, inOff, out, outOff) { var state = this._desState; var l = utils.readUInt32BE(inp, inOff); var r = utils.readUInt32BE(inp, inOff + 4); // Initial Permutation utils.ip(l, r, state.tmp, 0); l = state.tmp[0]; r = state.tmp[1]; if (this.type === 'encrypt') this._encrypt(state, l, r, state.tmp, 0); else this._decrypt(state, l, r, state.tmp, 0); l = state.tmp[0]; r = state.tmp[1]; utils.writeUInt32BE(out, l, outOff); utils.writeUInt32BE(out, r, outOff + 4); }; DES.prototype._pad = function _pad(buffer, off) { var value = buffer.length - off; for (var i = off; i < buffer.length; i++) buffer[i] = value; return true; }; DES.prototype._unpad = function _unpad(buffer) { var pad = buffer[buffer.length - 1]; for (var i = buffer.length - pad; i < buffer.length; i++) assert.equal(buffer[i], pad); return buffer.slice(0, buffer.length - pad); }; DES.prototype._encrypt = function _encrypt(state, lStart, rStart, out, off) { var l = lStart; var r = rStart; // Apply f() x16 times for (var i = 0; i < state.keys.length; i += 2) { var keyL = state.keys[i]; var keyR = state.keys[i + 1]; // f(r, k) utils.expand(r, state.tmp, 0); keyL ^= state.tmp[0]; keyR ^= state.tmp[1]; var s = utils.substitute(keyL, keyR); var f = utils.permute(s); var t = r; r = (l ^ f) >>> 0; l = t; } // Reverse Initial Permutation utils.rip(r, l, out, off); }; DES.prototype._decrypt = function _decrypt(state, lStart, rStart, out, off) { var l = rStart; var r = lStart; // Apply f() x16 times for (var i = state.keys.length - 2; i >= 0; i -= 2) { var keyL = state.keys[i]; var keyR = state.keys[i + 1]; // f(r, k) utils.expand(l, state.tmp, 0); keyL ^= state.tmp[0]; keyR ^= state.tmp[1]; var s = utils.substitute(keyL, keyR); var f = utils.permute(s); var t = l; l = (r ^ f) >>> 0; r = t; } // Reverse Initial Permutation utils.rip(l, r, out, off); }; },{"../des":55,"inherits":92,"minimalistic-assert":96}],59:[function(require,module,exports){ 'use strict'; var assert = require('minimalistic-assert'); var inherits = require('inherits'); var des = require('../des'); var Cipher = des.Cipher; var DES = des.DES; function EDEState(type, key) { assert.equal(key.length, 24, 'Invalid key length'); var k1 = key.slice(0, 8); var k2 = key.slice(8, 16); var k3 = key.slice(16, 24); if (type === 'encrypt') { this.ciphers = [ DES.create({ type: 'encrypt', key: k1 }), DES.create({ type: 'decrypt', key: k2 }), DES.create({ type: 'encrypt', key: k3 }) ]; } else { this.ciphers = [ DES.create({ type: 'decrypt', key: k3 }), DES.create({ type: 'encrypt', key: k2 }), DES.create({ type: 'decrypt', key: k1 }) ]; } } function EDE(options) { Cipher.call(this, options); var state = new EDEState(this.type, this.options.key); this._edeState = state; } inherits(EDE, Cipher); module.exports = EDE; EDE.create = function create(options) { return new EDE(options); }; EDE.prototype._update = function _update(inp, inOff, out, outOff) { var state = this._edeState; state.ciphers[0]._update(inp, inOff, out, outOff); state.ciphers[1]._update(out, outOff, out, outOff); state.ciphers[2]._update(out, outOff, out, outOff); }; EDE.prototype._pad = DES.prototype._pad; EDE.prototype._unpad = DES.prototype._unpad; },{"../des":55,"inherits":92,"minimalistic-assert":96}],60:[function(require,module,exports){ 'use strict'; exports.readUInt32BE = function readUInt32BE(bytes, off) { var res = (bytes[0 + off] << 24) | (bytes[1 + off] << 16) | (bytes[2 + off] << 8) | bytes[3 + off]; return res >>> 0; }; exports.writeUInt32BE = function writeUInt32BE(bytes, value, off) { bytes[0 + off] = value >>> 24; bytes[1 + off] = (value >>> 16) & 0xff; bytes[2 + off] = (value >>> 8) & 0xff; bytes[3 + off] = value & 0xff; }; exports.ip = function ip(inL, inR, out, off) { var outL = 0; var outR = 0; for (var i = 6; i >= 0; i -= 2) { for (var j = 0; j <= 24;="" j="" +="8)" {="" outl="" <<="1;" |="(inR">>> (j + i)) & 1; } for (var j = 0; j <= 24;="" j="" +="8)" {="" outl="" <<="1;" |="(inL">>> (j + i)) & 1; } } for (var i = 6; i >= 0; i -= 2) { for (var j = 1; j <= 25;="" j="" +="8)" {="" outr="" <<="1;" |="(inR">>> (j + i)) & 1; } for (var j = 1; j <= 25;="" j="" +="8)" {="" outr="" <<="1;" |="(inL">>> (j + i)) & 1; } } out[off + 0] = outL >>> 0; out[off + 1] = outR >>> 0; }; exports.rip = function rip(inL, inR, out, off) { var outL = 0; var outR = 0; for (var i = 0; i < 4; i++) { for (var j = 24; j >= 0; j -= 8) { outL <<= 1;="" outl="" |="(inR">>> (j + i)) & 1; outL <<= 1;="" outl="" |="(inL">>> (j + i)) & 1; } } for (var i = 4; i < 8; i++) { for (var j = 24; j >= 0; j -= 8) { outR <<= 1;="" outr="" |="(inR">>> (j + i)) & 1; outR <<= 1;="" outr="" |="(inL">>> (j + i)) & 1; } } out[off + 0] = outL >>> 0; out[off + 1] = outR >>> 0; }; exports.pc1 = function pc1(inL, inR, out, off) { var outL = 0; var outR = 0; // 7, 15, 23, 31, 39, 47, 55, 63 // 6, 14, 22, 30, 39, 47, 55, 63 // 5, 13, 21, 29, 39, 47, 55, 63 // 4, 12, 20, 28 for (var i = 7; i >= 5; i--) { for (var j = 0; j <= 24;="" j="" +="8)" {="" outl="" <<="1;" |="(inR">> (j + i)) & 1; } for (var j = 0; j <= 24;="" j="" +="8)" {="" outl="" <<="1;" |="(inL">> (j + i)) & 1; } } for (var j = 0; j <= 24;="" j="" +="8)" {="" outl="" <<="1;" |="(inR">> (j + i)) & 1; } // 1, 9, 17, 25, 33, 41, 49, 57 // 2, 10, 18, 26, 34, 42, 50, 58 // 3, 11, 19, 27, 35, 43, 51, 59 // 36, 44, 52, 60 for (var i = 1; i <= 3;="" i++)="" {="" for="" (var="" j="0;" <="24;" +="8)" outr="" <<="1;" |="(inR">> (j + i)) & 1; } for (var j = 0; j <= 24;="" j="" +="8)" {="" outr="" <<="1;" |="(inL">> (j + i)) & 1; } } for (var j = 0; j <= 24;="" j="" +="8)" {="" outr="" <<="1;" |="(inL">> (j + i)) & 1; } out[off + 0] = outL >>> 0; out[off + 1] = outR >>> 0; }; exports.r28shl = function r28shl(num, shift) { return ((num << shift) & 0xfffffff) | (num >>> (28 - shift)); }; var pc2table = [ // inL => outL 14, 11, 17, 4, 27, 23, 25, 0, 13, 22, 7, 18, 5, 9, 16, 24, 2, 20, 12, 21, 1, 8, 15, 26, // inR => outR 15, 4, 25, 19, 9, 1, 26, 16, 5, 11, 23, 8, 12, 7, 17, 0, 22, 3, 10, 14, 6, 20, 27, 24 ]; exports.pc2 = function pc2(inL, inR, out, off) { var outL = 0; var outR = 0; var len = pc2table.length >>> 1; for (var i = 0; i < len; i++) { outL <<= 1;="" outl="" |="(inL">>> pc2table[i]) & 0x1; } for (var i = len; i < pc2table.length; i++) { outR <<= 1;="" outr="" |="(inR">>> pc2table[i]) & 0x1; } out[off + 0] = outL >>> 0; out[off + 1] = outR >>> 0; }; exports.expand = function expand(r, out, off) { var outL = 0; var outR = 0; outL = ((r & 1) << 5) | (r >>> 27); for (var i = 23; i >= 15; i -= 4) { outL <<= 6;="" outl="" |="(r">>> i) & 0x3f; } for (var i = 11; i >= 3; i -= 4) { outR |= (r >>> i) & 0x3f; outR <<= 6;="" }="" outr="" |="((r" &="" 0x1f)="" <<="" 1)="" (r="">>> 31); out[off + 0] = outL >>> 0; out[off + 1] = outR >>> 0; }; var sTable = [ 14, 0, 4, 15, 13, 7, 1, 4, 2, 14, 15, 2, 11, 13, 8, 1, 3, 10, 10, 6, 6, 12, 12, 11, 5, 9, 9, 5, 0, 3, 7, 8, 4, 15, 1, 12, 14, 8, 8, 2, 13, 4, 6, 9, 2, 1, 11, 7, 15, 5, 12, 11, 9, 3, 7, 14, 3, 10, 10, 0, 5, 6, 0, 13, 15, 3, 1, 13, 8, 4, 14, 7, 6, 15, 11, 2, 3, 8, 4, 14, 9, 12, 7, 0, 2, 1, 13, 10, 12, 6, 0, 9, 5, 11, 10, 5, 0, 13, 14, 8, 7, 10, 11, 1, 10, 3, 4, 15, 13, 4, 1, 2, 5, 11, 8, 6, 12, 7, 6, 12, 9, 0, 3, 5, 2, 14, 15, 9, 10, 13, 0, 7, 9, 0, 14, 9, 6, 3, 3, 4, 15, 6, 5, 10, 1, 2, 13, 8, 12, 5, 7, 14, 11, 12, 4, 11, 2, 15, 8, 1, 13, 1, 6, 10, 4, 13, 9, 0, 8, 6, 15, 9, 3, 8, 0, 7, 11, 4, 1, 15, 2, 14, 12, 3, 5, 11, 10, 5, 14, 2, 7, 12, 7, 13, 13, 8, 14, 11, 3, 5, 0, 6, 6, 15, 9, 0, 10, 3, 1, 4, 2, 7, 8, 2, 5, 12, 11, 1, 12, 10, 4, 14, 15, 9, 10, 3, 6, 15, 9, 0, 0, 6, 12, 10, 11, 1, 7, 13, 13, 8, 15, 9, 1, 4, 3, 5, 14, 11, 5, 12, 2, 7, 8, 2, 4, 14, 2, 14, 12, 11, 4, 2, 1, 12, 7, 4, 10, 7, 11, 13, 6, 1, 8, 5, 5, 0, 3, 15, 15, 10, 13, 3, 0, 9, 14, 8, 9, 6, 4, 11, 2, 8, 1, 12, 11, 7, 10, 1, 13, 14, 7, 2, 8, 13, 15, 6, 9, 15, 12, 0, 5, 9, 6, 10, 3, 4, 0, 5, 14, 3, 12, 10, 1, 15, 10, 4, 15, 2, 9, 7, 2, 12, 6, 9, 8, 5, 0, 6, 13, 1, 3, 13, 4, 14, 14, 0, 7, 11, 5, 3, 11, 8, 9, 4, 14, 3, 15, 2, 5, 12, 2, 9, 8, 5, 12, 15, 3, 10, 7, 11, 0, 14, 4, 1, 10, 7, 1, 6, 13, 0, 11, 8, 6, 13, 4, 13, 11, 0, 2, 11, 14, 7, 15, 4, 0, 9, 8, 1, 13, 10, 3, 14, 12, 3, 9, 5, 7, 12, 5, 2, 10, 15, 6, 8, 1, 6, 1, 6, 4, 11, 11, 13, 13, 8, 12, 1, 3, 4, 7, 10, 14, 7, 10, 9, 15, 5, 6, 0, 8, 15, 0, 14, 5, 2, 9, 3, 2, 12, 13, 1, 2, 15, 8, 13, 4, 8, 6, 10, 15, 3, 11, 7, 1, 4, 10, 12, 9, 5, 3, 6, 14, 11, 5, 0, 0, 14, 12, 9, 7, 2, 7, 2, 11, 1, 4, 14, 1, 7, 9, 4, 12, 10, 14, 8, 2, 13, 0, 15, 6, 12, 10, 9, 13, 0, 15, 3, 3, 5, 5, 6, 8, 11 ]; exports.substitute = function substitute(inL, inR) { var out = 0; for (var i = 0; i < 4; i++) { var b = (inL >>> (18 - i * 6)) & 0x3f; var sb = sTable[i * 0x40 + b]; out <<= 4;="" out="" |="sb;" }="" for="" (var="" i="0;" <="" i++)="" {="" var="" b="(inR">>> (18 - i * 6)) & 0x3f; var sb = sTable[4 * 0x40 + i * 0x40 + b]; out <<= 4;="" out="" |="sb;" }="" return="">>> 0; }; var permuteTable = [ 16, 25, 12, 11, 3, 20, 4, 15, 31, 17, 9, 6, 27, 14, 1, 22, 30, 24, 8, 18, 0, 5, 29, 23, 13, 19, 2, 26, 10, 21, 28, 7 ]; exports.permute = function permute(num) { var out = 0; for (var i = 0; i < permuteTable.length; i++) { out <<= 1;="" out="" |="(num">>> permuteTable[i]) & 0x1; } return out >>> 0; }; exports.padSplit = function padSplit(num, size, group) { var str = num.toString(2); while (str.length < size) str = '0' + str; var out = []; for (var i = 0; i < size; i += group) out.push(str.slice(i, i + group)); return out.join(' '); }; },{}],61:[function(require,module,exports){ (function (Buffer){ var generatePrime = require('./lib/generatePrime') var primes = require('./lib/primes.json') var DH = require('./lib/dh') function getDiffieHellman (mod) { var prime = new Buffer(primes[mod].prime, 'hex') var gen = new Buffer(primes[mod].gen, 'hex') return new DH(prime, gen) } var ENCODINGS = { 'binary': true, 'hex': true, 'base64': true } function createDiffieHellman (prime, enc, generator, genc) { if (Buffer.isBuffer(enc) || ENCODINGS[enc] === undefined) { return createDiffieHellman(prime, 'binary', enc, generator) } enc = enc || 'binary' genc = genc || 'binary' generator = generator || new Buffer([2]) if (!Buffer.isBuffer(generator)) { generator = new Buffer(generator, genc) } if (typeof prime === 'number') { return new DH(generatePrime(prime, generator), generator, true) } if (!Buffer.isBuffer(prime)) { prime = new Buffer(prime, enc) } return new DH(prime, generator, true) } exports.DiffieHellmanGroup = exports.createDiffieHellmanGroup = exports.getDiffieHellman = getDiffieHellman exports.createDiffieHellman = exports.DiffieHellman = createDiffieHellman }).call(this,require("buffer").Buffer) },{"./lib/dh":62,"./lib/generatePrime":63,"./lib/primes.json":64,"buffer":45}],62:[function(require,module,exports){ (function (Buffer){ var BN = require('bn.js'); var MillerRabin = require('miller-rabin'); var millerRabin = new MillerRabin(); var TWENTYFOUR = new BN(24); var ELEVEN = new BN(11); var TEN = new BN(10); var THREE = new BN(3); var SEVEN = new BN(7); var primes = require('./generatePrime'); var randomBytes = require('randombytes'); module.exports = DH; function setPublicKey(pub, enc) { enc = enc || 'utf8'; if (!Buffer.isBuffer(pub)) { pub = new Buffer(pub, enc); } this._pub = new BN(pub); return this; } function setPrivateKey(priv, enc) { enc = enc || 'utf8'; if (!Buffer.isBuffer(priv)) { priv = new Buffer(priv, enc); } this._priv = new BN(priv); return this; } var primeCache = {}; function checkPrime(prime, generator) { var gen = generator.toString('hex'); var hex = [gen, prime.toString(16)].join('_'); if (hex in primeCache) { return primeCache[hex]; } var error = 0; if (prime.isEven() || !primes.simpleSieve || !primes.fermatTest(prime) || !millerRabin.test(prime)) { //not a prime so +1 error += 1; if (gen === '02' || gen === '05') { // we'd be able to check the generator // it would fail so +8 error += 8; } else { //we wouldn't be able to test the generator // so +4 error += 4; } primeCache[hex] = error; return error; } if (!millerRabin.test(prime.shrn(1))) { //not a safe prime error += 2; } var rem; switch (gen) { case '02': if (prime.mod(TWENTYFOUR).cmp(ELEVEN)) { // unsuidable generator error += 8; } break; case '05': rem = prime.mod(TEN); if (rem.cmp(THREE) && rem.cmp(SEVEN)) { // prime mod 10 needs to equal 3 or 7 error += 8; } break; default: error += 4; } primeCache[hex] = error; return error; } function DH(prime, generator, malleable) { this.setGenerator(generator); this.__prime = new BN(prime); this._prime = BN.mont(this.__prime); this._primeLen = prime.length; this._pub = undefined; this._priv = undefined; this._primeCode = undefined; if (malleable) { this.setPublicKey = setPublicKey; this.setPrivateKey = setPrivateKey; } else { this._primeCode = 8; } } Object.defineProperty(DH.prototype, 'verifyError', { enumerable: true, get: function () { if (typeof this._primeCode !== 'number') { this._primeCode = checkPrime(this.__prime, this.__gen); } return this._primeCode; } }); DH.prototype.generateKeys = function () { if (!this._priv) { this._priv = new BN(randomBytes(this._primeLen)); } this._pub = this._gen.toRed(this._prime).redPow(this._priv).fromRed(); return this.getPublicKey(); }; DH.prototype.computeSecret = function (other) { other = new BN(other); other = other.toRed(this._prime); var secret = other.redPow(this._priv).fromRed(); var out = new Buffer(secret.toArray()); var prime = this.getPrime(); if (out.length < prime.length) { var front = new Buffer(prime.length - out.length); front.fill(0); out = Buffer.concat([front, out]); } return out; }; DH.prototype.getPublicKey = function getPublicKey(enc) { return formatReturnValue(this._pub, enc); }; DH.prototype.getPrivateKey = function getPrivateKey(enc) { return formatReturnValue(this._priv, enc); }; DH.prototype.getPrime = function (enc) { return formatReturnValue(this.__prime, enc); }; DH.prototype.getGenerator = function (enc) { return formatReturnValue(this._gen, enc); }; DH.prototype.setGenerator = function (gen, enc) { enc = enc || 'utf8'; if (!Buffer.isBuffer(gen)) { gen = new Buffer(gen, enc); } this.__gen = gen; this._gen = new BN(gen); return this; }; function formatReturnValue(bn, enc) { var buf = new Buffer(bn.toArray()); if (!enc) { return buf; } else { return buf.toString(enc); } } }).call(this,require("buffer").Buffer) },{"./generatePrime":63,"bn.js":17,"buffer":45,"miller-rabin":95,"randombytes":111}],63:[function(require,module,exports){ var randomBytes = require('randombytes'); module.exports = findPrime; findPrime.simpleSieve = simpleSieve; findPrime.fermatTest = fermatTest; var BN = require('bn.js'); var TWENTYFOUR = new BN(24); var MillerRabin = require('miller-rabin'); var millerRabin = new MillerRabin(); var ONE = new BN(1); var TWO = new BN(2); var FIVE = new BN(5); var SIXTEEN = new BN(16); var EIGHT = new BN(8); var TEN = new BN(10); var THREE = new BN(3); var SEVEN = new BN(7); var ELEVEN = new BN(11); var FOUR = new BN(4); var TWELVE = new BN(12); var primes = null; function _getPrimes() { if (primes !== null) return primes; var limit = 0x100000; var res = []; res[0] = 2; for (var i = 1, k = 3; k < limit; k += 2) { var sqrt = Math.ceil(Math.sqrt(k)); for (var j = 0; j < i && res[j] <= 2="" sqrt;="" j++)="" if="" (k="" %="" res[j]="==" 0)="" break;="" (i="" !="=" j="" &&="" <="sqrt)" continue;="" res[i++]="k;" }="" primes="res;" return="" res;="" function="" simplesieve(p)="" {="" var="" for="" (var="" i="0;" primes.length;="" i++)="" (p.modn(primes[i])="==" (p.cmpn(primes[i])="==" true;="" else="" false;="" fermattest(p)="" red="BN.mont(p);" two.tored(red).redpow(p.subn(1)).fromred().cmpn(1)="==" 0;="" findprime(bits,="" gen)="" (bits="" 16)="" this="" is="" what="" openssl="" does="" (gen="==" ||="" gen="==" 5)="" new="" bn([0x8c,="" 0x7b]);="" 0x27]);="" bn(gen);="" num,="" n2;="" while="" (true)="" num="new" bn(randombytes(math.ceil(bits="" 8)));="" (num.bitlength()=""> bits) { num.ishrn(1); } if (num.isEven()) { num.iadd(ONE); } if (!num.testn(1)) { num.iadd(TWO); } if (!gen.cmp(TWO)) { while (num.mod(TWENTYFOUR).cmp(ELEVEN)) { num.iadd(FOUR); } } else if (!gen.cmp(FIVE)) { while (num.mod(TEN).cmp(THREE)) { num.iadd(FOUR); } } n2 = num.shrn(1); if (simpleSieve(n2) && simpleSieve(num) && fermatTest(n2) && fermatTest(num) && millerRabin.test(n2) && millerRabin.test(num)) { return num; } } } },{"bn.js":17,"miller-rabin":95,"randombytes":111}],64:[function(require,module,exports){ module.exports={ "modp1": { "gen": "02", "prime": "ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a63a3620ffffffffffffffff" }, "modp2": { "gen": "02", "prime": "ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece65381ffffffffffffffff" }, "modp5": { "gen": "02", "prime": "ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca237327ffffffffffffffff" }, "modp14": { "gen": "02", "prime": "ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aacaa68ffffffffffffffff" }, "modp15": { "gen": "02", "prime": "ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aaac42dad33170d04507a33a85521abdf1cba64ecfb850458dbef0a8aea71575d060c7db3970f85a6e1e4c7abf5ae8cdb0933d71e8c94e04a25619dcee3d2261ad2ee6bf12ffa06d98a0864d87602733ec86a64521f2b18177b200cbbe117577a615d6c770988c0bad946e208e24fa074e5ab3143db5bfce0fd108e4b82d120a93ad2caffffffffffffffff" }, "modp16": { "gen": "02", "prime": "ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aaac42dad33170d04507a33a85521abdf1cba64ecfb850458dbef0a8aea71575d060c7db3970f85a6e1e4c7abf5ae8cdb0933d71e8c94e04a25619dcee3d2261ad2ee6bf12ffa06d98a0864d87602733ec86a64521f2b18177b200cbbe117577a615d6c770988c0bad946e208e24fa074e5ab3143db5bfce0fd108e4b82d120a92108011a723c12a787e6d788719a10bdba5b2699c327186af4e23c1a946834b6150bda2583e9ca2ad44ce8dbbbc2db04de8ef92e8efc141fbecaa6287c59474e6bc05d99b2964fa090c3a2233ba186515be7ed1f612970cee2d7afb81bdd762170481cd0069127d5b05aa993b4ea988d8fddc186ffb7dc90a6c08f4df435c934063199ffffffffffffffff" }, "modp17": { "gen": "02", "prime": "ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aaac42dad33170d04507a33a85521abdf1cba64ecfb850458dbef0a8aea71575d060c7db3970f85a6e1e4c7abf5ae8cdb0933d71e8c94e04a25619dcee3d2261ad2ee6bf12ffa06d98a0864d87602733ec86a64521f2b18177b200cbbe117577a615d6c770988c0bad946e208e24fa074e5ab3143db5bfce0fd108e4b82d120a92108011a723c12a787e6d788719a10bdba5b2699c327186af4e23c1a946834b6150bda2583e9ca2ad44ce8dbbbc2db04de8ef92e8efc141fbecaa6287c59474e6bc05d99b2964fa090c3a2233ba186515be7ed1f612970cee2d7afb81bdd762170481cd0069127d5b05aa993b4ea988d8fddc186ffb7dc90a6c08f4df435c93402849236c3fab4d27c7026c1d4dcb2602646dec9751e763dba37bdf8ff9406ad9e530ee5db382f413001aeb06a53ed9027d831179727b0865a8918da3edbebcf9b14ed44ce6cbaced4bb1bdb7f1447e6cc254b332051512bd7af426fb8f401378cd2bf5983ca01c64b92ecf032ea15d1721d03f482d7ce6e74fef6d55e702f46980c82b5a84031900b1c9e59e7c97fbec7e8f323a97a7e36cc88be0f1d45b7ff585ac54bd407b22b4154aacc8f6d7ebf48e1d814cc5ed20f8037e0a79715eef29be32806a1d58bb7c5da76f550aa3d8a1fbff0eb19ccb1a313d55cda56c9ec2ef29632387fe8d76e3c0468043e8f663f4860ee12bf2d5b0b7474d6e694f91e6dcc4024ffffffffffffffff" }, "modp18": { "gen": "02", "prime": "ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aaac42dad33170d04507a33a85521abdf1cba64ecfb850458dbef0a8aea71575d060c7db3970f85a6e1e4c7abf5ae8cdb0933d71e8c94e04a25619dcee3d2261ad2ee6bf12ffa06d98a0864d87602733ec86a64521f2b18177b200cbbe117577a615d6c770988c0bad946e208e24fa074e5ab3143db5bfce0fd108e4b82d120a92108011a723c12a787e6d788719a10bdba5b2699c327186af4e23c1a946834b6150bda2583e9ca2ad44ce8dbbbc2db04de8ef92e8efc141fbecaa6287c59474e6bc05d99b2964fa090c3a2233ba186515be7ed1f612970cee2d7afb81bdd762170481cd0069127d5b05aa993b4ea988d8fddc186ffb7dc90a6c08f4df435c93402849236c3fab4d27c7026c1d4dcb2602646dec9751e763dba37bdf8ff9406ad9e530ee5db382f413001aeb06a53ed9027d831179727b0865a8918da3edbebcf9b14ed44ce6cbaced4bb1bdb7f1447e6cc254b332051512bd7af426fb8f401378cd2bf5983ca01c64b92ecf032ea15d1721d03f482d7ce6e74fef6d55e702f46980c82b5a84031900b1c9e59e7c97fbec7e8f323a97a7e36cc88be0f1d45b7ff585ac54bd407b22b4154aacc8f6d7ebf48e1d814cc5ed20f8037e0a79715eef29be32806a1d58bb7c5da76f550aa3d8a1fbff0eb19ccb1a313d55cda56c9ec2ef29632387fe8d76e3c0468043e8f663f4860ee12bf2d5b0b7474d6e694f91e6dbe115974a3926f12fee5e438777cb6a932df8cd8bec4d073b931ba3bc832b68d9dd300741fa7bf8afc47ed2576f6936ba424663aab639c5ae4f5683423b4742bf1c978238f16cbe39d652de3fdb8befc848ad922222e04a4037c0713eb57a81a23f0c73473fc646cea306b4bcbc8862f8385ddfa9d4b7fa2c087e879683303ed5bdd3a062b3cf5b3a278a66d2a13f83f44f82ddf310ee074ab6a364597e899a0255dc164f31cc50846851df9ab48195ded7ea1b1d510bd7ee74d73faf36bc31ecfa268359046f4eb879f924009438b481c6cd7889a002ed5ee382bc9190da6fc026e479558e4475677e9aa9e3050e2765694dfc81f56e880b96e7160c980dd98edd3dfffffffffffffffff" } } },{}],65:[function(require,module,exports){ 'use strict'; var elliptic = exports; elliptic.version = require('../package.json').version; elliptic.utils = require('./elliptic/utils'); elliptic.rand = require('brorand'); elliptic.hmacDRBG = require('./elliptic/hmac-drbg'); elliptic.curve = require('./elliptic/curve'); elliptic.curves = require('./elliptic/curves'); // Protocols elliptic.ec = require('./elliptic/ec'); elliptic.eddsa = require('./elliptic/eddsa'); },{"../package.json":81,"./elliptic/curve":68,"./elliptic/curves":71,"./elliptic/ec":72,"./elliptic/eddsa":75,"./elliptic/hmac-drbg":78,"./elliptic/utils":80,"brorand":18}],66:[function(require,module,exports){ 'use strict'; var BN = require('bn.js'); var elliptic = require('../../elliptic'); var utils = elliptic.utils; var getNAF = utils.getNAF; var getJSF = utils.getJSF; var assert = utils.assert; function BaseCurve(type, conf) { this.type = type; this.p = new BN(conf.p, 16); // Use Montgomery, when there is no fast reduction for the prime this.red = conf.prime ? BN.red(conf.prime) : BN.mont(this.p); // Useful for many curves this.zero = new BN(0).toRed(this.red); this.one = new BN(1).toRed(this.red); this.two = new BN(2).toRed(this.red); // Curve configuration, optional this.n = conf.n && new BN(conf.n, 16); this.g = conf.g && this.pointFromJSON(conf.g, conf.gRed); // Temporary arrays this._wnafT1 = new Array(4); this._wnafT2 = new Array(4); this._wnafT3 = new Array(4); this._wnafT4 = new Array(4); } module.exports = BaseCurve; BaseCurve.prototype.point = function point() { throw new Error('Not implemented'); }; BaseCurve.prototype.validate = function validate() { throw new Error('Not implemented'); }; BaseCurve.prototype._fixedNafMul = function _fixedNafMul(p, k) { assert(p.precomputed); var doubles = p._getDoubles(); var naf = getNAF(k, 1); var I = (1 << (doubles.step + 1)) - (doubles.step % 2 === 0 ? 2 : 1); I /= 3; // Translate into more windowed form var repr = []; for (var j = 0; j < naf.length; j += doubles.step) { var nafW = 0; for (var k = j + doubles.step - 1; k >= j; k--) nafW = (nafW << 1) + naf[k]; repr.push(nafW); } var a = this.jpoint(null, null, null); var b = this.jpoint(null, null, null); for (var i = I; i > 0; i--) { for (var j = 0; j < repr.length; j++) { var nafW = repr[j]; if (nafW === i) b = b.mixedAdd(doubles.points[j]); else if (nafW === -i) b = b.mixedAdd(doubles.points[j].neg()); } a = a.add(b); } return a.toP(); }; BaseCurve.prototype._wnafMul = function _wnafMul(p, k) { var w = 4; // Precompute window var nafPoints = p._getNAFPoints(w); w = nafPoints.wnd; var wnd = nafPoints.points; // Get NAF form var naf = getNAF(k, w); // Add `this`*(N+1) for every w-NAF index var acc = this.jpoint(null, null, null); for (var i = naf.length - 1; i >= 0; i--) { // Count zeroes for (var k = 0; i >= 0 && naf[i] === 0; i--) k++; if (i >= 0) k++; acc = acc.dblp(k); if (i < 0) break; var z = naf[i]; assert(z !== 0); if (p.type === 'affine') { // J +- P if (z > 0) acc = acc.mixedAdd(wnd[(z - 1) >> 1]); else acc = acc.mixedAdd(wnd[(-z - 1) >> 1].neg()); } else { // J +- J if (z > 0) acc = acc.add(wnd[(z - 1) >> 1]); else acc = acc.add(wnd[(-z - 1) >> 1].neg()); } } return p.type === 'affine' ? acc.toP() : acc; }; BaseCurve.prototype._wnafMulAdd = function _wnafMulAdd(defW, points, coeffs, len) { var wndWidth = this._wnafT1; var wnd = this._wnafT2; var naf = this._wnafT3; // Fill all arrays var max = 0; for (var i = 0; i < len; i++) { var p = points[i]; var nafPoints = p._getNAFPoints(defW); wndWidth[i] = nafPoints.wnd; wnd[i] = nafPoints.points; } // Comb small window NAFs for (var i = len - 1; i >= 1; i -= 2) { var a = i - 1; var b = i; if (wndWidth[a] !== 1 || wndWidth[b] !== 1) { naf[a] = getNAF(coeffs[a], wndWidth[a]); naf[b] = getNAF(coeffs[b], wndWidth[b]); max = Math.max(naf[a].length, max); max = Math.max(naf[b].length, max); continue; } var comb = [ points[a], /* 1 */ null, /* 3 */ null, /* 5 */ points[b] /* 7 */ ]; // Try to avoid Projective points, if possible if (points[a].y.cmp(points[b].y) === 0) { comb[1] = points[a].add(points[b]); comb[2] = points[a].toJ().mixedAdd(points[b].neg()); } else if (points[a].y.cmp(points[b].y.redNeg()) === 0) { comb[1] = points[a].toJ().mixedAdd(points[b]); comb[2] = points[a].add(points[b].neg()); } else { comb[1] = points[a].toJ().mixedAdd(points[b]); comb[2] = points[a].toJ().mixedAdd(points[b].neg()); } var index = [ -3, /* -1 -1 */ -1, /* -1 0 */ -5, /* -1 1 */ -7, /* 0 -1 */ 0, /* 0 0 */ 7, /* 0 1 */ 5, /* 1 -1 */ 1, /* 1 0 */ 3 /* 1 1 */ ]; var jsf = getJSF(coeffs[a], coeffs[b]); max = Math.max(jsf[0].length, max); naf[a] = new Array(max); naf[b] = new Array(max); for (var j = 0; j < max; j++) { var ja = jsf[0][j] | 0; var jb = jsf[1][j] | 0; naf[a][j] = index[(ja + 1) * 3 + (jb + 1)]; naf[b][j] = 0; wnd[a] = comb; } } var acc = this.jpoint(null, null, null); var tmp = this._wnafT4; for (var i = max; i >= 0; i--) { var k = 0; while (i >= 0) { var zero = true; for (var j = 0; j < len; j++) { tmp[j] = naf[j][i] | 0; if (tmp[j] !== 0) zero = false; } if (!zero) break; k++; i--; } if (i >= 0) k++; acc = acc.dblp(k); if (i < 0) break; for (var j = 0; j < len; j++) { var z = tmp[j]; var p; if (z === 0) continue; else if (z > 0) p = wnd[j][(z - 1) >> 1]; else if (z < 0) p = wnd[j][(-z - 1) >> 1].neg(); if (p.type === 'affine') acc = acc.mixedAdd(p); else acc = acc.add(p); } } // Zeroify references for (var i = 0; i < len; i++) wnd[i] = null; return acc.toP(); }; function BasePoint(curve, type) { this.curve = curve; this.type = type; this.precomputed = null; } BaseCurve.BasePoint = BasePoint; BasePoint.prototype.eq = function eq(/*other*/) { throw new Error('Not implemented'); }; BasePoint.prototype.validate = function validate() { return this.curve.validate(this); }; BaseCurve.prototype.decodePoint = function decodePoint(bytes, enc) { bytes = utils.toArray(bytes, enc); var len = this.p.byteLength(); if (bytes[0] === 0x04 && bytes.length - 1 === 2 * len) { return this.point(bytes.slice(1, 1 + len), bytes.slice(1 + len, 1 + 2 * len)); } else if ((bytes[0] === 0x02 || bytes[0] === 0x03) && bytes.length - 1 === len) { return this.pointFromX(bytes.slice(1, 1 + len), bytes[0] === 0x03); } throw new Error('Unknown point format'); }; BasePoint.prototype.encodeCompressed = function encodeCompressed(enc) { return this.encode(enc, true); }; BasePoint.prototype._encode = function _encode(compact) { var len = this.curve.p.byteLength(); var x = this.getX().toArray('be', len); if (compact) return [ this.getY().isEven() ? 0x02 : 0x03 ].concat(x); return [ 0x04 ].concat(x, this.getY().toArray('be', len)) ; }; BasePoint.prototype.encode = function encode(enc, compact) { return utils.encode(this._encode(compact), enc); }; BasePoint.prototype.precompute = function precompute(power) { if (this.precomputed) return this; var precomputed = { doubles: null, naf: null, beta: null }; precomputed.naf = this._getNAFPoints(8); precomputed.doubles = this._getDoubles(4, power); precomputed.beta = this._getBeta(); this.precomputed = precomputed; return this; }; BasePoint.prototype._hasDoubles = function _hasDoubles(k) { if (!this.precomputed) return false; var doubles = this.precomputed.doubles; if (!doubles) return false; return doubles.points.length >= Math.ceil((k.bitLength() + 1) / doubles.step); }; BasePoint.prototype._getDoubles = function _getDoubles(step, power) { if (this.precomputed && this.precomputed.doubles) return this.precomputed.doubles; var doubles = [ this ]; var acc = this; for (var i = 0; i < power; i += step) { for (var j = 0; j < step; j++) acc = acc.dbl(); doubles.push(acc); } return { step: step, points: doubles }; }; BasePoint.prototype._getNAFPoints = function _getNAFPoints(wnd) { if (this.precomputed && this.precomputed.naf) return this.precomputed.naf; var res = [ this ]; var max = (1 << wnd) - 1; var dbl = max === 1 ? null : this.dbl(); for (var i = 1; i < max; i++) res[i] = res[i - 1].add(dbl); return { wnd: wnd, points: res }; }; BasePoint.prototype._getBeta = function _getBeta() { return null; }; BasePoint.prototype.dblp = function dblp(k) { var r = this; for (var i = 0; i < k; i++) r = r.dbl(); return r; }; },{"../../elliptic":65,"bn.js":17}],67:[function(require,module,exports){ 'use strict'; var curve = require('../curve'); var elliptic = require('../../elliptic'); var BN = require('bn.js'); var inherits = require('inherits'); var Base = curve.base; var assert = elliptic.utils.assert; function EdwardsCurve(conf) { // NOTE: Important as we are creating point in Base.call() this.twisted = (conf.a | 0) !== 1; this.mOneA = this.twisted && (conf.a | 0) === -1; this.extended = this.mOneA; Base.call(this, 'edwards', conf); this.a = new BN(conf.a, 16).umod(this.red.m); this.a = this.a.toRed(this.red); this.c = new BN(conf.c, 16).toRed(this.red); this.c2 = this.c.redSqr(); this.d = new BN(conf.d, 16).toRed(this.red); this.dd = this.d.redAdd(this.d); assert(!this.twisted || this.c.fromRed().cmpn(1) === 0); this.oneC = (conf.c | 0) === 1; } inherits(EdwardsCurve, Base); module.exports = EdwardsCurve; EdwardsCurve.prototype._mulA = function _mulA(num) { if (this.mOneA) return num.redNeg(); else return this.a.redMul(num); }; EdwardsCurve.prototype._mulC = function _mulC(num) { if (this.oneC) return num; else return this.c.redMul(num); }; // Just for compatibility with Short curve EdwardsCurve.prototype.jpoint = function jpoint(x, y, z, t) { return this.point(x, y, z, t); }; EdwardsCurve.prototype.pointFromX = function pointFromX(x, odd) { x = new BN(x, 16); if (!x.red) x = x.toRed(this.red); var x2 = x.redSqr(); var rhs = this.c2.redSub(this.a.redMul(x2)); var lhs = this.one.redSub(this.c2.redMul(this.d).redMul(x2)); var y2 = rhs.redMul(lhs.redInvm()); var y = y2.redSqrt(); if (y.redSqr().redSub(y2).cmp(this.zero) !== 0) throw new Error('invalid point'); var isOdd = y.fromRed().isOdd(); if (odd && !isOdd || !odd && isOdd) y = y.redNeg(); return this.point(x, y); }; EdwardsCurve.prototype.pointFromY = function pointFromY(y, odd) { y = new BN(y, 16); if (!y.red) y = y.toRed(this.red); // x^2 = (y^2 - 1) / (d y^2 + 1) var y2 = y.redSqr(); var lhs = y2.redSub(this.one); var rhs = y2.redMul(this.d).redAdd(this.one); var x2 = lhs.redMul(rhs.redInvm()); if (x2.cmp(this.zero) === 0) { if (odd) throw new Error('invalid point'); else return this.point(this.zero, y); } var x = x2.redSqrt(); if (x.redSqr().redSub(x2).cmp(this.zero) !== 0) throw new Error('invalid point'); if (x.isOdd() !== odd) x = x.redNeg(); return this.point(x, y); }; EdwardsCurve.prototype.validate = function validate(point) { if (point.isInfinity()) return true; // Curve: A * X^2 + Y^2 = C^2 * (1 + D * X^2 * Y^2) point.normalize(); var x2 = point.x.redSqr(); var y2 = point.y.redSqr(); var lhs = x2.redMul(this.a).redAdd(y2); var rhs = this.c2.redMul(this.one.redAdd(this.d.redMul(x2).redMul(y2))); return lhs.cmp(rhs) === 0; }; function Point(curve, x, y, z, t) { Base.BasePoint.call(this, curve, 'projective'); if (x === null && y === null && z === null) { this.x = this.curve.zero; this.y = this.curve.one; this.z = this.curve.one; this.t = this.curve.zero; this.zOne = true; } else { this.x = new BN(x, 16); this.y = new BN(y, 16); this.z = z ? new BN(z, 16) : this.curve.one; this.t = t && new BN(t, 16); if (!this.x.red) this.x = this.x.toRed(this.curve.red); if (!this.y.red) this.y = this.y.toRed(this.curve.red); if (!this.z.red) this.z = this.z.toRed(this.curve.red); if (this.t && !this.t.red) this.t = this.t.toRed(this.curve.red); this.zOne = this.z === this.curve.one; // Use extended coordinates if (this.curve.extended && !this.t) { this.t = this.x.redMul(this.y); if (!this.zOne) this.t = this.t.redMul(this.z.redInvm()); } } } inherits(Point, Base.BasePoint); EdwardsCurve.prototype.pointFromJSON = function pointFromJSON(obj) { return Point.fromJSON(this, obj); }; EdwardsCurve.prototype.point = function point(x, y, z, t) { return new Point(this, x, y, z, t); }; Point.fromJSON = function fromJSON(curve, obj) { return new Point(curve, obj[0], obj[1], obj[2]); }; Point.prototype.inspect = function inspect() { if (this.isInfinity()) return ''; return ''; }; Point.prototype.isInfinity = function isInfinity() { // XXX This code assumes that zero is always zero in red return this.x.cmpn(0) === 0 && this.y.cmp(this.z) === 0; }; Point.prototype._extDbl = function _extDbl() { // hyperelliptic.org/EFD/g1p/auto-twisted-extended-1.html // #doubling-dbl-2008-hwcd // 4M + 4S // A = X1^2 var a = this.x.redSqr(); // B = Y1^2 var b = this.y.redSqr(); // C = 2 * Z1^2 var c = this.z.redSqr(); c = c.redIAdd(c); // D = a * A var d = this.curve._mulA(a); // E = (X1 + Y1)^2 - A - B var e = this.x.redAdd(this.y).redSqr().redISub(a).redISub(b); // G = D + B var g = d.redAdd(b); // F = G - C var f = g.redSub(c); // H = D - B var h = d.redSub(b); // X3 = E * F var nx = e.redMul(f); // Y3 = G * H var ny = g.redMul(h); // T3 = E * H var nt = e.redMul(h); // Z3 = F * G var nz = f.redMul(g); return this.curve.point(nx, ny, nz, nt); }; Point.prototype._projDbl = function _projDbl() { // hyperelliptic.org/EFD/g1p/auto-twisted-projective.html // #doubling-dbl-2008-bbjlp // #doubling-dbl-2007-bl // and others // Generally 3M + 4S or 2M + 4S // B = (X1 + Y1)^2 var b = this.x.redAdd(this.y).redSqr(); // C = X1^2 var c = this.x.redSqr(); // D = Y1^2 var d = this.y.redSqr(); var nx; var ny; var nz; if (this.curve.twisted) { // E = a * C var e = this.curve._mulA(c); // F = E + D var f = e.redAdd(d); if (this.zOne) { // X3 = (B - C - D) * (F - 2) nx = b.redSub(c).redSub(d).redMul(f.redSub(this.curve.two)); // Y3 = F * (E - D) ny = f.redMul(e.redSub(d)); // Z3 = F^2 - 2 * F nz = f.redSqr().redSub(f).redSub(f); } else { // H = Z1^2 var h = this.z.redSqr(); // J = F - 2 * H var j = f.redSub(h).redISub(h); // X3 = (B-C-D)*J nx = b.redSub(c).redISub(d).redMul(j); // Y3 = F * (E - D) ny = f.redMul(e.redSub(d)); // Z3 = F * J nz = f.redMul(j); } } else { // E = C + D var e = c.redAdd(d); // H = (c * Z1)^2 var h = this.curve._mulC(this.c.redMul(this.z)).redSqr(); // J = E - 2 * H var j = e.redSub(h).redSub(h); // X3 = c * (B - E) * J nx = this.curve._mulC(b.redISub(e)).redMul(j); // Y3 = c * E * (C - D) ny = this.curve._mulC(e).redMul(c.redISub(d)); // Z3 = E * J nz = e.redMul(j); } return this.curve.point(nx, ny, nz); }; Point.prototype.dbl = function dbl() { if (this.isInfinity()) return this; // Double in extended coordinates if (this.curve.extended) return this._extDbl(); else return this._projDbl(); }; Point.prototype._extAdd = function _extAdd(p) { // hyperelliptic.org/EFD/g1p/auto-twisted-extended-1.html // #addition-add-2008-hwcd-3 // 8M // A = (Y1 - X1) * (Y2 - X2) var a = this.y.redSub(this.x).redMul(p.y.redSub(p.x)); // B = (Y1 + X1) * (Y2 + X2) var b = this.y.redAdd(this.x).redMul(p.y.redAdd(p.x)); // C = T1 * k * T2 var c = this.t.redMul(this.curve.dd).redMul(p.t); // D = Z1 * 2 * Z2 var d = this.z.redMul(p.z.redAdd(p.z)); // E = B - A var e = b.redSub(a); // F = D - C var f = d.redSub(c); // G = D + C var g = d.redAdd(c); // H = B + A var h = b.redAdd(a); // X3 = E * F var nx = e.redMul(f); // Y3 = G * H var ny = g.redMul(h); // T3 = E * H var nt = e.redMul(h); // Z3 = F * G var nz = f.redMul(g); return this.curve.point(nx, ny, nz, nt); }; Point.prototype._projAdd = function _projAdd(p) { // hyperelliptic.org/EFD/g1p/auto-twisted-projective.html // #addition-add-2008-bbjlp // #addition-add-2007-bl // 10M + 1S // A = Z1 * Z2 var a = this.z.redMul(p.z); // B = A^2 var b = a.redSqr(); // C = X1 * X2 var c = this.x.redMul(p.x); // D = Y1 * Y2 var d = this.y.redMul(p.y); // E = d * C * D var e = this.curve.d.redMul(c).redMul(d); // F = B - E var f = b.redSub(e); // G = B + E var g = b.redAdd(e); // X3 = A * F * ((X1 + Y1) * (X2 + Y2) - C - D) var tmp = this.x.redAdd(this.y).redMul(p.x.redAdd(p.y)).redISub(c).redISub(d); var nx = a.redMul(f).redMul(tmp); var ny; var nz; if (this.curve.twisted) { // Y3 = A * G * (D - a * C) ny = a.redMul(g).redMul(d.redSub(this.curve._mulA(c))); // Z3 = F * G nz = f.redMul(g); } else { // Y3 = A * G * (D - C) ny = a.redMul(g).redMul(d.redSub(c)); // Z3 = c * F * G nz = this.curve._mulC(f).redMul(g); } return this.curve.point(nx, ny, nz); }; Point.prototype.add = function add(p) { if (this.isInfinity()) return p; if (p.isInfinity()) return this; if (this.curve.extended) return this._extAdd(p); else return this._projAdd(p); }; Point.prototype.mul = function mul(k) { if (this._hasDoubles(k)) return this.curve._fixedNafMul(this, k); else return this.curve._wnafMul(this, k); }; Point.prototype.mulAdd = function mulAdd(k1, p, k2) { return this.curve._wnafMulAdd(1, [ this, p ], [ k1, k2 ], 2); }; Point.prototype.normalize = function normalize() { if (this.zOne) return this; // Normalize coordinates var zi = this.z.redInvm(); this.x = this.x.redMul(zi); this.y = this.y.redMul(zi); if (this.t) this.t = this.t.redMul(zi); this.z = this.curve.one; this.zOne = true; return this; }; Point.prototype.neg = function neg() { return this.curve.point(this.x.redNeg(), this.y, this.z, this.t && this.t.redNeg()); }; Point.prototype.getX = function getX() { this.normalize(); return this.x.fromRed(); }; Point.prototype.getY = function getY() { this.normalize(); return this.y.fromRed(); }; Point.prototype.eq = function eq(other) { return this === other || this.getX().cmp(other.getX()) === 0 && this.getY().cmp(other.getY()) === 0; }; // Compatibility with BaseCurve Point.prototype.toP = Point.prototype.normalize; Point.prototype.mixedAdd = Point.prototype.add; },{"../../elliptic":65,"../curve":68,"bn.js":17,"inherits":92}],68:[function(require,module,exports){ 'use strict'; var curve = exports; curve.base = require('./base'); curve.short = require('./short'); curve.mont = require('./mont'); curve.edwards = require('./edwards'); },{"./base":66,"./edwards":67,"./mont":69,"./short":70}],69:[function(require,module,exports){ 'use strict'; var curve = require('../curve'); var BN = require('bn.js'); var inherits = require('inherits'); var Base = curve.base; var elliptic = require('../../elliptic'); var utils = elliptic.utils; function MontCurve(conf) { Base.call(this, 'mont', conf); this.a = new BN(conf.a, 16).toRed(this.red); this.b = new BN(conf.b, 16).toRed(this.red); this.i4 = new BN(4).toRed(this.red).redInvm(); this.two = new BN(2).toRed(this.red); this.a24 = this.i4.redMul(this.a.redAdd(this.two)); } inherits(MontCurve, Base); module.exports = MontCurve; MontCurve.prototype.validate = function validate(point) { var x = point.normalize().x; var x2 = x.redSqr(); var rhs = x2.redMul(x).redAdd(x2.redMul(this.a)).redAdd(x); var y = rhs.redSqrt(); return y.redSqr().cmp(rhs) === 0; }; function Point(curve, x, z) { Base.BasePoint.call(this, curve, 'projective'); if (x === null && z === null) { this.x = this.curve.one; this.z = this.curve.zero; } else { this.x = new BN(x, 16); this.z = new BN(z, 16); if (!this.x.red) this.x = this.x.toRed(this.curve.red); if (!this.z.red) this.z = this.z.toRed(this.curve.red); } } inherits(Point, Base.BasePoint); MontCurve.prototype.decodePoint = function decodePoint(bytes, enc) { return this.point(utils.toArray(bytes, enc), 1); }; MontCurve.prototype.point = function point(x, z) { return new Point(this, x, z); }; MontCurve.prototype.pointFromJSON = function pointFromJSON(obj) { return Point.fromJSON(this, obj); }; Point.prototype.precompute = function precompute() { // No-op }; Point.prototype._encode = function _encode() { return this.getX().toArray('be', this.curve.p.byteLength()); }; Point.fromJSON = function fromJSON(curve, obj) { return new Point(curve, obj[0], obj[1] || curve.one); }; Point.prototype.inspect = function inspect() { if (this.isInfinity()) return ''; return ''; }; Point.prototype.isInfinity = function isInfinity() { // XXX This code assumes that zero is always zero in red return this.z.cmpn(0) === 0; }; Point.prototype.dbl = function dbl() { // http://hyperelliptic.org/EFD/g1p/auto-montgom-xz.html#doubling-dbl-1987-m-3 // 2M + 2S + 4A // A = X1 + Z1 var a = this.x.redAdd(this.z); // AA = A^2 var aa = a.redSqr(); // B = X1 - Z1 var b = this.x.redSub(this.z); // BB = B^2 var bb = b.redSqr(); // C = AA - BB var c = aa.redSub(bb); // X3 = AA * BB var nx = aa.redMul(bb); // Z3 = C * (BB + A24 * C) var nz = c.redMul(bb.redAdd(this.curve.a24.redMul(c))); return this.curve.point(nx, nz); }; Point.prototype.add = function add() { throw new Error('Not supported on Montgomery curve'); }; Point.prototype.diffAdd = function diffAdd(p, diff) { // http://hyperelliptic.org/EFD/g1p/auto-montgom-xz.html#diffadd-dadd-1987-m-3 // 4M + 2S + 6A // A = X2 + Z2 var a = this.x.redAdd(this.z); // B = X2 - Z2 var b = this.x.redSub(this.z); // C = X3 + Z3 var c = p.x.redAdd(p.z); // D = X3 - Z3 var d = p.x.redSub(p.z); // DA = D * A var da = d.redMul(a); // CB = C * B var cb = c.redMul(b); // X5 = Z1 * (DA + CB)^2 var nx = diff.z.redMul(da.redAdd(cb).redSqr()); // Z5 = X1 * (DA - CB)^2 var nz = diff.x.redMul(da.redISub(cb).redSqr()); return this.curve.point(nx, nz); }; Point.prototype.mul = function mul(k) { var t = k.clone(); var a = this; // (N / 2) * Q + Q var b = this.curve.point(null, null); // (N / 2) * Q var c = this; // Q for (var bits = []; t.cmpn(0) !== 0; t.iushrn(1)) bits.push(t.andln(1)); for (var i = bits.length - 1; i >= 0; i--) { if (bits[i] === 0) { // N * Q + Q = ((N / 2) * Q + Q)) + (N / 2) * Q a = a.diffAdd(b, c); // N * Q = 2 * ((N / 2) * Q + Q)) b = b.dbl(); } else { // N * Q = ((N / 2) * Q + Q) + ((N / 2) * Q) b = a.diffAdd(b, c); // N * Q + Q = 2 * ((N / 2) * Q + Q) a = a.dbl(); } } return b; }; Point.prototype.mulAdd = function mulAdd() { throw new Error('Not supported on Montgomery curve'); }; Point.prototype.eq = function eq(other) { return this.getX().cmp(other.getX()) === 0; }; Point.prototype.normalize = function normalize() { this.x = this.x.redMul(this.z.redInvm()); this.z = this.curve.one; return this; }; Point.prototype.getX = function getX() { // Normalize coordinates this.normalize(); return this.x.fromRed(); }; },{"../../elliptic":65,"../curve":68,"bn.js":17,"inherits":92}],70:[function(require,module,exports){ 'use strict'; var curve = require('../curve'); var elliptic = require('../../elliptic'); var BN = require('bn.js'); var inherits = require('inherits'); var Base = curve.base; var assert = elliptic.utils.assert; function ShortCurve(conf) { Base.call(this, 'short', conf); this.a = new BN(conf.a, 16).toRed(this.red); this.b = new BN(conf.b, 16).toRed(this.red); this.tinv = this.two.redInvm(); this.zeroA = this.a.fromRed().cmpn(0) === 0; this.threeA = this.a.fromRed().sub(this.p).cmpn(-3) === 0; // If the curve is endomorphic, precalculate beta and lambda this.endo = this._getEndomorphism(conf); this._endoWnafT1 = new Array(4); this._endoWnafT2 = new Array(4); } inherits(ShortCurve, Base); module.exports = ShortCurve; ShortCurve.prototype._getEndomorphism = function _getEndomorphism(conf) { // No efficient endomorphism if (!this.zeroA || !this.g || !this.n || this.p.modn(3) !== 1) return; // Compute beta and lambda, that lambda * P = (beta * Px; Py) var beta; var lambda; if (conf.beta) { beta = new BN(conf.beta, 16).toRed(this.red); } else { var betas = this._getEndoRoots(this.p); // Choose the smallest beta beta = betas[0].cmp(betas[1]) < 0 ? betas[0] : betas[1]; beta = beta.toRed(this.red); } if (conf.lambda) { lambda = new BN(conf.lambda, 16); } else { // Choose the lambda that is matching selected beta var lambdas = this._getEndoRoots(this.n); if (this.g.mul(lambdas[0]).x.cmp(this.g.x.redMul(beta)) === 0) { lambda = lambdas[0]; } else { lambda = lambdas[1]; assert(this.g.mul(lambda).x.cmp(this.g.x.redMul(beta)) === 0); } } // Get basis vectors, used for balanced length-two representation var basis; if (conf.basis) { basis = conf.basis.map(function(vec) { return { a: new BN(vec.a, 16), b: new BN(vec.b, 16) }; }); } else { basis = this._getEndoBasis(lambda); } return { beta: beta, lambda: lambda, basis: basis }; }; ShortCurve.prototype._getEndoRoots = function _getEndoRoots(num) { // Find roots of for x^2 + x + 1 in F // Root = (-1 +- Sqrt(-3)) / 2 // var red = num === this.p ? this.red : BN.mont(num); var tinv = new BN(2).toRed(red).redInvm(); var ntinv = tinv.redNeg(); var s = new BN(3).toRed(red).redNeg().redSqrt().redMul(tinv); var l1 = ntinv.redAdd(s).fromRed(); var l2 = ntinv.redSub(s).fromRed(); return [ l1, l2 ]; }; ShortCurve.prototype._getEndoBasis = function _getEndoBasis(lambda) { // aprxSqrt >= sqrt(this.n) var aprxSqrt = this.n.ushrn(Math.floor(this.n.bitLength() / 2)); // 3.74 // Run EGCD, until r(L + 1) < aprxSqrt var u = lambda; var v = this.n.clone(); var x1 = new BN(1); var y1 = new BN(0); var x2 = new BN(0); var y2 = new BN(1); // NOTE: all vectors are roots of: a + b * lambda = 0 (mod n) var a0; var b0; // First vector var a1; var b1; // Second vector var a2; var b2; var prevR; var i = 0; var r; var x; while (u.cmpn(0) !== 0) { var q = v.div(u); r = v.sub(q.mul(u)); x = x2.sub(q.mul(x1)); var y = y2.sub(q.mul(y1)); if (!a1 && r.cmp(aprxSqrt) < 0) { a0 = prevR.neg(); b0 = x1; a1 = r.neg(); b1 = x; } else if (a1 && ++i === 2) { break; } prevR = r; v = u; u = r; x2 = x1; x1 = x; y2 = y1; y1 = y; } a2 = r.neg(); b2 = x; var len1 = a1.sqr().add(b1.sqr()); var len2 = a2.sqr().add(b2.sqr()); if (len2.cmp(len1) >= 0) { a2 = a0; b2 = b0; } // Normalize signs if (a1.negative) { a1 = a1.neg(); b1 = b1.neg(); } if (a2.negative) { a2 = a2.neg(); b2 = b2.neg(); } return [ { a: a1, b: b1 }, { a: a2, b: b2 } ]; }; ShortCurve.prototype._endoSplit = function _endoSplit(k) { var basis = this.endo.basis; var v1 = basis[0]; var v2 = basis[1]; var c1 = v2.b.mul(k).divRound(this.n); var c2 = v1.b.neg().mul(k).divRound(this.n); var p1 = c1.mul(v1.a); var p2 = c2.mul(v2.a); var q1 = c1.mul(v1.b); var q2 = c2.mul(v2.b); // Calculate answer var k1 = k.sub(p1).sub(p2); var k2 = q1.add(q2).neg(); return { k1: k1, k2: k2 }; }; ShortCurve.prototype.pointFromX = function pointFromX(x, odd) { x = new BN(x, 16); if (!x.red) x = x.toRed(this.red); var y2 = x.redSqr().redMul(x).redIAdd(x.redMul(this.a)).redIAdd(this.b); var y = y2.redSqrt(); if (y.redSqr().redSub(y2).cmp(this.zero) !== 0) throw new Error('invalid point'); // XXX Is there any way to tell if the number is odd without converting it // to non-red form? var isOdd = y.fromRed().isOdd(); if (odd && !isOdd || !odd && isOdd) y = y.redNeg(); return this.point(x, y); }; ShortCurve.prototype.validate = function validate(point) { if (point.inf) return true; var x = point.x; var y = point.y; var ax = this.a.redMul(x); var rhs = x.redSqr().redMul(x).redIAdd(ax).redIAdd(this.b); return y.redSqr().redISub(rhs).cmpn(0) === 0; }; ShortCurve.prototype._endoWnafMulAdd = function _endoWnafMulAdd(points, coeffs) { var npoints = this._endoWnafT1; var ncoeffs = this._endoWnafT2; for (var i = 0; i < points.length; i++) { var split = this._endoSplit(coeffs[i]); var p = points[i]; var beta = p._getBeta(); if (split.k1.negative) { split.k1.ineg(); p = p.neg(true); } if (split.k2.negative) { split.k2.ineg(); beta = beta.neg(true); } npoints[i * 2] = p; npoints[i * 2 + 1] = beta; ncoeffs[i * 2] = split.k1; ncoeffs[i * 2 + 1] = split.k2; } var res = this._wnafMulAdd(1, npoints, ncoeffs, i * 2); // Clean-up references to points and coefficients for (var j = 0; j < i * 2; j++) { npoints[j] = null; ncoeffs[j] = null; } return res; }; function Point(curve, x, y, isRed) { Base.BasePoint.call(this, curve, 'affine'); if (x === null && y === null) { this.x = null; this.y = null; this.inf = true; } else { this.x = new BN(x, 16); this.y = new BN(y, 16); // Force redgomery representation when loading from JSON if (isRed) { this.x.forceRed(this.curve.red); this.y.forceRed(this.curve.red); } if (!this.x.red) this.x = this.x.toRed(this.curve.red); if (!this.y.red) this.y = this.y.toRed(this.curve.red); this.inf = false; } } inherits(Point, Base.BasePoint); ShortCurve.prototype.point = function point(x, y, isRed) { return new Point(this, x, y, isRed); }; ShortCurve.prototype.pointFromJSON = function pointFromJSON(obj, red) { return Point.fromJSON(this, obj, red); }; Point.prototype._getBeta = function _getBeta() { if (!this.curve.endo) return; var pre = this.precomputed; if (pre && pre.beta) return pre.beta; var beta = this.curve.point(this.x.redMul(this.curve.endo.beta), this.y); if (pre) { var curve = this.curve; var endoMul = function(p) { return curve.point(p.x.redMul(curve.endo.beta), p.y); }; pre.beta = beta; beta.precomputed = { beta: null, naf: pre.naf && { wnd: pre.naf.wnd, points: pre.naf.points.map(endoMul) }, doubles: pre.doubles && { step: pre.doubles.step, points: pre.doubles.points.map(endoMul) } }; } return beta; }; Point.prototype.toJSON = function toJSON() { if (!this.precomputed) return [ this.x, this.y ]; return [ this.x, this.y, this.precomputed && { doubles: this.precomputed.doubles && { step: this.precomputed.doubles.step, points: this.precomputed.doubles.points.slice(1) }, naf: this.precomputed.naf && { wnd: this.precomputed.naf.wnd, points: this.precomputed.naf.points.slice(1) } } ]; }; Point.fromJSON = function fromJSON(curve, obj, red) { if (typeof obj === 'string') obj = JSON.parse(obj); var res = curve.point(obj[0], obj[1], red); if (!obj[2]) return res; function obj2point(obj) { return curve.point(obj[0], obj[1], red); } var pre = obj[2]; res.precomputed = { beta: null, doubles: pre.doubles && { step: pre.doubles.step, points: [ res ].concat(pre.doubles.points.map(obj2point)) }, naf: pre.naf && { wnd: pre.naf.wnd, points: [ res ].concat(pre.naf.points.map(obj2point)) } }; return res; }; Point.prototype.inspect = function inspect() { if (this.isInfinity()) return ''; return ''; }; Point.prototype.isInfinity = function isInfinity() { return this.inf; }; Point.prototype.add = function add(p) { // O + P = P if (this.inf) return p; // P + O = P if (p.inf) return this; // P + P = 2P if (this.eq(p)) return this.dbl(); // P + (-P) = O if (this.neg().eq(p)) return this.curve.point(null, null); // P + Q = O if (this.x.cmp(p.x) === 0) return this.curve.point(null, null); var c = this.y.redSub(p.y); if (c.cmpn(0) !== 0) c = c.redMul(this.x.redSub(p.x).redInvm()); var nx = c.redSqr().redISub(this.x).redISub(p.x); var ny = c.redMul(this.x.redSub(nx)).redISub(this.y); return this.curve.point(nx, ny); }; Point.prototype.dbl = function dbl() { if (this.inf) return this; // 2P = O var ys1 = this.y.redAdd(this.y); if (ys1.cmpn(0) === 0) return this.curve.point(null, null); var a = this.curve.a; var x2 = this.x.redSqr(); var dyinv = ys1.redInvm(); var c = x2.redAdd(x2).redIAdd(x2).redIAdd(a).redMul(dyinv); var nx = c.redSqr().redISub(this.x.redAdd(this.x)); var ny = c.redMul(this.x.redSub(nx)).redISub(this.y); return this.curve.point(nx, ny); }; Point.prototype.getX = function getX() { return this.x.fromRed(); }; Point.prototype.getY = function getY() { return this.y.fromRed(); }; Point.prototype.mul = function mul(k) { k = new BN(k, 16); if (this._hasDoubles(k)) return this.curve._fixedNafMul(this, k); else if (this.curve.endo) return this.curve._endoWnafMulAdd([ this ], [ k ]); else return this.curve._wnafMul(this, k); }; Point.prototype.mulAdd = function mulAdd(k1, p2, k2) { var points = [ this, p2 ]; var coeffs = [ k1, k2 ]; if (this.curve.endo) return this.curve._endoWnafMulAdd(points, coeffs); else return this.curve._wnafMulAdd(1, points, coeffs, 2); }; Point.prototype.eq = function eq(p) { return this === p || this.inf === p.inf && (this.inf || this.x.cmp(p.x) === 0 && this.y.cmp(p.y) === 0); }; Point.prototype.neg = function neg(_precompute) { if (this.inf) return this; var res = this.curve.point(this.x, this.y.redNeg()); if (_precompute && this.precomputed) { var pre = this.precomputed; var negate = function(p) { return p.neg(); }; res.precomputed = { naf: pre.naf && { wnd: pre.naf.wnd, points: pre.naf.points.map(negate) }, doubles: pre.doubles && { step: pre.doubles.step, points: pre.doubles.points.map(negate) } }; } return res; }; Point.prototype.toJ = function toJ() { if (this.inf) return this.curve.jpoint(null, null, null); var res = this.curve.jpoint(this.x, this.y, this.curve.one); return res; }; function JPoint(curve, x, y, z) { Base.BasePoint.call(this, curve, 'jacobian'); if (x === null && y === null && z === null) { this.x = this.curve.one; this.y = this.curve.one; this.z = new BN(0); } else { this.x = new BN(x, 16); this.y = new BN(y, 16); this.z = new BN(z, 16); } if (!this.x.red) this.x = this.x.toRed(this.curve.red); if (!this.y.red) this.y = this.y.toRed(this.curve.red); if (!this.z.red) this.z = this.z.toRed(this.curve.red); this.zOne = this.z === this.curve.one; } inherits(JPoint, Base.BasePoint); ShortCurve.prototype.jpoint = function jpoint(x, y, z) { return new JPoint(this, x, y, z); }; JPoint.prototype.toP = function toP() { if (this.isInfinity()) return this.curve.point(null, null); var zinv = this.z.redInvm(); var zinv2 = zinv.redSqr(); var ax = this.x.redMul(zinv2); var ay = this.y.redMul(zinv2).redMul(zinv); return this.curve.point(ax, ay); }; JPoint.prototype.neg = function neg() { return this.curve.jpoint(this.x, this.y.redNeg(), this.z); }; JPoint.prototype.add = function add(p) { // O + P = P if (this.isInfinity()) return p; // P + O = P if (p.isInfinity()) return this; // 12M + 4S + 7A var pz2 = p.z.redSqr(); var z2 = this.z.redSqr(); var u1 = this.x.redMul(pz2); var u2 = p.x.redMul(z2); var s1 = this.y.redMul(pz2.redMul(p.z)); var s2 = p.y.redMul(z2.redMul(this.z)); var h = u1.redSub(u2); var r = s1.redSub(s2); if (h.cmpn(0) === 0) { if (r.cmpn(0) !== 0) return this.curve.jpoint(null, null, null); else return this.dbl(); } var h2 = h.redSqr(); var h3 = h2.redMul(h); var v = u1.redMul(h2); var nx = r.redSqr().redIAdd(h3).redISub(v).redISub(v); var ny = r.redMul(v.redISub(nx)).redISub(s1.redMul(h3)); var nz = this.z.redMul(p.z).redMul(h); return this.curve.jpoint(nx, ny, nz); }; JPoint.prototype.mixedAdd = function mixedAdd(p) { // O + P = P if (this.isInfinity()) return p.toJ(); // P + O = P if (p.isInfinity()) return this; // 8M + 3S + 7A var z2 = this.z.redSqr(); var u1 = this.x; var u2 = p.x.redMul(z2); var s1 = this.y; var s2 = p.y.redMul(z2).redMul(this.z); var h = u1.redSub(u2); var r = s1.redSub(s2); if (h.cmpn(0) === 0) { if (r.cmpn(0) !== 0) return this.curve.jpoint(null, null, null); else return this.dbl(); } var h2 = h.redSqr(); var h3 = h2.redMul(h); var v = u1.redMul(h2); var nx = r.redSqr().redIAdd(h3).redISub(v).redISub(v); var ny = r.redMul(v.redISub(nx)).redISub(s1.redMul(h3)); var nz = this.z.redMul(h); return this.curve.jpoint(nx, ny, nz); }; JPoint.prototype.dblp = function dblp(pow) { if (pow === 0) return this; if (this.isInfinity()) return this; if (!pow) return this.dbl(); if (this.curve.zeroA || this.curve.threeA) { var r = this; for (var i = 0; i < pow; i++) r = r.dbl(); return r; } // 1M + 2S + 1A + N * (4S + 5M + 8A) // N = 1 => 6M + 6S + 9A var a = this.curve.a; var tinv = this.curve.tinv; var jx = this.x; var jy = this.y; var jz = this.z; var jz4 = jz.redSqr().redSqr(); // Reuse results var jyd = jy.redAdd(jy); for (var i = 0; i < pow; i++) { var jx2 = jx.redSqr(); var jyd2 = jyd.redSqr(); var jyd4 = jyd2.redSqr(); var c = jx2.redAdd(jx2).redIAdd(jx2).redIAdd(a.redMul(jz4)); var t1 = jx.redMul(jyd2); var nx = c.redSqr().redISub(t1.redAdd(t1)); var t2 = t1.redISub(nx); var dny = c.redMul(t2); dny = dny.redIAdd(dny).redISub(jyd4); var nz = jyd.redMul(jz); if (i + 1 < pow) jz4 = jz4.redMul(jyd4); jx = nx; jz = nz; jyd = dny; } return this.curve.jpoint(jx, jyd.redMul(tinv), jz); }; JPoint.prototype.dbl = function dbl() { if (this.isInfinity()) return this; if (this.curve.zeroA) return this._zeroDbl(); else if (this.curve.threeA) return this._threeDbl(); else return this._dbl(); }; JPoint.prototype._zeroDbl = function _zeroDbl() { var nx; var ny; var nz; // Z = 1 if (this.zOne) { // hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html // #doubling-mdbl-2007-bl // 1M + 5S + 14A // XX = X1^2 var xx = this.x.redSqr(); // YY = Y1^2 var yy = this.y.redSqr(); // YYYY = YY^2 var yyyy = yy.redSqr(); // S = 2 * ((X1 + YY)^2 - XX - YYYY) var s = this.x.redAdd(yy).redSqr().redISub(xx).redISub(yyyy); s = s.redIAdd(s); // M = 3 * XX + a; a = 0 var m = xx.redAdd(xx).redIAdd(xx); // T = M ^ 2 - 2*S var t = m.redSqr().redISub(s).redISub(s); // 8 * YYYY var yyyy8 = yyyy.redIAdd(yyyy); yyyy8 = yyyy8.redIAdd(yyyy8); yyyy8 = yyyy8.redIAdd(yyyy8); // X3 = T nx = t; // Y3 = M * (S - T) - 8 * YYYY ny = m.redMul(s.redISub(t)).redISub(yyyy8); // Z3 = 2*Y1 nz = this.y.redAdd(this.y); } else { // hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html // #doubling-dbl-2009-l // 2M + 5S + 13A // A = X1^2 var a = this.x.redSqr(); // B = Y1^2 var b = this.y.redSqr(); // C = B^2 var c = b.redSqr(); // D = 2 * ((X1 + B)^2 - A - C) var d = this.x.redAdd(b).redSqr().redISub(a).redISub(c); d = d.redIAdd(d); // E = 3 * A var e = a.redAdd(a).redIAdd(a); // F = E^2 var f = e.redSqr(); // 8 * C var c8 = c.redIAdd(c); c8 = c8.redIAdd(c8); c8 = c8.redIAdd(c8); // X3 = F - 2 * D nx = f.redISub(d).redISub(d); // Y3 = E * (D - X3) - 8 * C ny = e.redMul(d.redISub(nx)).redISub(c8); // Z3 = 2 * Y1 * Z1 nz = this.y.redMul(this.z); nz = nz.redIAdd(nz); } return this.curve.jpoint(nx, ny, nz); }; JPoint.prototype._threeDbl = function _threeDbl() { var nx; var ny; var nz; // Z = 1 if (this.zOne) { // hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-3.html // #doubling-mdbl-2007-bl // 1M + 5S + 15A // XX = X1^2 var xx = this.x.redSqr(); // YY = Y1^2 var yy = this.y.redSqr(); // YYYY = YY^2 var yyyy = yy.redSqr(); // S = 2 * ((X1 + YY)^2 - XX - YYYY) var s = this.x.redAdd(yy).redSqr().redISub(xx).redISub(yyyy); s = s.redIAdd(s); // M = 3 * XX + a var m = xx.redAdd(xx).redIAdd(xx).redIAdd(this.curve.a); // T = M^2 - 2 * S var t = m.redSqr().redISub(s).redISub(s); // X3 = T nx = t; // Y3 = M * (S - T) - 8 * YYYY var yyyy8 = yyyy.redIAdd(yyyy); yyyy8 = yyyy8.redIAdd(yyyy8); yyyy8 = yyyy8.redIAdd(yyyy8); ny = m.redMul(s.redISub(t)).redISub(yyyy8); // Z3 = 2 * Y1 nz = this.y.redAdd(this.y); } else { // hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-3.html#doubling-dbl-2001-b // 3M + 5S // delta = Z1^2 var delta = this.z.redSqr(); // gamma = Y1^2 var gamma = this.y.redSqr(); // beta = X1 * gamma var beta = this.x.redMul(gamma); // alpha = 3 * (X1 - delta) * (X1 + delta) var alpha = this.x.redSub(delta).redMul(this.x.redAdd(delta)); alpha = alpha.redAdd(alpha).redIAdd(alpha); // X3 = alpha^2 - 8 * beta var beta4 = beta.redIAdd(beta); beta4 = beta4.redIAdd(beta4); var beta8 = beta4.redAdd(beta4); nx = alpha.redSqr().redISub(beta8); // Z3 = (Y1 + Z1)^2 - gamma - delta nz = this.y.redAdd(this.z).redSqr().redISub(gamma).redISub(delta); // Y3 = alpha * (4 * beta - X3) - 8 * gamma^2 var ggamma8 = gamma.redSqr(); ggamma8 = ggamma8.redIAdd(ggamma8); ggamma8 = ggamma8.redIAdd(ggamma8); ggamma8 = ggamma8.redIAdd(ggamma8); ny = alpha.redMul(beta4.redISub(nx)).redISub(ggamma8); } return this.curve.jpoint(nx, ny, nz); }; JPoint.prototype._dbl = function _dbl() { var a = this.curve.a; // 4M + 6S + 10A var jx = this.x; var jy = this.y; var jz = this.z; var jz4 = jz.redSqr().redSqr(); var jx2 = jx.redSqr(); var jy2 = jy.redSqr(); var c = jx2.redAdd(jx2).redIAdd(jx2).redIAdd(a.redMul(jz4)); var jxd4 = jx.redAdd(jx); jxd4 = jxd4.redIAdd(jxd4); var t1 = jxd4.redMul(jy2); var nx = c.redSqr().redISub(t1.redAdd(t1)); var t2 = t1.redISub(nx); var jyd8 = jy2.redSqr(); jyd8 = jyd8.redIAdd(jyd8); jyd8 = jyd8.redIAdd(jyd8); jyd8 = jyd8.redIAdd(jyd8); var ny = c.redMul(t2).redISub(jyd8); var nz = jy.redAdd(jy).redMul(jz); return this.curve.jpoint(nx, ny, nz); }; JPoint.prototype.trpl = function trpl() { if (!this.curve.zeroA) return this.dbl().add(this); // hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html#tripling-tpl-2007-bl // 5M + 10S + ... // XX = X1^2 var xx = this.x.redSqr(); // YY = Y1^2 var yy = this.y.redSqr(); // ZZ = Z1^2 var zz = this.z.redSqr(); // YYYY = YY^2 var yyyy = yy.redSqr(); // M = 3 * XX + a * ZZ2; a = 0 var m = xx.redAdd(xx).redIAdd(xx); // MM = M^2 var mm = m.redSqr(); // E = 6 * ((X1 + YY)^2 - XX - YYYY) - MM var e = this.x.redAdd(yy).redSqr().redISub(xx).redISub(yyyy); e = e.redIAdd(e); e = e.redAdd(e).redIAdd(e); e = e.redISub(mm); // EE = E^2 var ee = e.redSqr(); // T = 16*YYYY var t = yyyy.redIAdd(yyyy); t = t.redIAdd(t); t = t.redIAdd(t); t = t.redIAdd(t); // U = (M + E)^2 - MM - EE - T var u = m.redIAdd(e).redSqr().redISub(mm).redISub(ee).redISub(t); // X3 = 4 * (X1 * EE - 4 * YY * U) var yyu4 = yy.redMul(u); yyu4 = yyu4.redIAdd(yyu4); yyu4 = yyu4.redIAdd(yyu4); var nx = this.x.redMul(ee).redISub(yyu4); nx = nx.redIAdd(nx); nx = nx.redIAdd(nx); // Y3 = 8 * Y1 * (U * (T - U) - E * EE) var ny = this.y.redMul(u.redMul(t.redISub(u)).redISub(e.redMul(ee))); ny = ny.redIAdd(ny); ny = ny.redIAdd(ny); ny = ny.redIAdd(ny); // Z3 = (Z1 + E)^2 - ZZ - EE var nz = this.z.redAdd(e).redSqr().redISub(zz).redISub(ee); return this.curve.jpoint(nx, ny, nz); }; JPoint.prototype.mul = function mul(k, kbase) { k = new BN(k, kbase); return this.curve._wnafMul(this, k); }; JPoint.prototype.eq = function eq(p) { if (p.type === 'affine') return this.eq(p.toJ()); if (this === p) return true; // x1 * z2^2 == x2 * z1^2 var z2 = this.z.redSqr(); var pz2 = p.z.redSqr(); if (this.x.redMul(pz2).redISub(p.x.redMul(z2)).cmpn(0) !== 0) return false; // y1 * z2^3 == y2 * z1^3 var z3 = z2.redMul(this.z); var pz3 = pz2.redMul(p.z); return this.y.redMul(pz3).redISub(p.y.redMul(z3)).cmpn(0) === 0; }; JPoint.prototype.inspect = function inspect() { if (this.isInfinity()) return ''; return ''; }; JPoint.prototype.isInfinity = function isInfinity() { // XXX This code assumes that zero is always zero in red return this.z.cmpn(0) === 0; }; },{"../../elliptic":65,"../curve":68,"bn.js":17,"inherits":92}],71:[function(require,module,exports){ 'use strict'; var curves = exports; var hash = require('hash.js'); var elliptic = require('../elliptic'); var assert = elliptic.utils.assert; function PresetCurve(options) { if (options.type === 'short') this.curve = new elliptic.curve.short(options); else if (options.type === 'edwards') this.curve = new elliptic.curve.edwards(options); else this.curve = new elliptic.curve.mont(options); this.g = this.curve.g; this.n = this.curve.n; this.hash = options.hash; assert(this.g.validate(), 'Invalid curve'); assert(this.g.mul(this.n).isInfinity(), 'Invalid curve, G*N != O'); } curves.PresetCurve = PresetCurve; function defineCurve(name, options) { Object.defineProperty(curves, name, { configurable: true, enumerable: true, get: function() { var curve = new PresetCurve(options); Object.defineProperty(curves, name, { configurable: true, enumerable: true, value: curve }); return curve; } }); } defineCurve('p192', { type: 'short', prime: 'p192', p: 'ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff', a: 'ffffffff ffffffff ffffffff fffffffe ffffffff fffffffc', b: '64210519 e59c80e7 0fa7e9ab 72243049 feb8deec c146b9b1', n: 'ffffffff ffffffff ffffffff 99def836 146bc9b1 b4d22831', hash: hash.sha256, gRed: false, g: [ '188da80e b03090f6 7cbf20eb 43a18800 f4ff0afd 82ff1012', '07192b95 ffc8da78 631011ed 6b24cdd5 73f977a1 1e794811' ] }); defineCurve('p224', { type: 'short', prime: 'p224', p: 'ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001', a: 'ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff fffffffe', b: 'b4050a85 0c04b3ab f5413256 5044b0b7 d7bfd8ba 270b3943 2355ffb4', n: 'ffffffff ffffffff ffffffff ffff16a2 e0b8f03e 13dd2945 5c5c2a3d', hash: hash.sha256, gRed: false, g: [ 'b70e0cbd 6bb4bf7f 321390b9 4a03c1d3 56c21122 343280d6 115c1d21', 'bd376388 b5f723fb 4c22dfe6 cd4375a0 5a074764 44d58199 85007e34' ] }); defineCurve('p256', { type: 'short', prime: null, p: 'ffffffff 00000001 00000000 00000000 00000000 ffffffff ffffffff ffffffff', a: 'ffffffff 00000001 00000000 00000000 00000000 ffffffff ffffffff fffffffc', b: '5ac635d8 aa3a93e7 b3ebbd55 769886bc 651d06b0 cc53b0f6 3bce3c3e 27d2604b', n: 'ffffffff 00000000 ffffffff ffffffff bce6faad a7179e84 f3b9cac2 fc632551', hash: hash.sha256, gRed: false, g: [ '6b17d1f2 e12c4247 f8bce6e5 63a440f2 77037d81 2deb33a0 f4a13945 d898c296', '4fe342e2 fe1a7f9b 8ee7eb4a 7c0f9e16 2bce3357 6b315ece cbb64068 37bf51f5' ] }); defineCurve('p384', { type: 'short', prime: null, p: 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ' + 'fffffffe ffffffff 00000000 00000000 ffffffff', a: 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ' + 'fffffffe ffffffff 00000000 00000000 fffffffc', b: 'b3312fa7 e23ee7e4 988e056b e3f82d19 181d9c6e fe814112 0314088f ' + '5013875a c656398d 8a2ed19d 2a85c8ed d3ec2aef', n: 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff c7634d81 ' + 'f4372ddf 581a0db2 48b0a77a ecec196a ccc52973', hash: hash.sha384, gRed: false, g: [ 'aa87ca22 be8b0537 8eb1c71e f320ad74 6e1d3b62 8ba79b98 59f741e0 82542a38 ' + '5502f25d bf55296c 3a545e38 72760ab7', '3617de4a 96262c6f 5d9e98bf 9292dc29 f8f41dbd 289a147c e9da3113 b5f0b8c0 ' + '0a60b1ce 1d7e819d 7a431d7c 90ea0e5f' ] }); defineCurve('p521', { type: 'short', prime: null, p: '000001ff ffffffff ffffffff ffffffff ffffffff ffffffff ' + 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ' + 'ffffffff ffffffff ffffffff ffffffff ffffffff', a: '000001ff ffffffff ffffffff ffffffff ffffffff ffffffff ' + 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ' + 'ffffffff ffffffff ffffffff ffffffff fffffffc', b: '00000051 953eb961 8e1c9a1f 929a21a0 b68540ee a2da725b ' + '99b315f3 b8b48991 8ef109e1 56193951 ec7e937b 1652c0bd ' + '3bb1bf07 3573df88 3d2c34f1 ef451fd4 6b503f00', n: '000001ff ffffffff ffffffff ffffffff ffffffff ffffffff ' + 'ffffffff ffffffff fffffffa 51868783 bf2f966b 7fcc0148 ' + 'f709a5d0 3bb5c9b8 899c47ae bb6fb71e 91386409', hash: hash.sha512, gRed: false, g: [ '000000c6 858e06b7 0404e9cd 9e3ecb66 2395b442 9c648139 ' + '053fb521 f828af60 6b4d3dba a14b5e77 efe75928 fe1dc127 ' + 'a2ffa8de 3348b3c1 856a429b f97e7e31 c2e5bd66', '00000118 39296a78 9a3bc004 5c8a5fb4 2c7d1bd9 98f54449 ' + '579b4468 17afbd17 273e662c 97ee7299 5ef42640 c550b901 ' + '3fad0761 353c7086 a272c240 88be9476 9fd16650' ] }); defineCurve('curve25519', { type: 'mont', prime: 'p25519', p: '7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed', a: '76d06', b: '0', n: '1000000000000000 0000000000000000 14def9dea2f79cd6 5812631a5cf5d3ed', hash: hash.sha256, gRed: false, g: [ '9' ] }); defineCurve('ed25519', { type: 'edwards', prime: 'p25519', p: '7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed', a: '-1', c: '1', // -121665 * (121666^(-1)) (mod P) d: '52036cee2b6ffe73 8cc740797779e898 00700a4d4141d8ab 75eb4dca135978a3', n: '1000000000000000 0000000000000000 14def9dea2f79cd6 5812631a5cf5d3ed', hash: hash.sha256, gRed: false, g: [ '216936d3cd6e53fec0a4e231fdd6dc5c692cc7609525a7b2c9562d608f25d51a', // 4/5 '6666666666666666666666666666666666666666666666666666666666666658' ] }); var pre; try { pre = require('./precomputed/secp256k1'); } catch (e) { pre = undefined; } defineCurve('secp256k1', { type: 'short', prime: 'k256', p: 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f', a: '0', b: '7', n: 'ffffffff ffffffff ffffffff fffffffe baaedce6 af48a03b bfd25e8c d0364141', h: '1', hash: hash.sha256, // Precomputed endomorphism beta: '7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee', lambda: '5363ad4cc05c30e0a5261c028812645a122e22ea20816678df02967c1b23bd72', basis: [ { a: '3086d221a7d46bcde86c90e49284eb15', b: '-e4437ed6010e88286f547fa90abfe4c3' }, { a: '114ca50f7a8e2f3f657c1108d9d44cfd8', b: '3086d221a7d46bcde86c90e49284eb15' } ], gRed: false, g: [ '79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798', '483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8', pre ] }); },{"../elliptic":65,"./precomputed/secp256k1":79,"hash.js":84}],72:[function(require,module,exports){ 'use strict'; var BN = require('bn.js'); var elliptic = require('../../elliptic'); var utils = elliptic.utils; var assert = utils.assert; var KeyPair = require('./key'); var Signature = require('./signature'); function EC(options) { if (!(this instanceof EC)) return new EC(options); // Shortcut `elliptic.ec(curve-name)` if (typeof options === 'string') { assert(elliptic.curves.hasOwnProperty(options), 'Unknown curve ' + options); options = elliptic.curves[options]; } // Shortcut for `elliptic.ec(elliptic.curves.curveName)` if (options instanceof elliptic.curves.PresetCurve) options = { curve: options }; this.curve = options.curve.curve; this.n = this.curve.n; this.nh = this.n.ushrn(1); this.g = this.curve.g; // Point on curve this.g = options.curve.g; this.g.precompute(options.curve.n.bitLength() + 1); // Hash for function for DRBG this.hash = options.hash || options.curve.hash; } module.exports = EC; EC.prototype.keyPair = function keyPair(options) { return new KeyPair(this, options); }; EC.prototype.keyFromPrivate = function keyFromPrivate(priv, enc) { return KeyPair.fromPrivate(this, priv, enc); }; EC.prototype.keyFromPublic = function keyFromPublic(pub, enc) { return KeyPair.fromPublic(this, pub, enc); }; EC.prototype.genKeyPair = function genKeyPair(options) { if (!options) options = {}; // Instantiate Hmac_DRBG var drbg = new elliptic.hmacDRBG({ hash: this.hash, pers: options.pers, entropy: options.entropy || elliptic.rand(this.hash.hmacStrength), nonce: this.n.toArray() }); var bytes = this.n.byteLength(); var ns2 = this.n.sub(new BN(2)); do { var priv = new BN(drbg.generate(bytes)); if (priv.cmp(ns2) > 0) continue; priv.iaddn(1); return this.keyFromPrivate(priv); } while (true); }; EC.prototype._truncateToN = function truncateToN(msg, truncOnly) { var delta = msg.byteLength() * 8 - this.n.bitLength(); if (delta > 0) msg = msg.ushrn(delta); if (!truncOnly && msg.cmp(this.n) >= 0) return msg.sub(this.n); else return msg; }; EC.prototype.sign = function sign(msg, key, enc, options) { if (typeof enc === 'object') { options = enc; enc = null; } if (!options) options = {}; key = this.keyFromPrivate(key, enc); msg = this._truncateToN(new BN(msg, 16)); // Zero-extend key to provide enough entropy var bytes = this.n.byteLength(); var bkey = key.getPrivate().toArray('be', bytes); // Zero-extend nonce to have the same byte size as N var nonce = msg.toArray('be', bytes); // Instantiate Hmac_DRBG var drbg = new elliptic.hmacDRBG({ hash: this.hash, entropy: bkey, nonce: nonce, pers: options.pers, persEnc: options.persEnc }); // Number of bytes to generate var ns1 = this.n.sub(new BN(1)); for (var iter = 0; true; iter++) { var k = options.k ? options.k(iter) : new BN(drbg.generate(this.n.byteLength())); k = this._truncateToN(k, true); if (k.cmpn(1) <= 0="" ||="" k.cmp(ns1)="">= 0) continue; var kp = this.g.mul(k); if (kp.isInfinity()) continue; var kpX = kp.getX(); var r = kpX.umod(this.n); if (r.cmpn(0) === 0) continue; var s = k.invm(this.n).mul(r.mul(key.getPrivate()).iadd(msg)); s = s.umod(this.n); if (s.cmpn(0) === 0) continue; var recoveryParam = (kp.getY().isOdd() ? 1 : 0) | (kpX.cmp(r) !== 0 ? 2 : 0); // Use complement of `s`, if it is > `n / 2` if (options.canonical && s.cmp(this.nh) > 0) { s = this.n.sub(s); recoveryParam ^= 1; } return new Signature({ r: r, s: s, recoveryParam: recoveryParam }); } }; EC.prototype.verify = function verify(msg, signature, key, enc) { msg = this._truncateToN(new BN(msg, 16)); key = this.keyFromPublic(key, enc); signature = new Signature(signature, 'hex'); // Perform primitive values validation var r = signature.r; var s = signature.s; if (r.cmpn(1) < 0 || r.cmp(this.n) >= 0) return false; if (s.cmpn(1) < 0 || s.cmp(this.n) >= 0) return false; // Validate signature var sinv = s.invm(this.n); var u1 = sinv.mul(msg).umod(this.n); var u2 = sinv.mul(r).umod(this.n); var p = this.g.mulAdd(u1, key.getPublic(), u2); if (p.isInfinity()) return false; return p.getX().umod(this.n).cmp(r) === 0; }; EC.prototype.recoverPubKey = function(msg, signature, j, enc) { assert((3 & j) === j, 'The recovery param is more than two bits'); signature = new Signature(signature, enc); var n = this.n; var e = new BN(msg); var r = signature.r; var s = signature.s; // A set LSB signifies that the y-coordinate is odd var isYOdd = j & 1; var isSecondKey = j >> 1; if (r.cmp(this.curve.p.umod(this.curve.n)) >= 0 && isSecondKey) throw new Error('Unable to find sencond key candinate'); // 1.1. Let x = r + jn. if (isSecondKey) r = this.curve.pointFromX(r.add(this.curve.n), isYOdd); else r = this.curve.pointFromX(r, isYOdd); var eNeg = n.sub(e); // 1.6.1 Compute Q = r^-1 (sR - eG) // Q = r^-1 (sR + -eG) var rInv = signature.r.invm(n); return this.g.mulAdd(eNeg, r, s).mul(rInv); }; EC.prototype.getKeyRecoveryParam = function(e, signature, Q, enc) { signature = new Signature(signature, enc); if (signature.recoveryParam !== null) return signature.recoveryParam; for (var i = 0; i < 4; i++) { var Qprime; try { Qprime = this.recoverPubKey(e, signature, i); } catch (e) { continue; } if (Qprime.eq(Q)) return i; } throw new Error('Unable to find valid recovery factor'); }; },{"../../elliptic":65,"./key":73,"./signature":74,"bn.js":17}],73:[function(require,module,exports){ 'use strict'; var BN = require('bn.js'); function KeyPair(ec, options) { this.ec = ec; this.priv = null; this.pub = null; // KeyPair(ec, { priv: ..., pub: ... }) if (options.priv) this._importPrivate(options.priv, options.privEnc); if (options.pub) this._importPublic(options.pub, options.pubEnc); } module.exports = KeyPair; KeyPair.fromPublic = function fromPublic(ec, pub, enc) { if (pub instanceof KeyPair) return pub; return new KeyPair(ec, { pub: pub, pubEnc: enc }); }; KeyPair.fromPrivate = function fromPrivate(ec, priv, enc) { if (priv instanceof KeyPair) return priv; return new KeyPair(ec, { priv: priv, privEnc: enc }); }; KeyPair.prototype.validate = function validate() { var pub = this.getPublic(); if (pub.isInfinity()) return { result: false, reason: 'Invalid public key' }; if (!pub.validate()) return { result: false, reason: 'Public key is not a point' }; if (!pub.mul(this.ec.curve.n).isInfinity()) return { result: false, reason: 'Public key * N != O' }; return { result: true, reason: null }; }; KeyPair.prototype.getPublic = function getPublic(compact, enc) { // compact is optional argument if (typeof compact === 'string') { enc = compact; compact = null; } if (!this.pub) this.pub = this.ec.g.mul(this.priv); if (!enc) return this.pub; return this.pub.encode(enc, compact); }; KeyPair.prototype.getPrivate = function getPrivate(enc) { if (enc === 'hex') return this.priv.toString(16, 2); else return this.priv; }; KeyPair.prototype._importPrivate = function _importPrivate(key, enc) { this.priv = new BN(key, enc || 16); // Ensure that the priv won't be bigger than n, otherwise we may fail // in fixed multiplication method this.priv = this.priv.umod(this.ec.curve.n); }; KeyPair.prototype._importPublic = function _importPublic(key, enc) { if (key.x || key.y) { this.pub = this.ec.curve.point(key.x, key.y); return; } this.pub = this.ec.curve.decodePoint(key, enc); }; // ECDH KeyPair.prototype.derive = function derive(pub) { return pub.mul(this.priv).getX(); }; // ECDSA KeyPair.prototype.sign = function sign(msg, enc, options) { return this.ec.sign(msg, this, enc, options); }; KeyPair.prototype.verify = function verify(msg, signature) { return this.ec.verify(msg, signature, this); }; KeyPair.prototype.inspect = function inspect() { return ''; }; },{"bn.js":17}],74:[function(require,module,exports){ 'use strict'; var BN = require('bn.js'); var elliptic = require('../../elliptic'); var utils = elliptic.utils; var assert = utils.assert; function Signature(options, enc) { if (options instanceof Signature) return options; if (this._importDER(options, enc)) return; assert(options.r && options.s, 'Signature without r or s'); this.r = new BN(options.r, 16); this.s = new BN(options.s, 16); if (options.recoveryParam === undefined) this.recoveryParam = null; else this.recoveryParam = options.recoveryParam; } module.exports = Signature; function Position() { this.place = 0; } function getLength(buf, p) { var initial = buf[p.place++]; if (!(initial & 0x80)) { return initial; } var octetLen = initial & 0xf; var val = 0; for (var i = 0, off = p.place; i < octetLen; i++, off++) { val <<= 0="" 8;="" val="" |="buf[off];" }="" p.place="off;" return="" val;="" function="" rmpadding(buf)="" {="" var="" i="0;" len="buf.length" -="" 1;="" while="" (!buf[i]="" &&="" !(buf[i="" +="" 1]="" &="" 0x80)="" <="" len)="" i++;="" if="" (i="==" 0)="" buf;="" buf.slice(i);="" signature.prototype._importder="function" _importder(data,="" enc)="" data="utils.toArray(data," enc);="" p="new" position();="" (data[p.place++]="" !="=" 0x30)="" false;="" p);="" ((len="" p.place)="" data.length)="" 0x02)="" rlen="getLength(data," r="data.slice(p.place," p.place);="" slen="getLength(data," (data.length="" s="data.slice(p.place," (r[0]="==" (r[1]="" 0x80))="" (s[0]="==" (s[1]="" this.r="new" bn(r);="" this.s="new" bn(s);="" this.recoveryparam="null;" true;="" };="" constructlength(arr,="" (len="" arr.push(len);="" return;="" octets="1" (math.log(len)="" math.ln2="">>> 3); arr.push(octets | 0x80); while (--octets) { arr.push((len >>> (octets << 3)) & 0xff); } arr.push(len); } Signature.prototype.toDER = function toDER(enc) { var r = this.r.toArray(); var s = this.s.toArray(); // Pad values if (r[0] & 0x80) r = [ 0 ].concat(r); // Pad values if (s[0] & 0x80) s = [ 0 ].concat(s); r = rmPadding(r); s = rmPadding(s); while (!s[0] && !(s[1] & 0x80)) { s = s.slice(1); } var arr = [ 0x02 ]; constructLength(arr, r.length); arr = arr.concat(r); arr.push(0x02); constructLength(arr, s.length); var backHalf = arr.concat(s); var res = [ 0x30 ]; constructLength(res, backHalf.length); res = res.concat(backHalf); return utils.encode(res, enc); }; },{"../../elliptic":65,"bn.js":17}],75:[function(require,module,exports){ 'use strict'; var hash = require('hash.js'); var elliptic = require('../../elliptic'); var utils = elliptic.utils; var assert = utils.assert; var parseBytes = utils.parseBytes; var KeyPair = require('./key'); var Signature = require('./signature'); function EDDSA(curve) { assert(curve === 'ed25519', 'only tested with ed25519 so far'); if (!(this instanceof EDDSA)) return new EDDSA(curve); var curve = elliptic.curves[curve].curve; this.curve = curve; this.g = curve.g; this.g.precompute(curve.n.bitLength() + 1); this.pointClass = curve.point().constructor; this.encodingLength = Math.ceil(curve.n.bitLength() / 8); this.hash = hash.sha512; } module.exports = EDDSA; /** * @param {Array|String} message - message bytes * @param {Array|String|KeyPair} secret - secret bytes or a keypair * @returns {Signature} - signature */ EDDSA.prototype.sign = function sign(message, secret) { message = parseBytes(message); var key = this.keyFromSecret(secret); var r = this.hashInt(key.messagePrefix(), message); var R = this.g.mul(r); var Rencoded = this.encodePoint(R); var s_ = this.hashInt(Rencoded, key.pubBytes(), message) .mul(key.priv()); var S = r.add(s_).umod(this.curve.n); return this.makeSignature({ R: R, S: S, Rencoded: Rencoded }); }; /** * @param {Array} message - message bytes * @param {Array|String|Signature} sig - sig bytes * @param {Array|String|Point|KeyPair} pub - public key * @returns {Boolean} - true if public key matches sig of message */ EDDSA.prototype.verify = function verify(message, sig, pub) { message = parseBytes(message); sig = this.makeSignature(sig); var key = this.keyFromPublic(pub); var h = this.hashInt(sig.Rencoded(), key.pubBytes(), message); var SG = this.g.mul(sig.S()); var RplusAh = sig.R().add(key.pub().mul(h)); return RplusAh.eq(SG); }; EDDSA.prototype.hashInt = function hashInt() { var hash = this.hash(); for (var i = 0; i < arguments.length; i++) hash.update(arguments[i]); return utils.intFromLE(hash.digest()).umod(this.curve.n); }; EDDSA.prototype.keyFromPublic = function keyFromPublic(pub) { return KeyPair.fromPublic(this, pub); }; EDDSA.prototype.keyFromSecret = function keyFromSecret(secret) { return KeyPair.fromSecret(this, secret); }; EDDSA.prototype.makeSignature = function makeSignature(sig) { if (sig instanceof Signature) return sig; return new Signature(this, sig); }; /** * * https://tools.ietf.org/html/draft-josefsson-eddsa-ed25519-03#section-5.2 * * EDDSA defines methods for encoding and decoding points and integers. These are * helper convenience methods, that pass along to utility functions implied * parameters. * */ EDDSA.prototype.encodePoint = function encodePoint(point) { var enc = point.getY().toArray('le', this.encodingLength); enc[this.encodingLength - 1] |= point.getX().isOdd() ? 0x80 : 0; return enc; }; EDDSA.prototype.decodePoint = function decodePoint(bytes) { bytes = utils.parseBytes(bytes); var lastIx = bytes.length - 1; var normed = bytes.slice(0, lastIx).concat(bytes[lastIx] & ~0x80); var xIsOdd = (bytes[lastIx] & 0x80) !== 0; var y = utils.intFromLE(normed); return this.curve.pointFromY(y, xIsOdd); }; EDDSA.prototype.encodeInt = function encodeInt(num) { return num.toArray('le', this.encodingLength); }; EDDSA.prototype.decodeInt = function decodeInt(bytes) { return utils.intFromLE(bytes); }; EDDSA.prototype.isPoint = function isPoint(val) { return val instanceof this.pointClass; }; },{"../../elliptic":65,"./key":76,"./signature":77,"hash.js":84}],76:[function(require,module,exports){ 'use strict'; var elliptic = require('../../elliptic'); var utils = elliptic.utils; var assert = utils.assert; var parseBytes = utils.parseBytes; var cachedProperty = utils.cachedProperty; /** * @param {EDDSA} eddsa - instance * @param {Object} params - public/private key parameters * * @param {Array} [params.secret] - secret seed bytes * @param {Point} [params.pub] - public key point (aka `A` in eddsa terms) * @param {Array} [params.pub] - public key point encoded as bytes * */ function KeyPair(eddsa, params) { this.eddsa = eddsa; this._secret = parseBytes(params.secret); if (eddsa.isPoint(params.pub)) this._pub = params.pub; else this._pubBytes = parseBytes(params.pub); } KeyPair.fromPublic = function fromPublic(eddsa, pub) { if (pub instanceof KeyPair) return pub; return new KeyPair(eddsa, { pub: pub }); }; KeyPair.fromSecret = function fromSecret(eddsa, secret) { if (secret instanceof KeyPair) return secret; return new KeyPair(eddsa, { secret: secret }); }; KeyPair.prototype.secret = function secret() { return this._secret; }; cachedProperty(KeyPair, function pubBytes() { return this.eddsa.encodePoint(this.pub()); }); cachedProperty(KeyPair, function pub() { if (this._pubBytes) return this.eddsa.decodePoint(this._pubBytes); return this.eddsa.g.mul(this.priv()); }); cachedProperty(KeyPair, function privBytes() { var eddsa = this.eddsa; var hash = this.hash(); var lastIx = eddsa.encodingLength - 1; var a = hash.slice(0, eddsa.encodingLength); a[0] &= 248; a[lastIx] &= 127; a[lastIx] |= 64; return a; }); cachedProperty(KeyPair, function priv() { return this.eddsa.decodeInt(this.privBytes()); }); cachedProperty(KeyPair, function hash() { return this.eddsa.hash().update(this.secret()).digest(); }); cachedProperty(KeyPair, function messagePrefix() { return this.hash().slice(this.eddsa.encodingLength); }); KeyPair.prototype.sign = function sign(message) { assert(this._secret, 'KeyPair can only verify'); return this.eddsa.sign(message, this); }; KeyPair.prototype.verify = function verify(message, sig) { return this.eddsa.verify(message, sig, this); }; KeyPair.prototype.getSecret = function getSecret(enc) { assert(this._secret, 'KeyPair is public only'); return utils.encode(this.secret(), enc); }; KeyPair.prototype.getPublic = function getPublic(enc) { return utils.encode(this.pubBytes(), enc); }; module.exports = KeyPair; },{"../../elliptic":65}],77:[function(require,module,exports){ 'use strict'; var BN = require('bn.js'); var elliptic = require('../../elliptic'); var utils = elliptic.utils; var assert = utils.assert; var cachedProperty = utils.cachedProperty; var parseBytes = utils.parseBytes; /** * @param {EDDSA} eddsa - eddsa instance * @param {Array|Object} sig - * @param {Array|Point} [sig.R] - R point as Point or bytes * @param {Array|bn} [sig.S] - S scalar as bn or bytes * @param {Array} [sig.Rencoded] - R point encoded * @param {Array} [sig.Sencoded] - S scalar encoded */ function Signature(eddsa, sig) { this.eddsa = eddsa; if (typeof sig !== 'object') sig = parseBytes(sig); if (Array.isArray(sig)) { sig = { R: sig.slice(0, eddsa.encodingLength), S: sig.slice(eddsa.encodingLength) }; } assert(sig.R && sig.S, 'Signature without R or S'); if (eddsa.isPoint(sig.R)) this._R = sig.R; if (sig.S instanceof BN) this._S = sig.S; this._Rencoded = Array.isArray(sig.R) ? sig.R : sig.Rencoded; this._Sencoded = Array.isArray(sig.S) ? sig.S : sig.Sencoded; } cachedProperty(Signature, function S() { return this.eddsa.decodeInt(this.Sencoded()); }); cachedProperty(Signature, function R() { return this.eddsa.decodePoint(this.Rencoded()); }); cachedProperty(Signature, function Rencoded() { return this.eddsa.encodePoint(this.R()); }); cachedProperty(Signature, function Sencoded() { return this.eddsa.encodeInt(this.S()); }); Signature.prototype.toBytes = function toBytes() { return this.Rencoded().concat(this.Sencoded()); }; Signature.prototype.toHex = function toHex() { return utils.encode(this.toBytes(), 'hex').toUpperCase(); }; module.exports = Signature; },{"../../elliptic":65,"bn.js":17}],78:[function(require,module,exports){ 'use strict'; var hash = require('hash.js'); var elliptic = require('../elliptic'); var utils = elliptic.utils; var assert = utils.assert; function HmacDRBG(options) { if (!(this instanceof HmacDRBG)) return new HmacDRBG(options); this.hash = options.hash; this.predResist = !!options.predResist; this.outLen = this.hash.outSize; this.minEntropy = options.minEntropy || this.hash.hmacStrength; this.reseed = null; this.reseedInterval = null; this.K = null; this.V = null; var entropy = utils.toArray(options.entropy, options.entropyEnc); var nonce = utils.toArray(options.nonce, options.nonceEnc); var pers = utils.toArray(options.pers, options.persEnc); assert(entropy.length >= (this.minEntropy / 8), 'Not enough entropy. Minimum is: ' + this.minEntropy + ' bits'); this._init(entropy, nonce, pers); } module.exports = HmacDRBG; HmacDRBG.prototype._init = function init(entropy, nonce, pers) { var seed = entropy.concat(nonce).concat(pers); this.K = new Array(this.outLen / 8); this.V = new Array(this.outLen / 8); for (var i = 0; i < this.V.length; i++) { this.K[i] = 0x00; this.V[i] = 0x01; } this._update(seed); this.reseed = 1; this.reseedInterval = 0x1000000000000; // 2^48 }; HmacDRBG.prototype._hmac = function hmac() { return new hash.hmac(this.hash, this.K); }; HmacDRBG.prototype._update = function update(seed) { var kmac = this._hmac() .update(this.V) .update([ 0x00 ]); if (seed) kmac = kmac.update(seed); this.K = kmac.digest(); this.V = this._hmac().update(this.V).digest(); if (!seed) return; this.K = this._hmac() .update(this.V) .update([ 0x01 ]) .update(seed) .digest(); this.V = this._hmac().update(this.V).digest(); }; HmacDRBG.prototype.reseed = function reseed(entropy, entropyEnc, add, addEnc) { // Optional entropy enc if (typeof entropyEnc !== 'string') { addEnc = add; add = entropyEnc; entropyEnc = null; } entropy = utils.toBuffer(entropy, entropyEnc); add = utils.toBuffer(add, addEnc); assert(entropy.length >= (this.minEntropy / 8), 'Not enough entropy. Minimum is: ' + this.minEntropy + ' bits'); this._update(entropy.concat(add || [])); this.reseed = 1; }; HmacDRBG.prototype.generate = function generate(len, enc, add, addEnc) { if (this.reseed > this.reseedInterval) throw new Error('Reseed is required'); // Optional encoding if (typeof enc !== 'string') { addEnc = add; add = enc; enc = null; } // Optional additional data if (add) { add = utils.toArray(add, addEnc); this._update(add); } var temp = []; while (temp.length < len) { this.V = this._hmac().update(this.V).digest(); temp = temp.concat(this.V); } var res = temp.slice(0, len); this._update(add); this.reseed++; return utils.encode(res, enc); }; },{"../elliptic":65,"hash.js":84}],79:[function(require,module,exports){ module.exports = { doubles: { step: 4, points: [ [ 'e60fce93b59e9ec53011aabc21c23e97b2a31369b87a5ae9c44ee89e2a6dec0a', 'f7e3507399e595929db99f34f57937101296891e44d23f0be1f32cce69616821' ], [ '8282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508', '11f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf' ], [ '175e159f728b865a72f99cc6c6fc846de0b93833fd2222ed73fce5b551e5b739', 'd3506e0d9e3c79eba4ef97a51ff71f5eacb5955add24345c6efa6ffee9fed695' ], [ '363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640', '4e273adfc732221953b445397f3363145b9a89008199ecb62003c7f3bee9de9' ], [ '8b4b5f165df3c2be8c6244b5b745638843e4a781a15bcd1b69f79a55dffdf80c', '4aad0a6f68d308b4b3fbd7813ab0da04f9e336546162ee56b3eff0c65fd4fd36' ], [ '723cbaa6e5db996d6bf771c00bd548c7b700dbffa6c0e77bcb6115925232fcda', '96e867b5595cc498a921137488824d6e2660a0653779494801dc069d9eb39f5f' ], [ 'eebfa4d493bebf98ba5feec812c2d3b50947961237a919839a533eca0e7dd7fa', '5d9a8ca3970ef0f269ee7edaf178089d9ae4cdc3a711f712ddfd4fdae1de8999' ], [ '100f44da696e71672791d0a09b7bde459f1215a29b3c03bfefd7835b39a48db0', 'cdd9e13192a00b772ec8f3300c090666b7ff4a18ff5195ac0fbd5cd62bc65a09' ], [ 'e1031be262c7ed1b1dc9227a4a04c017a77f8d4464f3b3852c8acde6e534fd2d', '9d7061928940405e6bb6a4176597535af292dd419e1ced79a44f18f29456a00d' ], [ 'feea6cae46d55b530ac2839f143bd7ec5cf8b266a41d6af52d5e688d9094696d', 'e57c6b6c97dce1bab06e4e12bf3ecd5c981c8957cc41442d3155debf18090088' ], [ 'da67a91d91049cdcb367be4be6ffca3cfeed657d808583de33fa978bc1ec6cb1', '9bacaa35481642bc41f463f7ec9780e5dec7adc508f740a17e9ea8e27a68be1d' ], [ '53904faa0b334cdda6e000935ef22151ec08d0f7bb11069f57545ccc1a37b7c0', '5bc087d0bc80106d88c9eccac20d3c1c13999981e14434699dcb096b022771c8' ], [ '8e7bcd0bd35983a7719cca7764ca906779b53a043a9b8bcaeff959f43ad86047', '10b7770b2a3da4b3940310420ca9514579e88e2e47fd68b3ea10047e8460372a' ], [ '385eed34c1cdff21e6d0818689b81bde71a7f4f18397e6690a841e1599c43862', '283bebc3e8ea23f56701de19e9ebf4576b304eec2086dc8cc0458fe5542e5453' ], [ '6f9d9b803ecf191637c73a4413dfa180fddf84a5947fbc9c606ed86c3fac3a7', '7c80c68e603059ba69b8e2a30e45c4d47ea4dd2f5c281002d86890603a842160' ], [ '3322d401243c4e2582a2147c104d6ecbf774d163db0f5e5313b7e0e742d0e6bd', '56e70797e9664ef5bfb019bc4ddaf9b72805f63ea2873af624f3a2e96c28b2a0' ], [ '85672c7d2de0b7da2bd1770d89665868741b3f9af7643397721d74d28134ab83', '7c481b9b5b43b2eb6374049bfa62c2e5e77f17fcc5298f44c8e3094f790313a6' ], [ '948bf809b1988a46b06c9f1919413b10f9226c60f668832ffd959af60c82a0a', '53a562856dcb6646dc6b74c5d1c3418c6d4dff08c97cd2bed4cb7f88d8c8e589' ], [ '6260ce7f461801c34f067ce0f02873a8f1b0e44dfc69752accecd819f38fd8e8', 'bc2da82b6fa5b571a7f09049776a1ef7ecd292238051c198c1a84e95b2b4ae17' ], [ 'e5037de0afc1d8d43d8348414bbf4103043ec8f575bfdc432953cc8d2037fa2d', '4571534baa94d3b5f9f98d09fb990bddbd5f5b03ec481f10e0e5dc841d755bda' ], [ 'e06372b0f4a207adf5ea905e8f1771b4e7e8dbd1c6a6c5b725866a0ae4fce725', '7a908974bce18cfe12a27bb2ad5a488cd7484a7787104870b27034f94eee31dd' ], [ '213c7a715cd5d45358d0bbf9dc0ce02204b10bdde2a3f58540ad6908d0559754', '4b6dad0b5ae462507013ad06245ba190bb4850f5f36a7eeddff2c27534b458f2' ], [ '4e7c272a7af4b34e8dbb9352a5419a87e2838c70adc62cddf0cc3a3b08fbd53c', '17749c766c9d0b18e16fd09f6def681b530b9614bff7dd33e0b3941817dcaae6' ], [ 'fea74e3dbe778b1b10f238ad61686aa5c76e3db2be43057632427e2840fb27b6', '6e0568db9b0b13297cf674deccb6af93126b596b973f7b77701d3db7f23cb96f' ], [ '76e64113f677cf0e10a2570d599968d31544e179b760432952c02a4417bdde39', 'c90ddf8dee4e95cf577066d70681f0d35e2a33d2b56d2032b4b1752d1901ac01' ], [ 'c738c56b03b2abe1e8281baa743f8f9a8f7cc643df26cbee3ab150242bcbb891', '893fb578951ad2537f718f2eacbfbbbb82314eef7880cfe917e735d9699a84c3' ], [ 'd895626548b65b81e264c7637c972877d1d72e5f3a925014372e9f6588f6c14b', 'febfaa38f2bc7eae728ec60818c340eb03428d632bb067e179363ed75d7d991f' ], [ 'b8da94032a957518eb0f6433571e8761ceffc73693e84edd49150a564f676e03', '2804dfa44805a1e4d7c99cc9762808b092cc584d95ff3b511488e4e74efdf6e7' ], [ 'e80fea14441fb33a7d8adab9475d7fab2019effb5156a792f1a11778e3c0df5d', 'eed1de7f638e00771e89768ca3ca94472d155e80af322ea9fcb4291b6ac9ec78' ], [ 'a301697bdfcd704313ba48e51d567543f2a182031efd6915ddc07bbcc4e16070', '7370f91cfb67e4f5081809fa25d40f9b1735dbf7c0a11a130c0d1a041e177ea1' ], [ '90ad85b389d6b936463f9d0512678de208cc330b11307fffab7ac63e3fb04ed4', 'e507a3620a38261affdcbd9427222b839aefabe1582894d991d4d48cb6ef150' ], [ '8f68b9d2f63b5f339239c1ad981f162ee88c5678723ea3351b7b444c9ec4c0da', '662a9f2dba063986de1d90c2b6be215dbbea2cfe95510bfdf23cbf79501fff82' ], [ 'e4f3fb0176af85d65ff99ff9198c36091f48e86503681e3e6686fd5053231e11', '1e63633ad0ef4f1c1661a6d0ea02b7286cc7e74ec951d1c9822c38576feb73bc' ], [ '8c00fa9b18ebf331eb961537a45a4266c7034f2f0d4e1d0716fb6eae20eae29e', 'efa47267fea521a1a9dc343a3736c974c2fadafa81e36c54e7d2a4c66702414b' ], [ 'e7a26ce69dd4829f3e10cec0a9e98ed3143d084f308b92c0997fddfc60cb3e41', '2a758e300fa7984b471b006a1aafbb18d0a6b2c0420e83e20e8a9421cf2cfd51' ], [ 'b6459e0ee3662ec8d23540c223bcbdc571cbcb967d79424f3cf29eb3de6b80ef', '67c876d06f3e06de1dadf16e5661db3c4b3ae6d48e35b2ff30bf0b61a71ba45' ], [ 'd68a80c8280bb840793234aa118f06231d6f1fc67e73c5a5deda0f5b496943e8', 'db8ba9fff4b586d00c4b1f9177b0e28b5b0e7b8f7845295a294c84266b133120' ], [ '324aed7df65c804252dc0270907a30b09612aeb973449cea4095980fc28d3d5d', '648a365774b61f2ff130c0c35aec1f4f19213b0c7e332843967224af96ab7c84' ], [ '4df9c14919cde61f6d51dfdbe5fee5dceec4143ba8d1ca888e8bd373fd054c96', '35ec51092d8728050974c23a1d85d4b5d506cdc288490192ebac06cad10d5d' ], [ '9c3919a84a474870faed8a9c1cc66021523489054d7f0308cbfc99c8ac1f98cd', 'ddb84f0f4a4ddd57584f044bf260e641905326f76c64c8e6be7e5e03d4fc599d' ], [ '6057170b1dd12fdf8de05f281d8e06bb91e1493a8b91d4cc5a21382120a959e5', '9a1af0b26a6a4807add9a2daf71df262465152bc3ee24c65e899be932385a2a8' ], [ 'a576df8e23a08411421439a4518da31880cef0fba7d4df12b1a6973eecb94266', '40a6bf20e76640b2c92b97afe58cd82c432e10a7f514d9f3ee8be11ae1b28ec8' ], [ '7778a78c28dec3e30a05fe9629de8c38bb30d1f5cf9a3a208f763889be58ad71', '34626d9ab5a5b22ff7098e12f2ff580087b38411ff24ac563b513fc1fd9f43ac' ], [ '928955ee637a84463729fd30e7afd2ed5f96274e5ad7e5cb09eda9c06d903ac', 'c25621003d3f42a827b78a13093a95eeac3d26efa8a8d83fc5180e935bcd091f' ], [ '85d0fef3ec6db109399064f3a0e3b2855645b4a907ad354527aae75163d82751', '1f03648413a38c0be29d496e582cf5663e8751e96877331582c237a24eb1f962' ], [ 'ff2b0dce97eece97c1c9b6041798b85dfdfb6d8882da20308f5404824526087e', '493d13fef524ba188af4c4dc54d07936c7b7ed6fb90e2ceb2c951e01f0c29907' ], [ '827fbbe4b1e880ea9ed2b2e6301b212b57f1ee148cd6dd28780e5e2cf856e241', 'c60f9c923c727b0b71bef2c67d1d12687ff7a63186903166d605b68baec293ec' ], [ 'eaa649f21f51bdbae7be4ae34ce6e5217a58fdce7f47f9aa7f3b58fa2120e2b3', 'be3279ed5bbbb03ac69a80f89879aa5a01a6b965f13f7e59d47a5305ba5ad93d' ], [ 'e4a42d43c5cf169d9391df6decf42ee541b6d8f0c9a137401e23632dda34d24f', '4d9f92e716d1c73526fc99ccfb8ad34ce886eedfa8d8e4f13a7f7131deba9414' ], [ '1ec80fef360cbdd954160fadab352b6b92b53576a88fea4947173b9d4300bf19', 'aeefe93756b5340d2f3a4958a7abbf5e0146e77f6295a07b671cdc1cc107cefd' ], [ '146a778c04670c2f91b00af4680dfa8bce3490717d58ba889ddb5928366642be', 'b318e0ec3354028add669827f9d4b2870aaa971d2f7e5ed1d0b297483d83efd0' ], [ 'fa50c0f61d22e5f07e3acebb1aa07b128d0012209a28b9776d76a8793180eef9', '6b84c6922397eba9b72cd2872281a68a5e683293a57a213b38cd8d7d3f4f2811' ], [ 'da1d61d0ca721a11b1a5bf6b7d88e8421a288ab5d5bba5220e53d32b5f067ec2', '8157f55a7c99306c79c0766161c91e2966a73899d279b48a655fba0f1ad836f1' ], [ 'a8e282ff0c9706907215ff98e8fd416615311de0446f1e062a73b0610d064e13', '7f97355b8db81c09abfb7f3c5b2515888b679a3e50dd6bd6cef7c73111f4cc0c' ], [ '174a53b9c9a285872d39e56e6913cab15d59b1fa512508c022f382de8319497c', 'ccc9dc37abfc9c1657b4155f2c47f9e6646b3a1d8cb9854383da13ac079afa73' ], [ '959396981943785c3d3e57edf5018cdbe039e730e4918b3d884fdff09475b7ba', '2e7e552888c331dd8ba0386a4b9cd6849c653f64c8709385e9b8abf87524f2fd' ], [ 'd2a63a50ae401e56d645a1153b109a8fcca0a43d561fba2dbb51340c9d82b151', 'e82d86fb6443fcb7565aee58b2948220a70f750af484ca52d4142174dcf89405' ], [ '64587e2335471eb890ee7896d7cfdc866bacbdbd3839317b3436f9b45617e073', 'd99fcdd5bf6902e2ae96dd6447c299a185b90a39133aeab358299e5e9faf6589' ], [ '8481bde0e4e4d885b3a546d3e549de042f0aa6cea250e7fd358d6c86dd45e458', '38ee7b8cba5404dd84a25bf39cecb2ca900a79c42b262e556d64b1b59779057e' ], [ '13464a57a78102aa62b6979ae817f4637ffcfed3c4b1ce30bcd6303f6caf666b', '69be159004614580ef7e433453ccb0ca48f300a81d0942e13f495a907f6ecc27' ], [ 'bc4a9df5b713fe2e9aef430bcc1dc97a0cd9ccede2f28588cada3a0d2d83f366', 'd3a81ca6e785c06383937adf4b798caa6e8a9fbfa547b16d758d666581f33c1' ], [ '8c28a97bf8298bc0d23d8c749452a32e694b65e30a9472a3954ab30fe5324caa', '40a30463a3305193378fedf31f7cc0eb7ae784f0451cb9459e71dc73cbef9482' ], [ '8ea9666139527a8c1dd94ce4f071fd23c8b350c5a4bb33748c4ba111faccae0', '620efabbc8ee2782e24e7c0cfb95c5d735b783be9cf0f8e955af34a30e62b945' ], [ 'dd3625faef5ba06074669716bbd3788d89bdde815959968092f76cc4eb9a9787', '7a188fa3520e30d461da2501045731ca941461982883395937f68d00c644a573' ], [ 'f710d79d9eb962297e4f6232b40e8f7feb2bc63814614d692c12de752408221e', 'ea98e67232d3b3295d3b535532115ccac8612c721851617526ae47a9c77bfc82' ] ] }, naf: { wnd: 7, points: [ [ 'f9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9', '388f7b0f632de8140fe337e62a37f3566500a99934c2231b6cb9fd7584b8e672' ], [ '2f8bde4d1a07209355b4a7250a5c5128e88b84bddc619ab7cba8d569b240efe4', 'd8ac222636e5e3d6d4dba9dda6c9c426f788271bab0d6840dca87d3aa6ac62d6' ], [ '5cbdf0646e5db4eaa398f365f2ea7a0e3d419b7e0330e39ce92bddedcac4f9bc', '6aebca40ba255960a3178d6d861a54dba813d0b813fde7b5a5082628087264da' ], [ 'acd484e2f0c7f65309ad178a9f559abde09796974c57e714c35f110dfc27ccbe', 'cc338921b0a7d9fd64380971763b61e9add888a4375f8e0f05cc262ac64f9c37' ], [ '774ae7f858a9411e5ef4246b70c65aac5649980be5c17891bbec17895da008cb', 'd984a032eb6b5e190243dd56d7b7b365372db1e2dff9d6a8301d74c9c953c61b' ], [ 'f28773c2d975288bc7d1d205c3748651b075fbc6610e58cddeeddf8f19405aa8', 'ab0902e8d880a89758212eb65cdaf473a1a06da521fa91f29b5cb52db03ed81' ], [ 'd7924d4f7d43ea965a465ae3095ff41131e5946f3c85f79e44adbcf8e27e080e', '581e2872a86c72a683842ec228cc6defea40af2bd896d3a5c504dc9ff6a26b58' ], [ 'defdea4cdb677750a420fee807eacf21eb9898ae79b9768766e4faa04a2d4a34', '4211ab0694635168e997b0ead2a93daeced1f4a04a95c0f6cfb199f69e56eb77' ], [ '2b4ea0a797a443d293ef5cff444f4979f06acfebd7e86d277475656138385b6c', '85e89bc037945d93b343083b5a1c86131a01f60c50269763b570c854e5c09b7a' ], [ '352bbf4a4cdd12564f93fa332ce333301d9ad40271f8107181340aef25be59d5', '321eb4075348f534d59c18259dda3e1f4a1b3b2e71b1039c67bd3d8bcf81998c' ], [ '2fa2104d6b38d11b0230010559879124e42ab8dfeff5ff29dc9cdadd4ecacc3f', '2de1068295dd865b64569335bd5dd80181d70ecfc882648423ba76b532b7d67' ], [ '9248279b09b4d68dab21a9b066edda83263c3d84e09572e269ca0cd7f5453714', '73016f7bf234aade5d1aa71bdea2b1ff3fc0de2a887912ffe54a32ce97cb3402' ], [ 'daed4f2be3a8bf278e70132fb0beb7522f570e144bf615c07e996d443dee8729', 'a69dce4a7d6c98e8d4a1aca87ef8d7003f83c230f3afa726ab40e52290be1c55' ], [ 'c44d12c7065d812e8acf28d7cbb19f9011ecd9e9fdf281b0e6a3b5e87d22e7db', '2119a460ce326cdc76c45926c982fdac0e106e861edf61c5a039063f0e0e6482' ], [ '6a245bf6dc698504c89a20cfded60853152b695336c28063b61c65cbd269e6b4', 'e022cf42c2bd4a708b3f5126f16a24ad8b33ba48d0423b6efd5e6348100d8a82' ], [ '1697ffa6fd9de627c077e3d2fe541084ce13300b0bec1146f95ae57f0d0bd6a5', 'b9c398f186806f5d27561506e4557433a2cf15009e498ae7adee9d63d01b2396' ], [ '605bdb019981718b986d0f07e834cb0d9deb8360ffb7f61df982345ef27a7479', '2972d2de4f8d20681a78d93ec96fe23c26bfae84fb14db43b01e1e9056b8c49' ], [ '62d14dab4150bf497402fdc45a215e10dcb01c354959b10cfe31c7e9d87ff33d', '80fc06bd8cc5b01098088a1950eed0db01aa132967ab472235f5642483b25eaf' ], [ '80c60ad0040f27dade5b4b06c408e56b2c50e9f56b9b8b425e555c2f86308b6f', '1c38303f1cc5c30f26e66bad7fe72f70a65eed4cbe7024eb1aa01f56430bd57a' ], [ '7a9375ad6167ad54aa74c6348cc54d344cc5dc9487d847049d5eabb0fa03c8fb', 'd0e3fa9eca8726909559e0d79269046bdc59ea10c70ce2b02d499ec224dc7f7' ], [ 'd528ecd9b696b54c907a9ed045447a79bb408ec39b68df504bb51f459bc3ffc9', 'eecf41253136e5f99966f21881fd656ebc4345405c520dbc063465b521409933' ], [ '49370a4b5f43412ea25f514e8ecdad05266115e4a7ecb1387231808f8b45963', '758f3f41afd6ed428b3081b0512fd62a54c3f3afbb5b6764b653052a12949c9a' ], [ '77f230936ee88cbbd73df930d64702ef881d811e0e1498e2f1c13eb1fc345d74', '958ef42a7886b6400a08266e9ba1b37896c95330d97077cbbe8eb3c7671c60d6' ], [ 'f2dac991cc4ce4b9ea44887e5c7c0bce58c80074ab9d4dbaeb28531b7739f530', 'e0dedc9b3b2f8dad4da1f32dec2531df9eb5fbeb0598e4fd1a117dba703a3c37' ], [ '463b3d9f662621fb1b4be8fbbe2520125a216cdfc9dae3debcba4850c690d45b', '5ed430d78c296c3543114306dd8622d7c622e27c970a1de31cb377b01af7307e' ], [ 'f16f804244e46e2a09232d4aff3b59976b98fac14328a2d1a32496b49998f247', 'cedabd9b82203f7e13d206fcdf4e33d92a6c53c26e5cce26d6579962c4e31df6' ], [ 'caf754272dc84563b0352b7a14311af55d245315ace27c65369e15f7151d41d1', 'cb474660ef35f5f2a41b643fa5e460575f4fa9b7962232a5c32f908318a04476' ], [ '2600ca4b282cb986f85d0f1709979d8b44a09c07cb86d7c124497bc86f082120', '4119b88753c15bd6a693b03fcddbb45d5ac6be74ab5f0ef44b0be9475a7e4b40' ], [ '7635ca72d7e8432c338ec53cd12220bc01c48685e24f7dc8c602a7746998e435', '91b649609489d613d1d5e590f78e6d74ecfc061d57048bad9e76f302c5b9c61' ], [ '754e3239f325570cdbbf4a87deee8a66b7f2b33479d468fbc1a50743bf56cc18', '673fb86e5bda30fb3cd0ed304ea49a023ee33d0197a695d0c5d98093c536683' ], [ 'e3e6bd1071a1e96aff57859c82d570f0330800661d1c952f9fe2694691d9b9e8', '59c9e0bba394e76f40c0aa58379a3cb6a5a2283993e90c4167002af4920e37f5' ], [ '186b483d056a033826ae73d88f732985c4ccb1f32ba35f4b4cc47fdcf04aa6eb', '3b952d32c67cf77e2e17446e204180ab21fb8090895138b4a4a797f86e80888b' ], [ 'df9d70a6b9876ce544c98561f4be4f725442e6d2b737d9c91a8321724ce0963f', '55eb2dafd84d6ccd5f862b785dc39d4ab157222720ef9da217b8c45cf2ba2417' ], [ '5edd5cc23c51e87a497ca815d5dce0f8ab52554f849ed8995de64c5f34ce7143', 'efae9c8dbc14130661e8cec030c89ad0c13c66c0d17a2905cdc706ab7399a868' ], [ '290798c2b6476830da12fe02287e9e777aa3fba1c355b17a722d362f84614fba', 'e38da76dcd440621988d00bcf79af25d5b29c094db2a23146d003afd41943e7a' ], [ 'af3c423a95d9f5b3054754efa150ac39cd29552fe360257362dfdecef4053b45', 'f98a3fd831eb2b749a93b0e6f35cfb40c8cd5aa667a15581bc2feded498fd9c6' ], [ '766dbb24d134e745cccaa28c99bf274906bb66b26dcf98df8d2fed50d884249a', '744b1152eacbe5e38dcc887980da38b897584a65fa06cedd2c924f97cbac5996' ], [ '59dbf46f8c94759ba21277c33784f41645f7b44f6c596a58ce92e666191abe3e', 'c534ad44175fbc300f4ea6ce648309a042ce739a7919798cd85e216c4a307f6e' ], [ 'f13ada95103c4537305e691e74e9a4a8dd647e711a95e73cb62dc6018cfd87b8', 'e13817b44ee14de663bf4bc808341f326949e21a6a75c2570778419bdaf5733d' ], [ '7754b4fa0e8aced06d4167a2c59cca4cda1869c06ebadfb6488550015a88522c', '30e93e864e669d82224b967c3020b8fa8d1e4e350b6cbcc537a48b57841163a2' ], [ '948dcadf5990e048aa3874d46abef9d701858f95de8041d2a6828c99e2262519', 'e491a42537f6e597d5d28a3224b1bc25df9154efbd2ef1d2cbba2cae5347d57e' ], [ '7962414450c76c1689c7b48f8202ec37fb224cf5ac0bfa1570328a8a3d7c77ab', '100b610ec4ffb4760d5c1fc133ef6f6b12507a051f04ac5760afa5b29db83437' ], [ '3514087834964b54b15b160644d915485a16977225b8847bb0dd085137ec47ca', 'ef0afbb2056205448e1652c48e8127fc6039e77c15c2378b7e7d15a0de293311' ], [ 'd3cc30ad6b483e4bc79ce2c9dd8bc54993e947eb8df787b442943d3f7b527eaf', '8b378a22d827278d89c5e9be8f9508ae3c2ad46290358630afb34db04eede0a4' ], [ '1624d84780732860ce1c78fcbfefe08b2b29823db913f6493975ba0ff4847610', '68651cf9b6da903e0914448c6cd9d4ca896878f5282be4c8cc06e2a404078575' ], [ '733ce80da955a8a26902c95633e62a985192474b5af207da6df7b4fd5fc61cd4', 'f5435a2bd2badf7d485a4d8b8db9fcce3e1ef8e0201e4578c54673bc1dc5ea1d' ], [ '15d9441254945064cf1a1c33bbd3b49f8966c5092171e699ef258dfab81c045c', 'd56eb30b69463e7234f5137b73b84177434800bacebfc685fc37bbe9efe4070d' ], [ 'a1d0fcf2ec9de675b612136e5ce70d271c21417c9d2b8aaaac138599d0717940', 'edd77f50bcb5a3cab2e90737309667f2641462a54070f3d519212d39c197a629' ], [ 'e22fbe15c0af8ccc5780c0735f84dbe9a790badee8245c06c7ca37331cb36980', 'a855babad5cd60c88b430a69f53a1a7a38289154964799be43d06d77d31da06' ], [ '311091dd9860e8e20ee13473c1155f5f69635e394704eaa74009452246cfa9b3', '66db656f87d1f04fffd1f04788c06830871ec5a64feee685bd80f0b1286d8374' ], [ '34c1fd04d301be89b31c0442d3e6ac24883928b45a9340781867d4232ec2dbdf', '9414685e97b1b5954bd46f730174136d57f1ceeb487443dc5321857ba73abee' ], [ 'f219ea5d6b54701c1c14de5b557eb42a8d13f3abbcd08affcc2a5e6b049b8d63', '4cb95957e83d40b0f73af4544cccf6b1f4b08d3c07b27fb8d8c2962a400766d1' ], [ 'd7b8740f74a8fbaab1f683db8f45de26543a5490bca627087236912469a0b448', 'fa77968128d9c92ee1010f337ad4717eff15db5ed3c049b3411e0315eaa4593b' ], [ '32d31c222f8f6f0ef86f7c98d3a3335ead5bcd32abdd94289fe4d3091aa824bf', '5f3032f5892156e39ccd3d7915b9e1da2e6dac9e6f26e961118d14b8462e1661' ], [ '7461f371914ab32671045a155d9831ea8793d77cd59592c4340f86cbc18347b5', '8ec0ba238b96bec0cbdddcae0aa442542eee1ff50c986ea6b39847b3cc092ff6' ], [ 'ee079adb1df1860074356a25aa38206a6d716b2c3e67453d287698bad7b2b2d6', '8dc2412aafe3be5c4c5f37e0ecc5f9f6a446989af04c4e25ebaac479ec1c8c1e' ], [ '16ec93e447ec83f0467b18302ee620f7e65de331874c9dc72bfd8616ba9da6b5', '5e4631150e62fb40d0e8c2a7ca5804a39d58186a50e497139626778e25b0674d' ], [ 'eaa5f980c245f6f038978290afa70b6bd8855897f98b6aa485b96065d537bd99', 'f65f5d3e292c2e0819a528391c994624d784869d7e6ea67fb18041024edc07dc' ], [ '78c9407544ac132692ee1910a02439958ae04877151342ea96c4b6b35a49f51', 'f3e0319169eb9b85d5404795539a5e68fa1fbd583c064d2462b675f194a3ddb4' ], [ '494f4be219a1a77016dcd838431aea0001cdc8ae7a6fc688726578d9702857a5', '42242a969283a5f339ba7f075e36ba2af925ce30d767ed6e55f4b031880d562c' ], [ 'a598a8030da6d86c6bc7f2f5144ea549d28211ea58faa70ebf4c1e665c1fe9b5', '204b5d6f84822c307e4b4a7140737aec23fc63b65b35f86a10026dbd2d864e6b' ], [ 'c41916365abb2b5d09192f5f2dbeafec208f020f12570a184dbadc3e58595997', '4f14351d0087efa49d245b328984989d5caf9450f34bfc0ed16e96b58fa9913' ], [ '841d6063a586fa475a724604da03bc5b92a2e0d2e0a36acfe4c73a5514742881', '73867f59c0659e81904f9a1c7543698e62562d6744c169ce7a36de01a8d6154' ], [ '5e95bb399a6971d376026947f89bde2f282b33810928be4ded112ac4d70e20d5', '39f23f366809085beebfc71181313775a99c9aed7d8ba38b161384c746012865' ], [ '36e4641a53948fd476c39f8a99fd974e5ec07564b5315d8bf99471bca0ef2f66', 'd2424b1b1abe4eb8164227b085c9aa9456ea13493fd563e06fd51cf5694c78fc' ], [ '336581ea7bfbbb290c191a2f507a41cf5643842170e914faeab27c2c579f726', 'ead12168595fe1be99252129b6e56b3391f7ab1410cd1e0ef3dcdcabd2fda224' ], [ '8ab89816dadfd6b6a1f2634fcf00ec8403781025ed6890c4849742706bd43ede', '6fdcef09f2f6d0a044e654aef624136f503d459c3e89845858a47a9129cdd24e' ], [ '1e33f1a746c9c5778133344d9299fcaa20b0938e8acff2544bb40284b8c5fb94', '60660257dd11b3aa9c8ed618d24edff2306d320f1d03010e33a7d2057f3b3b6' ], [ '85b7c1dcb3cec1b7ee7f30ded79dd20a0ed1f4cc18cbcfcfa410361fd8f08f31', '3d98a9cdd026dd43f39048f25a8847f4fcafad1895d7a633c6fed3c35e999511' ], [ '29df9fbd8d9e46509275f4b125d6d45d7fbe9a3b878a7af872a2800661ac5f51', 'b4c4fe99c775a606e2d8862179139ffda61dc861c019e55cd2876eb2a27d84b' ], [ 'a0b1cae06b0a847a3fea6e671aaf8adfdfe58ca2f768105c8082b2e449fce252', 'ae434102edde0958ec4b19d917a6a28e6b72da1834aff0e650f049503a296cf2' ], [ '4e8ceafb9b3e9a136dc7ff67e840295b499dfb3b2133e4ba113f2e4c0e121e5', 'cf2174118c8b6d7a4b48f6d534ce5c79422c086a63460502b827ce62a326683c' ], [ 'd24a44e047e19b6f5afb81c7ca2f69080a5076689a010919f42725c2b789a33b', '6fb8d5591b466f8fc63db50f1c0f1c69013f996887b8244d2cdec417afea8fa3' ], [ 'ea01606a7a6c9cdd249fdfcfacb99584001edd28abbab77b5104e98e8e3b35d4', '322af4908c7312b0cfbfe369f7a7b3cdb7d4494bc2823700cfd652188a3ea98d' ], [ 'af8addbf2b661c8a6c6328655eb96651252007d8c5ea31be4ad196de8ce2131f', '6749e67c029b85f52a034eafd096836b2520818680e26ac8f3dfbcdb71749700' ], [ 'e3ae1974566ca06cc516d47e0fb165a674a3dabcfca15e722f0e3450f45889', '2aeabe7e4531510116217f07bf4d07300de97e4874f81f533420a72eeb0bd6a4' ], [ '591ee355313d99721cf6993ffed1e3e301993ff3ed258802075ea8ced397e246', 'b0ea558a113c30bea60fc4775460c7901ff0b053d25ca2bdeee98f1a4be5d196' ], [ '11396d55fda54c49f19aa97318d8da61fa8584e47b084945077cf03255b52984', '998c74a8cd45ac01289d5833a7beb4744ff536b01b257be4c5767bea93ea57a4' ], [ '3c5d2a1ba39c5a1790000738c9e0c40b8dcdfd5468754b6405540157e017aa7a', 'b2284279995a34e2f9d4de7396fc18b80f9b8b9fdd270f6661f79ca4c81bd257' ], [ 'cc8704b8a60a0defa3a99a7299f2e9c3fbc395afb04ac078425ef8a1793cc030', 'bdd46039feed17881d1e0862db347f8cf395b74fc4bcdc4e940b74e3ac1f1b13' ], [ 'c533e4f7ea8555aacd9777ac5cad29b97dd4defccc53ee7ea204119b2889b197', '6f0a256bc5efdf429a2fb6242f1a43a2d9b925bb4a4b3a26bb8e0f45eb596096' ], [ 'c14f8f2ccb27d6f109f6d08d03cc96a69ba8c34eec07bbcf566d48e33da6593', 'c359d6923bb398f7fd4473e16fe1c28475b740dd098075e6c0e8649113dc3a38' ], [ 'a6cbc3046bc6a450bac24789fa17115a4c9739ed75f8f21ce441f72e0b90e6ef', '21ae7f4680e889bb130619e2c0f95a360ceb573c70603139862afd617fa9b9f' ], [ '347d6d9a02c48927ebfb86c1359b1caf130a3c0267d11ce6344b39f99d43cc38', '60ea7f61a353524d1c987f6ecec92f086d565ab687870cb12689ff1e31c74448' ], [ 'da6545d2181db8d983f7dcb375ef5866d47c67b1bf31c8cf855ef7437b72656a', '49b96715ab6878a79e78f07ce5680c5d6673051b4935bd897fea824b77dc208a' ], [ 'c40747cc9d012cb1a13b8148309c6de7ec25d6945d657146b9d5994b8feb1111', '5ca560753be2a12fc6de6caf2cb489565db936156b9514e1bb5e83037e0fa2d4' ], [ '4e42c8ec82c99798ccf3a610be870e78338c7f713348bd34c8203ef4037f3502', '7571d74ee5e0fb92a7a8b33a07783341a5492144cc54bcc40a94473693606437' ], [ '3775ab7089bc6af823aba2e1af70b236d251cadb0c86743287522a1b3b0dedea', 'be52d107bcfa09d8bcb9736a828cfa7fac8db17bf7a76a2c42ad961409018cf7' ], [ 'cee31cbf7e34ec379d94fb814d3d775ad954595d1314ba8846959e3e82f74e26', '8fd64a14c06b589c26b947ae2bcf6bfa0149ef0be14ed4d80f448a01c43b1c6d' ], [ 'b4f9eaea09b6917619f6ea6a4eb5464efddb58fd45b1ebefcdc1a01d08b47986', '39e5c9925b5a54b07433a4f18c61726f8bb131c012ca542eb24a8ac07200682a' ], [ 'd4263dfc3d2df923a0179a48966d30ce84e2515afc3dccc1b77907792ebcc60e', '62dfaf07a0f78feb30e30d6295853ce189e127760ad6cf7fae164e122a208d54' ], [ '48457524820fa65a4f8d35eb6930857c0032acc0a4a2de422233eeda897612c4', '25a748ab367979d98733c38a1fa1c2e7dc6cc07db2d60a9ae7a76aaa49bd0f77' ], [ 'dfeeef1881101f2cb11644f3a2afdfc2045e19919152923f367a1767c11cceda', 'ecfb7056cf1de042f9420bab396793c0c390bde74b4bbdff16a83ae09a9a7517' ], [ '6d7ef6b17543f8373c573f44e1f389835d89bcbc6062ced36c82df83b8fae859', 'cd450ec335438986dfefa10c57fea9bcc521a0959b2d80bbf74b190dca712d10' ], [ 'e75605d59102a5a2684500d3b991f2e3f3c88b93225547035af25af66e04541f', 'f5c54754a8f71ee540b9b48728473e314f729ac5308b06938360990e2bfad125' ], [ 'eb98660f4c4dfaa06a2be453d5020bc99a0c2e60abe388457dd43fefb1ed620c', '6cb9a8876d9cb8520609af3add26cd20a0a7cd8a9411131ce85f44100099223e' ], [ '13e87b027d8514d35939f2e6892b19922154596941888336dc3563e3b8dba942', 'fef5a3c68059a6dec5d624114bf1e91aac2b9da568d6abeb2570d55646b8adf1' ], [ 'ee163026e9fd6fe017c38f06a5be6fc125424b371ce2708e7bf4491691e5764a', '1acb250f255dd61c43d94ccc670d0f58f49ae3fa15b96623e5430da0ad6c62b2' ], [ 'b268f5ef9ad51e4d78de3a750c2dc89b1e626d43505867999932e5db33af3d80', '5f310d4b3c99b9ebb19f77d41c1dee018cf0d34fd4191614003e945a1216e423' ], [ 'ff07f3118a9df035e9fad85eb6c7bfe42b02f01ca99ceea3bf7ffdba93c4750d', '438136d603e858a3a5c440c38eccbaddc1d2942114e2eddd4740d098ced1f0d8' ], [ '8d8b9855c7c052a34146fd20ffb658bea4b9f69e0d825ebec16e8c3ce2b526a1', 'cdb559eedc2d79f926baf44fb84ea4d44bcf50fee51d7ceb30e2e7f463036758' ], [ '52db0b5384dfbf05bfa9d472d7ae26dfe4b851ceca91b1eba54263180da32b63', 'c3b997d050ee5d423ebaf66a6db9f57b3180c902875679de924b69d84a7b375' ], [ 'e62f9490d3d51da6395efd24e80919cc7d0f29c3f3fa48c6fff543becbd43352', '6d89ad7ba4876b0b22c2ca280c682862f342c8591f1daf5170e07bfd9ccafa7d' ], [ '7f30ea2476b399b4957509c88f77d0191afa2ff5cb7b14fd6d8e7d65aaab1193', 'ca5ef7d4b231c94c3b15389a5f6311e9daff7bb67b103e9880ef4bff637acaec' ], [ '5098ff1e1d9f14fb46a210fada6c903fef0fb7b4a1dd1d9ac60a0361800b7a00', '9731141d81fc8f8084d37c6e7542006b3ee1b40d60dfe5362a5b132fd17ddc0' ], [ '32b78c7de9ee512a72895be6b9cbefa6e2f3c4ccce445c96b9f2c81e2778ad58', 'ee1849f513df71e32efc3896ee28260c73bb80547ae2275ba497237794c8753c' ], [ 'e2cb74fddc8e9fbcd076eef2a7c72b0ce37d50f08269dfc074b581550547a4f7', 'd3aa2ed71c9dd2247a62df062736eb0baddea9e36122d2be8641abcb005cc4a4' ], [ '8438447566d4d7bedadc299496ab357426009a35f235cb141be0d99cd10ae3a8', 'c4e1020916980a4da5d01ac5e6ad330734ef0d7906631c4f2390426b2edd791f' ], [ '4162d488b89402039b584c6fc6c308870587d9c46f660b878ab65c82c711d67e', '67163e903236289f776f22c25fb8a3afc1732f2b84b4e95dbda47ae5a0852649' ], [ '3fad3fa84caf0f34f0f89bfd2dcf54fc175d767aec3e50684f3ba4a4bf5f683d', 'cd1bc7cb6cc407bb2f0ca647c718a730cf71872e7d0d2a53fa20efcdfe61826' ], [ '674f2600a3007a00568c1a7ce05d0816c1fb84bf1370798f1c69532faeb1a86b', '299d21f9413f33b3edf43b257004580b70db57da0b182259e09eecc69e0d38a5' ], [ 'd32f4da54ade74abb81b815ad1fb3b263d82d6c692714bcff87d29bd5ee9f08f', 'f9429e738b8e53b968e99016c059707782e14f4535359d582fc416910b3eea87' ], [ '30e4e670435385556e593657135845d36fbb6931f72b08cb1ed954f1e3ce3ff6', '462f9bce619898638499350113bbc9b10a878d35da70740dc695a559eb88db7b' ], [ 'be2062003c51cc3004682904330e4dee7f3dcd10b01e580bf1971b04d4cad297', '62188bc49d61e5428573d48a74e1c655b1c61090905682a0d5558ed72dccb9bc' ], [ '93144423ace3451ed29e0fb9ac2af211cb6e84a601df5993c419859fff5df04a', '7c10dfb164c3425f5c71a3f9d7992038f1065224f72bb9d1d902a6d13037b47c' ], [ 'b015f8044f5fcbdcf21ca26d6c34fb8197829205c7b7d2a7cb66418c157b112c', 'ab8c1e086d04e813744a655b2df8d5f83b3cdc6faa3088c1d3aea1454e3a1d5f' ], [ 'd5e9e1da649d97d89e4868117a465a3a4f8a18de57a140d36b3f2af341a21b52', '4cb04437f391ed73111a13cc1d4dd0db1693465c2240480d8955e8592f27447a' ], [ 'd3ae41047dd7ca065dbf8ed77b992439983005cd72e16d6f996a5316d36966bb', 'bd1aeb21ad22ebb22a10f0303417c6d964f8cdd7df0aca614b10dc14d125ac46' ], [ '463e2763d885f958fc66cdd22800f0a487197d0a82e377b49f80af87c897b065', 'bfefacdb0e5d0fd7df3a311a94de062b26b80c61fbc97508b79992671ef7ca7f' ], [ '7985fdfd127c0567c6f53ec1bb63ec3158e597c40bfe747c83cddfc910641917', '603c12daf3d9862ef2b25fe1de289aed24ed291e0ec6708703a5bd567f32ed03' ], [ '74a1ad6b5f76e39db2dd249410eac7f99e74c59cb83d2d0ed5ff1543da7703e9', 'cc6157ef18c9c63cd6193d83631bbea0093e0968942e8c33d5737fd790e0db08' ], [ '30682a50703375f602d416664ba19b7fc9bab42c72747463a71d0896b22f6da3', '553e04f6b018b4fa6c8f39e7f311d3176290d0e0f19ca73f17714d9977a22ff8' ], [ '9e2158f0d7c0d5f26c3791efefa79597654e7a2b2464f52b1ee6c1347769ef57', '712fcdd1b9053f09003a3481fa7762e9ffd7c8ef35a38509e2fbf2629008373' ], [ '176e26989a43c9cfeba4029c202538c28172e566e3c4fce7322857f3be327d66', 'ed8cc9d04b29eb877d270b4878dc43c19aefd31f4eee09ee7b47834c1fa4b1c3' ], [ '75d46efea3771e6e68abb89a13ad747ecf1892393dfc4f1b7004788c50374da8', '9852390a99507679fd0b86fd2b39a868d7efc22151346e1a3ca4726586a6bed8' ], [ '809a20c67d64900ffb698c4c825f6d5f2310fb0451c869345b7319f645605721', '9e994980d9917e22b76b061927fa04143d096ccc54963e6a5ebfa5f3f8e286c1' ], [ '1b38903a43f7f114ed4500b4eac7083fdefece1cf29c63528d563446f972c180', '4036edc931a60ae889353f77fd53de4a2708b26b6f5da72ad3394119daf408f9' ] ] } }; },{}],80:[function(require,module,exports){ 'use strict'; var utils = exports; var BN = require('bn.js'); utils.assert = function assert(val, msg) { if (!val) throw new Error(msg || 'Assertion failed'); }; function toArray(msg, enc) { if (Array.isArray(msg)) return msg.slice(); if (!msg) return []; var res = []; if (typeof msg !== 'string') { for (var i = 0; i < msg.length; i++) res[i] = msg[i] | 0; return res; } if (!enc) { for (var i = 0; i < msg.length; i++) { var c = msg.charCodeAt(i); var hi = c >> 8; var lo = c & 0xff; if (hi) res.push(hi, lo); else res.push(lo); } } else if (enc === 'hex') { msg = msg.replace(/[^a-z0-9]+/ig, ''); if (msg.length % 2 !== 0) msg = '0' + msg; for (var i = 0; i < msg.length; i += 2) res.push(parseInt(msg[i] + msg[i + 1], 16)); } return res; } utils.toArray = toArray; function zero2(word) { if (word.length === 1) return '0' + word; else return word; } utils.zero2 = zero2; function toHex(msg) { var res = ''; for (var i = 0; i < msg.length; i++) res += zero2(msg[i].toString(16)); return res; } utils.toHex = toHex; utils.encode = function encode(arr, enc) { if (enc === 'hex') return toHex(arr); else return arr; }; // Represent num in a w-NAF form function getNAF(num, w) { var naf = []; var ws = 1 << (w + 1); var k = num.clone(); while (k.cmpn(1) >= 0) { var z; if (k.isOdd()) { var mod = k.andln(ws - 1); if (mod > (ws >> 1) - 1) z = (ws >> 1) - mod; else z = mod; k.isubn(z); } else { z = 0; } naf.push(z); // Optimization, shift by word if possible var shift = (k.cmpn(0) !== 0 && k.andln(ws - 1) === 0) ? (w + 1) : 1; for (var i = 1; i < shift; i++) naf.push(0); k.iushrn(shift); } return naf; } utils.getNAF = getNAF; // Represent k1, k2 in a Joint Sparse Form function getJSF(k1, k2) { var jsf = [ [], [] ]; k1 = k1.clone(); k2 = k2.clone(); var d1 = 0; var d2 = 0; while (k1.cmpn(-d1) > 0 || k2.cmpn(-d2) > 0) { // First phase var m14 = (k1.andln(3) + d1) & 3; var m24 = (k2.andln(3) + d2) & 3; if (m14 === 3) m14 = -1; if (m24 === 3) m24 = -1; var u1; if ((m14 & 1) === 0) { u1 = 0; } else { var m8 = (k1.andln(7) + d1) & 7; if ((m8 === 3 || m8 === 5) && m24 === 2) u1 = -m14; else u1 = m14; } jsf[0].push(u1); var u2; if ((m24 & 1) === 0) { u2 = 0; } else { var m8 = (k2.andln(7) + d2) & 7; if ((m8 === 3 || m8 === 5) && m14 === 2) u2 = -m24; else u2 = m24; } jsf[1].push(u2); // Second phase if (2 * d1 === u1 + 1) d1 = 1 - d1; if (2 * d2 === u2 + 1) d2 = 1 - d2; k1.iushrn(1); k2.iushrn(1); } return jsf; } utils.getJSF = getJSF; function cachedProperty(obj, computer) { var name = computer.name; var key = '_' + name; obj.prototype[name] = function cachedProperty() { return this[key] !== undefined ? this[key] : this[key] = computer.call(this); }; } utils.cachedProperty = cachedProperty; function parseBytes(bytes) { return typeof bytes === 'string' ? utils.toArray(bytes, 'hex') : bytes; } utils.parseBytes = parseBytes; function intFromLE(bytes) { return new BN(bytes, 'hex', 'le'); } utils.intFromLE = intFromLE; },{"bn.js":17}],81:[function(require,module,exports){ module.exports={ "_args": [ [ "elliptic@^6.0.0", "/home/nervous/.nvm-fish/v5.4.1/lib/node_modules/browserify/node_modules/browserify-sign" ] ], "_from": "elliptic@>=6.0.0 <7.0.0", "_id":="" "elliptic@6.2.3",="" "_incache":="" true,="" "_installable":="" "_location":="" "="" browserify="" elliptic",="" "_nodeversion":="" "5.4.1",="" "_npmuser":="" {="" "email":="" "fedor@indutny.com",="" "name":="" "indutny"="" },="" "_npmversion":="" "3.3.12",="" "_phantomchildren":="" {},="" "_requested":="" "elliptic",="" "raw":="" "elliptic@^6.0.0",="" "rawspec":="" "^6.0.0",="" "scope":="" null,="" "spec":="">=6.0.0 <7.0.0", 0="" 10="" "type":="" "range"="" },="" "_requiredby":="" [="" "="" browserify="" browserify-sign",="" create-ecdh"="" ],="" "_resolved":="" "https:="" registry.npmjs.org="" elliptic="" -="" elliptic-6.2.3.tgz",="" "_shasum":="" "18e46d7306b0951275a2d42063270a14b74ebe99",="" "_shrinkwrap":="" null,="" "_spec":="" "elliptic@^6.0.0",="" "_where":="" home="" nervous="" .nvm-fish="" v5.4.1="" lib="" node_modules="" "author":="" {="" "email":="" "fedor@indutny.com",="" "name":="" "fedor="" indutny"="" "bugs":="" "url":="" github.com="" indutny="" issues"="" "dependencies":="" "bn.js":="" "^4.0.0",="" "brorand":="" "^1.0.1",="" "hash.js":="" "^1.0.0",="" "inherits":="" "^2.0.1"="" "description":="" "ec="" cryptography",="" "devdependencies":="" "coveralls":="" "^2.11.3",="" "istanbul":="" "^0.4.2",="" "jscs":="" "^2.9.0",="" "jshint":="" "^2.6.0",="" "mocha":="" "^2.1.0"="" "directories":="" {},="" "dist":="" "shasum":="" "tarball":="" "http:="" elliptic-6.2.3.tgz"="" "files":="" "lib"="" "githead":="" "c32f20b22b420eb6af3c6dda28963deb7facf823",="" "homepage":="" elliptic",="" "keywords":="" "cryptography",="" "ec",="" "elliptic",="" "curve"="" "license":="" "mit",="" "main":="" "lib="" elliptic.js",="" "maintainers":="" "indutny",="" "fedor@indutny.com"="" }="" "optionaldependencies":="" "readme":="" "error:="" no="" readme="" data="" found!",="" "repository":="" "git",="" "git+ssh:="" git@github.com="" elliptic.git"="" "scripts":="" "coverage":="" "npm="" run="" unit="" --coverage",="" coverage="" &&="" cat="" .="" lcov.info="" |="" coveralls",="" "jscs="" benchmarks="" *.js="" **="" test="" *.js",="" "lint":="" jscs="" npm="" jshint",="" "test":="" lint="" unit",="" "unit":="" "istanbul="" _mocha="" --reporter="spec" *-test.js"="" "version":="" "6.2.3"="" },{}],82:[function(require,module,exports){="" copyright="" joyent,="" inc.="" and="" other="" node="" contributors.="" permission="" is="" hereby="" granted,="" free="" of="" charge,="" to="" any="" person="" obtaining="" a="" copy="" this="" software="" associated="" documentation="" files="" (the="" "software"),="" deal="" in="" the="" without="" restriction,="" including="" limitation="" rights="" use,="" copy,="" modify,="" merge,="" publish,="" distribute,="" sublicense,="" or="" sell="" copies="" software,="" permit="" persons="" whom="" furnished="" do="" so,="" subject="" following="" conditions:="" above="" notice="" shall="" be="" included="" all="" substantial="" portions="" software.="" provided="" "as="" is",="" warranty="" kind,="" express="" implied,="" but="" not="" limited="" warranties="" merchantability,="" fitness="" for="" particular="" purpose="" noninfringement.="" event="" authors="" holders="" liable="" claim,="" damages="" liability,="" whether="" an="" action="" contract,="" tort="" otherwise,="" arising="" from,="" out="" connection="" with="" use="" dealings="" function="" eventemitter()="" this._events="this._events" ||="" {};="" this._maxlisteners="this._maxListeners" undefined;="" module.exports="EventEmitter;" backwards-compat="" 0.10.x="" eventemitter.eventemitter="EventEmitter;" eventemitter.prototype._events="undefined;" eventemitter.prototype._maxlisteners="undefined;" by="" default eventemitters="" will="" print="" warning="" if="" more="" than="" listeners="" are="" added="" it.="" useful="" which="" helps="" finding="" memory="" leaks.="" eventemitter.defaultmaxlisteners="10;" obviously="" emitters="" should="" 10.="" allows="" that="" increased.="" set="" zero="" unlimited.="" eventemitter.prototype.setmaxlisteners="function(n)" (!isnumber(n)="" n="" <="" isnan(n))="" throw="" typeerror('n="" must="" positive="" number');="" return="" this;="" };="" eventemitter.prototype.emit="function(type)" var="" er,="" handler,="" len,="" args,="" i,="" listeners;="" (!this._events)="" there="" 'error'="" listener="" then="" throw.="" (type="==" 'error')="" (!this._events.error="" (isobject(this._events.error)="" !this._events.error.length))="" er="arguments[1];" (er="" instanceof="" error)="" er;="" unhandled="" typeerror('uncaught,="" unspecified="" "error"="" event.');="" handler="this._events[type];" (isundefined(handler))="" false;="" (isfunction(handler))="" switch="" (arguments.length)="" fast="" cases="" case="" 1:="" handler.call(this);="" break;="" 2:="" handler.call(this,="" arguments[1]);="" 3:="" arguments[1],="" arguments[2]);="" slower="" default:="" args="Array.prototype.slice.call(arguments," 1);="" handler.apply(this,="" args);="" else="" (isobject(handler))="" len="listeners.length;" (i="0;" i="" len;="" i++)="" listeners[i].apply(this,="" true;="" eventemitter.prototype.addlistener="function(type," listener)="" m;="" (!isfunction(listener))="" typeerror('listener="" function');="" avoid="" recursion="" type="==" "newlistener"!="" before="" adding="" it="" listeners,="" first="" emit="" "newlistener".="" (this._events.newlistener)="" this.emit('newlistener',="" type,="" isfunction(listener.listener)="" ?="" listener.listener="" :="" listener);="" (!this._events[type])="" optimize="" one="" listener.="" don't="" need="" extra="" array="" object.="" this._events[type]="listener;" (isobject(this._events[type]))="" we've="" already="" got="" array,="" just="" append.="" this._events[type].push(listener);="" second="" element,="" change="" array.="" listener];="" check="" leak="" (isobject(this._events[type])="" !this._events[type].warned)="" (!isundefined(this._maxlisteners))="" m="this._maxListeners;" (m=""> 0 && this._events[type].length > m) { this._events[type].warned = true; console.error('(node) warning: possible EventEmitter memory ' + 'leak detected. %d listeners added. ' + 'Use emitter.setMaxListeners() to increase limit.', this._events[type].length); if (typeof console.trace === 'function') { // not supported in IE 10 console.trace(); } } } return this; }; EventEmitter.prototype.on = EventEmitter.prototype.addListener; EventEmitter.prototype.once = function(type, listener) { if (!isFunction(listener)) throw TypeError('listener must be a function'); var fired = false; function g() { this.removeListener(type, g); if (!fired) { fired = true; listener.apply(this, arguments); } } g.listener = listener; this.on(type, g); return this; }; // emits a 'removeListener' event iff the listener was removed EventEmitter.prototype.removeListener = function(type, listener) { var list, position, length, i; if (!isFunction(listener)) throw TypeError('listener must be a function'); if (!this._events || !this._events[type]) return this; list = this._events[type]; length = list.length; position = -1; if (list === listener || (isFunction(list.listener) && list.listener === listener)) { delete this._events[type]; if (this._events.removeListener) this.emit('removeListener', type, listener); } else if (isObject(list)) { for (i = length; i-- > 0;) { if (list[i] === listener || (list[i].listener && list[i].listener === listener)) { position = i; break; } } if (position < 0) return this; if (list.length === 1) { list.length = 0; delete this._events[type]; } else { list.splice(position, 1); } if (this._events.removeListener) this.emit('removeListener', type, listener); } return this; }; EventEmitter.prototype.removeAllListeners = function(type) { var key, listeners; if (!this._events) return this; // not listening for removeListener, no need to emit if (!this._events.removeListener) { if (arguments.length === 0) this._events = {}; else if (this._events[type]) delete this._events[type]; return this; } // emit removeListener for all listeners on all events if (arguments.length === 0) { for (key in this._events) { if (key === 'removeListener') continue; this.removeAllListeners(key); } this.removeAllListeners('removeListener'); this._events = {}; return this; } listeners = this._events[type]; if (isFunction(listeners)) { this.removeListener(type, listeners); } else if (listeners) { // LIFO order while (listeners.length) this.removeListener(type, listeners[listeners.length - 1]); } delete this._events[type]; return this; }; EventEmitter.prototype.listeners = function(type) { var ret; if (!this._events || !this._events[type]) ret = []; else if (isFunction(this._events[type])) ret = [this._events[type]]; else ret = this._events[type].slice(); return ret; }; EventEmitter.prototype.listenerCount = function(type) { if (this._events) { var evlistener = this._events[type]; if (isFunction(evlistener)) return 1; else if (evlistener) return evlistener.length; } return 0; }; EventEmitter.listenerCount = function(emitter, type) { return emitter.listenerCount(type); }; function isFunction(arg) { return typeof arg === 'function'; } function isNumber(arg) { return typeof arg === 'number'; } function isObject(arg) { return typeof arg === 'object' && arg !== null; } function isUndefined(arg) { return arg === void 0; } },{}],83:[function(require,module,exports){ (function (Buffer){ var md5 = require('create-hash/md5') module.exports = EVP_BytesToKey function EVP_BytesToKey (password, salt, keyLen, ivLen) { if (!Buffer.isBuffer(password)) { password = new Buffer(password, 'binary') } if (salt && !Buffer.isBuffer(salt)) { salt = new Buffer(salt, 'binary') } keyLen = keyLen / 8 ivLen = ivLen || 0 var ki = 0 var ii = 0 var key = new Buffer(keyLen) var iv = new Buffer(ivLen) var addmd = 0 var md_buf var i var bufs = [] while (true) { if (addmd++ > 0) { bufs.push(md_buf) } bufs.push(password) if (salt) { bufs.push(salt) } md_buf = md5(Buffer.concat(bufs)) bufs = [] i = 0 if (keyLen > 0) { while (true) { if (keyLen === 0) { break } if (i === md_buf.length) { break } key[ki++] = md_buf[i] keyLen-- i++ } } if (ivLen > 0 && i !== md_buf.length) { while (true) { if (ivLen === 0) { break } if (i === md_buf.length) { break } iv[ii++] = md_buf[i] ivLen-- i++ } } if (keyLen === 0 && ivLen === 0) { break } } for (i = 0; i < md_buf.length; i++) { md_buf[i] = 0 } return { key: key, iv: iv } } }).call(this,require("buffer").Buffer) },{"buffer":45,"create-hash/md5":52}],84:[function(require,module,exports){ var hash = exports; hash.utils = require('./hash/utils'); hash.common = require('./hash/common'); hash.sha = require('./hash/sha'); hash.ripemd = require('./hash/ripemd'); hash.hmac = require('./hash/hmac'); // Proxy hash functions to the main object hash.sha1 = hash.sha.sha1; hash.sha256 = hash.sha.sha256; hash.sha224 = hash.sha.sha224; hash.sha384 = hash.sha.sha384; hash.sha512 = hash.sha.sha512; hash.ripemd160 = hash.ripemd.ripemd160; },{"./hash/common":85,"./hash/hmac":86,"./hash/ripemd":87,"./hash/sha":88,"./hash/utils":89}],85:[function(require,module,exports){ var hash = require('../hash'); var utils = hash.utils; var assert = utils.assert; function BlockHash() { this.pending = null; this.pendingTotal = 0; this.blockSize = this.constructor.blockSize; this.outSize = this.constructor.outSize; this.hmacStrength = this.constructor.hmacStrength; this.padLength = this.constructor.padLength / 8; this.endian = 'big'; this._delta8 = this.blockSize / 8; this._delta32 = this.blockSize / 32; } exports.BlockHash = BlockHash; BlockHash.prototype.update = function update(msg, enc) { // Convert message to array, pad it, and join into 32bit blocks msg = utils.toArray(msg, enc); if (!this.pending) this.pending = msg; else this.pending = this.pending.concat(msg); this.pendingTotal += msg.length; // Enough data, try updating if (this.pending.length >= this._delta8) { msg = this.pending; // Process pending data in blocks var r = msg.length % this._delta8; this.pending = msg.slice(msg.length - r, msg.length); if (this.pending.length === 0) this.pending = null; msg = utils.join32(msg, 0, msg.length - r, this.endian); for (var i = 0; i < msg.length; i += this._delta32) this._update(msg, i, i + this._delta32); } return this; }; BlockHash.prototype.digest = function digest(enc) { this.update(this._pad()); assert(this.pending === null); return this._digest(enc); }; BlockHash.prototype._pad = function pad() { var len = this.pendingTotal; var bytes = this._delta8; var k = bytes - ((len + this.padLength) % bytes); var res = new Array(k + this.padLength); res[0] = 0x80; for (var i = 1; i < k; i++) res[i] = 0; // Append length len <<= 3;="" if="" (this.endian="==" 'big')="" {="" for="" (var="" t="8;" <="" this.padlength;="" t++)="" res[i++]="0;">>> 24) & 0xff; res[i++] = (len >>> 16) & 0xff; res[i++] = (len >>> 8) & 0xff; res[i++] = len & 0xff; } else { res[i++] = len & 0xff; res[i++] = (len >>> 8) & 0xff; res[i++] = (len >>> 16) & 0xff; res[i++] = (len >>> 24) & 0xff; res[i++] = 0; res[i++] = 0; res[i++] = 0; res[i++] = 0; for (var t = 8; t < this.padLength; t++) res[i++] = 0; } return res; }; },{"../hash":84}],86:[function(require,module,exports){ var hmac = exports; var hash = require('../hash'); var utils = hash.utils; var assert = utils.assert; function Hmac(hash, key, enc) { if (!(this instanceof Hmac)) return new Hmac(hash, key, enc); this.Hash = hash; this.blockSize = hash.blockSize / 8; this.outSize = hash.outSize / 8; this.inner = null; this.outer = null; this._init(utils.toArray(key, enc)); } module.exports = Hmac; Hmac.prototype._init = function init(key) { // Shorten key, if needed if (key.length > this.blockSize) key = new this.Hash().update(key).digest(); assert(key.length <= 2="" 6="" 7="" 11="" 13="" 15="" 16="" 32="" this.blocksize);="" add="" padding="" to="" key="" for="" (var="" i="key.length;" <="" this.blocksize;="" i++)="" key.push(0);="" key.length;="" key[i]="" ^="0x36;" this.inner="new" this.hash().update(key);="" 0x36="" 0x5c="0x6a" this.outer="new" };="" hmac.prototype.update="function" update(msg,="" enc)="" {="" this.inner.update(msg,="" enc);="" return="" this;="" hmac.prototype.digest="function" digest(enc)="" this.outer.update(this.inner.digest());="" this.outer.digest(enc);="" },{"..="" hash":84}],87:[function(require,module,exports){="" var="" hash="require('../hash');" utils="hash.utils;" rotl32="utils.rotl32;" sum32="utils.sum32;" sum32_3="utils.sum32_3;" sum32_4="utils.sum32_4;" blockhash="hash.common.BlockHash;" function="" ripemd160()="" if="" (!(this="" instanceof="" ripemd160))="" new="" ripemd160();="" blockhash.call(this);="" this.h="[" 0x67452301,="" 0xefcdab89,="" 0x98badcfe,="" 0x10325476,="" 0xc3d2e1f0="" ];="" this.endian="little" ;="" }="" utils.inherits(ripemd160,="" blockhash);="" exports.ripemd160="RIPEMD160;" ripemd160.blocksize="512;" ripemd160.outsize="160;" ripemd160.hmacstrength="192;" ripemd160.padlength="64;" ripemd160.prototype._update="function" start)="" a="this.h[0];" b="this.h[1];" c="this.h[2];" d="this.h[3];" e="this.h[4];" ah="A;" bh="B;" ch="C;" dh="D;" eh="E;" j="0;" 80;="" j++)="" t="sum32(" rotl32(="" sum32_4(a,="" f(j,="" b,="" c,="" d),="" msg[r[j]="" +="" start],="" k(j)),="" s[j]),="" e);="" 10);="" sum32_4(ah,="" f(79="" -="" j,="" bh,="" ch,="" dh),="" msg[rh[j]="" kh(j)),="" sh[j]),="" eh);="" dh);="" this.h[1]="sum32_3(this.h[2]," d,="" this.h[2]="sum32_3(this.h[3]," e,="" ah);="" this.h[3]="sum32_3(this.h[4]," a,="" bh);="" this.h[4]="sum32_3(this.h[0]," ch);="" this.h[0]="T;" ripemd160.prototype._digest="function" (enc="==" 'hex')="" utils.tohex32(this.h,="" 'little');="" else="" utils.split32(this.h,="" x,="" y,="" z)="" (j="" x="" y="" z;="" (x="" &="" y)="" |="" ((~x)="" z);="" (~y))="" (y="" (~z));="" k(j)="" 0x00000000;="" 0x5a827999;="" 0x6ed9eba1;="" 0x8f1bbcdc;="" 0xa953fd4e;="" kh(j)="" 0x50a28be6;="" 0x5c4dd124;="" 0x6d703ef3;="" 0x7a6d76e9;="" r="[" 0,="" 1,="" 2,="" 3,="" 4,="" 5,="" 6,="" 7,="" 8,="" 9,="" 10,="" 11,="" 12,="" 13,="" 14,="" 15,="" rh="[" s="[" sh="[" hash":84}],88:[function(require,module,exports){="" assert="utils.assert;" rotr32="utils.rotr32;" sum32_5="utils.sum32_5;" rotr64_hi="utils.rotr64_hi;" rotr64_lo="utils.rotr64_lo;" shr64_hi="utils.shr64_hi;" shr64_lo="utils.shr64_lo;" sum64="utils.sum64;" sum64_hi="utils.sum64_hi;" sum64_lo="utils.sum64_lo;" sum64_4_hi="utils.sum64_4_hi;" sum64_4_lo="utils.sum64_4_lo;" sum64_5_hi="utils.sum64_5_hi;" sum64_5_lo="utils.sum64_5_lo;" sha256_k="[" 0x428a2f98,="" 0x71374491,="" 0xb5c0fbcf,="" 0xe9b5dba5,="" 0x3956c25b,="" 0x59f111f1,="" 0x923f82a4,="" 0xab1c5ed5,="" 0xd807aa98,="" 0x12835b01,="" 0x243185be,="" 0x550c7dc3,="" 0x72be5d74,="" 0x80deb1fe,="" 0x9bdc06a7,="" 0xc19bf174,="" 0xe49b69c1,="" 0xefbe4786,="" 0x0fc19dc6,="" 0x240ca1cc,="" 0x2de92c6f,="" 0x4a7484aa,="" 0x5cb0a9dc,="" 0x76f988da,="" 0x983e5152,="" 0xa831c66d,="" 0xb00327c8,="" 0xbf597fc7,="" 0xc6e00bf3,="" 0xd5a79147,="" 0x06ca6351,="" 0x14292967,="" 0x27b70a85,="" 0x2e1b2138,="" 0x4d2c6dfc,="" 0x53380d13,="" 0x650a7354,="" 0x766a0abb,="" 0x81c2c92e,="" 0x92722c85,="" 0xa2bfe8a1,="" 0xa81a664b,="" 0xc24b8b70,="" 0xc76c51a3,="" 0xd192e819,="" 0xd6990624,="" 0xf40e3585,="" 0x106aa070,="" 0x19a4c116,="" 0x1e376c08,="" 0x2748774c,="" 0x34b0bcb5,="" 0x391c0cb3,="" 0x4ed8aa4a,="" 0x5b9cca4f,="" 0x682e6ff3,="" 0x748f82ee,="" 0x78a5636f,="" 0x84c87814,="" 0x8cc70208,="" 0x90befffa,="" 0xa4506ceb,="" 0xbef9a3f7,="" 0xc67178f2="" sha512_k="[" 0xd728ae22,="" 0x23ef65cd,="" 0xec4d3b2f,="" 0x8189dbbc,="" 0xf348b538,="" 0xb605d019,="" 0xaf194f9b,="" 0xda6d8118,="" 0xa3030242,="" 0x45706fbe,="" 0x4ee4b28c,="" 0xd5ffb4e2,="" 0xf27b896f,="" 0x3b1696b1,="" 0x25c71235,="" 0xcf692694,="" 0x9ef14ad2,="" 0x384f25e3,="" 0x8b8cd5b5,="" 0x77ac9c65,="" 0x592b0275,="" 0x6ea6e483,="" 0xbd41fbd4,="" 0x831153b5,="" 0xee66dfab,="" 0x2db43210,="" 0x98fb213f,="" 0xbeef0ee4,="" 0x3da88fc2,="" 0x930aa725,="" 0xe003826f,="" 0x0a0e6e70,="" 0x46d22ffc,="" 0x5c26c926,="" 0x5ac42aed,="" 0x9d95b3df,="" 0x8baf63de,="" 0x3c77b2a8,="" 0x47edaee6,="" 0x1482353b,="" 0x4cf10364,="" 0xbc423001,="" 0xd0f89791,="" 0x0654be30,="" 0xd6ef5218,="" 0x5565a910,="" 0x5771202a,="" 0x32bbd1b8,="" 0xb8d2d0c8,="" 0x5141ab53,="" 0xdf8eeb99,="" 0xe19b48a8,="" 0xc5c95a63,="" 0xe3418acb,="" 0x7763e373,="" 0xd6b2b8a3,="" 0x5defb2fc,="" 0x43172f60,="" 0xa1f0ab72,="" 0x1a6439ec,="" 0x23631e28,="" 0xde82bde9,="" 0xb2c67915,="" 0xc67178f2,="" 0xe372532b,="" 0xca273ece,="" 0xea26619c,="" 0xd186b8c7,="" 0x21c0c207,="" 0xeada7dd6,="" 0xcde0eb1e,="" 0xf57d4f7f,="" 0xee6ed178,="" 0x06f067aa,="" 0x72176fba,="" 0x0a637dc5,="" 0xa2c898a6,="" 0x113f9804,="" 0xbef90dae,="" 0x1b710b35,="" 0x131c471b,="" 0x28db77f5,="" 0x23047d84,="" 0x32caab7b,="" 0x40c72493,="" 0x3c9ebe0a,="" 0x15c9bebc,="" 0x431d67c4,="" 0x9c100d4c,="" 0x4cc5d4be,="" 0xcb3e42b6,="" 0x597f299c,="" 0xfc657e2a,="" 0x5fcb6fab,="" 0x3ad6faec,="" 0x6c44198c,="" 0x4a475817="" sha1_k="[" 0x5a827999,="" 0x6ed9eba1,="" 0x8f1bbcdc,="" 0xca62c1d6="" sha256()="" sha256))="" sha256();="" 0x6a09e667,="" 0xbb67ae85,="" 0x3c6ef372,="" 0xa54ff53a,="" 0x510e527f,="" 0x9b05688c,="" 0x1f83d9ab,="" 0x5be0cd19="" this.k="sha256_K;" this.w="new" array(64);="" utils.inherits(sha256,="" exports.sha256="SHA256;" sha256.blocksize="512;" sha256.outsize="256;" sha256.hmacstrength="192;" sha256.padlength="64;" sha256.prototype._update="function" _update(msg,="" w="this.W;" 16;="" w[i]="msg[start" i];="" (;="" w.length;="" 2]),="" w[i="" 7],="" g0_256(w[i="" 15]),="" 16]);="" f="this.h[5];" g="this.h[6];" h="this.h[7];" assert(this.k.length="==" w.length);="" t1="sum32_5(h," s1_256(e),="" ch32(e,="" f,="" g),="" this.k[i],="" w[i]);="" t2="sum32(s0_256(a)," maj32(a,="" c));="" t1);="" t2);="" a);="" b);="" c);="" d);="" this.h[5]="sum32(this.h[5]," f);="" this.h[6]="sum32(this.h[6]," g);="" this.h[7]="sum32(this.h[7]," h);="" sha256.prototype._digest="function" 'big');="" sha224()="" sha224))="" sha224();="" sha256.call(this);="" 0xc1059ed8,="" 0x367cd507,="" 0x3070dd17,="" 0xf70e5939,="" 0xffc00b31,="" 0x68581511,="" 0x64f98fa7,="" 0xbefa4fa4="" utils.inherits(sha224,="" sha256);="" exports.sha224="SHA224;" sha224.blocksize="512;" sha224.outsize="224;" sha224.hmacstrength="192;" sha224.padlength="64;" sha224.prototype._digest="function" just="" truncate="" output="" utils.tohex32(this.h.slice(0,="" 7),="" utils.split32(this.h.slice(0,="" sha512()="" sha512))="" sha512();="" 0xf3bcc908,="" 0x84caa73b,="" 0xfe94f82b,="" 0x5f1d36f1,="" 0xade682d1,="" 0x2b3e6c1f,="" 0xfb41bd6b,="" 0x5be0cd19,="" 0x137e2179="" array(160);="" utils.inherits(sha512,="" exports.sha512="SHA512;" sha512.blocksize="1024;" sha512.outsize="512;" sha512.hmacstrength="192;" sha512.padlength="128;" sha512.prototype._prepareblock="function" _prepareblock(msg,="" 32bit="" words="" 32;="" c0_hi="g1_512_hi(W[i" 4],="" 3]);="" c0_lo="g1_512_lo(W[i" c1_hi="W[i" 14];="" c1_lo="W[i" 13];="" c2_hi="g0_512_hi(W[i" 30],="" 29]);="" c2_lo="g0_512_lo(W[i" c3_hi="W[i" 32];="" c3_lo="W[i" 31];="" c0_lo,="" c1_hi,="" c1_lo,="" c2_hi,="" c2_lo,="" c3_hi,="" c3_lo);="" 1]="sum64_4_lo(c0_hi," sha512.prototype._update="function" this._prepareblock(msg,="" start);="" al="this.h[1];" bl="this.h[3];" cl="this.h[5];" dl="this.h[7];" el="this.h[9];" fh="this.h[10];" fl="this.h[11];" gh="this.h[12];" gl="this.h[13];" hh="this.h[14];" hl="this.h[15];" el);="" el,="" fh,="" fl,="" gh,="" gl);="" 1];="" c4_hi="W[i];" c4_lo="W[i" t1_hi="sum64_5_hi(c0_hi," c3_lo,="" c4_hi,="" c4_lo);="" t1_lo="sum64_5_lo(c0_hi," al);="" al,="" bl,="" cl);="" t2_hi="sum64_hi(c0_hi," c1_lo);="" t2_lo="sum64_lo(c0_hi," dl,="" t1_hi,="" t1_lo);="" t1_lo,="" t2_hi,="" t2_lo);="" sum64(this.h,="" ah,="" bl);="" dh,="" dl);="" eh,="" fl);="" hh,="" hl);="" sha512.prototype._digest="function" sha384()="" sha384))="" sha384();="" sha512.call(this);="" 0xcbbb9d5d,="" 0x629a292a,="" 0x9159015a,="" 0x152fecd8,="" 0x67332667,="" 0x8eb44a87,="" 0xdb0c2e0d,="" 0x47b5481d,="" utils.inherits(sha384,="" sha512);="" exports.sha384="SHA384;" sha384.blocksize="1024;" sha384.outsize="384;" sha384.hmacstrength="192;" sha384.padlength="128;" sha384.prototype._digest="function" 12),="" sha1()="" sha1))="" sha1();="" array(80);="" utils.inherits(sha1,="" exports.sha1="SHA1;" sha1.blocksize="512;" sha1.outsize="160;" sha1.hmacstrength="80;" sha1.padlength="64;" sha1.prototype._update="function" for(;="" 3]="" 8]="" 14]="" 16],="" 1);="" 20);="" 5),="" ft_1(s,="" w[i],="" sha1_k[s]);="" 30);="" sha1.prototype._digest="function" ch32(x,="" maj32(x,="" p32(x,="" s0_256(x)="" rotr32(x,="" 2)="" 13)="" 22);="" s1_256(x)="" 6)="" 11)="" 25);="" g0_256(x)="" 7)="" 18)="">>> 3); } function g1_256(x) { return rotr32(x, 17) ^ rotr32(x, 19) ^ (x >>> 10); } function ft_1(s, x, y, z) { if (s === 0) return ch32(x, y, z); if (s === 1 || s === 3) return p32(x, y, z); if (s === 2) return maj32(x, y, z); } function ch64_hi(xh, xl, yh, yl, zh, zl) { var r = (xh & yh) ^ ((~xh) & zh); if (r < 0) r += 0x100000000; return r; } function ch64_lo(xh, xl, yh, yl, zh, zl) { var r = (xl & yl) ^ ((~xl) & zl); if (r < 0) r += 0x100000000; return r; } function maj64_hi(xh, xl, yh, yl, zh, zl) { var r = (xh & yh) ^ (xh & zh) ^ (yh & zh); if (r < 0) r += 0x100000000; return r; } function maj64_lo(xh, xl, yh, yl, zh, zl) { var r = (xl & yl) ^ (xl & zl) ^ (yl & zl); if (r < 0) r += 0x100000000; return r; } function s0_512_hi(xh, xl) { var c0_hi = rotr64_hi(xh, xl, 28); var c1_hi = rotr64_hi(xl, xh, 2); // 34 var c2_hi = rotr64_hi(xl, xh, 7); // 39 var r = c0_hi ^ c1_hi ^ c2_hi; if (r < 0) r += 0x100000000; return r; } function s0_512_lo(xh, xl) { var c0_lo = rotr64_lo(xh, xl, 28); var c1_lo = rotr64_lo(xl, xh, 2); // 34 var c2_lo = rotr64_lo(xl, xh, 7); // 39 var r = c0_lo ^ c1_lo ^ c2_lo; if (r < 0) r += 0x100000000; return r; } function s1_512_hi(xh, xl) { var c0_hi = rotr64_hi(xh, xl, 14); var c1_hi = rotr64_hi(xh, xl, 18); var c2_hi = rotr64_hi(xl, xh, 9); // 41 var r = c0_hi ^ c1_hi ^ c2_hi; if (r < 0) r += 0x100000000; return r; } function s1_512_lo(xh, xl) { var c0_lo = rotr64_lo(xh, xl, 14); var c1_lo = rotr64_lo(xh, xl, 18); var c2_lo = rotr64_lo(xl, xh, 9); // 41 var r = c0_lo ^ c1_lo ^ c2_lo; if (r < 0) r += 0x100000000; return r; } function g0_512_hi(xh, xl) { var c0_hi = rotr64_hi(xh, xl, 1); var c1_hi = rotr64_hi(xh, xl, 8); var c2_hi = shr64_hi(xh, xl, 7); var r = c0_hi ^ c1_hi ^ c2_hi; if (r < 0) r += 0x100000000; return r; } function g0_512_lo(xh, xl) { var c0_lo = rotr64_lo(xh, xl, 1); var c1_lo = rotr64_lo(xh, xl, 8); var c2_lo = shr64_lo(xh, xl, 7); var r = c0_lo ^ c1_lo ^ c2_lo; if (r < 0) r += 0x100000000; return r; } function g1_512_hi(xh, xl) { var c0_hi = rotr64_hi(xh, xl, 19); var c1_hi = rotr64_hi(xl, xh, 29); // 61 var c2_hi = shr64_hi(xh, xl, 6); var r = c0_hi ^ c1_hi ^ c2_hi; if (r < 0) r += 0x100000000; return r; } function g1_512_lo(xh, xl) { var c0_lo = rotr64_lo(xh, xl, 19); var c1_lo = rotr64_lo(xl, xh, 29); // 61 var c2_lo = shr64_lo(xh, xl, 6); var r = c0_lo ^ c1_lo ^ c2_lo; if (r < 0) r += 0x100000000; return r; } },{"../hash":84}],89:[function(require,module,exports){ var utils = exports; var inherits = require('inherits'); function toArray(msg, enc) { if (Array.isArray(msg)) return msg.slice(); if (!msg) return []; var res = []; if (typeof msg === 'string') { if (!enc) { for (var i = 0; i < msg.length; i++) { var c = msg.charCodeAt(i); var hi = c >> 8; var lo = c & 0xff; if (hi) res.push(hi, lo); else res.push(lo); } } else if (enc === 'hex') { msg = msg.replace(/[^a-z0-9]+/ig, ''); if (msg.length % 2 !== 0) msg = '0' + msg; for (var i = 0; i < msg.length; i += 2) res.push(parseInt(msg[i] + msg[i + 1], 16)); } } else { for (var i = 0; i < msg.length; i++) res[i] = msg[i] | 0; } return res; } utils.toArray = toArray; function toHex(msg) { var res = ''; for (var i = 0; i < msg.length; i++) res += zero2(msg[i].toString(16)); return res; } utils.toHex = toHex; function htonl(w) { var res = (w >>> 24) | ((w >>> 8) & 0xff00) | ((w << 8) & 0xff0000) | ((w & 0xff) << 24); return res >>> 0; } utils.htonl = htonl; function toHex32(msg, endian) { var res = ''; for (var i = 0; i < msg.length; i++) { var w = msg[i]; if (endian === 'little') w = htonl(w); res += zero8(w.toString(16)); } return res; } utils.toHex32 = toHex32; function zero2(word) { if (word.length === 1) return '0' + word; else return word; } utils.zero2 = zero2; function zero8(word) { if (word.length === 7) return '0' + word; else if (word.length === 6) return '00' + word; else if (word.length === 5) return '000' + word; else if (word.length === 4) return '0000' + word; else if (word.length === 3) return '00000' + word; else if (word.length === 2) return '000000' + word; else if (word.length === 1) return '0000000' + word; else return word; } utils.zero8 = zero8; function join32(msg, start, end, endian) { var len = end - start; assert(len % 4 === 0); var res = new Array(len / 4); for (var i = 0, k = start; i < res.length; i++, k += 4) { var w; if (endian === 'big') w = (msg[k] << 24) | (msg[k + 1] << 16) | (msg[k + 2] << 8) | msg[k + 3]; else w = (msg[k + 3] << 24) | (msg[k + 2] << 16) | (msg[k + 1] << 8) | msg[k]; res[i] = w >>> 0; } return res; } utils.join32 = join32; function split32(msg, endian) { var res = new Array(msg.length * 4); for (var i = 0, k = 0; i < msg.length; i++, k += 4) { var m = msg[i]; if (endian === 'big') { res[k] = m >>> 24; res[k + 1] = (m >>> 16) & 0xff; res[k + 2] = (m >>> 8) & 0xff; res[k + 3] = m & 0xff; } else { res[k + 3] = m >>> 24; res[k + 2] = (m >>> 16) & 0xff; res[k + 1] = (m >>> 8) & 0xff; res[k] = m & 0xff; } } return res; } utils.split32 = split32; function rotr32(w, b) { return (w >>> b) | (w << (32 - b)); } utils.rotr32 = rotr32; function rotl32(w, b) { return (w << b) | (w >>> (32 - b)); } utils.rotl32 = rotl32; function sum32(a, b) { return (a + b) >>> 0; } utils.sum32 = sum32; function sum32_3(a, b, c) { return (a + b + c) >>> 0; } utils.sum32_3 = sum32_3; function sum32_4(a, b, c, d) { return (a + b + c + d) >>> 0; } utils.sum32_4 = sum32_4; function sum32_5(a, b, c, d, e) { return (a + b + c + d + e) >>> 0; } utils.sum32_5 = sum32_5; function assert(cond, msg) { if (!cond) throw new Error(msg || 'Assertion failed'); } utils.assert = assert; utils.inherits = inherits; function sum64(buf, pos, ah, al) { var bh = buf[pos]; var bl = buf[pos + 1]; var lo = (al + bl) >>> 0; var hi = (lo < al ? 1 : 0) + ah + bh; buf[pos] = hi >>> 0; buf[pos + 1] = lo; } exports.sum64 = sum64; function sum64_hi(ah, al, bh, bl) { var lo = (al + bl) >>> 0; var hi = (lo < al ? 1 : 0) + ah + bh; return hi >>> 0; }; exports.sum64_hi = sum64_hi; function sum64_lo(ah, al, bh, bl) { var lo = al + bl; return lo >>> 0; }; exports.sum64_lo = sum64_lo; function sum64_4_hi(ah, al, bh, bl, ch, cl, dh, dl) { var carry = 0; var lo = al; lo = (lo + bl) >>> 0; carry += lo < al ? 1 : 0; lo = (lo + cl) >>> 0; carry += lo < cl ? 1 : 0; lo = (lo + dl) >>> 0; carry += lo < dl ? 1 : 0; var hi = ah + bh + ch + dh + carry; return hi >>> 0; }; exports.sum64_4_hi = sum64_4_hi; function sum64_4_lo(ah, al, bh, bl, ch, cl, dh, dl) { var lo = al + bl + cl + dl; return lo >>> 0; }; exports.sum64_4_lo = sum64_4_lo; function sum64_5_hi(ah, al, bh, bl, ch, cl, dh, dl, eh, el) { var carry = 0; var lo = al; lo = (lo + bl) >>> 0; carry += lo < al ? 1 : 0; lo = (lo + cl) >>> 0; carry += lo < cl ? 1 : 0; lo = (lo + dl) >>> 0; carry += lo < dl ? 1 : 0; lo = (lo + el) >>> 0; carry += lo < el ? 1 : 0; var hi = ah + bh + ch + dh + eh + carry; return hi >>> 0; }; exports.sum64_5_hi = sum64_5_hi; function sum64_5_lo(ah, al, bh, bl, ch, cl, dh, dl, eh, el) { var lo = al + bl + cl + dl + el; return lo >>> 0; }; exports.sum64_5_lo = sum64_5_lo; function rotr64_hi(ah, al, num) { var r = (al << (32 - num)) | (ah >>> num); return r >>> 0; }; exports.rotr64_hi = rotr64_hi; function rotr64_lo(ah, al, num) { var r = (ah << (32 - num)) | (al >>> num); return r >>> 0; }; exports.rotr64_lo = rotr64_lo; function shr64_hi(ah, al, num) { return ah >>> num; }; exports.shr64_hi = shr64_hi; function shr64_lo(ah, al, num) { var r = (ah << (32 - num)) | (al >>> num); return r >>> 0; }; exports.shr64_lo = shr64_lo; },{"inherits":92}],90:[function(require,module,exports){ exports.read = function (buffer, offset, isLE, mLen, nBytes) { var e, m var eLen = nBytes * 8 - mLen - 1 var eMax = (1 << eLen) - 1 var eBias = eMax >> 1 var nBits = -7 var i = isLE ? (nBytes - 1) : 0 var d = isLE ? -1 : 1 var s = buffer[offset + i] i += d e = s & ((1 << (-nBits)) - 1) s >>= (-nBits) nBits += eLen for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8) {} m = e & ((1 << (-nBits)) - 1) e >>= (-nBits) nBits += mLen for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8) {} if (e === 0) { e = 1 - eBias } else if (e === eMax) { return m ? NaN : ((s ? -1 : 1) * Infinity) } else { m = m + Math.pow(2, mLen) e = e - eBias } return (s ? -1 : 1) * m * Math.pow(2, e - mLen) } exports.write = function (buffer, value, offset, isLE, mLen, nBytes) { var e, m, c var eLen = nBytes * 8 - mLen - 1 var eMax = (1 << eLen) - 1 var eBias = eMax >> 1 var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0) var i = isLE ? 0 : (nBytes - 1) var d = isLE ? 1 : -1 var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0 value = Math.abs(value) if (isNaN(value) || value === Infinity) { m = isNaN(value) ? 1 : 0 e = eMax } else { e = Math.floor(Math.log(value) / Math.LN2) if (value * (c = Math.pow(2, -e)) < 1) { e-- c *= 2 } if (e + eBias >= 1) { value += rt / c } else { value += rt * Math.pow(2, 1 - eBias) } if (value * c >= 2) { e++ c /= 2 } if (e + eBias >= eMax) { m = 0 e = eMax } else if (e + eBias >= 1) { m = (value * c - 1) * Math.pow(2, mLen) e = e + eBias } else { m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen) e = 0 } } for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {} e = (e << mLen) | m eLen += mLen for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {} buffer[offset + i - d] |= s * 128 } },{}],91:[function(require,module,exports){ var indexOf = [].indexOf; module.exports = function(arr, obj){ if (indexOf) return arr.indexOf(obj); for (var i = 0; i < arr.length; ++i) { if (arr[i] === obj) return i; } return -1; }; },{}],92:[function(require,module,exports){ if (typeof Object.create === 'function') { // implementation from standard node.js 'util' module module.exports = function inherits(ctor, superCtor) { ctor.super_ = superCtor ctor.prototype = Object.create(superCtor.prototype, { constructor: { value: ctor, enumerable: false, writable: true, configurable: true } }); }; } else { // old school shim for old browsers module.exports = function inherits(ctor, superCtor) { ctor.super_ = superCtor var TempCtor = function () {} TempCtor.prototype = superCtor.prototype ctor.prototype = new TempCtor() ctor.prototype.constructor = ctor } } },{}],93:[function(require,module,exports){ /** * Determine if an object is Buffer * * Author: Feross Aboukhadijeh * License: MIT * * `npm install is-buffer` */ module.exports = function (obj) { return !!(obj != null && (obj._isBuffer || // For Safari 5-7 (missing Object.prototype.constructor) (obj.constructor && typeof obj.constructor.isBuffer === 'function' && obj.constructor.isBuffer(obj)) )) } },{}],94:[function(require,module,exports){ module.exports = Array.isArray || function (arr) { return Object.prototype.toString.call(arr) == '[object Array]'; }; },{}],95:[function(require,module,exports){ var bn = require('bn.js'); var brorand = require('brorand'); function MillerRabin(rand) { this.rand = rand || new brorand.Rand(); } module.exports = MillerRabin; MillerRabin.create = function create(rand) { return new MillerRabin(rand); }; MillerRabin.prototype._rand = function _rand(n) { var len = n.bitLength(); var buf = this.rand.generate(Math.ceil(len / 8)); // Set low bits buf[0] |= 3; // Mask high bits var mask = len & 0x7; if (mask !== 0) buf[buf.length - 1] >>= 7 - mask; return new bn(buf); } MillerRabin.prototype.test = function test(n, k, cb) { var len = n.bitLength(); var red = bn.mont(n); var rone = new bn(1).toRed(red); if (!k) k = Math.max(1, (len / 48) | 0); // Find d and s, (n - 1) = (2 ^ s) * d; var n1 = n.subn(1); var n2 = n1.subn(1); for (var s = 0; !n1.testn(s); s++) {} var d = n.shrn(s); var rn1 = n1.toRed(red); var prime = true; for (; k > 0; k--) { var a = this._rand(n2); if (cb) cb(a); var x = a.toRed(red).redPow(d); if (x.cmp(rone) === 0 || x.cmp(rn1) === 0) continue; for (var i = 1; i < s; i++) { x = x.redSqr(); if (x.cmp(rone) === 0) return false; if (x.cmp(rn1) === 0) break; } if (i === s) return false; } return prime; }; MillerRabin.prototype.getDivisor = function getDivisor(n, k) { var len = n.bitLength(); var red = bn.mont(n); var rone = new bn(1).toRed(red); if (!k) k = Math.max(1, (len / 48) | 0); // Find d and s, (n - 1) = (2 ^ s) * d; var n1 = n.subn(1); var n2 = n1.subn(1); for (var s = 0; !n1.testn(s); s++) {} var d = n.shrn(s); var rn1 = n1.toRed(red); for (; k > 0; k--) { var a = this._rand(n2); var g = n.gcd(a); if (g.cmpn(1) !== 0) return g; var x = a.toRed(red).redPow(d); if (x.cmp(rone) === 0 || x.cmp(rn1) === 0) continue; for (var i = 1; i < s; i++) { x = x.redSqr(); if (x.cmp(rone) === 0) return x.fromRed().subn(1).gcd(n); if (x.cmp(rn1) === 0) break; } if (i === s) { x = x.redSqr(); return x.fromRed().subn(1).gcd(n); } } return false; }; },{"bn.js":17,"brorand":18}],96:[function(require,module,exports){ module.exports = assert; function assert(val, msg) { if (!val) throw new Error(msg || 'Assertion failed'); } assert.equal = function assertEqual(l, r, msg) { if (l != r) throw new Error(msg || ('Assertion failed: ' + l + ' != ' + r)); }; },{}],97:[function(require,module,exports){ module.exports={"2.16.840.1.101.3.4.1.1": "aes-128-ecb", "2.16.840.1.101.3.4.1.2": "aes-128-cbc", "2.16.840.1.101.3.4.1.3": "aes-128-ofb", "2.16.840.1.101.3.4.1.4": "aes-128-cfb", "2.16.840.1.101.3.4.1.21": "aes-192-ecb", "2.16.840.1.101.3.4.1.22": "aes-192-cbc", "2.16.840.1.101.3.4.1.23": "aes-192-ofb", "2.16.840.1.101.3.4.1.24": "aes-192-cfb", "2.16.840.1.101.3.4.1.41": "aes-256-ecb", "2.16.840.1.101.3.4.1.42": "aes-256-cbc", "2.16.840.1.101.3.4.1.43": "aes-256-ofb", "2.16.840.1.101.3.4.1.44": "aes-256-cfb" } },{}],98:[function(require,module,exports){ // from https://github.com/indutny/self-signed/blob/gh-pages/lib/asn1.js // Fedor, you are amazing. var asn1 = require('asn1.js') var RSAPrivateKey = asn1.define('RSAPrivateKey', function () { this.seq().obj( this.key('version').int(), this.key('modulus').int(), this.key('publicExponent').int(), this.key('privateExponent').int(), this.key('prime1').int(), this.key('prime2').int(), this.key('exponent1').int(), this.key('exponent2').int(), this.key('coefficient').int() ) }) exports.RSAPrivateKey = RSAPrivateKey var RSAPublicKey = asn1.define('RSAPublicKey', function () { this.seq().obj( this.key('modulus').int(), this.key('publicExponent').int() ) }) exports.RSAPublicKey = RSAPublicKey var PublicKey = asn1.define('SubjectPublicKeyInfo', function () { this.seq().obj( this.key('algorithm').use(AlgorithmIdentifier), this.key('subjectPublicKey').bitstr() ) }) exports.PublicKey = PublicKey var AlgorithmIdentifier = asn1.define('AlgorithmIdentifier', function () { this.seq().obj( this.key('algorithm').objid(), this.key('none').null_().optional(), this.key('curve').objid().optional(), this.key('params').seq().obj( this.key('p').int(), this.key('q').int(), this.key('g').int() ).optional() ) }) var PrivateKeyInfo = asn1.define('PrivateKeyInfo', function () { this.seq().obj( this.key('version').int(), this.key('algorithm').use(AlgorithmIdentifier), this.key('subjectPrivateKey').octstr() ) }) exports.PrivateKey = PrivateKeyInfo var EncryptedPrivateKeyInfo = asn1.define('EncryptedPrivateKeyInfo', function () { this.seq().obj( this.key('algorithm').seq().obj( this.key('id').objid(), this.key('decrypt').seq().obj( this.key('kde').seq().obj( this.key('id').objid(), this.key('kdeparams').seq().obj( this.key('salt').octstr(), this.key('iters').int() ) ), this.key('cipher').seq().obj( this.key('algo').objid(), this.key('iv').octstr() ) ) ), this.key('subjectPrivateKey').octstr() ) }) exports.EncryptedPrivateKey = EncryptedPrivateKeyInfo var DSAPrivateKey = asn1.define('DSAPrivateKey', function () { this.seq().obj( this.key('version').int(), this.key('p').int(), this.key('q').int(), this.key('g').int(), this.key('pub_key').int(), this.key('priv_key').int() ) }) exports.DSAPrivateKey = DSAPrivateKey exports.DSAparam = asn1.define('DSAparam', function () { this.int() }) var ECPrivateKey = asn1.define('ECPrivateKey', function () { this.seq().obj( this.key('version').int(), this.key('privateKey').octstr(), this.key('parameters').optional().explicit(0).use(ECParameters), this.key('publicKey').optional().explicit(1).bitstr() ) }) exports.ECPrivateKey = ECPrivateKey var ECParameters = asn1.define('ECParameters', function () { this.choice({ namedCurve: this.objid() }) }) exports.signature = asn1.define('signature', function () { this.seq().obj( this.key('r').int(), this.key('s').int() ) }) },{"asn1.js":2}],99:[function(require,module,exports){ (function (Buffer){ // adapted from https://github.com/apatil/pemstrip var findProc = /Proc-Type: 4,ENCRYPTED\r?\nDEK-Info: AES-((?:128)|(?:192)|(?:256))-CBC,([0-9A-H]+)\r?\n\r?\n([0-9A-z\n\r\+\/\=]+)\r?\n/m var startRegex = /^-----BEGIN (.*) KEY-----\r?\n/m var fullRegex = /^-----BEGIN (.*) KEY-----\r?\n([0-9A-z\n\r\+\/\=]+)\r?\n-----END \1 KEY-----$/m var evp = require('evp_bytestokey') var ciphers = require('browserify-aes') module.exports = function (okey, password) { var key = okey.toString() var match = key.match(findProc) var decrypted if (!match) { var match2 = key.match(fullRegex) decrypted = new Buffer(match2[2].replace(/\r?\n/g, ''), 'base64') } else { var suite = 'aes' + match[1] var iv = new Buffer(match[2], 'hex') var cipherText = new Buffer(match[3].replace(/\r?\n/g, ''), 'base64') var cipherKey = evp(password, iv.slice(0, 8), parseInt(match[1], 10)).key var out = [] var cipher = ciphers.createDecipheriv(suite, cipherKey, iv) out.push(cipher.update(cipherText)) out.push(cipher.final()) decrypted = Buffer.concat(out) } var tag = key.match(startRegex)[1] + ' KEY' return { tag: tag, data: decrypted } } }).call(this,require("buffer").Buffer) },{"browserify-aes":22,"buffer":45,"evp_bytestokey":83}],100:[function(require,module,exports){ (function (Buffer){ var asn1 = require('./asn1') var aesid = require('./aesid.json') var fixProc = require('./fixProc') var ciphers = require('browserify-aes') var compat = require('pbkdf2') module.exports = parseKeys function parseKeys (buffer) { var password if (typeof buffer === 'object' && !Buffer.isBuffer(buffer)) { password = buffer.passphrase buffer = buffer.key } if (typeof buffer === 'string') { buffer = new Buffer(buffer) } var stripped = fixProc(buffer, password) var type = stripped.tag var data = stripped.data var subtype, ndata switch (type) { case 'PUBLIC KEY': ndata = asn1.PublicKey.decode(data, 'der') subtype = ndata.algorithm.algorithm.join('.') switch (subtype) { case '1.2.840.113549.1.1.1': return asn1.RSAPublicKey.decode(ndata.subjectPublicKey.data, 'der') case '1.2.840.10045.2.1': ndata.subjectPrivateKey = ndata.subjectPublicKey return { type: 'ec', data: ndata } case '1.2.840.10040.4.1': ndata.algorithm.params.pub_key = asn1.DSAparam.decode(ndata.subjectPublicKey.data, 'der') return { type: 'dsa', data: ndata.algorithm.params } default: throw new Error('unknown key id ' + subtype) } throw new Error('unknown key type ' + type) case 'ENCRYPTED PRIVATE KEY': data = asn1.EncryptedPrivateKey.decode(data, 'der') data = decrypt(data, password) // falls through case 'PRIVATE KEY': ndata = asn1.PrivateKey.decode(data, 'der') subtype = ndata.algorithm.algorithm.join('.') switch (subtype) { case '1.2.840.113549.1.1.1': return asn1.RSAPrivateKey.decode(ndata.subjectPrivateKey, 'der') case '1.2.840.10045.2.1': return { curve: ndata.algorithm.curve, privateKey: asn1.ECPrivateKey.decode(ndata.subjectPrivateKey, 'der').privateKey } case '1.2.840.10040.4.1': ndata.algorithm.params.priv_key = asn1.DSAparam.decode(ndata.subjectPrivateKey, 'der') return { type: 'dsa', params: ndata.algorithm.params } default: throw new Error('unknown key id ' + subtype) } throw new Error('unknown key type ' + type) case 'RSA PUBLIC KEY': return asn1.RSAPublicKey.decode(data, 'der') case 'RSA PRIVATE KEY': return asn1.RSAPrivateKey.decode(data, 'der') case 'DSA PRIVATE KEY': return { type: 'dsa', params: asn1.DSAPrivateKey.decode(data, 'der') } case 'EC PRIVATE KEY': data = asn1.ECPrivateKey.decode(data, 'der') return { curve: data.parameters.value, privateKey: data.privateKey } default: throw new Error('unknown key type ' + type) } } parseKeys.signature = asn1.signature function decrypt (data, password) { var salt = data.algorithm.decrypt.kde.kdeparams.salt var iters = parseInt(data.algorithm.decrypt.kde.kdeparams.iters.toString(), 10) var algo = aesid[data.algorithm.decrypt.cipher.algo.join('.')] var iv = data.algorithm.decrypt.cipher.iv var cipherText = data.subjectPrivateKey var keylen = parseInt(algo.split('-')[1], 10) / 8 var key = compat.pbkdf2Sync(password, salt, iters, keylen) var cipher = ciphers.createDecipheriv(algo, key, iv) var out = [] out.push(cipher.update(cipherText)) out.push(cipher.final()) return Buffer.concat(out) } }).call(this,require("buffer").Buffer) },{"./aesid.json":97,"./asn1":98,"./fixProc":99,"browserify-aes":22,"buffer":45,"pbkdf2":102}],101:[function(require,module,exports){ (function (process){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a // copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to permit // persons to whom the Software is furnished to do so, subject to the // following conditions: // // The above copyright notice and this permission notice shall be included // in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE // USE OR OTHER DEALINGS IN THE SOFTWARE. // resolves . and .. elements in a path array with directory names there // must be no slashes, empty elements, or device names (c:\) in the array // (so also no leading and trailing slashes - it does not distinguish // relative and absolute paths) function normalizeArray(parts, allowAboveRoot) { // if the path tries to go above the root, `up` ends up > 0 var up = 0; for (var i = parts.length - 1; i >= 0; i--) { var last = parts[i]; if (last === '.') { parts.splice(i, 1); } else if (last === '..') { parts.splice(i, 1); up++; } else if (up) { parts.splice(i, 1); up--; } } // if the path is allowed to go above the root, restore leading ..s if (allowAboveRoot) { for (; up--; up) { parts.unshift('..'); } } return parts; } // Split a filename into [root, dir, basename, ext], unix version // 'root' is just a slash, or nothing. var splitPathRe = /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/; var splitPath = function(filename) { return splitPathRe.exec(filename).slice(1); }; // path.resolve([from ...], to) // posix version exports.resolve = function() { var resolvedPath = '', resolvedAbsolute = false; for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) { var path = (i >= 0) ? arguments[i] : process.cwd(); // Skip empty and invalid entries if (typeof path !== 'string') { throw new TypeError('Arguments to path.resolve must be strings'); } else if (!path) { continue; } resolvedPath = path + '/' + resolvedPath; resolvedAbsolute = path.charAt(0) === '/'; } // At this point the path should be resolved to a full absolute path, but // handle relative paths to be safe (might happen when process.cwd() fails) // Normalize the path resolvedPath = normalizeArray(filter(resolvedPath.split('/'), function(p) { return !!p; }), !resolvedAbsolute).join('/'); return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.'; }; // path.normalize(path) // posix version exports.normalize = function(path) { var isAbsolute = exports.isAbsolute(path), trailingSlash = substr(path, -1) === '/'; // Normalize the path path = normalizeArray(filter(path.split('/'), function(p) { return !!p; }), !isAbsolute).join('/'); if (!path && !isAbsolute) { path = '.'; } if (path && trailingSlash) { path += '/'; } return (isAbsolute ? '/' : '') + path; }; // posix version exports.isAbsolute = function(path) { return path.charAt(0) === '/'; }; // posix version exports.join = function() { var paths = Array.prototype.slice.call(arguments, 0); return exports.normalize(filter(paths, function(p, index) { if (typeof p !== 'string') { throw new TypeError('Arguments to path.join must be strings'); } return p; }).join('/')); }; // path.relative(from, to) // posix version exports.relative = function(from, to) { from = exports.resolve(from).substr(1); to = exports.resolve(to).substr(1); function trim(arr) { var start = 0; for (; start < arr.length; start++) { if (arr[start] !== '') break; } var end = arr.length - 1; for (; end >= 0; end--) { if (arr[end] !== '') break; } if (start > end) return []; return arr.slice(start, end - start + 1); } var fromParts = trim(from.split('/')); var toParts = trim(to.split('/')); var length = Math.min(fromParts.length, toParts.length); var samePartsLength = length; for (var i = 0; i < length; i++) { if (fromParts[i] !== toParts[i]) { samePartsLength = i; break; } } var outputParts = []; for (var i = samePartsLength; i < fromParts.length; i++) { outputParts.push('..'); } outputParts = outputParts.concat(toParts.slice(samePartsLength)); return outputParts.join('/'); }; exports.sep = '/'; exports.delimiter = ':'; exports.dirname = function(path) { var result = splitPath(path), root = result[0], dir = result[1]; if (!root && !dir) { // No dirname whatsoever return '.'; } if (dir) { // It has a dirname, strip trailing slash dir = dir.substr(0, dir.length - 1); } return root + dir; }; exports.basename = function(path, ext) { var f = splitPath(path)[2]; // TODO: make this comparison case-insensitive on windows? if (ext && f.substr(-1 * ext.length) === ext) { f = f.substr(0, f.length - ext.length); } return f; }; exports.extname = function(path) { return splitPath(path)[3]; }; function filter (xs, f) { if (xs.filter) return xs.filter(f); var res = []; for (var i = 0; i < xs.length; i++) { if (f(xs[i], i, xs)) res.push(xs[i]); } return res; } // String.prototype.substr - negative index don't work in IE8 var substr = 'ab'.substr(-1) === 'b' ? function (str, start, len) { return str.substr(start, len) } : function (str, start, len) { if (start < 0) start = str.length + start; return str.substr(start, len); } ; }).call(this,require('_process')) },{"_process":104}],102:[function(require,module,exports){ (function (Buffer){ var createHmac = require('create-hmac') var MAX_ALLOC = Math.pow(2, 30) - 1 // default in iojs exports.pbkdf2 = pbkdf2 function pbkdf2 (password, salt, iterations, keylen, digest, callback) { if (typeof digest === 'function') { callback = digest digest = undefined } if (typeof callback !== 'function') { throw new Error('No callback provided to pbkdf2') } var result = pbkdf2Sync(password, salt, iterations, keylen, digest) setTimeout(function () { callback(undefined, result) }) } exports.pbkdf2Sync = pbkdf2Sync function pbkdf2Sync (password, salt, iterations, keylen, digest) { if (typeof iterations !== 'number') { throw new TypeError('Iterations not a number') } if (iterations < 0) { throw new TypeError('Bad iterations') } if (typeof keylen !== 'number') { throw new TypeError('Key length not a number') } if (keylen < 0 || keylen > MAX_ALLOC) { throw new TypeError('Bad key length') } digest = digest || 'sha1' if (!Buffer.isBuffer(password)) password = new Buffer(password, 'binary') if (!Buffer.isBuffer(salt)) salt = new Buffer(salt, 'binary') var hLen var l = 1 var DK = new Buffer(keylen) var block1 = new Buffer(salt.length + 4) salt.copy(block1, 0, 0, salt.length) var r var T for (var i = 1; i <= 0="" l;="" i++)="" {="" block1.writeuint32be(i,="" salt.length)="" var="" u="createHmac(digest," password).update(block1).digest()="" if="" (!hlen)="" hlen="U.length" t="new" buffer(hlen)="" l="Math.ceil(keylen" hlen)="" r="keylen" -="" (l="" 1)="" *="" }="" u.copy(t,="" 0,="" for="" (var="" j="1;" <="" iterations;="" j++)="" password).update(u).digest()="" k="0;" hlen;="" k++)="" t[k]="" ^="U[k]" destpos="(i" len="(i" =="=" ?="" :="" t.copy(dk,="" destpos,="" len)="" return="" dk="" }).call(this,require("buffer").buffer)="" },{"buffer":45,"create-hmac":53}],103:[function(require,module,exports){="" (function="" (process){="" 'use="" strict';="" (!process.version="" ||="" process.version.indexof('v0.')="==" process.version.indexof('v1.')="==" &&="" process.version.indexof('v1.8.')="" !="=" 0)="" module.exports="nextTick;" else="" function="" nexttick(fn)="" args="new" array(arguments.length="" 1);="" i="0;" while="" (i="" args.length)="" args[i++]="arguments[i];" process.nexttick(function="" aftertick()="" fn.apply(null,="" args);="" });="" }).call(this,require('_process'))="" },{"_process":104}],104:[function(require,module,exports){="" shim="" using="" process="" in="" browser="" {};="" queue="[];" draining="false;" currentqueue;="" queueindex="-1;" cleanupnexttick()="" (currentqueue.length)="" (queue.length)="" drainqueue();="" drainqueue()="" (draining)="" return;="" timeout="setTimeout(cleanUpNextTick);" while(len)="" currentqueue="queue;" (++queueindex="" (currentqueue)="" currentqueue[queueindex].run();="" cleartimeout(timeout);="" process.nexttick="function" (fun)="" (arguments.length=""> 1) { for (var i = 1; i < arguments.length; i++) { args[i - 1] = arguments[i]; } } queue.push(new Item(fun, args)); if (queue.length === 1 && !draining) { setTimeout(drainQueue, 0); } }; // v8 likes predictible objects function Item(fun, array) { this.fun = fun; this.array = array; } Item.prototype.run = function () { this.fun.apply(null, this.array); }; process.title = 'browser'; process.browser = true; process.env = {}; process.argv = []; process.version = ''; // empty string to avoid regexp issues process.versions = {}; function noop() {} process.on = noop; process.addListener = noop; process.once = noop; process.off = noop; process.removeListener = noop; process.removeAllListeners = noop; process.emit = noop; process.binding = function (name) { throw new Error('process.binding is not supported'); }; process.cwd = function () { return '/' }; process.chdir = function (dir) { throw new Error('process.chdir is not supported'); }; process.umask = function() { return 0; }; },{}],105:[function(require,module,exports){ exports.publicEncrypt = require('./publicEncrypt'); exports.privateDecrypt = require('./privateDecrypt'); exports.privateEncrypt = function privateEncrypt(key, buf) { return exports.publicEncrypt(key, buf, true); }; exports.publicDecrypt = function publicDecrypt(key, buf) { return exports.privateDecrypt(key, buf, true); }; },{"./privateDecrypt":107,"./publicEncrypt":108}],106:[function(require,module,exports){ (function (Buffer){ var createHash = require('create-hash'); module.exports = function (seed, len) { var t = new Buffer(''); var i = 0, c; while (t.length < len) { c = i2ops(i++); t = Buffer.concat([t, createHash('sha1').update(seed).update(c).digest()]); } return t.slice(0, len); }; function i2ops(c) { var out = new Buffer(4); out.writeUInt32BE(c,0); return out; } }).call(this,require("buffer").Buffer) },{"buffer":45,"create-hash":50}],107:[function(require,module,exports){ (function (Buffer){ var parseKeys = require('parse-asn1'); var mgf = require('./mgf'); var xor = require('./xor'); var bn = require('bn.js'); var crt = require('browserify-rsa'); var createHash = require('create-hash'); var withPublic = require('./withPublic'); module.exports = function privateDecrypt(private_key, enc, reverse) { var padding; if (private_key.padding) { padding = private_key.padding; } else if (reverse) { padding = 1; } else { padding = 4; } var key = parseKeys(private_key); var k = key.modulus.byteLength(); if (enc.length > k || new bn(enc).cmp(key.modulus) >= 0) { throw new Error('decryption error'); } var msg; if (reverse) { msg = withPublic(new bn(enc), key); } else { msg = crt(enc, key); } var zBuffer = new Buffer(k - msg.length); zBuffer.fill(0); msg = Buffer.concat([zBuffer, msg], k); if (padding === 4) { return oaep(key, msg); } else if (padding === 1) { return pkcs1(key, msg, reverse); } else if (padding === 3) { return msg; } else { throw new Error('unknown padding'); } }; function oaep(key, msg){ var n = key.modulus; var k = key.modulus.byteLength(); var mLen = msg.length; var iHash = createHash('sha1').update(new Buffer('')).digest(); var hLen = iHash.length; var hLen2 = 2 * hLen; if (msg[0] !== 0) { throw new Error('decryption error'); } var maskedSeed = msg.slice(1, hLen + 1); var maskedDb = msg.slice(hLen + 1); var seed = xor(maskedSeed, mgf(maskedDb, hLen)); var db = xor(maskedDb, mgf(seed, k - hLen - 1)); if (compare(iHash, db.slice(0, hLen))) { throw new Error('decryption error'); } var i = hLen; while (db[i] === 0) { i++; } if (db[i++] !== 1) { throw new Error('decryption error'); } return db.slice(i); } function pkcs1(key, msg, reverse){ var p1 = msg.slice(0, 2); var i = 2; var status = 0; while (msg[i++] !== 0) { if (i >= msg.length) { status++; break; } } var ps = msg.slice(2, i - 1); var p2 = msg.slice(i - 1, i); if ((p1.toString('hex') !== '0002' && !reverse) || (p1.toString('hex') !== '0001' && reverse)){ status++; } if (ps.length < 8) { status++; } if (status) { throw new Error('decryption error'); } return msg.slice(i); } function compare(a, b){ a = new Buffer(a); b = new Buffer(b); var dif = 0; var len = a.length; if (a.length !== b.length) { dif++; len = Math.min(a.length, b.length); } var i = -1; while (++i < len) { dif += (a[i] ^ b[i]); } return dif; } }).call(this,require("buffer").Buffer) },{"./mgf":106,"./withPublic":109,"./xor":110,"bn.js":17,"browserify-rsa":38,"buffer":45,"create-hash":50,"parse-asn1":100}],108:[function(require,module,exports){ (function (Buffer){ var parseKeys = require('parse-asn1'); var randomBytes = require('randombytes'); var createHash = require('create-hash'); var mgf = require('./mgf'); var xor = require('./xor'); var bn = require('bn.js'); var withPublic = require('./withPublic'); var crt = require('browserify-rsa'); var constants = { RSA_PKCS1_OAEP_PADDING: 4, RSA_PKCS1_PADDIN: 1, RSA_NO_PADDING: 3 }; module.exports = function publicEncrypt(public_key, msg, reverse) { var padding; if (public_key.padding) { padding = public_key.padding; } else if (reverse) { padding = 1; } else { padding = 4; } var key = parseKeys(public_key); var paddedMsg; if (padding === 4) { paddedMsg = oaep(key, msg); } else if (padding === 1) { paddedMsg = pkcs1(key, msg, reverse); } else if (padding === 3) { paddedMsg = new bn(msg); if (paddedMsg.cmp(key.modulus) >= 0) { throw new Error('data too long for modulus'); } } else { throw new Error('unknown padding'); } if (reverse) { return crt(paddedMsg, key); } else { return withPublic(paddedMsg, key); } }; function oaep(key, msg){ var k = key.modulus.byteLength(); var mLen = msg.length; var iHash = createHash('sha1').update(new Buffer('')).digest(); var hLen = iHash.length; var hLen2 = 2 * hLen; if (mLen > k - hLen2 - 2) { throw new Error('message too long'); } var ps = new Buffer(k - mLen - hLen2 - 2); ps.fill(0); var dblen = k - hLen - 1; var seed = randomBytes(hLen); var maskedDb = xor(Buffer.concat([iHash, ps, new Buffer([1]), msg], dblen), mgf(seed, dblen)); var maskedSeed = xor(seed, mgf(maskedDb, hLen)); return new bn(Buffer.concat([new Buffer([0]), maskedSeed, maskedDb], k)); } function pkcs1(key, msg, reverse){ var mLen = msg.length; var k = key.modulus.byteLength(); if (mLen > k - 11) { throw new Error('message too long'); } var ps; if (reverse) { ps = new Buffer(k - mLen - 3); ps.fill(0xff); } else { ps = nonZero(k - mLen - 3); } return new bn(Buffer.concat([new Buffer([0, reverse?1:2]), ps, new Buffer([0]), msg], k)); } function nonZero(len, crypto) { var out = new Buffer(len); var i = 0; var cache = randomBytes(len*2); var cur = 0; var num; while (i < len) { if (cur === cache.length) { cache = randomBytes(len*2); cur = 0; } num = cache[cur++]; if (num) { out[i++] = num; } } return out; } }).call(this,require("buffer").Buffer) },{"./mgf":106,"./withPublic":109,"./xor":110,"bn.js":17,"browserify-rsa":38,"buffer":45,"create-hash":50,"parse-asn1":100,"randombytes":111}],109:[function(require,module,exports){ (function (Buffer){ var bn = require('bn.js'); function withPublic(paddedMsg, key) { return new Buffer(paddedMsg .toRed(bn.mont(key.modulus)) .redPow(new bn(key.publicExponent)) .fromRed() .toArray()); } module.exports = withPublic; }).call(this,require("buffer").Buffer) },{"bn.js":17,"buffer":45}],110:[function(require,module,exports){ module.exports = function xor(a, b) { var len = a.length; var i = -1; while (++i < len) { a[i] ^= b[i]; } return a }; },{}],111:[function(require,module,exports){ (function (process,global,Buffer){ 'use strict' function oldBrowser () { throw new Error('secure random number generation not supported by this browser\nuse chrome, FireFox or Internet Explorer 11') } var crypto = global.crypto || global.msCrypto if (crypto && crypto.getRandomValues) { module.exports = randomBytes } else { module.exports = oldBrowser } function randomBytes (size, cb) { // phantomjs needs to throw if (size > 65536) throw new Error('requested too many random bytes') // in case browserify isn't using the Uint8Array version var rawBytes = new global.Uint8Array(size) // This will not work in older browsers. // See https://developer.mozilla.org/en-US/docs/Web/API/window.crypto.getRandomValues crypto.getRandomValues(rawBytes) // phantomjs doesn't like a buffer being passed here var bytes = new Buffer(rawBytes.buffer) if (typeof cb === 'function') { return process.nextTick(function () { cb(null, bytes) }) } return bytes } }).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {},require("buffer").Buffer) },{"_process":104,"buffer":45}],112:[function(require,module,exports){ module.exports = require("./lib/_stream_duplex.js") },{"./lib/_stream_duplex.js":113}],113:[function(require,module,exports){ // a duplex stream is just a stream that is both readable and writable. // Since JS doesn't have multiple prototypal inheritance, this class // prototypally inherits from Readable, and then parasitically from // Writable. 'use strict'; /**/ var objectKeys = Object.keys || function (obj) { var keys = []; for (var key in obj) keys.push(key); return keys; } /**/ module.exports = Duplex; /**/ var processNextTick = require('process-nextick-args'); /**/ /**/ var util = require('core-util-is'); util.inherits = require('inherits'); /**/ var Readable = require('./_stream_readable'); var Writable = require('./_stream_writable'); util.inherits(Duplex, Readable); var keys = objectKeys(Writable.prototype); for (var v = 0; v < keys.length; v++) { var method = keys[v]; if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method]; } function Duplex(options) { if (!(this instanceof Duplex)) return new Duplex(options); Readable.call(this, options); Writable.call(this, options); if (options && options.readable === false) this.readable = false; if (options && options.writable === false) this.writable = false; this.allowHalfOpen = true; if (options && options.allowHalfOpen === false) this.allowHalfOpen = false; this.once('end', onend); } // the no-half-open enforcer function onend() { // if we allow half-open state, or if the writable side ended, // then we're ok. if (this.allowHalfOpen || this._writableState.ended) return; // no more data can be written. // But allow more writes to happen in this tick. processNextTick(onEndNT, this); } function onEndNT(self) { self.end(); } function forEach (xs, f) { for (var i = 0, l = xs.length; i < l; i++) { f(xs[i], i); } } },{"./_stream_readable":115,"./_stream_writable":117,"core-util-is":48,"inherits":92,"process-nextick-args":103}],114:[function(require,module,exports){ // a passthrough stream. // basically just the most minimal sort of Transform stream. // Every written chunk gets output as-is. 'use strict'; module.exports = PassThrough; var Transform = require('./_stream_transform'); /**/ var util = require('core-util-is'); util.inherits = require('inherits'); /**/ util.inherits(PassThrough, Transform); function PassThrough(options) { if (!(this instanceof PassThrough)) return new PassThrough(options); Transform.call(this, options); } PassThrough.prototype._transform = function(chunk, encoding, cb) { cb(null, chunk); }; },{"./_stream_transform":116,"core-util-is":48,"inherits":92}],115:[function(require,module,exports){ (function (process){ 'use strict'; module.exports = Readable; /**/ var processNextTick = require('process-nextick-args'); /**/ /**/ var isArray = require('isarray'); /**/ /**/ var Buffer = require('buffer').Buffer; /**/ Readable.ReadableState = ReadableState; var EE = require('events'); /**/ var EElistenerCount = function(emitter, type) { return emitter.listeners(type).length; }; /**/ /**/ var Stream; (function (){try{ Stream = require('st' + 'ream'); }catch(_){}finally{ if (!Stream) Stream = require('events').EventEmitter; }}()) /**/ var Buffer = require('buffer').Buffer; /**/ var util = require('core-util-is'); util.inherits = require('inherits'); /**/ /**/ var debugUtil = require('util'); var debug; if (debugUtil && debugUtil.debuglog) { debug = debugUtil.debuglog('stream'); } else { debug = function () {}; } /**/ var StringDecoder; util.inherits(Readable, Stream); var Duplex; function ReadableState(options, stream) { Duplex = Duplex || require('./_stream_duplex'); options = options || {}; // object stream flag. Used to make read(n) ignore n and to // make all the buffer merging and length checks go away this.objectMode = !!options.objectMode; if (stream instanceof Duplex) this.objectMode = this.objectMode || !!options.readableObjectMode; // the point at which it stops calling _read() to fill the buffer // Note: 0 is a valid value, means "don't call _read preemptively ever" var hwm = options.highWaterMark; var defaultHwm = this.objectMode ? 16 : 16 * 1024; this.highWaterMark = (hwm || hwm === 0) ? hwm : defaultHwm; // cast to ints. this.highWaterMark = ~~this.highWaterMark; this.buffer = []; this.length = 0; this.pipes = null; this.pipesCount = 0; this.flowing = null; this.ended = false; this.endEmitted = false; this.reading = false; // a flag to be able to tell if the onwrite cb is called immediately, // or on a later tick. We set this to true at first, because any // actions that shouldn't happen until "later" should generally also // not happen before the first write call. this.sync = true; // whenever we return null, then we set a flag to say // that we're awaiting a 'readable' event emission. this.needReadable = false; this.emittedReadable = false; this.readableListening = false; // Crypto is kind of old and crusty. Historically, its default string // encoding is 'binary' so we have to make this configurable. // Everything else in the universe uses 'utf8', though. this.defaultEncoding = options.defaultEncoding || 'utf8'; // when piping, we only care about 'readable' events that happen // after read()ing all the bytes and not getting any pushback. this.ranOut = false; // the number of writers that are awaiting a drain event in .pipe()s this.awaitDrain = 0; // if true, a maybeReadMore has been scheduled this.readingMore = false; this.decoder = null; this.encoding = null; if (options.encoding) { if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder; this.decoder = new StringDecoder(options.encoding); this.encoding = options.encoding; } } var Duplex; function Readable(options) { Duplex = Duplex || require('./_stream_duplex'); if (!(this instanceof Readable)) return new Readable(options); this._readableState = new ReadableState(options, this); // legacy this.readable = true; if (options && typeof options.read === 'function') this._read = options.read; Stream.call(this); } // Manually shove something into the read() buffer. // This returns true if the highWaterMark has not been hit yet, // similar to how Writable.write() returns true if you should // write() some more. Readable.prototype.push = function(chunk, encoding) { var state = this._readableState; if (!state.objectMode && typeof chunk === 'string') { encoding = encoding || state.defaultEncoding; if (encoding !== state.encoding) { chunk = new Buffer(chunk, encoding); encoding = ''; } } return readableAddChunk(this, state, chunk, encoding, false); }; // Unshift should *always* be something directly out of read() Readable.prototype.unshift = function(chunk) { var state = this._readableState; return readableAddChunk(this, state, chunk, '', true); }; Readable.prototype.isPaused = function() { return this._readableState.flowing === false; }; function readableAddChunk(stream, state, chunk, encoding, addToFront) { var er = chunkInvalid(state, chunk); if (er) { stream.emit('error', er); } else if (chunk === null) { state.reading = false; onEofChunk(stream, state); } else if (state.objectMode || chunk && chunk.length > 0) { if (state.ended && !addToFront) { var e = new Error('stream.push() after EOF'); stream.emit('error', e); } else if (state.endEmitted && addToFront) { var e = new Error('stream.unshift() after end event'); stream.emit('error', e); } else { if (state.decoder && !addToFront && !encoding) chunk = state.decoder.write(chunk); if (!addToFront) state.reading = false; // if we want the data now, just emit it. if (state.flowing && state.length === 0 && !state.sync) { stream.emit('data', chunk); stream.read(0); } else { // update the buffer info. state.length += state.objectMode ? 1 : chunk.length; if (addToFront) state.buffer.unshift(chunk); else state.buffer.push(chunk); if (state.needReadable) emitReadable(stream); } maybeReadMore(stream, state); } } else if (!addToFront) { state.reading = false; } return needMoreData(state); } // if it's past the high water mark, we can push in some more. // Also, if we have no data yet, we can stand some // more bytes. This is to work around cases where hwm=0, // such as the repl. Also, if the push() triggered a // readable event, and the user called read(largeNumber) such that // needReadable was set, then we ought to push more, so that another // 'readable' event will be triggered. function needMoreData(state) { return !state.ended && (state.needReadable || state.length < state.highWaterMark || state.length === 0); } // backwards compatibility. Readable.prototype.setEncoding = function(enc) { if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder; this._readableState.decoder = new StringDecoder(enc); this._readableState.encoding = enc; return this; }; // Don't raise the hwm > 8MB var MAX_HWM = 0x800000; function computeNewHighWaterMark(n) { if (n >= MAX_HWM) { n = MAX_HWM; } else { // Get the next highest power of 2 n--; n |= n >>> 1; n |= n >>> 2; n |= n >>> 4; n |= n >>> 8; n |= n >>> 16; n++; } return n; } function howMuchToRead(n, state) { if (state.length === 0 && state.ended) return 0; if (state.objectMode) return n === 0 ? 0 : 1; if (n === null || isNaN(n)) { // only flow one buffer at a time if (state.flowing && state.buffer.length) return state.buffer[0].length; else return state.length; } if (n <= 0)="" return="" 0;="" if="" we're="" asking="" for="" more="" than="" the="" target="" buffer="" level,="" then="" raise="" water="" mark.="" bump="" up="" to="" next="" highest="" power="" of="" 2,="" prevent="" increasing="" it="" excessively="" in="" tiny="" amounts.="" (n=""> state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n); // don't have that much. return null, unless we've ended. if (n > state.length) { if (!state.ended) { state.needReadable = true; return 0; } else { return state.length; } } return n; } // you can override either this method, or the async _read(n) below. Readable.prototype.read = function(n) { debug('read', n); var state = this._readableState; var nOrig = n; if (typeof n !== 'number' || n > 0) state.emittedReadable = false; // if we're doing read(0) to trigger a readable event, but we // already have a bunch of data in the buffer, then just trigger // the 'readable' event and move on. if (n === 0 && state.needReadable && (state.length >= state.highWaterMark || state.ended)) { debug('read: emitReadable', state.length, state.ended); if (state.length === 0 && state.ended) endReadable(this); else emitReadable(this); return null; } n = howMuchToRead(n, state); // if we've ended, and we're now clear, then finish it up. if (n === 0 && state.ended) { if (state.length === 0) endReadable(this); return null; } // All the actual chunk generation logic needs to be // *below* the call to _read. The reason is that in certain // synthetic stream cases, such as passthrough streams, _read // may be a completely synchronous operation which may change // the state of the read buffer, providing enough data when // before there was *not* enough. // // So, the steps are: // 1. Figure out what the state of things will be after we do // a read from the buffer. // // 2. If that resulting state will trigger a _read, then call _read. // Note that this may be asynchronous, or synchronous. Yes, it is // deeply ugly to write APIs this way, but that still doesn't mean // that the Readable class should behave improperly, as streams are // designed to be sync/async agnostic. // Take note if the _read call is sync or async (ie, if the read call // has returned yet), so that we know whether or not it's safe to emit // 'readable' etc. // // 3. Actually pull the requested chunks out of the buffer and return. // if we need a readable event, then we need to do some reading. var doRead = state.needReadable; debug('need readable', doRead); // if we currently have less than the highWaterMark, then also read some if (state.length === 0 || state.length - n < state.highWaterMark) { doRead = true; debug('length less than watermark', doRead); } // however, if we've ended, then there's no point, and if we're already // reading, then it's unnecessary. if (state.ended || state.reading) { doRead = false; debug('reading or ended', doRead); } if (doRead) { debug('do read'); state.reading = true; state.sync = true; // if the length is currently zero, then we *need* a readable event. if (state.length === 0) state.needReadable = true; // call internal read method this._read(state.highWaterMark); state.sync = false; } // If _read pushed data synchronously, then `reading` will be false, // and we need to re-evaluate how much data we can return to the user. if (doRead && !state.reading) n = howMuchToRead(nOrig, state); var ret; if (n > 0) ret = fromList(n, state); else ret = null; if (ret === null) { state.needReadable = true; n = 0; } state.length -= n; // If we have nothing in the buffer, then we want to know // as soon as we *do* get something into the buffer. if (state.length === 0 && !state.ended) state.needReadable = true; // If we tried to read() past the EOF, then emit end on the next tick. if (nOrig !== n && state.ended && state.length === 0) endReadable(this); if (ret !== null) this.emit('data', ret); return ret; }; function chunkInvalid(state, chunk) { var er = null; if (!(Buffer.isBuffer(chunk)) && typeof chunk !== 'string' && chunk !== null && chunk !== undefined && !state.objectMode) { er = new TypeError('Invalid non-string/buffer chunk'); } return er; } function onEofChunk(stream, state) { if (state.ended) return; if (state.decoder) { var chunk = state.decoder.end(); if (chunk && chunk.length) { state.buffer.push(chunk); state.length += state.objectMode ? 1 : chunk.length; } } state.ended = true; // emit 'readable' now to make sure it gets picked up. emitReadable(stream); } // Don't emit readable right away in sync mode, because this can trigger // another read() call => stack overflow. This way, it might trigger // a nextTick recursion warning, but that's not so bad. function emitReadable(stream) { var state = stream._readableState; state.needReadable = false; if (!state.emittedReadable) { debug('emitReadable', state.flowing); state.emittedReadable = true; if (state.sync) processNextTick(emitReadable_, stream); else emitReadable_(stream); } } function emitReadable_(stream) { debug('emit readable'); stream.emit('readable'); flow(stream); } // at this point, the user has presumably seen the 'readable' event, // and called read() to consume some data. that may have triggered // in turn another _read(n) call, in which case reading = true if // it's in progress. // However, if we're not ended, or reading, and the length < hwm, // then go ahead and try to read some more preemptively. function maybeReadMore(stream, state) { if (!state.readingMore) { state.readingMore = true; processNextTick(maybeReadMore_, stream, state); } } function maybeReadMore_(stream, state) { var len = state.length; while (!state.reading && !state.flowing && !state.ended && state.length < state.highWaterMark) { debug('maybeReadMore read 0'); stream.read(0); if (len === state.length) // didn't get any data, stop spinning. break; else len = state.length; } state.readingMore = false; } // abstract method. to be overridden in specific implementation classes. // call cb(er, data) where data is <= 0="" 1="" n="" in="" length.="" for="" virtual="" (non-string,="" non-buffer)="" streams,="" "length"="" is="" somewhat="" arbitrary,="" and="" perhaps="" not="" very="" meaningful.="" readable.prototype._read="function(n)" {="" this.emit('error',="" new="" error('not="" implemented'));="" };="" readable.prototype.pipe="function(dest," pipeopts)="" var="" src="this;" state="this._readableState;" switch="" (state.pipescount)="" case="" 0:="" state.pipes="dest;" break;="" 1:="" dest];="" default:="" state.pipes.push(dest);="" }="" state.pipescount="" +="1;" debug('pipe="" count="%d" opts="%j'," state.pipescount,="" pipeopts);="" doend="(!pipeOpts" ||="" pipeopts.end="" !="=" false)="" &&="" dest="" process.stdout="" process.stderr;="" endfn="doEnd" ?="" onend="" :="" cleanup;="" if="" (state.endemitted)="" processnexttick(endfn);="" else="" src.once('end',="" endfn);="" dest.on('unpipe',="" onunpipe);="" function="" onunpipe(readable)="" debug('onunpipe');="" (readable="==" src)="" cleanup();="" onend()="" debug('onend');="" dest.end();="" when="" the="" drains,="" it="" reduces="" awaitdrain="" counter="" on="" source.="" this="" would="" be="" more="" elegant="" with="" a="" .once()="" handler="" flow(),="" but="" adding="" removing="" repeatedly="" too="" slow.="" ondrain="pipeOnDrain(src);" dest.on('drain',="" ondrain);="" cleanedup="false;" cleanup()="" debug('cleanup');="" cleanup="" event="" handlers="" once="" pipe="" broken="" dest.removelistener('close',="" onclose);="" dest.removelistener('finish',="" onfinish);="" dest.removelistener('drain',="" dest.removelistener('error',="" onerror);="" dest.removelistener('unpipe',="" src.removelistener('end',="" onend);="" cleanup);="" src.removelistener('data',="" ondata);="" reader="" waiting="" drain="" from="" specific="" writer,="" then="" cause="" to="" never="" start="" flowing="" again.="" so,="" awaiting="" drain,="" we="" just="" call="" now.="" don't="" know,="" assume="" that="" are="" one.="" (state.awaitdrain="" (!dest._writablestate="" dest._writablestate.needdrain))="" ondrain();="" src.on('data',="" ondata(chunk)="" debug('ondata');="" ret="dest.write(chunk);" (false="==" ret)="" user="" unpiped="" during="" `dest.write()`,="" possible="" get="" stuck="" permanently="" paused="" write="" also="" returned="" false.="" (state.pipescount="==" state.pipes[0]="==" src.listenercount('data')="==" !cleanedup)="" debug('false="" response,="" pause',="" src._readablestate.awaitdrain);="" src._readablestate.awaitdrain++;="" src.pause();="" has="" an="" error,="" stop="" piping="" into="" it.="" however,="" suppress="" throwing="" behavior="" this.="" onerror(er)="" debug('onerror',="" er);="" unpipe();="" (eelistenercount(dest,="" 'error')="==" 0)="" dest.emit('error',="" brutally="" ugly="" hack="" make="" sure="" our="" error="" attached="" before="" any="" userland="" ones.="" do="" (!dest._events="" !dest._events.error)="" dest.on('error',="" (isarray(dest._events.error))="" dest._events.error.unshift(onerror);="" dest._events.error="[onerror," dest._events.error];="" both="" close="" finish="" should="" trigger="" unpipe,="" only="" once.="" onclose()="" dest.once('close',="" onfinish()="" debug('onfinish');="" dest.once('finish',="" unpipe()="" debug('unpipe');="" src.unpipe(dest);="" tell="" it's="" being="" piped="" dest.emit('pipe',="" src);="" flow="" hasn't="" been="" started="" already.="" (!state.flowing)="" resume');="" src.resume();="" return="" dest;="" pipeondrain(src)="" function()="" debug('pipeondrain',="" state.awaitdrain);="" (state.awaitdrain)="" state.awaitdrain--;="" eelistenercount(src,="" 'data'))="" state.flowing="true;" flow(src);="" readable.prototype.unpipe="function(dest)" we're="" anywhere,="" nothing.="" this;="" one="" destination.="" most="" common="" case.="" 1)="" passed="" one,="" right="" (dest="" state.pipes)="" (!dest)="" got="" match.="" (dest)="" dest.emit('unpipe',="" this);="" slow="" multiple destinations.="" remove="" all.="" dests="state.pipes;" len="state.pipesCount;" (var="" i="0;" <="" len;="" i++)="" dests[i].emit('unpipe',="" try="" find="" dest);="" (i="==" -1)="" state.pipes.splice(i,="" 1);="" -="1;" set="" up="" data="" events="" they="" asked="" ensure="" readable="" listeners="" eventually="" something="" readable.prototype.on="function(ev," fn)="" res="Stream.prototype.on.call(this," ev,="" fn);="" listening="" data,="" explicitly="" paused,="" resume="" of="" next="" tick.="" (ev="==" 'data'="" false="" this._readablestate.flowing)="" this.resume();="" 'readable'="" this.readable)="" (!state.readablelistening)="" state.readablelistening="true;" state.emittedreadable="false;" state.needreadable="true;" (!state.reading)="" processnexttick(nreadingnexttick,="" (state.length)="" emitreadable(this,="" state);="" res;="" readable.prototype.addlistener="Readable.prototype.on;" nreadingnexttick(self)="" debug('readable="" nexttick="" read="" 0');="" self.read(0);="" pause()="" resume()="" remnants="" legacy="" stream="" api="" uses="" them,="" old="" mode.="" readable.prototype.resume="function()" debug('resume');="" resume(this,="" resume(stream,="" state)="" (!state.resumescheduled)="" state.resumescheduled="true;" processnexttick(resume_,="" stream,="" resume_(stream,="" debug('resume="" stream.read(0);="" stream.emit('resume');="" flow(stream);="" (state.flowing="" !state.reading)="" readable.prototype.pause="function()" debug('call="" pause="" this._readablestate.flowing);="" debug('pause');="" this._readablestate.flowing="false;" this.emit('pause');="" flow(stream)="" debug('flow',="" state.flowing);="" (state.flowing)="" chunk="stream.read();" while="" (null="" wrap="" old-style="" as="" async *not*="" part="" interface.="" unfortunate="" mess="" history.="" readable.prototype.wrap="function(stream)" self="this;" stream.on('end',="" debug('wrapped="" end');="" (state.decoder="" !state.ended)="" (chunk="" chunk.length)="" self.push(chunk);="" self.push(null);="" });="" stream.on('data',="" function(chunk)="" data');="" (state.decoder)="" skip="" over="" falsy="" values="" objectmode="" (state.objectmode="" null="" undefined))="" return;="" (!state.objectmode="" (!chunk="" !chunk.length))="" (!ret)="" stream.pause();="" proxy="" all="" other="" methods.="" important="" wrapping="" filters="" duplexes.="" stream)="" (this[i]="==" undefined="" typeof="" stream[i]="==" 'function')="" this[i]="function(method)" stream[method].apply(stream,="" arguments);="" }(i);="" certain="" events.="" 'close',="" 'destroy',="" 'pause',="" 'resume'];="" foreach(events,="" function(ev)="" stream.on(ev,="" self.emit.bind(self,="" ev));="" consume="" some="" bytes,="" simply="" unpause="" underlying="" stream.="" self._read="function(n)" _read',="" n);="" (paused)="" stream.resume();="" self;="" exposed="" testing="" purposes="" only.="" readable._fromlist="fromList;" pluck="" off="" bytes="" array="" buffers.="" length="" combined="" lengths="" buffers="" list.="" fromlist(n,="" list="state.buffer;" stringmode="!!state.decoder;" ret;="" nothing="" list,="" definitely="" empty.="" (list.length="==" null;="" (length="==" (objectmode)="" (!n="">= length) { // read it all, truncate the array. if (stringMode) ret = list.join(''); else if (list.length === 1) ret = list[0]; else ret = Buffer.concat(list, length); list.length = 0; } else { // read just some of it. if (n < list[0].length) { // just take a part of the first list item. // slice is the same for buffers and strings. var buf = list[0]; ret = buf.slice(0, n); list[0] = buf.slice(n); } else if (n === list[0].length) { // first list is a perfect match ret = list.shift(); } else { // complex case. // we have enough to cover it, but it spans past the first buffer. if (stringMode) ret = ''; else ret = new Buffer(n); var c = 0; for (var i = 0, l = list.length; i < l && c < n; i++) { var buf = list[0]; var cpy = Math.min(n - c, buf.length); if (stringMode) ret += buf.slice(0, cpy); else buf.copy(ret, c, 0, cpy); if (cpy < buf.length) list[0] = buf.slice(cpy); else list.shift(); c += cpy; } } } return ret; } function endReadable(stream) { var state = stream._readableState; // If we get here before consuming all the bytes, then that is a // bug in node. Should never happen. if (state.length > 0) throw new Error('endReadable called on non-empty stream'); if (!state.endEmitted) { state.ended = true; processNextTick(endReadableNT, state, stream); } } function endReadableNT(state, stream) { // Check that we didn't get one last unshift. if (!state.endEmitted && state.length === 0) { state.endEmitted = true; stream.readable = false; stream.emit('end'); } } function forEach (xs, f) { for (var i = 0, l = xs.length; i < l; i++) { f(xs[i], i); } } function indexOf (xs, x) { for (var i = 0, l = xs.length; i < l; i++) { if (xs[i] === x) return i; } return -1; } }).call(this,require('_process')) },{"./_stream_duplex":113,"_process":104,"buffer":45,"core-util-is":48,"events":82,"inherits":92,"isarray":94,"process-nextick-args":103,"string_decoder/":132,"util":19}],116:[function(require,module,exports){ // a transform stream is a readable/writable stream where you do // something with the data. Sometimes it's called a "filter", // but that's not a great name for it, since that implies a thing where // some bits pass through, and others are simply ignored. (That would // be a valid example of a transform, of course.) // // While the output is causally related to the input, it's not a // necessarily symmetric or synchronous transformation. For example, // a zlib stream might take multiple plain-text writes(), and then // emit a single compressed chunk some time in the future. // // Here's how this works: // // The Transform stream has all the aspects of the readable and writable // stream classes. When you write(chunk), that calls _write(chunk,cb) // internally, and returns false if there's a lot of pending writes // buffered up. When you call read(), that calls _read(n) until // there's enough pending readable data buffered up. // // In a transform stream, the written data is placed in a buffer. When // _read(n) is called, it transforms the queued up data, calling the // buffered _write cb's as it consumes chunks. If consuming a single // written chunk would result in multiple output chunks, then the first // outputted bit calls the readcb, and subsequent chunks just go into // the read buffer, and will cause it to emit 'readable' if necessary. // // This way, back-pressure is actually determined by the reading side, // since _read has to be called to start processing a new chunk. However, // a pathological inflate type of transform can cause excessive buffering // here. For example, imagine a stream where every byte of input is // interpreted as an integer from 0-255, and then results in that many // bytes of output. Writing the 4 bytes {ff,ff,ff,ff} would result in // 1kb of data being output. In this case, you could write a very small // amount of input, and end up with a very large amount of output. In // such a pathological inflating mechanism, there'd be no way to tell // the system to stop doing the transform. A single 4MB write could // cause the system to run out of memory. // // However, even in such a pathological case, only a single written chunk // would be consumed, and then the rest would wait (un-transformed) until // the results of the previous transformed chunk were consumed. 'use strict'; module.exports = Transform; var Duplex = require('./_stream_duplex'); /**/ var util = require('core-util-is'); util.inherits = require('inherits'); /**/ util.inherits(Transform, Duplex); function TransformState(stream) { this.afterTransform = function(er, data) { return afterTransform(stream, er, data); }; this.needTransform = false; this.transforming = false; this.writecb = null; this.writechunk = null; } function afterTransform(stream, er, data) { var ts = stream._transformState; ts.transforming = false; var cb = ts.writecb; if (!cb) return stream.emit('error', new Error('no writecb in Transform class')); ts.writechunk = null; ts.writecb = null; if (data !== null && data !== undefined) stream.push(data); if (cb) cb(er); var rs = stream._readableState; rs.reading = false; if (rs.needReadable || rs.length < rs.highWaterMark) { stream._read(rs.highWaterMark); } } function Transform(options) { if (!(this instanceof Transform)) return new Transform(options); Duplex.call(this, options); this._transformState = new TransformState(this); // when the writable side finishes, then flush out anything remaining. var stream = this; // start out asking for a readable event once data is transformed. this._readableState.needReadable = true; // we have implemented the _read method, and done the other things // that Readable wants before the first _read call, so unset the // sync guard flag. this._readableState.sync = false; if (options) { if (typeof options.transform === 'function') this._transform = options.transform; if (typeof options.flush === 'function') this._flush = options.flush; } this.once('prefinish', function() { if (typeof this._flush === 'function') this._flush(function(er) { done(stream, er); }); else done(stream); }); } Transform.prototype.push = function(chunk, encoding) { this._transformState.needTransform = false; return Duplex.prototype.push.call(this, chunk, encoding); }; // This is the part where you do stuff! // override this function in implementation classes. // 'chunk' is an input chunk. // // Call `push(newChunk)` to pass along transformed output // to the readable side. You may call 'push' zero or more times. // // Call `cb(err)` when you are done with this chunk. If you pass // an error, then that'll put the hurt on the whole operation. If you // never call cb(), then you'll never get another chunk. Transform.prototype._transform = function(chunk, encoding, cb) { throw new Error('not implemented'); }; Transform.prototype._write = function(chunk, encoding, cb) { var ts = this._transformState; ts.writecb = cb; ts.writechunk = chunk; ts.writeencoding = encoding; if (!ts.transforming) { var rs = this._readableState; if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark); } }; // Doesn't matter what the args are here. // _transform does all the work. // That we got here means that the readable side wants more data. Transform.prototype._read = function(n) { var ts = this._transformState; if (ts.writechunk !== null && ts.writecb && !ts.transforming) { ts.transforming = true; this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform); } else { // mark that we need a transform, so that any data that comes in // will get processed, now that we've asked for it. ts.needTransform = true; } }; function done(stream, er) { if (er) return stream.emit('error', er); // if there's nothing in the write buffer, then that means // that nothing more will ever be provided var ws = stream._writableState; var ts = stream._transformState; if (ws.length) throw new Error('calling transform done when ws.length != 0'); if (ts.transforming) throw new Error('calling transform done when still transforming'); return stream.push(null); } },{"./_stream_duplex":113,"core-util-is":48,"inherits":92}],117:[function(require,module,exports){ // A bit simpler than readable streams. // Implement an async ._write(chunk, encoding, cb), and it'll handle all // the drain event emission and buffering. 'use strict'; module.exports = Writable; /**/ var processNextTick = require('process-nextick-args'); /**/ /**/ var Buffer = require('buffer').Buffer; /**/ Writable.WritableState = WritableState; /**/ var util = require('core-util-is'); util.inherits = require('inherits'); /**/ /**/ var internalUtil = { deprecate: require('util-deprecate') }; /**/ /**/ var Stream; (function (){try{ Stream = require('st' + 'ream'); }catch(_){}finally{ if (!Stream) Stream = require('events').EventEmitter; }}()) /**/ var Buffer = require('buffer').Buffer; util.inherits(Writable, Stream); function nop() {} function WriteReq(chunk, encoding, cb) { this.chunk = chunk; this.encoding = encoding; this.callback = cb; this.next = null; } var Duplex; function WritableState(options, stream) { Duplex = Duplex || require('./_stream_duplex'); options = options || {}; // object stream flag to indicate whether or not this stream // contains buffers or objects. this.objectMode = !!options.objectMode; if (stream instanceof Duplex) this.objectMode = this.objectMode || !!options.writableObjectMode; // the point at which write() starts returning false // Note: 0 is a valid value, means that we always return false if // the entire buffer is not flushed immediately on write() var hwm = options.highWaterMark; var defaultHwm = this.objectMode ? 16 : 16 * 1024; this.highWaterMark = (hwm || hwm === 0) ? hwm : defaultHwm; // cast to ints. this.highWaterMark = ~~this.highWaterMark; this.needDrain = false; // at the start of calling end() this.ending = false; // when end() has been called, and returned this.ended = false; // when 'finish' is emitted this.finished = false; // should we decode strings into buffers before passing to _write? // this is here so that some node-core streams can optimize string // handling at a lower level. var noDecode = options.decodeStrings === false; this.decodeStrings = !noDecode; // Crypto is kind of old and crusty. Historically, its default string // encoding is 'binary' so we have to make this configurable. // Everything else in the universe uses 'utf8', though. this.defaultEncoding = options.defaultEncoding || 'utf8'; // not an actual buffer we keep track of, but a measurement // of how much we're waiting to get pushed to some underlying // socket or file. this.length = 0; // a flag to see when we're in the middle of a write. this.writing = false; // when true all writes will be buffered until .uncork() call this.corked = 0; // a flag to be able to tell if the onwrite cb is called immediately, // or on a later tick. We set this to true at first, because any // actions that shouldn't happen until "later" should generally also // not happen before the first write call. this.sync = true; // a flag to know if we're processing previously buffered items, which // may call the _write() callback in the same tick, so that we don't // end up in an overlapped onwrite situation. this.bufferProcessing = false; // the callback that's passed to _write(chunk,cb) this.onwrite = function(er) { onwrite(stream, er); }; // the callback that the user supplies to write(chunk,encoding,cb) this.writecb = null; // the amount that is being written when _write is called. this.writelen = 0; this.bufferedRequest = null; this.lastBufferedRequest = null; // number of pending user-supplied write callbacks // this must be 0 before 'finish' can be emitted this.pendingcb = 0; // emit prefinish if the only thing we're waiting for is _write cbs // This is relevant for synchronous Transform streams this.prefinished = false; // True if the error was already emitted and should not be thrown again this.errorEmitted = false; } WritableState.prototype.getBuffer = function writableStateGetBuffer() { var current = this.bufferedRequest; var out = []; while (current) { out.push(current); current = current.next; } return out; }; (function (){try { Object.defineProperty(WritableState.prototype, 'buffer', { get: internalUtil.deprecate(function() { return this.getBuffer(); }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.') }); }catch(_){}}()); var Duplex; function Writable(options) { Duplex = Duplex || require('./_stream_duplex'); // Writable ctor is applied to Duplexes, though they're not // instanceof Writable, they're instanceof Readable. if (!(this instanceof Writable) && !(this instanceof Duplex)) return new Writable(options); this._writableState = new WritableState(options, this); // legacy. this.writable = true; if (options) { if (typeof options.write === 'function') this._write = options.write; if (typeof options.writev === 'function') this._writev = options.writev; } Stream.call(this); } // Otherwise people can pipe Writable streams, which is just wrong. Writable.prototype.pipe = function() { this.emit('error', new Error('Cannot pipe. Not readable.')); }; function writeAfterEnd(stream, cb) { var er = new Error('write after end'); // TODO: defer error events consistently everywhere, not just the cb stream.emit('error', er); processNextTick(cb, er); } // If we get something that is not a buffer, string, null, or undefined, // and we're not in objectMode, then that's an error. // Otherwise stream chunks are all considered to be of length=1, and the // watermarks determine how many objects to keep in the buffer, rather than // how many bytes or characters. function validChunk(stream, state, chunk, cb) { var valid = true; if (!(Buffer.isBuffer(chunk)) && typeof chunk !== 'string' && chunk !== null && chunk !== undefined && !state.objectMode) { var er = new TypeError('Invalid non-string/buffer chunk'); stream.emit('error', er); processNextTick(cb, er); valid = false; } return valid; } Writable.prototype.write = function(chunk, encoding, cb) { var state = this._writableState; var ret = false; if (typeof encoding === 'function') { cb = encoding; encoding = null; } if (Buffer.isBuffer(chunk)) encoding = 'buffer'; else if (!encoding) encoding = state.defaultEncoding; if (typeof cb !== 'function') cb = nop; if (state.ended) writeAfterEnd(this, cb); else if (validChunk(this, state, chunk, cb)) { state.pendingcb++; ret = writeOrBuffer(this, state, chunk, encoding, cb); } return ret; }; Writable.prototype.cork = function() { var state = this._writableState; state.corked++; }; Writable.prototype.uncork = function() { var state = this._writableState; if (state.corked) { state.corked--; if (!state.writing && !state.corked && !state.finished && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state); } }; Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) { // node::ParseEncoding() requires lower case. if (typeof encoding === 'string') encoding = encoding.toLowerCase(); if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2','utf16le', 'utf-16le', 'raw'] .indexOf((encoding + '').toLowerCase()) > -1)) throw new TypeError('Unknown encoding: ' + encoding); this._writableState.defaultEncoding = encoding; }; function decodeChunk(state, chunk, encoding) { if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') { chunk = new Buffer(chunk, encoding); } return chunk; } // if we're already writing something, then just put this // in the queue, and wait our turn. Otherwise, call _write // If we return false, then we need a drain event, so set that flag. function writeOrBuffer(stream, state, chunk, encoding, cb) { chunk = decodeChunk(state, chunk, encoding); if (Buffer.isBuffer(chunk)) encoding = 'buffer'; var len = state.objectMode ? 1 : chunk.length; state.length += len; var ret = state.length < state.highWaterMark; // we must ensure that previous needDrain will not be reset to false. if (!ret) state.needDrain = true; if (state.writing || state.corked) { var last = state.lastBufferedRequest; state.lastBufferedRequest = new WriteReq(chunk, encoding, cb); if (last) { last.next = state.lastBufferedRequest; } else { state.bufferedRequest = state.lastBufferedRequest; } } else { doWrite(stream, state, false, len, chunk, encoding, cb); } return ret; } function doWrite(stream, state, writev, len, chunk, encoding, cb) { state.writelen = len; state.writecb = cb; state.writing = true; state.sync = true; if (writev) stream._writev(chunk, state.onwrite); else stream._write(chunk, encoding, state.onwrite); state.sync = false; } function onwriteError(stream, state, sync, er, cb) { --state.pendingcb; if (sync) processNextTick(cb, er); else cb(er); stream._writableState.errorEmitted = true; stream.emit('error', er); } function onwriteStateUpdate(state) { state.writing = false; state.writecb = null; state.length -= state.writelen; state.writelen = 0; } function onwrite(stream, er) { var state = stream._writableState; var sync = state.sync; var cb = state.writecb; onwriteStateUpdate(state); if (er) onwriteError(stream, state, sync, er, cb); else { // Check if we're actually ready to finish, but don't emit yet var finished = needFinish(state); if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) { clearBuffer(stream, state); } if (sync) { processNextTick(afterWrite, stream, state, finished, cb); } else { afterWrite(stream, state, finished, cb); } } } function afterWrite(stream, state, finished, cb) { if (!finished) onwriteDrain(stream, state); state.pendingcb--; cb(); finishMaybe(stream, state); } // Must force callback to be called on nextTick, so that we don't // emit 'drain' before the write() consumer gets the 'false' return // value, and has a chance to attach a 'drain' listener. function onwriteDrain(stream, state) { if (state.length === 0 && state.needDrain) { state.needDrain = false; stream.emit('drain'); } } // if there's something in the buffer waiting, then process it function clearBuffer(stream, state) { state.bufferProcessing = true; var entry = state.bufferedRequest; if (stream._writev && entry && entry.next) { // Fast case, write everything using _writev() var buffer = []; var cbs = []; while (entry) { cbs.push(entry.callback); buffer.push(entry); entry = entry.next; } // count the one we are adding, as well. // TODO(isaacs) clean this up state.pendingcb++; state.lastBufferedRequest = null; doWrite(stream, state, true, state.length, buffer, '', function(err) { for (var i = 0; i < cbs.length; i++) { state.pendingcb--; cbs[i](err); } }); // Clear buffer } else { // Slow case, write chunks one-by-one while (entry) { var chunk = entry.chunk; var encoding = entry.encoding; var cb = entry.callback; var len = state.objectMode ? 1 : chunk.length; doWrite(stream, state, false, len, chunk, encoding, cb); entry = entry.next; // if we didn't call the onwrite immediately, then // it means that we need to wait until it does. // also, that means that the chunk and cb are currently // being processed, so move the buffer counter past them. if (state.writing) { break; } } if (entry === null) state.lastBufferedRequest = null; } state.bufferedRequest = entry; state.bufferProcessing = false; } Writable.prototype._write = function(chunk, encoding, cb) { cb(new Error('not implemented')); }; Writable.prototype._writev = null; Writable.prototype.end = function(chunk, encoding, cb) { var state = this._writableState; if (typeof chunk === 'function') { cb = chunk; chunk = null; encoding = null; } else if (typeof encoding === 'function') { cb = encoding; encoding = null; } if (chunk !== null && chunk !== undefined) this.write(chunk, encoding); // .end() fully uncorks if (state.corked) { state.corked = 1; this.uncork(); } // ignore unnecessary end() calls. if (!state.ending && !state.finished) endWritable(this, state, cb); }; function needFinish(state) { return (state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing); } function prefinish(stream, state) { if (!state.prefinished) { state.prefinished = true; stream.emit('prefinish'); } } function finishMaybe(stream, state) { var need = needFinish(state); if (need) { if (state.pendingcb === 0) { prefinish(stream, state); state.finished = true; stream.emit('finish'); } else { prefinish(stream, state); } } return need; } function endWritable(stream, state, cb) { state.ending = true; finishMaybe(stream, state); if (cb) { if (state.finished) processNextTick(cb); else stream.once('finish', cb); } state.ended = true; } },{"./_stream_duplex":113,"buffer":45,"core-util-is":48,"events":82,"inherits":92,"process-nextick-args":103,"util-deprecate":133}],118:[function(require,module,exports){ module.exports = require("./lib/_stream_passthrough.js") },{"./lib/_stream_passthrough.js":114}],119:[function(require,module,exports){ var Stream = (function (){ try { return require('st' + 'ream'); // hack to fix a circular dependency issue when used with browserify } catch(_){} }()); exports = module.exports = require('./lib/_stream_readable.js'); exports.Stream = Stream || exports; exports.Readable = exports; exports.Writable = require('./lib/_stream_writable.js'); exports.Duplex = require('./lib/_stream_duplex.js'); exports.Transform = require('./lib/_stream_transform.js'); exports.PassThrough = require('./lib/_stream_passthrough.js'); },{"./lib/_stream_duplex.js":113,"./lib/_stream_passthrough.js":114,"./lib/_stream_readable.js":115,"./lib/_stream_transform.js":116,"./lib/_stream_writable.js":117}],120:[function(require,module,exports){ module.exports = require("./lib/_stream_transform.js") },{"./lib/_stream_transform.js":116}],121:[function(require,module,exports){ module.exports = require("./lib/_stream_writable.js") },{"./lib/_stream_writable.js":117}],122:[function(require,module,exports){ (function (Buffer){ /* CryptoJS v3.1.2 code.google.com/p/crypto-js (c) 2009-2013 by Jeff Mott. All rights reserved. code.google.com/p/crypto-js/wiki/License */ /** @preserve (c) 2012 by Cédric Mesnil. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ // constants table var zl = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8, 3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12, 1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2, 4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13 ] var zr = [ 5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12, 6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2, 15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13, 8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14, 12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11 ] var sl = [ 11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8, 7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12, 11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5, 11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12, 9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6 ] var sr = [ 8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6, 9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11, 9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5, 15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8, 8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11 ] var hl = [0x00000000, 0x5A827999, 0x6ED9EBA1, 0x8F1BBCDC, 0xA953FD4E] var hr = [0x50A28BE6, 0x5C4DD124, 0x6D703EF3, 0x7A6D76E9, 0x00000000] function bytesToWords (bytes) { var words = [] for (var i = 0, b = 0; i < bytes.length; i++, b += 8) { words[b >>> 5] |= bytes[i] << (24 - b % 32) } return words } function wordsToBytes (words) { var bytes = [] for (var b = 0; b < words.length * 32; b += 8) { bytes.push((words[b >>> 5] >>> (24 - b % 32)) & 0xFF) } return bytes } function processBlock (H, M, offset) { // swap endian for (var i = 0; i < 16; i++) { var offset_i = offset + i var M_offset_i = M[offset_i] // Swap M[offset_i] = ( (((M_offset_i << 8) | (M_offset_i >>> 24)) & 0x00ff00ff) | (((M_offset_i << 24) | (M_offset_i >>> 8)) & 0xff00ff00) ) } // Working variables var al, bl, cl, dl, el var ar, br, cr, dr, er ar = al = H[0] br = bl = H[1] cr = cl = H[2] dr = dl = H[3] er = el = H[4] // computation var t for (i = 0; i < 80; i += 1) { t = (al + M[offset + zl[i]]) | 0 if (i < 16) { t += f1(bl, cl, dl) + hl[0] } else if (i < 32) { t += f2(bl, cl, dl) + hl[1] } else if (i < 48) { t += f3(bl, cl, dl) + hl[2] } else if (i < 64) { t += f4(bl, cl, dl) + hl[3] } else {// if (i<80) 0="" {="" t="" +="f5(bl," cl,="" dl)="" hl[4]="" }="" |="" sl[i])="" el)="" al="el" el="dl" dl="rotl(cl," 10)="" cl="bl" bl="t" m[offset="" zr[i]])="" if="" (i="" <="" 16)="" cr,="" dr)="" hr[0]="" else="" 32)="" hr[1]="" 48)="" hr[2]="" 64)="" hr[3]="" (i<80)="" hr[4]="" sr[i])="" er)="" ar="er" er="dr" dr="rotl(cr," cr="br" br="t" intermediate="" hash="" value="" h[1]="(H[2]" h[2]="(H[3]" ar)="" h[3]="(H[4]" br)="" h[4]="(H[0]" cr)="" h[0]="t" function="" f1="" (x,="" y,="" z)="" return="" ((x)="" ^="" (y)="" (z))="" f2="" (((x)="" &="" (y))="" ((~x)="" (z)))="" f3="" (~(y)))="" f4="" ((y)="" (~(z))))="" f5="" rotl="" n)="" (x="" <<="">>> (32 - n)) } function ripemd160 (message) { var H = [0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476, 0xC3D2E1F0] if (typeof message === 'string') { message = new Buffer(message, 'utf8') } var m = bytesToWords(message) var nBitsLeft = message.length * 8 var nBitsTotal = message.length * 8 // Add padding m[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32) m[(((nBitsLeft + 64) >>> 9) << 4) + 14] = ( (((nBitsTotal << 8) | (nBitsTotal >>> 24)) & 0x00ff00ff) | (((nBitsTotal << 24) | (nBitsTotal >>> 8)) & 0xff00ff00) ) for (var i = 0; i < m.length; i += 16) { processBlock(H, m, i) } // swap endian for (i = 0; i < 5; i++) { // shortcut var H_i = H[i] // Swap H[i] = (((H_i << 8) | (H_i >>> 24)) & 0x00ff00ff) | (((H_i << 24) | (H_i >>> 8)) & 0xff00ff00) } var digestbytes = wordsToBytes(H) return new Buffer(digestbytes) } module.exports = ripemd160 }).call(this,require("buffer").Buffer) },{"buffer":45}],123:[function(require,module,exports){ (function (Buffer){ // prototype class for hash functions function Hash (blockSize, finalSize) { this._block = new Buffer(blockSize) this._finalSize = finalSize this._blockSize = blockSize this._len = 0 this._s = 0 } Hash.prototype.update = function (data, enc) { if (typeof data === 'string') { enc = enc || 'utf8' data = new Buffer(data, enc) } var l = this._len += data.length var s = this._s || 0 var f = 0 var buffer = this._block while (s < l) { var t = Math.min(data.length, f + this._blockSize - (s % this._blockSize)) var ch = (t - f) for (var i = 0; i < ch; i++) { buffer[(s % this._blockSize) + i] = data[i + f] } s += ch f += ch if ((s % this._blockSize) === 0) { this._update(buffer) } } this._s = s return this } Hash.prototype.digest = function (enc) { // Suppose the length of the message M, in bits, is l var l = this._len * 8 // Append the bit 1 to the end of the message this._block[this._len % this._blockSize] = 0x80 // and then k zero bits, where k is the smallest non-negative solution to the equation (l + 1 + k) === finalSize mod blockSize this._block.fill(0, this._len % this._blockSize + 1) if (l % (this._blockSize * 8) >= this._finalSize * 8) { this._update(this._block) this._block.fill(0) } // to this append the block which is equal to the number l written in binary // TODO: handle case where l is > Math.pow(2, 29) this._block.writeInt32BE(l, this._blockSize - 4) var hash = this._update(this._block) || this._hash() return enc ? hash.toString(enc) : hash } Hash.prototype._update = function () { throw new Error('_update must be implemented by subclass') } module.exports = Hash }).call(this,require("buffer").Buffer) },{"buffer":45}],124:[function(require,module,exports){ var exports = module.exports = function SHA (algorithm) { algorithm = algorithm.toLowerCase() var Algorithm = exports[algorithm] if (!Algorithm) throw new Error(algorithm + ' is not supported (we accept pull requests)') return new Algorithm() } exports.sha = require('./sha') exports.sha1 = require('./sha1') exports.sha224 = require('./sha224') exports.sha256 = require('./sha256') exports.sha384 = require('./sha384') exports.sha512 = require('./sha512') },{"./sha":125,"./sha1":126,"./sha224":127,"./sha256":128,"./sha384":129,"./sha512":130}],125:[function(require,module,exports){ (function (Buffer){ /* * A JavaScript implementation of the Secure Hash Algorithm, SHA-0, as defined * in FIPS PUB 180-1 * This source code is derived from sha1.js of the same repository. * The difference between SHA-0 and SHA-1 is just a bitwise rotate left * operation was added. */ var inherits = require('inherits') var Hash = require('./hash') var W = new Array(80) function Sha () { this.init() this._w = W Hash.call(this, 64, 56) } inherits(Sha, Hash) Sha.prototype.init = function () { this._a = 0x67452301 | 0 this._b = 0xefcdab89 | 0 this._c = 0x98badcfe | 0 this._d = 0x10325476 | 0 this._e = 0xc3d2e1f0 | 0 return this } /* * Bitwise rotate a 32-bit number to the left. */ function rol (num, cnt) { return (num << cnt) | (num >>> (32 - cnt)) } Sha.prototype._update = function (M) { var W = this._w var a = this._a var b = this._b var c = this._c var d = this._d var e = this._e var j = 0 var k /* * SHA-1 has a bitwise rotate left operation. But, SHA is not * function calcW() { return rol(W[j - 3] ^ W[j - 8] ^ W[j - 14] ^ W[j - 16], 1) } */ function calcW () { return W[j - 3] ^ W[j - 8] ^ W[j - 14] ^ W[j - 16] } function loop (w, f) { W[j] = w var t = rol(a, 5) + f + e + w + k e = d d = c c = rol(b, 30) b = a a = t j++ } k = 1518500249 while (j < 16) loop(M.readInt32BE(j * 4), (b & c) | ((~b) & d)) while (j < 20) loop(calcW(), (b & c) | ((~b) & d)) k = 1859775393 while (j < 40) loop(calcW(), b ^ c ^ d) k = -1894007588 while (j < 60) loop(calcW(), (b & c) | (b & d) | (c & d)) k = -899497514 while (j < 80) loop(calcW(), b ^ c ^ d) this._a = (a + this._a) | 0 this._b = (b + this._b) | 0 this._c = (c + this._c) | 0 this._d = (d + this._d) | 0 this._e = (e + this._e) | 0 } Sha.prototype._hash = function () { var H = new Buffer(20) H.writeInt32BE(this._a | 0, 0) H.writeInt32BE(this._b | 0, 4) H.writeInt32BE(this._c | 0, 8) H.writeInt32BE(this._d | 0, 12) H.writeInt32BE(this._e | 0, 16) return H } module.exports = Sha }).call(this,require("buffer").Buffer) },{"./hash":123,"buffer":45,"inherits":92}],126:[function(require,module,exports){ (function (Buffer){ /* * A JavaScript implementation of the Secure Hash Algorithm, SHA-1, as defined * in FIPS PUB 180-1 * Version 2.1a Copyright Paul Johnston 2000 - 2002. * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet * Distributed under the BSD License * See http://pajhome.org.uk/crypt/md5 for details. */ var inherits = require('inherits') var Hash = require('./hash') var W = new Array(80) function Sha1 () { this.init() this._w = W Hash.call(this, 64, 56) } inherits(Sha1, Hash) Sha1.prototype.init = function () { this._a = 0x67452301 | 0 this._b = 0xefcdab89 | 0 this._c = 0x98badcfe | 0 this._d = 0x10325476 | 0 this._e = 0xc3d2e1f0 | 0 return this } /* * Bitwise rotate a 32-bit number to the left. */ function rol (num, cnt) { return (num << cnt) | (num >>> (32 - cnt)) } Sha1.prototype._update = function (M) { var W = this._w var a = this._a var b = this._b var c = this._c var d = this._d var e = this._e var j = 0 var k function calcW () { return rol(W[j - 3] ^ W[j - 8] ^ W[j - 14] ^ W[j - 16], 1) } function loop (w, f) { W[j] = w var t = rol(a, 5) + f + e + w + k e = d d = c c = rol(b, 30) b = a a = t j++ } k = 1518500249 while (j < 16) loop(M.readInt32BE(j * 4), (b & c) | ((~b) & d)) while (j < 20) loop(calcW(), (b & c) | ((~b) & d)) k = 1859775393 while (j < 40) loop(calcW(), b ^ c ^ d) k = -1894007588 while (j < 60) loop(calcW(), (b & c) | (b & d) | (c & d)) k = -899497514 while (j < 80) loop(calcW(), b ^ c ^ d) this._a = (a + this._a) | 0 this._b = (b + this._b) | 0 this._c = (c + this._c) | 0 this._d = (d + this._d) | 0 this._e = (e + this._e) | 0 } Sha1.prototype._hash = function () { var H = new Buffer(20) H.writeInt32BE(this._a | 0, 0) H.writeInt32BE(this._b | 0, 4) H.writeInt32BE(this._c | 0, 8) H.writeInt32BE(this._d | 0, 12) H.writeInt32BE(this._e | 0, 16) return H } module.exports = Sha1 }).call(this,require("buffer").Buffer) },{"./hash":123,"buffer":45,"inherits":92}],127:[function(require,module,exports){ (function (Buffer){ /** * A JavaScript implementation of the Secure Hash Algorithm, SHA-256, as defined * in FIPS 180-2 * Version 2.2-beta Copyright Angel Marin, Paul Johnston 2000 - 2009. * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet * */ var inherits = require('inherits') var Sha256 = require('./sha256') var Hash = require('./hash') var W = new Array(64) function Sha224 () { this.init() this._w = W // new Array(64) Hash.call(this, 64, 56) } inherits(Sha224, Sha256) Sha224.prototype.init = function () { this._a = 0xc1059ed8 | 0 this._b = 0x367cd507 | 0 this._c = 0x3070dd17 | 0 this._d = 0xf70e5939 | 0 this._e = 0xffc00b31 | 0 this._f = 0x68581511 | 0 this._g = 0x64f98fa7 | 0 this._h = 0xbefa4fa4 | 0 return this } Sha224.prototype._hash = function () { var H = new Buffer(28) H.writeInt32BE(this._a, 0) H.writeInt32BE(this._b, 4) H.writeInt32BE(this._c, 8) H.writeInt32BE(this._d, 12) H.writeInt32BE(this._e, 16) H.writeInt32BE(this._f, 20) H.writeInt32BE(this._g, 24) return H } module.exports = Sha224 }).call(this,require("buffer").Buffer) },{"./hash":123,"./sha256":128,"buffer":45,"inherits":92}],128:[function(require,module,exports){ (function (Buffer){ /** * A JavaScript implementation of the Secure Hash Algorithm, SHA-256, as defined * in FIPS 180-2 * Version 2.2-beta Copyright Angel Marin, Paul Johnston 2000 - 2009. * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet * */ var inherits = require('inherits') var Hash = require('./hash') var K = [ 0x428A2F98, 0x71374491, 0xB5C0FBCF, 0xE9B5DBA5, 0x3956C25B, 0x59F111F1, 0x923F82A4, 0xAB1C5ED5, 0xD807AA98, 0x12835B01, 0x243185BE, 0x550C7DC3, 0x72BE5D74, 0x80DEB1FE, 0x9BDC06A7, 0xC19BF174, 0xE49B69C1, 0xEFBE4786, 0x0FC19DC6, 0x240CA1CC, 0x2DE92C6F, 0x4A7484AA, 0x5CB0A9DC, 0x76F988DA, 0x983E5152, 0xA831C66D, 0xB00327C8, 0xBF597FC7, 0xC6E00BF3, 0xD5A79147, 0x06CA6351, 0x14292967, 0x27B70A85, 0x2E1B2138, 0x4D2C6DFC, 0x53380D13, 0x650A7354, 0x766A0ABB, 0x81C2C92E, 0x92722C85, 0xA2BFE8A1, 0xA81A664B, 0xC24B8B70, 0xC76C51A3, 0xD192E819, 0xD6990624, 0xF40E3585, 0x106AA070, 0x19A4C116, 0x1E376C08, 0x2748774C, 0x34B0BCB5, 0x391C0CB3, 0x4ED8AA4A, 0x5B9CCA4F, 0x682E6FF3, 0x748F82EE, 0x78A5636F, 0x84C87814, 0x8CC70208, 0x90BEFFFA, 0xA4506CEB, 0xBEF9A3F7, 0xC67178F2 ] var W = new Array(64) function Sha256 () { this.init() this._w = W // new Array(64) Hash.call(this, 64, 56) } inherits(Sha256, Hash) Sha256.prototype.init = function () { this._a = 0x6a09e667 | 0 this._b = 0xbb67ae85 | 0 this._c = 0x3c6ef372 | 0 this._d = 0xa54ff53a | 0 this._e = 0x510e527f | 0 this._f = 0x9b05688c | 0 this._g = 0x1f83d9ab | 0 this._h = 0x5be0cd19 | 0 return this } function Ch (x, y, z) { return z ^ (x & (y ^ z)) } function Maj (x, y, z) { return (x & y) | (z & (x | y)) } function Sigma0 (x) { return (x >>> 2 | x << 30) ^ (x >>> 13 | x << 19) ^ (x >>> 22 | x << 10) } function Sigma1 (x) { return (x >>> 6 | x << 26) ^ (x >>> 11 | x << 21) ^ (x >>> 25 | x << 7) } function Gamma0 (x) { return (x >>> 7 | x << 25) ^ (x >>> 18 | x << 14) ^ (x >>> 3) } function Gamma1 (x) { return (x >>> 17 | x << 15) ^ (x >>> 19 | x << 13) ^ (x >>> 10) } Sha256.prototype._update = function (M) { var W = this._w var a = this._a | 0 var b = this._b | 0 var c = this._c | 0 var d = this._d | 0 var e = this._e | 0 var f = this._f | 0 var g = this._g | 0 var h = this._h | 0 var j = 0 function calcW () { return Gamma1(W[j - 2]) + W[j - 7] + Gamma0(W[j - 15]) + W[j - 16] } function loop (w) { W[j] = w var T1 = h + Sigma1(e) + Ch(e, f, g) + K[j] + w var T2 = Sigma0(a) + Maj(a, b, c) h = g g = f f = e e = d + T1 d = c c = b b = a a = T1 + T2 j++ } while (j < 16) loop(M.readInt32BE(j * 4)) while (j < 64) loop(calcW()) this._a = (a + this._a) | 0 this._b = (b + this._b) | 0 this._c = (c + this._c) | 0 this._d = (d + this._d) | 0 this._e = (e + this._e) | 0 this._f = (f + this._f) | 0 this._g = (g + this._g) | 0 this._h = (h + this._h) | 0 } Sha256.prototype._hash = function () { var H = new Buffer(32) H.writeInt32BE(this._a, 0) H.writeInt32BE(this._b, 4) H.writeInt32BE(this._c, 8) H.writeInt32BE(this._d, 12) H.writeInt32BE(this._e, 16) H.writeInt32BE(this._f, 20) H.writeInt32BE(this._g, 24) H.writeInt32BE(this._h, 28) return H } module.exports = Sha256 }).call(this,require("buffer").Buffer) },{"./hash":123,"buffer":45,"inherits":92}],129:[function(require,module,exports){ (function (Buffer){ var inherits = require('inherits') var SHA512 = require('./sha512') var Hash = require('./hash') var W = new Array(160) function Sha384 () { this.init() this._w = W Hash.call(this, 128, 112) } inherits(Sha384, SHA512) Sha384.prototype.init = function () { this._a = 0xcbbb9d5d | 0 this._b = 0x629a292a | 0 this._c = 0x9159015a | 0 this._d = 0x152fecd8 | 0 this._e = 0x67332667 | 0 this._f = 0x8eb44a87 | 0 this._g = 0xdb0c2e0d | 0 this._h = 0x47b5481d | 0 this._al = 0xc1059ed8 | 0 this._bl = 0x367cd507 | 0 this._cl = 0x3070dd17 | 0 this._dl = 0xf70e5939 | 0 this._el = 0xffc00b31 | 0 this._fl = 0x68581511 | 0 this._gl = 0x64f98fa7 | 0 this._hl = 0xbefa4fa4 | 0 return this } Sha384.prototype._hash = function () { var H = new Buffer(48) function writeInt64BE (h, l, offset) { H.writeInt32BE(h, offset) H.writeInt32BE(l, offset + 4) } writeInt64BE(this._a, this._al, 0) writeInt64BE(this._b, this._bl, 8) writeInt64BE(this._c, this._cl, 16) writeInt64BE(this._d, this._dl, 24) writeInt64BE(this._e, this._el, 32) writeInt64BE(this._f, this._fl, 40) return H } module.exports = Sha384 }).call(this,require("buffer").Buffer) },{"./hash":123,"./sha512":130,"buffer":45,"inherits":92}],130:[function(require,module,exports){ (function (Buffer){ var inherits = require('inherits') var Hash = require('./hash') var K = [ 0x428a2f98, 0xd728ae22, 0x71374491, 0x23ef65cd, 0xb5c0fbcf, 0xec4d3b2f, 0xe9b5dba5, 0x8189dbbc, 0x3956c25b, 0xf348b538, 0x59f111f1, 0xb605d019, 0x923f82a4, 0xaf194f9b, 0xab1c5ed5, 0xda6d8118, 0xd807aa98, 0xa3030242, 0x12835b01, 0x45706fbe, 0x243185be, 0x4ee4b28c, 0x550c7dc3, 0xd5ffb4e2, 0x72be5d74, 0xf27b896f, 0x80deb1fe, 0x3b1696b1, 0x9bdc06a7, 0x25c71235, 0xc19bf174, 0xcf692694, 0xe49b69c1, 0x9ef14ad2, 0xefbe4786, 0x384f25e3, 0x0fc19dc6, 0x8b8cd5b5, 0x240ca1cc, 0x77ac9c65, 0x2de92c6f, 0x592b0275, 0x4a7484aa, 0x6ea6e483, 0x5cb0a9dc, 0xbd41fbd4, 0x76f988da, 0x831153b5, 0x983e5152, 0xee66dfab, 0xa831c66d, 0x2db43210, 0xb00327c8, 0x98fb213f, 0xbf597fc7, 0xbeef0ee4, 0xc6e00bf3, 0x3da88fc2, 0xd5a79147, 0x930aa725, 0x06ca6351, 0xe003826f, 0x14292967, 0x0a0e6e70, 0x27b70a85, 0x46d22ffc, 0x2e1b2138, 0x5c26c926, 0x4d2c6dfc, 0x5ac42aed, 0x53380d13, 0x9d95b3df, 0x650a7354, 0x8baf63de, 0x766a0abb, 0x3c77b2a8, 0x81c2c92e, 0x47edaee6, 0x92722c85, 0x1482353b, 0xa2bfe8a1, 0x4cf10364, 0xa81a664b, 0xbc423001, 0xc24b8b70, 0xd0f89791, 0xc76c51a3, 0x0654be30, 0xd192e819, 0xd6ef5218, 0xd6990624, 0x5565a910, 0xf40e3585, 0x5771202a, 0x106aa070, 0x32bbd1b8, 0x19a4c116, 0xb8d2d0c8, 0x1e376c08, 0x5141ab53, 0x2748774c, 0xdf8eeb99, 0x34b0bcb5, 0xe19b48a8, 0x391c0cb3, 0xc5c95a63, 0x4ed8aa4a, 0xe3418acb, 0x5b9cca4f, 0x7763e373, 0x682e6ff3, 0xd6b2b8a3, 0x748f82ee, 0x5defb2fc, 0x78a5636f, 0x43172f60, 0x84c87814, 0xa1f0ab72, 0x8cc70208, 0x1a6439ec, 0x90befffa, 0x23631e28, 0xa4506ceb, 0xde82bde9, 0xbef9a3f7, 0xb2c67915, 0xc67178f2, 0xe372532b, 0xca273ece, 0xea26619c, 0xd186b8c7, 0x21c0c207, 0xeada7dd6, 0xcde0eb1e, 0xf57d4f7f, 0xee6ed178, 0x06f067aa, 0x72176fba, 0x0a637dc5, 0xa2c898a6, 0x113f9804, 0xbef90dae, 0x1b710b35, 0x131c471b, 0x28db77f5, 0x23047d84, 0x32caab7b, 0x40c72493, 0x3c9ebe0a, 0x15c9bebc, 0x431d67c4, 0x9c100d4c, 0x4cc5d4be, 0xcb3e42b6, 0x597f299c, 0xfc657e2a, 0x5fcb6fab, 0x3ad6faec, 0x6c44198c, 0x4a475817 ] var W = new Array(160) function Sha512 () { this.init() this._w = W Hash.call(this, 128, 112) } inherits(Sha512, Hash) Sha512.prototype.init = function () { this._a = 0x6a09e667 | 0 this._b = 0xbb67ae85 | 0 this._c = 0x3c6ef372 | 0 this._d = 0xa54ff53a | 0 this._e = 0x510e527f | 0 this._f = 0x9b05688c | 0 this._g = 0x1f83d9ab | 0 this._h = 0x5be0cd19 | 0 this._al = 0xf3bcc908 | 0 this._bl = 0x84caa73b | 0 this._cl = 0xfe94f82b | 0 this._dl = 0x5f1d36f1 | 0 this._el = 0xade682d1 | 0 this._fl = 0x2b3e6c1f | 0 this._gl = 0xfb41bd6b | 0 this._hl = 0x137e2179 | 0 return this } function Ch (x, y, z) { return z ^ (x & (y ^ z)) } function Maj (x, y, z) { return (x & y) | (z & (x | y)) } function Sigma0 (x, xl) { return (x >>> 28 | xl << 4) ^ (xl >>> 2 | x << 30) ^ (xl >>> 7 | x << 25) } function Sigma1 (x, xl) { return (x >>> 14 | xl << 18) ^ (x >>> 18 | xl << 14) ^ (xl >>> 9 | x << 23) } function Gamma0 (x, xl) { return (x >>> 1 | xl << 31) ^ (x >>> 8 | xl << 24) ^ (x >>> 7) } function Gamma0l (x, xl) { return (x >>> 1 | xl << 31) ^ (x >>> 8 | xl << 24) ^ (x >>> 7 | xl << 25) } function Gamma1 (x, xl) { return (x >>> 19 | xl << 13) ^ (xl >>> 29 | x << 3) ^ (x >>> 6) } function Gamma1l (x, xl) { return (x >>> 19 | xl << 13) ^ (xl >>> 29 | x << 3) ^ (x >>> 6 | xl << 26) } Sha512.prototype._update = function (M) { var W = this._w var a = this._a | 0 var b = this._b | 0 var c = this._c | 0 var d = this._d | 0 var e = this._e | 0 var f = this._f | 0 var g = this._g | 0 var h = this._h | 0 var al = this._al | 0 var bl = this._bl | 0 var cl = this._cl | 0 var dl = this._dl | 0 var el = this._el | 0 var fl = this._fl | 0 var gl = this._gl | 0 var hl = this._hl | 0 var i = 0 var j = 0 var Wi, Wil function calcW () { var x = W[j - 15 * 2] var xl = W[j - 15 * 2 + 1] var gamma0 = Gamma0(x, xl) var gamma0l = Gamma0l(xl, x) x = W[j - 2 * 2] xl = W[j - 2 * 2 + 1] var gamma1 = Gamma1(x, xl) var gamma1l = Gamma1l(xl, x) // W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16] var Wi7 = W[j - 7 * 2] var Wi7l = W[j - 7 * 2 + 1] var Wi16 = W[j - 16 * 2] var Wi16l = W[j - 16 * 2 + 1] Wil = gamma0l + Wi7l Wi = gamma0 + Wi7 + ((Wil >>> 0) < (gamma0l >>> 0) ? 1 : 0) Wil = Wil + gamma1l Wi = Wi + gamma1 + ((Wil >>> 0) < (gamma1l >>> 0) ? 1 : 0) Wil = Wil + Wi16l Wi = Wi + Wi16 + ((Wil >>> 0) < (Wi16l >>> 0) ? 1 : 0) } function loop () { W[j] = Wi W[j + 1] = Wil var maj = Maj(a, b, c) var majl = Maj(al, bl, cl) var sigma0h = Sigma0(a, al) var sigma0l = Sigma0(al, a) var sigma1h = Sigma1(e, el) var sigma1l = Sigma1(el, e) // t1 = h + sigma1 + ch + K[i] + W[i] var Ki = K[j] var Kil = K[j + 1] var ch = Ch(e, f, g) var chl = Ch(el, fl, gl) var t1l = hl + sigma1l var t1 = h + sigma1h + ((t1l >>> 0) < (hl >>> 0) ? 1 : 0) t1l = t1l + chl t1 = t1 + ch + ((t1l >>> 0) < (chl >>> 0) ? 1 : 0) t1l = t1l + Kil t1 = t1 + Ki + ((t1l >>> 0) < (Kil >>> 0) ? 1 : 0) t1l = t1l + Wil t1 = t1 + Wi + ((t1l >>> 0) < (Wil >>> 0) ? 1 : 0) // t2 = sigma0 + maj var t2l = sigma0l + majl var t2 = sigma0h + maj + ((t2l >>> 0) < (sigma0l >>> 0) ? 1 : 0) h = g hl = gl g = f gl = fl f = e fl = el el = (dl + t1l) | 0 e = (d + t1 + ((el >>> 0) < (dl >>> 0) ? 1 : 0)) | 0 d = c dl = cl c = b cl = bl b = a bl = al al = (t1l + t2l) | 0 a = (t1 + t2 + ((al >>> 0) < (t1l >>> 0) ? 1 : 0)) | 0 i++ j += 2 } while (i < 16) { Wi = M.readInt32BE(j * 4) Wil = M.readInt32BE(j * 4 + 4) loop() } while (i < 80) { calcW() loop() } this._al = (this._al + al) | 0 this._bl = (this._bl + bl) | 0 this._cl = (this._cl + cl) | 0 this._dl = (this._dl + dl) | 0 this._el = (this._el + el) | 0 this._fl = (this._fl + fl) | 0 this._gl = (this._gl + gl) | 0 this._hl = (this._hl + hl) | 0 this._a = (this._a + a + ((this._al >>> 0) < (al >>> 0) ? 1 : 0)) | 0 this._b = (this._b + b + ((this._bl >>> 0) < (bl >>> 0) ? 1 : 0)) | 0 this._c = (this._c + c + ((this._cl >>> 0) < (cl >>> 0) ? 1 : 0)) | 0 this._d = (this._d + d + ((this._dl >>> 0) < (dl >>> 0) ? 1 : 0)) | 0 this._e = (this._e + e + ((this._el >>> 0) < (el >>> 0) ? 1 : 0)) | 0 this._f = (this._f + f + ((this._fl >>> 0) < (fl >>> 0) ? 1 : 0)) | 0 this._g = (this._g + g + ((this._gl >>> 0) < (gl >>> 0) ? 1 : 0)) | 0 this._h = (this._h + h + ((this._hl >>> 0) < (hl >>> 0) ? 1 : 0)) | 0 } Sha512.prototype._hash = function () { var H = new Buffer(64) function writeInt64BE (h, l, offset) { H.writeInt32BE(h, offset) H.writeInt32BE(l, offset + 4) } writeInt64BE(this._a, this._al, 0) writeInt64BE(this._b, this._bl, 8) writeInt64BE(this._c, this._cl, 16) writeInt64BE(this._d, this._dl, 24) writeInt64BE(this._e, this._el, 32) writeInt64BE(this._f, this._fl, 40) writeInt64BE(this._g, this._gl, 48) writeInt64BE(this._h, this._hl, 56) return H } module.exports = Sha512 }).call(this,require("buffer").Buffer) },{"./hash":123,"buffer":45,"inherits":92}],131:[function(require,module,exports){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a // copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to permit // persons to whom the Software is furnished to do so, subject to the // following conditions: // // The above copyright notice and this permission notice shall be included // in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE // USE OR OTHER DEALINGS IN THE SOFTWARE. module.exports = Stream; var EE = require('events').EventEmitter; var inherits = require('inherits'); inherits(Stream, EE); Stream.Readable = require('readable-stream/readable.js'); Stream.Writable = require('readable-stream/writable.js'); Stream.Duplex = require('readable-stream/duplex.js'); Stream.Transform = require('readable-stream/transform.js'); Stream.PassThrough = require('readable-stream/passthrough.js'); // Backwards-compat with node 0.4.x Stream.Stream = Stream; // old-style streams. Note that the pipe method (the only relevant // part of this class) is overridden in the Readable class. function Stream() { EE.call(this); } Stream.prototype.pipe = function(dest, options) { var source = this; function ondata(chunk) { if (dest.writable) { if (false === dest.write(chunk) && source.pause) { source.pause(); } } } source.on('data', ondata); function ondrain() { if (source.readable && source.resume) { source.resume(); } } dest.on('drain', ondrain); // If the 'end' option is not supplied, dest.end() will be called when // source gets the 'end' or 'close' events. Only dest.end() once. if (!dest._isStdio && (!options || options.end !== false)) { source.on('end', onend); source.on('close', onclose); } var didOnEnd = false; function onend() { if (didOnEnd) return; didOnEnd = true; dest.end(); } function onclose() { if (didOnEnd) return; didOnEnd = true; if (typeof dest.destroy === 'function') dest.destroy(); } // don't leave dangling pipes when there are errors. function onerror(er) { cleanup(); if (EE.listenerCount(this, 'error') === 0) { throw er; // Unhandled stream error in pipe. } } source.on('error', onerror); dest.on('error', onerror); // remove all the event listeners that were added. function cleanup() { source.removeListener('data', ondata); dest.removeListener('drain', ondrain); source.removeListener('end', onend); source.removeListener('close', onclose); source.removeListener('error', onerror); dest.removeListener('error', onerror); source.removeListener('end', cleanup); source.removeListener('close', cleanup); dest.removeListener('close', cleanup); } source.on('end', cleanup); source.on('close', cleanup); dest.on('close', cleanup); dest.emit('pipe', source); // Allow for unix-like usage: A.pipe(B).pipe(C) return dest; }; },{"events":82,"inherits":92,"readable-stream/duplex.js":112,"readable-stream/passthrough.js":118,"readable-stream/readable.js":119,"readable-stream/transform.js":120,"readable-stream/writable.js":121}],132:[function(require,module,exports){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a // copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to permit // persons to whom the Software is furnished to do so, subject to the // following conditions: // // The above copyright notice and this permission notice shall be included // in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE // USE OR OTHER DEALINGS IN THE SOFTWARE. var Buffer = require('buffer').Buffer; var isBufferEncoding = Buffer.isEncoding || function(encoding) { switch (encoding && encoding.toLowerCase()) { case 'hex': case 'utf8': case 'utf-8': case 'ascii': case 'binary': case 'base64': case 'ucs2': case 'ucs-2': case 'utf16le': case 'utf-16le': case 'raw': return true; default: return false; } } function assertEncoding(encoding) { if (encoding && !isBufferEncoding(encoding)) { throw new Error('Unknown encoding: ' + encoding); } } // StringDecoder provides an interface for efficiently splitting a series of // buffers into a series of JS strings without breaking apart multi-byte // characters. CESU-8 is handled as part of the UTF-8 encoding. // // @TODO Handling all encodings inside a single object makes it very difficult // to reason about this code, so it should be split up in the future. // @TODO There should be a utf8-strict encoding that rejects invalid UTF-8 code // points as used by CESU-8. var StringDecoder = exports.StringDecoder = function(encoding) { this.encoding = (encoding || 'utf8').toLowerCase().replace(/[-_]/, ''); assertEncoding(encoding); switch (this.encoding) { case 'utf8': // CESU-8 represents each of Surrogate Pair by 3-bytes this.surrogateSize = 3; break; case 'ucs2': case 'utf16le': // UTF-16 represents each of Surrogate Pair by 2-bytes this.surrogateSize = 2; this.detectIncompleteChar = utf16DetectIncompleteChar; break; case 'base64': // Base-64 stores 3 bytes in 4 chars, and pads the remainder. this.surrogateSize = 3; this.detectIncompleteChar = base64DetectIncompleteChar; break; default: this.write = passThroughWrite; return; } // Enough space to store all bytes of a single character. UTF-8 needs 4 // bytes, but CESU-8 may require up to 6 (3 bytes per surrogate). this.charBuffer = new Buffer(6); // Number of bytes received for the current incomplete multi-byte character. this.charReceived = 0; // Number of bytes expected for the current incomplete multi-byte character. this.charLength = 0; }; // write decodes the given buffer and returns it as JS string that is // guaranteed to not contain any partial multi-byte characters. Any partial // character found at the end of the buffer is buffered up, and will be // returned when calling write again with the remaining bytes. // // Note: Converting a Buffer containing an orphan surrogate to a String // currently works, but converting a String to a Buffer (via `new Buffer`, or // Buffer#write) will replace incomplete surrogates with the unicode // replacement character. See https://codereview.chromium.org/121173009/ . StringDecoder.prototype.write = function(buffer) { var charStr = ''; // if our last write ended with an incomplete multibyte character while (this.charLength) { // determine how many remaining bytes this buffer has to offer for this char var available = (buffer.length >= this.charLength - this.charReceived) ? this.charLength - this.charReceived : buffer.length; // add the new bytes to the char buffer buffer.copy(this.charBuffer, this.charReceived, 0, available); this.charReceived += available; if (this.charReceived < this.charLength) { // still not enough chars in this buffer? wait for more ... return ''; } // remove bytes belonging to the current character from the buffer buffer = buffer.slice(available, buffer.length); // get the character that was split charStr = this.charBuffer.slice(0, this.charLength).toString(this.encoding); // CESU-8: lead surrogate (D800-DBFF) is also the incomplete character var charCode = charStr.charCodeAt(charStr.length - 1); if (charCode >= 0xD800 && charCode <= 0xdbff)="" {="" this.charlength="" +="this.surrogateSize;" charstr="" ;="" continue;="" }="" this.charreceived="this.charLength" =="" 0;="" if="" there="" are="" no="" more="" bytes="" in="" this="" buffer,="" just="" emit="" our="" char="" (buffer.length="==" 0)="" return="" charstr;="" break;="" determine="" and="" set="" charlength="" charreceived="" this.detectincompletechar(buffer);="" var="" end="buffer.length;" (this.charlength)="" buffer="" the="" incomplete="" character="" we="" got="" buffer.copy(this.charbuffer,="" 0,="" buffer.length="" -="" this.charreceived,="" end);="" 1;="" charcode="charStr.charCodeAt(end);" cesu-8:="" lead="" surrogate="" (d800-dbff)="" is="" also="" (charcode="">= 0xD800 && charCode <= 0xdbff)="" {="" var="" size="this.surrogateSize;" this.charlength="" +="size;" this.charreceived="" this.charbuffer.copy(this.charbuffer,="" size,="" 0,="" size);="" buffer.copy(this.charbuffer,="" return="" charstr.substring(0,="" end);="" }="" or="" just="" emit="" the="" charstr="" charstr;="" };="" detectincompletechar="" determines="" if="" there="" is="" an="" incomplete="" utf-8="" character="" at="" end="" of="" given="" buffer.="" so,="" it="" sets="" to="" byte="" length="" that="" character,="" and="" number="" bytes="" are="" available="" for="" this="" character.="" stringdecoder.prototype.detectincompletechar="function(buffer)" determine="" how="" many="" we="" have="" check="" buffer="" i="(buffer.length">= 3) ? 3 : buffer.length; // Figure out if one of the last i bytes of our buffer announces an // incomplete char. for (; i > 0; i--) { var c = buffer[buffer.length - i]; // See http://en.wikipedia.org/wiki/UTF-8#Description // 110XXXXX if (i == 1 && c >> 5 == 0x06) { this.charLength = 2; break; } // 1110XXXX if (i <= 2="" &&="" c="">> 4 == 0x0E) { this.charLength = 3; break; } // 11110XXX if (i <= 3="" &&="" c="">> 3 == 0x1E) { this.charLength = 4; break; } } this.charReceived = i; }; StringDecoder.prototype.end = function(buffer) { var res = ''; if (buffer && buffer.length) res = this.write(buffer); if (this.charReceived) { var cr = this.charReceived; var buf = this.charBuffer; var enc = this.encoding; res += buf.slice(0, cr).toString(enc); } return res; }; function passThroughWrite(buffer) { return buffer.toString(this.encoding); } function utf16DetectIncompleteChar(buffer) { this.charReceived = buffer.length % 2; this.charLength = this.charReceived ? 2 : 0; } function base64DetectIncompleteChar(buffer) { this.charReceived = buffer.length % 3; this.charLength = this.charReceived ? 3 : 0; } },{"buffer":45}],133:[function(require,module,exports){ (function (global){ /** * Module exports. */ module.exports = deprecate; /** * Mark that a method should not be used. * Returns a modified function which warns once by default. * * If `localStorage.noDeprecation = true` is set, then it is a no-op. * * If `localStorage.throwDeprecation = true` is set, then deprecated functions * will throw an Error when invoked. * * If `localStorage.traceDeprecation = true` is set, then deprecated functions * will invoke `console.trace()` instead of `console.error()`. * * @param {Function} fn - the function to deprecate * @param {String} msg - the string to print to the console when `fn` is invoked * @returns {Function} a new "deprecated" version of `fn` * @api public */ function deprecate (fn, msg) { if (config('noDeprecation')) { return fn; } var warned = false; function deprecated() { if (!warned) { if (config('throwDeprecation')) { throw new Error(msg); } else if (config('traceDeprecation')) { console.trace(msg); } else { console.warn(msg); } warned = true; } return fn.apply(this, arguments); } return deprecated; } /** * Checks `localStorage` for boolean values for the given `name`. * * @param {String} name * @returns {Boolean} * @api private */ function config (name) { // accessing global.localStorage can trigger a DOMException in sandboxed iframes try { if (!global.localStorage) return false; } catch (_) { return false; } var val = global.localStorage[name]; if (null == val) return false; return String(val).toLowerCase() === 'true'; } }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) },{}],134:[function(require,module,exports){ module.exports = function isBuffer(arg) { return arg && typeof arg === 'object' && typeof arg.copy === 'function' && typeof arg.fill === 'function' && typeof arg.readUInt8 === 'function'; } },{}],135:[function(require,module,exports){ (function (process,global){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a // copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to permit // persons to whom the Software is furnished to do so, subject to the // following conditions: // // The above copyright notice and this permission notice shall be included // in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE // USE OR OTHER DEALINGS IN THE SOFTWARE. var formatRegExp = /%[sdj%]/g; exports.format = function(f) { if (!isString(f)) { var objects = []; for (var i = 0; i < arguments.length; i++) { objects.push(inspect(arguments[i])); } return objects.join(' '); } var i = 1; var args = arguments; var len = args.length; var str = String(f).replace(formatRegExp, function(x) { if (x === '%%') return '%'; if (i >= len) return x; switch (x) { case '%s': return String(args[i++]); case '%d': return Number(args[i++]); case '%j': try { return JSON.stringify(args[i++]); } catch (_) { return '[Circular]'; } default: return x; } }); for (var x = args[i]; i < len; x = args[++i]) { if (isNull(x) || !isObject(x)) { str += ' ' + x; } else { str += ' ' + inspect(x); } } return str; }; // Mark that a method should not be used. // Returns a modified function which warns once by default. // If --no-deprecation is set, then it is a no-op. exports.deprecate = function(fn, msg) { // Allow for deprecating things in the process of starting up. if (isUndefined(global.process)) { return function() { return exports.deprecate(fn, msg).apply(this, arguments); }; } if (process.noDeprecation === true) { return fn; } var warned = false; function deprecated() { if (!warned) { if (process.throwDeprecation) { throw new Error(msg); } else if (process.traceDeprecation) { console.trace(msg); } else { console.error(msg); } warned = true; } return fn.apply(this, arguments); } return deprecated; }; var debugs = {}; var debugEnviron; exports.debuglog = function(set) { if (isUndefined(debugEnviron)) debugEnviron = process.env.NODE_DEBUG || ''; set = set.toUpperCase(); if (!debugs[set]) { if (new RegExp('\\b' + set + '\\b', 'i').test(debugEnviron)) { var pid = process.pid; debugs[set] = function() { var msg = exports.format.apply(exports, arguments); console.error('%s %d: %s', set, pid, msg); }; } else { debugs[set] = function() {}; } } return debugs[set]; }; /** * Echos the value of a value. Trys to print the value out * in the best way possible given the different types. * * @param {Object} obj The object to print out. * @param {Object} opts Optional options object that alters the output. */ /* legacy: obj, showHidden, depth, colors*/ function inspect(obj, opts) { // default options var ctx = { seen: [], stylize: stylizeNoColor }; // legacy... if (arguments.length >= 3) ctx.depth = arguments[2]; if (arguments.length >= 4) ctx.colors = arguments[3]; if (isBoolean(opts)) { // legacy... ctx.showHidden = opts; } else if (opts) { // got an "options" object exports._extend(ctx, opts); } // set default options if (isUndefined(ctx.showHidden)) ctx.showHidden = false; if (isUndefined(ctx.depth)) ctx.depth = 2; if (isUndefined(ctx.colors)) ctx.colors = false; if (isUndefined(ctx.customInspect)) ctx.customInspect = true; if (ctx.colors) ctx.stylize = stylizeWithColor; return formatValue(ctx, obj, ctx.depth); } exports.inspect = inspect; // http://en.wikipedia.org/wiki/ANSI_escape_code#graphics inspect.colors = { 'bold' : [1, 22], 'italic' : [3, 23], 'underline' : [4, 24], 'inverse' : [7, 27], 'white' : [37, 39], 'grey' : [90, 39], 'black' : [30, 39], 'blue' : [34, 39], 'cyan' : [36, 39], 'green' : [32, 39], 'magenta' : [35, 39], 'red' : [31, 39], 'yellow' : [33, 39] }; // Don't use 'blue' not visible on cmd.exe inspect.styles = { 'special': 'cyan', 'number': 'yellow', 'boolean': 'yellow', 'undefined': 'grey', 'null': 'bold', 'string': 'green', 'date': 'magenta', // "name": intentionally not styling 'regexp': 'red' }; function stylizeWithColor(str, styleType) { var style = inspect.styles[styleType]; if (style) { return '\u001b[' + inspect.colors[style][0] + 'm' + str + '\u001b[' + inspect.colors[style][1] + 'm'; } else { return str; } } function stylizeNoColor(str, styleType) { return str; } function arrayToHash(array) { var hash = {}; array.forEach(function(val, idx) { hash[val] = true; }); return hash; } function formatValue(ctx, value, recurseTimes) { // Provide a hook for user-specified inspect functions. // Check that value is an object with an inspect function on it if (ctx.customInspect && value && isFunction(value.inspect) && // Filter out the util module, it's inspect function is special value.inspect !== exports.inspect && // Also filter out any prototype objects using the circular check. !(value.constructor && value.constructor.prototype === value)) { var ret = value.inspect(recurseTimes, ctx); if (!isString(ret)) { ret = formatValue(ctx, ret, recurseTimes); } return ret; } // Primitive types cannot have properties var primitive = formatPrimitive(ctx, value); if (primitive) { return primitive; } // Look up the keys of the object. var keys = Object.keys(value); var visibleKeys = arrayToHash(keys); if (ctx.showHidden) { keys = Object.getOwnPropertyNames(value); } // IE doesn't make error fields non-enumerable // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx if (isError(value) && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) { return formatError(value); } // Some type of object without properties can be shortcutted. if (keys.length === 0) { if (isFunction(value)) { var name = value.name ? ': ' + value.name : ''; return ctx.stylize('[Function' + name + ']', 'special'); } if (isRegExp(value)) { return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); } if (isDate(value)) { return ctx.stylize(Date.prototype.toString.call(value), 'date'); } if (isError(value)) { return formatError(value); } } var base = '', array = false, braces = ['{', '}']; // Make Array say that they are Array if (isArray(value)) { array = true; braces = ['[', ']']; } // Make functions say that they are functions if (isFunction(value)) { var n = value.name ? ': ' + value.name : ''; base = ' [Function' + n + ']'; } // Make RegExps say that they are RegExps if (isRegExp(value)) { base = ' ' + RegExp.prototype.toString.call(value); } // Make dates with properties first say the date if (isDate(value)) { base = ' ' + Date.prototype.toUTCString.call(value); } // Make error with message first say the error if (isError(value)) { base = ' ' + formatError(value); } if (keys.length === 0 && (!array || value.length == 0)) { return braces[0] + base + braces[1]; } if (recurseTimes < 0) { if (isRegExp(value)) { return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); } else { return ctx.stylize('[Object]', 'special'); } } ctx.seen.push(value); var output; if (array) { output = formatArray(ctx, value, recurseTimes, visibleKeys, keys); } else { output = keys.map(function(key) { return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array); }); } ctx.seen.pop(); return reduceToSingleString(output, base, braces); } function formatPrimitive(ctx, value) { if (isUndefined(value)) return ctx.stylize('undefined', 'undefined'); if (isString(value)) { var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '') .replace(/'/g, "\\'") .replace(/\\"/g, '"') + '\''; return ctx.stylize(simple, 'string'); } if (isNumber(value)) return ctx.stylize('' + value, 'number'); if (isBoolean(value)) return ctx.stylize('' + value, 'boolean'); // For some reason typeof null is "object", so special case here. if (isNull(value)) return ctx.stylize('null', 'null'); } function formatError(value) { return '[' + Error.prototype.toString.call(value) + ']'; } function formatArray(ctx, value, recurseTimes, visibleKeys, keys) { var output = []; for (var i = 0, l = value.length; i < l; ++i) { if (hasOwnProperty(value, String(i))) { output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, String(i), true)); } else { output.push(''); } } keys.forEach(function(key) { if (!key.match(/^\d+$/)) { output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, key, true)); } }); return output; } function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) { var name, str, desc; desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] }; if (desc.get) { if (desc.set) { str = ctx.stylize('[Getter/Setter]', 'special'); } else { str = ctx.stylize('[Getter]', 'special'); } } else { if (desc.set) { str = ctx.stylize('[Setter]', 'special'); } } if (!hasOwnProperty(visibleKeys, key)) { name = '[' + key + ']'; } if (!str) { if (ctx.seen.indexOf(desc.value) < 0) { if (isNull(recurseTimes)) { str = formatValue(ctx, desc.value, null); } else { str = formatValue(ctx, desc.value, recurseTimes - 1); } if (str.indexOf('\n') > -1) { if (array) { str = str.split('\n').map(function(line) { return ' ' + line; }).join('\n').substr(2); } else { str = '\n' + str.split('\n').map(function(line) { return ' ' + line; }).join('\n'); } } } else { str = ctx.stylize('[Circular]', 'special'); } } if (isUndefined(name)) { if (array && key.match(/^\d+$/)) { return str; } name = JSON.stringify('' + key); if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) { name = name.substr(1, name.length - 2); name = ctx.stylize(name, 'name'); } else { name = name.replace(/'/g, "\\'") .replace(/\\"/g, '"') .replace(/(^"|"$)/g, "'"); name = ctx.stylize(name, 'string'); } } return name + ': ' + str; } function reduceToSingleString(output, base, braces) { var numLinesEst = 0; var length = output.reduce(function(prev, cur) { numLinesEst++; if (cur.indexOf('\n') >= 0) numLinesEst++; return prev + cur.replace(/\u001b\[\d\d?m/g, '').length + 1; }, 0); if (length > 60) { return braces[0] + (base === '' ? '' : base + '\n ') + ' ' + output.join(',\n ') + ' ' + braces[1]; } return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1]; } // NOTE: These type checking functions intentionally don't use `instanceof` // because it is fragile and can be easily faked with `Object.create()`. function isArray(ar) { return Array.isArray(ar); } exports.isArray = isArray; function isBoolean(arg) { return typeof arg === 'boolean'; } exports.isBoolean = isBoolean; function isNull(arg) { return arg === null; } exports.isNull = isNull; function isNullOrUndefined(arg) { return arg == null; } exports.isNullOrUndefined = isNullOrUndefined; function isNumber(arg) { return typeof arg === 'number'; } exports.isNumber = isNumber; function isString(arg) { return typeof arg === 'string'; } exports.isString = isString; function isSymbol(arg) { return typeof arg === 'symbol'; } exports.isSymbol = isSymbol; function isUndefined(arg) { return arg === void 0; } exports.isUndefined = isUndefined; function isRegExp(re) { return isObject(re) && objectToString(re) === '[object RegExp]'; } exports.isRegExp = isRegExp; function isObject(arg) { return typeof arg === 'object' && arg !== null; } exports.isObject = isObject; function isDate(d) { return isObject(d) && objectToString(d) === '[object Date]'; } exports.isDate = isDate; function isError(e) { return isObject(e) && (objectToString(e) === '[object Error]' || e instanceof Error); } exports.isError = isError; function isFunction(arg) { return typeof arg === 'function'; } exports.isFunction = isFunction; function isPrimitive(arg) { return arg === null || typeof arg === 'boolean' || typeof arg === 'number' || typeof arg === 'string' || typeof arg === 'symbol' || // ES6 symbol typeof arg === 'undefined'; } exports.isPrimitive = isPrimitive; exports.isBuffer = require('./support/isBuffer'); function objectToString(o) { return Object.prototype.toString.call(o); } function pad(n) { return n < 10 ? '0' + n.toString(10) : n.toString(10); } var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']; // 26 Feb 16:19:34 function timestamp() { var d = new Date(); var time = [pad(d.getHours()), pad(d.getMinutes()), pad(d.getSeconds())].join(':'); return [d.getDate(), months[d.getMonth()], time].join(' '); } // log is just a thin wrapper to console.log that prepends a timestamp exports.log = function() { console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments)); }; /** * Inherit the prototype methods from one constructor into another. * * The Function.prototype.inherits from lang.js rewritten as a standalone * function (not on Function.prototype). NOTE: If this file is to be loaded * during bootstrapping this function needs to be rewritten using some native * functions as prototype setup using normal JavaScript does not work as * expected during bootstrapping (see mirror.js in r114903). * * @param {function} ctor Constructor function which needs to inherit the * prototype. * @param {function} superCtor Constructor function to inherit prototype from. */ exports.inherits = require('inherits'); exports._extend = function(origin, add) { // Don't do anything if add isn't an object if (!add || !isObject(add)) return origin; var keys = Object.keys(add); var i = keys.length; while (i--) { origin[keys[i]] = add[keys[i]]; } return origin; }; function hasOwnProperty(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); } }).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) },{"./support/isBuffer":134,"_process":104,"inherits":92}],136:[function(require,module,exports){ var indexOf = require('indexof'); var Object_keys = function (obj) { if (Object.keys) return Object.keys(obj) else { var res = []; for (var key in obj) res.push(key) return res; } }; var forEach = function (xs, fn) { if (xs.forEach) return xs.forEach(fn) else for (var i = 0; i < xs.length; i++) { fn(xs[i], i, xs); } }; var defineProp = (function() { try { Object.defineProperty({}, '_', {}); return function(obj, name, value) { Object.defineProperty(obj, name, { writable: true, enumerable: false, configurable: true, value: value }) }; } catch(e) { return function(obj, name, value) { obj[name] = value; }; } }()); var globals = ['Array', 'Boolean', 'Date', 'Error', 'EvalError', 'Function', 'Infinity', 'JSON', 'Math', 'NaN', 'Number', 'Object', 'RangeError', 'ReferenceError', 'RegExp', 'String', 'SyntaxError', 'TypeError', 'URIError', 'decodeURI', 'decodeURIComponent', 'encodeURI', 'encodeURIComponent', 'escape', 'eval', 'isFinite', 'isNaN', 'parseFloat', 'parseInt', 'undefined', 'unescape']; function Context() {} Context.prototype = {}; var Script = exports.Script = function NodeScript (code) { if (!(this instanceof Script)) return new Script(code); this.code = code; }; Script.prototype.runInContext = function (context) { if (!(context instanceof Context)) { throw new TypeError("needs a 'context' argument."); } var iframe = document.createElement('iframe'); if (!iframe.style) iframe.style = {}; iframe.style.display = 'none'; document.body.appendChild(iframe); var win = iframe.contentWindow; var wEval = win.eval, wExecScript = win.execScript; if (!wEval && wExecScript) { // win.eval() magically appears when this is called in IE: wExecScript.call(win, 'null'); wEval = win.eval; } forEach(Object_keys(context), function (key) { win[key] = context[key]; }); forEach(globals, function (key) { if (context[key]) { win[key] = context[key]; } }); var winKeys = Object_keys(win); var res = wEval.call(win, this.code); forEach(Object_keys(win), function (key) { // Avoid copying circular objects like `top` and `window` by only // updating existing context properties or new properties in the `win` // that was only introduced after the eval. if (key in context || indexOf(winKeys, key) === -1) { context[key] = win[key]; } }); forEach(globals, function (key) { if (!(key in context)) { defineProp(context, key, win[key]); } }); document.body.removeChild(iframe); return res; }; Script.prototype.runInThisContext = function () { return eval(this.code); // maybe... }; Script.prototype.runInNewContext = function (context) { var ctx = Script.createContext(context); var res = this.runInContext(ctx); forEach(Object_keys(ctx), function (key) { context[key] = ctx[key]; }); return res; }; forEach(Object_keys(Script.prototype), function (name) { exports[name] = Script[name] = function (code) { var s = Script(code); return s[name].apply(s, [].slice.call(arguments, 1)); }; }); exports.createScript = function (code) { return exports.Script(code); }; exports.createContext = Script.createContext = function (context) { var copy = new Context(); if(typeof context === 'object') { forEach(Object_keys(context), function (key) { copy[key] = context[key]; }); } return copy; }; },{"indexof":91}],137:[function(require,module,exports){ var h = require('virtual-dom/h') var vdom = require('virtual-dom') var main = require('main-loop') var loop = main({ msg: "nothing yet" }, render, vdom) document.querySelector('#content').appendChild(loop.target) function render (state) { return h('div', [ h('h1', 'data from swarmlog: ' + state.msg || "no messages") // h('button', { onclick: onclick }, 'get data!') ]) // function onclick () { // loop.update({ times: state.times + 1 }) // } } var swarmlog = require('swarmlog') var memdb = require('memdb') var log = swarmlog({ publicKey: require('./keys.json').public, sodium: require('chloride/browser'), db: memdb(), valueEncoding: 'json', hubs: [ 'https://signalhub.mafintosh.com' ] }) log.createReadStream({ live: true }).on('data', function (data) { console.log('RECEIVED', data.value) if (data.value.hasOwnProperty('msg')) { loop.update({ msg: data.value.msg }) } }) },{"./keys.json":138,"chloride/browser":149,"main-loop":233,"memdb":234,"swarmlog":273,"virtual-dom":295,"virtual-dom/h":294}],138:[function(require,module,exports){ module.exports={"curve":"ed25519","public":"sIsMWZjaCmjnHO2WCApuEPXZ4h6gqor1Vn9hliewiJk=.ed25519","private":"AolgyGuiOK05FPzsz1Mi0MiYbU70Mahho+Ed7wnNENKwiwxZmNoKaOcc7ZYICm4Q9dniHqCqivVWf2GWJ7CImQ==.ed25519","id":"@sIsMWZjaCmjnHO2WCApuEPXZ4h6gqor1Vn9hliewiJk=.ed25519"} },{}],139:[function(require,module,exports){ (function (process){ /* Copyright (c) 2013 Rod Vagg, MIT License */ function AbstractChainedBatch (db) { this._db = db this._operations = [] this._written = false } AbstractChainedBatch.prototype._checkWritten = function () { if (this._written) throw new Error('write() already called on this batch') } AbstractChainedBatch.prototype.put = function (key, value) { this._checkWritten() var err = this._db._checkKey(key, 'key', this._db._isBuffer) if (err) throw err if (!this._db._isBuffer(key)) key = String(key) if (!this._db._isBuffer(value)) value = String(value) if (typeof this._put == 'function' ) this._put(key, value) else this._operations.push({ type: 'put', key: key, value: value }) return this } AbstractChainedBatch.prototype.del = function (key) { this._checkWritten() var err = this._db._checkKey(key, 'key', this._db._isBuffer) if (err) throw err if (!this._db._isBuffer(key)) key = String(key) if (typeof this._del == 'function' ) this._del(key) else this._operations.push({ type: 'del', key: key }) return this } AbstractChainedBatch.prototype.clear = function () { this._checkWritten() this._operations = [] if (typeof this._clear == 'function' ) this._clear() return this } AbstractChainedBatch.prototype.write = function (options, callback) { this._checkWritten() if (typeof options == 'function') callback = options if (typeof callback != 'function') throw new Error('write() requires a callback argument') if (typeof options != 'object') options = {} this._written = true if (typeof this._write == 'function' ) return this._write(callback) if (typeof this._db._batch == 'function') return this._db._batch(this._operations, options, callback) process.nextTick(callback) } module.exports = AbstractChainedBatch }).call(this,require('_process')) },{"_process":104}],140:[function(require,module,exports){ (function (process){ /* Copyright (c) 2013 Rod Vagg, MIT License */ function AbstractIterator (db) { this.db = db this._ended = false this._nexting = false } AbstractIterator.prototype.next = function (callback) { var self = this if (typeof callback != 'function') throw new Error('next() requires a callback argument') if (self._ended) return callback(new Error('cannot call next() after end()')) if (self._nexting) return callback(new Error('cannot call next() before previous next() has completed')) self._nexting = true if (typeof self._next == 'function') { return self._next(function () { self._nexting = false callback.apply(null, arguments) }) } process.nextTick(function () { self._nexting = false callback() }) } AbstractIterator.prototype.end = function (callback) { if (typeof callback != 'function') throw new Error('end() requires a callback argument') if (this._ended) return callback(new Error('end() already called on iterator')) this._ended = true if (typeof this._end == 'function') return this._end(callback) process.nextTick(callback) } module.exports = AbstractIterator }).call(this,require('_process')) },{"_process":104}],141:[function(require,module,exports){ (function (Buffer,process){ /* Copyright (c) 2013 Rod Vagg, MIT License */ var xtend = require('xtend') , AbstractIterator = require('./abstract-iterator') , AbstractChainedBatch = require('./abstract-chained-batch') function AbstractLevelDOWN (location) { if (!arguments.length || location === undefined) throw new Error('constructor requires at least a location argument') if (typeof location != 'string') throw new Error('constructor requires a location string argument') this.location = location this.status = 'new' } AbstractLevelDOWN.prototype.open = function (options, callback) { var self = this , oldStatus = this.status if (typeof options == 'function') callback = options if (typeof callback != 'function') throw new Error('open() requires a callback argument') if (typeof options != 'object') options = {} options.createIfMissing = options.createIfMissing != false options.errorIfExists = !!options.errorIfExists if (typeof this._open == 'function') { this.status = 'opening' this._open(options, function (err) { if (err) { self.status = oldStatus return callback(err) } self.status = 'open' callback() }) } else { this.status = 'open' process.nextTick(callback) } } AbstractLevelDOWN.prototype.close = function (callback) { var self = this , oldStatus = this.status if (typeof callback != 'function') throw new Error('close() requires a callback argument') if (typeof this._close == 'function') { this.status = 'closing' this._close(function (err) { if (err) { self.status = oldStatus return callback(err) } self.status = 'closed' callback() }) } else { this.status = 'closed' process.nextTick(callback) } } AbstractLevelDOWN.prototype.get = function (key, options, callback) { var err if (typeof options == 'function') callback = options if (typeof callback != 'function') throw new Error('get() requires a callback argument') if (err = this._checkKey(key, 'key', this._isBuffer)) return callback(err) if (!this._isBuffer(key)) key = String(key) if (typeof options != 'object') options = {} options.asBuffer = options.asBuffer != false if (typeof this._get == 'function') return this._get(key, options, callback) process.nextTick(function () { callback(new Error('NotFound')) }) } AbstractLevelDOWN.prototype.put = function (key, value, options, callback) { var err if (typeof options == 'function') callback = options if (typeof callback != 'function') throw new Error('put() requires a callback argument') if (err = this._checkKey(key, 'key', this._isBuffer)) return callback(err) if (!this._isBuffer(key)) key = String(key) // coerce value to string in node, don't touch it in browser // (indexeddb can store any JS type) if (value != null && !this._isBuffer(value) && !process.browser) value = String(value) if (typeof options != 'object') options = {} if (typeof this._put == 'function') return this._put(key, value, options, callback) process.nextTick(callback) } AbstractLevelDOWN.prototype.del = function (key, options, callback) { var err if (typeof options == 'function') callback = options if (typeof callback != 'function') throw new Error('del() requires a callback argument') if (err = this._checkKey(key, 'key', this._isBuffer)) return callback(err) if (!this._isBuffer(key)) key = String(key) if (typeof options != 'object') options = {} if (typeof this._del == 'function') return this._del(key, options, callback) process.nextTick(callback) } AbstractLevelDOWN.prototype.batch = function (array, options, callback) { if (!arguments.length) return this._chainedBatch() if (typeof options == 'function') callback = options if (typeof array == 'function') callback = array if (typeof callback != 'function') throw new Error('batch(array) requires a callback argument') if (!Array.isArray(array)) return callback(new Error('batch(array) requires an array argument')) if (!options || typeof options != 'object') options = {} var i = 0 , l = array.length , e , err for (; i < l; i++) { e = array[i] if (typeof e != 'object') continue if (err = this._checkKey(e.type, 'type', this._isBuffer)) return callback(err) if (err = this._checkKey(e.key, 'key', this._isBuffer)) return callback(err) } if (typeof this._batch == 'function') return this._batch(array, options, callback) process.nextTick(callback) } //TODO: remove from here, not a necessary primitive AbstractLevelDOWN.prototype.approximateSize = function (start, end, callback) { if ( start == null || end == null || typeof start == 'function' || typeof end == 'function') { throw new Error('approximateSize() requires valid `start`, `end` and `callback` arguments') } if (typeof callback != 'function') throw new Error('approximateSize() requires a callback argument') if (!this._isBuffer(start)) start = String(start) if (!this._isBuffer(end)) end = String(end) if (typeof this._approximateSize == 'function') return this._approximateSize(start, end, callback) process.nextTick(function () { callback(null, 0) }) } AbstractLevelDOWN.prototype._setupIteratorOptions = function (options) { var self = this options = xtend(options) ;[ 'start', 'end', 'gt', 'gte', 'lt', 'lte' ].forEach(function (o) { if (options[o] && self._isBuffer(options[o]) && options[o].length === 0) delete options[o] }) options.reverse = !!options.reverse options.keys = options.keys != false options.values = options.values != false options.limit = 'limit' in options ? options.limit : -1 options.keyAsBuffer = options.keyAsBuffer != false options.valueAsBuffer = options.valueAsBuffer != false return options } AbstractLevelDOWN.prototype.iterator = function (options) { if (typeof options != 'object') options = {} options = this._setupIteratorOptions(options) if (typeof this._iterator == 'function') return this._iterator(options) return new AbstractIterator(this) } AbstractLevelDOWN.prototype._chainedBatch = function () { return new AbstractChainedBatch(this) } AbstractLevelDOWN.prototype._isBuffer = function (obj) { return Buffer.isBuffer(obj) } AbstractLevelDOWN.prototype._checkKey = function (obj, type) { if (obj === null || obj === undefined) return new Error(type + ' cannot be `null` or `undefined`') if (this._isBuffer(obj)) { if (obj.length === 0) return new Error(type + ' cannot be an empty Buffer') } else if (String(obj) === '') return new Error(type + ' cannot be an empty String') } module.exports = AbstractLevelDOWN }).call(this,{"isBuffer":require("../../../../../../.nvm-fish/v5.4.1/lib/node_modules/browserify/node_modules/is-buffer/index.js")},require('_process')) },{"../../../../../../.nvm-fish/v5.4.1/lib/node_modules/browserify/node_modules/is-buffer/index.js":93,"./abstract-chained-batch":139,"./abstract-iterator":140,"_process":104,"xtend":330}],142:[function(require,module,exports){ exports.AbstractLevelDOWN = require('./abstract-leveldown') exports.AbstractIterator = require('./abstract-iterator') exports.AbstractChainedBatch = require('./abstract-chained-batch') exports.isLevelDOWN = require('./is-leveldown') },{"./abstract-chained-batch":139,"./abstract-iterator":140,"./abstract-leveldown":141,"./is-leveldown":143}],143:[function(require,module,exports){ var AbstractLevelDOWN = require('./abstract-leveldown') function isLevelDOWN (db) { if (!db || typeof db !== 'object') return false return Object.keys(AbstractLevelDOWN.prototype).filter(function (name) { // TODO remove approximateSize check when method is gone return name[0] != '_' && name != 'approximateSize' }).every(function (name) { return typeof db[name] == 'function' }) } module.exports = isLevelDOWN },{"./abstract-leveldown":141}],144:[function(require,module,exports){ (function (process){ var once = require('once'); var isError = function(e) { return Object.prototype.toString.call(e) === '[object Error]' || e instanceof Error; }; module.exports = function(afterAllCb) { afterAllCb = once(afterAllCb || function() {}); var errorMessage ='"next" function called after the final callback.'+ ' Make sure all the calls to "next" are on the same tick'; var calls = 0; var done = false; var finalError = null; process.nextTick(function() { if (calls === 0) { done = true; afterAllCb(); } }); return function next(cb) { if (done) throw new Error(errorMessage); calls++; return function thecallback(err) { var args = arguments; if (isError(err) && !finalError) finalError = err; process.nextTick(function() { if (cb) cb.apply(null, args); if (--calls === 0) { done = true; afterAllCb(finalError); } }); }; }; }; }).call(this,require('_process')) },{"_process":104,"once":240}],145:[function(require,module,exports){ (function (Buffer){ var Container = typeof Buffer !== "undefined" ? Buffer //in node, use buffers : typeof Int8Array !== "undefined" ? Int8Array //in newer browsers, use webgl int8arrays : function(l){ var a = new Array(l); for(var i = 0; i < l; i++) a[i]=0; }; //else, do something similar function BitField(data, opts){ if(!(this instanceof BitField)) { return new BitField(data, opts); } if(arguments.length === 0){ data = 0; } this.grow = opts && (isFinite(opts.grow) && getByteSize(opts.grow) || opts.grow) || 0; if(typeof data === "number" || data === undefined){ data = new Container(getByteSize(data)); if(data.fill && !data._isBuffer) data.fill(0); // clear node buffers of garbage } this.buffer = data; } function getByteSize(num){ var out = num >> 3; if(num % 8 !== 0) out++; return out; } BitField.prototype.get = function(i){ var j = i >> 3; return (j < this.buffer.length) && !!(this.buffer[j] & (128 >> (i % 8))); }; BitField.prototype.set = function(i, b){ var j = i >> 3; if (b || arguments.length === 1){ if (this.buffer.length < j + 1) this._grow(Math.max(j + 1, Math.min(2 * this.buffer.length, this.grow))); // Set this.buffer[j] |= 128 >> (i % 8); } else if (j < this.buffer.length) { /// Clear this.buffer[j] &= ~(128 >> (i % 8)); } }; BitField.prototype._grow = function(length) { if (this.buffer.length < length && length <= this.grow)="" {="" var="" newbuffer="new" container(length);="" if="" (newbuffer.fill)="" newbuffer.fill(0);="" (this.buffer.copy)="" this.buffer.copy(newbuffer,="" 0);="" else="" for(var="" i="0;" <="" this.buffer.length;="" i++)="" newbuffer[i]="this.buffer[i];" }="" this.buffer="newBuffer;" };="" if(typeof="" module="" !="=" "undefined")="" module.exports="BitField;" }).call(this,require("buffer").buffer)="" },{"buffer":45}],146:[function(require,module,exports){="" *!="" *="" cross-browser="" split="" 1.1.1="" copyright="" 2007-2012="" steven="" levithan="" * Available under the MIT License * ECMAScript compliant, uniform cross-browser split method */ /** * Splits a string into an array of strings using a regex or string separator. Matches of the * separator are not included in the result array. However, if `separator` is a regex that contains * capturing groups, backreferences are spliced into the result each time `separator` is matched. * Fixes browser bugs compared to the native `String.prototype.split` and can be used reliably * cross-browser. * @param {String} str String to split. * @param {RegExp|String} separator Regex or string to use for separating the string. * @param {Number} [limit] Maximum number of items to include in the result array. * @returns {Array} Array of substrings. * @example * * // Basic use * split('a b c d', ' '); * // -> ['a', 'b', 'c', 'd'] * * // With limit * split('a b c d', ' ', 2); * // -> ['a', 'b'] * * // Backreferences in result array * split('..word1 word2..', /([a-z]+)(\d+)/i); * // -> ['..', 'word', '1', ' ', 'word', '2', '..'] */ module.exports = (function split(undef) { var nativeSplit = String.prototype.split, compliantExecNpcg = /()??/.exec("")[1] === undef, // NPCG: nonparticipating capturing group self; self = function(str, separator, limit) { // If `separator` is not a regex, use `nativeSplit` if (Object.prototype.toString.call(separator) !== "[object RegExp]") { return nativeSplit.call(str, separator, limit); } var output = [], flags = (separator.ignoreCase ? "i" : "") + (separator.multiline ? "m" : "") + (separator.extended ? "x" : "") + // Proposed for ES6 (separator.sticky ? "y" : ""), // Firefox 3+ lastLastIndex = 0, // Make `global` and avoid `lastIndex` issues by working with a copy separator = new RegExp(separator.source, flags + "g"), separator2, match, lastIndex, lastLength; str += ""; // Type-convert if (!compliantExecNpcg) { // Doesn't need flags gy, but they don't hurt separator2 = new RegExp("^" + separator.source + "$(?!\\s)", flags); } /* Values for `limit`, per the spec: * If undefined: 4294967295 // Math.pow(2, 32) - 1 * If 0, Infinity, or NaN: 0 * If positive number: limit = Math.floor(limit); if (limit > 4294967295) limit -= 4294967296; * If negative number: 4294967296 - Math.floor(Math.abs(limit)) * If other: Type-convert, then use the above rules */ limit = limit === undef ? -1 >>> 0 : // Math.pow(2, 32) - 1 limit >>> 0; // ToUint32(limit) while (match = separator.exec(str)) { // `separator.lastIndex` is not reliable cross-browser lastIndex = match.index + match[0].length; if (lastIndex > lastLastIndex) { output.push(str.slice(lastLastIndex, match.index)); // Fix browsers whose `exec` methods don't consistently return `undefined` for // nonparticipating capturing groups if (!compliantExecNpcg && match.length > 1) { match[0].replace(separator2, function() { for (var i = 1; i < arguments.length - 2; i++) { if (arguments[i] === undef) { match[i] = undef; } } }); } if (match.length > 1 && match.index < str.length) { Array.prototype.push.apply(output, match.slice(1)); } lastLength = match[0].length; lastLastIndex = lastIndex; if (output.length >= limit) { break; } } if (separator.lastIndex === match.index) { separator.lastIndex++; // Avoid an infinite loop } } if (lastLastIndex === str.length) { if (lastLength || !separator.test("")) { output.push(""); } } else { output.push(str.slice(lastLastIndex)); } return output.length > limit ? output.slice(0, limit) : output; }; return self; })(); },{}],147:[function(require,module,exports){ (function (Buffer){ 'use strict'; module.exports = function (a, b) { if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) { throw new TypeError('Arguments must be Buffers'); } if (a === b) { return true; } if (typeof a.equals === 'function') { return a.equals(b); } if (a.length !== b.length) { return false; } for (var i = 0; i < a.length; i++) { if (a[i] !== b[i]) { return false; } } return true; }; }).call(this,{"isBuffer":require("../../../../../../.nvm-fish/v5.4.1/lib/node_modules/browserify/node_modules/is-buffer/index.js")}) },{"../../../../../../.nvm-fish/v5.4.1/lib/node_modules/browserify/node_modules/is-buffer/index.js":93}],148:[function(require,module,exports){ module.exports = function(obj) { if (typeof obj === 'string') return camelCase(obj); return walk(obj); }; function walk (obj) { if (!obj || typeof obj !== 'object') return obj; if (isDate(obj) || isRegex(obj)) return obj; if (isArray(obj)) return map(obj, walk); return reduce(objectKeys(obj), function (acc, key) { var camel = camelCase(key); acc[camel] = walk(obj[key]); return acc; }, {}); } function camelCase(str) { return str.replace(/[_.-](\w|$)/g, function (_,x) { return x.toUpperCase(); }); } var isArray = Array.isArray || function (obj) { return Object.prototype.toString.call(obj) === '[object Array]'; }; var isDate = function (obj) { return Object.prototype.toString.call(obj) === '[object Date]'; }; var isRegex = function (obj) { return Object.prototype.toString.call(obj) === '[object RegExp]'; }; var has = Object.prototype.hasOwnProperty; var objectKeys = Object.keys || function (obj) { var keys = []; for (var key in obj) { if (has.call(obj, key)) keys.push(key); } return keys; }; function map (xs, f) { if (xs.map) return xs.map(f); var res = []; for (var i = 0; i < xs.length; i++) { res.push(f(xs[i], i)); } return res; } function reduce (xs, f, acc) { if (xs.reduce) return xs.reduce(f, acc); for (var i = 0; i < xs.length; i++) { acc = f(acc, xs[i], i); } return acc; } },{}],149:[function(require,module,exports){ module.exports = require('sodium-browserify/browser') },{"sodium-browserify/browser":269}],150:[function(require,module,exports){ (function (Buffer){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a // copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to permit // persons to whom the Software is furnished to do so, subject to the // following conditions: // // The above copyright notice and this permission notice shall be included // in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE // USE OR OTHER DEALINGS IN THE SOFTWARE. // NOTE: These type checking functions intentionally don't use `instanceof` // because it is fragile and can be easily faked with `Object.create()`. function isArray(arg) { if (Array.isArray) { return Array.isArray(arg); } return objectToString(arg) === '[object Array]'; } exports.isArray = isArray; function isBoolean(arg) { return typeof arg === 'boolean'; } exports.isBoolean = isBoolean; function isNull(arg) { return arg === null; } exports.isNull = isNull; function isNullOrUndefined(arg) { return arg == null; } exports.isNullOrUndefined = isNullOrUndefined; function isNumber(arg) { return typeof arg === 'number'; } exports.isNumber = isNumber; function isString(arg) { return typeof arg === 'string'; } exports.isString = isString; function isSymbol(arg) { return typeof arg === 'symbol'; } exports.isSymbol = isSymbol; function isUndefined(arg) { return arg === void 0; } exports.isUndefined = isUndefined; function isRegExp(re) { return objectToString(re) === '[object RegExp]'; } exports.isRegExp = isRegExp; function isObject(arg) { return typeof arg === 'object' && arg !== null; } exports.isObject = isObject; function isDate(d) { return objectToString(d) === '[object Date]'; } exports.isDate = isDate; function isError(e) { return (objectToString(e) === '[object Error]' || e instanceof Error); } exports.isError = isError; function isFunction(arg) { return typeof arg === 'function'; } exports.isFunction = isFunction; function isPrimitive(arg) { return arg === null || typeof arg === 'boolean' || typeof arg === 'number' || typeof arg === 'string' || typeof arg === 'symbol' || // ES6 symbol typeof arg === 'undefined'; } exports.isPrimitive = isPrimitive; exports.isBuffer = Buffer.isBuffer; function objectToString(o) { return Object.prototype.toString.call(o); } }).call(this,{"isBuffer":require("../../../../../../../.nvm-fish/v5.4.1/lib/node_modules/browserify/node_modules/is-buffer/index.js")}) },{"../../../../../../../.nvm-fish/v5.4.1/lib/node_modules/browserify/node_modules/is-buffer/index.js":93}],151:[function(require,module,exports){ /** * cuid.js * Collision-resistant UID generator for browsers and node. * Sequential for fast db lookups and recency sorting. * Safe for element IDs and server-side lookups. * * Extracted from CLCTR * * Copyright (c) Eric Elliott 2012 * MIT License */ /*global window, navigator, document, require, process, module */ (function (app) { 'use strict'; var namespace = 'cuid', c = 0, blockSize = 4, base = 36, discreteValues = Math.pow(base, blockSize), pad = function pad(num, size) { var s = "000000000" + num; return s.substr(s.length-size); }, randomBlock = function randomBlock() { return pad((Math.random() * discreteValues << 0) .toString(base), blockSize); }, safeCounter = function () { c = (c < discreteValues) ? c : 0; c++; // this is not subliminal return c - 1; }, api = function cuid() { // Starting with a lowercase letter makes // it HTML element ID friendly. var letter = 'c', // hard-coded allows for sequential access // timestamp // warning: this exposes the exact date and time // that the uid was created. timestamp = (new Date().getTime()).toString(base), // Prevent same-machine collisions. counter, // A few chars to generate distinct ids for different // clients (so different computers are far less // likely to generate the same id) fingerprint = api.fingerprint(), // Grab some more chars from Math.random() random = randomBlock() + randomBlock(); counter = pad(safeCounter().toString(base), blockSize); return (letter + timestamp + counter + fingerprint + random); }; api.slug = function slug() { var date = new Date().getTime().toString(36), counter, print = api.fingerprint().slice(0,1) + api.fingerprint().slice(-1), random = randomBlock().slice(-2); counter = safeCounter().toString(36).slice(-4); return date.slice(-2) + counter + print + random; }; api.globalCount = function globalCount() { // We want to cache the results of this var cache = (function calc() { var i, count = 0; for (i in window) { count++; } return count; }()); api.globalCount = function () { return cache; }; return cache; }; api.fingerprint = function browserPrint() { return pad((navigator.mimeTypes.length + navigator.userAgent.length).toString(36) + api.globalCount().toString(36), 4); }; // don't change anything from here down. if (app.register) { app.register(namespace, api); } else if (typeof module !== 'undefined') { module.exports = api; } else { app[namespace] = api; } }(this.applitude || this)); },{}],152:[function(require,module,exports){ /** * This is the web browser implementation of `debug()`. * * Expose `debug()` as the module. */ exports = module.exports = require('./debug'); exports.log = log; exports.formatArgs = formatArgs; exports.save = save; exports.load = load; exports.useColors = useColors; exports.storage = 'undefined' != typeof chrome && 'undefined' != typeof chrome.storage ? chrome.storage.local : localstorage(); /** * Colors. */ exports.colors = [ 'lightseagreen', 'forestgreen', 'goldenrod', 'dodgerblue', 'darkorchid', 'crimson' ]; /** * Currently only WebKit-based Web Inspectors, Firefox >= v31, * and the Firebug extension (any Firefox version) are known * to support "%c" CSS customizations. * * TODO: add a `localStorage` variable to explicitly enable/disable colors */ function useColors() { // is webkit? http://stackoverflow.com/a/16459606/376773 return ('WebkitAppearance' in document.documentElement.style) || // is firebug? http://stackoverflow.com/a/398120/376773 (window.console && (console.firebug || (console.exception && console.table))) || // is firefox >= v31? // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages (navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31); } /** * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default. */ exports.formatters.j = function(v) { return JSON.stringify(v); }; /** * Colorize log arguments if enabled. * * @api public */ function formatArgs() { var args = arguments; var useColors = this.useColors; args[0] = (useColors ? '%c' : '') + this.namespace + (useColors ? ' %c' : ' ') + args[0] + (useColors ? '%c ' : ' ') + '+' + exports.humanize(this.diff); if (!useColors) return args; var c = 'color: ' + this.color; args = [args[0], c, 'color: inherit'].concat(Array.prototype.slice.call(args, 1)); // the final "%c" is somewhat tricky, because there could be other // arguments passed either before or after the %c, so we need to // figure out the correct index to insert the CSS into var index = 0; var lastC = 0; args[0].replace(/%[a-z%]/g, function(match) { if ('%%' === match) return; index++; if ('%c' === match) { // we only are interested in the *last* %c // (the user may have provided their own) lastC = index; } }); args.splice(lastC, 0, c); return args; } /** * Invokes `console.log()` when available. * No-op when `console.log` is not a "function". * * @api public */ function log() { // this hackery is required for IE8/9, where // the `console.log` function doesn't have 'apply' return 'object' === typeof console && console.log && Function.prototype.apply.call(console.log, console, arguments); } /** * Save `namespaces`. * * @param {String} namespaces * @api private */ function save(namespaces) { try { if (null == namespaces) { exports.storage.removeItem('debug'); } else { exports.storage.debug = namespaces; } } catch(e) {} } /** * Load `namespaces`. * * @return {String} returns the previously persisted debug modes * @api private */ function load() { var r; try { r = exports.storage.debug; } catch(e) {} return r; } /** * Enable namespaces listed in `localStorage.debug` initially. */ exports.enable(load()); /** * Localstorage attempts to return the localstorage. * * This is necessary because safari throws * when a user disables cookies/localstorage * and you attempt to access it. * * @return {LocalStorage} * @api private */ function localstorage(){ try { return window.localStorage; } catch (e) {} } },{"./debug":153}],153:[function(require,module,exports){ /** * This is the common logic for both the Node.js and web browser * implementations of `debug()`. * * Expose `debug()` as the module. */ exports = module.exports = debug; exports.coerce = coerce; exports.disable = disable; exports.enable = enable; exports.enabled = enabled; exports.humanize = require('ms'); /** * The currently active debug mode names, and names to skip. */ exports.names = []; exports.skips = []; /** * Map of special "%n" handling functions, for the debug "format" argument. * * Valid key names are a single, lowercased letter, i.e. "n". */ exports.formatters = {}; /** * Previously assigned color. */ var prevColor = 0; /** * Previous log timestamp. */ var prevTime; /** * Select a color. * * @return {Number} * @api private */ function selectColor() { return exports.colors[prevColor++ % exports.colors.length]; } /** * Create a debugger with the given `namespace`. * * @param {String} namespace * @return {Function} * @api public */ function debug(namespace) { // define the `disabled` version function disabled() { } disabled.enabled = false; // define the `enabled` version function enabled() { var self = enabled; // set `diff` timestamp var curr = +new Date(); var ms = curr - (prevTime || curr); self.diff = ms; self.prev = prevTime; self.curr = curr; prevTime = curr; // add the `color` if not set if (null == self.useColors) self.useColors = exports.useColors(); if (null == self.color && self.useColors) self.color = selectColor(); var args = Array.prototype.slice.call(arguments); args[0] = exports.coerce(args[0]); if ('string' !== typeof args[0]) { // anything else let's inspect with %o args = ['%o'].concat(args); } // apply any `formatters` transformations var index = 0; args[0] = args[0].replace(/%([a-z%])/g, function(match, format) { // if we encounter an escaped % then don't increase the array index if (match === '%%') return match; index++; var formatter = exports.formatters[format]; if ('function' === typeof formatter) { var val = args[index]; match = formatter.call(self, val); // now we need to remove `args[index]` since it's inlined in the `format` args.splice(index, 1); index--; } return match; }); if ('function' === typeof exports.formatArgs) { args = exports.formatArgs.apply(self, args); } var logFn = enabled.log || exports.log || console.log.bind(console); logFn.apply(self, args); } enabled.enabled = true; var fn = exports.enabled(namespace) ? enabled : disabled; fn.namespace = namespace; return fn; } /** * Enables a debug mode by namespaces. This can include modes * separated by a colon and wildcards. * * @param {String} namespaces * @api public */ function enable(namespaces) { exports.save(namespaces); var split = (namespaces || '').split(/[\s,]+/); var len = split.length; for (var i = 0; i < len; i++) { if (!split[i]) continue; // ignore empty strings namespaces = split[i].replace(/\*/g, '.*?'); if (namespaces[0] === '-') { exports.skips.push(new RegExp('^' + namespaces.substr(1) + '$')); } else { exports.names.push(new RegExp('^' + namespaces + '$')); } } } /** * Disable debug output. * * @api public */ function disable() { exports.enable(''); } /** * Returns true if the given mode name is enabled, false otherwise. * * @param {String} name * @return {Boolean} * @api public */ function enabled(name) { var i, len; for (i = 0, len = exports.skips.length; i < len; i++) { if (exports.skips[i].test(name)) { return false; } } for (i = 0, len = exports.names.length; i < len; i++) { if (exports.names[i].test(name)) { return true; } } return false; } /** * Coerce `val`. * * @param {Mixed} val * @return {Mixed} * @api private */ function coerce(val) { if (val instanceof Error) return val.stack || val.message; return val; } },{"ms":237}],154:[function(require,module,exports){ var util = require('util') , AbstractIterator = require('abstract-leveldown').AbstractIterator function DeferredIterator (options) { AbstractIterator.call(this, options) this._options = options this._iterator = null this._operations = [] } util.inherits(DeferredIterator, AbstractIterator) DeferredIterator.prototype.setDb = function (db) { var it = this._iterator = db.iterator(this._options) this._operations.forEach(function (op) { it[op.method].apply(it, op.args) }) } DeferredIterator.prototype._operation = function (method, args) { if (this._iterator) return this._iterator[method].apply(this._iterator, args) this._operations.push({ method: method, args: args }) } 'next end'.split(' ').forEach(function (m) { DeferredIterator.prototype['_' + m] = function () { this._operation(m, arguments) } }) module.exports = DeferredIterator; },{"abstract-leveldown":142,"util":135}],155:[function(require,module,exports){ (function (Buffer,process){ var util = require('util') , AbstractLevelDOWN = require('abstract-leveldown').AbstractLevelDOWN , DeferredIterator = require('./deferred-iterator') function DeferredLevelDOWN (location) { AbstractLevelDOWN.call(this, typeof location == 'string' ? location : '') // optional location, who cares? this._db = undefined this._operations = [] this._iterators = [] } util.inherits(DeferredLevelDOWN, AbstractLevelDOWN) // called by LevelUP when we have a real DB to take its place DeferredLevelDOWN.prototype.setDb = function (db) { this._db = db this._operations.forEach(function (op) { db[op.method].apply(db, op.args) }) this._iterators.forEach(function (it) { it.setDb(db) }) } DeferredLevelDOWN.prototype._open = function (options, callback) { return process.nextTick(callback) } // queue a new deferred operation DeferredLevelDOWN.prototype._operation = function (method, args) { if (this._db) return this._db[method].apply(this._db, args) this._operations.push({ method: method, args: args }) } // deferrables 'put get del batch approximateSize'.split(' ').forEach(function (m) { DeferredLevelDOWN.prototype['_' + m] = function () { this._operation(m, arguments) } }) DeferredLevelDOWN.prototype._isBuffer = function (obj) { return Buffer.isBuffer(obj) } DeferredLevelDOWN.prototype._iterator = function (options) { if (this._db) return this._db.iterator.apply(this._db, arguments) var it = new DeferredIterator(options) this._iterators.push(it) return it } module.exports = DeferredLevelDOWN module.exports.DeferredIterator = DeferredIterator }).call(this,{"isBuffer":require("../../../../../../.nvm-fish/v5.4.1/lib/node_modules/browserify/node_modules/is-buffer/index.js")},require('_process')) },{"../../../../../../.nvm-fish/v5.4.1/lib/node_modules/browserify/node_modules/is-buffer/index.js":93,"./deferred-iterator":154,"_process":104,"abstract-leveldown":142,"util":135}],156:[function(require,module,exports){ module.exports = function () { for (var i = 0; i < arguments.length; i++) { if (arguments[i] !== undefined) return arguments[i]; } }; },{}],157:[function(require,module,exports){ (function (process,Buffer){ var stream = require('readable-stream') var eos = require('end-of-stream') var util = require('util') var SIGNAL_FLUSH = new Buffer([0]) var onuncork = function(self, fn) { if (self._corked) self.once('uncork', fn) else fn() } var destroyer = function(self, end) { return function(err) { if (err) self.destroy(err.message === 'premature close' ? null : err) else if (end && !self._ended) self.end() } } var end = function(ws, fn) { if (!ws) return fn() if (ws._writableState && ws._writableState.finished) return fn() if (ws._writableState) return ws.end(fn) ws.end() fn() } var toStreams2 = function(rs) { return new (stream.Readable)({objectMode:true, highWaterMark:16}).wrap(rs) } var Duplexify = function(writable, readable, opts) { if (!(this instanceof Duplexify)) return new Duplexify(writable, readable, opts) stream.Duplex.call(this, opts) this._writable = null this._readable = null this._readable2 = null this._forwardDestroy = !opts || opts.destroy !== false this._forwardEnd = !opts || opts.end !== false this._corked = 1 // start corked this._ondrain = null this._drained = false this._forwarding = false this._unwrite = null this._unread = null this._ended = false this.destroyed = false if (writable) this.setWritable(writable) if (readable) this.setReadable(readable) } util.inherits(Duplexify, stream.Duplex) Duplexify.obj = function(writable, readable, opts) { if (!opts) opts = {} opts.objectMode = true opts.highWaterMark = 16 return new Duplexify(writable, readable, opts) } Duplexify.prototype.cork = function() { if (++this._corked === 1) this.emit('cork') } Duplexify.prototype.uncork = function() { if (this._corked && --this._corked === 0) this.emit('uncork') } Duplexify.prototype.setWritable = function(writable) { if (this._unwrite) this._unwrite() if (this.destroyed) { if (writable && writable.destroy) writable.destroy() return } if (writable === null || writable === false) { this.end() return } var self = this var unend = eos(writable, {writable:true, readable:false}, destroyer(this, this._forwardEnd)) var ondrain = function() { var ondrain = self._ondrain self._ondrain = null if (ondrain) ondrain() } var clear = function() { self._writable.removeListener('drain', ondrain) unend() } if (this._unwrite) process.nextTick(ondrain) // force a drain on stream reset to avoid livelocks this._writable = writable this._writable.on('drain', ondrain) this._unwrite = clear this.uncork() // always uncork setWritable } Duplexify.prototype.setReadable = function(readable) { if (this._unread) this._unread() if (this.destroyed) { if (readable && readable.destroy) readable.destroy() return } if (readable === null || readable === false) { this.push(null) this.resume() return } var self = this var unend = eos(readable, {writable:false, readable:true}, destroyer(this)) var onreadable = function() { self._forward() } var onend = function() { self.push(null) } var clear = function() { self._readable2.removeListener('readable', onreadable) self._readable2.removeListener('end', onend) unend() } this._drained = true this._readable = readable this._readable2 = readable._readableState ? readable : toStreams2(readable) this._readable2.on('readable', onreadable) this._readable2.on('end', onend) this._unread = clear this._forward() } Duplexify.prototype._read = function() { this._drained = true this._forward() } Duplexify.prototype._forward = function() { if (this._forwarding || !this._readable2 || !this._drained) return this._forwarding = true var data var state = this._readable2._readableState while ((data = this._readable2.read(state.buffer.length ? state.buffer[0].length : state.length)) !== null) { this._drained = this.push(data) } this._forwarding = false } Duplexify.prototype.destroy = function(err) { if (this.destroyed) return this.destroyed = true var self = this process.nextTick(function() { self._destroy(err) }) } Duplexify.prototype._destroy = function(err) { if (err) { var ondrain = this._ondrain this._ondrain = null if (ondrain) ondrain(err) else this.emit('error', err) } if (this._forwardDestroy) { if (this._readable && this._readable.destroy) this._readable.destroy() if (this._writable && this._writable.destroy) this._writable.destroy() } this.emit('close') } Duplexify.prototype._write = function(data, enc, cb) { if (this.destroyed) return cb() if (this._corked) return onuncork(this, this._write.bind(this, data, enc, cb)) if (data === SIGNAL_FLUSH) return this._finish(cb) if (!this._writable) return cb() if (this._writable.write(data) === false) this._ondrain = cb else cb() } Duplexify.prototype._finish = function(cb) { var self = this this.emit('preend') onuncork(this, function() { end(self._forwardEnd && self._writable, function() { // haxx to not emit prefinish twice if (self._writableState.prefinished === false) self._writableState.prefinished = true self.emit('prefinish') onuncork(self, cb) }) }) } Duplexify.prototype.end = function(data, enc, cb) { if (typeof data === 'function') return this.end(null, null, data) if (typeof enc === 'function') return this.end(data, null, enc) this._ended = true if (data) this.write(data) if (!this._writableState.ending) this.write(SIGNAL_FLUSH) return stream.Writable.prototype.end.call(this, cb) } module.exports = Duplexify }).call(this,require('_process'),require("buffer").Buffer) },{"_process":104,"buffer":45,"end-of-stream":158,"readable-stream":164,"util":135}],158:[function(require,module,exports){ var once = require('once'); var noop = function() {}; var isRequest = function(stream) { return stream.setHeader && typeof stream.abort === 'function'; }; var eos = function(stream, opts, callback) { if (typeof opts === 'function') return eos(stream, null, opts); if (!opts) opts = {}; callback = once(callback || noop); var ws = stream._writableState; var rs = stream._readableState; var readable = opts.readable || (opts.readable !== false && stream.readable); var writable = opts.writable || (opts.writable !== false && stream.writable); var onlegacyfinish = function() { if (!stream.writable) onfinish(); }; var onfinish = function() { writable = false; if (!readable) callback(); }; var onend = function() { readable = false; if (!writable) callback(); }; var onclose = function() { if (readable && !(rs && rs.ended)) return callback(new Error('premature close')); if (writable && !(ws && ws.ended)) return callback(new Error('premature close')); }; var onrequest = function() { stream.req.on('finish', onfinish); }; if (isRequest(stream)) { stream.on('complete', onfinish); stream.on('abort', onclose); if (stream.req) onrequest(); else stream.on('request', onrequest); } else if (writable && !ws) { // legacy streams stream.on('end', onlegacyfinish); stream.on('close', onlegacyfinish); } stream.on('end', onend); stream.on('finish', onfinish); if (opts.error !== false) stream.on('error', callback); stream.on('close', onclose); return function() { stream.removeListener('complete', onfinish); stream.removeListener('abort', onclose); stream.removeListener('request', onrequest); if (stream.req) stream.req.removeListener('finish', onfinish); stream.removeListener('end', onlegacyfinish); stream.removeListener('close', onlegacyfinish); stream.removeListener('finish', onfinish); stream.removeListener('end', onend); stream.removeListener('error', callback); stream.removeListener('close', onclose); }; }; module.exports = eos; },{"once":240}],159:[function(require,module,exports){ arguments[4][113][0].apply(exports,arguments) },{"./_stream_readable":161,"./_stream_writable":163,"core-util-is":150,"dup":113,"inherits":204,"process-nextick-args":243}],160:[function(require,module,exports){ arguments[4][114][0].apply(exports,arguments) },{"./_stream_transform":162,"core-util-is":150,"dup":114,"inherits":204}],161:[function(require,module,exports){ (function (process){ 'use strict'; module.exports = Readable; /**/ var processNextTick = require('process-nextick-args'); /**/ /**/ var isArray = require('isarray'); /**/ /**/ var Buffer = require('buffer').Buffer; /**/ Readable.ReadableState = ReadableState; var EE = require('events'); /**/ var EElistenerCount = function(emitter, type) { return emitter.listeners(type).length; }; /**/ /**/ var Stream; (function (){try{ Stream = require('st' + 'ream'); }catch(_){}finally{ if (!Stream) Stream = require('events').EventEmitter; }}()) /**/ var Buffer = require('buffer').Buffer; /**/ var util = require('core-util-is'); util.inherits = require('inherits'); /**/ /**/ var debugUtil = require('util'); var debug; if (debugUtil && debugUtil.debuglog) { debug = debugUtil.debuglog('stream'); } else { debug = function () {}; } /**/ var StringDecoder; util.inherits(Readable, Stream); var Duplex; function ReadableState(options, stream) { Duplex = Duplex || require('./_stream_duplex'); options = options || {}; // object stream flag. Used to make read(n) ignore n and to // make all the buffer merging and length checks go away this.objectMode = !!options.objectMode; if (stream instanceof Duplex) this.objectMode = this.objectMode || !!options.readableObjectMode; // the point at which it stops calling _read() to fill the buffer // Note: 0 is a valid value, means "don't call _read preemptively ever" var hwm = options.highWaterMark; var defaultHwm = this.objectMode ? 16 : 16 * 1024; this.highWaterMark = (hwm || hwm === 0) ? hwm : defaultHwm; // cast to ints. this.highWaterMark = ~~this.highWaterMark; this.buffer = []; this.length = 0; this.pipes = null; this.pipesCount = 0; this.flowing = null; this.ended = false; this.endEmitted = false; this.reading = false; // a flag to be able to tell if the onwrite cb is called immediately, // or on a later tick. We set this to true at first, because any // actions that shouldn't happen until "later" should generally also // not happen before the first write call. this.sync = true; // whenever we return null, then we set a flag to say // that we're awaiting a 'readable' event emission. this.needReadable = false; this.emittedReadable = false; this.readableListening = false; // Crypto is kind of old and crusty. Historically, its default string // encoding is 'binary' so we have to make this configurable. // Everything else in the universe uses 'utf8', though. this.defaultEncoding = options.defaultEncoding || 'utf8'; // when piping, we only care about 'readable' events that happen // after read()ing all the bytes and not getting any pushback. this.ranOut = false; // the number of writers that are awaiting a drain event in .pipe()s this.awaitDrain = 0; // if true, a maybeReadMore has been scheduled this.readingMore = false; this.decoder = null; this.encoding = null; if (options.encoding) { if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder; this.decoder = new StringDecoder(options.encoding); this.encoding = options.encoding; } } var Duplex; function Readable(options) { Duplex = Duplex || require('./_stream_duplex'); if (!(this instanceof Readable)) return new Readable(options); this._readableState = new ReadableState(options, this); // legacy this.readable = true; if (options && typeof options.read === 'function') this._read = options.read; Stream.call(this); } // Manually shove something into the read() buffer. // This returns true if the highWaterMark has not been hit yet, // similar to how Writable.write() returns true if you should // write() some more. Readable.prototype.push = function(chunk, encoding) { var state = this._readableState; if (!state.objectMode && typeof chunk === 'string') { encoding = encoding || state.defaultEncoding; if (encoding !== state.encoding) { chunk = new Buffer(chunk, encoding); encoding = ''; } } return readableAddChunk(this, state, chunk, encoding, false); }; // Unshift should *always* be something directly out of read() Readable.prototype.unshift = function(chunk) { var state = this._readableState; return readableAddChunk(this, state, chunk, '', true); }; Readable.prototype.isPaused = function() { return this._readableState.flowing === false; }; function readableAddChunk(stream, state, chunk, encoding, addToFront) { var er = chunkInvalid(state, chunk); if (er) { stream.emit('error', er); } else if (chunk === null) { state.reading = false; onEofChunk(stream, state); } else if (state.objectMode || chunk && chunk.length > 0) { if (state.ended && !addToFront) { var e = new Error('stream.push() after EOF'); stream.emit('error', e); } else if (state.endEmitted && addToFront) { var e = new Error('stream.unshift() after end event'); stream.emit('error', e); } else { if (state.decoder && !addToFront && !encoding) chunk = state.decoder.write(chunk); if (!addToFront) state.reading = false; // if we want the data now, just emit it. if (state.flowing && state.length === 0 && !state.sync) { stream.emit('data', chunk); stream.read(0); } else { // update the buffer info. state.length += state.objectMode ? 1 : chunk.length; if (addToFront) state.buffer.unshift(chunk); else state.buffer.push(chunk); if (state.needReadable) emitReadable(stream); } maybeReadMore(stream, state); } } else if (!addToFront) { state.reading = false; } return needMoreData(state); } // if it's past the high water mark, we can push in some more. // Also, if we have no data yet, we can stand some // more bytes. This is to work around cases where hwm=0, // such as the repl. Also, if the push() triggered a // readable event, and the user called read(largeNumber) such that // needReadable was set, then we ought to push more, so that another // 'readable' event will be triggered. function needMoreData(state) { return !state.ended && (state.needReadable || state.length < state.highWaterMark || state.length === 0); } // backwards compatibility. Readable.prototype.setEncoding = function(enc) { if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder; this._readableState.decoder = new StringDecoder(enc); this._readableState.encoding = enc; return this; }; // Don't raise the hwm > 8MB var MAX_HWM = 0x800000; function computeNewHighWaterMark(n) { if (n >= MAX_HWM) { n = MAX_HWM; } else { // Get the next highest power of 2 n--; n |= n >>> 1; n |= n >>> 2; n |= n >>> 4; n |= n >>> 8; n |= n >>> 16; n++; } return n; } function howMuchToRead(n, state) { if (state.length === 0 && state.ended) return 0; if (state.objectMode) return n === 0 ? 0 : 1; if (n === null || isNaN(n)) { // only flow one buffer at a time if (state.flowing && state.buffer.length) return state.buffer[0].length; else return state.length; } if (n <= 0)="" return="" 0;="" if="" we're="" asking="" for="" more="" than="" the="" target="" buffer="" level,="" then="" raise="" water="" mark.="" bump="" up="" to="" next="" highest="" power="" of="" 2,="" prevent="" increasing="" it="" excessively="" in="" tiny="" amounts.="" (n=""> state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n); // don't have that much. return null, unless we've ended. if (n > state.length) { if (!state.ended) { state.needReadable = true; return 0; } else { return state.length; } } return n; } // you can override either this method, or the async _read(n) below. Readable.prototype.read = function(n) { debug('read', n); var state = this._readableState; var nOrig = n; if (typeof n !== 'number' || n > 0) state.emittedReadable = false; // if we're doing read(0) to trigger a readable event, but we // already have a bunch of data in the buffer, then just trigger // the 'readable' event and move on. if (n === 0 && state.needReadable && (state.length >= state.highWaterMark || state.ended)) { debug('read: emitReadable', state.length, state.ended); if (state.length === 0 && state.ended) endReadable(this); else emitReadable(this); return null; } n = howMuchToRead(n, state); // if we've ended, and we're now clear, then finish it up. if (n === 0 && state.ended) { if (state.length === 0) endReadable(this); return null; } // All the actual chunk generation logic needs to be // *below* the call to _read. The reason is that in certain // synthetic stream cases, such as passthrough streams, _read // may be a completely synchronous operation which may change // the state of the read buffer, providing enough data when // before there was *not* enough. // // So, the steps are: // 1. Figure out what the state of things will be after we do // a read from the buffer. // // 2. If that resulting state will trigger a _read, then call _read. // Note that this may be asynchronous, or synchronous. Yes, it is // deeply ugly to write APIs this way, but that still doesn't mean // that the Readable class should behave improperly, as streams are // designed to be sync/async agnostic. // Take note if the _read call is sync or async (ie, if the read call // has returned yet), so that we know whether or not it's safe to emit // 'readable' etc. // // 3. Actually pull the requested chunks out of the buffer and return. // if we need a readable event, then we need to do some reading. var doRead = state.needReadable; debug('need readable', doRead); // if we currently have less than the highWaterMark, then also read some if (state.length === 0 || state.length - n < state.highWaterMark) { doRead = true; debug('length less than watermark', doRead); } // however, if we've ended, then there's no point, and if we're already // reading, then it's unnecessary. if (state.ended || state.reading) { doRead = false; debug('reading or ended', doRead); } if (doRead) { debug('do read'); state.reading = true; state.sync = true; // if the length is currently zero, then we *need* a readable event. if (state.length === 0) state.needReadable = true; // call internal read method this._read(state.highWaterMark); state.sync = false; } // If _read pushed data synchronously, then `reading` will be false, // and we need to re-evaluate how much data we can return to the user. if (doRead && !state.reading) n = howMuchToRead(nOrig, state); var ret; if (n > 0) ret = fromList(n, state); else ret = null; if (ret === null) { state.needReadable = true; n = 0; } state.length -= n; // If we have nothing in the buffer, then we want to know // as soon as we *do* get something into the buffer. if (state.length === 0 && !state.ended) state.needReadable = true; // If we tried to read() past the EOF, then emit end on the next tick. if (nOrig !== n && state.ended && state.length === 0) endReadable(this); if (ret !== null) this.emit('data', ret); return ret; }; function chunkInvalid(state, chunk) { var er = null; if (!(Buffer.isBuffer(chunk)) && typeof chunk !== 'string' && chunk !== null && chunk !== undefined && !state.objectMode) { er = new TypeError('Invalid non-string/buffer chunk'); } return er; } function onEofChunk(stream, state) { if (state.ended) return; if (state.decoder) { var chunk = state.decoder.end(); if (chunk && chunk.length) { state.buffer.push(chunk); state.length += state.objectMode ? 1 : chunk.length; } } state.ended = true; // emit 'readable' now to make sure it gets picked up. emitReadable(stream); } // Don't emit readable right away in sync mode, because this can trigger // another read() call => stack overflow. This way, it might trigger // a nextTick recursion warning, but that's not so bad. function emitReadable(stream) { var state = stream._readableState; state.needReadable = false; if (!state.emittedReadable) { debug('emitReadable', state.flowing); state.emittedReadable = true; if (state.sync) processNextTick(emitReadable_, stream); else emitReadable_(stream); } } function emitReadable_(stream) { debug('emit readable'); stream.emit('readable'); flow(stream); } // at this point, the user has presumably seen the 'readable' event, // and called read() to consume some data. that may have triggered // in turn another _read(n) call, in which case reading = true if // it's in progress. // However, if we're not ended, or reading, and the length < hwm, // then go ahead and try to read some more preemptively. function maybeReadMore(stream, state) { if (!state.readingMore) { state.readingMore = true; processNextTick(maybeReadMore_, stream, state); } } function maybeReadMore_(stream, state) { var len = state.length; while (!state.reading && !state.flowing && !state.ended && state.length < state.highWaterMark) { debug('maybeReadMore read 0'); stream.read(0); if (len === state.length) // didn't get any data, stop spinning. break; else len = state.length; } state.readingMore = false; } // abstract method. to be overridden in specific implementation classes. // call cb(er, data) where data is <= 0="" 1="" n="" in="" length.="" for="" virtual="" (non-string,="" non-buffer)="" streams,="" "length"="" is="" somewhat="" arbitrary,="" and="" perhaps="" not="" very="" meaningful.="" readable.prototype._read="function(n)" {="" this.emit('error',="" new="" error('not="" implemented'));="" };="" readable.prototype.pipe="function(dest," pipeopts)="" var="" src="this;" state="this._readableState;" switch="" (state.pipescount)="" case="" 0:="" state.pipes="dest;" break;="" 1:="" dest];="" default:="" state.pipes.push(dest);="" }="" state.pipescount="" +="1;" debug('pipe="" count="%d" opts="%j'," state.pipescount,="" pipeopts);="" doend="(!pipeOpts" ||="" pipeopts.end="" !="=" false)="" &&="" dest="" process.stdout="" process.stderr;="" endfn="doEnd" ?="" onend="" :="" cleanup;="" if="" (state.endemitted)="" processnexttick(endfn);="" else="" src.once('end',="" endfn);="" dest.on('unpipe',="" onunpipe);="" function="" onunpipe(readable)="" debug('onunpipe');="" (readable="==" src)="" cleanup();="" onend()="" debug('onend');="" dest.end();="" when="" the="" drains,="" it="" reduces="" awaitdrain="" counter="" on="" source.="" this="" would="" be="" more="" elegant="" with="" a="" .once()="" handler="" flow(),="" but="" adding="" removing="" repeatedly="" too="" slow.="" ondrain="pipeOnDrain(src);" dest.on('drain',="" ondrain);="" cleanedup="false;" cleanup()="" debug('cleanup');="" cleanup="" event="" handlers="" once="" pipe="" broken="" dest.removelistener('close',="" onclose);="" dest.removelistener('finish',="" onfinish);="" dest.removelistener('drain',="" dest.removelistener('error',="" onerror);="" dest.removelistener('unpipe',="" src.removelistener('end',="" onend);="" cleanup);="" src.removelistener('data',="" ondata);="" reader="" waiting="" drain="" from="" specific="" writer,="" then="" cause="" to="" never="" start="" flowing="" again.="" so,="" awaiting="" drain,="" we="" just="" call="" now.="" don't="" know,="" assume="" that="" are="" one.="" (state.awaitdrain="" (!dest._writablestate="" dest._writablestate.needdrain))="" ondrain();="" src.on('data',="" ondata(chunk)="" debug('ondata');="" ret="dest.write(chunk);" (false="==" ret)="" user="" unpiped="" during="" `dest.write()`,="" possible="" get="" stuck="" permanently="" paused="" write="" also="" returned="" false.="" (state.pipescount="==" state.pipes[0]="==" src.listenercount('data')="==" !cleanedup)="" debug('false="" response,="" pause',="" src._readablestate.awaitdrain);="" src._readablestate.awaitdrain++;="" src.pause();="" has="" an="" error,="" stop="" piping="" into="" it.="" however,="" suppress="" throwing="" behavior="" this.="" onerror(er)="" debug('onerror',="" er);="" unpipe();="" (eelistenercount(dest,="" 'error')="==" 0)="" dest.emit('error',="" brutally="" ugly="" hack="" make="" sure="" our="" error="" attached="" before="" any="" userland="" ones.="" do="" (!dest._events="" !dest._events.error)="" dest.on('error',="" (isarray(dest._events.error))="" dest._events.error.unshift(onerror);="" dest._events.error="[onerror," dest._events.error];="" both="" close="" finish="" should="" trigger="" unpipe,="" only="" once.="" onclose()="" dest.once('close',="" onfinish()="" debug('onfinish');="" dest.once('finish',="" unpipe()="" debug('unpipe');="" src.unpipe(dest);="" tell="" it's="" being="" piped="" dest.emit('pipe',="" src);="" flow="" hasn't="" been="" started="" already.="" (!state.flowing)="" resume');="" src.resume();="" return="" dest;="" pipeondrain(src)="" function()="" debug('pipeondrain',="" state.awaitdrain);="" (state.awaitdrain)="" state.awaitdrain--;="" eelistenercount(src,="" 'data'))="" state.flowing="true;" flow(src);="" readable.prototype.unpipe="function(dest)" we're="" anywhere,="" nothing.="" this;="" one="" destination.="" most="" common="" case.="" 1)="" passed="" one,="" right="" (dest="" state.pipes)="" (!dest)="" got="" match.="" (dest)="" dest.emit('unpipe',="" this);="" slow="" multiple destinations.="" remove="" all.="" dests="state.pipes;" len="state.pipesCount;" (var="" i="0;" <="" len;="" i++)="" dests[i].emit('unpipe',="" try="" find="" dest);="" (i="==" -1)="" state.pipes.splice(i,="" 1);="" -="1;" set="" up="" data="" events="" they="" asked="" ensure="" readable="" listeners="" eventually="" something="" readable.prototype.on="function(ev," fn)="" res="Stream.prototype.on.call(this," ev,="" fn);="" listening="" data,="" explicitly="" paused,="" resume="" of="" next="" tick.="" (ev="==" 'data'="" false="" this._readablestate.flowing)="" this.resume();="" 'readable'="" this.readable)="" (!state.readablelistening)="" state.readablelistening="true;" state.emittedreadable="false;" state.needreadable="true;" (!state.reading)="" processnexttick(nreadingnexttick,="" (state.length)="" emitreadable(this,="" state);="" res;="" readable.prototype.addlistener="Readable.prototype.on;" nreadingnexttick(self)="" debug('readable="" nexttick="" read="" 0');="" self.read(0);="" pause()="" resume()="" remnants="" legacy="" stream="" api="" uses="" them,="" old="" mode.="" readable.prototype.resume="function()" debug('resume');="" resume(this,="" resume(stream,="" state)="" (!state.resumescheduled)="" state.resumescheduled="true;" processnexttick(resume_,="" stream,="" resume_(stream,="" debug('resume="" stream.read(0);="" stream.emit('resume');="" flow(stream);="" (state.flowing="" !state.reading)="" readable.prototype.pause="function()" debug('call="" pause="" this._readablestate.flowing);="" debug('pause');="" this._readablestate.flowing="false;" this.emit('pause');="" flow(stream)="" debug('flow',="" state.flowing);="" (state.flowing)="" chunk="stream.read();" while="" (null="" wrap="" old-style="" as="" async *not*="" part="" interface.="" unfortunate="" mess="" history.="" readable.prototype.wrap="function(stream)" self="this;" stream.on('end',="" debug('wrapped="" end');="" (state.decoder="" !state.ended)="" (chunk="" chunk.length)="" self.push(chunk);="" self.push(null);="" });="" stream.on('data',="" function(chunk)="" data');="" (state.decoder)="" skip="" over="" falsy="" values="" objectmode="" (state.objectmode="" null="" undefined))="" return;="" (!state.objectmode="" (!chunk="" !chunk.length))="" (!ret)="" stream.pause();="" proxy="" all="" other="" methods.="" important="" wrapping="" filters="" duplexes.="" stream)="" (this[i]="==" undefined="" typeof="" stream[i]="==" 'function')="" this[i]="function(method)" stream[method].apply(stream,="" arguments);="" }(i);="" certain="" events.="" 'close',="" 'destroy',="" 'pause',="" 'resume'];="" foreach(events,="" function(ev)="" stream.on(ev,="" self.emit.bind(self,="" ev));="" consume="" some="" bytes,="" simply="" unpause="" underlying="" stream.="" self._read="function(n)" _read',="" n);="" (paused)="" stream.resume();="" self;="" exposed="" testing="" purposes="" only.="" readable._fromlist="fromList;" pluck="" off="" bytes="" array="" buffers.="" length="" combined="" lengths="" buffers="" list.="" fromlist(n,="" list="state.buffer;" stringmode="!!state.decoder;" ret;="" nothing="" list,="" definitely="" empty.="" (list.length="==" null;="" (length="==" (objectmode)="" (!n="">= length) { // read it all, truncate the array. if (stringMode) ret = list.join(''); else if (list.length === 1) ret = list[0]; else ret = Buffer.concat(list, length); list.length = 0; } else { // read just some of it. if (n < list[0].length) { // just take a part of the first list item. // slice is the same for buffers and strings. var buf = list[0]; ret = buf.slice(0, n); list[0] = buf.slice(n); } else if (n === list[0].length) { // first list is a perfect match ret = list.shift(); } else { // complex case. // we have enough to cover it, but it spans past the first buffer. if (stringMode) ret = ''; else ret = new Buffer(n); var c = 0; for (var i = 0, l = list.length; i < l && c < n; i++) { var buf = list[0]; var cpy = Math.min(n - c, buf.length); if (stringMode) ret += buf.slice(0, cpy); else buf.copy(ret, c, 0, cpy); if (cpy < buf.length) list[0] = buf.slice(cpy); else list.shift(); c += cpy; } } } return ret; } function endReadable(stream) { var state = stream._readableState; // If we get here before consuming all the bytes, then that is a // bug in node. Should never happen. if (state.length > 0) throw new Error('endReadable called on non-empty stream'); if (!state.endEmitted) { state.ended = true; processNextTick(endReadableNT, state, stream); } } function endReadableNT(state, stream) { // Check that we didn't get one last unshift. if (!state.endEmitted && state.length === 0) { state.endEmitted = true; stream.readable = false; stream.emit('end'); } } function forEach (xs, f) { for (var i = 0, l = xs.length; i < l; i++) { f(xs[i], i); } } function indexOf (xs, x) { for (var i = 0, l = xs.length; i < l; i++) { if (xs[i] === x) return i; } return -1; } }).call(this,require('_process')) },{"./_stream_duplex":159,"_process":104,"buffer":45,"core-util-is":150,"events":82,"inherits":204,"isarray":209,"process-nextick-args":243,"string_decoder/":272,"util":19}],162:[function(require,module,exports){ arguments[4][116][0].apply(exports,arguments) },{"./_stream_duplex":159,"core-util-is":150,"dup":116,"inherits":204}],163:[function(require,module,exports){ arguments[4][117][0].apply(exports,arguments) },{"./_stream_duplex":159,"buffer":45,"core-util-is":150,"dup":117,"events":82,"inherits":204,"process-nextick-args":243,"util-deprecate":287}],164:[function(require,module,exports){ arguments[4][119][0].apply(exports,arguments) },{"./lib/_stream_duplex.js":159,"./lib/_stream_passthrough.js":160,"./lib/_stream_readable.js":161,"./lib/_stream_transform.js":162,"./lib/_stream_writable.js":163,"dup":119}],165:[function(require,module,exports){ var once = require('once'); var noop = function() {}; var isRequest = function(stream) { return stream.setHeader && typeof stream.abort === 'function'; }; var isChildProcess = function(stream) { return stream.stdio && Array.isArray(stream.stdio) && stream.stdio.length === 3 }; var eos = function(stream, opts, callback) { if (typeof opts === 'function') return eos(stream, null, opts); if (!opts) opts = {}; callback = once(callback || noop); var ws = stream._writableState; var rs = stream._readableState; var readable = opts.readable || (opts.readable !== false && stream.readable); var writable = opts.writable || (opts.writable !== false && stream.writable); var onlegacyfinish = function() { if (!stream.writable) onfinish(); }; var onfinish = function() { writable = false; if (!readable) callback(); }; var onend = function() { readable = false; if (!writable) callback(); }; var onexit = function(exitCode) { callback(exitCode ? new Error('exited with error code: ' + exitCode) : null); }; var onclose = function() { if (readable && !(rs && rs.ended)) return callback(new Error('premature close')); if (writable && !(ws && ws.ended)) return callback(new Error('premature close')); }; var onrequest = function() { stream.req.on('finish', onfinish); }; if (isRequest(stream)) { stream.on('complete', onfinish); stream.on('abort', onclose); if (stream.req) onrequest(); else stream.on('request', onrequest); } else if (writable && !ws) { // legacy streams stream.on('end', onlegacyfinish); stream.on('close', onlegacyfinish); } if (isChildProcess(stream)) stream.on('exit', onexit); stream.on('end', onend); stream.on('finish', onfinish); if (opts.error !== false) stream.on('error', callback); stream.on('close', onclose); return function() { stream.removeListener('complete', onfinish); stream.removeListener('abort', onclose); stream.removeListener('request', onrequest); if (stream.req) stream.req.removeListener('finish', onfinish); stream.removeListener('end', onlegacyfinish); stream.removeListener('close', onlegacyfinish); stream.removeListener('finish', onfinish); stream.removeListener('exit', onexit); stream.removeListener('end', onend); stream.removeListener('error', callback); stream.removeListener('close', onclose); }; }; module.exports = eos; },{"once":240}],166:[function(require,module,exports){ var prr = require('prr') function init (type, message, cause) { prr(this, { type : type , name : type // can be passed just a 'cause' , cause : typeof message != 'string' ? message : cause , message : !!message && typeof message != 'string' ? message.message : message }, 'ewr') } // generic prototype, not intended to be actually used - helpful for `instanceof` function CustomError (message, cause) { Error.call(this) if (Error.captureStackTrace) Error.captureStackTrace(this, arguments.callee) init.call(this, 'CustomError', message, cause) } CustomError.prototype = new Error() function createError (errno, type, proto) { var err = function (message, cause) { init.call(this, type, message, cause) //TODO: the specificity here is stupid, errno should be available everywhere if (type == 'FilesystemError') { this.code = this.cause.code this.path = this.cause.path this.errno = this.cause.errno this.message = (errno.errno[this.cause.errno] ? errno.errno[this.cause.errno].description : this.cause.message) + (this.cause.path ? ' [' + this.cause.path + ']' : '') } Error.call(this) if (Error.captureStackTrace) Error.captureStackTrace(this, arguments.callee) } err.prototype = !!proto ? new proto() : new CustomError() return err } module.exports = function (errno) { var ce = function (type, proto) { return createError(errno, type, proto) } return { CustomError : CustomError , FilesystemError : ce('FilesystemError') , createError : ce } } },{"prr":168}],167:[function(require,module,exports){ var all = module.exports.all = [ { errno: -2, code: 'ENOENT', description: 'no such file or directory' }, { errno: -1, code: 'UNKNOWN', description: 'unknown error' }, { errno: 0, code: 'OK', description: 'success' }, { errno: 1, code: 'EOF', description: 'end of file' }, { errno: 2, code: 'EADDRINFO', description: 'getaddrinfo error' }, { errno: 3, code: 'EACCES', description: 'permission denied' }, { errno: 4, code: 'EAGAIN', description: 'resource temporarily unavailable' }, { errno: 5, code: 'EADDRINUSE', description: 'address already in use' }, { errno: 6, code: 'EADDRNOTAVAIL', description: 'address not available' }, { errno: 7, code: 'EAFNOSUPPORT', description: 'address family not supported' }, { errno: 8, code: 'EALREADY', description: 'connection already in progress' }, { errno: 9, code: 'EBADF', description: 'bad file descriptor' }, { errno: 10, code: 'EBUSY', description: 'resource busy or locked' }, { errno: 11, code: 'ECONNABORTED', description: 'software caused connection abort' }, { errno: 12, code: 'ECONNREFUSED', description: 'connection refused' }, { errno: 13, code: 'ECONNRESET', description: 'connection reset by peer' }, { errno: 14, code: 'EDESTADDRREQ', description: 'destination address required' }, { errno: 15, code: 'EFAULT', description: 'bad address in system call argument' }, { errno: 16, code: 'EHOSTUNREACH', description: 'host is unreachable' }, { errno: 17, code: 'EINTR', description: 'interrupted system call' }, { errno: 18, code: 'EINVAL', description: 'invalid argument' }, { errno: 19, code: 'EISCONN', description: 'socket is already connected' }, { errno: 20, code: 'EMFILE', description: 'too many open files' }, { errno: 21, code: 'EMSGSIZE', description: 'message too long' }, { errno: 22, code: 'ENETDOWN', description: 'network is down' }, { errno: 23, code: 'ENETUNREACH', description: 'network is unreachable' }, { errno: 24, code: 'ENFILE', description: 'file table overflow' }, { errno: 25, code: 'ENOBUFS', description: 'no buffer space available' }, { errno: 26, code: 'ENOMEM', description: 'not enough memory' }, { errno: 27, code: 'ENOTDIR', description: 'not a directory' }, { errno: 28, code: 'EISDIR', description: 'illegal operation on a directory' }, { errno: 29, code: 'ENONET', description: 'machine is not on the network' }, { errno: 31, code: 'ENOTCONN', description: 'socket is not connected' }, { errno: 32, code: 'ENOTSOCK', description: 'socket operation on non-socket' }, { errno: 33, code: 'ENOTSUP', description: 'operation not supported on socket' }, { errno: 34, code: 'ENOENT', description: 'no such file or directory' }, { errno: 35, code: 'ENOSYS', description: 'function not implemented' }, { errno: 36, code: 'EPIPE', description: 'broken pipe' }, { errno: 37, code: 'EPROTO', description: 'protocol error' }, { errno: 38, code: 'EPROTONOSUPPORT', description: 'protocol not supported' }, { errno: 39, code: 'EPROTOTYPE', description: 'protocol wrong type for socket' }, { errno: 40, code: 'ETIMEDOUT', description: 'connection timed out' }, { errno: 41, code: 'ECHARSET', description: 'invalid Unicode character' }, { errno: 42, code: 'EAIFAMNOSUPPORT', description: 'address family for hostname not supported' }, { errno: 44, code: 'EAISERVICE', description: 'servname not supported for ai_socktype' }, { errno: 45, code: 'EAISOCKTYPE', description: 'ai_socktype not supported' }, { errno: 46, code: 'ESHUTDOWN', description: 'cannot send after transport endpoint shutdown' }, { errno: 47, code: 'EEXIST', description: 'file already exists' }, { errno: 48, code: 'ESRCH', description: 'no such process' }, { errno: 49, code: 'ENAMETOOLONG', description: 'name too long' }, { errno: 50, code: 'EPERM', description: 'operation not permitted' }, { errno: 51, code: 'ELOOP', description: 'too many symbolic links encountered' }, { errno: 52, code: 'EXDEV', description: 'cross-device link not permitted' }, { errno: 53, code: 'ENOTEMPTY', description: 'directory not empty' }, { errno: 54, code: 'ENOSPC', description: 'no space left on device' }, { errno: 55, code: 'EIO', description: 'i/o error' }, { errno: 56, code: 'EROFS', description: 'read-only file system' }, { errno: 57, code: 'ENODEV', description: 'no such device' }, { errno: 58, code: 'ESPIPE', description: 'invalid seek' }, { errno: 59, code: 'ECANCELED', description: 'operation canceled' } ] module.exports.errno = {} module.exports.code = {} all.forEach(function (error) { module.exports.errno[error.errno] = error module.exports.code[error.code] = error }) module.exports.custom = require('./custom')(module.exports) module.exports.create = module.exports.custom.createError },{"./custom":166}],168:[function(require,module,exports){ /*! * prr * (c) 2013 Rod Vagg * https://github.com/rvagg/prr * License: MIT */ (function (name, context, definition) { if (typeof module != 'undefined' && module.exports) module.exports = definition() else context[name] = definition() })('prr', this, function() { var setProperty = typeof Object.defineProperty == 'function' ? function (obj, key, options) { Object.defineProperty(obj, key, options) return obj } : function (obj, key, options) { // < es5 obj[key] = options.value return obj } , makeOptions = function (value, options) { var oo = typeof options == 'object' , os = !oo && typeof options == 'string' , op = function (p) { return oo ? !!options[p] : os ? options.indexOf(p[0]) > -1 : false } return { enumerable : op('enumerable') , configurable : op('configurable') , writable : op('writable') , value : value } } , prr = function (obj, key, value, options) { var k options = makeOptions(value, options) if (typeof key == 'object') { for (k in key) { if (Object.hasOwnProperty.call(key, k)) { options.value = key[k] setProperty(obj, k, options) } } return obj } return setProperty(obj, key, options) } return prr }) },{}],169:[function(require,module,exports){ var camelize = require("camelize") var template = require("string-template") var extend = require("xtend/mutable") module.exports = TypedError function TypedError(args) { if (!args) { throw new Error("args is required"); } if (!args.type) { throw new Error("args.type is required"); } if (!args.message) { throw new Error("args.message is required"); } var message = args.message if (args.type && !args.name) { var errorName = camelize(args.type) + "Error" args.name = errorName[0].toUpperCase() + errorName.substr(1) } extend(createError, args); createError._name = args.name; return createError; function createError(opts) { var result = new Error() Object.defineProperty(result, "type", { value: result.type, enumerable: true, writable: true, configurable: true }) var options = extend({}, args, opts) extend(result, options) result.message = template(message, options) return result } } },{"camelize":148,"string-template":271,"xtend/mutable":331}],170:[function(require,module,exports){ 'use strict'; var OneVersionConstraint = require('individual/one-version'); var MY_VERSION = '7'; OneVersionConstraint('ev-store', MY_VERSION); var hashKey = '__EV_STORE_KEY@' + MY_VERSION; module.exports = EvStore; function EvStore(elem) { var hash = elem[hashKey]; if (!hash) { hash = elem[hashKey] = {}; } return hash; } },{"individual/one-version":203}],171:[function(require,module,exports){ var stream = require('stream') module.exports = function(url, opts) { if (!opts) opts = {} var es = new EventSource(url) var rs = new stream.Readable({objectMode:true}) var json = !!opts.json var decode = function (data) { try { if (json) return JSON.parse(data) return data } catch (err) { return undefined } } rs._read = function() {} es.onmessage = function(e) { rs.push(decode(e.data)) } es.onerror = function(err) { if (rs.listeners('error').length) rs.emit('error', err) } es.onopen = function () { rs.emit('open') } var destroyed = false rs.destroy = function() { if (destroyed) return destroyed = true es.close() rs.emit('close') } return rs } },{"stream":131}],172:[function(require,module,exports){ var isFunction = require('is-function') module.exports = forEach var toString = Object.prototype.toString var hasOwnProperty = Object.prototype.hasOwnProperty function forEach(list, iterator, context) { if (!isFunction(iterator)) { throw new TypeError('iterator must be a function') } if (arguments.length < 3) { context = this } if (toString.call(list) === '[object Array]') forEachArray(list, iterator, context) else if (typeof list === 'string') forEachString(list, iterator, context) else forEachObject(list, iterator, context) } function forEachArray(array, iterator, context) { for (var i = 0, len = array.length; i < len; i++) { if (hasOwnProperty.call(array, i)) { iterator.call(context, array[i], i, array) } } } function forEachString(string, iterator, context) { for (var i = 0, len = string.length; i < len; i++) { // no such thing as a sparse string. iterator.call(context, string.charAt(i), i, string) } } function forEachObject(object, iterator, context) { for (var k in object) { if (hasOwnProperty.call(object, k)) { iterator.call(context, object[k], k, object) } } } },{"is-function":205}],173:[function(require,module,exports){ (function (Buffer){ var crypto = require('crypto') var FramedHash = function (algo) { if (!(this instanceof FramedHash)) return new FramedHash(algo) this.hash = crypto.createHash(algo) } FramedHash.prototype.update = function (data) { this.hash.update((typeof data === 'string' ? Buffer.byteLength(data) : data.length) + '\n') this.hash.update(data) return this } FramedHash.prototype.digest = function (enc) { return this.hash.digest(enc) } module.exports = FramedHash }).call(this,require("buffer").Buffer) },{"buffer":45,"crypto":54}],174:[function(require,module,exports){ (function (process){ var Readable = require('readable-stream').Readable var inherits = require('inherits') module.exports = from2 from2.ctor = ctor from2.obj = obj var Proto = ctor() function toFunction(list) { list = list.slice() return function (_, cb) { var err = null var item = list.length ? list.shift() : null if (item instanceof Error) { err = item item = null } cb(err, item) } } function from2(opts, read) { if (typeof opts !== 'object' || Array.isArray(opts)) { read = opts opts = {} } var rs = new Proto(opts) rs._from = Array.isArray(read) ? toFunction(read) : read return rs } function ctor(opts, read) { if (typeof opts === 'function') { read = opts opts = {} } opts = defaults(opts) inherits(Class, Readable) function Class(override) { if (!(this instanceof Class)) return new Class(override) this._reading = false this._callback = check this.destroyed = false Readable.call(this, override || opts) var self = this var hwm = this._readableState.highWaterMark function check(err, data) { if (self.destroyed) return if (err) return self.destroy(err) if (data === null) return self.push(null) self._reading = false if (self.push(data)) self._read(hwm) } } Class.prototype._from = read Class.prototype._read = function(size) { if (this._reading || this.destroyed) return this._reading = true this._from(size, this._callback) } Class.prototype.destroy = function(err) { if (this.destroyed) return this.destroyed = true var self = this process.nextTick(function() { if (err) self.emit('error', err) self.emit('close') }) } return Class } function obj(opts, read) { if (typeof opts === 'function' || Array.isArray(opts)) { read = opts opts = {} } opts = defaults(opts) opts.objectMode = true opts.highWaterMark = 16 return from2(opts, read) } function defaults(opts) { opts = opts || {} return opts } }).call(this,require('_process')) },{"_process":104,"inherits":204,"readable-stream":180}],175:[function(require,module,exports){ arguments[4][113][0].apply(exports,arguments) },{"./_stream_readable":177,"./_stream_writable":179,"core-util-is":150,"dup":113,"inherits":204,"process-nextick-args":243}],176:[function(require,module,exports){ arguments[4][114][0].apply(exports,arguments) },{"./_stream_transform":178,"core-util-is":150,"dup":114,"inherits":204}],177:[function(require,module,exports){ (function (process){ 'use strict'; module.exports = Readable; /**/ var processNextTick = require('process-nextick-args'); /**/ /**/ var isArray = require('isarray'); /**/ /**/ var Buffer = require('buffer').Buffer; /**/ Readable.ReadableState = ReadableState; var EE = require('events'); /**/ var EElistenerCount = function(emitter, type) { return emitter.listeners(type).length; }; /**/ /**/ var Stream; (function (){try{ Stream = require('st' + 'ream'); }catch(_){}finally{ if (!Stream) Stream = require('events').EventEmitter; }}()) /**/ var Buffer = require('buffer').Buffer; /**/ var util = require('core-util-is'); util.inherits = require('inherits'); /**/ /**/ var debugUtil = require('util'); var debug; if (debugUtil && debugUtil.debuglog) { debug = debugUtil.debuglog('stream'); } else { debug = function () {}; } /**/ var StringDecoder; util.inherits(Readable, Stream); var Duplex; function ReadableState(options, stream) { Duplex = Duplex || require('./_stream_duplex'); options = options || {}; // object stream flag. Used to make read(n) ignore n and to // make all the buffer merging and length checks go away this.objectMode = !!options.objectMode; if (stream instanceof Duplex) this.objectMode = this.objectMode || !!options.readableObjectMode; // the point at which it stops calling _read() to fill the buffer // Note: 0 is a valid value, means "don't call _read preemptively ever" var hwm = options.highWaterMark; var defaultHwm = this.objectMode ? 16 : 16 * 1024; this.highWaterMark = (hwm || hwm === 0) ? hwm : defaultHwm; // cast to ints. this.highWaterMark = ~~this.highWaterMark; this.buffer = []; this.length = 0; this.pipes = null; this.pipesCount = 0; this.flowing = null; this.ended = false; this.endEmitted = false; this.reading = false; // a flag to be able to tell if the onwrite cb is called immediately, // or on a later tick. We set this to true at first, because any // actions that shouldn't happen until "later" should generally also // not happen before the first write call. this.sync = true; // whenever we return null, then we set a flag to say // that we're awaiting a 'readable' event emission. this.needReadable = false; this.emittedReadable = false; this.readableListening = false; // Crypto is kind of old and crusty. Historically, its default string // encoding is 'binary' so we have to make this configurable. // Everything else in the universe uses 'utf8', though. this.defaultEncoding = options.defaultEncoding || 'utf8'; // when piping, we only care about 'readable' events that happen // after read()ing all the bytes and not getting any pushback. this.ranOut = false; // the number of writers that are awaiting a drain event in .pipe()s this.awaitDrain = 0; // if true, a maybeReadMore has been scheduled this.readingMore = false; this.decoder = null; this.encoding = null; if (options.encoding) { if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder; this.decoder = new StringDecoder(options.encoding); this.encoding = options.encoding; } } var Duplex; function Readable(options) { Duplex = Duplex || require('./_stream_duplex'); if (!(this instanceof Readable)) return new Readable(options); this._readableState = new ReadableState(options, this); // legacy this.readable = true; if (options && typeof options.read === 'function') this._read = options.read; Stream.call(this); } // Manually shove something into the read() buffer. // This returns true if the highWaterMark has not been hit yet, // similar to how Writable.write() returns true if you should // write() some more. Readable.prototype.push = function(chunk, encoding) { var state = this._readableState; if (!state.objectMode && typeof chunk === 'string') { encoding = encoding || state.defaultEncoding; if (encoding !== state.encoding) { chunk = new Buffer(chunk, encoding); encoding = ''; } } return readableAddChunk(this, state, chunk, encoding, false); }; // Unshift should *always* be something directly out of read() Readable.prototype.unshift = function(chunk) { var state = this._readableState; return readableAddChunk(this, state, chunk, '', true); }; Readable.prototype.isPaused = function() { return this._readableState.flowing === false; }; function readableAddChunk(stream, state, chunk, encoding, addToFront) { var er = chunkInvalid(state, chunk); if (er) { stream.emit('error', er); } else if (chunk === null) { state.reading = false; onEofChunk(stream, state); } else if (state.objectMode || chunk && chunk.length > 0) { if (state.ended && !addToFront) { var e = new Error('stream.push() after EOF'); stream.emit('error', e); } else if (state.endEmitted && addToFront) { var e = new Error('stream.unshift() after end event'); stream.emit('error', e); } else { if (state.decoder && !addToFront && !encoding) chunk = state.decoder.write(chunk); if (!addToFront) state.reading = false; // if we want the data now, just emit it. if (state.flowing && state.length === 0 && !state.sync) { stream.emit('data', chunk); stream.read(0); } else { // update the buffer info. state.length += state.objectMode ? 1 : chunk.length; if (addToFront) state.buffer.unshift(chunk); else state.buffer.push(chunk); if (state.needReadable) emitReadable(stream); } maybeReadMore(stream, state); } } else if (!addToFront) { state.reading = false; } return needMoreData(state); } // if it's past the high water mark, we can push in some more. // Also, if we have no data yet, we can stand some // more bytes. This is to work around cases where hwm=0, // such as the repl. Also, if the push() triggered a // readable event, and the user called read(largeNumber) such that // needReadable was set, then we ought to push more, so that another // 'readable' event will be triggered. function needMoreData(state) { return !state.ended && (state.needReadable || state.length < state.highWaterMark || state.length === 0); } // backwards compatibility. Readable.prototype.setEncoding = function(enc) { if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder; this._readableState.decoder = new StringDecoder(enc); this._readableState.encoding = enc; return this; }; // Don't raise the hwm > 8MB var MAX_HWM = 0x800000; function computeNewHighWaterMark(n) { if (n >= MAX_HWM) { n = MAX_HWM; } else { // Get the next highest power of 2 n--; n |= n >>> 1; n |= n >>> 2; n |= n >>> 4; n |= n >>> 8; n |= n >>> 16; n++; } return n; } function howMuchToRead(n, state) { if (state.length === 0 && state.ended) return 0; if (state.objectMode) return n === 0 ? 0 : 1; if (n === null || isNaN(n)) { // only flow one buffer at a time if (state.flowing && state.buffer.length) return state.buffer[0].length; else return state.length; } if (n <= 0)="" return="" 0;="" if="" we're="" asking="" for="" more="" than="" the="" target="" buffer="" level,="" then="" raise="" water="" mark.="" bump="" up="" to="" next="" highest="" power="" of="" 2,="" prevent="" increasing="" it="" excessively="" in="" tiny="" amounts.="" (n=""> state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n); // don't have that much. return null, unless we've ended. if (n > state.length) { if (!state.ended) { state.needReadable = true; return 0; } else { return state.length; } } return n; } // you can override either this method, or the async _read(n) below. Readable.prototype.read = function(n) { debug('read', n); var state = this._readableState; var nOrig = n; if (typeof n !== 'number' || n > 0) state.emittedReadable = false; // if we're doing read(0) to trigger a readable event, but we // already have a bunch of data in the buffer, then just trigger // the 'readable' event and move on. if (n === 0 && state.needReadable && (state.length >= state.highWaterMark || state.ended)) { debug('read: emitReadable', state.length, state.ended); if (state.length === 0 && state.ended) endReadable(this); else emitReadable(this); return null; } n = howMuchToRead(n, state); // if we've ended, and we're now clear, then finish it up. if (n === 0 && state.ended) { if (state.length === 0) endReadable(this); return null; } // All the actual chunk generation logic needs to be // *below* the call to _read. The reason is that in certain // synthetic stream cases, such as passthrough streams, _read // may be a completely synchronous operation which may change // the state of the read buffer, providing enough data when // before there was *not* enough. // // So, the steps are: // 1. Figure out what the state of things will be after we do // a read from the buffer. // // 2. If that resulting state will trigger a _read, then call _read. // Note that this may be asynchronous, or synchronous. Yes, it is // deeply ugly to write APIs this way, but that still doesn't mean // that the Readable class should behave improperly, as streams are // designed to be sync/async agnostic. // Take note if the _read call is sync or async (ie, if the read call // has returned yet), so that we know whether or not it's safe to emit // 'readable' etc. // // 3. Actually pull the requested chunks out of the buffer and return. // if we need a readable event, then we need to do some reading. var doRead = state.needReadable; debug('need readable', doRead); // if we currently have less than the highWaterMark, then also read some if (state.length === 0 || state.length - n < state.highWaterMark) { doRead = true; debug('length less than watermark', doRead); } // however, if we've ended, then there's no point, and if we're already // reading, then it's unnecessary. if (state.ended || state.reading) { doRead = false; debug('reading or ended', doRead); } if (doRead) { debug('do read'); state.reading = true; state.sync = true; // if the length is currently zero, then we *need* a readable event. if (state.length === 0) state.needReadable = true; // call internal read method this._read(state.highWaterMark); state.sync = false; } // If _read pushed data synchronously, then `reading` will be false, // and we need to re-evaluate how much data we can return to the user. if (doRead && !state.reading) n = howMuchToRead(nOrig, state); var ret; if (n > 0) ret = fromList(n, state); else ret = null; if (ret === null) { state.needReadable = true; n = 0; } state.length -= n; // If we have nothing in the buffer, then we want to know // as soon as we *do* get something into the buffer. if (state.length === 0 && !state.ended) state.needReadable = true; // If we tried to read() past the EOF, then emit end on the next tick. if (nOrig !== n && state.ended && state.length === 0) endReadable(this); if (ret !== null) this.emit('data', ret); return ret; }; function chunkInvalid(state, chunk) { var er = null; if (!(Buffer.isBuffer(chunk)) && typeof chunk !== 'string' && chunk !== null && chunk !== undefined && !state.objectMode) { er = new TypeError('Invalid non-string/buffer chunk'); } return er; } function onEofChunk(stream, state) { if (state.ended) return; if (state.decoder) { var chunk = state.decoder.end(); if (chunk && chunk.length) { state.buffer.push(chunk); state.length += state.objectMode ? 1 : chunk.length; } } state.ended = true; // emit 'readable' now to make sure it gets picked up. emitReadable(stream); } // Don't emit readable right away in sync mode, because this can trigger // another read() call => stack overflow. This way, it might trigger // a nextTick recursion warning, but that's not so bad. function emitReadable(stream) { var state = stream._readableState; state.needReadable = false; if (!state.emittedReadable) { debug('emitReadable', state.flowing); state.emittedReadable = true; if (state.sync) processNextTick(emitReadable_, stream); else emitReadable_(stream); } } function emitReadable_(stream) { debug('emit readable'); stream.emit('readable'); flow(stream); } // at this point, the user has presumably seen the 'readable' event, // and called read() to consume some data. that may have triggered // in turn another _read(n) call, in which case reading = true if // it's in progress. // However, if we're not ended, or reading, and the length < hwm, // then go ahead and try to read some more preemptively. function maybeReadMore(stream, state) { if (!state.readingMore) { state.readingMore = true; processNextTick(maybeReadMore_, stream, state); } } function maybeReadMore_(stream, state) { var len = state.length; while (!state.reading && !state.flowing && !state.ended && state.length < state.highWaterMark) { debug('maybeReadMore read 0'); stream.read(0); if (len === state.length) // didn't get any data, stop spinning. break; else len = state.length; } state.readingMore = false; } // abstract method. to be overridden in specific implementation classes. // call cb(er, data) where data is <= 0="" 1="" n="" in="" length.="" for="" virtual="" (non-string,="" non-buffer)="" streams,="" "length"="" is="" somewhat="" arbitrary,="" and="" perhaps="" not="" very="" meaningful.="" readable.prototype._read="function(n)" {="" this.emit('error',="" new="" error('not="" implemented'));="" };="" readable.prototype.pipe="function(dest," pipeopts)="" var="" src="this;" state="this._readableState;" switch="" (state.pipescount)="" case="" 0:="" state.pipes="dest;" break;="" 1:="" dest];="" default:="" state.pipes.push(dest);="" }="" state.pipescount="" +="1;" debug('pipe="" count="%d" opts="%j'," state.pipescount,="" pipeopts);="" doend="(!pipeOpts" ||="" pipeopts.end="" !="=" false)="" &&="" dest="" process.stdout="" process.stderr;="" endfn="doEnd" ?="" onend="" :="" cleanup;="" if="" (state.endemitted)="" processnexttick(endfn);="" else="" src.once('end',="" endfn);="" dest.on('unpipe',="" onunpipe);="" function="" onunpipe(readable)="" debug('onunpipe');="" (readable="==" src)="" cleanup();="" onend()="" debug('onend');="" dest.end();="" when="" the="" drains,="" it="" reduces="" awaitdrain="" counter="" on="" source.="" this="" would="" be="" more="" elegant="" with="" a="" .once()="" handler="" flow(),="" but="" adding="" removing="" repeatedly="" too="" slow.="" ondrain="pipeOnDrain(src);" dest.on('drain',="" ondrain);="" cleanedup="false;" cleanup()="" debug('cleanup');="" cleanup="" event="" handlers="" once="" pipe="" broken="" dest.removelistener('close',="" onclose);="" dest.removelistener('finish',="" onfinish);="" dest.removelistener('drain',="" dest.removelistener('error',="" onerror);="" dest.removelistener('unpipe',="" src.removelistener('end',="" onend);="" cleanup);="" src.removelistener('data',="" ondata);="" reader="" waiting="" drain="" from="" specific="" writer,="" then="" cause="" to="" never="" start="" flowing="" again.="" so,="" awaiting="" drain,="" we="" just="" call="" now.="" don't="" know,="" assume="" that="" are="" one.="" (state.awaitdrain="" (!dest._writablestate="" dest._writablestate.needdrain))="" ondrain();="" src.on('data',="" ondata(chunk)="" debug('ondata');="" ret="dest.write(chunk);" (false="==" ret)="" user="" unpiped="" during="" `dest.write()`,="" possible="" get="" stuck="" permanently="" paused="" write="" also="" returned="" false.="" (state.pipescount="==" state.pipes[0]="==" src.listenercount('data')="==" !cleanedup)="" debug('false="" response,="" pause',="" src._readablestate.awaitdrain);="" src._readablestate.awaitdrain++;="" src.pause();="" has="" an="" error,="" stop="" piping="" into="" it.="" however,="" suppress="" throwing="" behavior="" this.="" onerror(er)="" debug('onerror',="" er);="" unpipe();="" (eelistenercount(dest,="" 'error')="==" 0)="" dest.emit('error',="" brutally="" ugly="" hack="" make="" sure="" our="" error="" attached="" before="" any="" userland="" ones.="" do="" (!dest._events="" !dest._events.error)="" dest.on('error',="" (isarray(dest._events.error))="" dest._events.error.unshift(onerror);="" dest._events.error="[onerror," dest._events.error];="" both="" close="" finish="" should="" trigger="" unpipe,="" only="" once.="" onclose()="" dest.once('close',="" onfinish()="" debug('onfinish');="" dest.once('finish',="" unpipe()="" debug('unpipe');="" src.unpipe(dest);="" tell="" it's="" being="" piped="" dest.emit('pipe',="" src);="" flow="" hasn't="" been="" started="" already.="" (!state.flowing)="" resume');="" src.resume();="" return="" dest;="" pipeondrain(src)="" function()="" debug('pipeondrain',="" state.awaitdrain);="" (state.awaitdrain)="" state.awaitdrain--;="" eelistenercount(src,="" 'data'))="" state.flowing="true;" flow(src);="" readable.prototype.unpipe="function(dest)" we're="" anywhere,="" nothing.="" this;="" one="" destination.="" most="" common="" case.="" 1)="" passed="" one,="" right="" (dest="" state.pipes)="" (!dest)="" got="" match.="" (dest)="" dest.emit('unpipe',="" this);="" slow="" multiple destinations.="" remove="" all.="" dests="state.pipes;" len="state.pipesCount;" (var="" i="0;" <="" len;="" i++)="" dests[i].emit('unpipe',="" try="" find="" dest);="" (i="==" -1)="" state.pipes.splice(i,="" 1);="" -="1;" set="" up="" data="" events="" they="" asked="" ensure="" readable="" listeners="" eventually="" something="" readable.prototype.on="function(ev," fn)="" res="Stream.prototype.on.call(this," ev,="" fn);="" listening="" data,="" explicitly="" paused,="" resume="" of="" next="" tick.="" (ev="==" 'data'="" false="" this._readablestate.flowing)="" this.resume();="" 'readable'="" this.readable)="" (!state.readablelistening)="" state.readablelistening="true;" state.emittedreadable="false;" state.needreadable="true;" (!state.reading)="" processnexttick(nreadingnexttick,="" (state.length)="" emitreadable(this,="" state);="" res;="" readable.prototype.addlistener="Readable.prototype.on;" nreadingnexttick(self)="" debug('readable="" nexttick="" read="" 0');="" self.read(0);="" pause()="" resume()="" remnants="" legacy="" stream="" api="" uses="" them,="" old="" mode.="" readable.prototype.resume="function()" debug('resume');="" resume(this,="" resume(stream,="" state)="" (!state.resumescheduled)="" state.resumescheduled="true;" processnexttick(resume_,="" stream,="" resume_(stream,="" debug('resume="" stream.read(0);="" stream.emit('resume');="" flow(stream);="" (state.flowing="" !state.reading)="" readable.prototype.pause="function()" debug('call="" pause="" this._readablestate.flowing);="" debug('pause');="" this._readablestate.flowing="false;" this.emit('pause');="" flow(stream)="" debug('flow',="" state.flowing);="" (state.flowing)="" chunk="stream.read();" while="" (null="" wrap="" old-style="" as="" async *not*="" part="" interface.="" unfortunate="" mess="" history.="" readable.prototype.wrap="function(stream)" self="this;" stream.on('end',="" debug('wrapped="" end');="" (state.decoder="" !state.ended)="" (chunk="" chunk.length)="" self.push(chunk);="" self.push(null);="" });="" stream.on('data',="" function(chunk)="" data');="" (state.decoder)="" skip="" over="" falsy="" values="" objectmode="" (state.objectmode="" null="" undefined))="" return;="" (!state.objectmode="" (!chunk="" !chunk.length))="" (!ret)="" stream.pause();="" proxy="" all="" other="" methods.="" important="" wrapping="" filters="" duplexes.="" stream)="" (this[i]="==" undefined="" typeof="" stream[i]="==" 'function')="" this[i]="function(method)" stream[method].apply(stream,="" arguments);="" }(i);="" certain="" events.="" 'close',="" 'destroy',="" 'pause',="" 'resume'];="" foreach(events,="" function(ev)="" stream.on(ev,="" self.emit.bind(self,="" ev));="" consume="" some="" bytes,="" simply="" unpause="" underlying="" stream.="" self._read="function(n)" _read',="" n);="" (paused)="" stream.resume();="" self;="" exposed="" testing="" purposes="" only.="" readable._fromlist="fromList;" pluck="" off="" bytes="" array="" buffers.="" length="" combined="" lengths="" buffers="" list.="" fromlist(n,="" list="state.buffer;" stringmode="!!state.decoder;" ret;="" nothing="" list,="" definitely="" empty.="" (list.length="==" null;="" (length="==" (objectmode)="" (!n="">= length) { // read it all, truncate the array. if (stringMode) ret = list.join(''); else if (list.length === 1) ret = list[0]; else ret = Buffer.concat(list, length); list.length = 0; } else { // read just some of it. if (n < list[0].length) { // just take a part of the first list item. // slice is the same for buffers and strings. var buf = list[0]; ret = buf.slice(0, n); list[0] = buf.slice(n); } else if (n === list[0].length) { // first list is a perfect match ret = list.shift(); } else { // complex case. // we have enough to cover it, but it spans past the first buffer. if (stringMode) ret = ''; else ret = new Buffer(n); var c = 0; for (var i = 0, l = list.length; i < l && c < n; i++) { var buf = list[0]; var cpy = Math.min(n - c, buf.length); if (stringMode) ret += buf.slice(0, cpy); else buf.copy(ret, c, 0, cpy); if (cpy < buf.length) list[0] = buf.slice(cpy); else list.shift(); c += cpy; } } } return ret; } function endReadable(stream) { var state = stream._readableState; // If we get here before consuming all the bytes, then that is a // bug in node. Should never happen. if (state.length > 0) throw new Error('endReadable called on non-empty stream'); if (!state.endEmitted) { state.ended = true; processNextTick(endReadableNT, state, stream); } } function endReadableNT(state, stream) { // Check that we didn't get one last unshift. if (!state.endEmitted && state.length === 0) { state.endEmitted = true; stream.readable = false; stream.emit('end'); } } function forEach (xs, f) { for (var i = 0, l = xs.length; i < l; i++) { f(xs[i], i); } } function indexOf (xs, x) { for (var i = 0, l = xs.length; i < l; i++) { if (xs[i] === x) return i; } return -1; } }).call(this,require('_process')) },{"./_stream_duplex":175,"_process":104,"buffer":45,"core-util-is":150,"events":82,"inherits":204,"isarray":209,"process-nextick-args":243,"string_decoder/":272,"util":19}],178:[function(require,module,exports){ arguments[4][116][0].apply(exports,arguments) },{"./_stream_duplex":175,"core-util-is":150,"dup":116,"inherits":204}],179:[function(require,module,exports){ arguments[4][117][0].apply(exports,arguments) },{"./_stream_duplex":175,"buffer":45,"core-util-is":150,"dup":117,"events":82,"inherits":204,"process-nextick-args":243,"util-deprecate":287}],180:[function(require,module,exports){ arguments[4][119][0].apply(exports,arguments) },{"./lib/_stream_duplex.js":175,"./lib/_stream_passthrough.js":176,"./lib/_stream_readable.js":177,"./lib/_stream_transform.js":178,"./lib/_stream_writable.js":179,"dup":119}],181:[function(require,module,exports){ "use strict" module.exports = createRBTree var RED = 0 var BLACK = 1 function RBNode(color, key, value, left, right, count) { this._color = color this.key = key this.value = value this.left = left this.right = right this._count = count } function cloneNode(node) { return new RBNode(node._color, node.key, node.value, node.left, node.right, node._count) } function repaint(color, node) { return new RBNode(color, node.key, node.value, node.left, node.right, node._count) } function recount(node) { node._count = 1 + (node.left ? node.left._count : 0) + (node.right ? node.right._count : 0) } function RedBlackTree(compare, root) { this._compare = compare this.root = root } var proto = RedBlackTree.prototype Object.defineProperty(proto, "keys", { get: function() { var result = [] this.forEach(function(k,v) { result.push(k) }) return result } }) Object.defineProperty(proto, "values", { get: function() { var result = [] this.forEach(function(k,v) { result.push(v) }) return result } }) //Returns the number of nodes in the tree Object.defineProperty(proto, "length", { get: function() { if(this.root) { return this.root._count } return 0 } }) //Insert a new item into the tree proto.insert = function(key, value) { var cmp = this._compare //Find point to insert new node at var n = this.root var n_stack = [] var d_stack = [] while(n) { var d = cmp(key, n.key) n_stack.push(n) d_stack.push(d) if(d <= 0)="" {="" n="n.left" }="" else="" rebuild="" path="" to="" leaf="" node="" n_stack.push(new="" rbnode(red,="" key,="" value,="" null,="" 1))="" for(var="" s="n_stack.length-2;">=0; --s) { var n = n_stack[s] if(d_stack[s] <= 0)="" {="" n_stack[s]="new" rbnode(n._color,="" n.key,="" n.value,="" n_stack[s+1],="" n.right,="" n._count+1)="" }="" else="" n.left,="" rebalance="" tree="" using="" rotations="" console.log("start="" insert",="" key,="" d_stack)="" for(var="" s="n_stack.length-1;">1; --s) { var p = n_stack[s-1] var n = n_stack[s] if(p._color === BLACK || n._color === BLACK) { break } var pp = n_stack[s-2] if(pp.left === p) { if(p.left === n) { var y = pp.right if(y && y._color === RED) { //console.log("LLr") p._color = BLACK pp.right = repaint(BLACK, y) pp._color = RED s -= 1 } else { //console.log("LLb") pp._color = RED pp.left = p.right p._color = BLACK p.right = pp n_stack[s-2] = p n_stack[s-1] = n recount(pp) recount(p) if(s >= 3) { var ppp = n_stack[s-3] if(ppp.left === pp) { ppp.left = p } else { ppp.right = p } } break } } else { var y = pp.right if(y && y._color === RED) { //console.log("LRr") p._color = BLACK pp.right = repaint(BLACK, y) pp._color = RED s -= 1 } else { //console.log("LRb") p.right = n.left pp._color = RED pp.left = n.right n._color = BLACK n.left = p n.right = pp n_stack[s-2] = n n_stack[s-1] = p recount(pp) recount(p) recount(n) if(s >= 3) { var ppp = n_stack[s-3] if(ppp.left === pp) { ppp.left = n } else { ppp.right = n } } break } } } else { if(p.right === n) { var y = pp.left if(y && y._color === RED) { //console.log("RRr", y.key) p._color = BLACK pp.left = repaint(BLACK, y) pp._color = RED s -= 1 } else { //console.log("RRb") pp._color = RED pp.right = p.left p._color = BLACK p.left = pp n_stack[s-2] = p n_stack[s-1] = n recount(pp) recount(p) if(s >= 3) { var ppp = n_stack[s-3] if(ppp.right === pp) { ppp.right = p } else { ppp.left = p } } break } } else { var y = pp.left if(y && y._color === RED) { //console.log("RLr") p._color = BLACK pp.left = repaint(BLACK, y) pp._color = RED s -= 1 } else { //console.log("RLb") p.left = n.right pp._color = RED pp.right = n.left n._color = BLACK n.right = p n.left = pp n_stack[s-2] = n n_stack[s-1] = p recount(pp) recount(p) recount(n) if(s >= 3) { var ppp = n_stack[s-3] if(ppp.right === pp) { ppp.right = n } else { ppp.left = n } } break } } } } //Return new tree n_stack[0]._color = BLACK return new RedBlackTree(cmp, n_stack[0]) } //Visit all nodes inorder function doVisitFull(visit, node) { if(node.left) { var v = doVisitFull(visit, node.left) if(v) { return v } } var v = visit(node.key, node.value) if(v) { return v } if(node.right) { return doVisitFull(visit, node.right) } } //Visit half nodes in order function doVisitHalf(lo, compare, visit, node) { var l = compare(lo, node.key) if(l <= 0)="" {="" if(node.left)="" var="" v="doVisitHalf(lo," compare,="" visit,="" node.left)="" if(v)="" return="" }="" node.value)="" if(node.right)="" dovisithalf(lo,="" node.right)="" visit="" all="" nodes="" within="" a="" range="" function="" dovisit(lo,="" hi,="" node)="" l="compare(lo," node.key)="" h="compare(hi," if(l="" <="0)" if(h=""> 0) { v = visit(node.key, node.value) if(v) { return v } } } if(h > 0 && node.right) { return doVisit(lo, hi, compare, visit, node.right) } } proto.forEach = function rbTreeForEach(visit, lo, hi) { if(!this.root) { return } switch(arguments.length) { case 1: return doVisitFull(visit, this.root) break case 2: return doVisitHalf(lo, this._compare, visit, this.root) break case 3: if(this._compare(lo, hi) >= 0) { return } return doVisit(lo, hi, this._compare, visit, this.root) break } } //First item in list Object.defineProperty(proto, "begin", { get: function() { var stack = [] var n = this.root while(n) { stack.push(n) n = n.left } return new RedBlackTreeIterator(this, stack) } }) //Last item in list Object.defineProperty(proto, "end", { get: function() { var stack = [] var n = this.root while(n) { stack.push(n) n = n.right } return new RedBlackTreeIterator(this, stack) } }) //Find the ith item in the tree proto.at = function(idx) { if(idx < 0) { return new RedBlackTreeIterator(this, []) } var n = this.root var stack = [] while(true) { stack.push(n) if(n.left) { if(idx < n.left._count) { n = n.left continue } idx -= n.left._count } if(!idx) { return new RedBlackTreeIterator(this, stack) } idx -= 1 if(n.right) { if(idx >= n.right._count) { break } n = n.right } else { break } } return new RedBlackTreeIterator(this, []) } proto.ge = function(key) { var cmp = this._compare var n = this.root var stack = [] var last_ptr = 0 while(n) { var d = cmp(key, n.key) stack.push(n) if(d <= 0)="" {="" last_ptr="stack.length" }="" if(d="" <="0)" n="n.left" else="" stack.length="last_ptr" return="" new="" redblacktreeiterator(this,="" stack)="" proto.gt="function(key)" var="" cmp="this._compare" stack="[]" while(n)="" d="cmp(key," n.key)="" stack.push(n)="" proto.lt="function(key)"> 0) { last_ptr = stack.length } if(d <= 0)="" {="" n="n.left" }="" else="" stack.length="last_ptr" return="" new="" redblacktreeiterator(this,="" stack)="" proto.le="function(key)" var="" cmp="this._compare" stack="[]" last_ptr="0" while(n)="" d="cmp(key," n.key)="" stack.push(n)="" if(d="">= 0) { last_ptr = stack.length } if(d < 0) { n = n.left } else { n = n.right } } stack.length = last_ptr return new RedBlackTreeIterator(this, stack) } //Finds the item with key if it exists proto.find = function(key) { var cmp = this._compare var n = this.root var stack = [] while(n) { var d = cmp(key, n.key) stack.push(n) if(d === 0) { return new RedBlackTreeIterator(this, stack) } if(d <= 0)="" {="" n="n.left" }="" else="" return="" new="" redblacktreeiterator(this,="" [])="" removes="" item="" with="" key="" from="" tree="" proto.remove="function(key)" var="" iter="this.find(key)" if(iter)="" iter.remove()="" this="" returns="" the="" at="" `key`="" proto.get="function(key)" cmp="this._compare" while(n)="" d="cmp(key," n.key)="" if(d="==" n.value="" <="0)" iterator="" for="" red="" black="" function="" redblacktreeiterator(tree,="" stack)="" this.tree="tree" this._stack="stack" iproto="RedBlackTreeIterator.prototype" test="" if="" is="" valid="" object.defineproperty(iproto,="" "valid",="" get:="" function()="" this._stack.length=""> 0 } }) //Node of the iterator Object.defineProperty(iproto, "node", { get: function() { if(this._stack.length > 0) { return this._stack[this._stack.length-1] } return null }, enumerable: true }) //Makes a copy of an iterator iproto.clone = function() { return new RedBlackTreeIterator(this.tree, this._stack.slice()) } //Swaps two nodes function swapNode(n, v) { n.key = v.key n.value = v.value n.left = v.left n.right = v.right n._color = v._color n._count = v._count } //Fix up a double black node in a tree function fixDoubleBlack(stack) { var n, p, s, z for(var i=stack.length-1; i>=0; --i) { n = stack[i] if(i === 0) { n._color = BLACK return } //console.log("visit node:", n.key, i, stack[i].key, stack[i-1].key) p = stack[i-1] if(p.left === n) { //console.log("left child") s = p.right if(s.right && s.right._color === RED) { //console.log("case 1: right sibling child red") s = p.right = cloneNode(s) z = s.right = cloneNode(s.right) p.right = s.left s.left = p s.right = z s._color = p._color n._color = BLACK p._color = BLACK z._color = BLACK recount(p) recount(s) if(i > 1) { var pp = stack[i-2] if(pp.left === p) { pp.left = s } else { pp.right = s } } stack[i-1] = s return } else if(s.left && s.left._color === RED) { //console.log("case 1: left sibling child red") s = p.right = cloneNode(s) z = s.left = cloneNode(s.left) p.right = z.left s.left = z.right z.left = p z.right = s z._color = p._color p._color = BLACK s._color = BLACK n._color = BLACK recount(p) recount(s) recount(z) if(i > 1) { var pp = stack[i-2] if(pp.left === p) { pp.left = z } else { pp.right = z } } stack[i-1] = z return } if(s._color === BLACK) { if(p._color === RED) { //console.log("case 2: black sibling, red parent", p.right.value) p._color = BLACK p.right = repaint(RED, s) return } else { //console.log("case 2: black sibling, black parent", p.right.value) p.right = repaint(RED, s) continue } } else { //console.log("case 3: red sibling") s = cloneNode(s) p.right = s.left s.left = p s._color = p._color p._color = RED recount(p) recount(s) if(i > 1) { var pp = stack[i-2] if(pp.left === p) { pp.left = s } else { pp.right = s } } stack[i-1] = s stack[i] = p if(i+1 < stack.length) { stack[i+1] = n } else { stack.push(n) } i = i+2 } } else { //console.log("right child") s = p.left if(s.left && s.left._color === RED) { //console.log("case 1: left sibling child red", p.value, p._color) s = p.left = cloneNode(s) z = s.left = cloneNode(s.left) p.left = s.right s.right = p s.left = z s._color = p._color n._color = BLACK p._color = BLACK z._color = BLACK recount(p) recount(s) if(i > 1) { var pp = stack[i-2] if(pp.right === p) { pp.right = s } else { pp.left = s } } stack[i-1] = s return } else if(s.right && s.right._color === RED) { //console.log("case 1: right sibling child red") s = p.left = cloneNode(s) z = s.right = cloneNode(s.right) p.left = z.right s.right = z.left z.right = p z.left = s z._color = p._color p._color = BLACK s._color = BLACK n._color = BLACK recount(p) recount(s) recount(z) if(i > 1) { var pp = stack[i-2] if(pp.right === p) { pp.right = z } else { pp.left = z } } stack[i-1] = z return } if(s._color === BLACK) { if(p._color === RED) { //console.log("case 2: black sibling, red parent") p._color = BLACK p.left = repaint(RED, s) return } else { //console.log("case 2: black sibling, black parent") p.left = repaint(RED, s) continue } } else { //console.log("case 3: red sibling") s = cloneNode(s) p.left = s.right s.right = p s._color = p._color p._color = RED recount(p) recount(s) if(i > 1) { var pp = stack[i-2] if(pp.right === p) { pp.right = s } else { pp.left = s } } stack[i-1] = s stack[i] = p if(i+1 < stack.length) { stack[i+1] = n } else { stack.push(n) } i = i+2 } } } } //Removes item at iterator from tree iproto.remove = function() { var stack = this._stack if(stack.length === 0) { return this.tree } //First copy path to node var cstack = new Array(stack.length) var n = stack[stack.length-1] cstack[cstack.length-1] = new RBNode(n._color, n.key, n.value, n.left, n.right, n._count) for(var i=stack.length-2; i>=0; --i) { var n = stack[i] if(n.left === stack[i+1]) { cstack[i] = new RBNode(n._color, n.key, n.value, cstack[i+1], n.right, n._count) } else { cstack[i] = new RBNode(n._color, n.key, n.value, n.left, cstack[i+1], n._count) } } //Get node n = cstack[cstack.length-1] //console.log("start remove: ", n.value) //If not leaf, then swap with previous node if(n.left && n.right) { //console.log("moving to leaf") //First walk to previous leaf var split = cstack.length n = n.left while(n.right) { cstack.push(n) n = n.right } //Copy path to leaf var v = cstack[split-1] cstack.push(new RBNode(n._color, v.key, v.value, n.left, n.right, n._count)) cstack[split-1].key = n.key cstack[split-1].value = n.value //Fix up stack for(var i=cstack.length-2; i>=split; --i) { n = cstack[i] cstack[i] = new RBNode(n._color, n.key, n.value, n.left, cstack[i+1], n._count) } cstack[split-1].left = cstack[split] } //console.log("stack=", cstack.map(function(v) { return v.value })) //Remove leaf node n = cstack[cstack.length-1] if(n._color === RED) { //Easy case: removing red leaf //console.log("RED leaf") var p = cstack[cstack.length-2] if(p.left === n) { p.left = null } else if(p.right === n) { p.right = null } cstack.pop() for(var i=0; i 0) { return this._stack[this._stack.length-1].key } return }, enumerable: true }) //Returns value Object.defineProperty(iproto, "value", { get: function() { if(this._stack.length > 0) { return this._stack[this._stack.length-1].value } return }, enumerable: true }) //Returns the position of this iterator in the sorted list Object.defineProperty(iproto, "index", { get: function() { var idx = 0 var stack = this._stack if(stack.length === 0) { var r = this.tree.root if(r) { return r._count } return 0 } else if(stack[stack.length-1].left) { idx = stack[stack.length-1].left._count } for(var s=stack.length-2; s>=0; --s) { if(stack[s+1] === stack[s].right) { ++idx if(stack[s].left) { idx += stack[s].left._count } } } return idx }, enumerable: true }) //Advances iterator to next element in list iproto.next = function() { var stack = this._stack if(stack.length === 0) { return } var n = stack[stack.length-1] if(n.right) { n = n.right while(n) { stack.push(n) n = n.left } } else { stack.pop() while(stack.length > 0 && stack[stack.length-1].right === n) { n = stack[stack.length-1] stack.pop() } } } //Checks if iterator is at end of tree Object.defineProperty(iproto, "hasNext", { get: function() { var stack = this._stack if(stack.length === 0) { return false } if(stack[stack.length-1].right) { return true } for(var s=stack.length-1; s>0; --s) { if(stack[s-1].left === stack[s]) { return true } } return false } }) //Update value iproto.update = function(value) { var stack = this._stack if(stack.length === 0) { throw new Error("Can't update empty node!") } var cstack = new Array(stack.length) var n = stack[stack.length-1] cstack[cstack.length-1] = new RBNode(n._color, n.key, value, n.left, n.right, n._count) for(var i=stack.length-2; i>=0; --i) { n = stack[i] if(n.left === stack[i+1]) { cstack[i] = new RBNode(n._color, n.key, n.value, cstack[i+1], n.right, n._count) } else { cstack[i] = new RBNode(n._color, n.key, n.value, n.left, cstack[i+1], n._count) } } return new RedBlackTree(this.tree._compare, cstack[0]) } //Moves iterator backward one element iproto.prev = function() { var stack = this._stack if(stack.length === 0) { return } var n = stack[stack.length-1] if(n.left) { n = n.left while(n) { stack.push(n) n = n.right } } else { stack.pop() while(stack.length > 0 && stack[stack.length-1].left === n) { n = stack[stack.length-1] stack.pop() } } } //Checks if iterator is at start of tree Object.defineProperty(iproto, "hasPrev", { get: function() { var stack = this._stack if(stack.length === 0) { return false } if(stack[stack.length-1].left) { return true } for(var s=stack.length-1; s>0; --s) { if(stack[s-1].right === stack[s]) { return true } } return false } }) //Default comparison function function defaultCompare(a, b) { if(a < b) { return -1 } if(a > b) { return 1 } return 0 } //Build a tree function createRBTree(compare) { return new RedBlackTree(compare || defaultCompare, null) } },{}],182:[function(require,module,exports){ var util = require('util') var INDENT_START = /[\{\[]/ var INDENT_END = /[\}\]]/ module.exports = function() { var lines = [] var indent = 0 var push = function(str) { var spaces = '' while (spaces.length < indent*2) spaces += ' ' lines.push(spaces+str) } var line = function(fmt) { if (!fmt) return line if (INDENT_END.test(fmt.trim()[0]) && INDENT_START.test(fmt[fmt.length-1])) { indent-- push(util.format.apply(util, arguments)) indent++ return line } if (INDENT_START.test(fmt[fmt.length-1])) { push(util.format.apply(util, arguments)) indent++ return line } if (INDENT_END.test(fmt.trim()[0])) { indent-- push(util.format.apply(util, arguments)) return line } push(util.format.apply(util, arguments)) return line } line.toString = function() { return lines.join('\n') } line.toFunction = function(scope) { var src = 'return ('+line.toString()+')' var keys = Object.keys(scope || {}).map(function(key) { return key }) var vals = keys.map(function(key) { return scope[key] }) return Function.apply(null, keys.concat(src)).apply(null, vals) } if (arguments.length) line.apply(null, arguments) return line } },{"util":135}],183:[function(require,module,exports){ var isProperty = require('is-property') var gen = function(obj, prop) { return isProperty(prop) ? obj+'.'+prop : obj+'['+JSON.stringify(prop)+']' } gen.valid = isProperty gen.property = function (prop) { return isProperty(prop) ? prop : JSON.stringify(prop) } module.exports = gen },{"is-property":207}],184:[function(require,module,exports){ // originally pulled out of simple-peer module.exports = function getBrowserRTC () { if (typeof window === 'undefined') return null var wrtc = { RTCPeerConnection: window.mozRTCPeerConnection || window.RTCPeerConnection || window.webkitRTCPeerConnection, RTCSessionDescription: window.mozRTCSessionDescription || window.RTCSessionDescription || window.webkitRTCSessionDescription, RTCIceCandidate: window.mozRTCIceCandidate || window.RTCIceCandidate || window.webkitRTCIceCandidate } if (!wrtc.RTCPeerConnection) return null return wrtc } },{}],185:[function(require,module,exports){ (function (global){ var topLevel = typeof global !== 'undefined' ? global : typeof window !== 'undefined' ? window : {} var minDoc = require('min-document'); if (typeof document !== 'undefined') { module.exports = document; } else { var doccy = topLevel['__GLOBAL_DOCUMENT_CACHE@4']; if (!doccy) { doccy = topLevel['__GLOBAL_DOCUMENT_CACHE@4'] = minDoc; } module.exports = doccy; } }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) },{"min-document":19}],186:[function(require,module,exports){ (function (global){ if (typeof window !== "undefined") { module.exports = window; } else if (typeof global !== "undefined") { module.exports = global; } else if (typeof self !== "undefined"){ module.exports = self; } else { module.exports = {}; } }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) },{}],187:[function(require,module,exports){ var hat = module.exports = function (bits, base) { if (!base) base = 16; if (bits === undefined) bits = 128; if (bits <= 0)="" return="" '0';="" var="" digits="Math.log(Math.pow(2," bits))="" math.log(base);="" for="" (var="" i="2;" infinity;="" *="2)" {="" bits="" i))="" math.log(base)="" i;="" }="" rem="digits" -="" math.floor(digits);="" res="" ;="" <="" i++)="" x="Math.floor(Math.random()" base).tostring(base);="" +="" res;="" if="" (rem)="" b="Math.pow(base," rem);="" b).tostring(base);="" parsed="parseInt(res," base);="" (parsed="" !="=" infinity="" &&="">= Math.pow(2, bits)) { return hat(bits, base) } else return res; }; hat.rack = function (bits, base, expandBy) { var fn = function (data) { var iters = 0; do { if (iters ++ > 10) { if (expandBy) bits += expandBy; else throw new Error('too many ID collisions, use more bits') } var id = hat(bits, base); } while (Object.hasOwnProperty.call(hats, id)); hats[id] = data; return id; }; var hats = fn.hats = {}; fn.get = function (id) { return fn.hats[id]; }; fn.set = function (id, value) { fn.hats[id] = value; return fn; }; fn.bits = bits || 128; fn.base = base || 16; return fn; }; },{}],188:[function(require,module,exports){ (function (Buffer){ var eq = require('buffer-equals') var xtend = require('xtend') var isarray = require('isarray') var defined = require('defined') module.exports = function (sodium, keypair, opts) { if (sodium.api && !sodium.crypto_sign) sodium = sodium.api if (!opts) opts = {} var pub if (typeof opts.publicKey === 'function') { pub = opts.publicKey } else { var pub = [].concat(keypair.publicKey || []) if (opts.publicKey) pub = [].concat(pub, opts.publicKey) } return xtend({ identity: defined( keypair.identity, keypair.publicKey, opts.identity, opts.id ), sign: function (node, cb) { var bkey = Buffer(node.key, 'hex') if (sodium.sign && !sodium.crypto_sign) { cb(null, sodium.sign(bkey, keypair.secretKey)) } else { cb(null, sodium.crypto_sign_detached(bkey, keypair.secretKey)) } }, verify: function (node, cb) { if (typeof pub === 'function') { pub(node.identity, function (err, ok) { if (err) cb(err) else if (!ok) cb(null, false) else cb(null, verify(node)) }) } else { for (var i = 0; i < pub.length; i++) { if (eq(node.identity, pub[i])) break } if (i === pub.length) return cb(null, false) cb(null, verify(node)) } } }, opts) function verify (node) { var bkey = Buffer(node.key, 'hex') if (sodium.verify && !sodium.crypto_sign_open) { return sodium.verify(bkey, node.signature, node.identity) } else { return sodium.crypto_sign_verify_detached( node.signature, bkey, node.identity) } } } }).call(this,require("buffer").Buffer) },{"buffer":45,"buffer-equals":147,"defined":156,"isarray":209,"xtend":330}],189:[function(require,module,exports){ var after = require('after-all') var lexint = require('lexicographic-integer') var collect = require('stream-collector') var through = require('through2') var pump = require('pump') var from = require('from2') var mutexify = require('mutexify') var cuid = require('cuid') var logs = require('level-logs') var events = require('events') var util = require('util') var enumerate = require('level-enumerate') var replicate = require('./lib/replicate') var messages = require('./lib/messages') var hash = require('./lib/hash') var encoder = require('./lib/encode') var ID = '!!id' var CHANGES = '!changes!' var NODES = '!nodes!' var HEADS = '!heads!' var INVALID_SIGNATURE = new Error('Invalid signature') var CHECKSUM_MISMATCH = new Error('Checksum mismatch') var INVALID_LOG = new Error('Invalid log sequence') INVALID_LOG.notFound = true INVALID_LOG.status = 404 var noop = function () {} var Hyperlog = function (db, opts) { if (!(this instanceof Hyperlog)) return new Hyperlog(db, opts) if (!opts) opts = {} events.EventEmitter.call(this) this.id = opts.id || null this.enumerate = enumerate(db, {prefix: 'enum'}) this.db = db this.logs = logs(db, {prefix: 'logs', valueEncoding: messages.Entry}) this.lock = opts.lock || mutexify() this.changes = 0 this.setMaxListeners(0) this.valueEncoding = opts.valueEncoding || opts.encoding || 'binary' this.identity = opts.identity || null this.verify = opts.verify || null this.sign = opts.sign || null var self = this var getId = opts.getId || function (cb) { db.get(ID, {valueEncoding: 'utf-8'}, function (_, id) { if (id) return cb(null, id) id = cuid() db.put(ID, id, function () { cb(null, id) }) }) } this.lock(function (release) { collect(db.createKeyStream({gt: CHANGES, lt: CHANGES + '~', reverse: true, limit: 1}), function (_, keys) { self.changes = Math.max(self.changes, keys && keys.length ? lexint.unpack(keys[0].split('!').pop(), 'hex') : 0) if (self.id) return release() getId(function (_, id) { self.id = id || cuid() release() }) }) }) } util.inherits(Hyperlog, events.EventEmitter) Hyperlog.prototype.ready = function (cb) { if (this.id) return cb() this.lock(function (release) { release() cb() }) } Hyperlog.prototype.heads = function (opts, cb) { var self = this if (!opts) opts = {} if (typeof opts === 'function') { cb = opts opts = {} } var rs = this.db.createValueStream({ gt: HEADS, lt: HEADS + '~', valueEncoding: 'utf-8' }) var format = through.obj(function (key, enc, cb) { self.get(key, opts, cb) }) return collect(pump(rs, format), cb) } Hyperlog.prototype.get = function (key, opts, cb) { if (!opts) opts = {} if (typeof opts === 'function') { cb = opts opts = {} } var self = this this.db.get(NODES + key, {valueEncoding: 'binary'}, function (err, buf) { if (err) return cb(err) var node = messages.Node.decode(buf) node.value = encoder.decode(node.value, opts.valueEncoding || self.valueEncoding) cb(null, node) }) } var add = function (dag, links, value, opts, cb) { var logLinks = [] var id = opts.log || dag.id for (var i = 0; i < links.length; i++) { if (typeof links[i] !== 'string') links[i] = links[i].key } var node = { log: id, key: hash(links, value), identity: opts.identity || null, signature: opts.signature || null, value: value, links: links } dag.emit('preadd', node) var next = after(function (err) { if (err) return cb(err) var onlocked = function (release) { dag.logs.head(id, function (err, seq) { if (err) return release(cb, err) node.change = dag.changes + 1 node.seq = seq + 1 if (opts.hash && node.key !== opts.hash) return release(cb, CHECKSUM_MISMATCH) if (opts.seq && node.seq !== opts.seq) return release(cb, INVALID_LOG) var log = { change: dag.changes + 1, node: node.key, links: logLinks } var onclone = function (clone) { if (!opts.log) return release(cb, null, clone) dag.db.put(dag.logs.key(node.log, node.seq), messages.Entry.encode(log), function (err) { if (err) return release(cb, err) release(cb, null, clone) }) } dag.get(node.key, { valueEncoding: 'binary' }, function (_, clone) { if (clone) return onclone(clone) var batch = [] for (var i = 0; i < links.length; i++) batch.push({type: 'del', key: HEADS + links[i]}) batch.push({type: 'put', key: CHANGES + lexint.pack(node.change, 'hex'), value: node.key}) batch.push({type: 'put', key: NODES + node.key, value: messages.Node.encode(node)}) batch.push({type: 'put', key: HEADS + node.key, value: node.key}) batch.push({type: 'put', key: dag.logs.key(node.log, node.seq), value: messages.Entry.encode(log)}) dag.db.batch(batch, function (err) { if (err) return release(cb, err) dag.changes = node.change dag.emit('add', node) release(cb, null, node) }) }) }) } var done = function () { if (opts.release) return onlocked(opts.release) dag.lock(onlocked) } if (node.log === dag.id) { // we own this node if (!dag.sign || node.signature) return done() dag.sign(node, function (err, sig) { if (err) return cb(err) node.identity = dag.identity node.signature = sig done() }) } else { if (!dag.verify) return done() dag.verify(node, function (err, valid) { if (err) return cb(err) if (!valid) return cb(INVALID_SIGNATURE) done() }) } }) var nextLink = function () { var cb = next() return function (err, link) { if (err) return cb(err) if (link.log !== id && logLinks.indexOf(link.log) === -1) logLinks.push(link.log) cb(null) } } for (i = 0; i < links.length; i++) { dag.get(links[i], nextLink()) } } var createLiveStream = function (dag, opts) { var since = opts.since || 0 var limit = opts.limit || -1 var wait = null var read = function (size, cb) { if (dag.changes <= 0="" 16="" 1024="" since)="" {="" wait="cb" return="" }="" if="" (!limit)="" cb(null,="" null)="" dag.db.get(changes="" +="" lexint.pack(since="" 1,="" 'hex'),="" function="" (err,="" hash)="" (err)="" cb(err)="" dag.get(hash,="" opts,="" node)="" since="node.change" (limit="" !="=" -1)="" limit--="" })="" var="" kick="function" ()="" (!wait)="" cb="wait" read(0,="" cb)="" dag.on('add',="" kick)="" dag.ready(kick)="" rs="from.obj(read)" rs.once('close',="" dag.removelistener('add',="" hyperlog.prototype.createreadstream="function" (opts)="" (!opts)="" opts="{}" (opts.tail)="" opts.since="this.changes" (opts.live)="" createlivestream(this,="" opts)="" self="this" ||="" until="opts.until" keys="this.db.createValueStream({" gt:="" changes="" lexint.pack(since,="" lt:="" (until="" ?="" lexint.pack(until,="" 'hex')="" :="" '~'),="" valueencoding:="" 'utf-8',="" reverse:="" opts.reverse,="" limit:="" opts.limit="" get="function" (key,="" enc,="" self.get(key,="" pump(keys,="" through.obj(get))="" hyperlog.prototype.replicate="Hyperlog.prototype.createReplicationStream" =="" replicate(this,="" hyperlog.prototype.add="function" (links,="" value,="" (typeof="" 'function')="" this.add(links,="" null,="" (!cb)="" (!links)="" links="[]" (!array.isarray(links))="" value="encoder.encode(value," opts.valueencoding="" this.valueencoding)="" this.ready(function="" add(self,="" links,="" node.value="encoder.decode(node.value," self.valueencoding)="" hyperlog.prototype.append="function" (value,="" this.lock(function="" (release)="" self.heads(function="" heads)="" release(cb,="" err)="" heads,="" {release:="" release},="" module.exports="Hyperlog" },{".="" lib="" encode":190,".="" hash":191,".="" messages":192,".="" replicate":194,"after-all":144,"cuid":151,"events":82,"from2":174,"level-enumerate":221,"level-logs":224,"lexicographic-integer":230,"mutexify":238,"pump":252,"stream-collector":270,"through2":201,"util":135}],190:[function(require,module,exports){="" (function="" (buffer){="" exports.encode="function" enc)="" enc="==" 'object'="" &&="" enc.encode)="" else="" (enc="==" 'json')="" 'string')="" buffer(value)="" exports.decode="function" enc.decode)="" enc.decode(value)="" json.parse(value.tostring())="" 'utf-8'="" 'utf8')="" value.tostring()="" }).call(this,require("buffer").buffer)="" },{"buffer":45}],191:[function(require,module,exports){="" framedhash="require('framed-hash')" empty="new" buffer(0)="" value)="" hash="framedHash('sha256')" for="" (var="" i="0;" <="" links.length;="" i++)="" hash.update(links[i])="" hash.update(value="" empty)="" hash.digest('hex')="" },{"buffer":45,"framed-hash":173}],192:[function(require,module,exports){="" protobuf="require('protocol-buffers')" node="" {\n="" required uint32="" change="1;\n" string="" key="2;\n" log="3;\n" optional="" seq="4;\n" bytes="" identity="7;\n" signature="8;\n" repeated="" entry="" handshake="" version="1;\n" mode="2" [default="\"sync\"];\n" metadata="3;\n" bool="" live="4;\n}\n")" },{"protocol-buffers":250}],193:[function(require,module,exports){="" duplexify="require('duplexify')" util="require('util')" lpstream="require('length-prefixed-stream')" through="require('through2')" debug="require('debug')('hyperlog-replicate')" messages="require('./messages')" encodinglength:="" },="" encode:="" (data,="" buf,="" offset)="" buf="" protocol="function" (!(this="" instanceof="" protocol))="" new="" protocol(opts)="" frame="!opts" opts.frame="" false="" this._encoder="frame" lpstream.encode()="" through.obj()="" this._decoder="frame" lpstream.decode()="" this._finalize="opts.finalize" opts.finalize="" (cb)="" cb()="" this._process="opts.process" null="" parse="through.obj(function" self._decode(data,="" parse.on('error',="" self.destroy(err)="" this.on('end',="" debug('ended')="" self.end()="" this.on('finish',="" debug('finished')="" self.finalize()="" this._decoder.pipe(parse)="" (this._process)="" this._process.pipe(through.obj(function="" (node,="" self.emit('node',="" node,="" }))="" hwm="opts.highWaterMark" duplexify.call(this,="" this._decoder,="" this._encoder,="" {}="" {objectmode:="" true,="" highwatermark:="" hwm})="" util.inherits(protocol,="" duplexify)="" protocol.prototype.handshake="function" (handshake,="" debug('sending="" handshake')="" this._encode(0,="" messages.handshake,="" handshake,="" protocol.prototype.have="function" (have,="" have')="" this._encode(1,="" messages.log,="" have,="" protocol.prototype.want="function" (want,="" want')="" this._encode(2,="" want,="" protocol.prototype.node="function" node')="" this._encode(3,="" messages.node,="" protocol.prototype.sentheads="function" sentheads')="" this._encode(4,="" empty,="" protocol.prototype.sentwants="function" sentwants')="" this._encode(5,="" protocol.prototype.finalize="function" this._finalize(function="" debug('ending')="" self._encoder.end(cb)="" protocol.prototype._encode="function" (type,="" data,="" buffer(enc.encodinglength(data)="" 1)="" buf[0]="type" enc.encode(data,="" this._encoder.write(buf,="" decodemessage="function" (data)="" switch="" (data[0])="" case="" 0:="" messages.handshake.decode(data,="" 1:="" messages.log.decode(data,="" 2:="" 3:="" messages.node.decode(data,="" protocol.prototype._decode="function" try="" msg="decodeMessage(data)" catch="" debug('receiving="" this.emit('handshake',="" msg,="" this.emit('have',="" this.emit('want',="" this._process.write(msg,="" (this.emit('node',="" cb())="" 4:="" this.emit('sentheads',="" 5:="" this.emit('sentwants',="" messages":192,"buffer":45,"debug":152,"duplexify":157,"length-prefixed-stream":212,"through2":201,"util":135}],194:[function(require,module,exports){="" pump="require('pump')" bitfield="require('bitfield')" sortedqueue="require('./sorted-queue')" noop="function" noarr="[]" max_bitfield="10" *="" arbitrary="" high="" number="" (dag,="" stream="protocol(opts)" 'sync'="" pushing="bitfield(1024," {grow:="" max_bitfield})="" missing="0" done="false" remotesentwants="false" remotesentheads="false" localsentwants="false" localsentheads="false" outgoing="sortedQueue()" incoming="sortedQueue()" outgoing.pull(function="" loop (entry)="" dag.get(entry.node,="" {valueencoding:="" 'binary'},="" stream.destroy(err)="" stream.emit('push')="" stream.node(node,="" sendnode(node.log,="" node.seq="" outgoing.pull(loop)="" pipe="function" (a,="" b,="" destroy="function" a.destroy()="" stream.on('close',="" destroy)="" stream.on('finish',="" a.on('end',="" stream.removelistener('close',="" stream.removelistener('finish',="" pump(a,="" sendchanges="function" write="function" stream.emit('live')="" pipe(dag.createreadstream({since:="" changes,="" live:="" true}),="" through.obj(write))="" update="function" (done="" !localsentwants="" !localsentheads="" !remotesentwants="" !remotesentheads)="" (!live)="" stream.finalize(cb)="" sendchanges()="" sentwants="function" stream.sentwants()="" update(cb)="" sentheads="function" stream.sentheads()="" sendnode="function" (log,="" seq,="" dag.logs.get(log,="" entry)="" (err="" err.notfound)="" (entry.change=""> changes) return cb() // ensure snapshot var i = 0 var loop = function () { if (i < entry.links.length) return sendHave(entry.links[i++], loop) entry.links = noarr // premature opt: less mem yo outgoing.push(entry, cb) } loop() }) } var receiveNode = function (node, cb) { var opts = { hash: node.key, log: node.log, seq: node.seq, identity: node.identity, signature: node.signature, valueEncoding: 'binary' } dag.add(node.links, node.value, opts, function (err) { if (!err) return afterAdd(cb) if (!err.notFound) return cb(err) incoming.push(node, cb) }) } var afterAdd = function (cb) { stream.emit('pull') if (!localSentWants && !--missing) return sentWants(cb) if (!incoming.length) return cb() incoming.pull(function (node) { receiveNode(node, cb) }) } var sendHave = function (log, cb) { dag.enumerate(log, function (err, idx) { if (err) return cb(err) if (pushing.get(idx)) return cb() pushing.set(idx, true) dag.logs.head(log, function (err, seq) { if (err) return cb(err) dag.logs.get(log, seq, function loop (err, entry) { // ensure snapshot if (err && err.notFound) return cb() if (err) return cb(err) if (entry.change > changes) return dag.logs.get(log, seq - 1, loop) stream.have({log: log, seq: seq}, cb) }) }) }) } stream.once('sentHeads', function (cb) { if (!localSentWants && !missing) sentWants(noop) remoteSentHeads = true update(cb) }) stream.once('sentWants', function (cb) { remoteSentWants = true update(cb) }) stream.on('want', function (head, cb) { sendNode(head.log, head.seq + 1, cb) }) stream.on('have', function (head, cb) { dag.logs.head(head.log, function (err, seq) { if (err) return cb(err) if (seq >= head.seq) return cb() missing += (head.seq - seq) stream.want({log: head.log, seq: seq}, cb) }) }) stream.on('node', receiveNode) // start the handshake stream.on('handshake', function (handshake, cb) { var remoteMode = handshake.mode if (remoteMode !== 'pull' && remoteMode !== 'push' && remoteMode !== 'sync') return cb(new Error('Remote uses invalid mode: ' + remoteMode)) if (remoteMode === 'pull' && mode === 'pull') return cb(new Error('Remote and local are both pulling')) if (remoteMode === 'push' && mode === 'push') return cb(new Error('Remote and local are both pushing')) remoteSentWants = remoteMode === 'push' remoteSentHeads = remoteMode === 'pull' localSentWants = mode === 'push' || remoteMode === 'pull' localSentHeads = mode === 'pull' || remoteMode === 'push' if (handshake.metadata) stream.emit('metadata', handshake.metadata) if (!live) live = handshake.live if (localSentHeads) return update(cb) var write = function (node, enc, cb) { sendHave(node.log, cb) } dag.lock(function (release) { // TODO: don't lock here. figure out how to snapshot the heads to a change instead changes = dag.changes pipe(dag.heads(), through.obj(write), function (err) { release() if (err) return cb(err) sentHeads(cb) }) }) }) stream.handshake({version: 1, mode: opts.mode, metadata: opts.metadata, live: live}) return stream } },{"./protocol":193,"./sorted-queue":195,"bitfield":145,"pump":252,"through2":201}],195:[function(require,module,exports){ var indexOf = function (list, change) { var low = 0 var high = list.length var mid = 0 while (low < high) { mid = (low + high) >> 1 if (change < list[mid].change) high = mid else low = mid + 1 } return low } var SortedQueue = function () { // TODO: buffer to leveldb if the queue becomes large if (!(this instanceof SortedQueue)) return new SortedQueue() this.list = [] this.wait = null this.length = 0 } SortedQueue.prototype.push = function (entry, cb) { var i = indexOf(this.list, entry.change) if (i === this.list.length) this.list.push(entry) else this.list.splice(i, 0, entry) this.length++ if (this.wait) this.pull(this.wait) if (cb) cb() } SortedQueue.prototype.pull = function (cb) { if (!this.list.length) { this.wait = cb return } this.wait = null var next = this.list.shift() this.length-- cb(next) } module.exports = SortedQueue },{}],196:[function(require,module,exports){ arguments[4][113][0].apply(exports,arguments) },{"./_stream_readable":197,"./_stream_writable":199,"core-util-is":150,"dup":113,"inherits":204,"process-nextick-args":243}],197:[function(require,module,exports){ (function (process){ 'use strict'; module.exports = Readable; /**/ var processNextTick = require('process-nextick-args'); /**/ /**/ var isArray = require('isarray'); /**/ /**/ var Buffer = require('buffer').Buffer; /**/ Readable.ReadableState = ReadableState; var EE = require('events'); /**/ var EElistenerCount = function(emitter, type) { return emitter.listeners(type).length; }; /**/ /**/ var Stream; (function (){try{ Stream = require('st' + 'ream'); }catch(_){}finally{ if (!Stream) Stream = require('events').EventEmitter; }}()) /**/ var Buffer = require('buffer').Buffer; /**/ var util = require('core-util-is'); util.inherits = require('inherits'); /**/ /**/ var debugUtil = require('util'); var debug; if (debugUtil && debugUtil.debuglog) { debug = debugUtil.debuglog('stream'); } else { debug = function () {}; } /**/ var StringDecoder; util.inherits(Readable, Stream); var Duplex; function ReadableState(options, stream) { Duplex = Duplex || require('./_stream_duplex'); options = options || {}; // object stream flag. Used to make read(n) ignore n and to // make all the buffer merging and length checks go away this.objectMode = !!options.objectMode; if (stream instanceof Duplex) this.objectMode = this.objectMode || !!options.readableObjectMode; // the point at which it stops calling _read() to fill the buffer // Note: 0 is a valid value, means "don't call _read preemptively ever" var hwm = options.highWaterMark; var defaultHwm = this.objectMode ? 16 : 16 * 1024; this.highWaterMark = (hwm || hwm === 0) ? hwm : defaultHwm; // cast to ints. this.highWaterMark = ~~this.highWaterMark; this.buffer = []; this.length = 0; this.pipes = null; this.pipesCount = 0; this.flowing = null; this.ended = false; this.endEmitted = false; this.reading = false; // a flag to be able to tell if the onwrite cb is called immediately, // or on a later tick. We set this to true at first, because any // actions that shouldn't happen until "later" should generally also // not happen before the first write call. this.sync = true; // whenever we return null, then we set a flag to say // that we're awaiting a 'readable' event emission. this.needReadable = false; this.emittedReadable = false; this.readableListening = false; // Crypto is kind of old and crusty. Historically, its default string // encoding is 'binary' so we have to make this configurable. // Everything else in the universe uses 'utf8', though. this.defaultEncoding = options.defaultEncoding || 'utf8'; // when piping, we only care about 'readable' events that happen // after read()ing all the bytes and not getting any pushback. this.ranOut = false; // the number of writers that are awaiting a drain event in .pipe()s this.awaitDrain = 0; // if true, a maybeReadMore has been scheduled this.readingMore = false; this.decoder = null; this.encoding = null; if (options.encoding) { if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder; this.decoder = new StringDecoder(options.encoding); this.encoding = options.encoding; } } var Duplex; function Readable(options) { Duplex = Duplex || require('./_stream_duplex'); if (!(this instanceof Readable)) return new Readable(options); this._readableState = new ReadableState(options, this); // legacy this.readable = true; if (options && typeof options.read === 'function') this._read = options.read; Stream.call(this); } // Manually shove something into the read() buffer. // This returns true if the highWaterMark has not been hit yet, // similar to how Writable.write() returns true if you should // write() some more. Readable.prototype.push = function(chunk, encoding) { var state = this._readableState; if (!state.objectMode && typeof chunk === 'string') { encoding = encoding || state.defaultEncoding; if (encoding !== state.encoding) { chunk = new Buffer(chunk, encoding); encoding = ''; } } return readableAddChunk(this, state, chunk, encoding, false); }; // Unshift should *always* be something directly out of read() Readable.prototype.unshift = function(chunk) { var state = this._readableState; return readableAddChunk(this, state, chunk, '', true); }; Readable.prototype.isPaused = function() { return this._readableState.flowing === false; }; function readableAddChunk(stream, state, chunk, encoding, addToFront) { var er = chunkInvalid(state, chunk); if (er) { stream.emit('error', er); } else if (chunk === null) { state.reading = false; onEofChunk(stream, state); } else if (state.objectMode || chunk && chunk.length > 0) { if (state.ended && !addToFront) { var e = new Error('stream.push() after EOF'); stream.emit('error', e); } else if (state.endEmitted && addToFront) { var e = new Error('stream.unshift() after end event'); stream.emit('error', e); } else { if (state.decoder && !addToFront && !encoding) chunk = state.decoder.write(chunk); if (!addToFront) state.reading = false; // if we want the data now, just emit it. if (state.flowing && state.length === 0 && !state.sync) { stream.emit('data', chunk); stream.read(0); } else { // update the buffer info. state.length += state.objectMode ? 1 : chunk.length; if (addToFront) state.buffer.unshift(chunk); else state.buffer.push(chunk); if (state.needReadable) emitReadable(stream); } maybeReadMore(stream, state); } } else if (!addToFront) { state.reading = false; } return needMoreData(state); } // if it's past the high water mark, we can push in some more. // Also, if we have no data yet, we can stand some // more bytes. This is to work around cases where hwm=0, // such as the repl. Also, if the push() triggered a // readable event, and the user called read(largeNumber) such that // needReadable was set, then we ought to push more, so that another // 'readable' event will be triggered. function needMoreData(state) { return !state.ended && (state.needReadable || state.length < state.highWaterMark || state.length === 0); } // backwards compatibility. Readable.prototype.setEncoding = function(enc) { if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder; this._readableState.decoder = new StringDecoder(enc); this._readableState.encoding = enc; return this; }; // Don't raise the hwm > 8MB var MAX_HWM = 0x800000; function computeNewHighWaterMark(n) { if (n >= MAX_HWM) { n = MAX_HWM; } else { // Get the next highest power of 2 n--; n |= n >>> 1; n |= n >>> 2; n |= n >>> 4; n |= n >>> 8; n |= n >>> 16; n++; } return n; } function howMuchToRead(n, state) { if (state.length === 0 && state.ended) return 0; if (state.objectMode) return n === 0 ? 0 : 1; if (n === null || isNaN(n)) { // only flow one buffer at a time if (state.flowing && state.buffer.length) return state.buffer[0].length; else return state.length; } if (n <= 0)="" return="" 0;="" if="" we're="" asking="" for="" more="" than="" the="" target="" buffer="" level,="" then="" raise="" water="" mark.="" bump="" up="" to="" next="" highest="" power="" of="" 2,="" prevent="" increasing="" it="" excessively="" in="" tiny="" amounts.="" (n=""> state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n); // don't have that much. return null, unless we've ended. if (n > state.length) { if (!state.ended) { state.needReadable = true; return 0; } else { return state.length; } } return n; } // you can override either this method, or the async _read(n) below. Readable.prototype.read = function(n) { debug('read', n); var state = this._readableState; var nOrig = n; if (typeof n !== 'number' || n > 0) state.emittedReadable = false; // if we're doing read(0) to trigger a readable event, but we // already have a bunch of data in the buffer, then just trigger // the 'readable' event and move on. if (n === 0 && state.needReadable && (state.length >= state.highWaterMark || state.ended)) { debug('read: emitReadable', state.length, state.ended); if (state.length === 0 && state.ended) endReadable(this); else emitReadable(this); return null; } n = howMuchToRead(n, state); // if we've ended, and we're now clear, then finish it up. if (n === 0 && state.ended) { if (state.length === 0) endReadable(this); return null; } // All the actual chunk generation logic needs to be // *below* the call to _read. The reason is that in certain // synthetic stream cases, such as passthrough streams, _read // may be a completely synchronous operation which may change // the state of the read buffer, providing enough data when // before there was *not* enough. // // So, the steps are: // 1. Figure out what the state of things will be after we do // a read from the buffer. // // 2. If that resulting state will trigger a _read, then call _read. // Note that this may be asynchronous, or synchronous. Yes, it is // deeply ugly to write APIs this way, but that still doesn't mean // that the Readable class should behave improperly, as streams are // designed to be sync/async agnostic. // Take note if the _read call is sync or async (ie, if the read call // has returned yet), so that we know whether or not it's safe to emit // 'readable' etc. // // 3. Actually pull the requested chunks out of the buffer and return. // if we need a readable event, then we need to do some reading. var doRead = state.needReadable; debug('need readable', doRead); // if we currently have less than the highWaterMark, then also read some if (state.length === 0 || state.length - n < state.highWaterMark) { doRead = true; debug('length less than watermark', doRead); } // however, if we've ended, then there's no point, and if we're already // reading, then it's unnecessary. if (state.ended || state.reading) { doRead = false; debug('reading or ended', doRead); } if (doRead) { debug('do read'); state.reading = true; state.sync = true; // if the length is currently zero, then we *need* a readable event. if (state.length === 0) state.needReadable = true; // call internal read method this._read(state.highWaterMark); state.sync = false; } // If _read pushed data synchronously, then `reading` will be false, // and we need to re-evaluate how much data we can return to the user. if (doRead && !state.reading) n = howMuchToRead(nOrig, state); var ret; if (n > 0) ret = fromList(n, state); else ret = null; if (ret === null) { state.needReadable = true; n = 0; } state.length -= n; // If we have nothing in the buffer, then we want to know // as soon as we *do* get something into the buffer. if (state.length === 0 && !state.ended) state.needReadable = true; // If we tried to read() past the EOF, then emit end on the next tick. if (nOrig !== n && state.ended && state.length === 0) endReadable(this); if (ret !== null) this.emit('data', ret); return ret; }; function chunkInvalid(state, chunk) { var er = null; if (!(Buffer.isBuffer(chunk)) && typeof chunk !== 'string' && chunk !== null && chunk !== undefined && !state.objectMode) { er = new TypeError('Invalid non-string/buffer chunk'); } return er; } function onEofChunk(stream, state) { if (state.ended) return; if (state.decoder) { var chunk = state.decoder.end(); if (chunk && chunk.length) { state.buffer.push(chunk); state.length += state.objectMode ? 1 : chunk.length; } } state.ended = true; // emit 'readable' now to make sure it gets picked up. emitReadable(stream); } // Don't emit readable right away in sync mode, because this can trigger // another read() call => stack overflow. This way, it might trigger // a nextTick recursion warning, but that's not so bad. function emitReadable(stream) { var state = stream._readableState; state.needReadable = false; if (!state.emittedReadable) { debug('emitReadable', state.flowing); state.emittedReadable = true; if (state.sync) processNextTick(emitReadable_, stream); else emitReadable_(stream); } } function emitReadable_(stream) { debug('emit readable'); stream.emit('readable'); flow(stream); } // at this point, the user has presumably seen the 'readable' event, // and called read() to consume some data. that may have triggered // in turn another _read(n) call, in which case reading = true if // it's in progress. // However, if we're not ended, or reading, and the length < hwm, // then go ahead and try to read some more preemptively. function maybeReadMore(stream, state) { if (!state.readingMore) { state.readingMore = true; processNextTick(maybeReadMore_, stream, state); } } function maybeReadMore_(stream, state) { var len = state.length; while (!state.reading && !state.flowing && !state.ended && state.length < state.highWaterMark) { debug('maybeReadMore read 0'); stream.read(0); if (len === state.length) // didn't get any data, stop spinning. break; else len = state.length; } state.readingMore = false; } // abstract method. to be overridden in specific implementation classes. // call cb(er, data) where data is <= 0="" 1="" n="" in="" length.="" for="" virtual="" (non-string,="" non-buffer)="" streams,="" "length"="" is="" somewhat="" arbitrary,="" and="" perhaps="" not="" very="" meaningful.="" readable.prototype._read="function(n)" {="" this.emit('error',="" new="" error('not="" implemented'));="" };="" readable.prototype.pipe="function(dest," pipeopts)="" var="" src="this;" state="this._readableState;" switch="" (state.pipescount)="" case="" 0:="" state.pipes="dest;" break;="" 1:="" dest];="" default:="" state.pipes.push(dest);="" }="" state.pipescount="" +="1;" debug('pipe="" count="%d" opts="%j'," state.pipescount,="" pipeopts);="" doend="(!pipeOpts" ||="" pipeopts.end="" !="=" false)="" &&="" dest="" process.stdout="" process.stderr;="" endfn="doEnd" ?="" onend="" :="" cleanup;="" if="" (state.endemitted)="" processnexttick(endfn);="" else="" src.once('end',="" endfn);="" dest.on('unpipe',="" onunpipe);="" function="" onunpipe(readable)="" debug('onunpipe');="" (readable="==" src)="" cleanup();="" onend()="" debug('onend');="" dest.end();="" when="" the="" drains,="" it="" reduces="" awaitdrain="" counter="" on="" source.="" this="" would="" be="" more="" elegant="" with="" a="" .once()="" handler="" flow(),="" but="" adding="" removing="" repeatedly="" too="" slow.="" ondrain="pipeOnDrain(src);" dest.on('drain',="" ondrain);="" cleanedup="false;" cleanup()="" debug('cleanup');="" cleanup="" event="" handlers="" once="" pipe="" broken="" dest.removelistener('close',="" onclose);="" dest.removelistener('finish',="" onfinish);="" dest.removelistener('drain',="" dest.removelistener('error',="" onerror);="" dest.removelistener('unpipe',="" src.removelistener('end',="" onend);="" cleanup);="" src.removelistener('data',="" ondata);="" reader="" waiting="" drain="" from="" specific="" writer,="" then="" cause="" to="" never="" start="" flowing="" again.="" so,="" awaiting="" drain,="" we="" just="" call="" now.="" don't="" know,="" assume="" that="" are="" one.="" (state.awaitdrain="" (!dest._writablestate="" dest._writablestate.needdrain))="" ondrain();="" src.on('data',="" ondata(chunk)="" debug('ondata');="" ret="dest.write(chunk);" (false="==" ret)="" user="" unpiped="" during="" `dest.write()`,="" possible="" get="" stuck="" permanently="" paused="" write="" also="" returned="" false.="" (state.pipescount="==" state.pipes[0]="==" src.listenercount('data')="==" !cleanedup)="" debug('false="" response,="" pause',="" src._readablestate.awaitdrain);="" src._readablestate.awaitdrain++;="" src.pause();="" has="" an="" error,="" stop="" piping="" into="" it.="" however,="" suppress="" throwing="" behavior="" this.="" onerror(er)="" debug('onerror',="" er);="" unpipe();="" (eelistenercount(dest,="" 'error')="==" 0)="" dest.emit('error',="" brutally="" ugly="" hack="" make="" sure="" our="" error="" attached="" before="" any="" userland="" ones.="" do="" (!dest._events="" !dest._events.error)="" dest.on('error',="" (isarray(dest._events.error))="" dest._events.error.unshift(onerror);="" dest._events.error="[onerror," dest._events.error];="" both="" close="" finish="" should="" trigger="" unpipe,="" only="" once.="" onclose()="" dest.once('close',="" onfinish()="" debug('onfinish');="" dest.once('finish',="" unpipe()="" debug('unpipe');="" src.unpipe(dest);="" tell="" it's="" being="" piped="" dest.emit('pipe',="" src);="" flow="" hasn't="" been="" started="" already.="" (!state.flowing)="" resume');="" src.resume();="" return="" dest;="" pipeondrain(src)="" function()="" debug('pipeondrain',="" state.awaitdrain);="" (state.awaitdrain)="" state.awaitdrain--;="" eelistenercount(src,="" 'data'))="" state.flowing="true;" flow(src);="" readable.prototype.unpipe="function(dest)" we're="" anywhere,="" nothing.="" this;="" one="" destination.="" most="" common="" case.="" 1)="" passed="" one,="" right="" (dest="" state.pipes)="" (!dest)="" got="" match.="" (dest)="" dest.emit('unpipe',="" this);="" slow="" multiple destinations.="" remove="" all.="" dests="state.pipes;" len="state.pipesCount;" (var="" i="0;" <="" len;="" i++)="" dests[i].emit('unpipe',="" try="" find="" dest);="" (i="==" -1)="" state.pipes.splice(i,="" 1);="" -="1;" set="" up="" data="" events="" they="" asked="" ensure="" readable="" listeners="" eventually="" something="" readable.prototype.on="function(ev," fn)="" res="Stream.prototype.on.call(this," ev,="" fn);="" listening="" data,="" explicitly="" paused,="" resume="" of="" next="" tick.="" (ev="==" 'data'="" false="" this._readablestate.flowing)="" this.resume();="" 'readable'="" this.readable)="" (!state.readablelistening)="" state.readablelistening="true;" state.emittedreadable="false;" state.needreadable="true;" (!state.reading)="" processnexttick(nreadingnexttick,="" (state.length)="" emitreadable(this,="" state);="" res;="" readable.prototype.addlistener="Readable.prototype.on;" nreadingnexttick(self)="" debug('readable="" nexttick="" read="" 0');="" self.read(0);="" pause()="" resume()="" remnants="" legacy="" stream="" api="" uses="" them,="" old="" mode.="" readable.prototype.resume="function()" debug('resume');="" resume(this,="" resume(stream,="" state)="" (!state.resumescheduled)="" state.resumescheduled="true;" processnexttick(resume_,="" stream,="" resume_(stream,="" debug('resume="" stream.read(0);="" stream.emit('resume');="" flow(stream);="" (state.flowing="" !state.reading)="" readable.prototype.pause="function()" debug('call="" pause="" this._readablestate.flowing);="" debug('pause');="" this._readablestate.flowing="false;" this.emit('pause');="" flow(stream)="" debug('flow',="" state.flowing);="" (state.flowing)="" chunk="stream.read();" while="" (null="" wrap="" old-style="" as="" async *not*="" part="" interface.="" unfortunate="" mess="" history.="" readable.prototype.wrap="function(stream)" self="this;" stream.on('end',="" debug('wrapped="" end');="" (state.decoder="" !state.ended)="" (chunk="" chunk.length)="" self.push(chunk);="" self.push(null);="" });="" stream.on('data',="" function(chunk)="" data');="" (state.decoder)="" skip="" over="" falsy="" values="" objectmode="" (state.objectmode="" null="" undefined))="" return;="" (!state.objectmode="" (!chunk="" !chunk.length))="" (!ret)="" stream.pause();="" proxy="" all="" other="" methods.="" important="" wrapping="" filters="" duplexes.="" stream)="" (this[i]="==" undefined="" typeof="" stream[i]="==" 'function')="" this[i]="function(method)" stream[method].apply(stream,="" arguments);="" }(i);="" certain="" events.="" 'close',="" 'destroy',="" 'pause',="" 'resume'];="" foreach(events,="" function(ev)="" stream.on(ev,="" self.emit.bind(self,="" ev));="" consume="" some="" bytes,="" simply="" unpause="" underlying="" stream.="" self._read="function(n)" _read',="" n);="" (paused)="" stream.resume();="" self;="" exposed="" testing="" purposes="" only.="" readable._fromlist="fromList;" pluck="" off="" bytes="" array="" buffers.="" length="" combined="" lengths="" buffers="" list.="" fromlist(n,="" list="state.buffer;" stringmode="!!state.decoder;" ret;="" nothing="" list,="" definitely="" empty.="" (list.length="==" null;="" (length="==" (objectmode)="" (!n="">= length) { // read it all, truncate the array. if (stringMode) ret = list.join(''); else if (list.length === 1) ret = list[0]; else ret = Buffer.concat(list, length); list.length = 0; } else { // read just some of it. if (n < list[0].length) { // just take a part of the first list item. // slice is the same for buffers and strings. var buf = list[0]; ret = buf.slice(0, n); list[0] = buf.slice(n); } else if (n === list[0].length) { // first list is a perfect match ret = list.shift(); } else { // complex case. // we have enough to cover it, but it spans past the first buffer. if (stringMode) ret = ''; else ret = new Buffer(n); var c = 0; for (var i = 0, l = list.length; i < l && c < n; i++) { var buf = list[0]; var cpy = Math.min(n - c, buf.length); if (stringMode) ret += buf.slice(0, cpy); else buf.copy(ret, c, 0, cpy); if (cpy < buf.length) list[0] = buf.slice(cpy); else list.shift(); c += cpy; } } } return ret; } function endReadable(stream) { var state = stream._readableState; // If we get here before consuming all the bytes, then that is a // bug in node. Should never happen. if (state.length > 0) throw new Error('endReadable called on non-empty stream'); if (!state.endEmitted) { state.ended = true; processNextTick(endReadableNT, state, stream); } } function endReadableNT(state, stream) { // Check that we didn't get one last unshift. if (!state.endEmitted && state.length === 0) { state.endEmitted = true; stream.readable = false; stream.emit('end'); } } function forEach (xs, f) { for (var i = 0, l = xs.length; i < l; i++) { f(xs[i], i); } } function indexOf (xs, x) { for (var i = 0, l = xs.length; i < l; i++) { if (xs[i] === x) return i; } return -1; } }).call(this,require('_process')) },{"./_stream_duplex":196,"_process":104,"buffer":45,"core-util-is":150,"events":82,"inherits":204,"isarray":209,"process-nextick-args":243,"string_decoder/":272,"util":19}],198:[function(require,module,exports){ arguments[4][116][0].apply(exports,arguments) },{"./_stream_duplex":196,"core-util-is":150,"dup":116,"inherits":204}],199:[function(require,module,exports){ arguments[4][117][0].apply(exports,arguments) },{"./_stream_duplex":196,"buffer":45,"core-util-is":150,"dup":117,"events":82,"inherits":204,"process-nextick-args":243,"util-deprecate":287}],200:[function(require,module,exports){ arguments[4][120][0].apply(exports,arguments) },{"./lib/_stream_transform.js":198,"dup":120}],201:[function(require,module,exports){ (function (process){ var Transform = require('readable-stream/transform') , inherits = require('util').inherits , xtend = require('xtend') function DestroyableTransform(opts) { Transform.call(this, opts) this._destroyed = false } inherits(DestroyableTransform, Transform) DestroyableTransform.prototype.destroy = function(err) { if (this._destroyed) return this._destroyed = true var self = this process.nextTick(function() { if (err) self.emit('error', err) self.emit('close') }) } // a noop _transform function function noop (chunk, enc, callback) { callback(null, chunk) } // create a new export function, used by both the main export and // the .ctor export, contains common logic for dealing with arguments function through2 (construct) { return function (options, transform, flush) { if (typeof options == 'function') { flush = transform transform = options options = {} } if (typeof transform != 'function') transform = noop if (typeof flush != 'function') flush = null return construct(options, transform, flush) } } // main export, just make me a transform stream! module.exports = through2(function (options, transform, flush) { var t2 = new DestroyableTransform(options) t2._transform = transform if (flush) t2._flush = flush return t2 }) // make me a reusable prototype that I can `new`, or implicitly `new` // with a constructor call module.exports.ctor = through2(function (options, transform, flush) { function Through2 (override) { if (!(this instanceof Through2)) return new Through2(override) this.options = xtend(options, override) DestroyableTransform.call(this, this.options) } inherits(Through2, DestroyableTransform) Through2.prototype._transform = transform if (flush) Through2.prototype._flush = flush return Through2 }) module.exports.obj = through2(function (options, transform, flush) { var t2 = new DestroyableTransform(xtend({ objectMode: true, highWaterMark: 16 }, options)) t2._transform = transform if (flush) t2._flush = flush return t2 }) }).call(this,require('_process')) },{"_process":104,"readable-stream/transform":200,"util":135,"xtend":330}],202:[function(require,module,exports){ (function (global){ 'use strict'; /*global window, global*/ var root = typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : {}; module.exports = Individual; function Individual(key, value) { if (key in root) { return root[key]; } root[key] = value; return value; } }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) },{}],203:[function(require,module,exports){ 'use strict'; var Individual = require('./index.js'); module.exports = OneVersion; function OneVersion(moduleName, version, defaultValue) { var key = '__INDIVIDUAL_ONE_VERSION_' + moduleName; var enforceKey = key + '_ENFORCE_SINGLETON'; var versionValue = Individual(enforceKey, version); if (versionValue !== version) { throw new Error('Can only have one copy of ' + moduleName + '.\n' + 'You already have version ' + versionValue + ' installed.\n' + 'This means you cannot install version ' + version); } return Individual(key, defaultValue); } },{"./index.js":202}],204:[function(require,module,exports){ arguments[4][92][0].apply(exports,arguments) },{"dup":92}],205:[function(require,module,exports){ module.exports = isFunction var toString = Object.prototype.toString function isFunction (fn) { var string = toString.call(fn) return string === '[object Function]' || (typeof fn === 'function' && string !== '[object RegExp]') || (typeof window !== 'undefined' && // IE8 and below (fn === window.setTimeout || fn === window.alert || fn === window.confirm || fn === window.prompt)) }; },{}],206:[function(require,module,exports){ "use strict"; module.exports = function isObject(x) { return typeof x === "object" && x !== null; }; },{}],207:[function(require,module,exports){ "use strict" function isProperty(str) { return /^[$A-Z\_a-z\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0370-\u0374\u0376\u0377\u037a-\u037d\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05d0-\u05ea\u05f0-\u05f2\u0620-\u064a\u066e\u066f\u0671-\u06d3\u06d5\u06e5\u06e6\u06ee\u06ef\u06fa-\u06fc\u06ff\u0710\u0712-\u072f\u074d-\u07a5\u07b1\u07ca-\u07ea\u07f4\u07f5\u07fa\u0800-\u0815\u081a\u0824\u0828\u0840-\u0858\u08a0\u08a2-\u08ac\u0904-\u0939\u093d\u0950\u0958-\u0961\u0971-\u0977\u0979-\u097f\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd\u09ce\u09dc\u09dd\u09df-\u09e1\u09f0\u09f1\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59-\u0a5c\u0a5e\u0a72-\u0a74\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd\u0ad0\u0ae0\u0ae1\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d\u0b5c\u0b5d\u0b5f-\u0b61\u0b71\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bd0\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c33\u0c35-\u0c39\u0c3d\u0c58\u0c59\u0c60\u0c61\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d\u0d4e\u0d60\u0d61\u0d7a-\u0d7f\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0e01-\u0e30\u0e32\u0e33\u0e40-\u0e46\u0e81\u0e82\u0e84\u0e87\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa\u0eab\u0ead-\u0eb0\u0eb2\u0eb3\u0ebd\u0ec0-\u0ec4\u0ec6\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f88-\u0f8c\u1000-\u102a\u103f\u1050-\u1055\u105a-\u105d\u1061\u1065\u1066\u106e-\u1070\u1075-\u1081\u108e\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1380-\u138f\u13a0-\u13f4\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f0\u1700-\u170c\u170e-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1780-\u17b3\u17d7\u17dc\u1820-\u1877\u1880-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191c\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19c1-\u19c7\u1a00-\u1a16\u1a20-\u1a54\u1aa7\u1b05-\u1b33\u1b45-\u1b4b\u1b83-\u1ba0\u1bae\u1baf\u1bba-\u1be5\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-\u1c7d\u1ce9-\u1cec\u1cee-\u1cf1\u1cf5\u1cf6\u1d00-\u1dbf\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2119-\u211d\u2124\u2126\u2128\u212a-\u212d\u212f-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2ce4\u2ceb-\u2cee\u2cf2\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u2e2f\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309d-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312d\u3131-\u318e\u31a0-\u31ba\u31f0-\u31ff\u3400-\u4db5\u4e00-\u9fcc\ua000-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua67f-\ua697\ua6a0-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua78e\ua790-\ua793\ua7a0-\ua7aa\ua7f8-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822\ua840-\ua873\ua882-\ua8b3\ua8f2-\ua8f7\ua8fb\ua90a-\ua925\ua930-\ua946\ua960-\ua97c\ua984-\ua9b2\ua9cf\uaa00-\uaa28\uaa40-\uaa42\uaa44-\uaa4b\uaa60-\uaa76\uaa7a\uaa80-\uaaaf\uaab1\uaab5\uaab6\uaab9-\uaabd\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaea\uaaf2-\uaaf4\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uabc0-\uabe2\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d\ufb1f-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc][$A-Z\_a-z\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0370-\u0374\u0376\u0377\u037a-\u037d\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05d0-\u05ea\u05f0-\u05f2\u0620-\u064a\u066e\u066f\u0671-\u06d3\u06d5\u06e5\u06e6\u06ee\u06ef\u06fa-\u06fc\u06ff\u0710\u0712-\u072f\u074d-\u07a5\u07b1\u07ca-\u07ea\u07f4\u07f5\u07fa\u0800-\u0815\u081a\u0824\u0828\u0840-\u0858\u08a0\u08a2-\u08ac\u0904-\u0939\u093d\u0950\u0958-\u0961\u0971-\u0977\u0979-\u097f\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd\u09ce\u09dc\u09dd\u09df-\u09e1\u09f0\u09f1\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59-\u0a5c\u0a5e\u0a72-\u0a74\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd\u0ad0\u0ae0\u0ae1\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d\u0b5c\u0b5d\u0b5f-\u0b61\u0b71\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bd0\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c33\u0c35-\u0c39\u0c3d\u0c58\u0c59\u0c60\u0c61\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d\u0d4e\u0d60\u0d61\u0d7a-\u0d7f\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0e01-\u0e30\u0e32\u0e33\u0e40-\u0e46\u0e81\u0e82\u0e84\u0e87\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa\u0eab\u0ead-\u0eb0\u0eb2\u0eb3\u0ebd\u0ec0-\u0ec4\u0ec6\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f88-\u0f8c\u1000-\u102a\u103f\u1050-\u1055\u105a-\u105d\u1061\u1065\u1066\u106e-\u1070\u1075-\u1081\u108e\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1380-\u138f\u13a0-\u13f4\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f0\u1700-\u170c\u170e-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1780-\u17b3\u17d7\u17dc\u1820-\u1877\u1880-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191c\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19c1-\u19c7\u1a00-\u1a16\u1a20-\u1a54\u1aa7\u1b05-\u1b33\u1b45-\u1b4b\u1b83-\u1ba0\u1bae\u1baf\u1bba-\u1be5\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-\u1c7d\u1ce9-\u1cec\u1cee-\u1cf1\u1cf5\u1cf6\u1d00-\u1dbf\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2119-\u211d\u2124\u2126\u2128\u212a-\u212d\u212f-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2ce4\u2ceb-\u2cee\u2cf2\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u2e2f\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309d-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312d\u3131-\u318e\u31a0-\u31ba\u31f0-\u31ff\u3400-\u4db5\u4e00-\u9fcc\ua000-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua67f-\ua697\ua6a0-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua78e\ua790-\ua793\ua7a0-\ua7aa\ua7f8-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822\ua840-\ua873\ua882-\ua8b3\ua8f2-\ua8f7\ua8fb\ua90a-\ua925\ua930-\ua946\ua960-\ua97c\ua984-\ua9b2\ua9cf\uaa00-\uaa28\uaa40-\uaa42\uaa44-\uaa4b\uaa60-\uaa76\uaa7a\uaa80-\uaaaf\uaab1\uaab5\uaab6\uaab9-\uaabd\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaea\uaaf2-\uaaf4\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uabc0-\uabe2\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d\ufb1f-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc0-9\u0300-\u036f\u0483-\u0487\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u0669\u0670\u06d6-\u06dc\u06df-\u06e4\u06e7\u06e8\u06ea-\u06ed\u06f0-\u06f9\u0711\u0730-\u074a\u07a6-\u07b0\u07c0-\u07c9\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0859-\u085b\u08e4-\u08fe\u0900-\u0903\u093a-\u093c\u093e-\u094f\u0951-\u0957\u0962\u0963\u0966-\u096f\u0981-\u0983\u09bc\u09be-\u09c4\u09c7\u09c8\u09cb-\u09cd\u09d7\u09e2\u09e3\u09e6-\u09ef\u0a01-\u0a03\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a66-\u0a71\u0a75\u0a81-\u0a83\u0abc\u0abe-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ae2\u0ae3\u0ae6-\u0aef\u0b01-\u0b03\u0b3c\u0b3e-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b66-\u0b6f\u0b82\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd7\u0be6-\u0bef\u0c01-\u0c03\u0c3e-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0c66-\u0c6f\u0c82\u0c83\u0cbc\u0cbe-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0ce6-\u0cef\u0d02\u0d03\u0d3e-\u0d44\u0d46-\u0d48\u0d4a-\u0d4d\u0d57\u0d62\u0d63\u0d66-\u0d6f\u0d82\u0d83\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0df2\u0df3\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0e50-\u0e59\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0ed0-\u0ed9\u0f18\u0f19\u0f20-\u0f29\u0f35\u0f37\u0f39\u0f3e\u0f3f\u0f71-\u0f84\u0f86\u0f87\u0f8d-\u0f97\u0f99-\u0fbc\u0fc6\u102b-\u103e\u1040-\u1049\u1056-\u1059\u105e-\u1060\u1062-\u1064\u1067-\u106d\u1071-\u1074\u1082-\u108d\u108f-\u109d\u135d-\u135f\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b4-\u17d3\u17dd\u17e0-\u17e9\u180b-\u180d\u1810-\u1819\u18a9\u1920-\u192b\u1930-\u193b\u1946-\u194f\u19b0-\u19c0\u19c8\u19c9\u19d0-\u19d9\u1a17-\u1a1b\u1a55-\u1a5e\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1b00-\u1b04\u1b34-\u1b44\u1b50-\u1b59\u1b6b-\u1b73\u1b80-\u1b82\u1ba1-\u1bad\u1bb0-\u1bb9\u1be6-\u1bf3\u1c24-\u1c37\u1c40-\u1c49\u1c50-\u1c59\u1cd0-\u1cd2\u1cd4-\u1ce8\u1ced\u1cf2-\u1cf4\u1dc0-\u1de6\u1dfc-\u1dff\u200c\u200d\u203f\u2040\u2054\u20d0-\u20dc\u20e1\u20e5-\u20f0\u2cef-\u2cf1\u2d7f\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua620-\ua629\ua66f\ua674-\ua67d\ua69f\ua6f0\ua6f1\ua802\ua806\ua80b\ua823-\ua827\ua880\ua881\ua8b4-\ua8c4\ua8d0-\ua8d9\ua8e0-\ua8f1\ua900-\ua909\ua926-\ua92d\ua947-\ua953\ua980-\ua983\ua9b3-\ua9c0\ua9d0-\ua9d9\uaa29-\uaa36\uaa43\uaa4c\uaa4d\uaa50-\uaa59\uaa7b\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uaaeb-\uaaef\uaaf5\uaaf6\uabe3-\uabea\uabec\uabed\uabf0-\uabf9\ufb1e\ufe00-\ufe0f\ufe20-\ufe26\ufe33\ufe34\ufe4d-\ufe4f\uff10-\uff19\uff3f]*$/.test(str) } module.exports = isProperty },{}],208:[function(require,module,exports){ module.exports = isTypedArray isTypedArray.strict = isStrictTypedArray isTypedArray.loose = isLooseTypedArray var toString = Object.prototype.toString var names = { '[object Int8Array]': true , '[object Int16Array]': true , '[object Int32Array]': true , '[object Uint8Array]': true , '[object Uint8ClampedArray]': true , '[object Uint16Array]': true , '[object Uint32Array]': true , '[object Float32Array]': true , '[object Float64Array]': true } function isTypedArray(arr) { return ( isStrictTypedArray(arr) || isLooseTypedArray(arr) ) } function isStrictTypedArray(arr) { return ( arr instanceof Int8Array || arr instanceof Int16Array || arr instanceof Int32Array || arr instanceof Uint8Array || arr instanceof Uint8ClampedArray || arr instanceof Uint16Array || arr instanceof Uint32Array || arr instanceof Float32Array || arr instanceof Float64Array ) } function isLooseTypedArray(arr) { return names[toString.call(arr)] } },{}],209:[function(require,module,exports){ arguments[4][94][0].apply(exports,arguments) },{"dup":94}],210:[function(require,module,exports){ (function (Buffer){ var varint = require('varint') var stream = require('readable-stream') var util = require('util') var Decoder = function (opts) { if (!(this instanceof Decoder)) return new Decoder(opts) stream.Transform.call(this) this._missing = 0 this._message = null this._limit = opts && opts.limit || 0 this._prefix = new Buffer(this._limit ? varint.encodingLength(this._limit) : 100) this._ptr = 0 } util.inherits(Decoder, stream.Transform) Decoder.prototype._push = function (message) { this._ptr = 0 this._missing = 0 this._message = null this.push(message) } Decoder.prototype._parseLength = function (data, offset) { for (offset; offset < data.length; offset++) { if (this._ptr >= this._prefix.length) return this._prefixError(data) this._prefix[this._ptr++] = data[offset] if (!(data[offset] & 0x80)) { this._missing = varint.decode(this._prefix) if (this._limit && this._missing > this._limit) return this._prefixError(data) this._ptr = 0 return offset + 1 } } return data.length } Decoder.prototype._prefixError = function (data) { this.emit('error', new Error('Message is larger than max length')) return data.length } Decoder.prototype._parseMessage = function (data, offset) { var free = data.length - offset var missing = this._missing if (!this._message) { if (missing <= free)="" {="" fast="" track="" -="" no="" copy="" this._push(data.slice(offset,="" offset="" +="" missing))="" return="" missing="" }="" this._message="new" buffer(missing)="" todo:="" add="" opt-in="" "partial="" mode"="" to="" completely="" avoid="" copys="" data.copy(this._message,="" this._ptr,="" offset,="" missing)="" if="" (missing="" <="free)" this._push(this._message)="" this._missing="" this._ptr="" data.length="" decoder.prototype._transform="function" (data,="" enc,="" cb)="" var="" while="" (offset="" data.length)="" (this._missing)="" offset)="" else="" cb()="" module.exports="Decoder" }).call(this,require("buffer").buffer)="" },{"buffer":45,"readable-stream":218,"util":135,"varint":290}],211:[function(require,module,exports){="" (function="" (buffer){="" varint="require('varint')" stream="require('readable-stream')" util="require('util')" pool="new" buffer(10="" *="" 1024)="" used="0" encoder="function" ()="" (!(this="" instanceof="" encoder))="" new="" encoder()="" stream.transform.call(this)="" util.inherits(encoder,="" stream.transform)="" encoder.prototype._transform="function" varint.encode(data.length,="" pool,="" used)="" this.push(pool.slice(used="" varint.encode.bytes,="" used))="" this.push(data)="" (pool.length="" 100)="" },{"buffer":45,"readable-stream":218,"util":135,"varint":290}],212:[function(require,module,exports){="" exports.encode="require('./encode')" exports.decode="require('./decode')" },{".="" decode":210,".="" encode":211}],213:[function(require,module,exports){="" arguments[4][113][0].apply(exports,arguments)="" _stream_readable":215,".="" _stream_writable":217,"core-util-is":150,"dup":113,"inherits":204,"process-nextick-args":243}],214:[function(require,module,exports){="" arguments[4][114][0].apply(exports,arguments)="" _stream_transform":216,"core-util-is":150,"dup":114,"inherits":204}],215:[function(require,module,exports){="" (process){="" 'use="" strict';="" **/ var processNextTick = require('process-nextick-args'); /**/ /**/ var isArray = require('isarray'); /**/ /**/ var Buffer = require('buffer').Buffer; /**/ Readable.ReadableState = ReadableState; var EE = require('events'); /**/ var EElistenerCount = function(emitter, type) { return emitter.listeners(type).length; }; /**/ /**/ var Stream; (function (){try{ Stream = require('st' + 'ream'); }catch(_){}finally{ if (!Stream) Stream = require('events').EventEmitter; }}()) /**/ var Buffer = require('buffer').Buffer; /**/ var util = require('core-util-is'); util.inherits = require('inherits'); /**/ /**/ var debugUtil = require('util'); var debug; if (debugUtil && debugUtil.debuglog) { debug = debugUtil.debuglog('stream'); } else { debug = function () {}; } /**/ var StringDecoder; util.inherits(Readable, Stream); var Duplex; function ReadableState(options, stream) { Duplex = Duplex || require('./_stream_duplex'); options = options || {}; // object stream flag. Used to make read(n) ignore n and to // make all the buffer merging and length checks go away this.objectMode = !!options.objectMode; if (stream instanceof Duplex) this.objectMode = this.objectMode || !!options.readableObjectMode; // the point at which it stops calling _read() to fill the buffer // Note: 0 is a valid value, means "don't call _read preemptively ever" var hwm = options.highWaterMark; var defaultHwm = this.objectMode ? 16 : 16 * 1024; this.highWaterMark = (hwm || hwm === 0) ? hwm : defaultHwm; // cast to ints. this.highWaterMark = ~~this.highWaterMark; this.buffer = []; this.length = 0; this.pipes = null; this.pipesCount = 0; this.flowing = null; this.ended = false; this.endEmitted = false; this.reading = false; // a flag to be able to tell if the onwrite cb is called immediately, // or on a later tick. We set this to true at first, because any // actions that shouldn't happen until "later" should generally also // not happen before the first write call. this.sync = true; // whenever we return null, then we set a flag to say // that we're awaiting a 'readable' event emission. this.needReadable = false; this.emittedReadable = false; this.readableListening = false; // Crypto is kind of old and crusty. Historically, its default string // encoding is 'binary' so we have to make this configurable. // Everything else in the universe uses 'utf8', though. this.defaultEncoding = options.defaultEncoding || 'utf8'; // when piping, we only care about 'readable' events that happen // after read()ing all the bytes and not getting any pushback. this.ranOut = false; // the number of writers that are awaiting a drain event in .pipe()s this.awaitDrain = 0; // if true, a maybeReadMore has been scheduled this.readingMore = false; this.decoder = null; this.encoding = null; if (options.encoding) { if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder; this.decoder = new StringDecoder(options.encoding); this.encoding = options.encoding; } } var Duplex; function Readable(options) { Duplex = Duplex || require('./_stream_duplex'); if (!(this instanceof Readable)) return new Readable(options); this._readableState = new ReadableState(options, this); // legacy this.readable = true; if (options && typeof options.read === 'function') this._read = options.read; Stream.call(this); } // Manually shove something into the read() buffer. // This returns true if the highWaterMark has not been hit yet, // similar to how Writable.write() returns true if you should // write() some more. Readable.prototype.push = function(chunk, encoding) { var state = this._readableState; if (!state.objectMode && typeof chunk === 'string') { encoding = encoding || state.defaultEncoding; if (encoding !== state.encoding) { chunk = new Buffer(chunk, encoding); encoding = ''; } } return readableAddChunk(this, state, chunk, encoding, false); }; // Unshift should *always* be something directly out of read() Readable.prototype.unshift = function(chunk) { var state = this._readableState; return readableAddChunk(this, state, chunk, '', true); }; Readable.prototype.isPaused = function() { return this._readableState.flowing === false; }; function readableAddChunk(stream, state, chunk, encoding, addToFront) { var er = chunkInvalid(state, chunk); if (er) { stream.emit('error', er); } else if (chunk === null) { state.reading = false; onEofChunk(stream, state); } else if (state.objectMode || chunk && chunk.length > 0) { if (state.ended && !addToFront) { var e = new Error('stream.push() after EOF'); stream.emit('error', e); } else if (state.endEmitted && addToFront) { var e = new Error('stream.unshift() after end event'); stream.emit('error', e); } else { if (state.decoder && !addToFront && !encoding) chunk = state.decoder.write(chunk); if (!addToFront) state.reading = false; // if we want the data now, just emit it. if (state.flowing && state.length === 0 && !state.sync) { stream.emit('data', chunk); stream.read(0); } else { // update the buffer info. state.length += state.objectMode ? 1 : chunk.length; if (addToFront) state.buffer.unshift(chunk); else state.buffer.push(chunk); if (state.needReadable) emitReadable(stream); } maybeReadMore(stream, state); } } else if (!addToFront) { state.reading = false; } return needMoreData(state); } // if it's past the high water mark, we can push in some more. // Also, if we have no data yet, we can stand some // more bytes. This is to work around cases where hwm=0, // such as the repl. Also, if the push() triggered a // readable event, and the user called read(largeNumber) such that // needReadable was set, then we ought to push more, so that another // 'readable' event will be triggered. function needMoreData(state) { return !state.ended && (state.needReadable || state.length < state.highWaterMark || state.length === 0); } // backwards compatibility. Readable.prototype.setEncoding = function(enc) { if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder; this._readableState.decoder = new StringDecoder(enc); this._readableState.encoding = enc; return this; }; // Don't raise the hwm > 8MB var MAX_HWM = 0x800000; function computeNewHighWaterMark(n) { if (n >= MAX_HWM) { n = MAX_HWM; } else { // Get the next highest power of 2 n--; n |= n >>> 1; n |= n >>> 2; n |= n >>> 4; n |= n >>> 8; n |= n >>> 16; n++; } return n; } function howMuchToRead(n, state) { if (state.length === 0 && state.ended) return 0; if (state.objectMode) return n === 0 ? 0 : 1; if (n === null || isNaN(n)) { // only flow one buffer at a time if (state.flowing && state.buffer.length) return state.buffer[0].length; else return state.length; } if (n <= 0)="" return="" 0;="" if="" we're="" asking="" for="" more="" than="" the="" target="" buffer="" level,="" then="" raise="" water="" mark.="" bump="" up="" to="" next="" highest="" power="" of="" 2,="" prevent="" increasing="" it="" excessively="" in="" tiny="" amounts.="" (n=""> state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n); // don't have that much. return null, unless we've ended. if (n > state.length) { if (!state.ended) { state.needReadable = true; return 0; } else { return state.length; } } return n; } // you can override either this method, or the async _read(n) below. Readable.prototype.read = function(n) { debug('read', n); var state = this._readableState; var nOrig = n; if (typeof n !== 'number' || n > 0) state.emittedReadable = false; // if we're doing read(0) to trigger a readable event, but we // already have a bunch of data in the buffer, then just trigger // the 'readable' event and move on. if (n === 0 && state.needReadable && (state.length >= state.highWaterMark || state.ended)) { debug('read: emitReadable', state.length, state.ended); if (state.length === 0 && state.ended) endReadable(this); else emitReadable(this); return null; } n = howMuchToRead(n, state); // if we've ended, and we're now clear, then finish it up. if (n === 0 && state.ended) { if (state.length === 0) endReadable(this); return null; } // All the actual chunk generation logic needs to be // *below* the call to _read. The reason is that in certain // synthetic stream cases, such as passthrough streams, _read // may be a completely synchronous operation which may change // the state of the read buffer, providing enough data when // before there was *not* enough. // // So, the steps are: // 1. Figure out what the state of things will be after we do // a read from the buffer. // // 2. If that resulting state will trigger a _read, then call _read. // Note that this may be asynchronous, or synchronous. Yes, it is // deeply ugly to write APIs this way, but that still doesn't mean // that the Readable class should behave improperly, as streams are // designed to be sync/async agnostic. // Take note if the _read call is sync or async (ie, if the read call // has returned yet), so that we know whether or not it's safe to emit // 'readable' etc. // // 3. Actually pull the requested chunks out of the buffer and return. // if we need a readable event, then we need to do some reading. var doRead = state.needReadable; debug('need readable', doRead); // if we currently have less than the highWaterMark, then also read some if (state.length === 0 || state.length - n < state.highWaterMark) { doRead = true; debug('length less than watermark', doRead); } // however, if we've ended, then there's no point, and if we're already // reading, then it's unnecessary. if (state.ended || state.reading) { doRead = false; debug('reading or ended', doRead); } if (doRead) { debug('do read'); state.reading = true; state.sync = true; // if the length is currently zero, then we *need* a readable event. if (state.length === 0) state.needReadable = true; // call internal read method this._read(state.highWaterMark); state.sync = false; } // If _read pushed data synchronously, then `reading` will be false, // and we need to re-evaluate how much data we can return to the user. if (doRead && !state.reading) n = howMuchToRead(nOrig, state); var ret; if (n > 0) ret = fromList(n, state); else ret = null; if (ret === null) { state.needReadable = true; n = 0; } state.length -= n; // If we have nothing in the buffer, then we want to know // as soon as we *do* get something into the buffer. if (state.length === 0 && !state.ended) state.needReadable = true; // If we tried to read() past the EOF, then emit end on the next tick. if (nOrig !== n && state.ended && state.length === 0) endReadable(this); if (ret !== null) this.emit('data', ret); return ret; }; function chunkInvalid(state, chunk) { var er = null; if (!(Buffer.isBuffer(chunk)) && typeof chunk !== 'string' && chunk !== null && chunk !== undefined && !state.objectMode) { er = new TypeError('Invalid non-string/buffer chunk'); } return er; } function onEofChunk(stream, state) { if (state.ended) return; if (state.decoder) { var chunk = state.decoder.end(); if (chunk && chunk.length) { state.buffer.push(chunk); state.length += state.objectMode ? 1 : chunk.length; } } state.ended = true; // emit 'readable' now to make sure it gets picked up. emitReadable(stream); } // Don't emit readable right away in sync mode, because this can trigger // another read() call => stack overflow. This way, it might trigger // a nextTick recursion warning, but that's not so bad. function emitReadable(stream) { var state = stream._readableState; state.needReadable = false; if (!state.emittedReadable) { debug('emitReadable', state.flowing); state.emittedReadable = true; if (state.sync) processNextTick(emitReadable_, stream); else emitReadable_(stream); } } function emitReadable_(stream) { debug('emit readable'); stream.emit('readable'); flow(stream); } // at this point, the user has presumably seen the 'readable' event, // and called read() to consume some data. that may have triggered // in turn another _read(n) call, in which case reading = true if // it's in progress. // However, if we're not ended, or reading, and the length < hwm, // then go ahead and try to read some more preemptively. function maybeReadMore(stream, state) { if (!state.readingMore) { state.readingMore = true; processNextTick(maybeReadMore_, stream, state); } } function maybeReadMore_(stream, state) { var len = state.length; while (!state.reading && !state.flowing && !state.ended && state.length < state.highWaterMark) { debug('maybeReadMore read 0'); stream.read(0); if (len === state.length) // didn't get any data, stop spinning. break; else len = state.length; } state.readingMore = false; } // abstract method. to be overridden in specific implementation classes. // call cb(er, data) where data is <= 0="" 1="" n="" in="" length.="" for="" virtual="" (non-string,="" non-buffer)="" streams,="" "length"="" is="" somewhat="" arbitrary,="" and="" perhaps="" not="" very="" meaningful.="" readable.prototype._read="function(n)" {="" this.emit('error',="" new="" error('not="" implemented'));="" };="" readable.prototype.pipe="function(dest," pipeopts)="" var="" src="this;" state="this._readableState;" switch="" (state.pipescount)="" case="" 0:="" state.pipes="dest;" break;="" 1:="" dest];="" default:="" state.pipes.push(dest);="" }="" state.pipescount="" +="1;" debug('pipe="" count="%d" opts="%j'," state.pipescount,="" pipeopts);="" doend="(!pipeOpts" ||="" pipeopts.end="" !="=" false)="" &&="" dest="" process.stdout="" process.stderr;="" endfn="doEnd" ?="" onend="" :="" cleanup;="" if="" (state.endemitted)="" processnexttick(endfn);="" else="" src.once('end',="" endfn);="" dest.on('unpipe',="" onunpipe);="" function="" onunpipe(readable)="" debug('onunpipe');="" (readable="==" src)="" cleanup();="" onend()="" debug('onend');="" dest.end();="" when="" the="" drains,="" it="" reduces="" awaitdrain="" counter="" on="" source.="" this="" would="" be="" more="" elegant="" with="" a="" .once()="" handler="" flow(),="" but="" adding="" removing="" repeatedly="" too="" slow.="" ondrain="pipeOnDrain(src);" dest.on('drain',="" ondrain);="" cleanedup="false;" cleanup()="" debug('cleanup');="" cleanup="" event="" handlers="" once="" pipe="" broken="" dest.removelistener('close',="" onclose);="" dest.removelistener('finish',="" onfinish);="" dest.removelistener('drain',="" dest.removelistener('error',="" onerror);="" dest.removelistener('unpipe',="" src.removelistener('end',="" onend);="" cleanup);="" src.removelistener('data',="" ondata);="" reader="" waiting="" drain="" from="" specific="" writer,="" then="" cause="" to="" never="" start="" flowing="" again.="" so,="" awaiting="" drain,="" we="" just="" call="" now.="" don't="" know,="" assume="" that="" are="" one.="" (state.awaitdrain="" (!dest._writablestate="" dest._writablestate.needdrain))="" ondrain();="" src.on('data',="" ondata(chunk)="" debug('ondata');="" ret="dest.write(chunk);" (false="==" ret)="" user="" unpiped="" during="" `dest.write()`,="" possible="" get="" stuck="" permanently="" paused="" write="" also="" returned="" false.="" (state.pipescount="==" state.pipes[0]="==" src.listenercount('data')="==" !cleanedup)="" debug('false="" response,="" pause',="" src._readablestate.awaitdrain);="" src._readablestate.awaitdrain++;="" src.pause();="" has="" an="" error,="" stop="" piping="" into="" it.="" however,="" suppress="" throwing="" behavior="" this.="" onerror(er)="" debug('onerror',="" er);="" unpipe();="" (eelistenercount(dest,="" 'error')="==" 0)="" dest.emit('error',="" brutally="" ugly="" hack="" make="" sure="" our="" error="" attached="" before="" any="" userland="" ones.="" do="" (!dest._events="" !dest._events.error)="" dest.on('error',="" (isarray(dest._events.error))="" dest._events.error.unshift(onerror);="" dest._events.error="[onerror," dest._events.error];="" both="" close="" finish="" should="" trigger="" unpipe,="" only="" once.="" onclose()="" dest.once('close',="" onfinish()="" debug('onfinish');="" dest.once('finish',="" unpipe()="" debug('unpipe');="" src.unpipe(dest);="" tell="" it's="" being="" piped="" dest.emit('pipe',="" src);="" flow="" hasn't="" been="" started="" already.="" (!state.flowing)="" resume');="" src.resume();="" return="" dest;="" pipeondrain(src)="" function()="" debug('pipeondrain',="" state.awaitdrain);="" (state.awaitdrain)="" state.awaitdrain--;="" eelistenercount(src,="" 'data'))="" state.flowing="true;" flow(src);="" readable.prototype.unpipe="function(dest)" we're="" anywhere,="" nothing.="" this;="" one="" destination.="" most="" common="" case.="" 1)="" passed="" one,="" right="" (dest="" state.pipes)="" (!dest)="" got="" match.="" (dest)="" dest.emit('unpipe',="" this);="" slow="" multiple destinations.="" remove="" all.="" dests="state.pipes;" len="state.pipesCount;" (var="" i="0;" <="" len;="" i++)="" dests[i].emit('unpipe',="" try="" find="" dest);="" (i="==" -1)="" state.pipes.splice(i,="" 1);="" -="1;" set="" up="" data="" events="" they="" asked="" ensure="" readable="" listeners="" eventually="" something="" readable.prototype.on="function(ev," fn)="" res="Stream.prototype.on.call(this," ev,="" fn);="" listening="" data,="" explicitly="" paused,="" resume="" of="" next="" tick.="" (ev="==" 'data'="" false="" this._readablestate.flowing)="" this.resume();="" 'readable'="" this.readable)="" (!state.readablelistening)="" state.readablelistening="true;" state.emittedreadable="false;" state.needreadable="true;" (!state.reading)="" processnexttick(nreadingnexttick,="" (state.length)="" emitreadable(this,="" state);="" res;="" readable.prototype.addlistener="Readable.prototype.on;" nreadingnexttick(self)="" debug('readable="" nexttick="" read="" 0');="" self.read(0);="" pause()="" resume()="" remnants="" legacy="" stream="" api="" uses="" them,="" old="" mode.="" readable.prototype.resume="function()" debug('resume');="" resume(this,="" resume(stream,="" state)="" (!state.resumescheduled)="" state.resumescheduled="true;" processnexttick(resume_,="" stream,="" resume_(stream,="" debug('resume="" stream.read(0);="" stream.emit('resume');="" flow(stream);="" (state.flowing="" !state.reading)="" readable.prototype.pause="function()" debug('call="" pause="" this._readablestate.flowing);="" debug('pause');="" this._readablestate.flowing="false;" this.emit('pause');="" flow(stream)="" debug('flow',="" state.flowing);="" (state.flowing)="" chunk="stream.read();" while="" (null="" wrap="" old-style="" as="" async *not*="" part="" interface.="" unfortunate="" mess="" history.="" readable.prototype.wrap="function(stream)" self="this;" stream.on('end',="" debug('wrapped="" end');="" (state.decoder="" !state.ended)="" (chunk="" chunk.length)="" self.push(chunk);="" self.push(null);="" });="" stream.on('data',="" function(chunk)="" data');="" (state.decoder)="" skip="" over="" falsy="" values="" objectmode="" (state.objectmode="" null="" undefined))="" return;="" (!state.objectmode="" (!chunk="" !chunk.length))="" (!ret)="" stream.pause();="" proxy="" all="" other="" methods.="" important="" wrapping="" filters="" duplexes.="" stream)="" (this[i]="==" undefined="" typeof="" stream[i]="==" 'function')="" this[i]="function(method)" stream[method].apply(stream,="" arguments);="" }(i);="" certain="" events.="" 'close',="" 'destroy',="" 'pause',="" 'resume'];="" foreach(events,="" function(ev)="" stream.on(ev,="" self.emit.bind(self,="" ev));="" consume="" some="" bytes,="" simply="" unpause="" underlying="" stream.="" self._read="function(n)" _read',="" n);="" (paused)="" stream.resume();="" self;="" exposed="" testing="" purposes="" only.="" readable._fromlist="fromList;" pluck="" off="" bytes="" array="" buffers.="" length="" combined="" lengths="" buffers="" list.="" fromlist(n,="" list="state.buffer;" stringmode="!!state.decoder;" ret;="" nothing="" list,="" definitely="" empty.="" (list.length="==" null;="" (length="==" (objectmode)="" (!n="">= length) { // read it all, truncate the array. if (stringMode) ret = list.join(''); else if (list.length === 1) ret = list[0]; else ret = Buffer.concat(list, length); list.length = 0; } else { // read just some of it. if (n < list[0].length) { // just take a part of the first list item. // slice is the same for buffers and strings. var buf = list[0]; ret = buf.slice(0, n); list[0] = buf.slice(n); } else if (n === list[0].length) { // first list is a perfect match ret = list.shift(); } else { // complex case. // we have enough to cover it, but it spans past the first buffer. if (stringMode) ret = ''; else ret = new Buffer(n); var c = 0; for (var i = 0, l = list.length; i < l && c < n; i++) { var buf = list[0]; var cpy = Math.min(n - c, buf.length); if (stringMode) ret += buf.slice(0, cpy); else buf.copy(ret, c, 0, cpy); if (cpy < buf.length) list[0] = buf.slice(cpy); else list.shift(); c += cpy; } } } return ret; } function endReadable(stream) { var state = stream._readableState; // If we get here before consuming all the bytes, then that is a // bug in node. Should never happen. if (state.length > 0) throw new Error('endReadable called on non-empty stream'); if (!state.endEmitted) { state.ended = true; processNextTick(endReadableNT, state, stream); } } function endReadableNT(state, stream) { // Check that we didn't get one last unshift. if (!state.endEmitted && state.length === 0) { state.endEmitted = true; stream.readable = false; stream.emit('end'); } } function forEach (xs, f) { for (var i = 0, l = xs.length; i < l; i++) { f(xs[i], i); } } function indexOf (xs, x) { for (var i = 0, l = xs.length; i < l; i++) { if (xs[i] === x) return i; } return -1; } }).call(this,require('_process')) },{"./_stream_duplex":213,"_process":104,"buffer":45,"core-util-is":150,"events":82,"inherits":204,"isarray":209,"process-nextick-args":243,"string_decoder/":272,"util":19}],216:[function(require,module,exports){ arguments[4][116][0].apply(exports,arguments) },{"./_stream_duplex":213,"core-util-is":150,"dup":116,"inherits":204}],217:[function(require,module,exports){ arguments[4][117][0].apply(exports,arguments) },{"./_stream_duplex":213,"buffer":45,"core-util-is":150,"dup":117,"events":82,"inherits":204,"process-nextick-args":243,"util-deprecate":287}],218:[function(require,module,exports){ arguments[4][119][0].apply(exports,arguments) },{"./lib/_stream_duplex.js":213,"./lib/_stream_passthrough.js":214,"./lib/_stream_readable.js":215,"./lib/_stream_transform.js":216,"./lib/_stream_writable.js":217,"dup":119}],219:[function(require,module,exports){ var encodings = require('./lib/encodings'); module.exports = Codec; function Codec(opts){ this.opts = opts || {}; this.encodings = encodings; } Codec.prototype._encoding = function(encoding){ if (typeof encoding == 'string') encoding = encodings[encoding]; if (!encoding) encoding = encodings.id; return encoding; }; Codec.prototype._keyEncoding = function(opts, batchOpts){ return this._encoding(batchOpts && batchOpts.keyEncoding || opts && opts.keyEncoding || this.opts.keyEncoding); }; Codec.prototype._valueEncoding = function(opts, batchOpts){ return this._encoding( batchOpts && (batchOpts.valueEncoding || batchOpts.encoding) || opts && (opts.valueEncoding || opts.encoding) || (this.opts.valueEncoding || this.opts.encoding)); }; Codec.prototype.encodeKey = function(key, opts, batchOpts){ return this._keyEncoding(opts, batchOpts).encode(key); }; Codec.prototype.encodeValue = function(value, opts, batchOpts){ return this._valueEncoding(opts, batchOpts).encode(value); }; Codec.prototype.decodeKey = function(key, opts){ return this._keyEncoding(opts).decode(key); }; Codec.prototype.decodeValue = function(value, opts){ return this._valueEncoding(opts).decode(value); }; Codec.prototype.encodeBatch = function(ops, opts){ var self = this; return ops.map(function(_op){ var op = { type: _op.type, key: self.encodeKey(_op.key, opts, _op) }; if (self.keyAsBuffer(opts, _op)) op.keyEncoding = 'binary'; if (_op.prefix) op.prefix = _op.prefix; if ('value' in _op) { op.value = self.encodeValue(_op.value, opts, _op); if (self.valueAsBuffer(opts, _op)) op.valueEncoding = 'binary'; } return op; }); }; var ltgtKeys = ['lt', 'gt', 'lte', 'gte', 'start', 'end']; Codec.prototype.encodeLtgt = function(ltgt){ var self = this; var ret = {}; Object.keys(ltgt).forEach(function(key){ ret[key] = ltgtKeys.indexOf(key) > -1 ? self.encodeKey(ltgt[key], ltgt) : ltgt[key] }); return ret; }; Codec.prototype.createStreamDecoder = function(opts){ var self = this; if (opts.keys && opts.values) { return function(key, value){ return { key: self.decodeKey(key, opts), value: self.decodeValue(value, opts) }; }; } else if (opts.keys) { return function(key) { return self.decodeKey(key, opts); }; } else if (opts.values) { return function(_, value){ return self.decodeValue(value, opts); } } else { return function(){}; } }; Codec.prototype.keyAsBuffer = function(opts){ return this._keyEncoding(opts).buffer; }; Codec.prototype.valueAsBuffer = function(opts){ return this._valueEncoding(opts).buffer; }; },{"./lib/encodings":220}],220:[function(require,module,exports){ (function (Buffer){ exports.utf8 = exports['utf-8'] = { encode: function(data){ return isBinary(data) ? data : String(data); }, decode: identity, buffer: false, type: 'utf8' }; exports.json = { encode: JSON.stringify, decode: JSON.parse, buffer: false, type: 'json' }; exports.binary = { encode: function(data){ return isBinary(data) ? data : new Buffer(data); }, decode: identity, buffer: true, type: 'binary' }; exports.id = { encode: function(data){ return data; }, decode: function(data){ return data; }, buffer: false, type: 'id' }; var bufferEncodings = [ 'hex', 'ascii', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le' ]; bufferEncodings.forEach(function(type){ exports[type] = { encode: function(data){ return isBinary(data) ? data : new Buffer(data, type); }, decode: function(buffer){ return buffer.toString(type); }, buffer: true, type: type }; }); function identity(value){ return value; } function isBinary(data){ return data === undefined || data === null || Buffer.isBuffer(data); } }).call(this,require("buffer").Buffer) },{"buffer":45}],221:[function(require,module,exports){ var mutexify = require('mutexify') var enumerator = function (db, opts) { if (!opts) opts = {} var sep = opts.sep || '!' var prefix = opts.prefix ? sep + opts.prefix + sep : '' var keyPrefix = prefix + sep var count = 0 var lock = mutexify() var getCount = function (cb) { if (count) return cb(null, count) db.get(keyPrefix, {valueEncoding: 'utf-8'}, function (err, cnt) { if (err && !err.notFound) return cb(err) count = Number(cnt || 0) cb(null, count) }) } var insert = function (prevCount, key, cb) { lock(function (release) { var inc = function() { getCount(function(err, cnt) { if (err) return release(cb, err) var batch = [{ type: 'put', key: key, valueEncoding: 'utf-8', value: count.toString() }, { type: 'put', key: keyPrefix, valueEncoding: 'utf-8', value: (count + 1).toString() }] db.batch(batch, function (err) { if (err) return release(cb, err) count++ release(cb, null, count - 1) }) }) } if (prevCount === count) return inc() db.get(key, {valueEncoding: 'utf-8'}, function (err, num) { if (err && !err.notFound) return release(cb, err) if (num) return release(cb, null, Number(num)) inc() }) }) } return function (key, cb) { if (!key) throw new Error('key is required') key = keyPrefix + key db.get(key, {valueEncoding: 'utf-8'}, function (err, num) { if (err && !err.notFound) return cb(err) if (num) return cb(null, Number(num)) insert(count, key, cb) }) } } module.exports = enumerator },{"mutexify":238}],222:[function(require,module,exports){ /* Copyright (c) 2012-2015 LevelUP contributors * See list at * MIT License * */ var createError = require('errno').create , LevelUPError = createError('LevelUPError') , NotFoundError = createError('NotFoundError', LevelUPError) NotFoundError.prototype.notFound = true NotFoundError.prototype.status = 404 module.exports = { LevelUPError : LevelUPError , InitializationError : createError('InitializationError', LevelUPError) , OpenError : createError('OpenError', LevelUPError) , ReadError : createError('ReadError', LevelUPError) , WriteError : createError('WriteError', LevelUPError) , NotFoundError : NotFoundError , EncodingError : createError('EncodingError', LevelUPError) } },{"errno":167}],223:[function(require,module,exports){ var inherits = require('inherits'); var Readable = require('readable-stream').Readable; var extend = require('xtend'); var EncodingError = require('level-errors').EncodingError; module.exports = ReadStream; inherits(ReadStream, Readable); function ReadStream(iterator, options){ if (!(this instanceof ReadStream)) return new ReadStream(iterator, options); Readable.call(this, extend(options, { objectMode: true })); this._iterator = iterator; this._destroyed = false; this._decoder = null; if (options && options.decoder) this._decoder = options.decoder; this.on('end', this._cleanup.bind(this)); } ReadStream.prototype._read = function(){ var self = this; if (this._destroyed) return; this._iterator.next(function(err, key, value){ if (self._destroyed) return; if (err) return self.emit('error', err); if (key === undefined && value === undefined) { self.push(null); } else { if (!self._decoder) return self.push({ key: key, value: value }); try { var value = self._decoder(key, value); } catch (err) { self.emit('error', new EncodingError(err)); self.push(null); return; } self.push(value); } }); }; ReadStream.prototype.destroy = ReadStream.prototype._cleanup = function(){ var self = this; if (this._destroyed) return; this._destroyed = true; this._iterator.end(function(err){ if (err) return self.emit('error', err); self.emit('close'); }); }; },{"inherits":204,"level-errors":222,"readable-stream":259,"xtend":330}],224:[function(require,module,exports){ var lexint = require('lexicographic-integer') var collect = require('stream-collector') var through = require('through2') var from = require('from2') var pump = require('pump') var noop = function () {} var Logs = function (db, opts) { if (!(this instanceof Logs)) return new Logs(db, opts) if (!opts) opts = {} this.db = db this.sep = opts.separator || opts.sep || '!' this.prefix = opts.prefix ? this.sep + opts.prefix + this.sep : '' this.valueEncoding = opts.valueEncoding } Logs.prototype.key = function (log, seq) { return this.prefix + log + this.sep + (seq === -1 ? '\xff' : lexint.pack(seq, 'hex')) } Logs.prototype.list = function (cb) { var self = this var prev = this.prefix var rs = from.obj(function (size, cb) { collect(self.db.createKeyStream({gt: prev, limit: 1}), function (err, keys) { if (err) return cb(err) if (!keys.length) return cb(null, null) var log = keys[0].slice(0, keys[0].lastIndexOf(self.sep)) prev = self.key(log, -1) cb(null, log) }) }) return collect(rs, cb) } Logs.prototype.get = function (log, seq, cb) { this.db.get(this.key(log, seq), {valueEncoding: this.valueEncoding}, cb) } Logs.prototype.put = function (log, seq, value, cb) { this.db.put(this.key(log, seq), value, {valueEncoding: this.valueEncoding}, cb) } Logs.prototype.append = function (log, value, cb) { if (!cb) cb = noop var self = this this.head(log, function (err, seq) { if (err) return cb(err) self.put(log, seq + 1, value, function (err) { if (err) return cb(err) cb(null, seq + 1) }) }) } Logs.prototype.head = function (log, cb) { var self = this var keys = this.db.createKeyStream({ gt: this.key(log, 0), lt: this.key(log, -1), reverse: true, limit: 1 }) collect(keys, function (err, head) { if (err) return cb(err) cb(null, head.length ? lexint.unpack(head[0].slice(head[0].lastIndexOf(self.sep) + 1), 'hex') : 0) }) } Logs.prototype.createValueStream = function (log, opts) { if (!opts) opts = {} return this.db.createValueStream({ gt: this.key(log, opts.since || 0), lt: this.key(log, opts.until || -1), valueEncoding: this.valueEncoding, reverse: opts.reverse }) } Logs.prototype.createReadStream = function (log, opts) { if (!opts) opts = {} var self = this var rs = this.db.createReadStream({ gt: this.key(log, opts.since || 0), lt: this.key(log, opts.until || -1), valueEncoding: this.valueEncoding, reverse: opts.reverse }) var format = through.obj(function (data, enc, cb) { var key = data.key var log = key.slice(0, key.lastIndexOf(self.sep)) var seq = lexint.unpack(key.slice(log.length + 1), 'hex') cb(null, {log: log, seq: seq, value: data.value}) }) return pump(rs, format) } module.exports = Logs },{"from2":225,"lexicographic-integer":230,"pump":252,"stream-collector":270,"through2":285}],225:[function(require,module,exports){ (function (process){ var Readable = require('readable-stream').Readable var inherits = require('inherits') module.exports = from2 from2.ctor = ctor from2.obj = obj var Proto = ctor() function toFunction(list) { list = list.slice() return function (_, cb) { cb(null, list.length ? list.shift() : null) } } function from2(opts, read) { if (typeof opts !== 'object' || Array.isArray(opts)) { read = opts opts = {} } if (Array.isArray(read)) read = toFunction(read) var rs = new Proto(opts) rs._from = read return rs } function ctor(opts, read) { if (typeof opts === 'function') { read = opts opts = {} } opts = defaults(opts) inherits(Class, Readable) function Class(override) { if (!(this instanceof Class)) return new Class(override) this._reading = false this.destroyed = false Readable.call(this, override || opts) } Class.prototype._from = read Class.prototype._read = function(size) { var self = this if (this._reading || this.destroyed) return this._reading = true this._from(size, check) function check(err, data) { if (self.destroyed) return if (err) return self.destroy(err) if (data === null) return self.push(null) self._reading = false if (self.push(data)) self._read() } } Class.prototype.destroy = function(err) { if (this.destroyed) return this.destroyed = true var self = this process.nextTick(function() { if (err) self.emit('error', err) self.emit('close') }) } return Class } function obj(opts, read) { if (typeof opts === 'function' || Array.isArray(opts)) { read = opts opts = {} } opts = defaults(opts) opts.objectMode = true opts.highWaterMark = 16 return from2(opts, read) } function defaults(opts) { opts = opts || {} return opts } }).call(this,require('_process')) },{"_process":104,"inherits":204,"readable-stream":259}],226:[function(require,module,exports){ /* Copyright (c) 2012-2015 LevelUP contributors * See list at * MIT License * */ var util = require('./util') , WriteError = require('level-errors').WriteError , getOptions = util.getOptions , dispatchError = util.dispatchError function Batch (levelup, codec) { this._levelup = levelup this._codec = codec this.batch = levelup.db.batch() this.ops = [] this.length = 0 } Batch.prototype.put = function (key_, value_, options) { options = getOptions(options) var key = this._codec.encodeKey(key_, options) , value = this._codec.encodeValue(value_, options) try { this.batch.put(key, value) } catch (e) { throw new WriteError(e) } this.ops.push({ type : 'put', key : key, value : value }) this.length++ return this } Batch.prototype.del = function (key_, options) { options = getOptions(options) var key = this._codec.encodeKey(key_, options) try { this.batch.del(key) } catch (err) { throw new WriteError(err) } this.ops.push({ type : 'del', key : key }) this.length++ return this } Batch.prototype.clear = function () { try { this.batch.clear() } catch (err) { throw new WriteError(err) } this.ops = [] this.length = 0 return this } Batch.prototype.write = function (callback) { var levelup = this._levelup , ops = this.ops try { this.batch.write(function (err) { if (err) return dispatchError(levelup, new WriteError(err), callback) levelup.emit('batch', ops) if (callback) callback() }) } catch (err) { throw new WriteError(err) } } module.exports = Batch },{"./util":228,"level-errors":222}],227:[function(require,module,exports){ (function (process){ /* Copyright (c) 2012-2015 LevelUP contributors * See list at * MIT License * */ var EventEmitter = require('events').EventEmitter , inherits = require('util').inherits , deprecate = require('util').deprecate , extend = require('xtend') , prr = require('prr') , DeferredLevelDOWN = require('deferred-leveldown') , IteratorStream = require('level-iterator-stream') , errors = require('level-errors') , WriteError = errors.WriteError , ReadError = errors.ReadError , NotFoundError = errors.NotFoundError , OpenError = errors.OpenError , EncodingError = errors.EncodingError , InitializationError = errors.InitializationError , util = require('./util') , Batch = require('./batch') , Codec = require('level-codec') , getOptions = util.getOptions , defaultOptions = util.defaultOptions , getLevelDOWN = util.getLevelDOWN , dispatchError = util.dispatchError , isDefined = util.isDefined function getCallback (options, callback) { return typeof options == 'function' ? options : callback } // Possible LevelUP#_status values: // - 'new' - newly created, not opened or closed // - 'opening' - waiting for the database to be opened, post open() // - 'open' - successfully opened the database, available for use // - 'closing' - waiting for the database to be closed, post close() // - 'closed' - database has been successfully closed, should not be // used except for another open() operation function LevelUP (location, options, callback) { if (!(this instanceof LevelUP)) return new LevelUP(location, options, callback) var error EventEmitter.call(this) this.setMaxListeners(Infinity) if (typeof location == 'function') { options = typeof options == 'object' ? options : {} options.db = location location = null } else if (typeof location == 'object' && typeof location.db == 'function') { options = location location = null } if (typeof options == 'function') { callback = options options = {} } if ((!options || typeof options.db != 'function') && typeof location != 'string') { error = new InitializationError( 'Must provide a location for the database') if (callback) { return process.nextTick(function () { callback(error) }) } throw error } options = getOptions(options) this.options = extend(defaultOptions, options) this._codec = new Codec(this.options) this._status = 'new' // set this.location as enumerable but not configurable or writable prr(this, 'location', location, 'e') this.open(callback) } inherits(LevelUP, EventEmitter) LevelUP.prototype.open = function (callback) { var self = this , dbFactory , db if (this.isOpen()) { if (callback) process.nextTick(function () { callback(null, self) }) return this } if (this._isOpening()) { return callback && this.once( 'open' , function () { callback(null, self) } ) } this.emit('opening') this._status = 'opening' this.db = new DeferredLevelDOWN(this.location) dbFactory = this.options.db || getLevelDOWN() db = dbFactory(this.location) db.open(this.options, function (err) { if (err) { return dispatchError(self, new OpenError(err), callback) } else { self.db.setDb(db) self.db = db self._status = 'open' if (callback) callback(null, self) self.emit('open') self.emit('ready') } }) } LevelUP.prototype.close = function (callback) { var self = this if (this.isOpen()) { this._status = 'closing' this.db.close(function () { self._status = 'closed' self.emit('closed') if (callback) callback.apply(null, arguments) }) this.emit('closing') this.db = new DeferredLevelDOWN(this.location) } else if (this._status == 'closed' && callback) { return process.nextTick(callback) } else if (this._status == 'closing' && callback) { this.once('closed', callback) } else if (this._isOpening()) { this.once('open', function () { self.close(callback) }) } } LevelUP.prototype.isOpen = function () { return this._status == 'open' } LevelUP.prototype._isOpening = function () { return this._status == 'opening' } LevelUP.prototype.isClosed = function () { return (/^clos/).test(this._status) } function maybeError(db, options, callback) { if (!db._isOpening() && !db.isOpen()) { dispatchError( db , new ReadError('Database is not open') , callback ) return true } } function writeError (db, message, callback) { dispatchError( db , new WriteError(message) , callback ) } function readError (db, message, callback) { dispatchError( db , new ReadError(message) , callback ) } LevelUP.prototype.get = function (key_, options, callback) { var self = this , key callback = getCallback(options, callback) if (maybeError(this, options, callback)) return if (key_ === null || key_ === undefined || 'function' !== typeof callback) return readError(this , 'get() requires key and callback arguments', callback) options = util.getOptions(options) key = this._codec.encodeKey(key_, options) options.asBuffer = this._codec.valueAsBuffer(options) this.db.get(key, options, function (err, value) { if (err) { if ((/notfound/i).test(err) || err.notFound) { err = new NotFoundError( 'Key not found in database [' + key_ + ']', err) } else { err = new ReadError(err) } return dispatchError(self, err, callback) } if (callback) { try { value = self._codec.decodeValue(value, options) } catch (e) { return callback(new EncodingError(e)) } callback(null, value) } }) } LevelUP.prototype.put = function (key_, value_, options, callback) { var self = this , key , value callback = getCallback(options, callback) if (key_ === null || key_ === undefined) return writeError(this, 'put() requires a key argument', callback) if (maybeError(this, options, callback)) return options = getOptions(options) key = this._codec.encodeKey(key_, options) value = this._codec.encodeValue(value_, options) this.db.put(key, value, options, function (err) { if (err) { return dispatchError(self, new WriteError(err), callback) } else { self.emit('put', key_, value_) if (callback) callback() } }) } LevelUP.prototype.del = function (key_, options, callback) { var self = this , key callback = getCallback(options, callback) if (key_ === null || key_ === undefined) return writeError(this, 'del() requires a key argument', callback) if (maybeError(this, options, callback)) return options = getOptions(options) key = this._codec.encodeKey(key_, options) this.db.del(key, options, function (err) { if (err) { return dispatchError(self, new WriteError(err), callback) } else { self.emit('del', key_) if (callback) callback() } }) } LevelUP.prototype.batch = function (arr_, options, callback) { var self = this , keyEnc , valueEnc , arr if (!arguments.length) return new Batch(this, this._codec) callback = getCallback(options, callback) if (!Array.isArray(arr_)) return writeError(this, 'batch() requires an array argument', callback) if (maybeError(this, options, callback)) return options = getOptions(options) arr = self._codec.encodeBatch(arr_, options) arr = arr.map(function (op) { if (!op.type && op.key !== undefined && op.value !== undefined) op.type = 'put' return op }) this.db.batch(arr, options, function (err) { if (err) { return dispatchError(self, new WriteError(err), callback) } else { self.emit('batch', arr_) if (callback) callback() } }) } LevelUP.prototype.approximateSize = deprecate(function (start_, end_, options, callback) { var self = this , start , end callback = getCallback(options, callback) options = getOptions(options) if (start_ === null || start_ === undefined || end_ === null || end_ === undefined || 'function' !== typeof callback) return readError(this, 'approximateSize() requires start, end and callback arguments', callback) start = this._codec.encodeKey(start_, options) end = this._codec.encodeKey(end_, options) this.db.approximateSize(start, end, function (err, size) { if (err) { return dispatchError(self, new OpenError(err), callback) } else if (callback) { callback(null, size) } }) }, 'db.approximateSize() is deprecated. Use db.db.approximateSize() instead') LevelUP.prototype.readStream = LevelUP.prototype.createReadStream = function (options) { options = extend( {keys: true, values: true}, this.options, options) options.keyEncoding = options.keyEncoding options.valueEncoding = options.valueEncoding options = this._codec.encodeLtgt(options); options.keyAsBuffer = this._codec.keyAsBuffer(options) options.valueAsBuffer = this._codec.valueAsBuffer(options) if ('number' !== typeof options.limit) options.limit = -1 return new IteratorStream(this.db.iterator(options), extend(options, { decoder: this._codec.createStreamDecoder(options) })) } LevelUP.prototype.keyStream = LevelUP.prototype.createKeyStream = function (options) { return this.createReadStream(extend(options, { keys: true, values: false })) } LevelUP.prototype.valueStream = LevelUP.prototype.createValueStream = function (options) { return this.createReadStream(extend(options, { keys: false, values: true })) } LevelUP.prototype.toString = function () { return 'LevelUP' } function utilStatic (name) { return function (location, callback) { getLevelDOWN()[name](location, callback || function () {}) } } module.exports = LevelUP module.exports.errors = require('level-errors') module.exports.destroy = deprecate( utilStatic('destroy') , 'levelup.destroy() is deprecated. Use leveldown.destroy() instead' ) module.exports.repair = deprecate( utilStatic('repair') , 'levelup.repair() is deprecated. Use leveldown.repair() instead' ) }).call(this,require('_process')) },{"./batch":226,"./util":228,"_process":104,"deferred-leveldown":155,"events":82,"level-codec":219,"level-errors":222,"level-iterator-stream":223,"prr":251,"util":135,"xtend":330}],228:[function(require,module,exports){ /* Copyright (c) 2012-2015 LevelUP contributors * See list at * MIT License * */ var extend = require('xtend') , LevelUPError = require('level-errors').LevelUPError , format = require('util').format , defaultOptions = { createIfMissing : true , errorIfExists : false , keyEncoding : 'utf8' , valueEncoding : 'utf8' , compression : true } , leveldown function getOptions (options) { if (typeof options == 'string') options = { valueEncoding: options } if (typeof options != 'object') options = {} return options } function getLevelDOWN () { if (leveldown) return leveldown var requiredVersion = require('../package.json').devDependencies.leveldown , leveldownVersion try { leveldownVersion = require('leveldown/package').version } catch (e) { throw requireError(e) } if (!require('semver').satisfies(leveldownVersion, requiredVersion)) { throw new LevelUPError( 'Installed version of LevelDOWN (' + leveldownVersion + ') does not match required version (' + requiredVersion + ')' ) } try { return leveldown = require('leveldown') } catch (e) { throw requireError(e) } } function requireError (e) { var template = 'Failed to require LevelDOWN (%s). Try `npm install leveldown` if it\'s missing' return new LevelUPError(format(template, e.message)) } function dispatchError (db, error, callback) { typeof callback == 'function' ? callback(error) : db.emit('error', error) } function isDefined (v) { return typeof v !== 'undefined' } module.exports = { defaultOptions : defaultOptions , getOptions : getOptions , getLevelDOWN : getLevelDOWN , dispatchError : dispatchError , isDefined : isDefined } },{"../package.json":229,"level-errors":222,"leveldown":19,"leveldown/package":19,"semver":19,"util":135,"xtend":330}],229:[function(require,module,exports){ module.exports={ "_args": [ [ "levelup@~1.3.0", "/home/nervous/unisync/projects/multiplexed/hyperplate/node_modules/level-packager" ] ], "_from": "levelup@>=1.3.0 <1.4.0", "_id":="" "levelup@1.3.1",="" "_incache":="" true,="" "_installable":="" "_location":="" "="" levelup",="" "_nodeversion":="" "4.2.2",="" "_npmuser":="" {="" "email":="" "ralphtheninja@riseup.net",="" "name":="" "ralphtheninja"="" },="" "_npmversion":="" "3.5.0",="" "_phantomchildren":="" {},="" "_requested":="" "levelup",="" "raw":="" "levelup@~1.3.0",="" "rawspec":="" "~1.3.0",="" "scope":="" null,="" "spec":="">=1.3.0 <1.4.0", 0="" 1="" 2="" 3="" 4="" 5="" 251="" 255="" 256="" "type":="" "range"="" },="" "_requiredby":="" [="" "="" level-packager",="" memdb"="" ],="" "_resolved":="" "https:="" registry.npmjs.org="" levelup="" -="" levelup-1.3.1.tgz",="" "_shasum":="" "8030758bb1b1dafdb71bfb55fff0caa2740cb846",="" "_shrinkwrap":="" null,="" "_spec":="" "levelup@~1.3.0",="" "_where":="" home="" nervous="" unisync="" projects="" multiplexed="" hyperplate="" node_modules="" "browser":="" {="" "leveldown":="" false,="" "leveldown="" package":="" "semver":="" false="" "bugs":="" "url":="" github.com="" level="" issues"="" "contributors":="" "name":="" "julian="" gruber",="" "email":="" "julian@juliangruber.com",="" juliangruber"="" "rod="" vagg",="" "r@va.gg",="" rvagg"="" "jake="" verbaten",="" "raynos2@gmail.com",="" raynos"="" "dominic="" tarr",="" "dominic.tarr@gmail.com",="" dominictarr"="" "max="" ogden",="" "max@maxogden.com",="" maxogden"="" "lars-magnus="" skog",="" "ralphtheninja@riseup.net",="" ralphtheninja"="" "david="" björklund",="" "david.bjorklund@gmail.com",="" kesla"="" "john="" chesley",="" "john@chesl.es",="" chesles="" "paolo="" fragomeni",="" "paolo@async.ly",="" hij1nx"="" "anton="" whalley",="" "anton.whalley@nearform.com",="" no9"="" "matteo="" collina",="" "matteo.collina@gmail.com",="" mcollina"="" "pedro="" teixeira",="" "pedro.teixeira@gmail.com",="" pgte"="" "james="" halliday",="" "mail@substack.net",="" substack"="" "jarrett="" cruger",="" "jcrugzz@gmail.com",="" jcrugzz"="" }="" "dependencies":="" "deferred-leveldown":="" "~1.2.1",="" "level-codec":="" "~6.1.0",="" "level-errors":="" "~1.0.3",="" "level-iterator-stream":="" "~1.3.0",="" "prr":="" "~1.0.1",="" "~5.1.0",="" "xtend":="" "~4.0.0"="" "description":="" "fast="" &="" simple="" storage="" a="" node.js-style="" leveldb="" wrapper",="" "devdependencies":="" "async":="" "~1.5.0",="" "bustermove":="" "~1.0.0",="" "delayed":="" "faucet":="" "~0.0.1",="" "^1.1.0",="" "memdown":="" "~1.1.0",="" "msgpack-js":="" "~0.3.0",="" "referee":="" "~1.2.0",="" "rimraf":="" "~2.4.3",="" "slow-stream":="" "0.0.4",="" "tap":="" "~2.3.1",="" "tape":="" "~4.2.1"="" "directories":="" {},="" "dist":="" "shasum":="" "tarball":="" "http:="" levelup-1.3.1.tgz"="" "githead":="" "40bd66872974140c79a74d9411b992ddffa926a4",="" "homepage":="" levelup",="" "keywords":="" "database",="" "db",="" "json",="" "leveldb",="" "storage",="" "store",="" "stream"="" "license":="" "mit",="" "main":="" "lib="" levelup.js",="" "maintainers":="" "rvagg",="" "rod@vagg.org"="" "ralphtheninja",="" "ralphtheninja@riseup.net"="" "juliangruber",="" "julian@juliangruber.com"="" "levelup",="" "optionaldependencies":="" "readme":="" "error:="" no="" readme="" data="" found!",="" "repository":="" "git",="" "git+https:="" levelup.git"="" "scripts":="" "test":="" "tape="" test="" *-test.js="" |="" faucet"="" "version":="" "1.3.1"="" },{}],230:[function(require,module,exports){="" exports.pack="pack;" exports.unpack="unpack;" function="" pack="" (n,="" enc)="" n="Math.floor(n);" if="" (n="" <="" ||="" infinity)="" return="" undefined;="" var="" bytes;="" max="251;" x="n" max;="" max)="" bytes="[" ];="" else="" (x="" 256)="" max,="" 256*256)="" +="" 1,="" math.floor(x="" 256),="" %="" 256*256*256)="" 2,="" 256,="" 256*256*256*256)="" 3,="" exp="Math.floor(Math.log(x)" math.log(2))="" 32;="" bytes.push.apply(bytes,="" pack(exp));="" res="x" math.pow(2,="" 11);="" bytesof(x="" 11)));="" (enc="==" undefined="" enc="==" 'array')="" 'hex')="" encodehex(bytes);="" };="" unpack="" (xs)="" (typeof="" xs="==" 'string')="" (!array.isarray(xs))="" (xs.length="==" &&="" xs[0]="" 251)="" xs[0];="" xs[1];="" 252)="" *="" xs[1]="" xs[2];="" 253)="" xs[2]="" xs[3];="" 254)="" xs[3]="" xs[4]="" ;=""> 5 && xs[0] === 255) { var m = 0, x = 1; var pivot = Math.max(2, xs.length - 6); for (var i = xs.length - 1; i >= pivot; i--) { m += x * xs[i]; x *= 256; } if (xs[1] + 32 < 251) { var n = unpack([ xs[1] + 32 ]) - 11; } else if (xs[0] === 255 && xs[1] < 251) { var n = xs[1] + 21; } else if (pivot === 3) { var n = unpack([ xs[1], xs[2] + 21 ]); } else if (pivot === 4) { var n = unpack([ xs[1], xs[2], xs[3] + 21 ]); } return 251 + m / Math.pow(2, 32 - n); } return undefined; } function encodeHex(bytes) { var s = ''; for (var i = 0, l = bytes.length; i < l; i++) { var b = bytes[i]; var c = b.toString(16); if (b < 16) c = '0' + c; s += c; } return s; } function decodeHex(hex) { var bytes = []; for (var i = 0; i < hex.length; i = i+2) { bytes.push(parseInt(hex[i] + hex[i+1], 16)); } return bytes; } function bytesOf (x) { x = Math.floor(x); var bytes = []; for (var i = 0, d = 1; i < 6; i++, d *= 256) { bytes.unshift(Math.floor(x / d) % 256); } return bytes; } },{}],231:[function(require,module,exports){ (function (process){ (function (root, factory) { if (typeof process === "object" && typeof process.stdout === "undefined") { process.stderr = process.stdout = { write: function() { } }; } if (typeof define === "function" && define.amd) { define(["exports", "libsodium"], factory); } else if (typeof exports !== "undefined") { factory(exports, require("libsodium")); } else { var cb = root.sodium && root.sodium.onload; factory((root.sodium = {}), root.libsodium); if (typeof cb === "function") { cb(root.sodium); } } }(this, function (exports, libsodium) { "use strict"; Object.defineProperty(exports, '__esModule', { value: true }); var output_format = "uint8array"; libsodium._sodium_init(); // List of functions and constants defined in the wrapped libsodium function symbols() { return Object.keys(exports).sort(); } function increment(bytes) { if (! bytes instanceof Uint8Array) { throw new TypeError("Only Uint8Array instances can be incremented"); } var c = 1 << 8; for (var i = 0 | 0, j = bytes.length; i < j; i++) { c >>= 8; c += bytes[i]; bytes[i] = c & 0xff; } } function memzero(bytes) { if (! bytes instanceof Uint8Array) { throw new TypeError("Only Uint8Array instances can be wiped"); } for (var i = 0 | 0, j = bytes.length; i < j; i++) { bytes[i] = 0; } } function memcmp(b1, b2) { if (!(b1 instanceof Uint8Array && b2 instanceof Uint8Array)) { throw new TypeError("Only Uint8Array instances can be compared"); } if (b1.length !== b2.length) { throw new TypeError("Only instances of identical length can be compared"); } for (var d = 0 | 0, i = 0 | 0, j = b1.length; i < j; i++) { d |= b1[i] ^ b2[i]; } return d === 0; } function compare(b1, b2) { if (!(b1 instanceof Uint8Array && b2 instanceof Uint8Array)) { throw new TypeError("Only Uint8Array instances can be compared"); } if (b1.length !== b2.length) { throw new TypeError("Only instances of identical length can be compared"); } for (var gt = 0 | 0, eq = 1 | 1, i = b1.length; i-- > 0;) { gt |= ((b2[i] - b1[i]) >> 8) & eq; eq &= ((b2[i] ^ b1[i]) - 1) >> 8; } return (gt + gt + eq) - 1; } //--------------------------------------------------------------------------- // Codecs function from_string(str) { if (typeof TextEncoder === "function") { return new TextEncoder("utf-8").encode(str); } str = unescape(encodeURIComponent(str)); var bytes = new Uint8Array(str.length); for (var i = 0; i < str.length; i++) { bytes[i] = str.charCodeAt(i); } return bytes; } function to_string(bytes) { if (typeof TextDecoder === "function") { return new TextDecoder("utf-8", {fatal: true}).decode(bytes); } try { return decodeURIComponent(escape(String.fromCharCode.apply(null, bytes))); } catch (_) { throw new TypeError("The encoded data was not valid."); } } function from_hex(str) { if (!is_hex(str)) throw new TypeError("The provided string doesn't look like hex data"); var result = new Uint8Array(str.length / 2); for (var i = 0; i < str.length; i += 2) { result[i >>> 1] = parseInt(str.substr(i, 2), 16); } return result; } function to_hex(bytes) { var str = "", b, c, x; for (var i = 0; i < bytes.length; i++) { c = bytes[i] & 0xf; b = bytes[i] >>> 4; x = (87 + c + (((c - 10) >> 8) & ~38)) << 8 | (87 + b + (((b - 10) >> 8) & ~38)); str += String.fromCharCode(x & 0xff) + String.fromCharCode(x >>> 8); } return str; } function is_hex(str) { return (typeof str === "string" && /^[0-9a-f]+$/i.test(str) && str.length % 2 === 0); } function from_base64(sBase64, nBlocksSize) { function _b64ToUint6(nChr) { return nChr > 64 && nChr < 91 ? nChr - 65 : nChr > 96 && nChr < 123 ? nChr - 71 : nChr > 47 && nChr < 58 ? nChr + 4 : nChr === 43 ? 62 : nChr === 47 ? 63 : 0; } var sB64Enc = sBase64.replace(/[^A-Za-z0-9\+\/]/g, ""), nInLen = sB64Enc.length, nOutLen = nBlocksSize ? Math.ceil((nInLen * 3 + 1 >> 2) / nBlocksSize) * nBlocksSize : nInLen * 3 + 1 >> 2, taBytes = new Uint8Array(nOutLen); for (var nMod3, nMod4, nUint24 = 0, nOutIdx = 0, nInIdx = 0; nInIdx < nInLen; nInIdx++) { nMod4 = nInIdx & 3; nUint24 |= _b64ToUint6(sB64Enc.charCodeAt(nInIdx)) << 18 - 6 * nMod4; if (nMod4 === 3 || nInLen - nInIdx === 1) { for (nMod3 = 0; nMod3 < 3 && nOutIdx < nOutLen; nMod3++, nOutIdx++) { taBytes[nOutIdx] = nUint24 >>> (16 >>> nMod3 & 24) & 255; } nUint24 = 0; } } return taBytes; } function to_base64(aBytes, noNewLine) { function _uint6ToB64(nUint6) { return nUint6 < 26 ? nUint6 + 65 : nUint6 < 52 ? nUint6 + 71 : nUint6 < 62 ? nUint6 - 4 : nUint6 === 62 ? 43 : nUint6 === 63 ? 47 : 65; } if (typeof aBytes === "string") { throw new Exception("input has to be an array"); } var nMod3 = 2, sB64Enc = ""; for (var nLen = aBytes.length, nUint24 = 0, nIdx = 0; nIdx < nLen; nIdx++) { nMod3 = nIdx % 3; if (nIdx > 0 && (nIdx * 4 / 3) % 76 === 0 && !noNewLine) { sB64Enc += "\r\n"; } nUint24 |= aBytes[nIdx] << (16 >>> nMod3 & 24); if (nMod3 === 2 || aBytes.length - nIdx === 1) { sB64Enc += String.fromCharCode(_uint6ToB64(nUint24 >>> 18 & 63), _uint6ToB64(nUint24 >>> 12 & 63), _uint6ToB64(nUint24 >>> 6 & 63), _uint6ToB64(nUint24 & 63)); nUint24 = 0; } } return sB64Enc.substr(0, sB64Enc.length - 2 + nMod3) + (nMod3 === 2 ? "" : nMod3 === 1 ? "=" : "=="); } function output_formats() { return ["uint8array", "text", "hex", "base64"]; } function _format_output(output, optionalOutputFormat) { var selectedOutputFormat = optionalOutputFormat || output_format; if (!_is_output_format(selectedOutputFormat)) throw new Error(selectedOutputFormat + " output format is not available"); if (output instanceof AllocatedBuf) { if (selectedOutputFormat === "uint8array") return output.to_Uint8Array(); else if (selectedOutputFormat === "text") return libsodium.Pointer_stringify(output.address, output.length); else if (selectedOutputFormat === "hex") return to_hex(output.to_Uint8Array()); else if (selectedOutputFormat === "base64") return to_base64(output.to_Uint8Array()); else throw new Error("What is output format \"" + selectedOutputFormat + "\"?"); } else if (typeof output === "object") { //Composed output. Example : key pairs var props = Object.keys(output); var formattedOutput = {}; for (var i = 0; i < props.length; i++) { formattedOutput[props[i]] = _format_output(output[props[i]], selectedOutputFormat); } return formattedOutput; } else if (typeof output === "string") { return output; } else { throw new TypeError("Cannot format output"); } } function _is_output_format(format) { var formats = output_formats(); for (var i = 0; i < formats.length; i++) { if (formats[i] === format) return true; } return false; } function _check_output_format(format) { if (!format) { return; } else if (typeof format !== "string") { throw new TypeError("When defined, the output format must be a string"); } else if (!_is_output_format(format)) { throw new Error(format + " is not a supported output format"); } } //--------------------------------------------------------------------------- // Memory management // AllocatedBuf: address allocated using _malloc() + length function AllocatedBuf(length) { this.length = length; this.address = _malloc(length); } // Copy the content of a AllocatedBuf (_malloc()'d memory) into a Uint8Array AllocatedBuf.prototype.to_Uint8Array = function () { var result = new Uint8Array(this.length); result.set(libsodium.HEAPU8.subarray(this.address, this.address + this.length)); return result; }; // _malloc() a region and initialize it with the content of a Uint8Array function _to_allocated_buf_address(bytes) { var address = _malloc(bytes.length); libsodium.HEAPU8.set(bytes, address); return address; } function _malloc(length) { var result = libsodium._malloc(length); if (result === 0) { throw { message: "_malloc() failed", length: length }; } return result; } function _free(address) { libsodium._free(address); } function _free_all(addresses) { for (var i = 0; i < addresses.length; i++) { _free(addresses[i]); } } function _free_and_throw_error(address_pool, err) { _free_all(address_pool); throw new Error(err); } function _free_and_throw_type_error(address_pool, err) { _free_all(address_pool); throw new TypeError(err); } function _require_defined(address_pool, varValue, varName) { if (varValue == undefined) { _free_and_throw_type_error(address_pool, varName + " cannot be null or undefined"); } } function _any_to_Uint8Array(address_pool, varValue, varName) { _require_defined(address_pool, varValue, varName); if (varValue instanceof Uint8Array) { return varValue; } else if (typeof varValue === "string") { return from_string(varValue); } _free_and_throw_type_error(address_pool, "unsupported input type for " + varName); } function crypto_aead_chacha20poly1305_decrypt(secret_nonce, ciphertext, additional_data, public_nonce, key, outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- input: secret_nonce (unsized_buf_optional) var secret_nonce_address = null, secret_nonce_length = 0; if (secret_nonce != undefined) { secret_nonce = _any_to_Uint8Array(address_pool, secret_nonce, "secret_nonce"); secret_nonce_address = _to_allocated_buf_address(secret_nonce); secret_nonce_length = secret_nonce.length; address_pool.push(secret_nonce_address); } // ---------- input: ciphertext (unsized_buf) ciphertext = _any_to_Uint8Array(address_pool, ciphertext, "ciphertext"); var ciphertext_address = _to_allocated_buf_address(ciphertext), ciphertext_length = ciphertext.length; address_pool.push(ciphertext_address); // ---------- input: additional_data (unsized_buf_optional) var additional_data_address = null, additional_data_length = 0; if (additional_data != undefined) { additional_data = _any_to_Uint8Array(address_pool, additional_data, "additional_data"); additional_data_address = _to_allocated_buf_address(additional_data); additional_data_length = additional_data.length; address_pool.push(additional_data_address); } // ---------- input: public_nonce (buf) public_nonce = _any_to_Uint8Array(address_pool, public_nonce, "public_nonce"); var public_nonce_address, public_nonce_length = (libsodium._crypto_aead_chacha20poly1305_npubbytes()) | 0; if (public_nonce.length !== public_nonce_length) { _free_and_throw_type_error(address_pool, "invalid public_nonce length"); } public_nonce_address = _to_allocated_buf_address(public_nonce); address_pool.push(public_nonce_address); // ---------- input: key (buf) key = _any_to_Uint8Array(address_pool, key, "key"); var key_address, key_length = (libsodium._crypto_aead_chacha20poly1305_keybytes()) | 0; if (key.length !== key_length) { _free_and_throw_type_error(address_pool, "invalid key length"); } key_address = _to_allocated_buf_address(key); address_pool.push(key_address); // ---------- output message (buf) var message_length = (ciphertext_length - libsodium._crypto_aead_chacha20poly1305_abytes()) | 0, message = new AllocatedBuf(message_length), message_address = message.address; address_pool.push(message_address); if ((libsodium._crypto_aead_chacha20poly1305_decrypt(message_address, null, secret_nonce_address, ciphertext_address, ciphertext_length, 0, additional_data_address, additional_data_length, 0, public_nonce_address, key_address)) === 0) { var ret = _format_output(message, outputFormat); _free_all(address_pool); return ret; } _free_and_throw_error(address_pool); } function crypto_aead_chacha20poly1305_encrypt(message, additional_data, secret_nonce, public_nonce, key, outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- input: message (unsized_buf) message = _any_to_Uint8Array(address_pool, message, "message"); var message_address = _to_allocated_buf_address(message), message_length = message.length; address_pool.push(message_address); // ---------- input: additional_data (unsized_buf_optional) var additional_data_address = null, additional_data_length = 0; if (additional_data != undefined) { additional_data = _any_to_Uint8Array(address_pool, additional_data, "additional_data"); additional_data_address = _to_allocated_buf_address(additional_data); additional_data_length = additional_data.length; address_pool.push(additional_data_address); } // ---------- input: secret_nonce (unsized_buf_optional) var secret_nonce_address = null, secret_nonce_length = 0; if (secret_nonce != undefined) { secret_nonce = _any_to_Uint8Array(address_pool, secret_nonce, "secret_nonce"); secret_nonce_address = _to_allocated_buf_address(secret_nonce); secret_nonce_length = secret_nonce.length; address_pool.push(secret_nonce_address); } // ---------- input: public_nonce (buf) public_nonce = _any_to_Uint8Array(address_pool, public_nonce, "public_nonce"); var public_nonce_address, public_nonce_length = (libsodium._crypto_aead_chacha20poly1305_npubbytes()) | 0; if (public_nonce.length !== public_nonce_length) { _free_and_throw_type_error(address_pool, "invalid public_nonce length"); } public_nonce_address = _to_allocated_buf_address(public_nonce); address_pool.push(public_nonce_address); // ---------- input: key (buf) key = _any_to_Uint8Array(address_pool, key, "key"); var key_address, key_length = (libsodium._crypto_aead_chacha20poly1305_keybytes()) | 0; if (key.length !== key_length) { _free_and_throw_type_error(address_pool, "invalid key length"); } key_address = _to_allocated_buf_address(key); address_pool.push(key_address); // ---------- output ciphertext (buf) var ciphertext_length = (message_length + libsodium._crypto_aead_chacha20poly1305_abytes()) | 0, ciphertext = new AllocatedBuf(ciphertext_length), ciphertext_address = ciphertext.address; address_pool.push(ciphertext_address); if ((libsodium._crypto_aead_chacha20poly1305_encrypt(ciphertext_address, null, message_address, message_length, 0, additional_data_address, additional_data_length, 0, secret_nonce_address, public_nonce_address, key_address)) === 0) { var ret = _format_output(ciphertext, outputFormat); _free_all(address_pool); return ret; } _free_and_throw_error(address_pool); } function crypto_aead_chacha20poly1305_ietf_decrypt(secret_nonce, ciphertext, additional_data, public_nonce, key, outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- input: secret_nonce (unsized_buf_optional) var secret_nonce_address = null, secret_nonce_length = 0; if (secret_nonce != undefined) { secret_nonce = _any_to_Uint8Array(address_pool, secret_nonce, "secret_nonce"); secret_nonce_address = _to_allocated_buf_address(secret_nonce); secret_nonce_length = secret_nonce.length; address_pool.push(secret_nonce_address); } // ---------- input: ciphertext (unsized_buf) ciphertext = _any_to_Uint8Array(address_pool, ciphertext, "ciphertext"); var ciphertext_address = _to_allocated_buf_address(ciphertext), ciphertext_length = ciphertext.length; address_pool.push(ciphertext_address); // ---------- input: additional_data (unsized_buf_optional) var additional_data_address = null, additional_data_length = 0; if (additional_data != undefined) { additional_data = _any_to_Uint8Array(address_pool, additional_data, "additional_data"); additional_data_address = _to_allocated_buf_address(additional_data); additional_data_length = additional_data.length; address_pool.push(additional_data_address); } // ---------- input: public_nonce (buf) public_nonce = _any_to_Uint8Array(address_pool, public_nonce, "public_nonce"); var public_nonce_address, public_nonce_length = (libsodium._crypto_aead_chacha20poly1305_ietf_npubbytes()) | 0; if (public_nonce.length !== public_nonce_length) { _free_and_throw_type_error(address_pool, "invalid public_nonce length"); } public_nonce_address = _to_allocated_buf_address(public_nonce); address_pool.push(public_nonce_address); // ---------- input: key (buf) key = _any_to_Uint8Array(address_pool, key, "key"); var key_address, key_length = (libsodium._crypto_aead_chacha20poly1305_keybytes()) | 0; if (key.length !== key_length) { _free_and_throw_type_error(address_pool, "invalid key length"); } key_address = _to_allocated_buf_address(key); address_pool.push(key_address); // ---------- output message (buf) var message_length = (ciphertext_length - libsodium._crypto_aead_chacha20poly1305_abytes()) | 0, message = new AllocatedBuf(message_length), message_address = message.address; address_pool.push(message_address); if ((libsodium._crypto_aead_chacha20poly1305_ietf_decrypt(message_address, null, secret_nonce_address, ciphertext_address, ciphertext_length, 0, additional_data_address, additional_data_length, 0, public_nonce_address, key_address)) === 0) { var ret = _format_output(message, outputFormat); _free_all(address_pool); return ret; } _free_and_throw_error(address_pool); } function crypto_aead_chacha20poly1305_ietf_encrypt(message, additional_data, secret_nonce, public_nonce, key, outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- input: message (unsized_buf) message = _any_to_Uint8Array(address_pool, message, "message"); var message_address = _to_allocated_buf_address(message), message_length = message.length; address_pool.push(message_address); // ---------- input: additional_data (unsized_buf_optional) var additional_data_address = null, additional_data_length = 0; if (additional_data != undefined) { additional_data = _any_to_Uint8Array(address_pool, additional_data, "additional_data"); additional_data_address = _to_allocated_buf_address(additional_data); additional_data_length = additional_data.length; address_pool.push(additional_data_address); } // ---------- input: secret_nonce (unsized_buf_optional) var secret_nonce_address = null, secret_nonce_length = 0; if (secret_nonce != undefined) { secret_nonce = _any_to_Uint8Array(address_pool, secret_nonce, "secret_nonce"); secret_nonce_address = _to_allocated_buf_address(secret_nonce); secret_nonce_length = secret_nonce.length; address_pool.push(secret_nonce_address); } // ---------- input: public_nonce (buf) public_nonce = _any_to_Uint8Array(address_pool, public_nonce, "public_nonce"); var public_nonce_address, public_nonce_length = (libsodium._crypto_aead_chacha20poly1305_ietf_npubbytes()) | 0; if (public_nonce.length !== public_nonce_length) { _free_and_throw_type_error(address_pool, "invalid public_nonce length"); } public_nonce_address = _to_allocated_buf_address(public_nonce); address_pool.push(public_nonce_address); // ---------- input: key (buf) key = _any_to_Uint8Array(address_pool, key, "key"); var key_address, key_length = (libsodium._crypto_aead_chacha20poly1305_keybytes()) | 0; if (key.length !== key_length) { _free_and_throw_type_error(address_pool, "invalid key length"); } key_address = _to_allocated_buf_address(key); address_pool.push(key_address); // ---------- output ciphertext (buf) var ciphertext_length = (message_length + libsodium._crypto_aead_chacha20poly1305_abytes()) | 0, ciphertext = new AllocatedBuf(ciphertext_length), ciphertext_address = ciphertext.address; address_pool.push(ciphertext_address); if ((libsodium._crypto_aead_chacha20poly1305_ietf_encrypt(ciphertext_address, null, message_address, message_length, 0, additional_data_address, additional_data_length, 0, secret_nonce_address, public_nonce_address, key_address)) === 0) { var ret = _format_output(ciphertext, outputFormat); _free_all(address_pool); return ret; } _free_and_throw_error(address_pool); } function crypto_auth(message, key, outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- input: message (unsized_buf) message = _any_to_Uint8Array(address_pool, message, "message"); var message_address = _to_allocated_buf_address(message), message_length = message.length; address_pool.push(message_address); // ---------- input: key (buf) key = _any_to_Uint8Array(address_pool, key, "key"); var key_address, key_length = (libsodium._crypto_auth_keybytes()) | 0; if (key.length !== key_length) { _free_and_throw_type_error(address_pool, "invalid key length"); } key_address = _to_allocated_buf_address(key); address_pool.push(key_address); // ---------- output tag (buf) var tag_length = (libsodium._crypto_auth_bytes()) | 0, tag = new AllocatedBuf(tag_length), tag_address = tag.address; address_pool.push(tag_address); if ((libsodium._crypto_auth(tag_address, message_address, message_length, 0, key_address) | 0) === 0) { var ret = _format_output(tag, outputFormat); _free_all(address_pool); return ret; } _free_and_throw_error(address_pool); } function crypto_auth_hmacsha256(message, key, outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- input: message (unsized_buf) message = _any_to_Uint8Array(address_pool, message, "message"); var message_address = _to_allocated_buf_address(message), message_length = message.length; address_pool.push(message_address); // ---------- input: key (buf) key = _any_to_Uint8Array(address_pool, key, "key"); var key_address, key_length = (libsodium._crypto_auth_hmacsha256_keybytes()) | 0; if (key.length !== key_length) { _free_and_throw_type_error(address_pool, "invalid key length"); } key_address = _to_allocated_buf_address(key); address_pool.push(key_address); // ---------- output hash (buf) var hash_length = (libsodium._crypto_auth_hmacsha256_bytes()) | 0, hash = new AllocatedBuf(hash_length), hash_address = hash.address; address_pool.push(hash_address); if ((libsodium._crypto_auth_hmacsha256(hash_address, message_address, message_length, 0, key_address) | 0) === 0) { var ret = _format_output(hash, outputFormat); _free_all(address_pool); return ret; } _free_and_throw_error(address_pool); } function crypto_auth_hmacsha256_verify(tag, message, key) { var address_pool = []; // ---------- input: tag (buf) tag = _any_to_Uint8Array(address_pool, tag, "tag"); var tag_address, tag_length = (libsodium._crypto_auth_hmacsha256_bytes()) | 0; if (tag.length !== tag_length) { _free_and_throw_type_error(address_pool, "invalid tag length"); } tag_address = _to_allocated_buf_address(tag); address_pool.push(tag_address); // ---------- input: message (unsized_buf) message = _any_to_Uint8Array(address_pool, message, "message"); var message_address = _to_allocated_buf_address(message), message_length = message.length; address_pool.push(message_address); // ---------- input: key (buf) key = _any_to_Uint8Array(address_pool, key, "key"); var key_address, key_length = (libsodium._crypto_auth_hmacsha256_keybytes()) | 0; if (key.length !== key_length) { _free_and_throw_type_error(address_pool, "invalid key length"); } key_address = _to_allocated_buf_address(key); address_pool.push(key_address); var result = libsodium._crypto_auth_hmacsha256_verify(tag_address, message_address, message_length, 0, key_address) | 0; var ret = (result === 0); _free_all(address_pool); return ret; } function crypto_auth_hmacsha512(message, key, outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- input: message (unsized_buf) message = _any_to_Uint8Array(address_pool, message, "message"); var message_address = _to_allocated_buf_address(message), message_length = message.length; address_pool.push(message_address); // ---------- input: key (buf) key = _any_to_Uint8Array(address_pool, key, "key"); var key_address, key_length = (libsodium._crypto_auth_hmacsha512_keybytes()) | 0; if (key.length !== key_length) { _free_and_throw_type_error(address_pool, "invalid key length"); } key_address = _to_allocated_buf_address(key); address_pool.push(key_address); // ---------- output hash (buf) var hash_length = (libsodium._crypto_auth_hmacsha512_bytes()) | 0, hash = new AllocatedBuf(hash_length), hash_address = hash.address; address_pool.push(hash_address); if ((libsodium._crypto_auth_hmacsha512(hash_address, message_address, message_length, 0, key_address) | 0) === 0) { var ret = _format_output(hash, outputFormat); _free_all(address_pool); return ret; } _free_and_throw_error(address_pool); } function crypto_auth_hmacsha512_verify(tag, message, key) { var address_pool = []; // ---------- input: tag (buf) tag = _any_to_Uint8Array(address_pool, tag, "tag"); var tag_address, tag_length = (libsodium._crypto_auth_hmacsha512_bytes()) | 0; if (tag.length !== tag_length) { _free_and_throw_type_error(address_pool, "invalid tag length"); } tag_address = _to_allocated_buf_address(tag); address_pool.push(tag_address); // ---------- input: message (unsized_buf) message = _any_to_Uint8Array(address_pool, message, "message"); var message_address = _to_allocated_buf_address(message), message_length = message.length; address_pool.push(message_address); // ---------- input: key (buf) key = _any_to_Uint8Array(address_pool, key, "key"); var key_address, key_length = (libsodium._crypto_auth_hmacsha512_keybytes()) | 0; if (key.length !== key_length) { _free_and_throw_type_error(address_pool, "invalid key length"); } key_address = _to_allocated_buf_address(key); address_pool.push(key_address); var result = libsodium._crypto_auth_hmacsha512_verify(tag_address, message_address, message_length, 0, key_address) | 0; var ret = (result === 0); _free_all(address_pool); return ret; } function crypto_auth_verify(tag, message, key) { var address_pool = []; // ---------- input: tag (buf) tag = _any_to_Uint8Array(address_pool, tag, "tag"); var tag_address, tag_length = (libsodium._crypto_auth_bytes()) | 0; if (tag.length !== tag_length) { _free_and_throw_type_error(address_pool, "invalid tag length"); } tag_address = _to_allocated_buf_address(tag); address_pool.push(tag_address); // ---------- input: message (unsized_buf) message = _any_to_Uint8Array(address_pool, message, "message"); var message_address = _to_allocated_buf_address(message), message_length = message.length; address_pool.push(message_address); // ---------- input: key (buf) key = _any_to_Uint8Array(address_pool, key, "key"); var key_address, key_length = (libsodium._crypto_auth_keybytes()) | 0; if (key.length !== key_length) { _free_and_throw_type_error(address_pool, "invalid key length"); } key_address = _to_allocated_buf_address(key); address_pool.push(key_address); var result = libsodium._crypto_auth_verify(tag_address, message_address, message_length, 0, key_address) | 0; var ret = (result === 0); _free_all(address_pool); return ret; } function crypto_box_beforenm(publicKey, secretKey, outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- input: publicKey (buf) publicKey = _any_to_Uint8Array(address_pool, publicKey, "publicKey"); var publicKey_address, publicKey_length = (libsodium._crypto_box_publickeybytes()) | 0; if (publicKey.length !== publicKey_length) { _free_and_throw_type_error(address_pool, "invalid publicKey length"); } publicKey_address = _to_allocated_buf_address(publicKey); address_pool.push(publicKey_address); // ---------- input: secretKey (buf) secretKey = _any_to_Uint8Array(address_pool, secretKey, "secretKey"); var secretKey_address, secretKey_length = (libsodium._crypto_box_secretkeybytes()) | 0; if (secretKey.length !== secretKey_length) { _free_and_throw_type_error(address_pool, "invalid secretKey length"); } secretKey_address = _to_allocated_buf_address(secretKey); address_pool.push(secretKey_address); // ---------- output sharedKey (buf) var sharedKey_length = (libsodium._crypto_box_beforenmbytes()) | 0, sharedKey = new AllocatedBuf(sharedKey_length), sharedKey_address = sharedKey.address; address_pool.push(sharedKey_address); if ((libsodium._crypto_box_beforenm(sharedKey_address, publicKey_address, secretKey_address) | 0) === 0) { var ret = _format_output(sharedKey, outputFormat); _free_all(address_pool); return ret; } _free_and_throw_error(address_pool); } function crypto_box_detached(message, nonce, publicKey, secretKey, outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- input: message (unsized_buf) message = _any_to_Uint8Array(address_pool, message, "message"); var message_address = _to_allocated_buf_address(message), message_length = message.length; address_pool.push(message_address); // ---------- input: nonce (buf) nonce = _any_to_Uint8Array(address_pool, nonce, "nonce"); var nonce_address, nonce_length = (libsodium._crypto_box_noncebytes()) | 0; if (nonce.length !== nonce_length) { _free_and_throw_type_error(address_pool, "invalid nonce length"); } nonce_address = _to_allocated_buf_address(nonce); address_pool.push(nonce_address); // ---------- input: publicKey (buf) publicKey = _any_to_Uint8Array(address_pool, publicKey, "publicKey"); var publicKey_address, publicKey_length = (libsodium._crypto_box_publickeybytes()) | 0; if (publicKey.length !== publicKey_length) { _free_and_throw_type_error(address_pool, "invalid publicKey length"); } publicKey_address = _to_allocated_buf_address(publicKey); address_pool.push(publicKey_address); // ---------- input: secretKey (buf) secretKey = _any_to_Uint8Array(address_pool, secretKey, "secretKey"); var secretKey_address, secretKey_length = (libsodium._crypto_box_secretkeybytes()) | 0; if (secretKey.length !== secretKey_length) { _free_and_throw_type_error(address_pool, "invalid secretKey length"); } secretKey_address = _to_allocated_buf_address(secretKey); address_pool.push(secretKey_address); // ---------- output ciphertext (buf) var ciphertext_length = (message_length) | 0, ciphertext = new AllocatedBuf(ciphertext_length), ciphertext_address = ciphertext.address; address_pool.push(ciphertext_address); // ---------- output mac (buf) var mac_length = (libsodium._crypto_box_macbytes()) | 0, mac = new AllocatedBuf(mac_length), mac_address = mac.address; address_pool.push(mac_address); if ((libsodium._crypto_box_detached(ciphertext_address, mac_address, message_address, message_length, 0, nonce_address, publicKey_address, secretKey_address) | 0) === 0) { var ret = _format_output({ciphertext: ciphertext, mac: mac}, outputFormat); _free_all(address_pool); return ret; } _free_and_throw_error(address_pool); } function crypto_box_easy(message, nonce, publicKey, secretKey, outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- input: message (unsized_buf) message = _any_to_Uint8Array(address_pool, message, "message"); var message_address = _to_allocated_buf_address(message), message_length = message.length; address_pool.push(message_address); // ---------- input: nonce (buf) nonce = _any_to_Uint8Array(address_pool, nonce, "nonce"); var nonce_address, nonce_length = (libsodium._crypto_box_noncebytes()) | 0; if (nonce.length !== nonce_length) { _free_and_throw_type_error(address_pool, "invalid nonce length"); } nonce_address = _to_allocated_buf_address(nonce); address_pool.push(nonce_address); // ---------- input: publicKey (buf) publicKey = _any_to_Uint8Array(address_pool, publicKey, "publicKey"); var publicKey_address, publicKey_length = (libsodium._crypto_box_publickeybytes()) | 0; if (publicKey.length !== publicKey_length) { _free_and_throw_type_error(address_pool, "invalid publicKey length"); } publicKey_address = _to_allocated_buf_address(publicKey); address_pool.push(publicKey_address); // ---------- input: secretKey (buf) secretKey = _any_to_Uint8Array(address_pool, secretKey, "secretKey"); var secretKey_address, secretKey_length = (libsodium._crypto_box_secretkeybytes()) | 0; if (secretKey.length !== secretKey_length) { _free_and_throw_type_error(address_pool, "invalid secretKey length"); } secretKey_address = _to_allocated_buf_address(secretKey); address_pool.push(secretKey_address); // ---------- output ciphertext (buf) var ciphertext_length = (message_length + libsodium._crypto_box_macbytes()) | 0, ciphertext = new AllocatedBuf(ciphertext_length), ciphertext_address = ciphertext.address; address_pool.push(ciphertext_address); if ((libsodium._crypto_box_easy(ciphertext_address, message_address, message_length, 0, nonce_address, publicKey_address, secretKey_address) | 0) === 0) { var ret = _format_output(ciphertext, outputFormat); _free_all(address_pool); return ret; } _free_and_throw_error(address_pool); } function crypto_box_easy_afternm(message, nonce, sharedKey, outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- input: message (unsized_buf) message = _any_to_Uint8Array(address_pool, message, "message"); var message_address = _to_allocated_buf_address(message), message_length = message.length; address_pool.push(message_address); // ---------- input: nonce (buf) nonce = _any_to_Uint8Array(address_pool, nonce, "nonce"); var nonce_address, nonce_length = (libsodium._crypto_box_noncebytes()) | 0; if (nonce.length !== nonce_length) { _free_and_throw_type_error(address_pool, "invalid nonce length"); } nonce_address = _to_allocated_buf_address(nonce); address_pool.push(nonce_address); // ---------- input: sharedKey (buf) sharedKey = _any_to_Uint8Array(address_pool, sharedKey, "sharedKey"); var sharedKey_address, sharedKey_length = (libsodium._crypto_box_beforenmbytes()) | 0; if (sharedKey.length !== sharedKey_length) { _free_and_throw_type_error(address_pool, "invalid sharedKey length"); } sharedKey_address = _to_allocated_buf_address(sharedKey); address_pool.push(sharedKey_address); // ---------- output ciphertext (buf) var ciphertext_length = (message_length + libsodium._crypto_box_macbytes()) | 0, ciphertext = new AllocatedBuf(ciphertext_length), ciphertext_address = ciphertext.address; address_pool.push(ciphertext_address); if ((libsodium._crypto_box_easy_afternm(ciphertext_address, message_address, message_length, 0, nonce_address, sharedKey_address) | 0) === 0) { var ret = _format_output(ciphertext, outputFormat); _free_all(address_pool); return ret; } _free_and_throw_error(address_pool); } function crypto_box_keypair(outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- output publicKey (buf) var publicKey_length = (libsodium._crypto_box_publickeybytes()) | 0, publicKey = new AllocatedBuf(publicKey_length), publicKey_address = publicKey.address; address_pool.push(publicKey_address); // ---------- output secretKey (buf) var secretKey_length = (libsodium._crypto_box_secretkeybytes()) | 0, secretKey = new AllocatedBuf(secretKey_length), secretKey_address = secretKey.address; address_pool.push(secretKey_address); if ((libsodium._crypto_box_keypair(publicKey_address, secretKey_address) | 0) === 0) { var ret = _format_output({publicKey: publicKey, privateKey: secretKey, keyType: "curve25519"}, outputFormat); _free_all(address_pool); return ret; } _free_and_throw_error(address_pool); } function crypto_box_open_detached(ciphertext, mac, nonce, publicKey, secretKey, outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- input: ciphertext (unsized_buf) ciphertext = _any_to_Uint8Array(address_pool, ciphertext, "ciphertext"); var ciphertext_address = _to_allocated_buf_address(ciphertext), ciphertext_length = ciphertext.length; address_pool.push(ciphertext_address); // ---------- input: mac (buf) mac = _any_to_Uint8Array(address_pool, mac, "mac"); var mac_address, mac_length = (libsodium._crypto_box_macbytes()) | 0; if (mac.length !== mac_length) { _free_and_throw_type_error(address_pool, "invalid mac length"); } mac_address = _to_allocated_buf_address(mac); address_pool.push(mac_address); // ---------- input: nonce (buf) nonce = _any_to_Uint8Array(address_pool, nonce, "nonce"); var nonce_address, nonce_length = (libsodium._crypto_box_noncebytes()) | 0; if (nonce.length !== nonce_length) { _free_and_throw_type_error(address_pool, "invalid nonce length"); } nonce_address = _to_allocated_buf_address(nonce); address_pool.push(nonce_address); // ---------- input: publicKey (buf) publicKey = _any_to_Uint8Array(address_pool, publicKey, "publicKey"); var publicKey_address, publicKey_length = (libsodium._crypto_box_publickeybytes()) | 0; if (publicKey.length !== publicKey_length) { _free_and_throw_type_error(address_pool, "invalid publicKey length"); } publicKey_address = _to_allocated_buf_address(publicKey); address_pool.push(publicKey_address); // ---------- input: secretKey (buf) secretKey = _any_to_Uint8Array(address_pool, secretKey, "secretKey"); var secretKey_address, secretKey_length = (libsodium._crypto_box_secretkeybytes()) | 0; if (secretKey.length !== secretKey_length) { _free_and_throw_type_error(address_pool, "invalid secretKey length"); } secretKey_address = _to_allocated_buf_address(secretKey); address_pool.push(secretKey_address); // ---------- output plaintext (buf) var plaintext_length = (ciphertext_length) | 0, plaintext = new AllocatedBuf(plaintext_length), plaintext_address = plaintext.address; address_pool.push(plaintext_address); if ((libsodium._crypto_box_open_detached(plaintext_address, ciphertext_address, mac_address, ciphertext_length, 0, nonce_address, publicKey_address, secretKey_address) | 0) === 0) { var ret = _format_output(plaintext, outputFormat); _free_all(address_pool); return ret; } _free_and_throw_error(address_pool); } function crypto_box_open_easy(ciphertext, nonce, publicKey, secretKey, outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- input: ciphertext (unsized_buf) ciphertext = _any_to_Uint8Array(address_pool, ciphertext, "ciphertext"); var ciphertext_address = _to_allocated_buf_address(ciphertext), ciphertext_length = ciphertext.length; address_pool.push(ciphertext_address); // ---------- input: nonce (buf) nonce = _any_to_Uint8Array(address_pool, nonce, "nonce"); var nonce_address, nonce_length = (libsodium._crypto_box_noncebytes()) | 0; if (nonce.length !== nonce_length) { _free_and_throw_type_error(address_pool, "invalid nonce length"); } nonce_address = _to_allocated_buf_address(nonce); address_pool.push(nonce_address); // ---------- input: publicKey (buf) publicKey = _any_to_Uint8Array(address_pool, publicKey, "publicKey"); var publicKey_address, publicKey_length = (libsodium._crypto_box_publickeybytes()) | 0; if (publicKey.length !== publicKey_length) { _free_and_throw_type_error(address_pool, "invalid publicKey length"); } publicKey_address = _to_allocated_buf_address(publicKey); address_pool.push(publicKey_address); // ---------- input: secretKey (buf) secretKey = _any_to_Uint8Array(address_pool, secretKey, "secretKey"); var secretKey_address, secretKey_length = (libsodium._crypto_box_secretkeybytes()) | 0; if (secretKey.length !== secretKey_length) { _free_and_throw_type_error(address_pool, "invalid secretKey length"); } secretKey_address = _to_allocated_buf_address(secretKey); address_pool.push(secretKey_address); // ---------- output plaintext (buf) var plaintext_length = (ciphertext_length - libsodium._crypto_box_macbytes()) | 0, plaintext = new AllocatedBuf(plaintext_length), plaintext_address = plaintext.address; address_pool.push(plaintext_address); if ((libsodium._crypto_box_open_easy(plaintext_address, ciphertext_address, ciphertext_length, 0, nonce_address, publicKey_address, secretKey_address) | 0) === 0) { var ret = _format_output(plaintext, outputFormat); _free_all(address_pool); return ret; } _free_and_throw_error(address_pool); } function crypto_box_open_easy_afternm(ciphertext, nonce, sharedKey, outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- input: ciphertext (unsized_buf) ciphertext = _any_to_Uint8Array(address_pool, ciphertext, "ciphertext"); var ciphertext_address = _to_allocated_buf_address(ciphertext), ciphertext_length = ciphertext.length; address_pool.push(ciphertext_address); // ---------- input: nonce (buf) nonce = _any_to_Uint8Array(address_pool, nonce, "nonce"); var nonce_address, nonce_length = (libsodium._crypto_box_noncebytes()) | 0; if (nonce.length !== nonce_length) { _free_and_throw_type_error(address_pool, "invalid nonce length"); } nonce_address = _to_allocated_buf_address(nonce); address_pool.push(nonce_address); // ---------- input: sharedKey (buf) sharedKey = _any_to_Uint8Array(address_pool, sharedKey, "sharedKey"); var sharedKey_address, sharedKey_length = (libsodium._crypto_box_beforenmbytes()) | 0; if (sharedKey.length !== sharedKey_length) { _free_and_throw_type_error(address_pool, "invalid sharedKey length"); } sharedKey_address = _to_allocated_buf_address(sharedKey); address_pool.push(sharedKey_address); // ---------- output plaintext (buf) var plaintext_length = (ciphertext_length - libsodium._crypto_box_macbytes()) | 0, plaintext = new AllocatedBuf(plaintext_length), plaintext_address = plaintext.address; address_pool.push(plaintext_address); if ((libsodium._crypto_box_open_easy_afternm(plaintext_address, ciphertext_address, ciphertext_length, 0, nonce_address, sharedKey_address) | 0) === 0) { var ret = _format_output(plaintext, outputFormat); _free_all(address_pool); return ret; } _free_and_throw_error(address_pool); } function crypto_box_seal(message, publicKey, outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- input: message (unsized_buf) message = _any_to_Uint8Array(address_pool, message, "message"); var message_address = _to_allocated_buf_address(message), message_length = message.length; address_pool.push(message_address); // ---------- input: publicKey (buf) publicKey = _any_to_Uint8Array(address_pool, publicKey, "publicKey"); var publicKey_address, publicKey_length = (libsodium._crypto_box_publickeybytes()) | 0; if (publicKey.length !== publicKey_length) { _free_and_throw_type_error(address_pool, "invalid publicKey length"); } publicKey_address = _to_allocated_buf_address(publicKey); address_pool.push(publicKey_address); // ---------- output ciphertext (buf) var ciphertext_length = (message_length + libsodium._crypto_box_sealbytes()) | 0, ciphertext = new AllocatedBuf(ciphertext_length), ciphertext_address = ciphertext.address; address_pool.push(ciphertext_address); if ((libsodium._crypto_box_seal(ciphertext_address, message_address, message_length, 0, publicKey_address) | 0) === 0) { var ret = _format_output(ciphertext, outputFormat); _free_all(address_pool); return ret; } _free_and_throw_error(address_pool); } function crypto_box_seal_open(ciphertext, publicKey, secretKey, outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- input: ciphertext (unsized_buf) ciphertext = _any_to_Uint8Array(address_pool, ciphertext, "ciphertext"); var ciphertext_address = _to_allocated_buf_address(ciphertext), ciphertext_length = ciphertext.length; address_pool.push(ciphertext_address); // ---------- input: publicKey (buf) publicKey = _any_to_Uint8Array(address_pool, publicKey, "publicKey"); var publicKey_address, publicKey_length = (libsodium._crypto_box_publickeybytes()) | 0; if (publicKey.length !== publicKey_length) { _free_and_throw_type_error(address_pool, "invalid publicKey length"); } publicKey_address = _to_allocated_buf_address(publicKey); address_pool.push(publicKey_address); // ---------- input: secretKey (buf) secretKey = _any_to_Uint8Array(address_pool, secretKey, "secretKey"); var secretKey_address, secretKey_length = (libsodium._crypto_box_secretkeybytes()) | 0; if (secretKey.length !== secretKey_length) { _free_and_throw_type_error(address_pool, "invalid secretKey length"); } secretKey_address = _to_allocated_buf_address(secretKey); address_pool.push(secretKey_address); // ---------- output plaintext (buf) var plaintext_length = (ciphertext_length - libsodium._crypto_box_sealbytes()) | 0, plaintext = new AllocatedBuf(plaintext_length), plaintext_address = plaintext.address; address_pool.push(plaintext_address); if ((libsodium._crypto_box_seal_open(plaintext_address, ciphertext_address, ciphertext_length, 0, publicKey_address, secretKey_address) | 0) === 0) { var ret = _format_output(plaintext, outputFormat); _free_all(address_pool); return ret; } _free_and_throw_error(address_pool); } function crypto_box_seed_keypair(seed, outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- input: seed (buf) seed = _any_to_Uint8Array(address_pool, seed, "seed"); var seed_address, seed_length = (libsodium._crypto_box_seedbytes()) | 0; if (seed.length !== seed_length) { _free_and_throw_type_error(address_pool, "invalid seed length"); } seed_address = _to_allocated_buf_address(seed); address_pool.push(seed_address); // ---------- output publicKey (buf) var publicKey_length = (libsodium._crypto_box_publickeybytes()) | 0, publicKey = new AllocatedBuf(publicKey_length), publicKey_address = publicKey.address; address_pool.push(publicKey_address); // ---------- output privateKey (buf) var privateKey_length = (libsodium._crypto_box_secretkeybytes()) | 0, privateKey = new AllocatedBuf(privateKey_length), privateKey_address = privateKey.address; address_pool.push(privateKey_address); if ((libsodium._crypto_box_seed_keypair(publicKey_address, privateKey_address, seed_address) | 0) === 0) { var ret = _format_output({publicKey: publicKey, privateKey: privateKey}, outputFormat); _free_all(address_pool); return ret; } _free_and_throw_error(address_pool); } function crypto_generichash(hash_length, message, key, outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- input: hash_length (uint) _require_defined(address_pool, hash_length, "hash_length"); if (!(typeof hash_length === "number" && (hash_length | 0) === hash_length) && (hash_length | 0) > 0) { _free_and_throw_type_error(address_pool, "hash_length must be an unsigned integer"); } // ---------- input: message (unsized_buf) message = _any_to_Uint8Array(address_pool, message, "message"); var message_address = _to_allocated_buf_address(message), message_length = message.length; address_pool.push(message_address); // ---------- input: key (unsized_buf_optional) var key_address = null, key_length = 0; if (key != undefined) { key = _any_to_Uint8Array(address_pool, key, "key"); key_address = _to_allocated_buf_address(key); key_length = key.length; address_pool.push(key_address); } // ---------- output hash (buf) var hash_length = (hash_length) | 0, hash = new AllocatedBuf(hash_length), hash_address = hash.address; address_pool.push(hash_address); if ((libsodium._crypto_generichash(hash_address, hash_length, message_address, message_length, 0, key_address, key_length) | 0) === 0) { var ret = _format_output(hash, outputFormat); _free_all(address_pool); return ret; } _free_and_throw_error(address_pool); } function crypto_generichash_final(state_address, hash_length, outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- input: state_address (generichash_state_address) _require_defined(address_pool, state_address, "state_address"); // ---------- input: hash_length (uint) _require_defined(address_pool, hash_length, "hash_length"); if (!(typeof hash_length === "number" && (hash_length | 0) === hash_length) && (hash_length | 0) > 0) { _free_and_throw_type_error(address_pool, "hash_length must be an unsigned integer"); } // ---------- output hash (buf) var hash_length = (hash_length) | 0, hash = new AllocatedBuf(hash_length), hash_address = hash.address; address_pool.push(hash_address); if ((libsodium._crypto_generichash_final(state_address, hash_address, hash_length) | 0) === 0) { var ret = (libsodium._free(state_address), _format_output(hash, outputFormat)); _free_all(address_pool); return ret; } _free_and_throw_error(address_pool); } function crypto_generichash_init(key, hash_length, outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- input: key (unsized_buf_optional) var key_address = null, key_length = 0; if (key != undefined) { key = _any_to_Uint8Array(address_pool, key, "key"); key_address = _to_allocated_buf_address(key); key_length = key.length; address_pool.push(key_address); } // ---------- input: hash_length (uint) _require_defined(address_pool, hash_length, "hash_length"); if (!(typeof hash_length === "number" && (hash_length | 0) === hash_length) && (hash_length | 0) > 0) { _free_and_throw_type_error(address_pool, "hash_length must be an unsigned integer"); } // ---------- output state (generichash_state) var state_address = new AllocatedBuf(357).address; if ((libsodium._crypto_generichash_init(state_address, key_address, key_length, hash_length) | 0) === 0) { var ret = state_address; _free_all(address_pool); return ret; } _free_and_throw_error(address_pool); } function crypto_generichash_update(state_address, message_chunk, outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- input: state_address (generichash_state_address) _require_defined(address_pool, state_address, "state_address"); // ---------- input: message_chunk (unsized_buf) message_chunk = _any_to_Uint8Array(address_pool, message_chunk, "message_chunk"); var message_chunk_address = _to_allocated_buf_address(message_chunk), message_chunk_length = message_chunk.length; address_pool.push(message_chunk_address); if ((libsodium._crypto_generichash_update(state_address, message_chunk_address, message_chunk_length) | 0) === 0) { _free_all(address_pool); return; } _free_and_throw_error(address_pool); } function crypto_hash(message, outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- input: message (unsized_buf) message = _any_to_Uint8Array(address_pool, message, "message"); var message_address = _to_allocated_buf_address(message), message_length = message.length; address_pool.push(message_address); // ---------- output hash (buf) var hash_length = (libsodium._crypto_hash_bytes()) | 0, hash = new AllocatedBuf(hash_length), hash_address = hash.address; address_pool.push(hash_address); if ((libsodium._crypto_hash(hash_address, message_address, message_length, 0) | 0) === 0) { var ret = _format_output(hash, outputFormat); _free_all(address_pool); return ret; } _free_and_throw_error(address_pool); } function crypto_hash_sha256(message, outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- input: message (unsized_buf) message = _any_to_Uint8Array(address_pool, message, "message"); var message_address = _to_allocated_buf_address(message), message_length = message.length; address_pool.push(message_address); // ---------- output hash (buf) var hash_length = (libsodium._crypto_hash_sha256_bytes()) | 0, hash = new AllocatedBuf(hash_length), hash_address = hash.address; address_pool.push(hash_address); if ((libsodium._crypto_hash_sha256(hash_address, message_address, message_length, 0) | 0) === 0) { var ret = _format_output(hash, outputFormat); _free_all(address_pool); return ret; } _free_and_throw_error(address_pool); } function crypto_hash_sha512(message, outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- input: message (unsized_buf) message = _any_to_Uint8Array(address_pool, message, "message"); var message_address = _to_allocated_buf_address(message), message_length = message.length; address_pool.push(message_address); // ---------- output hash (buf) var hash_length = (libsodium._crypto_hash_sha512_bytes()) | 0, hash = new AllocatedBuf(hash_length), hash_address = hash.address; address_pool.push(hash_address); if ((libsodium._crypto_hash_sha512(hash_address, message_address, message_length, 0) | 0) === 0) { var ret = _format_output(hash, outputFormat); _free_all(address_pool); return ret; } _free_and_throw_error(address_pool); } function crypto_onetimeauth(message, key, outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- input: message (unsized_buf) message = _any_to_Uint8Array(address_pool, message, "message"); var message_address = _to_allocated_buf_address(message), message_length = message.length; address_pool.push(message_address); // ---------- input: key (buf) key = _any_to_Uint8Array(address_pool, key, "key"); var key_address, key_length = (libsodium._crypto_onetimeauth_keybytes()) | 0; if (key.length !== key_length) { _free_and_throw_type_error(address_pool, "invalid key length"); } key_address = _to_allocated_buf_address(key); address_pool.push(key_address); // ---------- output hash (buf) var hash_length = (libsodium._crypto_onetimeauth_bytes()) | 0, hash = new AllocatedBuf(hash_length), hash_address = hash.address; address_pool.push(hash_address); if ((libsodium._crypto_onetimeauth(hash_address, message_address, message_length, 0, key_address) | 0) === 0) { var ret = _format_output(hash, outputFormat); _free_all(address_pool); return ret; } _free_and_throw_error(address_pool); } function crypto_onetimeauth_final(state_address, outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- input: state_address (onetimeauth_state_address) _require_defined(address_pool, state_address, "state_address"); // ---------- output hash (buf) var hash_length = (libsodium._crypto_onetimeauth_bytes()) | 0, hash = new AllocatedBuf(hash_length), hash_address = hash.address; address_pool.push(hash_address); if ((libsodium._crypto_onetimeauth_final(state_address, hash_address) | 0) === 0) { var ret = (libsodium._free(state_address), _format_output(hash, outputFormat)); _free_all(address_pool); return ret; } _free_and_throw_error(address_pool); } function crypto_onetimeauth_init(key, outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- input: key (unsized_buf_optional) var key_address = null, key_length = 0; if (key != undefined) { key = _any_to_Uint8Array(address_pool, key, "key"); key_address = _to_allocated_buf_address(key); key_length = key.length; address_pool.push(key_address); } // ---------- output state (onetimeauth_state) var state_address = new AllocatedBuf(144).address; if ((libsodium._crypto_onetimeauth_init(state_address, key_address) | 0) === 0) { var ret = state_address; _free_all(address_pool); return ret; } _free_and_throw_error(address_pool); } function crypto_onetimeauth_update(state_address, message_chunk, outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- input: state_address (onetimeauth_state_address) _require_defined(address_pool, state_address, "state_address"); // ---------- input: message_chunk (unsized_buf) message_chunk = _any_to_Uint8Array(address_pool, message_chunk, "message_chunk"); var message_chunk_address = _to_allocated_buf_address(message_chunk), message_chunk_length = message_chunk.length; address_pool.push(message_chunk_address); if ((libsodium._crypto_onetimeauth_update(state_address, message_chunk_address, message_chunk_length) | 0) === 0) { _free_all(address_pool); return; } _free_and_throw_error(address_pool); } function crypto_onetimeauth_verify(hash, message, key) { var address_pool = []; // ---------- input: hash (buf) hash = _any_to_Uint8Array(address_pool, hash, "hash"); var hash_address, hash_length = (libsodium._crypto_onetimeauth_bytes()) | 0; if (hash.length !== hash_length) { _free_and_throw_type_error(address_pool, "invalid hash length"); } hash_address = _to_allocated_buf_address(hash); address_pool.push(hash_address); // ---------- input: message (unsized_buf) message = _any_to_Uint8Array(address_pool, message, "message"); var message_address = _to_allocated_buf_address(message), message_length = message.length; address_pool.push(message_address); // ---------- input: key (buf) key = _any_to_Uint8Array(address_pool, key, "key"); var key_address, key_length = (libsodium._crypto_onetimeauth_keybytes()) | 0; if (key.length !== key_length) { _free_and_throw_type_error(address_pool, "invalid key length"); } key_address = _to_allocated_buf_address(key); address_pool.push(key_address); var result = libsodium._crypto_onetimeauth_verify(hash_address, message_address, message_length, 0, key_address) | 0; var ret = (result === 0); _free_all(address_pool); return ret; } function crypto_pwhash_scryptsalsa208sha256(password, salt, opsLimit, memLimit, keyLength, outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- input: password (unsized_buf) password = _any_to_Uint8Array(address_pool, password, "password"); var password_address = _to_allocated_buf_address(password), password_length = password.length; address_pool.push(password_address); // ---------- input: salt (buf) salt = _any_to_Uint8Array(address_pool, salt, "salt"); var salt_address, salt_length = (libsodium._crypto_pwhash_scryptsalsa208sha256_saltbytes()) | 0; if (salt.length !== salt_length) { _free_and_throw_type_error(address_pool, "invalid salt length"); } salt_address = _to_allocated_buf_address(salt); address_pool.push(salt_address); // ---------- input: opsLimit (uint) _require_defined(address_pool, opsLimit, "opsLimit"); if (!(typeof opsLimit === "number" && (opsLimit | 0) === opsLimit) && (opsLimit | 0) > 0) { _free_and_throw_type_error(address_pool, "opsLimit must be an unsigned integer"); } // ---------- input: memLimit (uint) _require_defined(address_pool, memLimit, "memLimit"); if (!(typeof memLimit === "number" && (memLimit | 0) === memLimit) && (memLimit | 0) > 0) { _free_and_throw_type_error(address_pool, "memLimit must be an unsigned integer"); } // ---------- input: keyLength (uint) _require_defined(address_pool, keyLength, "keyLength"); if (!(typeof keyLength === "number" && (keyLength | 0) === keyLength) && (keyLength | 0) > 0) { _free_and_throw_type_error(address_pool, "keyLength must be an unsigned integer"); } // ---------- output derivedKey (buf) var derivedKey_length = (keyLength) | 0, derivedKey = new AllocatedBuf(derivedKey_length), derivedKey_address = derivedKey.address; address_pool.push(derivedKey_address); if ((libsodium._crypto_pwhash_scryptsalsa208sha256(derivedKey_address, keyLength, 0, password_address, password_length, 0, salt_address, opsLimit, 0, memLimit) | 0) === 0) { var ret = _format_output(derivedKey, outputFormat); _free_all(address_pool); return ret; } _free_and_throw_error(address_pool); } function crypto_pwhash_scryptsalsa208sha256_ll(password, salt, opsLimit, r, p, keyLength, outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- input: password (unsized_buf) password = _any_to_Uint8Array(address_pool, password, "password"); var password_address = _to_allocated_buf_address(password), password_length = password.length; address_pool.push(password_address); // ---------- input: salt (unsized_buf) salt = _any_to_Uint8Array(address_pool, salt, "salt"); var salt_address = _to_allocated_buf_address(salt), salt_length = salt.length; address_pool.push(salt_address); // ---------- input: opsLimit (uint) _require_defined(address_pool, opsLimit, "opsLimit"); if (!(typeof opsLimit === "number" && (opsLimit | 0) === opsLimit) && (opsLimit | 0) > 0) { _free_and_throw_type_error(address_pool, "opsLimit must be an unsigned integer"); } // ---------- input: r (uint) _require_defined(address_pool, r, "r"); if (!(typeof r === "number" && (r | 0) === r) && (r | 0) > 0) { _free_and_throw_type_error(address_pool, "r must be an unsigned integer"); } // ---------- input: p (uint) _require_defined(address_pool, p, "p"); if (!(typeof p === "number" && (p | 0) === p) && (p | 0) > 0) { _free_and_throw_type_error(address_pool, "p must be an unsigned integer"); } // ---------- input: keyLength (uint) _require_defined(address_pool, keyLength, "keyLength"); if (!(typeof keyLength === "number" && (keyLength | 0) === keyLength) && (keyLength | 0) > 0) { _free_and_throw_type_error(address_pool, "keyLength must be an unsigned integer"); } // ---------- output derivedKey (buf) var derivedKey_length = (keyLength) | 0, derivedKey = new AllocatedBuf(derivedKey_length), derivedKey_address = derivedKey.address; address_pool.push(derivedKey_address); if ((libsodium._crypto_pwhash_scryptsalsa208sha256_ll(password_address, password_length, salt_address, salt_length, opsLimit, 0, r, p, derivedKey_address, keyLength) | 0) === 0) { var ret = _format_output(derivedKey, outputFormat); _free_all(address_pool); return ret; } _free_and_throw_error(address_pool); } function crypto_pwhash_scryptsalsa208sha256_str(password, opsLimit, memLimit, outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- input: password (unsized_buf) password = _any_to_Uint8Array(address_pool, password, "password"); var password_address = _to_allocated_buf_address(password), password_length = password.length; address_pool.push(password_address); // ---------- input: opsLimit (uint) _require_defined(address_pool, opsLimit, "opsLimit"); if (!(typeof opsLimit === "number" && (opsLimit | 0) === opsLimit) && (opsLimit | 0) > 0) { _free_and_throw_type_error(address_pool, "opsLimit must be an unsigned integer"); } // ---------- input: memLimit (uint) _require_defined(address_pool, memLimit, "memLimit"); if (!(typeof memLimit === "number" && (memLimit | 0) === memLimit) && (memLimit | 0) > 0) { _free_and_throw_type_error(address_pool, "memLimit must be an unsigned integer"); } // ---------- output hashed_password (buf) var hashed_password_length = (libsodium._crypto_pwhash_scryptsalsa208sha256_strbytes()) | 0, hashed_password = new AllocatedBuf(hashed_password_length), hashed_password_address = hashed_password.address; address_pool.push(hashed_password_address); if ((libsodium._crypto_pwhash_scryptsalsa208sha256_str(hashed_password_address, password_address, password_length, 0, opsLimit, 0, memLimit) | 0) === 0) { var ret = libsodium.Pointer_stringify(hashed_password_address); _free_all(address_pool); return ret; } _free_and_throw_error(address_pool); } function crypto_pwhash_scryptsalsa208sha256_str_verify(hashed_password, password, outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- input: hashed_password (string) hashed_password = from_string(hashed_password + "\0"); var hashed_password_address = _to_allocated_buf_address(hashed_password), hashed_password_length = hashed_password.length - 1; address_pool.push(hashed_password_address); // ---------- input: password (unsized_buf) password = _any_to_Uint8Array(address_pool, password, "password"); var password_address = _to_allocated_buf_address(password), password_length = password.length; address_pool.push(password_address); var result = libsodium._crypto_pwhash_scryptsalsa208sha256_str_verify(hashed_password_address, password_address, password_length, 0) | 0; var ret = (result === 0); _free_all(address_pool); return ret; } function crypto_scalarmult(privateKey, publicKey, outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- input: privateKey (buf) privateKey = _any_to_Uint8Array(address_pool, privateKey, "privateKey"); var privateKey_address, privateKey_length = (libsodium._crypto_scalarmult_scalarbytes()) | 0; if (privateKey.length !== privateKey_length) { _free_and_throw_type_error(address_pool, "invalid privateKey length"); } privateKey_address = _to_allocated_buf_address(privateKey); address_pool.push(privateKey_address); // ---------- input: publicKey (buf) publicKey = _any_to_Uint8Array(address_pool, publicKey, "publicKey"); var publicKey_address, publicKey_length = (libsodium._crypto_scalarmult_scalarbytes()) | 0; if (publicKey.length !== publicKey_length) { _free_and_throw_type_error(address_pool, "invalid publicKey length"); } publicKey_address = _to_allocated_buf_address(publicKey); address_pool.push(publicKey_address); // ---------- output sharedSecret (buf) var sharedSecret_length = (libsodium._crypto_scalarmult_bytes()) | 0, sharedSecret = new AllocatedBuf(sharedSecret_length), sharedSecret_address = sharedSecret.address; address_pool.push(sharedSecret_address); if ((libsodium._crypto_scalarmult(sharedSecret_address, privateKey_address, publicKey_address) | 0) === 0) { var ret = _format_output(sharedSecret, outputFormat); _free_all(address_pool); return ret; } _free_and_throw_error(address_pool); } function crypto_scalarmult_base(privateKey, outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- input: privateKey (buf) privateKey = _any_to_Uint8Array(address_pool, privateKey, "privateKey"); var privateKey_address, privateKey_length = (libsodium._crypto_scalarmult_scalarbytes()) | 0; if (privateKey.length !== privateKey_length) { _free_and_throw_type_error(address_pool, "invalid privateKey length"); } privateKey_address = _to_allocated_buf_address(privateKey); address_pool.push(privateKey_address); // ---------- output publicKey (buf) var publicKey_length = (libsodium._crypto_scalarmult_scalarbytes()) | 0, publicKey = new AllocatedBuf(publicKey_length), publicKey_address = publicKey.address; address_pool.push(publicKey_address); if ((libsodium._crypto_scalarmult_base(publicKey_address, privateKey_address) | 0) === 0) { var ret = _format_output(publicKey, outputFormat); _free_all(address_pool); return ret; } _free_and_throw_error(address_pool); } function crypto_secretbox_detached(message, nonce, key, outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- input: message (unsized_buf) message = _any_to_Uint8Array(address_pool, message, "message"); var message_address = _to_allocated_buf_address(message), message_length = message.length; address_pool.push(message_address); // ---------- input: nonce (buf) nonce = _any_to_Uint8Array(address_pool, nonce, "nonce"); var nonce_address, nonce_length = (libsodium._crypto_secretbox_noncebytes()) | 0; if (nonce.length !== nonce_length) { _free_and_throw_type_error(address_pool, "invalid nonce length"); } nonce_address = _to_allocated_buf_address(nonce); address_pool.push(nonce_address); // ---------- input: key (buf) key = _any_to_Uint8Array(address_pool, key, "key"); var key_address, key_length = (libsodium._crypto_secretbox_keybytes()) | 0; if (key.length !== key_length) { _free_and_throw_type_error(address_pool, "invalid key length"); } key_address = _to_allocated_buf_address(key); address_pool.push(key_address); // ---------- output cipher (buf) var cipher_length = (message_length) | 0, cipher = new AllocatedBuf(cipher_length), cipher_address = cipher.address; address_pool.push(cipher_address); // ---------- output mac (buf) var mac_length = (libsodium._crypto_secretbox_macbytes()) | 0, mac = new AllocatedBuf(mac_length), mac_address = mac.address; address_pool.push(mac_address); if ((libsodium._crypto_secretbox_detached(cipher_address, mac_address, message_address, message_length, 0, nonce_address, key_address) | 0) === 0) { var ret = _format_output({mac: mac, cipher: cipher}, outputFormat); _free_all(address_pool); return ret; } _free_and_throw_error(address_pool); } function crypto_secretbox_easy(message, nonce, key, outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- input: message (unsized_buf) message = _any_to_Uint8Array(address_pool, message, "message"); var message_address = _to_allocated_buf_address(message), message_length = message.length; address_pool.push(message_address); // ---------- input: nonce (buf) nonce = _any_to_Uint8Array(address_pool, nonce, "nonce"); var nonce_address, nonce_length = (libsodium._crypto_secretbox_noncebytes()) | 0; if (nonce.length !== nonce_length) { _free_and_throw_type_error(address_pool, "invalid nonce length"); } nonce_address = _to_allocated_buf_address(nonce); address_pool.push(nonce_address); // ---------- input: key (buf) key = _any_to_Uint8Array(address_pool, key, "key"); var key_address, key_length = (libsodium._crypto_secretbox_keybytes()) | 0; if (key.length !== key_length) { _free_and_throw_type_error(address_pool, "invalid key length"); } key_address = _to_allocated_buf_address(key); address_pool.push(key_address); // ---------- output cipher (buf) var cipher_length = (message_length + libsodium._crypto_secretbox_macbytes()) | 0, cipher = new AllocatedBuf(cipher_length), cipher_address = cipher.address; address_pool.push(cipher_address); if ((libsodium._crypto_secretbox_easy(cipher_address, message_address, message_length, 0, nonce_address, key_address) | 0) === 0) { var ret = _format_output(cipher, outputFormat); _free_all(address_pool); return ret; } _free_and_throw_error(address_pool); } function crypto_secretbox_open_detached(ciphertext, mac, nonce, key, outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- input: ciphertext (unsized_buf) ciphertext = _any_to_Uint8Array(address_pool, ciphertext, "ciphertext"); var ciphertext_address = _to_allocated_buf_address(ciphertext), ciphertext_length = ciphertext.length; address_pool.push(ciphertext_address); // ---------- input: mac (buf) mac = _any_to_Uint8Array(address_pool, mac, "mac"); var mac_address, mac_length = (libsodium._crypto_secretbox_macbytes()) | 0; if (mac.length !== mac_length) { _free_and_throw_type_error(address_pool, "invalid mac length"); } mac_address = _to_allocated_buf_address(mac); address_pool.push(mac_address); // ---------- input: nonce (buf) nonce = _any_to_Uint8Array(address_pool, nonce, "nonce"); var nonce_address, nonce_length = (libsodium._crypto_secretbox_noncebytes()) | 0; if (nonce.length !== nonce_length) { _free_and_throw_type_error(address_pool, "invalid nonce length"); } nonce_address = _to_allocated_buf_address(nonce); address_pool.push(nonce_address); // ---------- input: key (buf) key = _any_to_Uint8Array(address_pool, key, "key"); var key_address, key_length = (libsodium._crypto_secretbox_keybytes()) | 0; if (key.length !== key_length) { _free_and_throw_type_error(address_pool, "invalid key length"); } key_address = _to_allocated_buf_address(key); address_pool.push(key_address); // ---------- output message (buf) var message_length = (ciphertext_length) | 0, message = new AllocatedBuf(message_length), message_address = message.address; address_pool.push(message_address); if ((libsodium._crypto_secretbox_open_detached(message_address, ciphertext_address, mac_address, ciphertext_length, 0, nonce_address, key_address) | 0) === 0) { var ret = _format_output(message, outputFormat); _free_all(address_pool); return ret; } _free_and_throw_error(address_pool); } function crypto_secretbox_open_easy(ciphertext, nonce, key, outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- input: ciphertext (unsized_buf) ciphertext = _any_to_Uint8Array(address_pool, ciphertext, "ciphertext"); var ciphertext_address = _to_allocated_buf_address(ciphertext), ciphertext_length = ciphertext.length; address_pool.push(ciphertext_address); // ---------- input: nonce (buf) nonce = _any_to_Uint8Array(address_pool, nonce, "nonce"); var nonce_address, nonce_length = (libsodium._crypto_secretbox_noncebytes()) | 0; if (nonce.length !== nonce_length) { _free_and_throw_type_error(address_pool, "invalid nonce length"); } nonce_address = _to_allocated_buf_address(nonce); address_pool.push(nonce_address); // ---------- input: key (buf) key = _any_to_Uint8Array(address_pool, key, "key"); var key_address, key_length = (libsodium._crypto_secretbox_keybytes()) | 0; if (key.length !== key_length) { _free_and_throw_type_error(address_pool, "invalid key length"); } key_address = _to_allocated_buf_address(key); address_pool.push(key_address); // ---------- output message (buf) var message_length = (ciphertext_length - libsodium._crypto_secretbox_macbytes()) | 0, message = new AllocatedBuf(message_length), message_address = message.address; address_pool.push(message_address); if ((libsodium._crypto_secretbox_open_easy(message_address, ciphertext_address, ciphertext_length, 0, nonce_address, key_address) | 0) === 0) { var ret = _format_output(message, outputFormat); _free_all(address_pool); return ret; } _free_and_throw_error(address_pool); } function crypto_shorthash(message, key, outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- input: message (unsized_buf) message = _any_to_Uint8Array(address_pool, message, "message"); var message_address = _to_allocated_buf_address(message), message_length = message.length; address_pool.push(message_address); // ---------- input: key (buf) key = _any_to_Uint8Array(address_pool, key, "key"); var key_address, key_length = (libsodium._crypto_shorthash_keybytes()) | 0; if (key.length !== key_length) { _free_and_throw_type_error(address_pool, "invalid key length"); } key_address = _to_allocated_buf_address(key); address_pool.push(key_address); // ---------- output hash (buf) var hash_length = (libsodium._crypto_shorthash_bytes()) | 0, hash = new AllocatedBuf(hash_length), hash_address = hash.address; address_pool.push(hash_address); if ((libsodium._crypto_shorthash(hash_address, message_address, message_length, 0, key_address) | 0) === 0) { var ret = _format_output(hash, outputFormat); _free_all(address_pool); return ret; } _free_and_throw_error(address_pool); } function crypto_sign(message, privateKey, outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- input: message (unsized_buf) message = _any_to_Uint8Array(address_pool, message, "message"); var message_address = _to_allocated_buf_address(message), message_length = message.length; address_pool.push(message_address); // ---------- input: privateKey (buf) privateKey = _any_to_Uint8Array(address_pool, privateKey, "privateKey"); var privateKey_address, privateKey_length = (libsodium._crypto_sign_secretkeybytes()) | 0; if (privateKey.length !== privateKey_length) { _free_and_throw_type_error(address_pool, "invalid privateKey length"); } privateKey_address = _to_allocated_buf_address(privateKey); address_pool.push(privateKey_address); // ---------- output signature (buf) var signature_length = (message.length + libsodium._crypto_sign_bytes()) | 0, signature = new AllocatedBuf(signature_length), signature_address = signature.address; address_pool.push(signature_address); if ((libsodium._crypto_sign(signature_address, null, message_address, message_length, 0, privateKey_address) | 0) === 0) { var ret = _format_output(signature, outputFormat); _free_all(address_pool); return ret; } _free_and_throw_error(address_pool); } function crypto_sign_detached(message, privateKey, outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- input: message (unsized_buf) message = _any_to_Uint8Array(address_pool, message, "message"); var message_address = _to_allocated_buf_address(message), message_length = message.length; address_pool.push(message_address); // ---------- input: privateKey (buf) privateKey = _any_to_Uint8Array(address_pool, privateKey, "privateKey"); var privateKey_address, privateKey_length = (libsodium._crypto_sign_secretkeybytes()) | 0; if (privateKey.length !== privateKey_length) { _free_and_throw_type_error(address_pool, "invalid privateKey length"); } privateKey_address = _to_allocated_buf_address(privateKey); address_pool.push(privateKey_address); // ---------- output signature (buf) var signature_length = (libsodium._crypto_sign_bytes()) | 0, signature = new AllocatedBuf(signature_length), signature_address = signature.address; address_pool.push(signature_address); if ((libsodium._crypto_sign_detached(signature_address, null, message_address, message_length, 0, privateKey_address) | 0) === 0) { var ret = _format_output(signature, outputFormat); _free_all(address_pool); return ret; } _free_and_throw_error(address_pool); } function crypto_sign_ed25519_pk_to_curve25519(edPk, outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- input: edPk (buf) edPk = _any_to_Uint8Array(address_pool, edPk, "edPk"); var edPk_address, edPk_length = (libsodium._crypto_sign_publickeybytes()) | 0; if (edPk.length !== edPk_length) { _free_and_throw_type_error(address_pool, "invalid edPk length"); } edPk_address = _to_allocated_buf_address(edPk); address_pool.push(edPk_address); // ---------- output cPk (buf) var cPk_length = (libsodium._crypto_scalarmult_scalarbytes()) | 0, cPk = new AllocatedBuf(cPk_length), cPk_address = cPk.address; address_pool.push(cPk_address); if ((libsodium._crypto_sign_ed25519_pk_to_curve25519(cPk_address, edPk_address) | 0) === 0) { var ret = _format_output(cPk, outputFormat); _free_all(address_pool); return ret; } _free_and_throw_error(address_pool); } function crypto_sign_ed25519_sk_to_curve25519(edSk, outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- input: edSk (buf) edSk = _any_to_Uint8Array(address_pool, edSk, "edSk"); var edSk_address, edSk_length = (libsodium._crypto_sign_secretkeybytes()) | 0; if (edSk.length !== edSk_length) { _free_and_throw_type_error(address_pool, "invalid edSk length"); } edSk_address = _to_allocated_buf_address(edSk); address_pool.push(edSk_address); // ---------- output cSk (buf) var cSk_length = (libsodium._crypto_scalarmult_scalarbytes()) | 0, cSk = new AllocatedBuf(cSk_length), cSk_address = cSk.address; address_pool.push(cSk_address); if ((libsodium._crypto_sign_ed25519_sk_to_curve25519(cSk_address, edSk_address) | 0) === 0) { var ret = _format_output(cSk, outputFormat); _free_all(address_pool); return ret; } _free_and_throw_error(address_pool); } function crypto_sign_ed25519_sk_to_pk(privateKey, outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- input: privateKey (buf) privateKey = _any_to_Uint8Array(address_pool, privateKey, "privateKey"); var privateKey_address, privateKey_length = (libsodium._crypto_sign_secretkeybytes()) | 0; if (privateKey.length !== privateKey_length) { _free_and_throw_type_error(address_pool, "invalid privateKey length"); } privateKey_address = _to_allocated_buf_address(privateKey); address_pool.push(privateKey_address); // ---------- output publicKey (buf) var publicKey_length = (libsodium._crypto_sign_publickeybytes()) | 0, publicKey = new AllocatedBuf(publicKey_length), publicKey_address = publicKey.address; address_pool.push(publicKey_address); if ((libsodium._crypto_sign_ed25519_sk_to_pk(publicKey_address, privateKey_address) | 0) === 0) { var ret = _format_output(publicKey, outputFormat); _free_all(address_pool); return ret; } _free_and_throw_error(address_pool); } function crypto_sign_ed25519_sk_to_seed(privateKey, outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- input: privateKey (buf) privateKey = _any_to_Uint8Array(address_pool, privateKey, "privateKey"); var privateKey_address, privateKey_length = (libsodium._crypto_sign_secretkeybytes()) | 0; if (privateKey.length !== privateKey_length) { _free_and_throw_type_error(address_pool, "invalid privateKey length"); } privateKey_address = _to_allocated_buf_address(privateKey); address_pool.push(privateKey_address); // ---------- output seed (buf) var seed_length = (libsodium._crypto_sign_seedbytes()) | 0, seed = new AllocatedBuf(seed_length), seed_address = seed.address; address_pool.push(seed_address); if ((libsodium._crypto_sign_ed25519_sk_to_seed(seed_address, privateKey_address) | 0) === 0) { var ret = _format_output(seed, outputFormat); _free_all(address_pool); return ret; } _free_and_throw_error(address_pool); } function crypto_sign_keypair(outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- output publicKey (buf) var publicKey_length = (libsodium._crypto_sign_publickeybytes()) | 0, publicKey = new AllocatedBuf(publicKey_length), publicKey_address = publicKey.address; address_pool.push(publicKey_address); // ---------- output privateKey (buf) var privateKey_length = (libsodium._crypto_sign_secretkeybytes()) | 0, privateKey = new AllocatedBuf(privateKey_length), privateKey_address = privateKey.address; address_pool.push(privateKey_address); if ((libsodium._crypto_sign_keypair(publicKey_address, privateKey_address) | 0) === 0) { var ret = _format_output({publicKey: publicKey, privateKey: privateKey, keyType: 'ed25519'}, outputFormat); _free_all(address_pool); return ret; } _free_and_throw_error(address_pool); } function crypto_sign_open(signedMessage, publicKey, outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- input: signedMessage (unsized_buf) signedMessage = _any_to_Uint8Array(address_pool, signedMessage, "signedMessage"); var signedMessage_address = _to_allocated_buf_address(signedMessage), signedMessage_length = signedMessage.length; address_pool.push(signedMessage_address); // ---------- input: publicKey (buf) publicKey = _any_to_Uint8Array(address_pool, publicKey, "publicKey"); var publicKey_address, publicKey_length = (libsodium._crypto_sign_publickeybytes()) | 0; if (publicKey.length !== publicKey_length) { _free_and_throw_type_error(address_pool, "invalid publicKey length"); } publicKey_address = _to_allocated_buf_address(publicKey); address_pool.push(publicKey_address); // ---------- output message (buf) var message_length = (signedMessage_length - libsodium._crypto_sign_bytes()) | 0, message = new AllocatedBuf(message_length), message_address = message.address; address_pool.push(message_address); if ((libsodium._crypto_sign_open(message_address, null, signedMessage_address, signedMessage_length, 0, publicKey_address) | 0) === 0) { var ret = _format_output(message, outputFormat); _free_all(address_pool); return ret; } _free_and_throw_error(address_pool); } function crypto_sign_seed_keypair(seed, outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- input: seed (buf) seed = _any_to_Uint8Array(address_pool, seed, "seed"); var seed_address, seed_length = (libsodium._crypto_sign_seedbytes()) | 0; if (seed.length !== seed_length) { _free_and_throw_type_error(address_pool, "invalid seed length"); } seed_address = _to_allocated_buf_address(seed); address_pool.push(seed_address); // ---------- output publicKey (buf) var publicKey_length = (libsodium._crypto_sign_publickeybytes()) | 0, publicKey = new AllocatedBuf(publicKey_length), publicKey_address = publicKey.address; address_pool.push(publicKey_address); // ---------- output privateKey (buf) var privateKey_length = (libsodium._crypto_sign_secretkeybytes()) | 0, privateKey = new AllocatedBuf(privateKey_length), privateKey_address = privateKey.address; address_pool.push(privateKey_address); if ((libsodium._crypto_sign_seed_keypair(publicKey_address, privateKey_address, seed_address) | 0) === 0) { var ret = _format_output({publicKey: publicKey, privateKey: privateKey, keyType: "ed25519"}, outputFormat); _free_all(address_pool); return ret; } _free_and_throw_error(address_pool); } function crypto_sign_verify_detached(signature, message, publicKey) { var address_pool = []; // ---------- input: signature (buf) signature = _any_to_Uint8Array(address_pool, signature, "signature"); var signature_address, signature_length = (libsodium._crypto_sign_bytes()) | 0; if (signature.length !== signature_length) { _free_and_throw_type_error(address_pool, "invalid signature length"); } signature_address = _to_allocated_buf_address(signature); address_pool.push(signature_address); // ---------- input: message (unsized_buf) message = _any_to_Uint8Array(address_pool, message, "message"); var message_address = _to_allocated_buf_address(message), message_length = message.length; address_pool.push(message_address); // ---------- input: publicKey (buf) publicKey = _any_to_Uint8Array(address_pool, publicKey, "publicKey"); var publicKey_address, publicKey_length = (libsodium._crypto_sign_publickeybytes()) | 0; if (publicKey.length !== publicKey_length) { _free_and_throw_type_error(address_pool, "invalid publicKey length"); } publicKey_address = _to_allocated_buf_address(publicKey); address_pool.push(publicKey_address); var verificationResult = libsodium._crypto_sign_verify_detached(signature_address, message_address, message_length, 0, publicKey_address) | 0; var ret = (verificationResult === 0); _free_all(address_pool); return ret; } function randombytes_buf(length, outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- input: length (uint) _require_defined(address_pool, length, "length"); if (!(typeof length === "number" && (length | 0) === length) && (length | 0) > 0) { _free_and_throw_type_error(address_pool, "length must be an unsigned integer"); } // ---------- output output (buf) var output_length = (length) | 0, output = new AllocatedBuf(output_length), output_address = output.address; address_pool.push(output_address); libsodium._randombytes_buf(output_address, length); var ret = (_format_output(output, outputFormat)); _free_all(address_pool); return ret; } function randombytes_close(outputFormat) { var address_pool = []; _check_output_format(outputFormat); libsodium._randombytes_close(); } function randombytes_random(outputFormat) { var address_pool = []; _check_output_format(outputFormat); var random_value = libsodium._randombytes_random() >>> 0; var ret = (random_value); _free_all(address_pool); return ret; } function randombytes_set_implementation(implementation, outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- input: implementation (randombytes_implementation) var implementation_address = libsodium._malloc(6 * 4); for (var i = 0; i < 6; i++) { libsodium.setValue(implementation_address + i * 4, libsodium.Runtime.addFunction(implementation [["implementation_name", "random", "stir", "uniform", "buf", "close"][i]]), "i32"); } if ((libsodium._randombytes_set_implementation(implementation_address) | 0) === 0) { _free_all(address_pool); return; } _free_and_throw_error(address_pool); } function randombytes_stir(outputFormat) { var address_pool = []; _check_output_format(outputFormat); libsodium._randombytes_stir(); } function randombytes_uniform(upper_bound, outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- input: upper_bound (uint) _require_defined(address_pool, upper_bound, "upper_bound"); if (!(typeof upper_bound === "number" && (upper_bound | 0) === upper_bound) && (upper_bound | 0) > 0) { _free_and_throw_type_error(address_pool, "upper_bound must be an unsigned integer"); } var random_value = libsodium._randombytes_uniform(upper_bound) >>> 0; var ret = (random_value); _free_all(address_pool); return ret; } function sodium_version_string() { var address_pool = []; var version = libsodium._sodium_version_string(); var ret = (libsodium.Pointer_stringify(version)); _free_all(address_pool); return ret; } exports.compare = compare; exports.from_base64 = from_base64; exports.from_hex = from_hex; exports.from_string = from_string; exports.increment = increment; exports.libsodium = libsodium; exports.memcmp = memcmp; exports.memzero = memzero; exports.output_formats = output_formats; exports.symbols = symbols; exports.to_base64 = to_base64; exports.to_hex = to_hex; exports.to_string = to_string; var exported_functions = ["crypto_aead_chacha20poly1305_decrypt", "crypto_aead_chacha20poly1305_encrypt", "crypto_aead_chacha20poly1305_ietf_decrypt", "crypto_aead_chacha20poly1305_ietf_encrypt", "crypto_auth", "crypto_auth_hmacsha256", "crypto_auth_hmacsha256_verify", "crypto_auth_hmacsha512", "crypto_auth_hmacsha512_verify", "crypto_auth_verify", "crypto_box_beforenm", "crypto_box_detached", "crypto_box_easy", "crypto_box_easy_afternm", "crypto_box_keypair", "crypto_box_open_detached", "crypto_box_open_easy", "crypto_box_open_easy_afternm", "crypto_box_seal", "crypto_box_seal_open", "crypto_box_seed_keypair", "crypto_generichash", "crypto_generichash_final", "crypto_generichash_init", "crypto_generichash_update", "crypto_hash", "crypto_hash_sha256", "crypto_hash_sha512", "crypto_onetimeauth", "crypto_onetimeauth_final", "crypto_onetimeauth_init", "crypto_onetimeauth_update", "crypto_onetimeauth_verify", "crypto_pwhash_scryptsalsa208sha256", "crypto_pwhash_scryptsalsa208sha256_ll", "crypto_pwhash_scryptsalsa208sha256_str", "crypto_pwhash_scryptsalsa208sha256_str_verify", "crypto_scalarmult", "crypto_scalarmult_base", "crypto_secretbox_detached", "crypto_secretbox_easy", "crypto_secretbox_open_detached", "crypto_secretbox_open_easy", "crypto_shorthash", "crypto_sign", "crypto_sign_detached", "crypto_sign_ed25519_pk_to_curve25519", "crypto_sign_ed25519_sk_to_curve25519", "crypto_sign_ed25519_sk_to_pk", "crypto_sign_ed25519_sk_to_seed", "crypto_sign_keypair", "crypto_sign_open", "crypto_sign_seed_keypair", "crypto_sign_verify_detached", "randombytes_buf", "randombytes_close", "randombytes_random", "randombytes_set_implementation", "randombytes_stir", "randombytes_uniform", "sodium_version_string"], functions = [crypto_aead_chacha20poly1305_decrypt, crypto_aead_chacha20poly1305_encrypt, crypto_aead_chacha20poly1305_ietf_decrypt, crypto_aead_chacha20poly1305_ietf_encrypt, crypto_auth, crypto_auth_hmacsha256, crypto_auth_hmacsha256_verify, crypto_auth_hmacsha512, crypto_auth_hmacsha512_verify, crypto_auth_verify, crypto_box_beforenm, crypto_box_detached, crypto_box_easy, crypto_box_easy_afternm, crypto_box_keypair, crypto_box_open_detached, crypto_box_open_easy, crypto_box_open_easy_afternm, crypto_box_seal, crypto_box_seal_open, crypto_box_seed_keypair, crypto_generichash, crypto_generichash_final, crypto_generichash_init, crypto_generichash_update, crypto_hash, crypto_hash_sha256, crypto_hash_sha512, crypto_onetimeauth, crypto_onetimeauth_final, crypto_onetimeauth_init, crypto_onetimeauth_update, crypto_onetimeauth_verify, crypto_pwhash_scryptsalsa208sha256, crypto_pwhash_scryptsalsa208sha256_ll, crypto_pwhash_scryptsalsa208sha256_str, crypto_pwhash_scryptsalsa208sha256_str_verify, crypto_scalarmult, crypto_scalarmult_base, crypto_secretbox_detached, crypto_secretbox_easy, crypto_secretbox_open_detached, crypto_secretbox_open_easy, crypto_shorthash, crypto_sign, crypto_sign_detached, crypto_sign_ed25519_pk_to_curve25519, crypto_sign_ed25519_sk_to_curve25519, crypto_sign_ed25519_sk_to_pk, crypto_sign_ed25519_sk_to_seed, crypto_sign_keypair, crypto_sign_open, crypto_sign_seed_keypair, crypto_sign_verify_detached, randombytes_buf, randombytes_close, randombytes_random, randombytes_set_implementation, randombytes_stir, randombytes_uniform, sodium_version_string]; for (var i = 0; i < functions.length; i++) { if (typeof libsodium["_" + exported_functions[i]] === "function") { exports[exported_functions[i]] = functions[i]; } } var constants = ["SODIUM_LIBRARY_VERSION_MAJOR", "SODIUM_LIBRARY_VERSION_MINOR", "crypto_aead_chacha20poly1305_ABYTES", "crypto_aead_chacha20poly1305_KEYBYTES", "crypto_aead_chacha20poly1305_NPUBBYTES", "crypto_aead_chacha20poly1305_NSECBYTES", "crypto_aead_chacha20poly1305_ietf_NPUBBYTES", "crypto_auth_BYTES", "crypto_auth_KEYBYTES", "crypto_auth_hmacsha256_BYTES", "crypto_auth_hmacsha256_KEYBYTES", "crypto_auth_hmacsha512_BYTES", "crypto_auth_hmacsha512_KEYBYTES", "crypto_box_BEFORENMBYTES", "crypto_box_MACBYTES", "crypto_box_NONCEBYTES", "crypto_box_PUBLICKEYBYTES", "crypto_box_SEALBYTES", "crypto_box_SECRETKEYBYTES", "crypto_box_SEEDBYTES", "crypto_generichash_BYTES", "crypto_generichash_BYTES_MAX", "crypto_generichash_BYTES_MIN", "crypto_generichash_KEYBYTES", "crypto_generichash_KEYBYTES_MAX", "crypto_generichash_KEYBYTES_MIN", "crypto_hash_BYTES", "crypto_onetimeauth_BYTES", "crypto_onetimeauth_KEYBYTES", "crypto_pwhash_scryptsalsa208sha256_MEMLIMIT_INTERACTIVE", "crypto_pwhash_scryptsalsa208sha256_MEMLIMIT_SENSITIVE", "crypto_pwhash_scryptsalsa208sha256_OPSLIMIT_INTERACTIVE", "crypto_pwhash_scryptsalsa208sha256_OPSLIMIT_SENSITIVE", "crypto_pwhash_scryptsalsa208sha256_SALTBYTES", "crypto_pwhash_scryptsalsa208sha256_STRBYTES", "crypto_pwhash_scryptsalsa208sha256_STR_VERIFY", "crypto_scalarmult_BYTES", "crypto_scalarmult_SCALARBYTES", "crypto_secretbox_KEYBYTES", "crypto_secretbox_MACBYTES", "crypto_secretbox_NONCEBYTES", "crypto_shorthash_BYTES", "crypto_shorthash_KEYBYTES", "crypto_sign_BYTES", "crypto_sign_PUBLICKEYBYTES", "crypto_sign_SECRETKEYBYTES", "crypto_sign_SEEDBYTES"]; for (var i = 0; i < constants.length; i++) { var raw = libsodium["_" + constants[i].toLowerCase()]; if (typeof raw === "function") exports[constants[i]] = raw()|0; } var constants_str = ["SODIUM_VERSION_STRING", "crypto_pwhash_scryptsalsa208sha256_STRPREFIX"]; for (var i = 0; i < constants_str.length; i++) { var raw = libsodium["_" + constants_str[i].toLowerCase()]; if (typeof raw === "function") exports[constants_str[i]] = libsodium.Pointer_stringify(raw()); } return exports; })); }).call(this,require('_process')) },{"_process":104,"libsodium":232}],232:[function(require,module,exports){ (function (process,Buffer,__dirname){ (function (root, factory) { if (typeof define === "function" && define.amd) { define(["exports"], factory); } else if (typeof exports === 'object' && typeof exports.nodeName !== 'string') { factory(exports); } else { factory(root.libsodium = {}); } })(this, function (exports) { "use strict"; var Module = exports; Object.defineProperty(exports, '__esModule', { value: true }); var Module;if(!Module)Module=(typeof Module!=="undefined"?Module:null)||{};var moduleOverrides={};for(var key in Module){if(Module.hasOwnProperty(key)){moduleOverrides[key]=Module[key]}}var ENVIRONMENT_IS_WEB=typeof window==="object";var ENVIRONMENT_IS_WORKER=typeof importScripts==="function";var ENVIRONMENT_IS_NODE=typeof process==="object"&&typeof require==="function"&&!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_WORKER;var ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER;if(ENVIRONMENT_IS_NODE){if(!Module["print"])Module["print"]=function print(x){process["stdout"].write(x+"\n")};if(!Module["printErr"])Module["printErr"]=function printErr(x){process["stderr"].write(x+"\n")};var nodeFS=require("fs");var nodePath=require("path");Module["read"]=function read(filename,binary){filename=nodePath["normalize"](filename);var ret=nodeFS["readFileSync"](filename);if(!ret&&filename!=nodePath["resolve"](filename)){filename=path.join(__dirname,"..","src",filename);ret=nodeFS["readFileSync"](filename)}if(ret&&!binary)ret=ret.toString();return ret};Module["readBinary"]=function readBinary(filename){var ret=Module["read"](filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}assert(ret.buffer);return ret};Module["load"]=function load(f){globalEval(read(f))};if(!Module["thisProgram"]){if(process["argv"].length>1){Module["thisProgram"]=process["argv"][1].replace(/\\/g,"/")}else{Module["thisProgram"]="unknown-program"}}Module["arguments"]=process["argv"].slice(2);if(typeof module!=="undefined"){module["exports"]=Module}process["on"]("uncaughtException",(function(ex){if(!(ex instanceof ExitStatus)){throw ex}}));Module["inspect"]=(function(){return"[Emscripten Module object]"})}else if(ENVIRONMENT_IS_SHELL){if(!Module["print"])Module["print"]=print;if(typeof printErr!="undefined")Module["printErr"]=printErr;if(typeof read!="undefined"){Module["read"]=read}else{Module["read"]=function read(){throw"no read() available (jsc?)"}}Module["readBinary"]=function readBinary(f){if(typeof readbuffer==="function"){return new Uint8Array(readbuffer(f))}var data=read(f,"binary");assert(typeof data==="object");return data};if(typeof scriptArgs!="undefined"){Module["arguments"]=scriptArgs}else if(typeof arguments!="undefined"){Module["arguments"]=arguments}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){Module["read"]=function read(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(typeof arguments!="undefined"){Module["arguments"]=arguments}if(typeof console!=="undefined"){if(!Module["print"])Module["print"]=function print(x){console.log(x)};if(!Module["printErr"])Module["printErr"]=function printErr(x){console.log(x)}}else{var TRY_USE_DUMP=false;if(!Module["print"])Module["print"]=TRY_USE_DUMP&&typeof dump!=="undefined"?(function(x){dump(x)}):(function(x){})}if(ENVIRONMENT_IS_WORKER){Module["load"]=importScripts}if(typeof Module["setWindowTitle"]==="undefined"){Module["setWindowTitle"]=(function(title){document.title=title})}}else{throw"Unknown runtime environment. Where are we?"}function globalEval(x){throw"NO_DYNAMIC_EXECUTION was set, cannot eval"}if(!Module["load"]&&Module["read"]){Module["load"]=function load(f){globalEval(Module["read"](f))}}if(!Module["print"]){Module["print"]=(function(){})}if(!Module["printErr"]){Module["printErr"]=Module["print"]}if(!Module["arguments"]){Module["arguments"]=[]}if(!Module["thisProgram"]){Module["thisProgram"]="./this.program"}Module.print=Module["print"];Module.printErr=Module["printErr"];Module["preRun"]=[];Module["postRun"]=[];for(var key in moduleOverrides){if(moduleOverrides.hasOwnProperty(key)){Module[key]=moduleOverrides[key]}}var Runtime={setTempRet0:(function(value){tempRet0=value}),getTempRet0:(function(){return tempRet0}),stackSave:(function(){return STACKTOP}),stackRestore:(function(stackTop){STACKTOP=stackTop}),getNativeTypeSize:(function(type){switch(type){case"i1":case"i8":return 1;case"i16":return 2;case"i32":return 4;case"i64":return 8;case"float":return 4;case"double":return 8;default:{if(type[type.length-1]==="*"){return Runtime.QUANTUM_SIZE}else if(type[0]==="i"){var bits=parseInt(type.substr(1));assert(bits%8===0);return bits/8}else{return 0}}}}),getNativeFieldSize:(function(type){return Math.max(Runtime.getNativeTypeSize(type),Runtime.QUANTUM_SIZE)}),STACK_ALIGN:16,prepVararg:(function(ptr,type){if(type==="double"||type==="i64"){if(ptr&7){assert((ptr&7)===4);ptr+=4}}else{assert((ptr&3)===0)}return ptr}),getAlignSize:(function(type,size,vararg){if(!vararg&&(type=="i64"||type=="double"))return 8;if(!type)return Math.min(size,8);return Math.min(size||(type?Runtime.getNativeFieldSize(type):0),Runtime.QUANTUM_SIZE)}),dynCall:(function(sig,ptr,args){if(args&&args.length){if(!args.splice)args=Array.prototype.slice.call(args);args.splice(0,0,ptr);return Module["dynCall_"+sig].apply(null,args)}else{return Module["dynCall_"+sig].call(null,ptr)}}),functionPointers:[null,null,null,null,null,null,null,null],addFunction:(function(func){for(var i=0;i=TOTAL_MEMORY){var success=enlargeMemory();if(!success){DYNAMICTOP=ret;return 0}}return ret}),alignMemory:(function(size,quantum){var ret=size=Math.ceil(size/(quantum?quantum:16))*(quantum?quantum:16);return ret}),makeBigInt:(function(low,high,unsigned){var ret=unsigned?+(low>>>0)+ +(high>>>0)*+4294967296:+(low>>>0)+ +(high|0)*+4294967296;return ret}),GLOBAL_BASE:8,QUANTUM_SIZE:4,__dummy__:0};Module["Runtime"]=Runtime;var __THREW__=0;var ABORT=false;var EXITSTATUS=0;var undef=0;var tempValue,tempInt,tempBigInt,tempInt2,tempBigInt2,tempPair,tempBigIntI,tempBigIntR,tempBigIntS,tempBigIntP,tempBigIntD,tempDouble,tempFloat;var tempI64,tempI64b;var tempRet0,tempRet1,tempRet2,tempRet3,tempRet4,tempRet5,tempRet6,tempRet7,tempRet8,tempRet9;function assert(condition,text){if(!condition){abort("Assertion failed: "+text)}}var globalScope=this;function getCFunc(ident){var func=Module["_"+ident];if(!func){abort("NO_DYNAMIC_EXECUTION was set, cannot eval - ccall/cwrap are not functional")}assert(func,"Cannot call unknown function "+ident+" (perhaps LLVM optimizations or closure removed it?)");return func}var cwrap,ccall;((function(){var JSfuncs={"stackSave":(function(){Runtime.stackSave()}),"stackRestore":(function(){Runtime.stackRestore()}),"arrayToC":(function(arr){var ret=Runtime.stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}),"stringToC":(function(str){var ret=0;if(str!==null&&str!==undefined&&str!==0){ret=Runtime.stackAlloc((str.length<<2)+1);writestringtomemory(str,ret)}return ret})};var="" toc="{"string":JSfuncs["stringToC"],"array":JSfuncs["arrayToC"]};ccall=function" ccallfunc(ident,returntype,argtypes,args,opts){var="" func="getCFunc(ident);var" cargs="[];var" stack="0;if(args){for(var" i="0;i<args.length;i++){var" converter="toC[argTypes[i]];if(converter){if(stack===0)stack=Runtime.stackSave();cArgs[i]=converter(args[i])}else{cArgs[i]=args[i]}}}var" ret="func.apply(null,cArgs);if(returnType==="string")ret=Pointer_stringify(ret);if(stack!==0){if(opts&&opts.async){EmterpreterAsync.asyncFinalizers.push((function(){Runtime.stackRestore(stack)}));return}Runtime.stackRestore(stack)}return" ret};cwrap="function" cwrap(ident,returntype,argtypes){return(function(){return="" ccall(ident,returntype,argtypes,arguments)})}}))();module["ccall"]="ccall;Module["cwrap"]=cwrap;function" setvalue(ptr,value,type,nosafe){type="type||"i8";if(type.charAt(type.length-1)==="*")type="i32";switch(type){case"i1":HEAP8[ptr">>0]=value;break;case"i8":HEAP8[ptr>>0]=value;break;case"i16":HEAP16[ptr>>1]=value;break;case"i32":HEAP32[ptr>>2]=value;break;case"i64":tempI64=[value>>>0,(tempDouble=value,+Math_abs(tempDouble)>=+1?tempDouble>+0?(Math_min(+Math_floor(tempDouble/+4294967296),+4294967295)|0)>>>0:~~+Math_ceil((tempDouble- +(~~tempDouble>>>0))/+4294967296)>>>0:0)],HEAP32[ptr>>2]=tempI64[0],HEAP32[ptr+4>>2]=tempI64[1];break;case"float":HEAPF32[ptr>>2]=value;break;case"double":HEAPF64[ptr>>3]=value;break;default:abort("invalid type for setValue: "+type)}}Module["setValue"]=setValue;function getValue(ptr,type,noSafe){type=type||"i8";if(type.charAt(type.length-1)==="*")type="i32";switch(type){case"i1":return HEAP8[ptr>>0];case"i8":return HEAP8[ptr>>0];case"i16":return HEAP16[ptr>>1];case"i32":return HEAP32[ptr>>2];case"i64":return HEAP32[ptr>>2];case"float":return HEAPF32[ptr>>2];case"double":return HEAPF64[ptr>>3];default:abort("invalid type for setValue: "+type)}return null}Module["getValue"]=getValue;var ALLOC_NORMAL=0;var ALLOC_STACK=1;var ALLOC_STATIC=2;var ALLOC_DYNAMIC=3;var ALLOC_NONE=4;Module["ALLOC_NORMAL"]=ALLOC_NORMAL;Module["ALLOC_STACK"]=ALLOC_STACK;Module["ALLOC_STATIC"]=ALLOC_STATIC;Module["ALLOC_DYNAMIC"]=ALLOC_DYNAMIC;Module["ALLOC_NONE"]=ALLOC_NONE;function allocate(slab,types,allocator,ptr){var zeroinit,size;if(typeof slab==="number"){zeroinit=true;size=slab}else{zeroinit=false;size=slab.length}var singleType=typeof types==="string"?types:null;var ret;if(allocator==ALLOC_NONE){ret=ptr}else{ret=[_malloc,Runtime.stackAlloc,Runtime.staticAlloc,Runtime.dynamicAlloc][allocator===undefined?ALLOC_STATIC:allocator](Math.max(size,singleType?1:types.length))}if(zeroinit){var ptr=ret,stop;assert((ret&3)==0);stop=ret+(size&~3);for(;ptr>2]=0}stop=ret+size;while(ptr>0]=0}return ret}if(singleType==="i8"){if(slab.subarray||slab.slice){HEAPU8.set(slab,ret)}else{HEAPU8.set(new Uint8Array(slab),ret)}return ret}var i=0,type,typeSize,previousType;while(i>0];hasUtf|=t;if(t==0&&!length)break;i++;if(length&&i==length)break}if(!length)length=i;var ret="";if(hasUtf<128){var max_chunk="1024;var" curr;while(length="">0){curr=String.fromCharCode.apply(String,HEAPU8.subarray(ptr,ptr+Math.min(length,MAX_CHUNK)));ret=ret?ret+curr:curr;ptr+=MAX_CHUNK;length-=MAX_CHUNK}return ret}return Module["UTF8ToString"](ptr)}Module["Pointer_stringify"]=Pointer_stringify;function AsciiToString(ptr){var str="";while(1){var ch=HEAP8[ptr++>>0];if(!ch)return str;str+=String.fromCharCode(ch)}}Module["AsciiToString"]=AsciiToString;function stringToAscii(str,outPtr){return writeAsciiToMemory(str,outPtr,false)}Module["stringToAscii"]=stringToAscii;function UTF8ArrayToString(u8Array,idx){var u0,u1,u2,u3,u4,u5;var str="";while(1){u0=u8Array[idx++];if(!u0)return str;if(!(u0&128)){str+=String.fromCharCode(u0);continue}u1=u8Array[idx++]&63;if((u0&224)==192){str+=String.fromCharCode((u0&31)<<6|u1);continue}u2=u8array[idx++]&63;if((u0&240)==224){u0=(u0&15)<<12|u1<<6|u2}else{u3=u8array[idx++]&63;if((u0&248)==240){u0=(u0&7)<<18|u1<<12|u2<<6|u3}else{u4=u8array[idx++]&63;if((u0&252)==248){u0=(u0&3)<<24|u1<<18|u2<<12|u3<<6|u4}else{u5=u8array[idx++]&63;u0=(u0&1)<<30|u1<<24|u2<<18|u3<<12|u4<<6|u5}}}if(u0<65536){str+=string.fromcharcode(u0)}else{var ch="u0-65536;str+=String.fromCharCode(55296|ch">>10,56320|ch&1023)}}}Module["UTF8ArrayToString"]=UTF8ArrayToString;function UTF8ToString(ptr){return UTF8ArrayToString(HEAPU8,ptr)}Module["UTF8ToString"]=UTF8ToString;function stringToUTF8Array(str,outU8Array,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charcodeat(++i)&1023;if(u<=127){if(outidx>=endIdx)break;outU8Array[outIdx++]=u}else if(u<=2047){if(outidx+1>=endIdx)break;outU8Array[outIdx++]=192|u>>6;outU8Array[outIdx++]=128|u&63}else if(u<=65535){if(outidx+2>=endIdx)break;outU8Array[outIdx++]=224|u>>12;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=2097151){if(outidx+3>=endIdx)break;outU8Array[outIdx++]=240|u>>18;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=67108863){if(outidx+4>=endIdx)break;outU8Array[outIdx++]=248|u>>24;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else{if(outIdx+5>=endIdx)break;outU8Array[outIdx++]=252|u>>30;outU8Array[outIdx++]=128|u>>24&63;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}}outU8Array[outIdx]=0;return outIdx-startIdx}Module["stringToUTF8Array"]=stringToUTF8Array;function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}Module["stringToUTF8"]=stringToUTF8;function lengthBytesUTF8(str){var len=0;for(var i=0;i=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charcodeat(++i)&1023;if(u<=127){++len}else if(u<="2047){len+=2}else" len}module["lengthbytesutf8"]="lengthBytesUTF8;function" utf16tostring(ptr){var="" i="0;var" str="" ;while(1){var="" codeunit="HEAP16[ptr+i*2">>1];if(codeUnit==0)return str;++i;str+=String.fromCharCode(codeUnit)}}Module["UTF16ToString"]=UTF16ToString;function stringToUTF16(str,outPtr,maxBytesToWrite){if(maxBytesToWrite===undefined){maxBytesToWrite=2147483647}if(maxBytesToWrite<2)return 0;maxbytestowrite-="2;var" startptr="outPtr;var" numcharstowrite="maxBytesToWrite<str.length*2?maxBytesToWrite/2:str.length;for(var" i="0;i<numCharsToWrite;++i){var" codeunit="str.charCodeAt(i);HEAP16[outPtr">>1]=codeUnit;outPtr+=2}HEAP16[outPtr>>1]=0;return outPtr-startPtr}Module["stringToUTF16"]=stringToUTF16;function lengthBytesUTF16(str){return str.length*2}Module["lengthBytesUTF16"]=lengthBytesUTF16;function UTF32ToString(ptr){var i=0;var str="";while(1){var utf32=HEAP32[ptr+i*4>>2];if(utf32==0)return str;++i;if(utf32>=65536){var ch=utf32-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}else{str+=String.fromCharCode(utf32)}}}Module["UTF32ToString"]=UTF32ToString;function stringToUTF32(str,outPtr,maxBytesToWrite){if(maxBytesToWrite===undefined){maxBytesToWrite=2147483647}if(maxBytesToWrite<4)return 0;var="" startptr="outPtr;var" endptr="startPtr+maxBytesToWrite-4;for(var" i="0;i<str.length;++i){var" codeunit="str.charCodeAt(i);if(codeUnit">=55296&&codeUnit<=57343){var trailsurrogate="str.charCodeAt(++i);codeUnit=65536+((codeUnit&1023)<<10)|trailSurrogate&1023}HEAP32[outPtr">>2]=codeUnit;outPtr+=4;if(outPtr+4>endPtr)break}HEAP32[outPtr>>2]=0;return outPtr-startPtr}Module["stringToUTF32"]=stringToUTF32;function lengthBytesUTF32(str){var len=0;for(var i=0;i=55296&&codeUnit<=57343)++i;len+=4}return len}module["lengthbytesutf32"]="lengthBytesUTF32;function" demangle(func){var="" haslibcxxabi="!!Module["___cxa_demangle"];if(hasLibcxxabi){try{var" buf="_malloc(func.length);writeStringToMemory(func.substr(1),buf);var" status="_malloc(4);var" ret="Module["___cxa_demangle"](buf,0,0,status);if(getValue(status,"i32")===0&&ret){return" pointer_stringify(ret)}}catch(e){}finally{if(buf)_free(buf);if(status)_free(status);if(ret)_free(ret)}}var="" i="3;var" basictypes="{"v":"void","b":"bool","c":"char","s":"short","i":"int","l":"long","f":"float","d":"double","w":"wchar_t","a":"signed" char","h":"unsigned="" char","t":"unsigned="" short","j":"unsigned="" int","m":"unsigned="" long","x":"long="" long","y":"unsigned="" long="" long","z":"..."};var="" subs="[];var" first="true;function" dump(x){if(x)module.print(x);module.print(func);var="" pre="" ;for(var="" a="0;a<i;a++)pre+="" ";module.print(pre+"^")}function="" parsenested(){i++;if(func[i]="=="K")i++;var" parts="[];while(func[i]!=="E"){if(func[i]==="S"){i++;var" next="func.indexOf("_",i);var" num="func.substring(i,next)||0;parts.push(subs[num]||"?");i=next+1;continue}if(func[i]==="C"){parts.push(parts[parts.length-1]);i+=2;continue}var" size="parseInt(func.substr(i));var" curr="func.substr(i+pre,size);parts.push(curr);subs.push(curr);i+=pre+size}i++;return" parts}function="" parse(rawlist,limit,allowvoid){limit="limit||Infinity;var" ,list="[];function" flushlist(){return"("+list.join(",="" ")+")"}var="" name;if(func[i]="=="N"){name=parseNested().join("::");limit--;if(limit===0)return" rawlist?[name]:name}else{if(func[i]="=="K"||first&&func[i]==="L")i++;var" ilist="parse(true);var" iret="parse(true,1,true);ret+=iRet[0]+"" "+name+"<"+ilist.join(",="" ")+"="">"}else{ret=name}paramLoop:while(i0){var c=func[i++];if(c in basicTypes){list.push(basicTypes[c])}else{switch(c){case"P":list.push(parse(true,1,true)[0]+"*");break;case"R":list.push(parse(true,1,true)[0]+"&");break;case"L":{i++;var end=func.indexOf("E",i);var size=end-i;list.push(func.substr(i,size));i+=size+2;break};case"A":{var size=parseInt(func.substr(i));i+=size.toString().length;if(func[i]!=="_")throw"?";i++;list.push(parse(true,1,true)[0]+" ["+size+"]");break};case"E":break paramLoop;default:ret+="?"+c;break paramLoop}}}if(!allowVoid&&list.length===1&&list[0]==="void")list=[];if(rawList){if(ret){list.push(ret+"?")}return list}else{return ret+flushList()}}var parsed=func;try{if(func=="Object._main"||func=="_main"){return"main()"}if(typeof func==="number")func=Pointer_stringify(func);if(func[0]!=="_")return func;if(func[1]!=="_")return func;if(func[2]!=="Z")return func;switch(func[3]){case"n":return"operator new()";case"d":return"operator delete()"}parsed=parse()}catch(e){parsed+="?"}if(parsed.indexOf("?")>=0&&!hasLibcxxabi){Runtime.warnOnce("warning: a problem occurred in builtin C++ name demangling; build with -s DEMANGLE_SUPPORT=1 to link in libcxxabi demangling")}return parsed}function demangleAll(text){return text.replace(/__Z[\w\d_]+/g,(function(x){var y=demangle(x);return x===y?x:x+" ["+y+"]"}))}function jsStackTrace(){var err=new Error;if(!err.stack){try{throw new Error(0)}catch(e){err=e}if(!err.stack){return"(no stack trace available)"}}return err.stack.toString()}function stackTrace(){return demangleAll(jsStackTrace())}Module["stackTrace"]=stackTrace;var PAGE_SIZE=4096;function alignMemoryPage(x){if(x%4096>0){x+=4096-x%4096}return x}var HEAP;var HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;var STATIC_BASE=0,STATICTOP=0,staticSealed=false;var STACK_BASE=0,STACKTOP=0,STACK_MAX=0;var DYNAMIC_BASE=0,DYNAMICTOP=0;function abortOnCannotGrowMemory(){abort("Cannot enlarge memory arrays. Either (1) compile with -s TOTAL_MEMORY=X with X higher than the current value "+TOTAL_MEMORY+", (2) compile with -s ALLOW_MEMORY_GROWTH=1 which adjusts the size at runtime but prevents some optimizations, (3) set Module.TOTAL_MEMORY to a higher value before the program runs, or if you want malloc to return NULL (0) instead of this abort, compile with -s ABORTING_MALLOC=0 ")}function enlargeMemory(){abortOnCannotGrowMemory()}var TOTAL_STACK=Module["TOTAL_STACK"]||5242880;var TOTAL_MEMORY=Module["TOTAL_MEMORY"]||33554432;var totalMemory=64*1024;while(totalMemory0){var callback=callbacks.shift();if(typeof callback=="function"){callback();continue}var func=callback.func;if(typeof func==="number"){if(callback.arg===undefined){Runtime.dynCall("v",func)}else{Runtime.dynCall("vi",func,[callback.arg])}}else{func(callback.arg===undefined?null:callback.arg)}}}var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATEXIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeExited=false;function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function ensureInitRuntime(){if(runtimeInitialized)return;runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function exitRuntime(){callRuntimeCallbacks(__ATEXIT__);runtimeExited=true}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}Module["addOnPreRun"]=addOnPreRun;function addOnInit(cb){__ATINIT__.unshift(cb)}Module["addOnInit"]=addOnInit;function addOnPreMain(cb){__ATMAIN__.unshift(cb)}Module["addOnPreMain"]=addOnPreMain;function addOnExit(cb){__ATEXIT__.unshift(cb)}Module["addOnExit"]=addOnExit;function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}Module["addOnPostRun"]=addOnPostRun;function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}Module["intArrayFromString"]=intArrayFromString;function intArrayToString(array){var ret=[];for(var i=0;i255){chr&=255}ret.push(String.fromCharCode(chr))}return ret.join("")}Module["intArrayToString"]=intArrayToString;function writeStringToMemory(string,buffer,dontAddNull){var array=intArrayFromString(string,dontAddNull);var i=0;while(i>0]=chr;i=i+1}}Module["writeStringToMemory"]=writeStringToMemory;function writeArrayToMemory(array,buffer){for(var i=0;i>0]=array[i]}}Module["writeArrayToMemory"]=writeArrayToMemory;function writeAsciiToMemory(str,buffer,dontAddNull){for(var i=0;i>0]=str.charCodeAt(i)}if(!dontAddNull)HEAP8[buffer>>0]=0}Module["writeAsciiToMemory"]=writeAsciiToMemory;function unSign(value,bits,ignore){if(value>=0){return value}return bits<=32?2*math.abs(1<=half&&(bits<=32||value>half)){value=-2*half+value}return value}if(!Math["imul"]||Math["imul"](4294967295,5)!==-5)Math["imul"]=function imul(a,b){var ah=a>>>16;var al=a&65535;var bh=b>>>16;var bl=b&65535;return al*bl+(ah*bl+al*bh<<16)|0};math.imul=math["imul"];if(!math["clz32"])math["clz32"]=(function(x){x=x>>>0;for(var i=0;i<32;i++){if(x&1<<31-i)return i}return="" 32});math.clz32="Math["clz32"];var" math_abs="Math.abs;var" math_cos="Math.cos;var" math_sin="Math.sin;var" math_tan="Math.tan;var" math_acos="Math.acos;var" math_asin="Math.asin;var" math_atan="Math.atan;var" math_atan2="Math.atan2;var" math_exp="Math.exp;var" math_log="Math.log;var" math_sqrt="Math.sqrt;var" math_ceil="Math.ceil;var" math_floor="Math.floor;var" math_pow="Math.pow;var" math_imul="Math.imul;var" math_fround="Math.fround;var" math_min="Math.min;var" math_clz32="Math.clz32;var" rundependencies="0;var" rundependencywatcher="null;var" dependenciesfulfilled="null;function" getuniquerundependency(id){return="" id}function="" addrundependency(id){rundependencies++;if(module["monitorrundependencies"]){module["monitorrundependencies"](rundependencies)}}module["addrundependency"]="addRunDependency;function" removerundependency(id){rundependencies--;if(module["monitorrundependencies"]){module["monitorrundependencies"](rundependencies)}if(rundependencies="=0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var" callback="dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}Module["removeRunDependency"]=removeRunDependency;Module["preloadedImages"]={};Module["preloadedAudios"]={};var" memoryinitializer="null;var" asm_consts="[(function(){{return" module.getrandomvalue()}}),(function(){{if(module.getrandomvalue="==undefined){try{var" window_="object" =="=typeof" window?window:self,crypto_="typeof" window_.crypto!="="undefined"?window_.crypto:window_.msCrypto,randomValuesStandard=(function(){var" buf="new" uint32array(1);crypto_.getrandomvalues(buf);return="" buf[0]="">>>0});randomValuesStandard();Module.getRandomValue=randomValuesStandard}catch(e){try{var crypto=require("crypto"),randomValueNodeJS=(function(){var buf=crypto.randomBytes(4);return(buf[0]<<24|buf[1]<<16|buf[2]<<8|buf[3])>>>0});randomValueNodeJS();Module.getRandomValue=randomValueNodeJS}catch(e){throw"No secure random number generator found"}}}}})];function _emscripten_asm_const_0(code){return ASM_CONSTS[code]()}STATIC_BASE=8;STATICTOP=STATIC_BASE+34944;__ATINIT__.push();allocate([8,201,188,243,103,230,9,106,59,167,202,132,133,174,103,187,43,248,148,254,114,243,110,60,241,54,29,95,58,245,79,165,209,130,230,173,127,82,14,81,31,108,62,43,140,104,5,155,107,189,65,251,171,217,131,31,121,33,126,19,25,205,224,91,103,230,9,106,133,174,103,187,114,243,110,60,58,245,79,165,127,82,14,81,140,104,5,155,171,217,131,31,25,205,224,91,133,59,140,1,189,241,36,255,248,37,195,1,96,220,55,0,183,76,62,255,195,66,61,0,50,76,164,1,225,164,76,255,76,61,163,255,117,62,31,0,81,145,64,255,118,65,14,0,162,115,214,255,6,138,46,0,124,230,244,255,10,138,143,0,52,26,194,0,184,244,76,0,129,143,41,1,190,244,19,255,123,170,122,255,98,129,68,0,121,213,147,0,86,101,30,255,161,103,155,0,140,89,67,255,239,229,190,1,67,11,181,0,198,240,137,254,238,69,188,255,67,151,238,0,19,42,108,255,229,85,113,1,50,68,135,255,17,106,9,0,50,103,1,255,80,1,168,1,35,152,30,255,16,168,185,1,56,89,232,255,101,210,252,0,41,250,71,0,204,170,79,255,14,46,239,255,80,77,239,0,189,214,75,255,17,141,249,0,38,80,76,255,190,85,117,0,86,228,170,0,156,216,208,1,195,207,164,255,150,66,76,255,175,225,16,255,141,80,98,1,76,219,242,0,198,162,114,0,46,218,152,0,155,43,241,254,155,160,104,255,51,187,165,0,2,17,175,0,66,84,160,1,247,58,30,0,35,65,53,254,69,236,191,0,45,134,245,1,163,123,221,0,32,110,20,255,52,23,165,0,186,214,71,0,233,176,96,0,242,239,54,1,57,89,138,0,83,0,84,255,136,160,100,0,92,142,120,254,104,124,190,0,181,177,62,255,250,41,85,0,152,130,42,1,96,252,246,0,151,151,63,254,239,133,62,0,32,56,156,0,45,167,189,255,142,133,179,1,131,86,211,0,187,179,150,254,250,170,14,255,210,163,78,0,37,52,151,0,99,77,26,0,238,156,213,255,213,192,209,1,73,46,84,0,20,65,41,1,54,206,79,0,201,131,146,254,170,111,24,255,177,33,50,254,171,38,203,255,78,247,116,0,209,221,153,0,133,128,178,1,58,44,25,0,201,39,59,1,189,19,252,0,49,229,210,1,117,187,117,0,181,179,184,1,0,114,219,0,48,94,147,0,245,41,56,0,125,13,204,254,244,173,119,0,44,221,32,254,84,234,20,0,249,160,198,1,236,126,234,255,47,99,168,254,170,226,153,255,102,179,216,0,226,141,122,255,122,66,153,254,182,245,134,0,227,228,25,1,214,57,235,255,216,173,56,255,181,231,210,0,119,128,157,255,129,95,136,255,110,126,51,0,2,169,183,255,7,130,98,254,69,176,94,255,116,4,227,1,217,242,145,255,202,173,31,1,105,1,39,255,46,175,69,0,228,47,58,255,215,224,69,254,207,56,69,255,16,254,139,255,23,207,212,255,202,20,126,255,95,213,96,255,9,176,33,0,200,5,207,255,241,42,128,254,35,33,192,255,248,229,196,1,129,17,120,0,251,103,151,255,7,52,112,255,140,56,66,255,40,226,245,255,217,70,37,254,172,214,9,255,72,67,134,1,146,192,214,255,44,38,112,0,68,184,75,255,206,90,251,0,149,235,141,0,181,170,58,0,116,244,239,0,92,157,2,0,102,173,98,0,233,137,96,1,127,49,203,0,5,155,148,0,23,148,9,255,211,122,12,0,34,134,26,255,219,204,136,0,134,8,41,255,224,83,43,254,85,25,247,0,109,127,0,254,169,136,48,0,238,119,219,255,231,173,213,0,206,18,254,254,8,186,7,255,126,9,7,1,111,42,72,0,111,52,236,254,96,63,141,0,147,191,127,254,205,78,192,255,14,106,237,1,187,219,76,0,175,243,187,254,105,89,173,0,85,25,89,1,162,243,148,0,2,118,209,254,33,158,9,0,139,163,46,255,93,70,40,0,108,42,142,254,111,252,142,255,155,223,144,0,51,229,167,255,73,252,155,255,94,116,12,255,152,160,218,255,156,238,37,255,179,234,207,255,197,0,179,255,154,164,141,0,225,196,104,0,10,35,25,254,209,212,242,255,97,253,222,254,184,101,229,0,222,18,127,1,164,136,135,255,30,207,140,254,146,97,243,0,129,192,26,254,201,84,33,255,111,10,78,255,147,81,178,255,4,4,24,0,161,238,215,255,6,141,33,0,53,215,14,255,41,181,208,255,231,139,157,0,179,203,221,255,255,185,113,0,189,226,172,255,113,66,214,255,202,62,45,255,102,64,8,255,78,174,16,254,133,117,68,255,182,120,89,255,133,114,211,0,189,110,21,255,15,10,106,0,41,192,1,0,152,232,121,255,188,60,160,255,153,113,206,255,0,183,226,254,180,13,72,255,176,160,14,254,211,201,134,255,158,24,143,0,127,105,53,0,96,12,189,0,167,215,251,255,159,76,128,254,106,101,225,255,30,252,4,0,146,12,174,0,89,241,178,254,10,229,166,255,123,221,42,254,30,20,212,0,82,128,3,0,48,209,243,0,119,121,64,255,50,227,156,255,0,110,197,1,103,27,144,0,133,59,140,1,189,241,36,255,248,37,195,1,96,220,55,0,183,76,62,255,195,66,61,0,50,76,164,1,225,164,76,255,76,61,163,255,117,62,31,0,81,145,64,255,118,65,14,0,162,115,214,255,6,138,46,0,124,230,244,255,10,138,143,0,52,26,194,0,184,244,76,0,129,143,41,1,190,244,19,255,123,170,122,255,98,129,68,0,121,213,147,0,86,101,30,255,161,103,155,0,140,89,67,255,239,229,190,1,67,11,181,0,198,240,137,254,238,69,188,255,234,113,60,255,37,255,57,255,69,178,182,254,128,208,179,0,118,26,125,254,3,7,214,255,241,50,77,255,85,203,197,255,211,135,250,255,25,48,100,255,187,213,180,254,17,88,105,0,83,209,158,1,5,115,98,0,4,174,60,254,171,55,110,255,217,181,17,255,20,188,170,0,146,156,102,254,87,214,174,255,114,122,155,1,233,44,170,0,127,8,239,1,214,236,234,0,175,5,219,0,49,106,61,255,6,66,208,255,2,106,110,255,81,234,19,255,215,107,192,255,67,151,238,0,19,42,108,255,229,85,113,1,50,68,135,255,17,106,9,0,50,103,1,255,80,1,168,1,35,152,30,255,16,168,185,1,56,89,232,255,101,210,252,0,41,250,71,0,204,170,79,255,14,46,239,255,80,77,239,0,189,214,75,255,17,141,249,0,38,80,76,255,190,85,117,0,86,228,170,0,156,216,208,1,195,207,164,255,150,66,76,255,175,225,16,255,141,80,98,1,76,219,242,0,198,162,114,0,46,218,152,0,155,43,241,254,155,160,104,255,178,9,252,254,100,110,212,0,14,5,167,0,233,239,163,255,28,151,157,1,101,146,10,255,254,158,70,254,71,249,228,0,88,30,50,0,68,58,160,255,191,24,104,1,129,66,129,255,192,50,85,255,8,179,138,255,38,250,201,0,115,80,160,0,131,230,113,0,125,88,147,0,90,68,199,0,253,76,158,0,28,255,118,0,113,250,254,0,66,75,46,0,230,218,43,0,229,120,186,1,148,68,43,0,136,124,238,1,187,107,197,255,84,53,246,255,51,116,254,255,51,187,165,0,2,17,175,0,66,84,160,1,247,58,30,0,35,65,53,254,69,236,191,0,45,134,245,1,163,123,221,0,32,110,20,255,52,23,165,0,186,214,71,0,233,176,96,0,242,239,54,1,57,89,138,0,83,0,84,255,136,160,100,0,92,142,120,254,104,124,190,0,181,177,62,255,250,41,85,0,152,130,42,1,96,252,246,0,151,151,63,254,239,133,62,0,32,56,156,0,45,167,189,255,142,133,179,1,131,86,211,0,187,179,150,254,250,170,14,255,68,113,21,255,222,186,59,255,66,7,241,1,69,6,72,0,86,156,108,254,55,167,89,0,109,52,219,254,13,176,23,255,196,44,106,255,239,149,71,255,164,140,125,255,159,173,1,0,51,41,231,0,145,62,33,0,138,111,93,1,185,83,69,0,144,115,46,0,97,151,16,255,24,228,26,0,49,217,226,0,113,75,234,254,193,153,12,255,182,48,96,255,14,13,26,0,128,195,249,254,69,193,59,0,132,37,81,254,125,106,60,0,214,240,169,1,164,227,66,0,210,163,78,0,37,52,151,0,99,77,26,0,238,156,213,255,213,192,209,1,73,46,84,0,20,65,41,1,54,206,79,0,201,131,146,254,170,111,24,255,177,33,50,254,171,38,203,255,78,247,116,0,209,221,153,0,133,128,178,1,58,44,25,0,201,39,59,1,189,19,252,0,49,229,210,1,117,187,117,0,181,179,184,1,0,114,219,0,48,94,147,0,245,41,56,0,125,13,204,254,244,173,119,0,44,221,32,254,84,234,20,0,249,160,198,1,236,126,234,255,143,62,221,0,129,89,214,255,55,139,5,254,68,20,191,255,14,204,178,1,35,195,217,0,47,51,206,1,38,246,165,0,206,27,6,254,158,87,36,0,217,52,146,255,125,123,215,255,85,60,31,255,171,13,7,0,218,245,88,254,252,35,60,0,55,214,160,255,133,101,56,0,224,32,19,254,147,64,234,0,26,145,162,1,114,118,125,0,248,252,250,0,101,94,196,255,198,141,226,254,51,42,182,0,135,12,9,254,109,172,210,255,197,236,194,1,241,65,154,0,48,156,47,255,153,67,55,255,218,165,34,254,74,180,179,0,218,66,71,1,88,122,99,0,212,181,219,255,92,42,231,255,239,0,154,0,245,77,183,255,94,81,170,1,18,213,216,0,171,93,71,0,52,94,248,0,18,151,161,254,197,209,66,255,174,244,15,254,162,48,183,0,49,61,240,254,182,93,195,0,199,228,6,1,200,5,17,255,137,45,237,255,108,148,4,0,90,79,237,255,39,63,77,255,53,82,207,1,142,22,118,255,101,232,18,1,92,26,67,0,5,200,88,255,33,168,138,255,149,225,72,0,2,209,27,255,44,245,168,1,220,237,17,255,30,211,105,254,141,238,221,0,128,80,245,254,111,254,14,0,222,95,190,1,223,9,241,0,146,76,212,255,108,205,104,255,63,117,153,0,144,69,48,0,35,228,111,0,192,33,193,255,112,214,190,254,115,152,151,0,23,102,88,0,51,74,248,0,226,199,143,254,204,162,101,255,208,97,189,1,245,104,18,0,230,246,30,255,23,148,69,0,110,88,52,254,226,181,89,255,208,47,90,254,114,161,80,255,33,116,248,0,179,152,87,255,69,144,177,1,88,238,26,255,58,32,113,1,1,77,69,0,59,121,52,255,152,238,83,0,52,8,193,0,231,39,233,255,199,34,138,0,222,68,173,0,91,57,242,254,220,210,127,255,192,7,246,254,151,35,187,0,195,236,165,0,111,93,206,0,212,247,133,1,154,133,209,255,155,231,10,0,64,78,38,0,122,249,100,1,30,19,97,255,62,91,249,1,248,133,77,0,197,63,168,254,116,10,82,0,184,236,113,254,212,203,194,255,61,100,252,254,36,5,202,255,119,91,153,255,129,79,29,0,103,103,171,254,237,215,111,255,216,53,69,0,239,240,23,0,194,149,221,255,38,225,222,0,232,255,180,254,118,82,133,255,57,209,177,1,139,232,133,0,158,176,46,254,194,115,46,0,88,247,229,1,28,103,191,0,221,222,175,254,149,235,44,0,151,228,25,254,218,105,103,0,142,85,210,0,149,129,190,255,213,65,94,254,117,134,224,255,82,198,117,0,157,221,220,0,163,101,36,0,197,114,37,0,104,172,166,254,11,182,0,0,81,72,188,255,97,188,16,255,69,6,10,0,199,147,145,255,8,9,115,1,65,214,175,255,217,173,209,0,80,127,166,0,247,229,4,254,167,183,124,255,90,28,204,254,175,59,240,255,11,41,248,1,108,40,51,255,144,177,195,254,150,250,126,0,138,91,65,1,120,60,222,255,245,193,239,0,29,214,189,255,128,2,25,0,80,154,162,0,77,220,107,1,234,205,74,255,54,166,103,255,116,72,9,0,228,94,47,255,30,200,25,255,35,214,89,255,61,176,140,255,83,226,163,255,75,130,172,0,128,38,17,0,95,137,152,255,215,124,159,1,79,93,0,0,148,82,157,254,195,130,251,255,40,202,76,255,251,126,224,0,157,99,62,254,207,7,225,255,96,68,195,0,140,186,157,255,131,19,231,255,42,128,254,0,52,219,61,254,102,203,72,0,141,7,11,255,186,164,213,0,31,122,119,0,133,242,145,0,208,252,232,255,91,213,182,255,143,4,250,254,249,215,74,0,165,30,111,1,171,9,223,0,229,123,34,1,92,130,26,255,77,155,45,1,195,139,28,255,59,224,78,0,136,17,247,0,108,121,32,0,79,250,189,255,96,227,252,254,38,241,62,0,62,174,125,255,155,111,93,255,10,230,206,1,97,197,40,255,0,49,57,254,65,250,13,0,18,251,150,255,220,109,210,255,5,174,166,254,44,129,189,0,235,35,147,255,37,247,141,255,72,141,4,255,103,107,255,0,247,90,4,0,53,44,42,0,2,30,240,0,4,59,63,0,88,78,36,0,113,167,180,0,190,71,193,255,199,158,164,255,58,8,172,0,77,33,12,0,65,63,3,0,153,77,33,255,172,254,102,1,228,221,4,255,87,30,254,1,146,41,86,255,138,204,239,254,108,141,17,255,187,242,135,0,210,208,127,0,68,45,14,254,73,96,62,0,81,60,24,255,170,6,36,255,3,249,26,0,35,213,109,0,22,129,54,255,21,35,225,255,234,61,56,255,58,217,6,0,143,124,88,0,236,126,66,0,209,38,183,255,34,238,6,255,174,145,102,0,95,22,211,0,196,15,153,254,46,84,232,255,117,34,146,1,231,250,74,255,27,134,100,1,92,187,195,255,170,198,112,0,120,28,42,0,209,70,67,0,29,81,31,0,29,168,100,1,169,173,160,0,107,35,117,0,62,96,59,255,81,12,69,1,135,239,190,255,220,252,18,0,163,220,58,255,137,137,188,255,83,102,109,0,96,6,76,0,234,222,210,255,185,174,205,1,60,158,213,255,13,241,214,0,172,129,140,0,93,104,242,0,192,156,251,0,43,117,30,0,225,81,158,0,127,232,218,0,226,28,203,0,233,27,151,255,117,43,5,255,242,14,47,255,33,20,6,0,137,251,44,254,27,31,245,255,183,214,125,254,40,121,149,0,186,158,213,255,89,8,227,0,69,88,0,254,203,135,225,0,201,174,203,0,147,71,184,0,18,121,41,254,94,5,78,0,224,214,240,254,36,5,180,0,251,135,231,1,163,138,212,0,210,249,116,254,88,129,187,0,19,8,49,254,62,14,144,255,159,76,211,0,214,51,82,0,109,117,228,254,103,223,203,255,75,252,15,1,154,71,220,255,23,13,91,1,141,168,96,255,181,182,133,0,250,51,55,0,234,234,212,254,175,63,158,0,39,240,52,1,158,189,36,255,213,40,85,1,32,180,247,255,19,102,26,1,84,24,97,255,69,21,222,0,148,139,122,255,220,213,235,1,232,203,255,0,121,57,147,0,227,7,154,0,53,22,147,1,72,1,225,0,82,134,48,254,83,60,157,255,145,72,169,0,34,103,239,0,198,233,47,0,116,19,4,255,184,106,9,255,183,129,83,0,36,176,230,1,34,103,72,0,219,162,134,0,245,42,158,0,32,149,96,254,165,44,144,0,202,239,72,254,215,150,5,0,42,66,36,1,132,215,175,0,86,174,86,255,26,197,156,255,49,232,135,254,103,182,82,0,253,128,176,1,153,178,122,0,245,250,10,0,236,24,178,0,137,106,132,0,40,29,41,0,50,30,152,255,124,105,38,0,230,191,75,0,143,43,170,0,44,131,20,255,44,13,23,255,237,255,155,1,159,109,100,255,112,181,24,255,104,220,108,0,55,211,131,0,99,12,213,255,152,151,145,255,238,5,159,0,97,155,8,0,33,108,81,0,1,3,103,0,62,109,34,255,250,155,180,0,32,71,195,255,38,70,145,1,159,95,245,0,69,229,101,1,136,28,240,0,79,224,25,0,78,110,121,255,248,168,124,0,187,128,247,0,2,147,235,254,79,11,132,0,70,58,12,1,181,8,163,255,79,137,133,255,37,170,11,255,141,243,85,255,176,231,215,255,204,150,164,255,239,215,39,255,46,87,156,254,8,163,88,255,172,34,232,0,66,44,102,255,27,54,41,254,236,99,87,255,41,123,169,1,52,114,43,0,117,134,40,0,155,134,26,0,231,207,91,254,35,132,38,255,19,102,125,254,36,227,133,255,118,3,113,255,29,13,124,0,152,96,74,1,88,146,206,255,167,191,220,254,162,18,88,255,182,100,23,0,31,117,52,0,81,46,106,1,12,2,7,0,69,80,201,1,209,246,172,0,12,48,141,1,224,211,88,0,116,226,159,0,122,98,130,0,65,236,234,1,225,226,9,255,207,226,123,1,89,214,59,0,112,135,88,1,90,244,203,255,49,11,38,1,129,108,186,0,89,112,15,1,101,46,204,255,127,204,45,254,79,255,221,255,51,73,18,255,127,42,101,255,241,21,202,0,160,227,7,0,105,50,236,0,79,52,197,255,104,202,208,1,180,15,16,0,101,197,78,255,98,77,203,0,41,185,241,1,35,193,124,0,35,155,23,255,207,53,192,0,11,125,163,1,249,158,185,255,4,131,48,0,21,93,111,255,61,121,231,1,69,200,36,255,185,48,185,255,111,238,21,255,39,50,25,255,99,215,163,255,87,212,30,255,164,147,5,255,128,6,35,1,108,223,110,255,194,76,178,0,74,101,180,0,243,47,48,0,174,25,43,255,82,173,253,1,54,114,192,255,40,55,91,0,215,108,176,255,11,56,7,0,224,233,76,0,209,98,202,254,242,25,125,0,44,193,93,254,203,8,177,0,135,176,19,0,112,71,213,255,206,59,176,1,4,67,26,0,14,143,213,254,42,55,208,255,60,67,120,0,193,21,163,0,99,164,115,0,10,20,118,0,156,212,222,254,160,7,217,255,114,245,76,1,117,59,123,0,176,194,86,254,213,15,176,0,78,206,207,254,213,129,59,0,233,251,22,1,96,55,152,255,236,255,15,255,197,89,84,255,93,149,133,0,174,160,113,0,234,99,169,255,152,116,88,0,144,164,83,255,95,29,198,255,34,47,15,255,99,120,134,255,5,236,193,0,249,247,126,255,147,187,30,0,50,230,117,255,108,217,219,255,163,81,166,255,72,25,169,254,155,121,79,255,28,155,89,254,7,126,17,0,147,65,33,1,47,234,253,0,26,51,18,0,105,83,199,255,163,196,230,0,113,248,164,0,226,254,218,0,189,209,203,255,164,247,222,254,255,35,165,0,4,188,243,1,127,179,71,0,37,237,254,255,100,186,240,0,5,57,71,254,103,72,73,255,244,18,81,254,229,210,132,255,238,6,180,255,11,229,174,255,227,221,192,1,17,49,28,0,163,215,196,254,9,118,4,255,51,240,71,0,113,129,109,255,76,240,231,0,188,177,127,0,125,71,44,1,26,175,243,0,94,169,25,254,27,230,29,0,15,139,119,1,168,170,186,255,172,197,76,255,252,75,188,0,137,124,196,0,72,22,96,255,45,151,249,1,220,145,100,0,64,192,159,255,120,239,226,0,129,178,146,0,0,192,125,0,235,138,234,0,183,157,146,0,83,199,192,255,184,172,72,255,73,225,128,0,77,6,250,255,186,65,67,0,104,246,207,0,188,32,138,255,218,24,242,0,67,138,81,254,237,129,121,255,20,207,150,1,41,199,16,255,6,20,128,0,159,118,5,0,181,16,143,255,220,38,15,0,23,64,147,254,73,26,13,0,87,228,57,1,204,124,128,0,43,24,223,0,219,99,199,0,22,75,20,255,19,27,126,0,157,62,215,0,110,29,230,0,179,167,255,1,54,252,190,0,221,204,182,254,179,158,65,255,81,157,3,0,194,218,159,0,170,223,0,0,224,11,32,255,38,197,98,0,168,164,37,0,23,88,7,1,164,186,110,0,96,36,134,0,234,242,229,0,250,121,19,0,242,254,112,255,3,47,94,1,9,239,6,255,81,134,153,254,214,253,168,255,67,124,224,0,245,95,74,0,28,30,44,254,1,109,220,255,178,89,89,0,252,36,76,0,24,198,46,255,76,77,111,0,134,234,136,255,39,94,29,0,185,72,234,255,70,68,135,255,231,102,7,254,77,231,140,0,167,47,58,1,148,97,118,255,16,27,225,1,166,206,143,255,110,178,214,255,180,131,162,0,143,141,225,1,13,218,78,255,114,153,33,1,98,104,204,0,175,114,117,1,167,206,75,0,202,196,83,1,58,64,67,0,138,47,111,1,196,247,128,255,137,224,224,254,158,112,207,0,154,100,255,1,134,37,107,0,198,128,79,255,127,209,155,255,163,254,185,254,60,14,243,0,31,219,112,254,29,217,65,0,200,13,116,254,123,60,196,255,224,59,184,254,242,89,196,0,123,16,75,254,149,16,206,0,69,254,48,1,231,116,223,255,209,160,65,1,200,80,98,0,37,194,184,254,148,63,34,0,139,240,65,255,217,144,132,255,56,38,45,254,199,120,210,0,108,177,166,255,160,222,4,0,220,126,119,254,165,107,160,255,82,220,248,1,241,175,136,0,144,141,23,255,169,138,84,0,160,137,78,255,226,118,80,255,52,27,132,255,63,96,139,255,152,250,39,0,188,155,15,0,232,51,150,254,40,15,232,255,240,229,9,255,137,175,27,255,75,73,97,1,218,212,11,0,135,5,162,1,107,185,213,0,2,249,107,255,40,242,70,0,219,200,25,0,25,157,13,0,67,82,80,255,196,249,23,255,145,20,149,0,50,72,146,0,94,76,148,1,24,251,65,0,31,192,23,0,184,212,201,255,123,233,162,1,247,173,72,0,162,87,219,254,126,134,89,0,159,11,12,254,166,105,29,0,73,27,228,1,113,120,183,255,66,163,109,1,212,143,11,255,159,231,168,1,255,128,90,0,57,14,58,254,89,52,10,255,253,8,163,1,0,145,210,255,10,129,85,1,46,181,27,0,103,136,160,254,126,188,209,255,34,35,111,0,215,219,24,255,212,11,214,254,101,5,118,0,232,197,133,255,223,167,109,255,237,80,86,255,70,139,94,0,158,193,191,1,155,15,51,255,15,190,115,0,78,135,207,255,249,10,27,1,181,125,233,0,95,172,13,254,170,213,161,255,39,236,138,255,95,93,87,255,190,128,95,0,125,15,206,0,166,150,159,0,227,15,158,255,206,158,120,255,42,141,128,0,101,178,120,1,156,109,131,0,218,14,44,254,247,168,206,255,212,112,28,0,112,17,228,255,90,16,37,1,197,222,108,0,254,207,83,255,9,90,243,255,243,244,172,0,26,88,115,255,205,116,122,0,191,230,193,0,180,100,11,1,217,37,96,255,154,78,156,0,235,234,31,255,206,178,178,255,149,192,251,0,182,250,135,0,246,22,105,0,124,193,109,255,2,210,149,255,169,17,170,0,0,96,110,255,117,9,8,1,50,123,40,255,193,189,99,0,34,227,160,0,48,80,70,254,211,51,236,0,45,122,245,254,44,174,8,0,173,37,233,255,158,65,171,0,122,69,215,255,90,80,2,255,131,106,96,254,227,114,135,0,205,49,119,254,176,62,64,255,82,51,17,255,241,20,243,255,130,13,8,254,128,217,243,255,162,27,1,254,90,118,241,0,246,198,246,255,55,16,118,255,200,159,157,0,163,17,1,0,140,107,121,0,85,161,118,255,38,0,149,0,156,47,238,0,9,166,166,1,75,98,181,255,50,74,25,0,66,15,47,0,139,225,159,0,76,3,142,255,14,238,184,0,11,207,53,255,183,192,186,1,171,32,174,255,191,76,221,1,247,170,219,0,25,172,50,254,217,9,233,0,203,126,68,255,183,92,48,0,127,167,183,1,65,49,254,0,16,63,127,1,254,21,170,255,59,224,127,254,22,48,63,255,27,78,130,254,40,195,29,0,250,132,112,254,35,203,144,0,104,169,168,0,207,253,30,255,104,40,38,254,94,228,88,0,206,16,128,255,212,55,122,255,223,22,234,0,223,197,127,0,253,181,181,1,145,102,118,0,236,153,36,255,212,217,72,255,20,38,24,254,138,62,62,0,152,140,4,0,230,220,99,255,1,21,212,255,148,201,231,0,244,123,9,254,0,171,210,0,51,58,37,255,1,255,14,255,244,183,145,254,0,242,166,0,22,74,132,0,121,216,41,0,95,195,114,254,133,24,151,255,156,226,231,255,247,5,77,255,246,148,115,254,225,92,81,255,222,80,246,254,170,123,89,255,74,199,141,0,29,20,8,255,138,136,70,255,93,75,92,0,221,147,49,254,52,126,226,0,229,124,23,0,46,9,181,0,205,64,52,1,131,254,28,0,151,158,212,0,131,64,78,0,206,25,171,0,0,230,139,0,191,253,110,254,103,247,167,0,64,40,40,1,42,165,241,255,59,75,228,254,124,243,189,255,196,92,178,255,130,140,86,255,141,89,56,1,147,198,5,255,203,248,158,254,144,162,141,0,11,172,226,0,130,42,21,255,1,167,143,255,144,36,36,255,48,88,164,254,168,170,220,0,98,71,214,0,91,208,79,0,159,76,201,1,166,42,214,255,69,255,0,255,6,128,125,255,190,1,140,0,146,83,218,255,215,238,72,1,122,127,53,0,189,116,165,255,84,8,66,255,214,3,208,255,213,110,133,0,195,168,44,1,158,231,69,0,162,64,200,254,91,58,104,0,182,58,187,254,249,228,136,0,203,134,76,254,99,221,233,0,75,254,214,254,80,69,154,0,64,152,248,254,236,136,202,255,157,105,153,254,149,175,20,0,22,35,19,255,124,121,233,0,186,250,198,254,132,229,139,0,137,80,174,255,165,125,68,0,144,202,148,254,235,239,248,0,135,184,118,0,101,94,17,255,122,72,70,254,69,130,146,0,127,222,248,1,69,127,118,255,30,82,215,254,188,74,19,255,229,167,194,254,117,25,66,255,65,234,56,254,213,22,156,0,151,59,93,254,45,28,27,255,186,126,164,255,32,6,239,0,127,114,99,1,219,52,2,255,99,96,166,254,62,190,126,255,108,222,168,1,75,226,174,0,230,226,199,0,60,117,218,255,252,248,20,1,214,188,204,0,31,194,134,254,123,69,192,255,169,173,36,254,55,98,91,0,223,42,102,254,137,1,102,0,157,90,25,0,239,122,64,255,252,6,233,0,7,54,20,255,82,116,174,0,135,37,54,255,15,186,125,0,227,112,175,255,100,180,225,255,42,237,244,255,244,173,226,254,248,18,33,0,171,99,150,255,74,235,50,255,117,82,32,254,106,168,237,0,207,109,208,1,228,9,186,0,135,60,169,254,179,92,143,0,244,170,104,255,235,45,124,255,70,99,186,0,117,137,183,0,224,31,215,0,40,9,100,0,26,16,95,1,68,217,87,0,8,151,20,255,26,100,58,255,176,165,203,1,52,118,70,0,7,32,254,254,244,254,245,255,167,144,194,255,125,113,23,255,176,121,181,0,136,84,209,0,138,6,30,255,89,48,28,0,33,155,14,255,25,240,154,0,141,205,109,1,70,115,62,255,20,40,107,254,138,154,199,255,94,223,226,255,157,171,38,0,163,177,25,254,45,118,3,255,14,222,23,1,209,190,81,255,118,123,232,1,13,213,101,255,123,55,123,254,27,246,165,0,50,99,76,255,140,214,32,255,97,65,67,255,24,12,28,0,174,86,78,1,64,247,96,0,160,135,67,0,66,55,243,255,147,204,96,255,26,6,33,255,98,51,83,1,153,213,208,255,2,184,54,255,25,218,11,0,49,67,246,254,18,149,72,255,13,25,72,0,42,79,214,0,42,4,38,1,27,139,144,255,149,187,23,0,18,164,132,0,245,84,184,254,120,198,104,255,126,218,96,0,56,117,234,255,13,29,214,254,68,47,10,255,167,154,132,254,152,38,198,0,66,178,89,255,200,46,171,255,13,99,83,255,210,187,253,255,170,45,42,1,138,209,124,0,214,162,141,0,12,230,156,0,102,36,112,254,3,147,67,0,52,215,123,255,233,171,54,255,98,137,62,0,247,218,39,255,231,218,236,0,247,191,127,0,195,146,84,0,165,176,92,255,19,212,94,255,17,74,227,0,88,40,153,1,198,147,1,255,206,67,245,254,240,3,218,255,61,141,213,255,97,183,106,0,195,232,235,254,95,86,154,0,209,48,205,254,118,209,241,255,240,120,223,1,213,29,159,0,163,127,147,255,13,218,93,0,85,24,68,254,70,20,80,255,189,5,140,1,82,97,254,255,99,99,191,255,132,84,133,255,107,218,116,255,112,122,46,0,105,17,32,0,194,160,63,255,68,222,39,1,216,253,92,0,177,105,205,255,149,201,195,0,42,225,11,255,40,162,115,0,9,7,81,0,165,218,219,0,180,22,0,254,29,146,252,255,146,207,225,1,180,135,96,0,31,163,112,0,177,11,219,255,133,12,193,254,43,78,50,0,65,113,121,1,59,217,6,255,110,94,24,1,112,172,111,0,7,15,96,0,36,85,123,0,71,150,21,255,208,73,188,0,192,11,167,1,213,245,34,0,9,230,92,0,162,142,39,255,215,90,27,0,98,97,89,0,94,79,211,0,90,157,240,0,95,220,126,1,102,176,226,0,36,30,224,254,35,31,127,0,231,232,115,1,85,83,130,0,210,73,245,255,47,143,114,255,68,65,197,0,59,72,62,255,183,133,173,254,93,121,118,255,59,177,81,255,234,69,173,255,205,128,177,0,220,244,51,0,26,244,209,1,73,222,77,255,163,8,96,254,150,149,211,0,158,254,203,1,54,127,139,0,161,224,59,0,4,109,22,255,222,42,45,255,208,146,102,255,236,142,187,0,50,205,245,255,10,74,89,254,48,79,142,0,222,76,130,255,30,166,63,0,236,12,13,255,49,184,244,0,187,113,102,0,218,101,253,0,153,57,182,254,32,150,42,0,25,198,146,1,237,241,56,0,140,68,5,0,91,164,172,255,78,145,186,254,67,52,205,0,219,207,129,1,109,115,17,0,54,143,58,1,21,248,120,255,179,255,30,0,193,236,66,255,1,255,7,255,253,192,48,255,19,69,217,1,3,214,0,255,64,101,146,1,223,125,35,255,235,73,179,255,249,167,226,0,225,175,10,1,97,162,58,0,106,112,171,1,84,172,5,255,133,140,178,255,134,245,142,0,97,90,125,255,186,203,185,255,223,77,23,255,192,92,106,0,15,198,115,255,217,152,248,0,171,178,120,255,228,134,53,0,176,54,193,1,250,251,53,0,213,10,100,1,34,199,106,0,151,31,244,254,172,224,87,255,14,237,23,255,253,85,26,255,127,39,116,255,172,104,100,0,251,14,70,255,212,208,138,255,253,211,250,0,176,49,165,0,15,76,123,255,37,218,160,255,92,135,16,1,10,126,114,255,70,5,224,255,247,249,141,0,68,20,60,1,241,210,189,255,195,217,187,1,151,3,113,0,151,92,174,0,231,62,178,255,219,183,225,0,23,23,33,255,205,181,80,0,57,184,248,255,67,180,1,255,90,123,93,255,39,0,162,255,96,248,52,255,84,66,140,0,34,127,228,255,194,138,7,1,166,110,188,0,21,17,155,1,154,190,198,255,214,80,59,255,18,7,143,0,72,29,226,1,199,217,249,0,232,161,71,1,149,190,201,0,217,175,95,254,113,147,67,255,138,143,199,255,127,204,1,0,29,182,83,1,206,230,155,255,186,204,60,0,10,125,85,255,232,96,25,255,255,89,247,255,213,254,175,1,232,193,81,0,28,43,156,254,12,69,8,0,147,24,248,0,18,198,49,0,134,60,35,0,118,246,18,255,49,88,254,254,228,21,186,255,182,65,112,1,219,22,1,255,22,126,52,255,189,53,49,255,112,25,143,0,38,127,55,255,226,101,163,254,208,133,61,255,137,69,174,1,190,118,145,255,60,98,219,255,217,13,245,255,250,136,10,0,84,254,226,0,201,31,125,1,240,51,251,255,31,131,130,255,2,138,50,255,215,215,177,1,223,12,238,255,252,149,56,255,124,91,68,255,72,126,170,254,119,255,100,0,130,135,232,255,14,79,178,0,250,131,197,0,138,198,208,0,121,216,139,254,119,18,36,255,29,193,122,0,16,42,45,255,213,240,235,1,230,190,169,255,198,35,228,254,110,173,72,0,214,221,241,255,56,148,135,0,192,117,78,254,141,93,207,255,143,65,149,0,21,18,98,255,95,44,244,1,106,191,77,0,254,85,8,254,214,110,176,255,73,173,19,254,160,196,199,255,237,90,144,0,193,172,113,255,200,155,136,254,228,90,221,0,137,49,74,1,164,221,215,255,209,189,5,255,105,236,55,255,42,31,129,1,193,255,236,0,46,217,60,0,138,88,187,255,226,82,236,255,81,69,151,255,142,190,16,1,13,134,8,0,127,122,48,255,81,64,156,0,171,243,139,0,237,35,246,0,122,143,193,254,212,122,146,0,95,41,255,1,87,132,77,0,4,212,31,0,17,31,78,0,39,45,173,254,24,142,217,255,95,9,6,255,227,83,6,0,98,59,130,254,62,30,33,0,8,115,211,1,162,97,128,255,7,184,23,254,116,28,168,255,248,138,151,255,98,244,240,0,186,118,130,0,114,248,235,255,105,173,200,1,160,124,71,255,94,36,164,1,175,65,146,255,238,241,170,254,202,198,197,0,228,71,138,254,45,246,109,255,194,52,158,0,133,187,176,0,83,252,154,254,89,189,221,255,170,73,252,0,148,58,125,0,36,68,51,254,42,69,177,255,168,76,86,255,38,100,204,255,38,53,35,0,175,19,97,0,225,238,253,255,81,81,135,0,210,27,255,254,235,73,107,0,8,207,115,0,82,127,136,0,84,99,21,254,207,19,136,0,100,164,101,0,80,208,77,255,132,207,237,255,15,3,15,255,33,166,110,0,156,95,85,255,37,185,111,1,150,106,35,255,166,151,76,0,114,87,135,255,159,194,64,0,12,122,31,255,232,7,101,254,173,119,98,0,154,71,220,254,191,57,53,255,168,232,160,255,224,32,99,255,218,156,165,0,151,153,163,0,217,13,148,1,197,113,89,0,149,28,161,254,207,23,30,0,105,132,227,255,54,230,94,255,133,173,204,255,92,183,157,255,88,144,252,254,102,33,90,0,159,97,3,0,181,218,155,255,240,114,119,0,106,214,53,255,165,190,115,1,152,91,225,255,88,106,44,255,208,61,113,0,151,52,124,0,191,27,156,255,110,54,236,1,14,30,166,255,39,127,207,1,229,199,28,0,188,228,188,254,100,157,235,0,246,218,183,1,107,22,193,255,206,160,95,0,76,239,147,0,207,161,117,0,51,166,2,255,52,117,10,254,73,56,227,255,152,193,225,0,132,94,136,255,101,191,209,0,32,107,229,255,198,43,180,1,100,210,118,0,114,67,153,255,23,88,26,255,89,154,92,1,220,120,140,255,144,114,207,255,252,115,250,255,34,206,72,0,138,133,127,255,8,178,124,1,87,75,97,0,15,229,92,254,240,67,131,255,118,123,227,254,146,120,104,255,145,213,255,1,129,187,70,255,219,119,54,0,1,19,173,0,45,150,148,1,248,83,72,0,203,233,169,1,142,107,56,0,247,249,38,1,45,242,80,255,30,233,103,0,96,82,70,0,23,201,111,0,81,39,30,255,161,183,78,255,194,234,33,255,68,227,140,254,216,206,116,0,70,27,235,255,104,144,79,0,164,230,93,254,214,135,156,0,154,187,242,254,188,20,131,255,36,109,174,0,159,112,241,0,5,110,149,1,36,165,218,0,166,29,19,1,178,46,73,0,93,43,32,254,248,189,237,0,102,155,141,0,201,93,195,255,241,139,253,255,15,111,98,255,108,65,163,254,155,79,190,255,73,174,193,254,246,40,48,255,107,88,11,254,202,97,85,255,253,204,18,255,113,242,66,0,110,160,194,254,208,18,186,0,81,21,60,0,188,104,167,255,124,166,97,254,210,133,142,0,56,242,137,254,41,111,130,0,111,151,58,1,111,213,141,255,183,172,241,255,38,6,196,255,185,7,123,255,46,11,246,0,245,105,119,1,15,2,161,255,8,206,45,255,18,202,74,255,83,124,115,1,212,141,157,0,83,8,209,254,139,15,232,255,172,54,173,254,50,247,132,0,214,189,213,0,144,184,105,0,223,254,248,0,255,147,240,255,23,188,72,0,7,51,54,0,188,25,180,254,220,180,0,255,83,160,20,0,163,189,243,255,58,209,194,255,87,73,60,0,106,24,49,0,245,249,220,0,22,173,167,0,118,11,195,255,19,126,237,0,110,159,37,255,59,82,47,0,180,187,86,0,188,148,208,1,100,37,133,255,7,112,193,0,129,188,156,255,84,106,129,255,133,225,202,0,14,236,111,255,40,20,101,0,172,172,49,254,51,54,74,255,251,185,184,255,93,155,224,255,180,249,224,1,230,178,146,0,72,57,54,254,178,62,184,0,119,205,72,0,185,239,253,255,61,15,218,0,196,67,56,255,234,32,171,1,46,219,228,0,208,108,234,255,20,63,232,255,165,53,199,1,133,228,5,255,52,205,107,0,74,238,140,255,150,156,219,254,239,172,178,255,251,189,223,254,32,142,211,255,218,15,138,1,241,196,80,0,28,36,98,254,22,234,199,0,61,237,220,255,246,57,37,0,142,17,142,255,157,62,26,0,43,238,95,254,3,217,6,255,213,25,240,1,39,220,174,255,154,205,48,254,19,13,192,255,244,34,54,254,140,16,155,0,240,181,5,254,155,193,60,0,166,128,4,255,36,145,56,255,150,240,219,0,120,51,145,0,82,153,42,1,140,236,146,0,107,92,248,1,189,10,3,0,63,136,242,0,211,39,24,0,19,202,161,1,173,27,186,255,210,204,239,254,41,209,162,255,182,254,159,255,172,116,52,0,195,103,222,254,205,69,59,0,53,22,41,1,218,48,194,0,80,210,242,0,210,188,207,0,187,161,161,254,216,17,1,0,136,225,113,0,250,184,63,0,223,30,98,254,77,168,162,0,59,53,175,0,19,201,10,255,139,224,194,0,147,193,154,255,212,189,12,254,1,200,174,255,50,133,113,1,94,179,90,0,173,182,135,0,94,177,113,0,43,89,215,255,136,252,106,255,123,134,83,254,5,245,66,255,82,49,39,1,220,2,224,0,97,129,177,0,77,59,89,0,61,29,155,1,203,171,220,255,92,78,139,0,145,33,181,255,169,24,141,1,55,150,179,0,139,60,80,255,218,39,97,0,2,147,107,255,60,248,72,0,173,230,47,1,6,83,182,255,16,105,162,254,137,212,81,255,180,184,134,1,39,222,164,255,221,105,251,1,239,112,125,0,63,7,97,0,63,104,227,255,148,58,12,0,90,60,224,255,84,212,252,0,79,215,168,0,248,221,199,1,115,121,1,0,36,172,120,0,32,162,187,255,57,107,49,255,147,42,21,0,106,198,43,1,57,74,87,0,126,203,81,255,129,135,195,0,140,31,177,0,221,139,194,0,3,222,215,0,131,68,231,0,177,86,178,254,124,151,180,0,184,124,38,1,70,163,17,0,249,251,181,1,42,55,227,0,226,161,44,0,23,236,110,0,51,149,142,1,93,5,236,0,218,183,106,254,67,24,77,0,40,245,209,255,222,121,153,0,165,57,30,0,83,125,60,0,70,38,82,1,229,6,188,0,109,222,157,255,55,118,63,255,205,151,186,0,227,33,149,255,254,176,246,1,227,177,227,0,34,106,163,254,176,43,79,0,106,95,78,1,185,241,122,255,185,14,61,0,36,1,202,0,13,178,162,255,247,11,132,0,161,230,92,1,65,1,185,255,212,50,165,1,141,146,64,255,158,242,218,0,21,164,125,0,213,139,122,1,67,71,87,0,203,158,178,1,151,92,43,0,152,111,5,255,39,3,239,255,217,255,250,255,176,63,71,255,74,245,77,1,250,174,18,255,34,49,227,255,246,46,251,255,154,35,48,1,125,157,61,255,106,36,78,255,97,236,153,0,136,187,120,255,113,134,171,255,19,213,217,254,216,94,209,255,252,5,61,0,94,3,202,0,3,26,183,255,64,191,43,255,30,23,21,0,129,141,77,255,102,120,7,1,194,76,140,0,188,175,52,255,17,81,148,0,232,86,55,1,225,48,172,0,134,42,42,255,238,50,47,0,169,18,254,0,20,147,87,255,14,195,239,255,69,247,23,0,238,229,128,255,177,49,112,0,168,98,251,255,121,71,248,0,243,8,145,254,246,227,153,255,219,169,177,254,251,139,165,255,12,163,185,255,164,40,171,255,153,159,27,254,243,109,91,255,222,24,112,1,18,214,231,0,107,157,181,254,195,147,0,255,194,99,104,255,89,140,190,255,177,66,126,254,106,185,66,0,49,218,31,0,252,174,158,0,188,79,230,1,238,41,224,0,212,234,8,1,136,11,181,0,166,117,83,255,68,195,94,0,46,132,201,0,240,152,88,0,164,57,69,254,160,224,42,255,59,215,67,255,119,195,141,255,36,180,121,254,207,47,8,255,174,210,223,0,101,197,68,255,255,82,141,1,250,137,233,0,97,86,133,1,16,80,69,0,132,131,159,0,116,93,100,0,45,141,139,0,152,172,157,255,90,43,91,0,71,153,46,0,39,16,112,255,217,136,97,255,220,198,25,254,177,53,49,0,222,88,134,255,128,15,60,0,207,192,169,255,192,116,209,255,106,78,211,1,200,213,183,255,7,12,122,254,222,203,60,255,33,110,199,254,251,106,117,0,228,225,4,1,120,58,7,255,221,193,84,254,112,133,27,0,189,200,201,255,139,135,150,0,234,55,176,255,61,50,65,0,152,108,169,255,220,85,1,255,112,135,227,0,162,26,186,0,207,96,185,254,244,136,107,0,93,153,50,1,198,97,151,0,110,11,86,255,143,117,174,255,115,212,200,0,5,202,183,0,237,164,10,254,185,239,62,0,236,120,18,254,98,123,99,255,168,201,194,254,46,234,214,0,191,133,49,255,99,169,119,0,190,187,35,1,115,21,45,255,249,131,72,0,112,6,123,255,214,49,181,254,166,233,34,0,92,197,102,254,253,228,205,255,3,59,201,1,42,98,46,0,219,37,35,255,169,195,38,0,94,124,193,1,156,43,223,0,95,72,133,254,120,206,191,0,122,197,239,255,177,187,79,255,254,46,2,1,250,167,190,0,84,129,19,0,203,113,166,255,249,31,189,254,72,157,202,255,208,71,73,255,207,24,72,0,10,16,18,1,210,81,76,255,88,208,192,255,126,243,107,255,238,141,120,255,199,121,234,255,137,12,59,255,36,220,123,255,148,179,60,254,240,12,29,0,66,0,97,1,36,30,38,255,115,1,93,255,96,103,231,255,197,158,59,1,192,164,240,0,202,202,57,255,24,174,48,0,89,77,155,1,42,76,215,0,244,151,233,0,23,48,81,0,239,127,52,254,227,130,37,255,248,116,93,1,124,132,118,0,173,254,192,1,6,235,83,255,110,175,231,1,251,28,182,0,129,249,93,254,84,184,128,0,76,181,62,0,175,128,186,0,100,53,136,254,109,29,226,0,221,233,58,1,20,99,74,0,0,22,160,0,134,13,21,0,9,52,55,255,17,89,140,0,175,34,59,0,84,165,119,255,224,226,234,255,7,72,166,255,123,115,255,1,18,214,246,0,250,7,71,1,217,220,185,0,212,35,76,255,38,125,175,0,189,97,210,0,114,238,44,255,41,188,169,254,45,186,154,0,81,92,22,0,132,160,193,0,121,208,98,255,13,81,44,255,203,156,82,0,71,58,21,255,208,114,191,254,50,38,147,0,154,216,195,0,101,25,18,0,60,250,215,255,233,132,235,255,103,175,142,1,16,14,92,0,141,31,110,254,238,241,45,255,153,217,239,1,97,168,47,255,249,85,16,1,28,175,62,255,57,254,54,0,222,231,126,0,166,45,117,254,18,189,96,255,228,76,50,0,200,244,94,0,198,152,120,1,68,34,69,255,12,65,160,254,101,19,90,0,167,197,120,255,68,54,185,255,41,218,188,0,113,168,48,0,88,105,189,1,26,82,32,255,185,93,164,1,228,240,237,255,66,182,53,0,171,197,92,255,107,9,233,1,199,120,144,255,78,49,10,255,109,170,105,255,90,4,31,255,28,244,113,255,74,58,11,0,62,220,246,255,121,154,200,254,144,210,178,255,126,57,129,1,43,250,14,255,101,111,28,1,47,86,241,255,61,70,150,255,53,73,5,255,30,26,158,0,209,26,86,0,138,237,74,0,164,95,188,0,142,60,29,254,162,116,248,255,187,175,160,0,151,18,16,0,209,111,65,254,203,134,39,255,88,108,49,255,131,26,71,255,221,27,215,254,104,105,93,255,31,236,31,254,135,0,211,255,143,127,110,1,212,73,229,0,233,67,167,254,195,1,208,255,132,17,221,255,51,217,90,0,67,235,50,255,223,210,143,0,179,53,130,1,233,106,198,0,217,173,220,255,112,229,24,255,175,154,93,254,71,203,246,255,48,66,133,255,3,136,230,255,23,221,113,254,235,111,213,0,170,120,95,254,251,221,2,0,45,130,158,254,105,94,217,255,242,52,180,254,213,68,45,255,104,38,28,0,244,158,76,0,161,200,96,255,207,53,13,255,187,67,148,0,170,54,248,0,119,162,178,255,83,20,11,0,42,42,192,1,146,159,163,255,183,232,111,0,77,229,21,255,71,53,143,0,27,76,34],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE);allocate([246,136,47,255,219,39,182,255,92,224,201,1,19,142,14,255,69,182,241,255,163,118,245,0,9,109,106,1,170,181,247,255,78,47,238,255,84,210,176,255,213,107,139,0,39,38,11,0,72,21,150,0,72,130,69,0,205,77,155,254,142,133,21,0,71,111,172,254,226,42,59,255,179,0,215,1,33,128,241,0,234,252,13,1,184,79,8,0,110,30,73,255,246,141,189,0,170,207,218,1,74,154,69,255,138,246,49,255,155,32,100,0,125,74,105,255,90,85,61,255,35,229,177,255,62,125,193,255,153,86,188,1,73,120,212,0,209,123,246,254,135,209,38,255,151,58,44,1,92,69,214,255,14,12,88,255,252,153,166,255,253,207,112,255,60,78,83,255,227,124,110,0,180,96,252,255,53,117,33,254,164,220,82,255,41,1,27,255,38,164,166,255,164,99,169,254,61,144,70,255,192,166,18,0,107,250,66,0,197,65,50,0,1,179,18,255,255,104,1,255,43,153,35,255,80,111,168,0,110,175,168,0,41,105,45,255,219,14,205,255,164,233,140,254,43,1,118,0,233,67,195,0,178,82,159,255,138,87,122,255,212,238,90,255,144,35,124,254,25,140,164,0,251,215,44,254,133,70,107,255,101,227,80,254,92,169,55,0,215,42,49,0,114,180,85,255,33,232,27,1,172,213,25,0,62,176,123,254,32,133,24,255,225,191,62,0,93,70,153,0,181,42,104,1,22,191,224,255,200,200,140,255,249,234,37,0,149,57,141,0,195,56,208,255,254,130,70,255,32,173,240,255,29,220,199,0,110,100,115,255,132,229,249,0,228,233,223,255,37,216,209,254,178,177,209,255,183,45,165,254,224,97,114,0,137,97,168,255,225,222,172,0,165,13,49,1,210,235,204,255,252,4,28,254,70,160,151,0,232,190,52,254,83,248,93,255,62,215,77,1,175,175,179,255,160,50,66,0,121,48,208,0,63,169,209,255,0,210,200,0,224,187,44,1,73,162,82,0,9,176,143,255,19,76,193,255,29,59,167,1,24,43,154,0,28,190,190,0,141,188,129,0,232,235,203,255,234,0,109,255,54,65,159,0,60,88,232,255,121,253,150,254,252,233,131,255,198,110,41,1,83,77,71,255,200,22,59,254,106,253,242,255,21,12,207,255,237,66,189,0,90,198,202,1,225,172,127,0,53,22,202,0,56,230,132,0,1,86,183,0,109,190,42,0,243,68,174,1,109,228,154,0,200,177,122,1,35,160,183,255,177,48,85,255,90,218,169,255,248,152,78,0,202,254,110,0,6,52,43,0,142,98,65,255,63,145,22,0,70,106,93,0,232,138,107,1,110,179,61,255,211,129,218,1,242,209,92,0,35,90,217,1,182,143,106,255,116,101,217,255,114,250,221,255,173,204,6,0,60,150,163,0,73,172,44,255,239,110,80,255,237,76,153,254,161,140,249,0,149,232,229,0,133,31,40,255,174,164,119,0,113,51,214,0,129,228,2,254,64,34,243,0,107,227,244,255,174,106,200,255,84,153,70,1,50,35,16,0,250,74,216,254,236,189,66,255,153,249,13,0,230,178,4,255,221,41,238,0,118,227,121,255,94,87,140,254,254,119,92,0,73,239,246,254,117,87,128,0,19,211,145,255,177,46,252,0,229,91,246,1,69,128,247,255,202,77,54,1,8,11,9,255,153,96,166,0,217,214,173,255,134,192,2,1,0,207,0,0,189,174,107,1,140,134,100,0,158,193,243,1,182,102,171,0,235,154,51,0,142,5,123,255,60,168,89,1,217,14,92,255,19,214,5,1,211,167,254,0,44,6,202,254,120,18,236,255,15,113,184,255,184,223,139,0,40,177,119,254,182,123,90,255,176,165,176,0,247,77,194,0,27,234,120,0,231,0,214,255,59,39,30,0,125,99,145,255,150,68,68,1,141,222,248,0,153,123,210,255,110,127,152,255,229,33,214,1,135,221,197,0,137,97,2,0,12,143,204,255,81,41,188,0,115,79,130,255,94,3,132,0,152,175,187,255,124,141,10,255,126,192,179,255,11,103,198,0,149,6,45,0,219,85,187,1,230,18,178,255,72,182,152,0,3,198,184,255,128,112,224,1,97,161,230,0,254,99,38,255,58,159,197,0,151,66,219,0,59,69,143,255,185,112,249,0,119,136,47,255,123,130,132,0,168,71,95,255,113,176,40,1,232,185,173,0,207,93,117,1,68,157,108,255,102,5,147,254,49,97,33,0,89,65,111,254,247,30,163,255,124,217,221,1,102,250,216,0,198,174,75,254,57,55,18,0,227,5,236,1,229,213,173,0,201,109,218,1,49,233,239,0,30,55,158,1,25,178,106,0,155,111,188,1,94,126,140,0,215,31,238,1,77,240,16,0,213,242,25,1,38,71,168,0,205,186,93,254,49,211,140,255,219,0,180,255,134,118,165,0,160,147,134,255,110,186,35,255,198,243,42,0,243,146,119,0,134,235,163,1,4,241,135,255,193,46,193,254,103,180,79,255,225,4,184,254,242,118,130,0,146,135,176,1,234,111,30,0,69,66,213,254,41,96,123,0,121,94,42,255,178,191,195,255,46,130,42,0,117,84,8,255,233,49,214,254,238,122,109,0,6,71,89,1,236,211,123,0,244,13,48,254,119,148,14,0,114,28,86,255,75,237,25,255,145,229,16,254,129,100,53,255,134,150,120,254,168,157,50,0,23,72,104,255,224,49,14,0,255,123,22,255,151,185,151,255,170,80,184,1,134,182,20,0,41,100,101,1,153,33,16,0,76,154,111,1,86,206,234,255,192,160,164,254,165,123,93,255,1,216,164,254,67,17,175,255,169,11,59,255,158,41,61,255,73,188,14,255,195,6,137,255,22,147,29,255,20,103,3,255,246,130,227,255,122,40,128,0,226,47,24,254,35,36,32,0,152,186,183,255,69,202,20,0,195,133,195,0,222,51,247,0,169,171,94,1,183,0,160,255,64,205,18,1,156,83,15,255,197,58,249,254,251,89,110,255,50,10,88,254,51,43,216,0,98,242,198,1,245,151,113,0,171,236,194,1,197,31,199,255,229,81,38,1,41,59,20,0,253,104,230,0,152,93,14,255,246,242,146,254,214,169,240,255,240,102,108,254,160,167,236,0,154,218,188,0,150,233,202,255,27,19,250,1,2,71,133,255,175,12,63,1,145,183,198,0,104,120,115,255,130,251,247,0,17,212,167,255,62,123,132,255,247,100,189,0,155,223,152,0,143,197,33,0,155,59,44,255,150,93,240,1,127,3,87,255,95,71,207,1,167,85,1,255,188,152,116,255,10,23,23,0,137,195,93,1,54,98,97,0,240,0,168,255,148,188,127,0,134,107,151,0,76,253,171,0,90,132,192,0,146,22,54,0,224,66,54,254,230,186,229,255,39,182,196,0,148,251,130,255,65,131,108,254,128,1,160,0,169,49,167,254,199,254,148,255,251,6,131,0,187,254,129,255,85,82,62,0,178,23,58,255,254,132,5,0,164,213,39,0,134,252,146,254,37,53,81,255,155,134,82,0,205,167,238,255,94,45,180,255,132,40,161,0,254,111,112,1,54,75,217,0,179,230,221,1,235,94,191,255,23,243,48,1,202,145,203,255,39,118,42,255,117,141,253,0,254,0,222,0,43,251,50,0,54,169,234,1,80,68,208,0,148,203,243,254,145,7,135,0,6,254,0,0,252,185,127,0,98,8,129,255,38,35,72,255,211,36,220,1,40,26,89,0,168,64,197,254,3,222,239,255,2,83,215,254,180,159,105,0,58,115,194,0,186,116,106,255,229,247,219,255,129,118,193,0,202,174,183,1,166,161,72,0,201,107,147,254,237,136,74,0,233,230,106,1,105,111,168,0,64,224,30,1,1,229,3,0,102,151,175,255,194,238,228,255,254,250,212,0,187,237,121,0,67,251,96,1,197,30,11,0,183,95,204,0,205,89,138,0,64,221,37,1,255,223,30,255,178,48,211,255,241,200,90,255,167,209,96,255,57,130,221,0,46,114,200,255,61,184,66,0,55,182,24,254,110,182,33,0,171,190,232,255,114,94,31,0,18,221,8,0,47,231,254,0,255,112,83,0,118,15,215,255,173,25,40,254,192,193,31,255,238,21,146,255,171,193,118,255,101,234,53,254,131,212,112,0,89,192,107,1,8,208,27,0,181,217,15,255,231,149,232,0,140,236,126,0,144,9,199,255,12,79,181,254,147,182,202,255,19,109,182,255,49,212,225,0,74,163,203,0,175,233,148,0,26,112,51,0,193,193,9,255,15,135,249,0,150,227,130,0,204,0,219,1,24,242,205,0,238,208,117,255,22,244,112,0,26,229,34,0,37,80,188,255,38,45,206,254,240,90,225,255,29,3,47,255,42,224,76,0,186,243,167,0,32,132,15,255,5,51,125,0,139,135,24,0,6,241,219,0,172,229,133,255,246,214,50,0,231,11,207,255,191,126,83,1,180,163,170,255,245,56,24,1,178,164,211,255,3,16,202,1,98,57,118,255,141,131,89,254,33,51,24,0,243,149,91,255,253,52,14,0,35,169,67,254,49,30,88,255,179,27,36,255,165,140,183,0,58,189,151,0,88,31,0,0,75,169,66,0,66,101,199,255,24,216,199,1,121,196,26,255,14,79,203,254,240,226,81,255,94,28,10,255,83,193,240,255,204,193,131,255,94,15,86,0,218,40,157,0,51,193,209,0,0,242,177,0,102,185,247,0,158,109,116,0,38,135,91,0,223,175,149,0,220,66,1,255,86,60,232,0,25,96,37,255,225,122,162,1,215,187,168,255,158,157,46,0,56,171,162,0,232,240,101,1,122,22,9,0,51,9,21,255,53,25,238,255,217,30,232,254,125,169,148,0,13,232,102,0,148,9,37,0,165,97,141,1,228,131,41,0,222,15,243,255,254,18,17,0,6,60,237,1,106,3,113,0,59,132,189,0,92,112,30,0,105,208,213,0,48,84,179,255,187,121,231,254,27,216,109,255,162,221,107,254,73,239,195,255,250,31,57,255,149,135,89,255,185,23,115,1,3,163,157,255,18,112,250,0,25,57,187,255,161,96,164,0,47,16,243,0,12,141,251,254,67,234,184,255,41,18,161,0,175,6,96,255,160,172,52,254,24,176,183,255,198,193,85,1,124,121,137,255,151,50,114,255,220,203,60,255,207,239,5,1,0,38,107,255,55,238,94,254,70,152,94,0,213,220,77,1,120,17,69,255,85,164,190,255,203,234,81,0,38,49,37,254,61,144,124,0,137,78,49,254,168,247,48,0,95,164,252,0,105,169,135,0,253,228,134,0,64,166,75,0,81,73,20,255,207,210,10,0,234,106,150,255,94,34,90,255,254,159,57,254,220,133,99,0,139,147,180,254,24,23,185,0,41,57,30,255,189,97,76,0,65,187,223,255,224,172,37,255,34,62,95,1,231,144,240,0,77,106,126,254,64,152,91,0,29,98,155,0,226,251,53,255,234,211,5,255,144,203,222,255,164,176,221,254,5,231,24,0,179,122,205,0,36,1,134,255,125,70,151,254,97,228,252,0,172,129,23,254,48,90,209,255,150,224,82,1,84,134,30,0,241,196,46,0,103,113,234,255,46,101,121,254,40,124,250,255,135,45,242,254,9,249,168,255,140,108,131,255,143,163,171,0,50,173,199,255,88,222,142,255,200,95,158,0,142,192,163,255,7,117,135,0,111,124,22,0,236,12,65,254,68,38,65,255,227,174,254,0,244,245,38,0,240,50,208,255,161,63,250,0,60,209,239,0,122,35,19,0,14,33,230,254,2,159,113,0,106,20,127,255,228,205,96,0,137,210,174,254,180,212,144,255,89,98,154,1,34,88,139,0,167,162,112,1,65,110,197,0,241,37,169,0,66,56,131,255,10,201,83,254,133,253,187,255,177,112,45,254,196,251,0,0,196,250,151,255,238,232,214,255,150,209,205,0,28,240,118,0,71,76,83,1,236,99,91,0,42,250,131,1,96,18,64,255,118,222,35,0,113,214,203,255,122,119,184,255,66,19,36,0,204,64,249,0,146,89,139,0,134,62,135,1,104,233,101,0,188,84,26,0,49,249,129,0,208,214,75,255,207,130,77,255,115,175,235,0,171,2,137,255,175,145,186,1,55,245,135,255,154,86,181,1,100,58,246,255,109,199,60,255,82,204,134,255,215,49,230,1,140,229,192,255,222,193,251,255,81,136,15,255,179,149,162,255,23,39,29,255,7,95,75,254,191,81,222,0,241,81,90,255,107,49,201,255,244,211,157,0,222,140,149,255,65,219,56,254,189,246,90,255,178,59,157,1,48,219,52,0,98,34,215,0,28,17,187,255,175,169,24,0,92,79,161,255,236,200,194,1,147,143,234,0,229,225,7,1,197,168,14,0,235,51,53,1,253,120,174,0,197,6,168,255,202,117,171,0,163,21,206,0,114,85,90,255,15,41,10,255,194,19,99,0,65,55,216,254,162,146,116,0,50,206,212,255,64,146,29,255,158,158,131,1,100,165,130,255,172,23,129,255,125,53,9,255,15,193,18,1,26,49,11,255,181,174,201,1,135,201,14,255,100,19,149,0,219,98,79,0,42,99,143,254,96,0,48,255,197,249,83,254,104,149,79,255,235,110,136,254,82,128,44,255,65,41,36,254,88,211,10,0,187,121,187,0,98,134,199,0,171,188,179,254,210,11,238,255,66,123,130,254,52,234,61,0,48,113,23,254,6,86,120,255,119,178,245,0,87,129,201,0,242,141,209,0,202,114,85,0,148,22,161,0,103,195,48,0,25,49,171,255,138,67,130,0,182,73,122,254,148,24,130,0,211,229,154,0,32,155,158,0,84,105,61,0,177,194,9,255,166,89,86,1,54,83,187,0,249,40,117,255,109,3,215,255,53,146,44,1,63,47,179,0,194,216,3,254,14,84,136,0,136,177,13,255,72,243,186,255,117,17,125,255,211,58,211,255,93,79,223,0,90,88,245,255,139,209,111,255,70,222,47,0,10,246,79,255,198,217,178,0,227,225,11,1,78,126,179,255,62,43,126,0,103,148,35,0,129,8,165,254,245,240,148,0,61,51,142,0,81,208,134,0,15,137,115,255,211,119,236,255,159,245,248,255,2,134,136,255,230,139,58,1,160,164,254,0,114,85,141,255,49,166,182,255,144,70,84,1,85,182,7,0,46,53,93,0,9,166,161,255,55,162,178,255,45,184,188,0,146,28,44,254,169,90,49,0,120,178,241,1,14,123,127,255,7,241,199,1,189,66,50,255,198,143,101,254,189,243,135,255,141,24,24,254,75,97,87,0,118,251,154,1,237,54,156,0,171,146,207,255,131,196,246,255,136,64,113,1,151,232,57,0,240,218,115,0,49,61,27,255,64,129,73,1,252,169,27,255,40,132,10,1,90,201,193,255,252,121,240,1,186,206,41,0,43,198,97,0,145,100,183,0,204,216,80,254,172,150,65,0,249,229,196,254,104,123,73,255,77,104,96,254,130,180,8,0,104,123,57,0,220,202,229,255,102,249,211,0,86,14,232,255,182,78,209,0,239,225,164,0,106,13,32,255,120,73,17,255,134,67,233,0,83,254,181,0,183,236,112,1,48,64,131,255,241,216,243,255,65,193,226,0,206,241,100,254,100,134,166,255,237,202,197,0,55,13,81,0,32,124,102,255,40,228,177,0,118,181,31,1,231,160,134,255,119,187,202,0,0,142,60,255,128,38,189,255,166,201,150,0,207,120,26,1,54,184,172,0,12,242,204,254,133,66,230,0,34,38,31,1,184,112,80,0,32,51,165,254,191,243,55,0,58,73,146,254,155,167,205,255,100,104,152,255,197,254,207,255,173,19,247,0,238,10,202,0,239,151,242,0,94,59,39,255,240,29,102,255,10,92,154,255,229,84,219,255,161,129,80,0,208,90,204,1,240,219,174,255,158,102,145,1,53,178,76,255,52,108,168,1,83,222,107,0,211,36,109,0,118,58,56,0,8,29,22,0,237,160,199,0,170,209,157,0,137,71,47,0,143,86,32,0,198,242,2,0,212,48,136,1,92,172,186,0,230,151,105,1,96,191,229,0,138,80,191,254,240,216,130,255,98,43,6,254,168,196,49,0,253,18,91,1,144,73,121,0,61,146,39,1,63,104,24,255,184,165,112,254,126,235,98,0,80,213,98,255,123,60,87,255,82,140,245,1,223,120,173,255,15,198,134,1,206,60,239,0,231,234,92,255,33,238,19,255,165,113,142,1,176,119,38,0,160,43,166,254,239,91,105,0,107,61,194,1,25,4,68,0,15,139,51,0,164,132,106,255,34,116,46,254,168,95,197,0,137,212,23,0,72,156,58,0,137,112,69,254,150,105,154,255,236,201,157,0,23,212,154,255,136,82,227,254,226,59,221,255,95,149,192,0,81,118,52,255,33,43,215,1,14,147,75,255,89,156,121,254,14,18,79,0,147,208,139,1,151,218,62,255,156,88,8,1,210,184,98,255,20,175,123,255,102,83,229,0,220,65,116,1,150,250,4,255,92,142,220,255,34,247,66,255,204,225,179,254,151,81,151,0,71,40,236,255,138,63,62,0,6,79,240,255,183,185,181,0,118,50,27,0,63,227,192,0,123,99,58,1,50,224,155,255,17,225,223,254,220,224,77,255,14,44,123,1,141,128,175,0,248,212,200,0,150,59,183,255,147,97,29,0,150,204,181,0,253,37,71,0,145,85,119,0,154,200,186,0,2,128,249,255,83,24,124,0,14,87,143,0,168,51,245,1,124,151,231,255,208,240,197,1,124,190,185,0,48,58,246,0,20,233,232,0,125,18,98,255,13,254,31,255,245,177,130,255,108,142,35,0,171,125,242,254,140,12,34,255,165,161,162,0,206,205,101,0,247,25,34,1,100,145,57,0,39,70,57,0,118,204,203,255,242,0,162,0,165,244,30,0,198,116,226,0,128,111,153,255,140,54,182,1,60,122,15,255,155,58,57,1,54,50,198,0,171,211,29,255,107,138,167,255,173,107,199,255,109,161,193,0,89,72,242,255,206,115,89,255,250,254,142,254,177,202,94,255,81,89,50,0,7,105,66,255,25,254,255,254,203,64,23,255,79,222,108,255,39,249,75,0,241,124,50,0,239,152,133,0,221,241,105,0,147,151,98,0,213,161,121,254,242,49,137,0,233,37,249,254,42,183,27,0,184,119,230,255,217,32,163,255,208,251,228,1,137,62,131,255,79,64,9,254,94,48,113,0,17,138,50,254,193,255,22,0,247,18,197,1,67,55,104,0,16,205,95,255,48,37,66,0,55,156,63,1,64,82,74,255,200,53,71,254,239,67,125,0,26,224,222,0,223,137,93,255,30,224,202,255,9,220,132,0,198,38,235,1,102,141,86,0,60,43,81,1,136,28,26,0,233,36,8,254,207,242,148,0,164,162,63,0,51,46,224,255,114,48,79,255,9,175,226,0,222,3,193,255,47,160,232,255,255,93,105,254,14,42,230,0,26,138,82,1,208,43,244,0,27,39,38,255,98,208,127,255,64,149,182,255,5,250,209,0,187,60,28,254,49,25,218,255,169,116,205,255,119,18,120,0,156,116,147,255,132,53,109,255,13,10,202,0,110,83,167,0,157,219,137,255,6,3,130,255,50,167,30,255,60,159,47,255,129,128,157,254,94,3,189,0,3,166,68,0,83,223,215,0,150,90,194,1,15,168,65,0,227,83,51,255,205,171,66,255,54,187,60,1,152,102,45,255,119,154,225,0,240,247,136,0,100,197,178,255,139,71,223,255,204,82,16,1,41,206,42,255,156,192,221,255,216,123,244,255,218,218,185,255,187,186,239,255,252,172,160,255,195,52,22,0,144,174,181,254,187,100,115,255,211,78,176,255,27,7,193,0,147,213,104,255,90,201,10,255,80,123,66,1,22,33,186,0,1,7,99,254,30,206,10,0,229,234,5,0,53,30,210,0,138,8,220,254,71,55,167,0,72,225,86,1,118,190,188,0,254,193,101,1,171,249,172,255,94,158,183,254,93,2,108,255,176,93,76,255,73,99,79,255,74,64,129,254,246,46,65,0,99,241,127,254,246,151,102,255,44,53,208,254,59,102,234,0,154,175,164,255,88,242,32,0,111,38,1,0,255,182,190,255,115,176,15,254,169,60,129,0,122,237,241,0,90,76,63,0,62,74,120,255,122,195,110,0,119,4,178,0,222,242,210,0,130,33,46,254,156,40,41,0,167,146,112,1,49,163,111,255,121,176,235,0,76,207,14,255,3,25,198,1,41,235,213,0,85,36,214,1,49,92,109,255,200,24,30,254,168,236,195,0,145,39,124,1,236,195,149,0,90,36,184,255,67,85,170,255,38,35,26,254,131,124,68,255,239,155,35,255,54,201,164,0,196,22,117,255,49,15,205,0,24,224,29,1,126,113,144,0,117,21,182,0,203,159,141,0,223,135,77,0,176,230,176,255,190,229,215,255,99,37,181,255,51,21,138,255,25,189,89,255,49,48,165,254,152,45,247,0,170,108,222,0,80,202,5,0,27,69,103,254,204,22,129,255,180,252,62,254,210,1,91,255,146,110,254,255,219,162,28,0,223,252,213,1,59,8,33,0,206,16,244,0,129,211,48,0,107,160,208,0,112,59,209,0,109,77,216,254,34,21,185,255,246,99,56,255,179,139,19,255,185,29,50,255,84,89,19,0,74,250,98,255,225,42,200,255,192,217,205,255,210,16,167,0,99,132,95,1,43,230,57,0,254,11,203,255,99,188,63,255,119,193,251,254,80,105,54,0,232,181,189,1,183,69,112,255,208,171,165,255,47,109,180,255,123,83,165,0,146,162,52,255,154,11,4,255,151,227,90,255,146,137,97,254,61,233,41,255,94,42,55,255,108,164,236,0,152,68,254,0,10,140,131,255,10,106,79,254,243,158,137,0,67,178,66,254,177,123,198,255,15,62,34,0,197,88,42,255,149,95,177,255,152,0,198,255,149,254,113,255,225,90,163,255,125,217,247,0,18,17,224,0,128,66,120,254,192,25,9,255,50,221,205,0,49,212,70,0,233,255,164,0,2,209,9,0,221,52,219,254,172,224,244,255,94,56,206,1,242,179,2,255,31,91,164,1,230,46,138,255,189,230,220,0,57,47,61,255,111,11,157,0,177,91,152,0,28,230,98,0,97,87,126,0,198,89,145,255,167,79,107,0,249,77,160,1,29,233,230,255,150,21,86,254,60,11,193,0,151,37,36,254,185,150,243,255,228,212,83,1,172,151,180,0,201,169,155,0,244,60,234,0,142,235,4,1,67,218,60,0,192,113,75,1,116,243,207,255,65,172,155,0,81,30,156,255,80,72,33,254,18,231,109,255,142,107,21,254,125,26,132,255,176,16,59,255,150,201,58,0,206,169,201,0,208,121,226,0,40,172,14,255,150,61,94,255,56,57,156,255,141,60,145,255,45,108,149,255,238,145,155,255,209,85,31,254,192,12,210,0,99,98,93,254,152,16,151,0,225,185,220,0,141,235,44,255,160,172,21,254,71,26,31,255,13,64,93,254,28,56,198,0,177,62,248,1,182,8,241,0,166,101,148,255,78,81,133,255,129,222,215,1,188,169,129,255,232,7,97,0,49,112,60,255,217,229,251,0,119,108,138,0,39,19,123,254,131,49,235,0,132,84,145,0,130,230,148,255,25,74,187,0,5,245,54,255,185,219,241,1,18,194,228,255,241,202,102,0,105,113,202,0,155,235,79,0,21,9,178,255,156,1,239,0,200,148,61,0,115,247,210,255,49,221,135,0,58,189,8,1,35,46,9,0,81,65,5,255,52,158,185,255,125,116,46,255,74,140,13,255,210,92,172,254,147,23,71,0,217,224,253,254,115,108,180,255,145,58,48,254,219,177,24,255,156,255,60,1,154,147,242,0,253,134,87,0,53,75,229,0,48,195,222,255,31,175,50,255,156,210,120,255,208,35,222,255,18,248,179,1,2,10,101,255,157,194,248,255,158,204,101,255,104,254,197,255,79,62,4,0,178,172,101,1,96,146,251,255,65,10,156,0,2,137,165,255,116,4,231,0,242,215,1,0,19,35,29,255,43,161,79,0,59,149,246,1,251,66,176,0,200,33,3,255,80,110,142,255,195,161,17,1,228,56,66,255,123,47,145,254,132,4,164,0,67,174,172,0,25,253,114,0,87,97,87,1,250,220,84,0,96,91,200,255,37,125,59,0,19,65,118,0,161,52,241,255,237,172,6,255,176,191,255,255,1,65,130,254,223,190,230,0,101,253,231,255,146,35,109,0,250,29,77,1,49,0,19,0,123,90,155,1,22,86,32,255,218,213,65,0,111,93,127,0,60,93,169,255,8,127,182,0,17,186,14,254,253,137,246,255,213,25,48,254,76,238,0,255,248,92,70,255,99,224,139,0,184,9,255,1,7,164,208,0,205,131,198,1,87,214,199,0,130,214,95,0,221,149,222,0,23,38,171,254,197,110,213,0,43,115,140,254,215,177,118,0,96,52,66,1,117,158,237,0,14,64,182,255,46,63,174,255,158,95,190,255,225,205,177,255,43,5,142,255,172,99,212,255,244,187,147,0,29,51,153,255,228,116,24,254,30,101,207,0,19,246,150,255,134,231,5,0,125,134,226,1,77,65,98,0,236,130,33,255,5,110,62,0,69,108,127,255,7,113,22,0,145,20,83,254,194,161,231,255,131,181,60,0,217,209,177,255,229,148,212,254,3,131,184,0,117,177,187,1,28,14,31,255,176,102,80,0,50,84,151,255,125,31,54,255,21,157,133,255,19,179,139,1,224,232,26,0,34,117,170,255,167,252,171,255,73,141,206,254,129,250,35,0,72,79,236,1,220,229,20,255,41,202,173,255,99,76,238,255,198,22,224,255,108,198,195,255,36,141,96,1,236,158,59,255,106,100,87,0,110,226,2,0,227,234,222,0,154,93,119,255,74,112,164,255,67,91,2,255,21,145,33,255,102,214,137,255,175,230,103,254,163,246,166,0,93,247,116,254,167,224,28,255,220,2,57,1,171,206,84,0,123,228,17,255,27,120,119,0,119,11,147,1,180,47,225,255,104,200,185,254,165,2,114,0,77,78,212,0,45,154,177,255,24,196,121,254,82,157,182,0,90,16,190,1,12,147,197,0,95,239,152,255,11,235,71,0,86,146,119,255,172,134,214,0,60,131,196,0,161,225,129,0,31,130,120,254,95,200,51,0,105,231,210,255,58,9,148,255,43,168,221,255,124,237,142,0,198,211,50,254,46,245,103,0,164,248,84,0,152,70,208,255,180,117,177,0,70,79,185,0,243,74,32,0,149,156,207,0,197,196,161,1,245,53,239,0,15,93,246,254,139,240,49,255,196,88,36,255,162,38,123,0,128,200,157,1,174,76,103,255,173,169,34,254,216,1,171,255,114,51,17,0,136,228,194,0,110,150,56,254,106,246,159,0,19,184,79,255,150,77,240,255,155,80,162,0,0,53,169,255,29,151,86,0,68,94,16,0,92,7,110,254,98,117,149,255,249,77,230,255,253,10,140,0,214,124,92,254,35,118,235,0,89,48,57,1,22,53,166,0,184,144,61,255,179,255,194,0,214,248,61,254,59,110,246,0,121,21,81,254,166,3,228,0,106,64,26,255,69,232,134,255,242,220,53,254,46,220,85,0,113,149,247,255,97,179,103,255,190,127,11,0,135,209,182,0,95,52,129,1,170,144,206,255,122,200,204,255,168,100,146,0,60,144,149,254,70,60,40,0,122,52,177,255,246,211,101,255,174,237,8,0,7,51,120,0,19,31,173,0,126,239,156,255,143,189,203,0,196,128,88,255,233,133,226,255,30,125,173,255,201,108,50,0,123,100,59,255,254,163,3,1,221,148,181,255,214,136,57,254,222,180,137,255,207,88,54,255,28,33,251,255,67,214,52,1,210,208,100,0,81,170,94,0,145,40,53,0,224,111,231,254,35,28,244,255,226,199,195,254,238,17,230,0,217,217,164,254,169,157,221,0,218,46,162,1,199,207,163,255,108,115,162,1,14,96,187,255,118,60,76,0,184,159,152,0,209,231,71,254,42,164,186,255,186,153,51,254,221,171,182,255,162,142,173,0,235,47,193,0,7,139,16,1,95,164,64,255,16,221,166,0,219,197,16,0,132,29,44,255,100,69,117,255,60,235,88,254,40,81,173,0,71,190,61,255,187,88,157,0,231,11,23,0,237,117,164,0,225,168,223,255,154,114,116,255,163,152,242,1,24,32,170,0,125,98,113,254,168,19,76,0,17,157,220,254,155,52,5,0,19,111,161,255,71,90,252,255,173,110,240,0,10,198,121,255,253,255,240,255,66,123,210,0,221,194,215,254,121,163,17,255,225,7,99,0,190,49,182,0,115,9,133,1,232,26,138,255,213,68,132,0,44,119,122,255,179,98,51,0,149,90,106,0,71,50,230,255,10,153,118,255,177,70,25,0,165,87,205,0,55,138,234,0,238,30,97,0,113,155,207,0,98,153,127,0,34,107,219,254,117,114,172,255,76,180,255,254,242,57,179,255,221,34,172,254,56,162,49,255,83,3,255,255,113,221,189,255,188,25,228,254,16,88,89,255,71,28,198,254,22,17,149,255,243,121,254,255,107,202,99,255,9,206,14,1,220,47,153,0,107,137,39,1,97,49,194,255,149,51,197,254,186,58,11,255,107,43,232,1,200,6,14,255,181,133,65,254,221,228,171,255,123,62,231,1,227,234,179,255,34,189,212,254,244,187,249,0,190,13,80,1,130,89,1,0,223,133,173,0,9,222,198,255,66,127,74,0,167,216,93,255,155,168,198,1,66,145,0,0,68,102,46,1,172,90,154,0,216,128,75,255,160,40,51,0,158,17,27,1,124,240,49,0,236,202,176,255,151,124,192,255,38,193,190,0,95,182,61,0,163,147,124,255,255,165,51,255,28,40,17,254,215,96,78,0,86,145,218,254,31,36,202,255,86,9,5,0,111,41,200,255,237,108,97,0,57,62,44,0,117,184,15,1,45,241,116,0,152,1,220,255,157,165,188,0,250,15,131,1,60,44,125,255,65,220,251,255,75,50,184,0,53,90,128,255,231,80,194,255,136,129,127,1,21,18,187,255,45,58,161,255,71,147,34,0,174,249,11,254,35,141,29,0,239,68,177,255,115,110,58,0,238,190,177,1,87,245,166,255,190,49,247,255,146,83,184,255,173,14,39,255,146,215,104,0,142,223,120,0,149,200,155,255,212,207,145,1,16,181,217,0,173,32,87,255,255,35,181,0,119,223,161,1,200,223,94,255,70,6,186,255,192,67,85,255,50,169,152,0,144,26,123,255,56,243,179,254,20,68,136,0,39,140,188,254,253,208,5,255,200,115,135,1,43,172,229,255,156,104,187,0,151,251,167,0,52,135,23,0,151,153,72,0,147,197,107,254,148,158,5,255,238,143,206,0,126,153,137,255,88,152,197,254,7,68,167,0,252,159,165,255,239,78,54,255,24,63,55,255,38,222,94,0,237,183,12,255,206,204,210,0,19,39,246,254,30,74,231,0,135,108,29,1,179,115,0,0,117,118,116,1,132,6,252,255,145,129,161,1,105,67,141,0,82,37,226,255,238,226,228,255,204,214,129,254,162,123,100,255,185,121,234,0,45,108,231,0,66,8,56,255,132,136,128,0,172,224,66,254,175,157,188,0,230,223,226,254,242,219,69,0,184,14,119,1,82,162,56,0,114,123,20,0,162,103,85,255,49,239,99,254,156,135,215,0,111,255,167,254,39,196,214,0,144,38,79,1,249,168,125,0,155,97,156,255,23,52,219,255,150,22,144,0,44,149,165,255,40,127,183,0,196,77,233,255,118,129,210,255,170,135,230,255,214,119,198,0,233,240,35,0,253,52,7,255,117,102,48,255,21,204,154,255,179,136,177,255,23,2,3,1,149,130,89,255,252,17,159,1,70,60,26,0,144,107,17,0,180,190,60,255,56,182,59,255,110,71,54,255,198,18,129,255,149,224,87,255,223,21,152,255,138,22,182,255,250,156,205,0,236,45,208,255,79,148,242,1,101,70,209,0,103,78,174,0,101,144,172,255,152,136,237,1,191,194,136,0,113,80,125,1,152,4,141,0,155,150,53,255,196,116,245,0,239,114,73,254,19,82,17,255,124,125,234,255,40,52,191,0,42,210,158,255,155,132,165,0,178,5,42,1,64,92,40,255,36,85,77,255,178,228,118,0,137,66,96,254,115,226,66,0,110,240,69,254,151,111,80,0,167,174,236,255,227,108,107,255,188,242,65,255,183,81,255,0,57,206,181,255,47,34,181,255,213,240,158,1,71,75,95,0,156,40,24,255,102,210,81,0,171,199,228,255,154,34,41,0,227,175,75,0,21,239,195,0,138,229,95,1,76,192,49,0,117,123,87,1,227,225,130,0,125,62,63,255,2,198,171,0,254,36,13,254,145,186,206,0,148,255,244,255,35,0,166,0,30,150,219,1,92,228,212,0,92,198,60,254,62,133,200,255,201,41,59,0,125,238,109,255,180,163,238,1,140,122,82,0,9,22,88,255,197,157,47,255,153,94,57,0,88,30,182,0,84,161,85,0,178,146,124,0,166,166,7,255,21,208,223,0,156,182,242,0,155,121,185,0,83,156,174,254,154,16,118,255,186,83,232,1,223,58,121,255,29,23,88,0,35,125,127,255,170,5,149,254,164,12,130,255,155,196,29,0,161,96,136,0,7,35,29,1,162,37,251,0,3,46,242,255,0,217,188,0,57,174,226,1,206,233,2,0,57,187,136,254,123,189,9,255,201,117,127,255,186,36,204,0,231,25,216,0,80,78,105,0,19,134,129,255,148,203,68,0,141,81,125,254,248,165,200,255,214,144,135,0,151,55,166,255,38,235,91,0,21,46,154,0,223,254,150,255,35,153,180,255,125,176,29,1,43,98,30,255,216,122,230,255,233,160,12,0,57,185,12,254,240,113,7,255,5,9,16,254,26,91,108,0,109,198,203,0,8,147,40,0,129,134,228,255,124,186,40,255,114,98,132,254,166,132,23,0,99,69,44,0,9,242,238,255,184,53,59,0,132,129,102,255,52,32,243,254,147,223,200,255,123,83,179,254,135,144,201,255,141,37,56,1,151,60,227,255,90,73,156,1,203,172,187,0,80,151,47,255,94,137,231,255,36,191,59,255,225,209,181,255,74,215,213,254,6,118,179,255,153,54,193,1,50,0,231,0,104,157,72,1,140,227,154,255,182,226,16,254,96,225,92,255,115,20,170,254,6,250,78,0,248,75,173,255,53,89,6,255,0,180,118,0,72,173,1,0,64,8,206,1,174,133,223,0,185,62,133,255,214,11,98,0,197,31,208,0,171,167,244,255,22,231,181,1,150,218,185,0,247,169,97,1,165,139,247,255,47,120,149,1,103,248,51,0,60,69,28,254,25,179,196,0,124,7,218,254,58,107,81,0,184,233,156,255,252,74,36,0,118,188,67,0,141,95,53,255,222,94,165,254,46,61,53,0,206,59,115,255,47,236,250,255,74,5,32,1,129,154,238,255,106,32,226,0,121,187,61,255,3,166,241,254,67,170,172,255,29,216,178,255,23,201,252,0,253,110,243,0,200,125,57,0,109,192,96,255,52,115,238,0,38,121,243,255,201,56,33,0,194,118,130,0,75,96,25,255,170,30,230,254,39,63,253,0,36,45,250,255,251,1,239,0,160,212,92,1,45,209,237,0,243,33,87,254,237,84,201,255,212,18,157,254,212,99,127,255,217,98,16,254,139,172,239,0,168,201,130,255,143,193,169,255,238,151,193,1,215,104,41,0,239,61,165,254,2,3,242,0,22,203,177,254,177,204,22,0,149,129,213,254,31,11,41,255,0,159,121,254,160,25,114,255,162,80,200,0,157,151,11,0,154,134,78,1,216,54,252,0,48,103,133,0,105,220,197,0,253,168,77,254,53,179,23,0,24,121,240,1,255,46,96,255,107,60,135,254,98,205,249,255,63,249,119,255,120,59,211,255,114,180,55,254,91,85,237,0,149,212,77,1,56,73,49,0,86,198,150,0,93,209,160,0,69,205,182,255,244,90,43,0,20,36,176,0,122,116,221,0,51,167,39,1,231,1,63,255,13,197,134,0,3,209,34,255,135,59,202,0,167,100,78,0,47,223,76,0,185,60,62,0,178,166,123,1,132,12,161,255,61,174,43,0,195,69,144,0,127,47,191,1,34,44,78,0,57,234,52,1,255,22,40,255,246,94,146,0,83,228,128,0,60,78,224,255,0,96,210,255,153,175,236,0,159,21,73,0,180,115,196,254,131,225,106,0,255,167,134,0,159,8,112,255,120,68,194,255,176,196,198,255,118,48,168,255,93,169,1,0,112,200,102,1,74,24,254,0,19,141,4,254,142,62,63,0,131,179,187,255,77,156,155,255,119,86,164,0,170,208,146,255,208,133,154,255,148,155,58,255,162,120,232,254,252,213,155,0,241,13,42,0,94,50,131,0,179,170,112,0,140,83,151,255,55,119,84,1,140,35,239,255,153,45,67,1,236,175,39,0,54,151,103,255,158,42,65,255,196,239,135,254,86,53,203,0,149,97,47,254,216,35,17,255,70,3,70,1,103,36,90,255,40,26,173,0,184,48,13,0,163,219,217,255,81,6,1,255,221,170,108,254,233,208,93,0,100,201,249,254,86,36,35,255,209,154,30,1,227,201,251,255,2,189,167,254,100,57,3,0,13,128,41,0,197,100,75,0,150,204,235,255,145,174,59,0,120,248,149,255,85,55,225,0,114,210,53,254,199,204,119,0,14,247,74,1,63,251,129,0,67,104,151,1,135,130,80,0,79,89,55,255,117,230,157,255,25,96,143,0,213,145,5,0,69,241,120,1,149,243,95,255,114,42,20,0,131,72,2,0,154,53,20,255,73,62,109,0,196,102,152,0,41,12,204,255,122,38,11,1,250,10,145,0,207,125,148,0,246,244,222,255,41,32,85,1,112,213,126,0,162,249,86,1,71,198,127,255,81,9,21,1,98,39,4,255,204,71,45,1,75,111,137,0,234,59,231,0,32,48,95,255,204,31,114,1,29,196,181,255,51,241,167,254,93,109,142,0,104,144,45,0,235,12,181,255,52,112,164,0,76,254,202,255,174,14,162,0,61,235,147,255,43,64,185,254,233,125,217,0,243,88,167,254,74,49,8,0,156,204,66,0,124,214,123,0,38,221,118,1,146,112,236,0,114,98,177,0,151,89,199,0,87,197,112,0,185,149,161,0,44,96,165,0,248,179,20,255,188,219,216,254,40,62,13,0,243,142,141,0,229,227,206,255,172,202,35,255,117,176,225,255,82,110,38,1,42,245,14,255,20,83,97,0,49,171,10,0,242,119,120,0,25,232,61,0,212,240,147,255,4,115,56,255,145,17,239,254,202,17,251,255,249,18,245,255,99,117,239,0,184,4,179,255,246,237,51,255,37,239,137,255,166,112,166,255,81,188,33,255,185,250,142,255,54,187,173,0,208,112,201,0,246,43,228,1,104,184,88,255,212,52,196,255,51,117,108,255,254,117,155,0,46,91,15,255,87,14,144,255,87,227,204,0,83,26,83,1,159,76,227,0,159,27,213,1,24,151,108,0,117,144,179,254,137,209,82,0,38,159,10,0,115,133,201,0,223,182,156,1,110,196,93,255,57,60,233,0,5,167,105,255,154,197,164,0,96,34,186,255,147,133,37,1,220,99,190,0,1,167,84,255,20,145,171,0,194,197,251,254,95,78,133,255,252,248,243,255,225,93,131,255,187,134,196,255,216,153,170,0,20,118,158,254,140,1,118,0,86,158,15,1,45,211,41,255,147,1,100,254,113,116,76,255,211,127,108,1,103,15,48,0,193,16,102,1,69,51,95,255,107,128,157,0,137,171,233,0,90,124,144,1,106,161,182,0,175,76,236,1,200,141,172,255,163,58,104,0,233,180,52,255,240,253,14,255,162,113,254,255,38,239,138,254,52,46,166,0,241,101,33,254,131,186,156,0,111,208,62,255,124,94,160,255,31,172,254,0,112,174,56,255,188,99,27,255,67,138,251,0,125,58,128,1,156,152,174,255,178,12,247,255,252,84,158,0,82,197,14,254,172,200,83,255,37,39,46,1,106,207,167,0,24,189,34,0,131,178,144,0,206,213,4,0,161,226,210,0,72,51,105,255,97,45,187,255,78,184,223,255,176,29,251,0,79,160,86,255,116,37,178,0,82,77,213,1,82,84,141,255,226,101,212,1,175,88,199,255,245,94,247,1,172,118,109,255,166,185,190,0,131,181,120,0,87,254,93,255,134,240,73,255,32,245,143,255,139,162,103,255,179,98,18,254,217,204,112,0,147,223,120,255,53,10,243,0,166,140,150,0,125,80,200,255,14,109,219,255,91,218,1,255,252,252,47,254,109,156,116,255,115,49,127,1,204,87,211,255,148,202,217,255,26,85,249,255,14,245,134,1,76,89,169,255,242,45,230,0,59,98,172,255,114,73,132,254,78,155,49,255,158,126,84,0,49,175,43,255,16,182,84,255,157,103,35,0,104,193,109,255,67,221,154,0,201,172,1,254,8,162,88,0,165,1,29,255,125,155,229,255,30,154,220,1,103,239,92,0,220,1,109,255,202,198,1,0,94,2,142,1,36,54,44,0,235,226,158,255,170,251,214,255,185,77,9,0,97,74,242,0,219,163,149,255,240,35,118,255,223,114,88,254,192,199,3,0,106,37,24,255,201,161,118,255,97,89,99,1,224,58,103,255,101,199,147,254,222,60,99,0,234,25,59,1,52,135,27,0,102,3,91,254,168,216,235,0,229,232,136,0,104,60,129,0,46,168,238,0,39,191,67,0,75,163,47,0,143,97,98,255,56,216,168,1,168,233,252,255,35,111,22,255,92,84,43,0,26,200,87,1,91,253,152,0,202,56,70,0,142,8,77,0,80,10,175,1,252,199,76,0,22,110,82,255,129,1,194,0,11,128,61,1,87,14,145,255,253,222,190,1,15,72,174,0,85,163,86,254,58,99,44,255,45,24,188,254,26,205,15,0,19,229,210,254,248,67,195,0,99,71,184,0,154,199,37,255,151,243,121,255,38,51,75,255,201,85,130,254,44,65,250,0,57,147,243,254,146,43,59,255,89,28,53,0,33,84,24,255,179,51,18,254,189,70,83,0,11,156,179,1,98,134,119,0,158,111,111,0,119,154,73,255,200,63,140,254,45,13,13,255,154,192,2,254,81,72,42,0,46,160,185,254,44,112,6,0,146,215,149,1,26,176,104,0,68,28,87,1,236,50,153,255,179,128,250,254,206,193,191,255,166,92,137,254,53,40,239,0,210,1,204,254,168,173,35,0,141,243,45,1,36,50,109,255,15,242,194,255,227,159,122,255,176,175,202,254,70,57,72,0,40,223,56,0,208,162,58,255,183,98,93,0,15,111,12,0,30,8,76,255,132,127,246,255,45,242,103,0,69,181,15,255,10,209,30,0,3,179,121,0,241,232,218,1,123,199,88,255,2,210,202,1,188,130,81,255,94,101,208,1,103,36,45,0,76,193,24,1,95,26,241,255,165,162,187,0,36,114,140,0,202,66,5,255,37,56,147,0,152,11,243,1,127,85,232,255,250,135,212,1,185,177,113,0,90,220,75,255,69,248,146,0,50,111,50,0,92,22,80,0,244,36,115,254,163,100,82,255,25,193,6,1,127,61,36,0,253,67,30,254,65,236,170,255,161,17,215,254,63,175,140,0,55,127,4,0,79,112,233,0,109,160,40,0,143,83,7,255,65,26,238,255,217,169,140,255,78,94,189,255,0,147,190,255,147,71,186,254,106,77,127,255,233,157,233,1,135,87,237,255,208,13,236,1,155,109,36,255,180,100,218,0,180,163,18,0,190,110,9,1,17,63,123,255,179,136,180,255,165,123,123,255,144,188,81,254,71,240,108,255,25,112,11,255,227,218,51,255,167,50,234,255,114,79,108,255,31,19,115,255,183,240,99,0,227,87,143,255,72,217,248,255,102,169,95,1,129,149,149,0,238,133,12,1,227,204,35,0,208,115,26,1,102,8,234,0,112,88,143,1,144,249,14,0,240,158,172,254,100,112,119,0,194,141,153,254,40,56,83,255,121,176,46,0,42,53,76,255,158,191,154,0,91,209,92,0,173,13,16,1,5,72,226,255,204,254,149,0,80,184,207,0,100,9,122,254,118,101,171,255,252,203,0,254,160,207,54,0,56,72,249,1,56,140,13,255,10,64,107,254,91,101,52,255,225,181,248,1,139,255,132,0,230,145,17,0,233,56,23,0,119,1,241,255,213,169,151,255,99,99,9,254,185,15,191,255,173,103,109,1,174,13,251,255,178,88,7,254,27,59,68,255,10,33,2,255,248,97,59,0,26,30,146,1,176,147,10,0,95,121,207,1,188,88,24,0,185,94,254,254,115,55,201,0,24,50,70,0,120,53,6,0,142,66,146,0,228,226,249,255,104,192,222,1,173,68,219,0,162,184,36,255,143,102,137,255,157,11,23,0,125,45,98,0,235,93,225,254,56,112,160,255,70,116,243,1,153,249,55,255,129,39,17,1,241,80,244,0,87,69,21,1,94,228,73,255,78,66,65,255,194,227,231,0,61,146,87,255,173,155,23,255,112,116,219,254,216,38,11,255,131,186,133,0,94,212,187,0,100,47,91,0,204,254,175,255,222,18,215,254,173,68,108,255,227,228,79,255,38,221,213,0,163,227,150,254,31,190,18,0,160,179,11,1,10,90,94,255,220,174,88,0,163,211,229,255,199,136,52,0,130,95,221,255,140,188,231,254,139,113,128,255,117,171,236,254,49,220,20,255,59,20,171,255,228,109,188,0,20,225,32,254,195,16,174,0,227,254,136,1,135,39,105,0,150,77,206,255,210,238,226],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE+10240);allocate([55,212,132,254,239,57,124,0,170,194,93,255,249,16,247,255,24,151,62,255,10,151,10,0,79,139,178,255,120,242,202,0,26,219,213,0,62,125,35,255,144,2,108,255,230,33,83,255,81,45,216,1,224,62,17,0,214,217,125,0,98,153,153,255,179,176,106,254,131,93,138,255,109,62,36,255,178,121,32,255,120,252,70,0,220,248,37,0,204,88,103,1,128,220,251,255,236,227,7,1,106,49,198,255,60,56,107,0,99,114,238,0,220,204,94,1,73,187,1,0,89,154,34,0,78,217,165,255,14,195,249,255,9,230,253,255,205,135,245,0,26,252,7,255,84,205,27,1,134,2,112,0,37,158,32,0,231,91,237,255,191,170,204,255,152,7,222,0,109,192,49,0,193,166,146,255,232,19,181,255,105,142,52,255,103,16,27,1,253,200,165,0,195,217,4,255,52,189,144,255,123,155,160,254,87,130,54,255,78,120,61,255,14,56,41,0,25,41,125,255,87,168,245,0,214,165,70,0,212,169,6,255,219,211,194,254,72,93,164,255,197,33,103,255,43,142,141,0,131,225,172,0,244,105,28,0,68,68,225,0,136,84,13,255,130,57,40,254,139,77,56,0,84,150,53,0,54,95,157,0,144,13,177,254,95,115,186,0,117,23,118,255,244,166,241,255,11,186,135,0,178,106,203,255,97,218,93,0,43,253,45,0,164,152,4,0,139,118,239,0,96,1,24,254,235,153,211,255,168,110,20,255,50,239,176,0,114,41,232,0,193,250,53,0,254,160,111,254,136,122,41,255,97,108,67,0,215,152,23,255,140,209,212,0,42,189,163,0,202,42,50,255,106,106,189,255,190,68,217,255,233,58,117,0,229,220,243,1,197,3,4,0,37,120,54,254,4,156,134,255,36,61,171,254,165,136,100,255,212,232,14,0,90,174,10,0,216,198,65,255,12,3,64,0,116,113,115,255,248,103,8,0,231,125,18,255,160,28,197,0,30,184,35,1,223,73,249,255,123,20,46,254,135,56,37,255,173,13,229,1,119,161,34,255,245,61,73,0,205,125,112,0,137,104,134,0,217,246,30,255,237,142,143,0,65,159,102,255,108,164,190,0,219,117,173,255,34,37,120,254,200,69,80,0,31,124,218,254,74,27,160,255,186,154,199,255,71,199,252,0,104,81,159,1,17,200,39,0,211,61,192,1,26,238,91,0,148,217,12,0,59,91,213,255,11,81,183,255,129,230,122,255,114,203,145,1,119,180,66,255,72,138,180,0,224,149,106,0,119,82,104,255,208,140,43,0,98,9,182,255,205,101,134,255,18,101,38,0,95,197,166,255,203,241,147,0,62,208,145,255,133,246,251,0,2,169,14,0,13,247,184,0,142,7,254,0,36,200,23,255,88,205,223,0,91,129,52,255,21,186,30,0,143,228,210,1,247,234,248,255,230,69,31,254,176,186,135,255,238,205,52,1,139,79,43,0,17,176,217,254,32,243,67,0,242,111,233,0,44,35,9,255,227,114,81,1,4,71,12,255,38,105,191,0,7,117,50,255,81,79,16,0,63,68,65,255,157,36,110,255,77,241,3,255,226,45,251,1,142,25,206,0,120,123,209,1,28,254,238,255,5,128,126,255,91,222,215,255,162,15,191,0,86,240,73,0,135,185,81,254,44,241,163,0,212,219,210,255,112,162,155,0,207,101,118,0,168,72,56,255,196,5,52,0,72,172,242,255,126,22,157,255,146,96,59,255,162,121,152,254,140,16,95,0,195,254,200,254,82,150,162,0,119,43,145,254,204,172,78,255,166,224,159,0,104,19,237,255,245,126,208,255,226,59,213,0,117,217,197,0,152,72,237,0,220,31,23,254,14,90,231,255,188,212,64,1,60,101,246,255,85,24,86,0,1,177,109,0,146,83,32,1,75,182,192,0,119,241,224,0,185,237,27,255,184,101,82,1,235,37,77,255,253,134,19,0,232,246,122,0,60,106,179,0,195,11,12,0,109,66,235,1,125,113,59,0,61,40,164,0,175,104,240,0,2,47,187,255,50,12,141,0,194,139,181,255,135,250,104,0,97,92,222,255,217,149,201,255,203,241,118,255,79,151,67,0,122,142,218,255,149,245,239,0,138,42,200,254,80,37,97,255,124,112,167,255,36,138,87,255,130,29,147,255,241,87,78,255,204,97,19,1,177,209,22,255,247,227,127,254,99,119,83,255,212,25,198,1,16,179,179,0,145,77,172,254,89,153,14,255,218,189,167,0,107,233,59,255,35,33,243,254,44,112,112,255,161,127,79,1,204,175,10,0,40,21,138,254,104,116,228,0,199,95,137,255,133,190,168,255,146,165,234,1,183,99,39,0,183,220,54,254,255,222,133,0,162,219,121,254,63,239,6,0,225,102,54,255,251,18,246,0,4,34,129,1,135,36,131,0,206,50,59,1,15,97,183,0,171,216,135,255,101,152,43,255,150,251,91,0,38,145,95,0,34,204,38,254,178,140,83,255,25,129,243,255,76,144,37,0,106,36,26,254,118,144,172,255,68,186,229,255,107,161,213,255,46,163,68,255,149,170,253,0,187,17,15,0,218,160,165,255,171,35,246,1,96,13,19,0,165,203,117,0,214,107,192,255,244,123,177,1,100,3,104,0,178,242,97,255,251,76,130,255,211,77,42,1,250,79,70,255,63,244,80,1,105,101,246,0,61,136,58,1,238,91,213,0,14,59,98,255,167,84,77,0,17,132,46,254,57,175,197,255,185,62,184,0,76,64,207,0,172,175,208,254,175,74,37,0,138,27,211,254,148,125,194,0,10,89,81,0,168,203,101,255,43,213,209,1,235,245,54,0,30,35,226,255,9,126,70,0,226,125,94,254,156,117,20,255,57,248,112,1,230,48,64,255,164,92,166,1,224,214,230,255,36,120,143,0,55,8,43,255,251,1,245,1,106,98,165,0,74,107,106,254,53,4,54,255,90,178,150,1,3,120,123,255,244,5,89,1,114,250,61,255,254,153,82,1,77,15,17,0,57,238,90,1,95,223,230,0,236,52,47,254,103,148,164,255,121,207,36,1,18,16,185,255,75,20,74,0,187,11,101,0,46,48,129,255,22,239,210,255,77,236,129,255,111,77,204,255,61,72,97,255,199,217,251,255,42,215,204,0,133,145,201,255,57,230,146,1,235,100,198,0,146,73,35,254,108,198,20,255,182,79,210,255,82,103,136,0,246,108,176,0,34,17,60,255,19,74,114,254,168,170,78,255,157,239,20,255,149,41,168,0,58,121,28,0,79,179,134,255,231,121,135,255,174,209,98,255,243,122,190,0,171,166,205,0,212,116,48,0,29,108,66,255,162,222,182,1,14,119,21,0,213,39,249,255,254,223,228,255,183,165,198,0,133,190,48,0,124,208,109,255,119,175,85,255,9,209,121,1,48,171,189,255,195,71,134,1,136,219,51,255,182,91,141,254,49,159,72,0,35,118,245,255,112,186,227,255,59,137,31,0,137,44,163,0,114,103,60,254,8,213,150,0,162,10,113,255,194,104,72,0,220,131,116,255,178,79,92,0,203,250,213,254,93,193,189,255,130,255,34,254,212,188,151,0,136,17,20,255,20,101,83,255,212,206,166,0,229,238,73,255,151,74,3,255,168,87,215,0,155,188,133,255,166,129,73,0,240,79,133,255,178,211,81,255,203,72,163,254,193,168,165,0,14,164,199,254,30,255,204,0,65,72,91,1,166,74,102,255,200,42,0,255,194,113,227,255,66,23,208,0,229,216,100,255,24,239,26,0,10,233,62,255,123,10,178,1,26,36,174,255,119,219,199,1,45,163,190,0,16,168,42,0,166,57,198,255,28,26,26,0,126,165,231,0,251,108,100,255,61,229,121,255,58,118,138,0,76,207,17,0,13,34,112,254,89,16,168,0,37,208,105,255,35,201,215,255,40,106,101,254,6,239,114,0,40,103,226,254,246,127,110,255,63,167,58,0,132,240,142,0,5,158,88,255,129,73,158,255,94,89,146,0,230,54,146,0,8,45,173,0,79,169,1,0,115,186,247,0,84,64,131,0,67,224,253,255,207,189,64,0,154,28,81,1,45,184,54,255,87,212,224,255,0,96,73,255,129,33,235,1,52,66,80,255,251,174,155,255,4,179,37,0,234,164,93,254,93,175,253,0,198,69,87,255,224,106,46,0,99,29,210,0,62,188,114,255,44,234,8,0,169,175,247,255,23,109,137,255,229,182,39,0,192,165,94,254,245,101,217,0,191,88,96,0,196,94,99,255,106,238,11,254,53,126,243,0,94,1,101,255,46,147,2,0,201,124,124,255,141,12,218,0,13,166,157,1,48,251,237,255,155,250,124,255,106,148,146,255,182,13,202,0,28,61,167,0,217,152,8,254,220,130,45,255,200,230,255,1,55,65,87,255,93,191,97,254,114,251,14,0,32,105,92,1,26,207,141,0,24,207,13,254,21,50,48,255,186,148,116,255,211,43,225,0,37,34,162,254,164,210,42,255,68,23,96,255,182,214,8,255,245,117,137,255,66,195,50,0,75,12,83,254,80,140,164,0,9,165,36,1,228,110,227,0,241,17,90,1,25,52,212,0,6,223,12,255,139,243,57,0,12,113,75,1,246,183,191,255,213,191,69,255,230,15,142,0,1,195,196,255,138,171,47,255,64,63,106,1,16,169,214,255,207,174,56,1,88,73,133,255,182,133,140,0,177,14,25,255,147,184,53,255,10,227,161,255,120,216,244,255,73,77,233,0,157,238,139,1,59,65,233,0,70,251,216,1,41,184,153,255,32,203,112,0,146,147,253,0,87,101,109,1,44,82,133,255,244,150,53,255,94,152,232,255,59,93,39,255,88,147,220,255,78,81,13,1,32,47,252,255,160,19,114,255,93,107,39,255,118,16,211,1,185,119,209,255,227,219,127,254,88,105,236,255,162,110,23,255,36,166,110,255,91,236,221,255,66,234,116,0,111,19,244,254,10,233,26,0,32,183,6,254,2,191,242,0,218,156,53,254,41,60,70,255,168,236,111,0,121,185,126,255,238,142,207,255,55,126,52,0,220,129,208,254,80,204,164,255,67,23,144,254,218,40,108,255,127,202,164,0,203,33,3,255,2,158,0,0,37,96,188,255,192,49,74,0,109,4,0,0,111,167,10,254,91,218,135,255,203,66,173,255,150,194,226,0,201,253,6,255,174,102,121,0,205,191,110,0,53,194,4,0,81,40,45,254,35,102,143,255,12,108,198,255,16,27,232,255,252,71,186,1,176,110,114,0,142,3,117,1,113,77,142,0,19,156,197,1,92,47,252,0,53,232,22,1,54,18,235,0,46,35,189,255,236,212,129,0,2,96,208,254,200,238,199,255,59,175,164,255,146,43,231,0,194,217,52,255,3,223,12,0,138,54,178,254,85,235,207,0,232,207,34,0,49,52,50,255,166,113,89,255,10,45,216,255,62,173,28,0,111,165,246,0,118,115,91,255,128,84,60,0,167,144,203,0,87,13,243,0,22,30,228,1,177,113,146,255,129,170,230,254,252,153,129,255,145,225,43,0,70,231,5,255,122,105,126,254,86,246,148,255,110,37,154,254,209,3,91,0,68,145,62,0,228,16,165,255,55,221,249,254,178,210,91,0,83,146,226,254,69,146,186,0,93,210,104,254,16,25,173,0,231,186,38,0,189,122,140,255,251,13,112,255,105,110,93,0,251,72,170,0,192,23,223,255,24,3,202,1,225,93,228,0,153,147,199,254,109,170,22,0,248,101,246,255,178,124,12,255,178,254,102,254,55,4,65,0,125,214,180,0,183,96,147,0,45,117,23,254,132,191,249,0,143,176,203,254,136,183,54,255,146,234,177,0,146,101,86,255,44,123,143,1,33,209,152,0,192,90,41,254,83,15,125,255,213,172,82,0,215,169,144,0,16,13,34,0,32,209,100,255,84,18,249,1,197,17,236,255,217,186,230,0,49,160,176,255,111,118,97,255,237,104,235,0,79,59,92,254,69,249,11,255,35,172,74,1,19,118,68,0,222,124,165,255,180,66,35,255,86,174,246,0,43,74,111,255,126,144,86,255,228,234,91,0,242,213,24,254,69,44,235,255,220,180,35,0,8,248,7,255,102,47,92,255,240,205,102,255,113,230,171,1,31,185,201,255,194,246,70,255,122,17,187,0,134,70,199,255,149,3,150,255,117,63,103,0,65,104,123,255,212,54,19,1,6,141,88,0,83,134,243,255,136,53,103,0,169,27,180,0,177,49,24,0,111,54,167,0,195,61,215,255,31,1,108,1,60,42,70,0,185,3,162,255,194,149,40,255,246,127,38,254,190,119,38,255,61,119,8,1,96,161,219,255,42,203,221,1,177,242,164,255,245,159,10,0,116,196,0,0,5,93,205,254,128,127,179,0,125,237,246,255,149,162,217,255,87,37,20,254,140,238,192,0,9,9,193,0,97,1,226,0,29,38,10,0,0,136,63,255,229,72,210,254,38,134,92,255,78,218,208,1,104,36,84,255,12,5,193,255,242,175,61,255,191,169,46,1,179,147,147,255,113,190,139,254,125,172,31,0,3,75,252,254,215,36,15,0,193,27,24,1,255,69,149,255,110,129,118,0,203,93,249,0,138,137,64,254,38,70,6,0,153,116,222,0,161,74,123,0,193,99,79,255,118,59,94,255,61,12,43,1,146,177,157,0,46,147,191,0,16,255,38,0,11,51,31,1,60,58,98,255,111,194,77,1,154,91,244,0,140,40,144,1,173,10,251,0,203,209,50,254,108,130,78,0,228,180,90,0,174,7,250,0,31,174,60,0,41,171,30,0,116,99,82,255,118,193,139,255,187,173,198,254,218,111,56,0,185,123,216,0,249,158,52,0,52,180,93,255,201,9,91,255,56,45,166,254,132,155,203,255,58,232,110,0,52,211,89,255,253,0,162,1,9,87,183,0,145,136,44,1,94,122,245,0,85,188,171,1,147,92,198,0,0,8,104,0,30,95,174,0,221,230,52,1,247,247,235,255,137,174,53,255,35,21,204,255,71,227,214,1,232,82,194,0,11,48,227,255,170,73,184,255,198,251,252,254,44,112,34,0,131,101,131,255,72,168,187,0,132,135,125,255,138,104,97,255,238,184,168,255,243,104,84,255,135,216,226,255,139,144,237,0,188,137,150,1,80,56,140,255,86,169,167,255,194,78,25,255,220,17,180,255,17,13,193,0,117,137,212,255,141,224,151,0,49,244,175,0,193,99,175,255,19,99,154,1,255,65,62,255,156,210,55,255,242,244,3,255,250,14,149,0,158,88,217,255,157,207,134,254,251,232,28,0,46,156,251,255,171,56,184,255,239,51,234,0,142,138,131,255,25,254,243,1,10,201,194,0,63,97,75,0,210,239,162,0,192,200,31,1,117,214,243,0,24,71,222,254,54,40,232,255,76,183,111,254,144,14,87,255,214,79,136,255,216,196,212,0,132,27,140,254,131,5,253,0,124,108,19,255,28,215,75,0,76,222,55,254,233,182,63,0,68,171,191,254,52,111,222,255,10,105,77,255,80,170,235,0,143,24,88,255,45,231,121,0,148,129,224,1,61,246,84,0,253,46,219,255,239,76,33,0,49,148,18,254,230,37,69,0,67,134,22,254,142,155,94,0,31,157,211,254,213,42,30,255,4,228,247,254,252,176,13,255,39,0,31,254,241,244,255,255,170,45,10,254,253,222,249,0,222,114,132,0,255,47,6,255,180,163,179,1,84,94,151,255,89,209,82,254,229,52,169,255,213,236,0,1,214,56,228,255,135,119,151,255,112,201,193,0,83,160,53,254,6,151,66,0,18,162,17,0,233,97,91,0,131,5,78,1,181,120,53,255,117,95,63,255,237,117,185,0,191,126,136,255,144,119,233,0,183,57,97,1,47,201,187,255,167,165,119,1,45,100,126,0,21,98,6,254,145,150,95,255,120,54,152,0,209,98,104,0,143,111,30,254,184,148,249,0,235,216,46,0,248,202,148,255,57,95,22,0,242,225,163,0,233,247,232,255,71,171,19,255,103,244,49,255,84,103,93,255,68,121,244,1,82,224,13,0,41,79,43,255,249,206,167,255,215,52,21,254,192,32,22,255,247,111,60,0,101,74,38,255,22,91,84,254,29,28,13,255,198,231,215,254,244,154,200,0,223,137,237,0,211,132,14,0,95,64,206,255,17,62,247,255,233,131,121,1,93,23,77,0,205,204,52,254,81,189,136,0,180,219,138,1,143,18,94,0,204,43,140,254,188,175,219,0,111,98,143,255,151,63,162,255,211,50,71,254,19,146,53,0,146,45,83,254,178,82,238,255,16,133,84,255,226,198,93,255,201,97,20,255,120,118,35,255,114,50,231,255,162,229,156,255,211,26,12,0,114,39,115,255,206,212,134,0,197,217,160,255,116,129,94,254,199,215,219,255,75,223,249,1,253,116,181,255,232,215,104,255,228,130,246,255,185,117,86,0,14,5,8,0,239,29,61,1,237,87,133,255,125,146,137,254,204,168,223,0,46,168,245,0,154,105,22,0,220,212,161,255,107,69,24,255,137,218,181,255,241,84,198,255,130,122,211,255,141,8,153,255,190,177,118,0,96,89,178,0,255,16,48,254,122,96,105,255,117,54,232,255,34,126,105,255,204,67,166,0,232,52,138,255,211,147,12,0,25,54,7,0,44,15,215,254,51,236,45,0,190,68,129,1,106,147,225,0,28,93,45,254,236,141,15,255,17,61,161,0,220,115,192,0,236,145,24,254,111,168,169,0,224,58,63,255,127,164,188,0,82,234,75,1,224,158,134,0,209,68,110,1,217,166,217,0,70,225,166,1,187,193,143,255,16,7,88,255,10,205,140,0,117,192,156,1,17,56,38,0,27,124,108,1,171,215,55,255,95,253,212,0,155,135,168,255,246,178,153,254,154,68,74,0,232,61,96,254,105,132,59,0,33,76,199,1,189,176,130,255,9,104,25,254,75,198,102,255,233,1,112,0,108,220,20,255,114,230,70,0,140,194,133,255,57,158,164,254,146,6,80,255,169,196,97,1,85,183,130,0,70,158,222,1,59,237,234,255,96,25,26,255,232,175,97,255,11,121,248,254,88,35,194,0,219,180,252,254,74,8,227,0,195,227,73,1,184,110,161,255,49,233,164,1,128,53,47,0,82,14,121,255,193,190,58,0,48,174,117,255,132,23,32,0,40,10,134,1,22,51,25,255,240,11,176,255,110,57,146,0,117,143,239,1,157,101,118,255,54,84,76,0,205,184,18,255,47,4,72,255,78,112,85,255,193,50,66,1,93,16,52,255,8,105,134,0,12,109,72,255,58,156,251,0,144,35,204,0,44,160,117,254,50,107,194,0,1,68,165,255,111,110,162,0,158,83,40,254,76,214,234,0,58,216,205,255,171,96,147,255,40,227,114,1,176,227,241,0,70,249,183,1,136,84,139,255,60,122,247,254,143,9,117,255,177,174,137,254,73,247,143,0,236,185,126,255,62,25,247,255,45,64,56,255,161,244,6,0,34,57,56,1,105,202,83,0,128,147,208,0,6,103,10,255,74,138,65,255,97,80,100,255,214,174,33,255,50,134,74,255,110,151,130,254,111,84,172,0,84,199,75,254,248,59,112,255,8,216,178,1,9,183,95,0,238,27,8,254,170,205,220,0,195,229,135,0,98,76,237,255,226,91,26,1,82,219,39,255,225,190,199,1,217,200,121,255,81,179,8,255,140,65,206,0,178,207,87,254,250,252,46,255,104,89,110,1,253,189,158,255,144,214,158,255,160,245,54,255,53,183,92,1,21,200,194,255,146,33,113,1,209,1,255,0,235,106,43,255,167,52,232,0,157,229,221,0,51,30,25,0,250,221,27,1,65,147,87,255,79,123,196,0,65,196,223,255,76,44,17,1,85,241,68,0,202,183,249,255,65,212,212,255,9,33,154,1,71,59,80,0,175,194,59,255,141,72,9,0,100,160,244,0,230,208,56,0,59,25,75,254,80,194,194,0,18,3,200,254,160,159,115,0,132,143,247,1,111,93,57,255,58,237,11,1,134,222,135,255,122,163,108,1,123,43,190,255,251,189,206,254,80,182,72,255,208,246,224,1,17,60,9,0,161,207,38,0,141,109,91,0,216,15,211,255,136,78,110,0,98,163,104,255,21,80,121,255,173,178,183,1,127,143,4,0,104,60,82,254,214,16,13,255,96,238,33,1,158,148,230,255,127,129,62,255,51,255,210,255,62,141,236,254,157,55,224,255,114,39,244,0,192,188,250,255,228,76,53,0,98,84,81,255,173,203,61,254,147,50,55,255,204,235,191,0,52,197,244,0,88,43,211,254,27,191,119,0,188,231,154,0,66,81,161,0,92,193,160,1,250,227,120,0,123,55,226,0,184,17,72,0,133,168,10,254,22,135,156,255,41,25,103,255,48,202,58,0,186,149,81,255,188,134,239,0,235,181,189,254,217,139,188,255,74,48,82,0,46,218,229,0,189,253,251,0,50,229,12,255,211,141,191,1,128,244,25,255,169,231,122,254,86,47,189,255,132,183,23,255,37,178,150,255,51,137,253,0,200,78,31,0,22,105,50,0,130,60,0,0,132,163,91,254,23,231,187,0,192,79,239,0,157,102,164,255,192,82,20,1,24,181,103,255,240,9,234,0,1,123,164,255,133,233,0,255,202,242,242,0,60,186,245,0,241,16,199,255,224,116,158,254,191,125,91,255,224,86,207,0,121,37,231,255,227,9,198,255,15,153,239,255,121,232,217,254,75,112,82,0,95,12,57,254,51,214,105,255,148,220,97,1,199,98,36,0,156,209,12,254,10,212,52,0,217,180,55,254,212,170,232,255,216,20,84,255,157,250,135,0,157,99,127,254,1,206,41,0,149,36,70,1,54,196,201,255,87,116,0,254,235,171,150,0,27,163,234,0,202,135,180,0,208,95,0,254,123,156,93,0,183,62,75,0,137,235,182,0,204,225,255,255,214,139,210,255,2,115,8,255,29,12,111,0,52,156,1,0,253,21,251,255,37,165,31,254,12,130,211,0,106,18,53,254,42,99,154,0,14,217,61,254,216,11,92,255,200,197,112,254,147,38,199,0,36,252,120,254,107,169,77,0,1,123,159,255,207,75,102,0,163,175,196,0,44,1,240,0,120,186,176,254,13,98,76,255,237,124,241,255,232,146,188,255,200,96,224,0,204,31,41,0,208,200,13,0,21,225,96,255,175,156,196,0,247,208,126,0,62,184,244,254,2,171,81,0,85,115,158,0,54,64,45,255,19,138,114,0,135,71,205,0,227,47,147,1,218,231,66,0,253,209,28,0,244,15,173,255,6,15,118,254,16,150,208,255,185,22,50,255,86,112,207,255,75,113,215,1,63,146,43,255,4,225,19,254,227,23,62,255,14,255,214,254,45,8,205,255,87,197,151,254,210,82,215,255,245,248,247,255,128,248,70,0,225,247,87,0,90,120,70,0,213,245,92,0,13,133,226,0,47,181,5,1,92,163,105,255,6,30,133,254,232,178,61,255,230,149,24,255,18,49,158,0,228,100,61,254,116,243,251,255,77,75,92,1,81,219,147,255,76,163,254,254,141,213,246,0,232,37,152,254,97,44,100,0,201,37,50,1,212,244,57,0,174,171,183,255,249,74,112,0,166,156,30,0,222,221,97,255,243,93,73,254,251,101,100,255,216,217,93,255,254,138,187,255,142,190,52,255,59,203,177,255,200,94,52,0,115,114,158,255,165,152,104,1,126,99,226,255,118,157,244,1,107,200,16,0,193,90,229,0,121,6,88,0,156,32,93,254,125,241,211,255,14,237,157,255,165,154,21,255,184,224,22,255,250,24,152,255,113,77,31,0,247,171,23,255,237,177,204,255,52,137,145,255,194,182,114,0,224,234,149,0,10,111,103,1,201,129,4,0,238,142,78,0,52,6,40,255,110,213,165,254,60,207,253,0,62,215,69,0,96,97,0,255,49,45,202,0,120,121,22,255,235,139,48,1,198,45,34,255,182,50,27,1,131,210,91,255,46,54,128,0,175,123,105,255,198,141,78,254,67,244,239,255,245,54,103,254,78,38,242,255,2,92,249,254,251,174,87,255,139,63,144,0,24,108,27,255,34,102,18,1,34,22,152,0,66,229,118,254,50,143,99,0,144,169,149,1,118,30,152,0,178,8,121,1,8,159,18,0,90,101,230,255,129,29,119,0,68,36,11,1,232,183,55,0,23,255,96,255,161,41,193,255,63,139,222,0,15,179,243,0,255,100,15,255,82,53,135,0,137,57,149,1,99,240,170,255,22,230,228,254,49,180,82,255,61,82,43,0,110,245,217,0,199,125,61,0,46,253,52,0,141,197,219,0,211,159,193,0,55,121,105,254,183,20,129,0,169,119,170,255,203,178,139,255,135,40,182,255,172,13,202,255,65,178,148,0,8,207,43,0,122,53,127,1,74,161,48,0,227,214,128,254,86,11,243,255,100,86,7,1,245,68,134,255,61,43,21,1,152,84,94,255,190,60,250,254,239,118,232,255,214,136,37,1,113,76,107,255,93,104,100,1,144,206,23,255,110,150,154,1,228,103,185,0,218,49,50,254,135,77,139,255,185,1,78,0,0,161,148,255,97,29,233,255,207,148,149,255,160,168,0,0,91,128,171,255,6,28,19,254,11,111,247,0,39,187,150,255,138,232,149,0,117,62,68,255,63,216,188,255,235,234,32,254,29,57,160,255,25,12,241,1,169,60,191,0,32,131,141,255,237,159,123,255,94,197,94,254,116,254,3,255,92,179,97,254,121,97,92,255,170,112,14,0,21,149,248,0,248,227,3,0,80,96,109,0,75,192,74,1,12,90,226,255,161,106,68,1,208,114,127,255,114,42,255,254,74,26,74,255,247,179,150,254,121,140,60,0,147,70,200,255,214,40,161,255,161,188,201,255,141,65,135,255,242,115,252,0,62,47,202,0,180,149,255,254,130,55,237,0,165,17,186,255,10,169,194,0,156,109,218,255,112,140,123,255,104,128,223,254,177,142,108,255,121,37,219,255,128,77,18,255,111,108,23,1,91,192,75,0,174,245,22,255,4,236,62,255,43,64,153,1,227,173,254,0,237,122,132,1,127,89,186,255,142,82,128,254,252,84,174,0,90,179,177,1,243,214,87,255,103,60,162,255,208,130,14,255,11,130,139,0,206,129,219,255,94,217,157,255,239,230,230,255,116,115,159,254,164,107,95,0,51,218,2,1,216,125,198,255,140,202,128,254,11,95,68,255,55,9,93,254,174,153,6,255,204,172,96,0,69,160,110,0,213,38,49,254,27,80,213,0,118,125,114,0,70,70,67,255,15,142,73,255,131,122,185,255,243,20,50,254,130,237,40,0,210,159,140,1,197,151,65,255,84,153,66,0,195,126,90,0,16,238,236,1,118,187,102,255,3,24,133,255,187,69,230,0,56,197,92,1,213,69,94,255,80,138,229,1,206,7,230,0,222,111,230,1,91,233,119,255,9,89,7,1,2,98,1,0,148,74,133,255,51,246,180,255,228,177,112,1,58,189,108,255,194,203,237,254,21,209,195,0,147,10,35,1,86,157,226,0,31,163,139,254,56,7,75,255,62,90,116,0,181,60,169,0,138,162,212,254,81,167,31,0,205,90,112,255,33,112,227,0,83,151,117,1,177,224,73,255,174,144,217,255,230,204,79,255,22,77,232,255,114,78,234,0,224,57,126,254,9,49,141,0,242,147,165,1,104,182,140,255,167,132,12,1,123,68,127,0,225,87,39,1,251,108,8,0,198,193,143,1,121,135,207,255,172,22,70,0,50,68,116,255,101,175,40,255,248,105,233,0,166,203,7,0,110,197,218,0,215,254,26,254,168,226,253,0,31,143,96,0,11,103,41,0,183,129,203,254,100,247,74,255,213,126,132,0,210,147,44,0,199,234,27,1,148,47,181,0,155,91,158,1,54,105,175,255,2,78,145,254,102,154,95,0,128,207,127,254,52,124,236,255,130,84,71,0,221,243,211,0,152,170,207,0,222,106,199,0,183,84,94,254,92,200,56,255,138,182,115,1,142,96,146,0,133,136,228,0,97,18,150,0,55,251,66,0,140,102,4,0,202,103,151,0,30,19,248,255,51,184,207,0,202,198,89,0,55,197,225,254,169,95,249,255,66,65,68,255,188,234,126,0,166,223,100,1,112,239,244,0,144,23,194,0,58,39,182,0,244,44,24,254,175,68,179,255,152,118,154,1,176,162,130,0,217,114,204,254,173,126,78,255,33,222,30,255,36,2,91,255,2,143,243,0,9,235,215,0,3,171,151,1,24,215,245,255,168,47,164,254,241,146,207,0,69,129,180,0,68,243,113,0,144,53,72,254,251,45,14,0,23,110,168,0,68,68,79,255,110,70,95,254,174,91,144,255,33,206,95,255,137,41,7,255,19,187,153,254,35,255,112,255,9,145,185,254,50,157,37,0,11,112,49,1,102,8,190,255,234,243,169,1,60,85,23,0,74,39,189,0,116,49,239,0,173,213,210,0,46,161,108,255,159,150,37,0,196,120,185,255,34,98,6,255,153,195,62,255,97,230,71,255,102,61,76,0,26,212,236,255,164,97,16,0,198,59,146,0,163,23,196,0,56,24,61,0,181,98,193,0,251,147,229,255,98,189,24,255,46,54,206,255,234,82,246,0,183,103,38,1,109,62,204,0,10,240,224,0,146,22,117,255,142,154,120,0,69,212,35,0,208,99,118,1,121,255,3,255,72,6,194,0,117,17,197,255,125,15,23,0,154,79,153,0,214,94,197,255,185,55,147,255,62,254,78,254,127,82,153,0,110,102,63,255,108,82,161,255,105,187,212,1,80,138,39,0,60,255,93,255,72,12,186,0,210,251,31,1,190,167,144,255,228,44,19,254,128,67,232,0,214,249,107,254,136,145,86,255,132,46,176,0,189,187,227,255,208,22,140,0,217,211,116,0,50,81,186,254,139,250,31,0,30,64,198,1,135,155,100,0,160,206,23,254,187,162,211,255,16,188,63,0,254,208,49,0,85,84,191,0,241,192,242,255,153,126,145,1,234,162,162,255,230,97,216,1,64,135,126,0,190,148,223,1,52,0,43,255,28,39,189,1,64,136,238,0,175,196,185,0,98,226,213,255,127,159,244,1,226,175,60,0,160,233,142,1,180,243,207,255,69,152,89,1,31,101,21,0,144,25,164,254,139,191,209,0,91,25,121,0,32,147,5,0,39,186,123,255,63,115,230,255,93,167,198,255,143,213,220,255,179,156,19,255,25,66,122,0,214,160,217,255,2,45,62,255,106,79,146,254,51,137,99,255,87,100,231,255,175,145,232,255,101,184,1,255,174,9,125,0,82,37,161,1,36,114,141,255,48,222,142,255,245,186,154,0,5,174,221,254,63,114,155,255,135,55,160,1,80,31,135,0,126,250,179,1,236,218,45,0,20,28,145,1,16,147,73,0,249,189,132,1,17,189,192,255,223,142,198,255,72,20,15,255,250,53,237,254,15,11,18,0,27,211,113,254,213,107,56,255,174,147,146,255,96,126,48,0,23,193,109,1,37,162,94,0,199,157,249,254,24,128,187,255,205,49,178,254,93,164,42,255,43,119,235,1,88,183,237,255,218,210,1,255,107,254,42,0,230,10,99,255,162,0,226,0,219,237,91,0,129,178,203,0,208,50,95,254,206,208,95,255,247,191,89,254,110,234,79,255,165,61,243,0,20,122,112,255,246,246,185,254,103,4,123,0,233,99,230,1,219,91,252,255,199,222,22,255,179,245,233,255,211,241,234,0,111,250,192,255,85,84,136,0,101,58,50,255,131,173,156,254,119,45,51,255,118,233,16,254,242,90,214,0,94,159,219,1,3,3,234,255,98,76,92,254,80,54,230,0,5,228,231,254,53,24,223,255,113,56,118,1,20,132,1,255,171,210,236,0,56,241,158,255,186,115,19,255,8,229,174,0,48,44,0,1,114,114,166,255,6,73,226,255,205,89,244,0,137,227,75,1,248,173,56,0,74,120,246,254,119,3,11,255,81,120,198,255,136,122,98,255,146,241,221,1,109,194,78,255,223,241,70,1,214,200,169,255,97,190,47,255,47,103,174,255,99,92,72,254,118,233,180,255,193,35,233,254,26,229,32,255,222,252,198,0,204,43,71,255,199,84,172,0,134,102,190,0,111,238,97,254,230,40,230,0,227,205,64,254,200,12,225,0,166,25,222,0,113,69,51,255,143,159,24,0,167,184,74,0,29,224,116,254,158,208,233,0,193,116,126,255,212,11,133,255,22,58,140,1,204,36,51,255,232,30,43,0,235,70,181,255,64,56,146,254,169,18,84,255,226,1,13,255,200,50,176,255,52,213,245,254,168,209,97,0,191,71,55,0,34,78,156,0,232,144,58,1,185,74,189,0,186,142,149,254,64,69,127,255,161,203,147,255,176,151,191,0,136,231,203,254,163,182,137,0,161,126,251,254,233,32,66,0,68,207,66,0,30,28,37,0,93,114,96,1,254,92,247,255,44,171,69,0,202,119,11,255,188,118,50,1,255,83,136,255,71,82,26,0,70,227,2,0,32,235,121,1,181,41,154,0,71,134,229,254,202,255,36,0,41,152,5,0,154,63,73,255,34,182,124,0,121,221,150,255,26,204,213,1,41,172,87,0,90,157,146,255,109,130,20,0,71,107,200,255,243,102,189,0,1,195,145,254,46,88,117,0,8,206,227,0,191,110,253,255,109,128,20,254,134,85,51,255,137,177,112,1,216,34,22,255,131,16,208,255,121,149,170,0,114,19,23,1,166,80,31,255,113,240,122,0,232,179,250,0,68,110,180,254,210,170,119,0,223,108,164,255,207,79,233,255,27,229,226,254,209,98,81,255,79,68,7,0,131,185,100,0,170,29,162,255,17,162,107,255,57,21,11,1,100,200,181,255,127,65,166,1,165,134,204,0,104,167,168,0,1,164,79,0,146,135,59,1,70,50,128,255,102,119,13,254,227,6,135,0,162,142,179,255,160,100,222,0,27,224,219,1,158,93,195,255,234,141,137,0,16,24,125,255,238,206,47,255,97,17,98,255,116,110,12,255,96,115,77,0,91,227,232,255,248,254,79,255,92,229,6,254,88,198,139,0,206,75,129,0,250,77,206,255,141,244,123,1,138,69,220,0,32,151,6,1,131,167,22,255,237,68,167,254,199,189,150,0,163,171,138,255,51,188,6,255,95,29,137,254,148,226,179,0,181,107,208,255,134,31,82,255,151,101,45,255,129,202,225,0,224,72,147,0,48,138,151,255,195,64,206,254,237,218,158,0,106,29,137,254,253,189,233,255,103,15,17,255,194,97,255,0,178,45,169,254,198,225,155,0,39,48,117,255,135,106,115,0,97,38,181,0,150,47,65,255,83,130,229,254,246,38,129,0,92,239,154,254,91,99,127,0,161,111,33,255,238,217,242,255,131,185,195,255,213,191,158,255,41,150,218,0,132,169,131,0,89,84,252,1,171,70,128,255,163,248,203,254,1,50,180,255,124,76,85,1,251,111,80,0,99,66,239,255,154,237,182,255,221,126,133,254,74,204,99,255,65,147,119,255,99,56,167,255,79,248,149,255,116,155,228,255,237,43,14,254,69,137,11,255,22,250,241,1,91,122,143,255,205,249,243,0,212,26,60,255,48,182,176,1,48,23,191,255,203,121,152,254,45,74,213,255,62,90,18,254,245,163,230,255,185,106,116,255,83,35,159,0,12,33,2,255,80,34,62,0,16,87,174,255,173,101,85,0,202,36,81,254,160,69,204,255,64,225,187,0,58,206,94,0,86,144,47,0,229,86,245,0,63,145,190,1,37,5,39,0,109,251,26,0,137,147,234,0,162,121,145,255,144,116,206,255,197,232,185,255,183,190,140,255,73,12,254,255,139,20,242,255,170,90,239,255,97,66,187,255,245,181,135,254,222,136,52,0,245,5,51,254,203,47,78,0,152,101,216,0,73,23,125,0,254,96,33,1,235,210,73,255,43,209,88,1,7,129,109,0,122,104,228,254,170,242,203,0,242,204,135,255,202,28,233,255,65,6,127,0,159,144,71,0,100,140,95,0,78,150,13,0,251,107,118,1,182,58,125,255,1,38,108,255,141,189,209,255,8,155,125,1,113,163,91,255,121,79,190,255,134,239,108,255,76,47,248,0,163,228,239,0,17,111,10,0,88,149,75,255,215,235,239,0,167,159,24,255,47,151,108,255,107,209,188,0,233,231,99,254,28,202,148,255,174,35,138,255,110,24,68,255,2,69,181,0,107,102,82,0,102,237,7,0,92,36,237,255,221,162,83,1,55,202,6,255,135,234,135,255,24,250,222,0,65,94,168,254,245,248,210,255,167,108,201,254,255,161,111,0,205,8,254,0,136,13,116,0,100,176,132,255,43,215,126,255,177,133,130,255,158,79,148,0,67,224,37,1,12,206,21,255,62,34,110,1,237,104,175,255,80,132,111,255,142,174,72,0,84,229,180,254,105,179,140,0,64,248,15,255,233,138,16,0,245,67,123,254,218,121,212,255,63,95,218,1,213,133,137,255,143,182,82,255,48,28,11,0,244,114,141,1,209,175,76,255,157,181,150,255,186,229,3,255,164,157,111,1,231,189,139,0,119,202,190,255,218,106,64,255,68,235,63,254,96,26,172,255,187,47,11,1,215,18,251,255,81,84,89,0,68,58,128,0,94,113,5,1,92,129,208,255,97,15,83,254,9,28,188,0,239,9,164,0,60,205,152,0,192,163,98,255,184,18,60,0,217,182,139,0,109,59,120,255,4,192,251,0,169,210,240,255,37,172,92,254,148,211,245,255,179,65,52,0,253,13,115,0,185,174,206,1,114,188,149,255,237,90,173,0,43,199,192,255,88,108,113,0,52,35,76,0,66,25,148,255,221,4,7,255,151,241,114,255,190,209,232,0,98,50,199,0,151,150,213,255,18,74,36,1,53,40,7,0,19,135,65,255,26,172,69,0,174,237,85,0,99,95,41,0,3,56,16,0,39,160,177,255,200,106,218,254,185,68,84,255,91,186,61,254,67,143,141,255,13,244,166,255,99,114,198,0,199,110,163,255,193,18,186,0,124,239,246,1,110,68,22,0,2,235,46,1,212,60,107,0,105,42,105,1,14,230,152,0,7,5,131,0,141,104,154,255,213,3,6,0,131,228,162,255,179,100,28,1,231,123,85,255,206,14,223,1,253,96,230,0,38,152,149,1,98,137,122,0,214,205,3,255,226,152,179,255,6,133,137,0,158,69,140,255,113,162,154,255,180,243,172,255,27,189,115,255,143,46,220,255,213,134,225,255,126,29,69,0,188,43,137,1,242,70,9,0,90,204,255,255,231,170,147,0,23,56,19,254,56,125,157,255,48,179,218,255,79,182,253,255,38,212,191,1,41,235,124,0,96,151,28,0,135,148,190,0,205,249,39,254,52,96,136,255,212,44,136,255,67,209,131,255,252,130,23,255,219,128,20,255,198,129,118,0,108,101,11,0,178,5,146,1,62,7,100,255,181,236,94,254,28,26,164,0,76,22,112,255,120,102,79,0,202,192,229,1,200,176,215,0,41,64,244,255,206,184,78,0,167,45,63,1,160,35,0,255,59,12,142,255,204,9,144,255,219,94,229,1,122,27,112,0,189,105,109,255,64,208,74,255,251,127,55,1,2,226,198,0,44,76,209,0,151,152,77,255,210,23,46,1,201,171,69,255,44,211,231,0,190,37,224,255,245,196,62,255,169,181,222,255,34,211,17,0,119,241,197,255,229,35,152,1,21,69,40,255,178,226,161,0,148,179,193,0,219,194,254,1,40,206,51,255,231,92,250,1,67,153,170,0,21,148,241,0,170,69,82,255,121,18,231,255,92,114,3,0,184,62,230,0,225,201,87,255,146,96,162,255,181,242,220,0,173,187,221,1,226,62,170,255,56,126,217,1,117,13,227,255,179,44,239,0,157,141,155,255,144,221,83,0,235,209,208,0,42,17,165,1,251,81,133,0,124,245,201,254,97,211,24,255,83,214,166,0,154,36,9,255,248,47,127,0,90,219,140,255,161,217,38,254,212,147,63,255,66,84,148,1,207,3,1,0,230,134,89,1,127,78,122,255,224,155,1,255,82,136,74,0,178,156,208,255,186,25,49,255,222,3,210,1,229,150,190,255,85,162,52,255,41,84,141,255,73,123,84,254,93,17,150,0,119,19,28,1,32,22,215,255,28,23,204,255,142,241,52,255,228,52,125,0,29,76,207,0,215,167,250,254,175,164,230,0,55,207,105,1,109,187,245,255,161,44,220,1,41,101,128,255,167,16,94,0,93,214,107,255,118,72,0,254,80,61,234,255,121,175,125,0,139,169,251,0,97,39,147,254,250,196,49,255,165,179,110,254,223,70,187,255,22,142,125,1,154,179,138,255,118,176,42,1,10,174,153,0,156,92,102,0,168,13,161,255,143,16,32,0,250,197,180,255,203,163,44,1,87,32,36,0,161,153,20,255,123,252,15,0,25,227,80,0,60,88,142,0,17,22,201,1,154,205,77,255,39,63,47,0,8,122,141,0,128,23,182,254,204,39,19,255,4,112,29,255,23,36,140,255,210,234,116,254,53,50,63,255,121,171,104,255,160,219,94,0,87,82,14,254,231,42,5,0,165,139,127,254,86,78,38,0,130,60,66,254,203,30,45,255,46,196,122,1,249,53,162,255,136,143,103,254,215,210,114,0,231,7,160,254,169,152,42,255,111,45,246,0,142,131,135,255,131,71,204,255,36,226,11,0,0,28,242,255,225,138,213,255,247,46,216,254,245,3,183,0,108,252,74,1,206,26,48,255,205,54,246,255,211,198,36,255,121,35,50,0,52,216,202,255,38,139,129,254,242,73,148,0,67,231,141,255,42,47,204,0,78,116,25,1,4,225,191,255,6,147,228,0,58,88,177,0,122,165,229,255,252,83,201,255,224,167,96,1,177,184,158,255,242,105,179,1,248,198,240,0,133,66,203,1,254,36,47,0,45,24,115,255,119,62,254,0,196,225,186,254,123,141,172,0,26,85,41,255,226,111,183,0,213,231,151,0,4,59,7,255,238,138,148,0,66,147,33,255,31,246,141,255,209,141,116,255,104,112,31,0,88,161,172,0,83,215,230,254,47,111,151,0,45,38,52,1,132,45,204,0,138,128,109,254,233,117,134,255,243,190,173,254,241,236,240,0,82,127,236,254,40,223,161,255,110,182,225,255,123,174,239,0,135,242,145,1,51,209,154,0,150,3,115,254,217,164,252,255,55,156,69,1,84,94,255,255,232,73,45,1,20,19,212,255,96,197,59,254,96,251,33,0,38,199,73,1,64,172,247,255,117,116,56,255,228,17,18,0,62,138,103,1,246,229,164,255,244,118,201,254,86,32,159,255,109,34,137,1,85,211,186,0,10,193,193,254,122,194,177,0,122,238,102,255,162,218,171,0,108,217,161,1,158,170,34,0,176,47,155,1,181,228,11,255,8,156,0,0,16,75,93,0,206,98,255,1,58,154,35,0,12,243,184,254,67,117,66,255,230,229,123,0,201,42,110,0,134,228,178,254,186,108,118,255,58,19,154,255,82,169,62,255,114,143,115,1,239,196,50,255,173,48,193,255,147,2,84,255,150,134,147,254,95,232,73,0,109,227,52,254,191,137,10,0,40,204,30,254,76,52,97,255,164,235,126,0,254,124,188,0,74,182,21,1,121,29,35,255,241,30,7,254,85,218,214,255,7,84,150,254,81,27,117,255,160,159,152,254,66,24,221,255,227,10,60,1,141,135,102,0,208,189,150,1,117,179,92,0,132,22,136,255,120,199,28,0,21,129,79,254,182,9,65,0,218,163,169,0,246,147,198,255,107,38,144,1,78,175,205,255,214,5,250,254,47,88,29,255,164,47,204,255,43,55,6,255,131,134,207,254,116,100,214,0,96,140,75,1,106,220,144,0,195,32,28,1,172,81,5,255,199,179,52,255,37,84,203,0,170,112,174,0,11,4,91,0,69,244,27,1,117,131,92,0,33,152,175,255,140,153,107,255,251,135,43,254,87,138,4,255,198,234,147,254,121,152,84,255,205,101,155,1,157,9,25,0,72,106,17,254,108,153,0,255,189,229,186,0,193,8,176,255,174,149,209,0,238,130,29,0,233,214,126,1,61,226,102,0,57,163,4,1,198,111,51,255,45,79,78,1,115,210,10,255,218,9,25,255,158,139,198,255,211,82,187,254,80,133,83,0,157,129,230,1,243,133,134,255,40,136,16,0,77,107,79,255,183,85,92,1,177,204,202,0,163,71,147,255,152,69,190,0,172,51,188,1,250,210,172,255,211,242,113,1,89,89,26,255,64,66,111,254,116,152,42,0,161,39,27,255,54,80,254,0,106,209,115,1,103,124,97,0,221,230,98,255,31,231,6,0,178,192,120,254,15,217,203,255,124,158,79,0,112,145,247,0,92,250,48,1,163,181,193,255,37,47,142,254,144,189,165,255,46,146,240,0,6,75,128,0,41,157,200,254,87,121,213,0,1,113,236,0,5,45,250,0,144,12,82,0,31,108,231,0,225,239,119,255,167,7,189,255,187,228,132,255,110,189,34,0,94,44,204,1,162,52,197,0,78,188,241,254,57,20,141,0,244,146,47,1,206,100,51,0,125,107,148,254,27,195,77,0,152,253,90,1,7,143,144,255,51,37,31,0,34,119,38,255,7,197,118,0,153,188,211,0,151,20,116,254,245,65,52,255,180,253,110,1,47,177,209,0,161,99,17,255,118,222,202,0,125,179,252,1,123,54,126,255,145,57,191,0,55,186,121,0,10,243,138,0,205,211,229,255,125,156,241,254,148,156,185,255,227,19,188,255,124,41,32,255,31,34,206,254,17,57,83,0,204,22,37,255,42,96,98,0,119,102,184,1,3,190,28],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE+20480);allocate([110,82,218,255,200,204,192,255,201,145,118,0,117,204,146,0,132,32,98,1,192,194,121,0,106,161,248,1,237,88,124,0,23,212,26,0,205,171,90,255,248,48,216,1,141,37,230,255,124,203,0,254,158,168,30,255,214,248,21,0,112,187,7,255,75,133,239,255,74,227,243,255,250,147,70,0,214,120,162,0,167,9,179,255,22,158,18,0,218,77,209,1,97,109,81,255,244,33,179,255,57,52,57,255,65,172,210,255,249,71,209,255,142,169,238,0,158,189,153,255,174,254,103,254,98,33,14,0,141,76,230,255,113,139,52,255,15,58,212,0,168,215,201,255,248,204,215,1,223,68,160,255,57,154,183,254,47,231,121,0,106,166,137,0,81,136,138,0,165,43,51,0,231,139,61,0,57,95,59,254,118,98,25,255,151,63,236,1,94,190,250,255,169,185,114,1,5,250,58,255,75,105,97,1,215,223,134,0,113,99,163,1,128,62,112,0,99,106,147,0,163,195,10,0,33,205,182,0,214,14,174,255,129,38,231,255,53,182,223,0,98,42,159,255,247,13,40,0,188,210,177,1,6,21,0,255,255,61,148,254,137,45,129,255,89,26,116,254,126,38,114,0,251,50,242,254,121,134,128,255,204,249,167,254,165,235,215,0,202,177,243,0,133,141,62,0,240,130,190,1,110,175,255,0,0,20,146,1,37,210,121,255,7,39,130,0,142,250,84,255,141,200,207,0,9,95,104,255,11,244,174,0,134,232,126,0,167,1,123,254,16,193,149,255,232,233,239,1,213,70,112,255,252,116,160,254,242,222,220,255,205,85,227,0,7,185,58,0,118,247,63,1,116,77,177,255,62,245,200,254,63,18,37,255,107,53,232,254,50,221,211,0,162,219,7,254,2,94,43,0,182,62,182,254,160,78,200,255,135,140,170,0,235,184,228,0,175,53,138,254,80,58,77,255,152,201,2,1,63,196,34,0,5,30,184,0,171,176,154,0,121,59,206,0,38,99,39,0,172,80,77,254,0,134,151,0,186,33,241,254,94,253,223,255,44,114,252,0,108,126,57,255,201,40,13,255,39,229,27,255,39,239,23,1,151,121,51,255,153,150,248,0,10,234,174,255,118,246,4,254,200,245,38,0,69,161,242,1,16,178,150,0,113,56,130,0,171,31,105,0,26,88,108,255,49,42,106,0,251,169,66,0,69,93,149,0,20,57,254,0,164,25,111,0,90,188,90,255,204,4,197,0,40,213,50,1,212,96,132,255,88,138,180,254,228,146,124,255,184,246,247,0,65,117,86,255,253,102,210,254,254,121,36,0,137,115,3,255,60,24,216,0,134,18,29,0,59,226,97,0,176,142,71,0,7,209,161,0,189,84,51,254,155,250,72,0,213,84,235,255,45,222,224,0,238,148,143,255,170,42,53,255,78,167,117,0,186,0,40,255,125,177,103,255,69,225,66,0,227,7,88,1,75,172,6,0,169,45,227,1,16,36,70,255,50,2,9,255,139,193,22,0,143,183,231,254,218,69,50,0,236,56,161,1,213,131,42,0,138,145,44,254,136,229,40,255,49,63,35,255,61,145,245,255,101,192,2,254,232,167,113,0,152,104,38,1,121,185,218,0,121,139,211,254,119,240,35,0,65,189,217,254,187,179,162,255,160,187,230,0,62,248,14,255,60,78,97,0,255,247,163,255,225,59,91,255,107,71,58,255,241,47,33,1,50,117,236,0,219,177,63,254,244,90,179,0,35,194,215,255,189,67,50,255,23,135,129,0,104,189,37,255,185,57,194,0,35,62,231,255,220,248,108,0,12,231,178,0,143,80,91,1,131,93,101,255,144,39,2,1,255,250,178,0,5,17,236,254,139,32,46,0,204,188,38,254,245,115,52,255,191,113,73,254,191,108,69,255,22,69,245,1,23,203,178,0,170,99,170,0,65,248,111,0,37,108,153,255,64,37,69,0,0,88,62,254,89,148,144,255,191,68,224,1,241,39,53,0,41,203,237,255,145,126,194,255,221,42,253,255,25,99,151,0,97,253,223,1,74,115,49,255,6,175,72,255,59,176,203,0,124,183,249,1,228,228,99,0,129,12,207,254,168,192,195,255,204,176,16,254,152,234,171,0,77,37,85,255,33,120,135,255,142,194,227,1,31,214,58,0,213,187,125,255,232,46,60,255,190,116,42,254,151,178,19,255,51,62,237,254,204,236,193,0,194,232,60,0,172,34,157,255,189,16,184,254,103,3,95,255,141,233,36,254,41,25,11,255,21,195,166,0,118,245,45,0,67,213,149,255,159,12,18,255,187,164,227,1,160,25,5,0,12,78,195,1,43,197,225,0,48,142,41,254,196,155,60,255,223,199,18,1,145,136,156,0,252,117,169,254,145,226,238,0,239,23,107,0,109,181,188,255,230,112,49,254,73,170,237,255,231,183,227,255,80,220,20,0,194,107,127,1,127,205,101,0,46,52,197,1,210,171,36,255,88,3,90,255,56,151,141,0,96,187,255,255,42,78,200,0,254,70,70,1,244,125,168,0,204,68,138,1,124,215,70,0,102,66,200,254,17,52,228,0,117,220,143,254,203,248,123,0,56,18,174,255,186,151,164,255,51,232,208,1,160,228,43,255,249,29,25,1,68,190,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,224,124,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,0,0,0,19,0,0,0,65,132,0,0,0,4,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,101,120,112,97,110,100,32,51,50,45,98,121,116,101,32,107,111,117,116,108,101,110,32,60,61,32,85,73,78,84,56,95,77,65,88,0,99,114,121,112,116,111,95,103,101,110,101,114,105,99,104,97,115,104,47,98,108,97,107,101,50,47,114,101,102,47,103,101,110,101,114,105,99,104,97,115,104,95,98,108,97,107,101,50,98,46,99,0,99,114,121,112,116,111,95,103,101,110,101,114,105,99,104,97,115,104,95,98,108,97,107,101,50,98,0,107,101,121,108,101,110,32,60,61,32,85,73,78,84,56,95,77,65,88,0,99,114,121,112,116,111,95,103,101,110,101,114,105,99,104,97,115,104,95,98,108,97,107,101,50,98,95,105,110,105,116,0,99,114,121,112,116,111,95,103,101,110,101,114,105,99,104,97,115,104,95,98,108,97,107,101,50,98,95,102,105,110,97,108,0,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,55,36,0,101,120,112,97,110,100,32,51,50,45,98,121,116,101,32,107,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,123,32,114,101,116,117,114,110,32,77,111,100,117,108,101,46,103,101,116,82,97,110,100,111,109,86,97,108,117,101,40,41,59,32,125,0,123,32,105,102,32,40,77,111,100,117,108,101,46,103,101,116,82,97,110,100,111,109,86,97,108,117,101,32,61,61,61,32,117,110,100,101,102,105,110,101,100,41,32,123,32,116,114,121,32,123,32,118,97,114,32,119,105,110,100,111,119,95,32,61,32,34,111,98,106,101,99,116,34,32,61,61,61,32,116,121,112,101,111,102,32,119,105,110,100,111,119,32,63,32,119,105,110,100,111,119,32,58,32,115,101,108,102,44,32,99,114,121,112,116,111,95,32,61,32,116,121,112,101,111,102,32,119,105,110,100,111,119,95,46,99,114,121,112,116,111,32,33,61,61,32,34,117,110,100,101,102,105,110,101,100,34,32,63,32,119,105,110,100,111,119,95,46,99,114,121,112,116,111,32,58,32,119,105,110,100,111,119,95,46,109,115,67,114,121,112,116,111,44,32,114,97,110,100,111,109,86,97,108,117,101,115,83,116,97,110,100,97,114,100,32,61,32,102,117,110,99,116,105,111,110,40,41,32,123,32,118,97,114,32,98,117,102,32,61,32,110,101,119,32,85,105,110,116,51,50,65,114,114,97,121,40,49,41,59,32,99,114,121,112,116,111,95,46,103,101,116,82,97,110,100,111,109,86,97,108,117,101,115,40,98,117,102,41,59,32,114,101,116,117,114,110,32,98,117,102,91,48,93,32,62,62,62,32,48,59,32,125,59,32,114,97,110,100,111,109,86,97,108,117,101,115,83,116,97,110,100,97,114,100,40,41,59,32,77,111,100,117,108,101,46,103,101,116,82,97,110,100,111,109,86,97,108,117,101,32,61,32,114,97,110,100,111,109,86,97,108,117,101,115,83,116,97,110,100,97,114,100,59,32,125,32,99,97,116,99,104,32,40,101,41,32,123,32,116,114,121,32,123,32,118,97,114,32,99,114,121,112,116,111,32,61,32,114,101,113,117,105,114,101,40,39,99,114,121,112,116,111,39,41,44,32,114,97,110,100,111,109,86,97,108,117,101,78,111,100,101,74,83,32,61,32,102,117,110,99,116,105,111,110,40,41,32,123,32,118,97,114,32,98,117,102,32,61,32,99,114,121,112,116,111,46,114,97,110,100,111,109,66,121,116,101,115,40,52,41,59,32,114,101,116,117,114,110,32,40,98,117,102,91,48,93,32,60,60,32,50,52,32,124,32,98,117,102,91,49,93,32,60,60,32,49,54,32,124,32,98,117,102,91,50,93,32,60,60,32,56,32,124,32,98,117,102,91,51,93,41,32,62,62,62,32,48,59,32,125,59,32,114,97,110,100,111,109,86,97,108,117,101,78,111,100,101,74,83,40,41,59,32,77,111,100,117,108,101,46,103,101,116,82,97,110,100,111,109,86,97,108,117,101,32,61,32,114,97,110,100,111,109,86,97,108,117,101,78,111,100,101,74,83,59,32,125,32,99,97,116,99,104,32,40,101,41,32,123,32,116,104,114,111,119,32,39,78,111,32,115,101,99,117,114,101,32,114,97,110,100,111,109,32,110,117,109,98,101,114,32,103,101,110,101,114,97,116,111,114,32,102,111,117,110,100,39,59,32,125,32,125,32,125,32,125,0,49,46,48,46,54,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,101,120,112,97,110,100,32,51,50,45,98,121,116,101,32,107,101,120,112,97,110,100,32,51,50,45,98,121,116,101,32,107],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE+30720);allocate([46,47,48,49,50,51,52,53,54,55,56,57,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,0],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE+34873);var tempDoublePtr=Runtime.alignMemory(allocate(12,"i8",ALLOC_STATIC),8);assert(tempDoublePtr%8==0);function copyTempFloat(ptr){HEAP8[tempDoublePtr]=HEAP8[ptr];HEAP8[tempDoublePtr+1]=HEAP8[ptr+1];HEAP8[tempDoublePtr+2]=HEAP8[ptr+2];HEAP8[tempDoublePtr+3]=HEAP8[ptr+3]}function copyTempDouble(ptr){HEAP8[tempDoublePtr]=HEAP8[ptr];HEAP8[tempDoublePtr+1]=HEAP8[ptr+1];HEAP8[tempDoublePtr+2]=HEAP8[ptr+2];HEAP8[tempDoublePtr+3]=HEAP8[ptr+3];HEAP8[tempDoublePtr+4]=HEAP8[ptr+4];HEAP8[tempDoublePtr+5]=HEAP8[ptr+5];HEAP8[tempDoublePtr+6]=HEAP8[ptr+6];HEAP8[tempDoublePtr+7]=HEAP8[ptr+7]}function ___setErrNo(value){if(Module["___errno_location"])HEAP32[Module["___errno_location"]()>>2]=value;return value}var ERRNO_CODES={EPERM:1,ENOENT:2,ESRCH:3,EINTR:4,EIO:5,ENXIO:6,E2BIG:7,ENOEXEC:8,EBADF:9,ECHILD:10,EAGAIN:11,EWOULDBLOCK:11,ENOMEM:12,EACCES:13,EFAULT:14,ENOTBLK:15,EBUSY:16,EEXIST:17,EXDEV:18,ENODEV:19,ENOTDIR:20,EISDIR:21,EINVAL:22,ENFILE:23,EMFILE:24,ENOTTY:25,ETXTBSY:26,EFBIG:27,ENOSPC:28,ESPIPE:29,EROFS:30,EMLINK:31,EPIPE:32,EDOM:33,ERANGE:34,ENOMSG:42,EIDRM:43,ECHRNG:44,EL2NSYNC:45,EL3HLT:46,EL3RST:47,ELNRNG:48,EUNATCH:49,ENOCSI:50,EL2HLT:51,EDEADLK:35,ENOLCK:37,EBADE:52,EBADR:53,EXFULL:54,ENOANO:55,EBADRQC:56,EBADSLT:57,EDEADLOCK:35,EBFONT:59,ENOSTR:60,ENODATA:61,ETIME:62,ENOSR:63,ENONET:64,ENOPKG:65,EREMOTE:66,ENOLINK:67,EADV:68,ESRMNT:69,ECOMM:70,EPROTO:71,EMULTIHOP:72,EDOTDOT:73,EBADMSG:74,ENOTUNIQ:76,EBADFD:77,EREMCHG:78,ELIBACC:79,ELIBBAD:80,ELIBSCN:81,ELIBMAX:82,ELIBEXEC:83,ENOSYS:38,ENOTEMPTY:39,ENAMETOOLONG:36,ELOOP:40,EOPNOTSUPP:95,EPFNOSUPPORT:96,ECONNRESET:104,ENOBUFS:105,EAFNOSUPPORT:97,EPROTOTYPE:91,ENOTSOCK:88,ENOPROTOOPT:92,ESHUTDOWN:108,ECONNREFUSED:111,EADDRINUSE:98,ECONNABORTED:103,ENETUNREACH:101,ENETDOWN:100,ETIMEDOUT:110,EHOSTDOWN:112,EHOSTUNREACH:113,EINPROGRESS:115,EALREADY:114,EDESTADDRREQ:89,EMSGSIZE:90,EPROTONOSUPPORT:93,ESOCKTNOSUPPORT:94,EADDRNOTAVAIL:99,ENETRESET:102,EISCONN:106,ENOTCONN:107,ETOOMANYREFS:109,EUSERS:87,EDQUOT:122,ESTALE:116,ENOTSUP:95,ENOMEDIUM:123,EILSEQ:84,EOVERFLOW:75,ECANCELED:125,ENOTRECOVERABLE:131,EOWNERDEAD:130,ESTRPIPE:86};function _sysconf(name){switch(name){case 30:return PAGE_SIZE;case 85:return totalMemory/PAGE_SIZE;case 132:case 133:case 12:case 137:case 138:case 15:case 235:case 16:case 17:case 18:case 19:case 20:case 149:case 13:case 10:case 236:case 153:case 9:case 21:case 22:case 159:case 154:case 14:case 77:case 78:case 139:case 80:case 81:case 82:case 68:case 67:case 164:case 11:case 29:case 47:case 48:case 95:case 52:case 51:case 46:return 200809;case 79:return 0;case 27:case 246:case 127:case 128:case 23:case 24:case 160:case 161:case 181:case 182:case 242:case 183:case 184:case 243:case 244:case 245:case 165:case 178:case 179:case 49:case 50:case 168:case 169:case 175:case 170:case 171:case 172:case 97:case 76:case 32:case 173:case 35:return-1;case 176:case 177:case 7:case 155:case 8:case 157:case 125:case 126:case 92:case 93:case 129:case 130:case 131:case 94:case 91:return 1;case 74:case 60:case 69:case 70:case 4:return 1024;case 31:case 42:case 72:return 32;case 87:case 26:case 33:return 2147483647;case 34:case 1:return 47839;case 38:case 36:return 99;case 43:case 37:return 2048;case 0:return 2097152;case 3:return 65536;case 28:return 32768;case 44:return 32767;case 75:return 16384;case 39:return 1e3;case 89:return 700;case 71:return 256;case 40:return 255;case 2:return 100;case 180:return 64;case 25:return 20;case 5:return 16;case 6:return 6;case 73:return 4;case 84:{if(typeof navigator==="object")return navigator["hardwareConcurrency"]||1;return 1}}___setErrNo(ERRNO_CODES.EINVAL);return-1}Module["_i64Subtract"]=_i64Subtract;Module["_i64Add"]=_i64Add;Module["_bitshift64Ashr"]=_bitshift64Ashr;Module["_memset"]=_memset;function _pthread_cleanup_push(routine,arg){__ATEXIT__.push((function(){Runtime.dynCall("vi",routine,[arg])}));_pthread_cleanup_push.level=__ATEXIT__.length}Module["_bitshift64Lshr"]=_bitshift64Lshr;Module["_bitshift64Shl"]=_bitshift64Shl;function _pthread_cleanup_pop(){assert(_pthread_cleanup_push.level==__ATEXIT__.length,"cannot pop if something else added meanwhile!");__ATEXIT__.pop();_pthread_cleanup_push.level=__ATEXIT__.length}function _abort(){Module["abort"]()}function ___lock(){}function ___unlock(){}var ERRNO_MESSAGES={0:"Success",1:"Not super-user",2:"No such file or directory",3:"No such process",4:"Interrupted system call",5:"I/O error",6:"No such device or address",7:"Arg list too long",8:"Exec format error",9:"Bad file number",10:"No children",11:"No more processes",12:"Not enough core",13:"Permission denied",14:"Bad address",15:"Block device required",16:"Mount device busy",17:"File exists",18:"Cross-device link",19:"No such device",20:"Not a directory",21:"Is a directory",22:"Invalid argument",23:"Too many open files in system",24:"Too many open files",25:"Not a typewriter",26:"Text file busy",27:"File too large",28:"No space left on device",29:"Illegal seek",30:"Read only file system",31:"Too many links",32:"Broken pipe",33:"Math arg out of domain of func",34:"Math result not representable",35:"File locking deadlock error",36:"File or path name too long",37:"No record locks available",38:"Function not implemented",39:"Directory not empty",40:"Too many symbolic links",42:"No message of desired type",43:"Identifier removed",44:"Channel number out of range",45:"Level 2 not synchronized",46:"Level 3 halted",47:"Level 3 reset",48:"Link number out of range",49:"Protocol driver not attached",50:"No CSI structure available",51:"Level 2 halted",52:"Invalid exchange",53:"Invalid request descriptor",54:"Exchange full",55:"No anode",56:"Invalid request code",57:"Invalid slot",59:"Bad font file fmt",60:"Device not a stream",61:"No data (for no delay io)",62:"Timer expired",63:"Out of streams resources",64:"Machine is not on the network",65:"Package not installed",66:"The object is remote",67:"The link has been severed",68:"Advertise error",69:"Srmount error",70:"Communication error on send",71:"Protocol error",72:"Multihop attempted",73:"Cross mount point (not really error)",74:"Trying to read unreadable message",75:"Value too large for defined data type",76:"Given log. name not unique",77:"f.d. invalid for this operation",78:"Remote address changed",79:"Can access a needed shared lib",80:"Accessing a corrupted shared lib",81:".lib section in a.out corrupted",82:"Attempting to link in too many libs",83:"Attempting to exec a shared library",84:"Illegal byte sequence",86:"Streams pipe error",87:"Too many users",88:"Socket operation on non-socket",89:"Destination address required",90:"Message too long",91:"Protocol wrong type for socket",92:"Protocol not available",93:"Unknown protocol",94:"Socket type not supported",95:"Not supported",96:"Protocol family not supported",97:"Address family not supported by protocol family",98:"Address already in use",99:"Address not available",100:"Network interface is not configured",101:"Network is unreachable",102:"Connection reset by network",103:"Connection aborted",104:"Connection reset by peer",105:"No buffer space available",106:"Socket is already connected",107:"Socket is not connected",108:"Can't send after socket shutdown",109:"Too many references",110:"Connection timed out",111:"Connection refused",112:"Host is down",113:"Host is unreachable",114:"Socket already connected",115:"Connection already in progress",116:"Stale file handle",122:"Quota exceeded",123:"No medium (in tape drive)",125:"Operation canceled",130:"Previous owner died",131:"State not recoverable"};var PATH={splitPath:(function(filename){var splitPathRe=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return splitPathRe.exec(filename).slice(1)}),normalizeArray:(function(parts,allowAboveRoot){var up=0;for(var i=parts.length-1;i>=0;i--){var last=parts[i];if(last==="."){parts.splice(i,1)}else if(last===".."){parts.splice(i,1);up++}else if(up){parts.splice(i,1);up--}}if(allowAboveRoot){for(;up--;up){parts.unshift("..")}}return parts}),normalize:(function(path){var isAbsolute=path.charAt(0)==="/",trailingSlash=path.substr(-1)==="/";path=PATH.normalizeArray(path.split("/").filter((function(p){return!!p})),!isAbsolute).join("/");if(!path&&!isAbsolute){path="."}if(path&&trailingSlash){path+="/"}return(isAbsolute?"/":"")+path}),dirname:(function(path){var result=PATH.splitPath(path),root=result[0],dir=result[1];if(!root&&!dir){return"."}if(dir){dir=dir.substr(0,dir.length-1)}return root+dir}),basename:(function(path){if(path==="/")return"/";var lastSlash=path.lastIndexOf("/");if(lastSlash===-1)return path;return path.substr(lastSlash+1)}),extname:(function(path){return PATH.splitPath(path)[3]}),join:(function(){var paths=Array.prototype.slice.call(arguments,0);return PATH.normalize(paths.join("/"))}),join2:(function(l,r){return PATH.normalize(l+"/"+r)}),resolve:(function(){var resolvedPath="",resolvedAbsolute=false;for(var i=arguments.length-1;i>=-1&&!resolvedAbsolute;i--){var path=i>=0?arguments[i]:FS.cwd();if(typeof path!=="string"){throw new TypeError("Arguments to path.resolve must be strings")}else if(!path){return""}resolvedPath=path+"/"+resolvedPath;resolvedAbsolute=path.charAt(0)==="/"}resolvedPath=PATH.normalizeArray(resolvedPath.split("/").filter((function(p){return!!p})),!resolvedAbsolute).join("/");return(resolvedAbsolute?"/":"")+resolvedPath||"."}),relative:(function(from,to){from=PATH.resolve(from).substr(1);to=PATH.resolve(to).substr(1);function trim(arr){var start=0;for(;start=0;end--){if(arr[end]!=="")break}if(start>end)return[];return arr.slice(start,end-start+1)}var fromParts=trim(from.split("/"));var toParts=trim(to.split("/"));var length=Math.min(fromParts.length,toParts.length);var samePartsLength=length;for(var i=0;i0){result=buf.slice(0,bytesRead).toString("utf-8")}else{result=null}}else if(typeof window!="undefined"&&typeof window.prompt=="function"){result=window.prompt("Input: ");if(result!==null){result+="\n"}}else if(typeof readline=="function"){result=readline();if(result!==null){result+="\n"}}if(!result){return null}tty.input=intArrayFromString(result,true)}return tty.input.shift()}),put_char:(function(tty,val){if(val===null||val===10){Module["print"](UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}}),flush:(function(tty){if(tty.output&&tty.output.length>0){Module["print"](UTF8ArrayToString(tty.output,0));tty.output=[]}})},default_tty1_ops:{put_char:(function(tty,val){if(val===null||val===10){Module["printErr"](UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}}),flush:(function(tty){if(tty.output&&tty.output.length>0){Module["printErr"](UTF8ArrayToString(tty.output,0));tty.output=[]}})}};var MEMFS={ops_table:null,mount:(function(mount){return MEMFS.createNode(null,"/",16384|511,0)}),createNode:(function(parent,name,mode,dev){if(FS.isBlkdev(mode)||FS.isFIFO(mode)){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}if(!MEMFS.ops_table){MEMFS.ops_table={dir:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,lookup:MEMFS.node_ops.lookup,mknod:MEMFS.node_ops.mknod,rename:MEMFS.node_ops.rename,unlink:MEMFS.node_ops.unlink,rmdir:MEMFS.node_ops.rmdir,readdir:MEMFS.node_ops.readdir,symlink:MEMFS.node_ops.symlink},stream:{llseek:MEMFS.stream_ops.llseek}},file:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:{llseek:MEMFS.stream_ops.llseek,read:MEMFS.stream_ops.read,write:MEMFS.stream_ops.write,allocate:MEMFS.stream_ops.allocate,mmap:MEMFS.stream_ops.mmap,msync:MEMFS.stream_ops.msync}},link:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,readlink:MEMFS.node_ops.readlink},stream:{}},chrdev:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:FS.chrdev_stream_ops}}}var node=FS.createNode(parent,name,mode,dev);if(FS.isDir(node.mode)){node.node_ops=MEMFS.ops_table.dir.node;node.stream_ops=MEMFS.ops_table.dir.stream;node.contents={}}else if(FS.isFile(node.mode)){node.node_ops=MEMFS.ops_table.file.node;node.stream_ops=MEMFS.ops_table.file.stream;node.usedBytes=0;node.contents=null}else if(FS.isLink(node.mode)){node.node_ops=MEMFS.ops_table.link.node;node.stream_ops=MEMFS.ops_table.link.stream}else if(FS.isChrdev(node.mode)){node.node_ops=MEMFS.ops_table.chrdev.node;node.stream_ops=MEMFS.ops_table.chrdev.stream}node.timestamp=Date.now();if(parent){parent.contents[name]=node}return node}),getFileDataAsRegularArray:(function(node){if(node.contents&&node.contents.subarray){var arr=[];for(var i=0;inode.contents.length){node.contents=MEMFS.getFileDataAsRegularArray(node);node.usedBytes=node.contents.length}if(!node.contents||node.contents.subarray){var prevCapacity=node.contents?node.contents.buffer.byteLength:0;if(prevCapacity>=newCapacity)return;var CAPACITY_DOUBLING_MAX=1024*1024;newCapacity=Math.max(newCapacity,prevCapacity*(prevCapacity0)node.contents.set(oldContents.subarray(0,node.usedBytes),0);return}if(!node.contents&&newCapacity>0)node.contents=[];while(node.contents.lengthnewSize)node.contents.length=newSize;else while(node.contents.length=stream.node.usedBytes)return 0;var size=Math.min(stream.node.usedBytes-position,length);assert(size>=0);if(size>8&&contents.subarray){buffer.set(contents.subarray(position,position+size),offset)}else{for(var i=0;i0||position+lengthe2.timestamp){create.push(key);total++}}));var remove=[];Object.keys(dst.entries).forEach((function(key){var e=dst.entries[key];var e2=src.entries[key];if(!e2){remove.push(key);total++}}));if(!total){return callback(null)}var errored=false;var completed=0;var db=src.type==="remote"?src.db:dst.db;var transaction=db.transaction([IDBFS.DB_STORE_NAME],"readwrite");var store=transaction.objectStore(IDBFS.DB_STORE_NAME);function done(err){if(err){if(!done.errored){done.errored=true;return callback(err)}return}if(++completed>=total){return callback(null)}}transaction.onerror=(function(e){done(this.error);e.preventDefault()});create.sort().forEach((function(path){if(dst.type==="local"){IDBFS.loadRemoteEntry(store,path,(function(err,entry){if(err)return done(err);IDBFS.storeLocalEntry(path,entry,done)}))}else{IDBFS.loadLocalEntry(path,(function(err,entry){if(err)return done(err);IDBFS.storeRemoteEntry(store,path,entry,done)}))}}));remove.sort().reverse().forEach((function(path){if(dst.type==="local"){IDBFS.removeLocalEntry(path,done)}else{IDBFS.removeRemoteEntry(store,path,done)}}))})};var NODEFS={isWindows:false,staticInit:(function(){NODEFS.isWindows=!!process.platform.match(/^win/)}),mount:(function(mount){assert(ENVIRONMENT_IS_NODE);return NODEFS.createNode(null,"/",NODEFS.getMode(mount.opts.root),0)}),createNode:(function(parent,name,mode,dev){if(!FS.isDir(mode)&&!FS.isFile(mode)&&!FS.isLink(mode)){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}var node=FS.createNode(parent,name,mode);node.node_ops=NODEFS.node_ops;node.stream_ops=NODEFS.stream_ops;return node}),getMode:(function(path){var stat;try{stat=fs.lstatSync(path);if(NODEFS.isWindows){stat.mode=stat.mode|(stat.mode&146)>>1}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}return stat.mode}),realPath:(function(node){var parts=[];while(node.parent!==node){parts.push(node.name);node=node.parent}parts.push(node.mount.opts.root);parts.reverse();return PATH.join.apply(null,parts)}),flagsToPermissionStringMap:{0:"r",1:"r+",2:"r+",64:"r",65:"r+",66:"r+",129:"rx+",193:"rx+",514:"w+",577:"w",578:"w+",705:"wx",706:"wx+",1024:"a",1025:"a",1026:"a+",1089:"a",1090:"a+",1153:"ax",1154:"ax+",1217:"ax",1218:"ax+",4096:"rs",4098:"rs+"},flagsToPermissionString:(function(flags){flags&=~32768;if(flags in NODEFS.flagsToPermissionStringMap){return NODEFS.flagsToPermissionStringMap[flags]}else{throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}}),node_ops:{getattr:(function(node){var path=NODEFS.realPath(node);var stat;try{stat=fs.lstatSync(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}if(NODEFS.isWindows&&!stat.blksize){stat.blksize=4096}if(NODEFS.isWindows&&!stat.blocks){stat.blocks=(stat.size+stat.blksize-1)/stat.blksize|0}return{dev:stat.dev,ino:stat.ino,mode:stat.mode,nlink:stat.nlink,uid:stat.uid,gid:stat.gid,rdev:stat.rdev,size:stat.size,atime:stat.atime,mtime:stat.mtime,ctime:stat.ctime,blksize:stat.blksize,blocks:stat.blocks}}),setattr:(function(node,attr){var path=NODEFS.realPath(node);try{if(attr.mode!==undefined){fs.chmodSync(path,attr.mode);node.mode=attr.mode}if(attr.timestamp!==undefined){var date=new Date(attr.timestamp);fs.utimesSync(path,date,date)}if(attr.size!==undefined){fs.truncateSync(path,attr.size)}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),lookup:(function(parent,name){var path=PATH.join2(NODEFS.realPath(parent),name);var mode=NODEFS.getMode(path);return NODEFS.createNode(parent,name,mode)}),mknod:(function(parent,name,mode,dev){var node=NODEFS.createNode(parent,name,mode,dev);var path=NODEFS.realPath(node);try{if(FS.isDir(node.mode)){fs.mkdirSync(path,node.mode)}else{fs.writeFileSync(path,"",{mode:node.mode})}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}return node}),rename:(function(oldNode,newDir,newName){var oldPath=NODEFS.realPath(oldNode);var newPath=PATH.join2(NODEFS.realPath(newDir),newName);try{fs.renameSync(oldPath,newPath)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),unlink:(function(parent,name){var path=PATH.join2(NODEFS.realPath(parent),name);try{fs.unlinkSync(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),rmdir:(function(parent,name){var path=PATH.join2(NODEFS.realPath(parent),name);try{fs.rmdirSync(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),readdir:(function(node){var path=NODEFS.realPath(node);try{return fs.readdirSync(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),symlink:(function(parent,newName,oldPath){var newPath=PATH.join2(NODEFS.realPath(parent),newName);try{fs.symlinkSync(oldPath,newPath)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),readlink:(function(node){var path=NODEFS.realPath(node);try{path=fs.readlinkSync(path);path=NODEJS_PATH.relative(NODEJS_PATH.resolve(node.mount.opts.root),path);return path}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}})},stream_ops:{open:(function(stream){var path=NODEFS.realPath(stream.node);try{if(FS.isFile(stream.node.mode)){stream.nfd=fs.openSync(path,NODEFS.flagsToPermissionString(stream.flags))}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),close:(function(stream){try{if(FS.isFile(stream.node.mode)&&stream.nfd){fs.closeSync(stream.nfd)}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),read:(function(stream,buffer,offset,length,position){if(length===0)return 0;var nbuffer=new Buffer(length);var res;try{res=fs.readSync(stream.nfd,nbuffer,0,length,position)}catch(e){throw new FS.ErrnoError(ERRNO_CODES[e.code])}if(res>0){for(var i=0;i=stream.node.size)return 0;var chunk=stream.node.contents.slice(position,position+length);var ab=WORKERFS.reader.readAsArrayBuffer(chunk);buffer.set(new Uint8Array(ab),offset);return chunk.size}),write:(function(stream,buffer,offset,length,position){throw new FS.ErrnoError(ERRNO_CODES.EIO)}),llseek:(function(stream,offset,whence){var position=offset;if(whence===1){position+=stream.position}else if(whence===2){if(FS.isFile(stream.node.mode)){position+=stream.node.size}}if(position<0){throw new="" fs.errnoerror(errno_codes.einval)}return="" position})}};var="" _stdin="allocate(1,"i32*",ALLOC_STATIC);var" _stdout="allocate(1,"i32*",ALLOC_STATIC);var" _stderr="allocate(1,"i32*",ALLOC_STATIC);var" fs="{root:null,mounts:[],devices:[null],streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:false,ignorePermissions:true,trackingDelegate:{},tracking:{openFlags:{READ:1,WRITE:2}},ErrnoError:null,genericErrors:{},filesystems:null,handleFSError:(function(e){if(!(e" instanceof="" fs.errnoerror))throw="" e+"="" :="" "+stacktrace();return="" ___seterrno(e.errno)}),lookuppath:(function(path,opts){path="PATH.resolve(FS.cwd(),path);opts=opts||{};if(!path)return{path:"",node:null};var" defaults="{follow_mount:true,recurse_count:0};for(var" key="" in="" defaults){if(opts[key]="==undefined){opts[key]=defaults[key]}}if(opts.recurse_count">8){throw new FS.ErrnoError(ERRNO_CODES.ELOOP)}var parts=PATH.normalizeArray(path.split("/").filter((function(p){return!!p})),false);var current=FS.root;var current_path="/";for(var i=0;i40){throw new FS.ErrnoError(ERRNO_CODES.ELOOP)}}}}return{path:current_path,node:current}}),getPath:(function(node){var path;while(true){if(FS.isRoot(node)){var mount=node.mount.mountpoint;if(!path)return mount;return mount[mount.length-1]!=="/"?mount+"/"+path:mount+path}path=path?node.name+"/"+path:node.name;node=node.parent}}),hashName:(function(parentid,name){var hash=0;for(var i=0;i>>0)%FS.nameTable.length}),hashAddNode:(function(node){var hash=FS.hashName(node.parent.id,node.name);node.name_next=FS.nameTable[hash];FS.nameTable[hash]=node}),hashRemoveNode:(function(node){var hash=FS.hashName(node.parent.id,node.name);if(FS.nameTable[hash]===node){FS.nameTable[hash]=node.name_next}else{var current=FS.nameTable[hash];while(current){if(current.name_next===node){current.name_next=node.name_next;break}current=current.name_next}}}),lookupNode:(function(parent,name){var err=FS.mayLookup(parent);if(err){throw new FS.ErrnoError(err,parent)}var hash=FS.hashName(parent.id,name);for(var node=FS.nameTable[hash];node;node=node.name_next){var nodeName=node.name;if(node.parent.id===parent.id&&nodeName===name){return node}}return FS.lookup(parent,name)}),createNode:(function(parent,name,mode,rdev){if(!FS.FSNode){FS.FSNode=(function(parent,name,mode,rdev){if(!parent){parent=this}this.parent=parent;this.mount=parent.mount;this.mounted=null;this.id=FS.nextInode++;this.name=name;this.mode=mode;this.node_ops={};this.stream_ops={};this.rdev=rdev});FS.FSNode.prototype={};var readMode=292|73;var writeMode=146;Object.defineProperties(FS.FSNode.prototype,{read:{get:(function(){return(this.mode&readMode)===readMode}),set:(function(val){val?this.mode|=readMode:this.mode&=~readMode})},write:{get:(function(){return(this.mode&writeMode)===writeMode}),set:(function(val){val?this.mode|=writeMode:this.mode&=~writeMode})},isFolder:{get:(function(){return FS.isDir(this.mode)})},isDevice:{get:(function(){return FS.isChrdev(this.mode)})}})}var node=new FS.FSNode(parent,name,mode,rdev);FS.hashAddNode(node);return node}),destroyNode:(function(node){FS.hashRemoveNode(node)}),isRoot:(function(node){return node===node.parent}),isMountpoint:(function(node){return!!node.mounted}),isFile:(function(mode){return(mode&61440)===32768}),isDir:(function(mode){return(mode&61440)===16384}),isLink:(function(mode){return(mode&61440)===40960}),isChrdev:(function(mode){return(mode&61440)===8192}),isBlkdev:(function(mode){return(mode&61440)===24576}),isFIFO:(function(mode){return(mode&61440)===4096}),isSocket:(function(mode){return(mode&49152)===49152}),flagModes:{"r":0,"rs":1052672,"r+":2,"w":577,"wx":705,"xw":705,"w+":578,"wx+":706,"xw+":706,"a":1089,"ax":1217,"xa":1217,"a+":1090,"ax+":1218,"xa+":1218},modeStringToFlags:(function(str){var flags=FS.flagModes[str];if(typeof flags==="undefined"){throw new Error("Unknown file open mode: "+str)}return flags}),flagsToPermissionString:(function(flag){var perms=["r","w","rw"][flag&3];if(flag&512){perms+="w"}return perms}),nodePermissions:(function(node,perms){if(FS.ignorePermissions){return 0}if(perms.indexOf("r")!==-1&&!(node.mode&292)){return ERRNO_CODES.EACCES}else if(perms.indexOf("w")!==-1&&!(node.mode&146)){return ERRNO_CODES.EACCES}else if(perms.indexOf("x")!==-1&&!(node.mode&73)){return ERRNO_CODES.EACCES}return 0}),mayLookup:(function(dir){var err=FS.nodePermissions(dir,"x");if(err)return err;if(!dir.node_ops.lookup)return ERRNO_CODES.EACCES;return 0}),mayCreate:(function(dir,name){try{var node=FS.lookupNode(dir,name);return ERRNO_CODES.EEXIST}catch(e){}return FS.nodePermissions(dir,"wx")}),mayDelete:(function(dir,name,isdir){var node;try{node=FS.lookupNode(dir,name)}catch(e){return e.errno}var err=FS.nodePermissions(dir,"wx");if(err){return err}if(isdir){if(!FS.isDir(node.mode)){return ERRNO_CODES.ENOTDIR}if(FS.isRoot(node)||FS.getPath(node)===FS.cwd()){return ERRNO_CODES.EBUSY}}else{if(FS.isDir(node.mode)){return ERRNO_CODES.EISDIR}}return 0}),mayOpen:(function(node,flags){if(!node){return ERRNO_CODES.ENOENT}if(FS.isLink(node.mode)){return ERRNO_CODES.ELOOP}else if(FS.isDir(node.mode)){if((flags&2097155)!==0||flags&512){return ERRNO_CODES.EISDIR}}return FS.nodePermissions(node,FS.flagsToPermissionString(flags))}),MAX_OPEN_FDS:4096,nextfd:(function(fd_start,fd_end){fd_start=fd_start||0;fd_end=fd_end||FS.MAX_OPEN_FDS;for(var fd=fd_start;fd<=fd_end;fd++){if(!fs.streams[fd]){return fd}}throw="" new="" fs.errnoerror(errno_codes.emfile)}),getstream:(function(fd){return="" fs.streams[fd]}),createstream:(function(stream,fd_start,fd_end){if(!fs.fsstream){fs.fsstream="(function(){});FS.FSStream.prototype={};Object.defineProperties(FS.FSStream.prototype,{object:{get:(function(){return" this.node}),set:(function(val){this.node="val})},isRead:{get:(function(){return(this.flags&2097155)!==1})},isWrite:{get:(function(){return(this.flags&2097155)!==0})},isAppend:{get:(function(){return" this.flags&1024})}})}var="" newstream="new" fs.fsstream;for(var="" p="" in="" stream){newstream[p]="stream[p]}stream=newStream;var" fd="FS.nextfd(fd_start,fd_end);stream.fd=fd;FS.streams[fd]=stream;return" stream}),closestream:(function(fd){fs.streams[fd]="null}),chrdev_stream_ops:{open:(function(stream){var" device="FS.getDevice(stream.node.rdev);stream.stream_ops=device.stream_ops;if(stream.stream_ops.open){stream.stream_ops.open(stream)}}),llseek:(function(){throw" fs.errnoerror(errno_codes.espipe)})},major:(function(dev){return="" dev="">>8}),minor:(function(dev){return dev&255}),makedev:(function(ma,mi){return ma<<8|mi}),registerdevice:(function(dev,ops){fs.devices[dev]={stream_ops:ops}}),getdevice:(function(dev){return fs.devices[dev]}),getmounts:(function(mount){var="" mounts="[];var" check="[mount];while(check.length){var" m="check.pop();mounts.push(m);check.push.apply(check,m.mounts)}return" mounts}),syncfs:(function(populate,callback){if(typeof="" populate="=="function"){callback=populate;populate=false}var" completed="0;function" done(err){if(err){if(!done.errored){done.errored="true;return" callback(err)}return}if(++completed="">=mounts.length){callback(null)}}mounts.forEach((function(mount){if(!mount.type.syncfs){return done(null)}mount.type.syncfs(mount,populate,done)}))}),mount:(function(type,opts,mountpoint){var root=mountpoint==="/";var pseudo=!mountpoint;var node;if(root&&FS.root){throw new FS.ErrnoError(ERRNO_CODES.EBUSY)}else if(!root&&!pseudo){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});mountpoint=lookup.path;node=lookup.node;if(FS.isMountpoint(node)){throw new FS.ErrnoError(ERRNO_CODES.EBUSY)}if(!FS.isDir(node.mode)){throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR)}}var mount={type:type,opts:opts,mountpoint:mountpoint,mounts:[]};var mountRoot=type.mount(mount);mountRoot.mount=mount;mount.root=mountRoot;if(root){FS.root=mountRoot}else if(node){node.mounted=mount;if(node.mount){node.mount.mounts.push(mount)}}return mountRoot}),unmount:(function(mountpoint){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});if(!FS.isMountpoint(lookup.node)){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}var node=lookup.node;var mount=node.mounted;var mounts=FS.getMounts(mount);Object.keys(FS.nameTable).forEach((function(hash){var current=FS.nameTable[hash];while(current){var next=current.name_next;if(mounts.indexOf(current.mount)!==-1){FS.destroyNode(current)}current=next}}));node.mounted=null;var idx=node.mount.mounts.indexOf(mount);assert(idx!==-1);node.mount.mounts.splice(idx,1)}),lookup:(function(parent,name){return parent.node_ops.lookup(parent,name)}),mknod:(function(path,mode,dev){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);if(!name||name==="."||name===".."){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}var err=FS.mayCreate(parent,name);if(err){throw new FS.ErrnoError(err)}if(!parent.node_ops.mknod){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}return parent.node_ops.mknod(parent,name,mode,dev)}),create:(function(path,mode){mode=mode!==undefined?mode:438;mode&=4095;mode|=32768;return FS.mknod(path,mode,0)}),mkdir:(function(path,mode){mode=mode!==undefined?mode:511;mode&=511|512;mode|=16384;return FS.mknod(path,mode,0)}),mkdev:(function(path,mode,dev){if(typeof dev==="undefined"){dev=mode;mode=438}mode|=8192;return FS.mknod(path,mode,dev)}),symlink:(function(oldpath,newpath){if(!PATH.resolve(oldpath)){throw new FS.ErrnoError(ERRNO_CODES.ENOENT)}var lookup=FS.lookupPath(newpath,{parent:true});var parent=lookup.node;if(!parent){throw new FS.ErrnoError(ERRNO_CODES.ENOENT)}var newname=PATH.basename(newpath);var err=FS.mayCreate(parent,newname);if(err){throw new FS.ErrnoError(err)}if(!parent.node_ops.symlink){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}return parent.node_ops.symlink(parent,newname,oldpath)}),rename:(function(old_path,new_path){var old_dirname=PATH.dirname(old_path);var new_dirname=PATH.dirname(new_path);var old_name=PATH.basename(old_path);var new_name=PATH.basename(new_path);var lookup,old_dir,new_dir;try{lookup=FS.lookupPath(old_path,{parent:true});old_dir=lookup.node;lookup=FS.lookupPath(new_path,{parent:true});new_dir=lookup.node}catch(e){throw new FS.ErrnoError(ERRNO_CODES.EBUSY)}if(!old_dir||!new_dir)throw new FS.ErrnoError(ERRNO_CODES.ENOENT);if(old_dir.mount!==new_dir.mount){throw new FS.ErrnoError(ERRNO_CODES.EXDEV)}var old_node=FS.lookupNode(old_dir,old_name);var relative=PATH.relative(old_path,new_dirname);if(relative.charAt(0)!=="."){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}relative=PATH.relative(new_path,old_dirname);if(relative.charAt(0)!=="."){throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY)}var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(old_node===new_node){return}var isdir=FS.isDir(old_node.mode);var err=FS.mayDelete(old_dir,old_name,isdir);if(err){throw new FS.ErrnoError(err)}err=new_node?FS.mayDelete(new_dir,new_name,isdir):FS.mayCreate(new_dir,new_name);if(err){throw new FS.ErrnoError(err)}if(!old_dir.node_ops.rename){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}if(FS.isMountpoint(old_node)||new_node&&FS.isMountpoint(new_node)){throw new FS.ErrnoError(ERRNO_CODES.EBUSY)}if(new_dir!==old_dir){err=FS.nodePermissions(old_dir,"w");if(err){throw new FS.ErrnoError(err)}}try{if(FS.trackingDelegate["willMovePath"]){FS.trackingDelegate["willMovePath"](old_path,new_path)}}catch(e){console.log("FS.trackingDelegate['willMovePath']('"+old_path+"', '"+new_path+"') threw an exception: "+e.message)}FS.hashRemoveNode(old_node);try{old_dir.node_ops.rename(old_node,new_dir,new_name)}catch(e){throw e}finally{FS.hashAddNode(old_node)}try{if(FS.trackingDelegate["onMovePath"])FS.trackingDelegate["onMovePath"](old_path,new_path)}catch(e){console.log("FS.trackingDelegate['onMovePath']('"+old_path+"', '"+new_path+"') threw an exception: "+e.message)}}),rmdir:(function(path){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);var node=FS.lookupNode(parent,name);var err=FS.mayDelete(parent,name,true);if(err){throw new FS.ErrnoError(err)}if(!parent.node_ops.rmdir){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}if(FS.isMountpoint(node)){throw new FS.ErrnoError(ERRNO_CODES.EBUSY)}try{if(FS.trackingDelegate["willDeletePath"]){FS.trackingDelegate["willDeletePath"](path)}}catch(e){console.log("FS.trackingDelegate['willDeletePath']('"+path+"') threw an exception: "+e.message)}parent.node_ops.rmdir(parent,name);FS.destroyNode(node);try{if(FS.trackingDelegate["onDeletePath"])FS.trackingDelegate["onDeletePath"](path)}catch(e){console.log("FS.trackingDelegate['onDeletePath']('"+path+"') threw an exception: "+e.message)}}),readdir:(function(path){var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;if(!node.node_ops.readdir){throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR)}return node.node_ops.readdir(node)}),unlink:(function(path){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);var node=FS.lookupNode(parent,name);var err=FS.mayDelete(parent,name,false);if(err){if(err===ERRNO_CODES.EISDIR)err=ERRNO_CODES.EPERM;throw new FS.ErrnoError(err)}if(!parent.node_ops.unlink){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}if(FS.isMountpoint(node)){throw new FS.ErrnoError(ERRNO_CODES.EBUSY)}try{if(FS.trackingDelegate["willDeletePath"]){FS.trackingDelegate["willDeletePath"](path)}}catch(e){console.log("FS.trackingDelegate['willDeletePath']('"+path+"') threw an exception: "+e.message)}parent.node_ops.unlink(parent,name);FS.destroyNode(node);try{if(FS.trackingDelegate["onDeletePath"])FS.trackingDelegate["onDeletePath"](path)}catch(e){console.log("FS.trackingDelegate['onDeletePath']('"+path+"') threw an exception: "+e.message)}}),readlink:(function(path){var lookup=FS.lookupPath(path);var link=lookup.node;if(!link){throw new FS.ErrnoError(ERRNO_CODES.ENOENT)}if(!link.node_ops.readlink){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}return PATH.resolve(FS.getPath(link.parent),link.node_ops.readlink(link))}),stat:(function(path,dontFollow){var lookup=FS.lookupPath(path,{follow:!dontFollow});var node=lookup.node;if(!node){throw new FS.ErrnoError(ERRNO_CODES.ENOENT)}if(!node.node_ops.getattr){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}return node.node_ops.getattr(node)}),lstat:(function(path){return FS.stat(path,true)}),chmod:(function(path,mode,dontFollow){var node;if(typeof path==="string"){var lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}node.node_ops.setattr(node,{mode:mode&4095|node.mode&~4095,timestamp:Date.now()})}),lchmod:(function(path,mode){FS.chmod(path,mode,true)}),fchmod:(function(fd,mode){var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(ERRNO_CODES.EBADF)}FS.chmod(stream.node,mode)}),chown:(function(path,uid,gid,dontFollow){var node;if(typeof path==="string"){var lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}node.node_ops.setattr(node,{timestamp:Date.now()})}),lchown:(function(path,uid,gid){FS.chown(path,uid,gid,true)}),fchown:(function(fd,uid,gid){var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(ERRNO_CODES.EBADF)}FS.chown(stream.node,uid,gid)}),truncate:(function(path,len){if(len<0){throw new="" fs.errnoerror(errno_codes.einval)}var="" node;if(typeof="" path="=="string"){var" lookup="FS.lookupPath(path,{follow:true});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw" fs.errnoerror(errno_codes.eperm)}if(fs.isdir(node.mode)){throw="" fs.errnoerror(errno_codes.eisdir)}if(!fs.isfile(node.mode)){throw="" err="FS.nodePermissions(node,"w");if(err){throw" fs.errnoerror(err)}node.node_ops.setattr(node,{size:len,timestamp:date.now()})}),ftruncate:(function(fd,len){var="" stream="FS.getStream(fd);if(!stream){throw" fs.errnoerror(errno_codes.ebadf)}if((stream.flags&2097155)="==0){throw" fs.errnoerror(errno_codes.einval)}fs.truncate(stream.node,len)}),utime:(function(path,atime,mtime){var="" node="lookup.node;node.node_ops.setattr(node,{timestamp:Math.max(atime,mtime)})}),open:(function(path,flags,mode,fd_start,fd_end){if(path===""){throw" fs.errnoerror(errno_codes.enoent)}flags="typeof" flags="=="string"?FS.modeStringToFlags(flags):flags;mode=typeof" mode="=="undefined"?438:mode;if(flags&64){mode=mode&4095|32768}else{mode=0}var" created="false;if(flags&64){if(node){if(flags&128){throw" fs.errnoerror(errno_codes.eexist)}}else{node="FS.mknod(path,mode,0);created=true}}if(!node){throw" fs.errnoerror(errno_codes.enoent)}if(fs.ischrdev(node.mode)){flags&="~512}if(flags&65536&&!FS.isDir(node.mode)){throw" fs.errnoerror(errno_codes.enotdir)}if(!created){var="" fs.errnoerror(err)}}if(flags&512){fs.truncate(node,0)}flags&="~(128|512);var" in="" fs.readfiles)){fs.readfiles[path]="1;Module["printErr"]("read" file:="" "+path)}}try{if(fs.trackingdelegate["onopenfile"]){var="" trackingflags="0;if((flags&2097155)!==1){trackingFlags|=FS.tracking.openFlags.READ}if((flags&2097155)!==0){trackingFlags|=FS.tracking.openFlags.WRITE}FS.trackingDelegate["onOpenFile"](path,trackingFlags)}}catch(e){console.log("FS.trackingDelegate['onOpenFile']('"+path+"'," flags)="" threw="" an="" exception:="" "+e.message)}return="" stream}),close:(function(stream){if(stream.getdents)stream.getdents="null;try{if(stream.stream_ops.close){stream.stream_ops.close(stream)}}catch(e){throw" e}finally{fs.closestream(stream.fd)}}),llseek:(function(stream,offset,whence){if(!stream.seekable||!stream.stream_ops.llseek){throw="" fs.errnoerror(errno_codes.espipe)}stream.position="stream.stream_ops.llseek(stream,offset,whence);stream.ungotten=[];return" stream.position}),read:(function(stream,buffer,offset,length,position){if(length<0||position<0){throw="" fs.errnoerror(errno_codes.einval)}if((stream.flags&2097155)="==1){throw" fs.errnoerror(errno_codes.ebadf)}if(fs.isdir(stream.node.mode)){throw="" fs.errnoerror(errno_codes.eisdir)}if(!stream.stream_ops.read){throw="" seeking="true;if(typeof" position="=="undefined"){position=stream.position;seeking=false}else" if(!stream.seekable){throw="" fs.errnoerror(errno_codes.espipe)}var="" bytesread="stream.stream_ops.read(stream,buffer,offset,length,position);if(!seeking)stream.position+=bytesRead;return" bytesread}),write:(function(stream,buffer,offset,length,position,canown){if(length<0||position<0){throw="" fs.errnoerror(errno_codes.eisdir)}if(!stream.stream_ops.write){throw="" fs.errnoerror(errno_codes.einval)}if(stream.flags&1024){fs.llseek(stream,0,2)}var="" byteswritten="stream.stream_ops.write(stream,buffer,offset,length,position,canOwn);if(!seeking)stream.position+=bytesWritten;try{if(stream.path&&FS.trackingDelegate["onWriteToFile"])FS.trackingDelegate["onWriteToFile"](stream.path)}catch(e){console.log("FS.trackingDelegate['onWriteToFile']('"+path+"')" byteswritten}),allocate:(function(stream,offset,length){if(offset<0||length<="0){throw" fs.errnoerror(errno_codes.ebadf)}if(!fs.isfile(stream.node.mode)&&!fs.isdir(node.mode)){throw="" fs.errnoerror(errno_codes.enodev)}if(!stream.stream_ops.allocate){throw="" fs.errnoerror(errno_codes.eopnotsupp)}stream.stream_ops.allocate(stream,offset,length)}),mmap:(function(stream,buffer,offset,length,position,prot,flags){if((stream.flags&2097155)="==1){throw" fs.errnoerror(errno_codes.eacces)}if(!stream.stream_ops.mmap){throw="" fs.errnoerror(errno_codes.enodev)}return="" stream.stream_ops.mmap(stream,buffer,offset,length,position,prot,flags)}),msync:(function(stream,buffer,offset,length,mmapflags){if(!stream||!stream.stream_ops.msync){return="" 0}return="" stream.stream_ops.msync(stream,buffer,offset,length,mmapflags)}),munmap:(function(stream){return="" 0}),ioctl:(function(stream,cmd,arg){if(!stream.stream_ops.ioctl){throw="" fs.errnoerror(errno_codes.enotty)}return="" stream.stream_ops.ioctl(stream,cmd,arg)}),readfile:(function(path,opts){opts="opts||{};opts.flags=opts.flags||"r";opts.encoding=opts.encoding||"binary";if(opts.encoding!=="utf8"&&opts.encoding!=="binary"){throw" error('invalid="" encoding="" type="" "'+opts.encoding+'"')}var="" ret;var="" stat="FS.stat(path);var" length="stat.size;var" buf="new" uint8array(length);fs.read(stream,buf,0,length,0);if(opts.encoding="=="utf8"){ret=UTF8ArrayToString(buf,0)}else" if(opts.encoding="=="binary"){ret=buf}FS.close(stream);return" ret}),writefile:(function(path,data,opts){opts="opts||{};opts.flags=opts.flags||"w";opts.encoding=opts.encoding||"utf8";if(opts.encoding!=="utf8"&&opts.encoding!=="binary"){throw" uint8array(lengthbytesutf8(data)+1);var="" actualnumbytes="stringToUTF8Array(data,buf,0,buf.length);FS.write(stream,buf,0,actualNumBytes,0,opts.canOwn)}else" fs.currentpath}),chdir:(function(path){var="" fs.errnoerror(errno_codes.enotdir)}var="" fs.errnoerror(err)}fs.currentpath="lookup.path}),createDefaultDirectories:(function(){FS.mkdir("/tmp");FS.mkdir("/home");FS.mkdir("/home/web_user")}),createDefaultDevices:(function(){FS.mkdir("/dev");FS.registerDevice(FS.makedev(1,3),{read:(function(){return" 0}),write:(function(stream,buffer,offset,length,pos){return="" length})});fs.mkdev("="" dev="" null",fs.makedev(1,3));tty.register(fs.makedev(5,0),tty.default_tty_ops);tty.register(fs.makedev(6,0),tty.default_tty1_ops);fs.mkdev("="" tty",fs.makedev(5,0));fs.mkdev("="" tty1",fs.makedev(6,0));var="" random_device;if(typeof="" crypto!="="undefined"){var" randombuffer="new" uint8array(1);random_device="(function(){crypto.getRandomValues(randomBuffer);return" randombuffer[0]})}else="" if(environment_is_node){random_device="(function(){return" require("crypto").randombytes(1)[0]})}else{random_device="(function(){return" math.random()*256|0})}fs.createdevice("="" dev","random",random_device);fs.createdevice("="" dev","urandom",random_device);fs.mkdir("="" shm");fs.mkdir("="" shm="" tmp")}),createspecialdirectories:(function(){fs.mkdir("="" proc");fs.mkdir("="" proc="" self");fs.mkdir("="" self="" fd");fs.mount({mount:(function(){var="" fd="+name;var" fs.errnoerror(errno_codes.ebadf);var="" ret="{parent:null,mount:{mountpoint:"fake"},node_ops:{readlink:(function(){return" stream.path})}};ret.parent="ret;return" ret})};return="" node})},{},"="" fd")}),createstandardstreams:(function(){if(module["stdin"]){fs.createdevice("="" dev","stdin",module["stdin"])}else{fs.symlink("="" tty","="" stdin")}if(module["stdout"]){fs.createdevice("="" dev","stdout",null,module["stdout"])}else{fs.symlink("="" stdout")}if(module["stderr"]){fs.createdevice("="" dev","stderr",null,module["stderr"])}else{fs.symlink("="" tty1","="" stderr")}var="" stdin="FS.open("/dev/stdin","r");assert(stdin.fd===0,"invalid" handle="" for="" ("+stdin.fd+")");var="" stdout="FS.open("/dev/stdout","w");assert(stdout.fd===1,"invalid" ("+stdout.fd+")");var="" stderr="FS.open("/dev/stderr","w");assert(stderr.fd===2,"invalid" ("+stderr.fd+")")}),ensureerrnoerror:(function(){if(fs.errnoerror)return;fs.errnoerror="function" errnoerror(errno,node){this.node="node;this.setErrno=(function(errno){this.errno=errno;for(var" key="" errno_codes){if(errno_codes[key]="==errno){this.code=key;break}}});this.setErrno(errno);this.message=ERRNO_MESSAGES[errno]};FS.ErrnoError.prototype=new" error;fs.errnoerror.prototype.constructor="FS.ErrnoError;[ERRNO_CODES.ENOENT].forEach((function(code){FS.genericErrors[code]=new" fs.errnoerror(code);fs.genericerrors[code].stack="<generic error, no stack>" }))}),staticinit:(function(){fs.ensureerrnoerror();fs.nametable="new" array(4096);fs.mount(memfs,{},"="" ");fs.createdefaultdirectories();fs.createdefaultdevices();fs.createspecialdirectories();fs.filesystems="{"MEMFS":MEMFS,"IDBFS":IDBFS,"NODEFS":NODEFS,"WORKERFS":WORKERFS}}),init:(function(input,output,error){assert(!FS.init.initialized,"FS.init" was="" previously="" called.="" if="" you="" want="" to="" initialize="" later="" with="" custom="" parameters,="" remove="" any="" earlier="" calls="" (note="" that="" one="" is="" automatically="" added="" the="" generated="" code)");fs.init.initialized="true;FS.ensureErrnoError();Module["stdin"]=input||Module["stdin"];Module["stdout"]=output||Module["stdout"];Module["stderr"]=error||Module["stderr"];FS.createStandardStreams()}),quit:(function(){FS.init.initialized=false;var" fflush="Module["_fflush"];if(fflush)fflush(0);for(var" i="0;i<FS.streams.length;i++){var" mode}),joinpath:(function(parts,forcerelative){var="" path}),absolutepath:(function(relative,base){return="" path.resolve(base,relative)}),standardizepath:(function(path){return="" path.normalize(path)}),findobject:(function(path,dontresolvelastlink){var="" ret.object}else{___seterrno(ret.error);return="" null}}),analyzepath:(function(path,dontresolvelastlink){try{var="" ret}),createfolder:(function(parent,name,canread,canwrite){var="" parent="=="string"?parent:FS.getPath(parent),name);var" fs.mkdir(path,mode)}),createpath:(function(parent,path,canread,canwrite){parent="typeof" parts="path.split("/").reverse();while(parts.length){var" part="parts.pop();if(!part)continue;var" current="PATH.join2(parent,part);try{FS.mkdir(current)}catch(e){}parent=current}return" current}),createfile:(function(parent,name,properties,canread,canwrite){var="" fs.create(path,mode)}),createdatafile:(function(parent,name,data,canread,canwrite,canown){var="" data="=="string"){var" arr="new" array(data.length);for(var="" node}),createdevice:(function(parent,name,input,output){var="" result;try{result="input()}catch(e){throw" fs.errnoerror(errno_codes.eio)}if(result="==undefined&&bytesRead===0){throw" fs.errnoerror(errno_codes.eagain)}if(result="==null||result===undefined)break;bytesRead++;buffer[offset+i]=result}if(bytesRead){stream.node.timestamp=Date.now()}return" bytesread}),write:(function(stream,buffer,offset,length,pos){for(var="" fs.errnoerror(errno_codes.eio)}}if(length){stream.node.timestamp="Date.now()}return" i})});return="" fs.mkdev(path,mode,dev)}),createlink:(function(parent,name,target,canread,canwrite){var="" fs.symlink(target,path)}),forceloadfile:(function(obj){if(obj.isdevice||obj.isfolder||obj.link||obj.contents)return="" true;var="" success="true;if(typeof" xmlhttprequest!="="undefined"){throw" error("lazy="" loading="" should="" have="" been="" performed="" (contents="" set)="" createlazyfile,="" but="" it="" not.="" lazy="" only="" works="" web="" workers.="" use="" --embed-file="" or="" --preload-file="" emcc="" on="" main="" thread.")}else="" if(module["read"]){try{obj.contents="intArrayFromString(Module["read"](obj.url),true);obj.usedBytes=obj.contents.length}catch(e){success=false}}else{throw" error("cannot="" load="" without="" read()="" xmlhttprequest.")}if(!success)___seterrno(errno_codes.eio);return="" success}),createlazyfile:(function(parent,name,url,canread,canwrite){function="" lazyuint8array(){this.lengthknown="false;this.chunks=[]}LazyUint8Array.prototype.get=function" lazyuint8array_get(idx){if(idx="">this.length-1||idx<0){return undefined}var="" chunkoffset="idx%this.chunkSize;var" chunknum="idx/this.chunkSize|0;return" this.getter(chunknum)[chunkoffset]};lazyuint8array.prototype.setdatagetter="function" lazyuint8array_setdatagetter(getter){this.getter="getter};LazyUint8Array.prototype.cacheLength=function" lazyuint8array_cachelength(){var="" xhr="new" xmlhttprequest;xhr.open("head",url,false);xhr.send(null);if(!(xhr.status="">=200&&xhr.status<300||xhr.status===304))throw new="" error("couldn't="" load="" "+url+".="" status:="" "+xhr.status);var="" datalength="Number(xhr.getResponseHeader("Content-length"));var" header;var="" hasbyteserving="(header=xhr.getResponseHeader("Accept-Ranges"))&&header==="bytes";var" chunksize="1024*1024;if(!hasByteServing)chunkSize=datalength;var" doxhr="(function(from,to){if(from">to)throw new Error("invalid range ("+from+", "+to+") or no bytes requested!");if(to>datalength-1)throw new Error("only "+datalength+" bytes available! programmer error!");var xhr=new XMLHttpRequest;xhr.open("GET",url,false);if(datalength!==chunkSize)xhr.setRequestHeader("Range","bytes="+from+"-"+to);if(typeof Uint8Array!="undefined")xhr.responseType="arraybuffer";if(xhr.overrideMimeType){xhr.overrideMimeType("text/plain; charset=x-user-defined")}xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new="" error("couldn't="" load="" "+url+".="" status:="" "+xhr.status);if(xhr.response!="=undefined){return" uint8array(xhr.response||[])}else{return="" intarrayfromstring(xhr.responsetext||"",true)}});var="" lazyarray="this;lazyArray.setDataGetter((function(chunkNum){var" start="chunkNum*chunkSize;var" end="(chunkNum+1)*chunkSize-1;end=Math.min(end,datalength-1);if(typeof" lazyarray.chunks[chunknum]="=="undefined"){lazyArray.chunks[chunkNum]=doXHR(start,end)}if(typeof" error("doxhr="" failed!");return="" lazyarray.chunks[chunknum]}));this._length="datalength;this._chunkSize=chunkSize;this.lengthKnown=true};if(typeof" xmlhttprequest!="="undefined"){if(!ENVIRONMENT_IS_WORKER)throw"Cannot" do="" synchronous="" binary="" xhrs="" outside="" webworkers="" in="" modern="" browsers.="" use="" --embed-file="" or="" --preload-file="" emcc";var="" lazyuint8array;object.defineproperty(lazyarray,"length",{get:(function(){if(!this.lengthknown){this.cachelength()}return="" this._length})});object.defineproperty(lazyarray,"chunksize",{get:(function(){if(!this.lengthknown){this.cachelength()}return="" this._chunksize})});var="" properties="{isDevice:false,contents:lazyArray}}else{var" node="FS.createFile(parent,name,properties,canRead,canWrite);if(properties.contents){node.contents=properties.contents}else" if(properties.url){node.contents="null;node.url=properties.url}Object.defineProperty(node,"usedBytes",{get:(function(){return" this.contents.length})});var="" stream_ops="{};var" keys="Object.keys(node.stream_ops);keys.forEach((function(key){var" fn="node.stream_ops[key];stream_ops[key]=function" forceloadlazyfile(){if(!fs.forceloadfile(node)){throw="" fs.errnoerror(errno_codes.eio)}return="" fn.apply(null,arguments)}}));stream_ops.read="function" stream_ops_read(stream,buffer,offset,length,position){if(!fs.forceloadfile(node)){throw="" fs.errnoerror(errno_codes.eio)}var="" contents="stream.node.contents;if(position">=contents.length)return 0;var size=Math.min(contents.length-position,length);assert(size>=0);if(contents.slice){for(var i=0;i>2]=stat.dev;HEAP32[buf+4>>2]=0;HEAP32[buf+8>>2]=stat.ino;HEAP32[buf+12>>2]=stat.mode;HEAP32[buf+16>>2]=stat.nlink;HEAP32[buf+20>>2]=stat.uid;HEAP32[buf+24>>2]=stat.gid;HEAP32[buf+28>>2]=stat.rdev;HEAP32[buf+32>>2]=0;HEAP32[buf+36>>2]=stat.size;HEAP32[buf+40>>2]=4096;HEAP32[buf+44>>2]=stat.blocks;HEAP32[buf+48>>2]=stat.atime.getTime()/1e3|0;HEAP32[buf+52>>2]=0;HEAP32[buf+56>>2]=stat.mtime.getTime()/1e3|0;HEAP32[buf+60>>2]=0;HEAP32[buf+64>>2]=stat.ctime.getTime()/1e3|0;HEAP32[buf+68>>2]=0;HEAP32[buf+72>>2]=stat.ino;return 0}),doMsync:(function(addr,stream,len,flags){var buffer=new Uint8Array(HEAPU8.subarray(addr,addr+len));FS.msync(stream,buffer,0,len,flags)}),doMkdir:(function(path,mode){path=PATH.normalize(path);if(path[path.length-1]==="/")path=path.substr(0,path.length-1);FS.mkdir(path,mode,0);return 0}),doMknod:(function(path,mode,dev){switch(mode&61440){case 32768:case 8192:case 24576:case 4096:case 49152:break;default:return-ERRNO_CODES.EINVAL}FS.mknod(path,mode,dev);return 0}),doReadlink:(function(path,buf,bufsize){if(bufsize<=0)return-errno_codes.einval;var ret="FS.readlink(path);ret=ret.slice(0,Math.max(0,bufsize));writeStringToMemory(ret,buf,true);return" ret.length}),doaccess:(function(path,amode){if(amode&~7){return-errno_codes.einval}var="" node;var="" lookup="FS.lookupPath(path,{follow:true});node=lookup.node;var" perms="" ;if(amode&4)perms+="r" ;if(amode&2)perms+="w" ;if(amode&1)perms+="x" ;if(perms&&fs.nodepermissions(node,perms)){return-errno_codes.eacces}return="" 0}),dodup:(function(path,flags,suggestfd){var="" suggest="FS.getStream(suggestFD);if(suggest)FS.close(suggest);return" fs.open(path,flags,0,suggestfd,suggestfd).fd}),doreadv:(function(stream,iov,iovcnt,offset){var="" i="0;i<iovcnt;i++){var" ptr="HEAP32[iov+i*8">>2];var len=HEAP32[iov+(i*8+4)>>2];var curr=FS.read(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(curr>2];var len=HEAP32[iov+(i*8+4)>>2];var curr=FS.write(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr}return ret}),varargs:0,get:(function(varargs){syscalls.varargs+="4;var" ret="HEAP32[SYSCALLS.varargs-4">>2];return ret}),getStr:(function(){var ret=Pointer_stringify(SYSCALLS.get());return ret}),getStreamFromFD:(function(){var stream=FS.getStream(SYSCALLS.get());if(!stream)throw new FS.ErrnoError(ERRNO_CODES.EBADF);return stream}),getSocketFromFD:(function(){var socket=SOCKFS.getSocket(SYSCALLS.get());if(!socket)throw new FS.ErrnoError(ERRNO_CODES.EBADF);return socket}),getSocketAddress:(function(allowNull){var addrp=SYSCALLS.get(),addrlen=SYSCALLS.get();if(allowNull&&addrp===0)return null;var info=__read_sockaddr(addrp,addrlen);if(info.errno)throw new FS.ErrnoError(info.errno);info.addr=DNS.lookup_addr(info.addr)||info.addr;return info}),get64:(function(){var low=SYSCALLS.get(),high=SYSCALLS.get();if(low>=0)assert(high===0);else assert(high===-1);return low}),getZero:(function(){assert(SYSCALLS.get()===0)})};function ___syscall6(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD();FS.close(stream);return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}var _emscripten_asm_const=true;function ___assert_fail(condition,filename,line,func){ABORT=true;throw"Assertion failed: "+Pointer_stringify(condition)+", at: "+[filename?Pointer_stringify(filename):"unknown filename",line,func?Pointer_stringify(func):"unknown function"]+" at "+stackTrace()}function _sbrk(bytes){var self=_sbrk;if(!self.called){DYNAMICTOP=alignMemoryPage(DYNAMICTOP);self.called=true;assert(Runtime.dynamicAlloc);self.alloc=Runtime.dynamicAlloc;Runtime.dynamicAlloc=(function(){abort("cannot dynamically allocate, sbrk now has control")})}var ret=DYNAMICTOP;if(bytes!=0){var success=self.alloc(bytes);if(!success)return-1>>>0}return ret}function _emscripten_memcpy_big(dest,src,num){HEAPU8.set(HEAPU8.subarray(src,src+num),dest);return dest}Module["_memcpy"]=_memcpy;Module["_memmove"]=_memmove;var _emscripten_asm_const_int=true;function _time(ptr){var ret=Date.now()/1e3|0;if(ptr){HEAP32[ptr>>2]=ret}return ret}function _pthread_self(){return 0}function ___syscall140(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),offset_high=SYSCALLS.get(),offset_low=SYSCALLS.get(),result=SYSCALLS.get(),whence=SYSCALLS.get();var offset=offset_low;assert(offset_high===0);FS.llseek(stream,offset,whence);HEAP32[result>>2]=stream.position;if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall146(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),iov=SYSCALLS.get(),iovcnt=SYSCALLS.get();return SYSCALLS.doWritev(stream,iov,iovcnt)}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall54(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),op=SYSCALLS.get();switch(op){case 21505:{if(!stream.tty)return-ERRNO_CODES.ENOTTY;return 0};case 21506:{if(!stream.tty)return-ERRNO_CODES.ENOTTY;return 0};case 21519:{if(!stream.tty)return-ERRNO_CODES.ENOTTY;var argp=SYSCALLS.get();HEAP32[argp>>2]=0;return 0};case 21520:{if(!stream.tty)return-ERRNO_CODES.ENOTTY;return-ERRNO_CODES.EINVAL};case 21531:{var argp=SYSCALLS.get();return FS.ioctl(stream,op,argp)};default:abort("bad ioctl syscall "+op)}}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}FS.staticInit();__ATINIT__.unshift((function(){if(!Module["noFSInit"]&&!FS.init.initialized)FS.init()}));__ATMAIN__.push((function(){FS.ignorePermissions=false}));__ATEXIT__.push((function(){FS.quit()}));Module["FS_createFolder"]=FS.createFolder;Module["FS_createPath"]=FS.createPath;Module["FS_createDataFile"]=FS.createDataFile;Module["FS_createPreloadedFile"]=FS.createPreloadedFile;Module["FS_createLazyFile"]=FS.createLazyFile;Module["FS_createLink"]=FS.createLink;Module["FS_createDevice"]=FS.createDevice;Module["FS_unlink"]=FS.unlink;__ATINIT__.unshift((function(){TTY.init()}));__ATEXIT__.push((function(){TTY.shutdown()}));if(ENVIRONMENT_IS_NODE){var fs=require("fs");var NODEJS_PATH=require("path");NODEFS.staticInit()}STACK_BASE=STACKTOP=Runtime.alignMemory(STATICTOP);staticSealed=true;STACK_MAX=STACK_BASE+TOTAL_STACK;DYNAMIC_BASE=DYNAMICTOP=Runtime.alignMemory(STACK_MAX);assert(DYNAMIC_BASE>0]|0;M=Hd(d[e+1>>0]|0|0,0,8)|0;J=C;r=Hd(d[e+2>>0]|0|0,0,16)|0;J=J|C;s=Hd(d[e+3>>0]|0|0,0,24)|0;J=J|C;I=a[e+6>>0]|0;L=d[e+4>>0]|0;p=Hd(d[e+5>>0]|0|0,0,8)|0;K=C;I=Hd(I&255|0,0,16)|0;K=Hd(p|L|I|0,K|C|0,6)|0;I=C;L=a[e+9>>0]|0;p=d[e+7>>0]|0;f=Hd(d[e+8>>0]|0|0,0,8)|0;w=C;L=Hd(L&255|0,0,16)|0;w=Hd(f|p|L|0,w|C|0,5)|0;L=C;p=a[e+12>>0]|0;f=d[e+10>>0]|0;y=Hd(d[e+11>>0]|0|0,0,8)|0;n=C;p=Hd(p&255|0,0,16)|0;n=Hd(y|f|p|0,n|C|0,3)|0;p=C;f=a[e+15>>0]|0;y=d[e+13>>0]|0;F=Hd(d[e+14>>0]|0|0,0,8)|0;A=C;f=Hd(f&255|0,0,16)|0;A=Hd(F|y|f|0,A|C|0,2)|0;f=C;y=d[e+16>>0]|0;F=Hd(d[e+17>>0]|0|0,0,8)|0;u=C;h=Hd(d[e+18>>0]|0|0,0,16)|0;u=u|C;t=Hd(d[e+19>>0]|0|0,0,24)|0;t=F|y|h|t;u=u|C;h=a[e+22>>0]|0;y=d[e+20>>0]|0;F=Hd(d[e+21>>0]|0|0,0,8)|0;E=C;h=Hd(h&255|0,0,16)|0;E=Hd(F|y|h|0,E|C|0,7)|0;h=C;y=a[e+25>>0]|0;F=d[e+23>>0]|0;N=Hd(d[e+24>>0]|0|0,0,8)|0;x=C;y=Hd(y&255|0,0,16)|0;x=Hd(N|F|y|0,x|C|0,5)|0;y=C;F=a[e+28>>0]|0;N=d[e+26>>0]|0;g=Hd(d[e+27>>0]|0|0,0,8)|0;G=C;F=Hd(F&255|0,0,16)|0;G=Hd(g|N|F|0,G|C|0,4)|0;F=C;N=e+31|0;g=a[N>>0]|0;D=d[e+29>>0]|0;v=Hd(d[e+30>>0]|0|0,0,8)|0;B=C;g=Hd(g&255|0,0,16)|0;B=Hd(v|D|g|0,B|C|0,2)|0;B=B&33554428;g=Dd(B|0,0,16777216,0)|0;g=Gd(g|0,C|0,25)|0;D=C;v=Cd(0,0,g|0,D|0)|0;J=Dd(v&19|0,0,M|T|r|s|0,J|0)|0;s=C;D=Hd(g|0,D|0,25)|0;g=C;r=Dd(K|0,I|0,16777216,0)|0;r=Gd(r|0,C|0,25)|0;T=C;L=Dd(w|0,L|0,r|0,T|0)|0;w=C;T=Hd(r|0,T|0,25)|0;T=Cd(K|0,I|0,T|0,C|0)|0;I=C;K=Dd(n|0,p|0,16777216,0)|0;K=Gd(K|0,C|0,25)|0;r=C;f=Dd(A|0,f|0,K|0,r|0)|0;A=C;r=Hd(K|0,r|0,25)|0;K=C;M=Dd(t|0,u|0,16777216,0)|0;M=Gd(M|0,C|0,25)|0;v=C;h=Dd(E|0,h|0,M|0,v|0)|0;E=C;v=Hd(M|0,v|0,25)|0;M=C;e=Dd(x|0,y|0,16777216,0)|0;e=Gd(e|0,C|0,25)|0;z=C;F=Dd(G|0,F|0,e|0,z|0)|0;G=C;z=Hd(e|0,z|0,25)|0;e=C;S=Dd(J|0,s|0,33554432,0)|0;S=Ed(S|0,C|0,26)|0;H=C;I=Dd(T|0,I|0,S|0,H|0)|0;H=Hd(S|0,H|0,26)|0;H=Cd(J|0,s|0,H|0,C|0)|0;s=Dd(L|0,w|0,33554432,0)|0;s=Ed(s|0,C|0,26)|0;J=C;p=Dd(s|0,J|0,n|0,p|0)|0;K=Cd(p|0,C|0,r|0,K|0)|0;J=Hd(s|0,J|0,26)|0;J=Cd(L|0,w|0,J|0,C|0)|0;w=Dd(f|0,A|0,33554432,0)|0;w=Ed(w|0,C|0,26)|0;L=C;u=Dd(w|0,L|0,t|0,u|0)|0;M=Cd(u|0,C|0,v|0,M|0)|0;L=Hd(w|0,L|0,26)|0;L=Cd(f|0,A|0,L|0,C|0)|0;A=Dd(h|0,E|0,33554432,0)|0;A=Ed(A|0,C|0,26)|0;f=C;y=Dd(A|0,f|0,x|0,y|0)|0;e=Cd(y|0,C|0,z|0,e|0)|0;f=Hd(A|0,f|0,26)|0;f=Cd(h|0,E|0,f|0,C|0)|0;E=Dd(F|0,G|0,33554432,0)|0;E=Ed(E|0,C|0,26)|0;h=C;B=Dd(B|0,0,E|0,h|0)|0;g=Cd(B|0,C|0,D|0,g|0)|0;h=Hd(E|0,h|0,26)|0;h=Cd(F|0,G|0,h|0,C|0)|0;c[O>>2]=H;c[b+44>>2]=I;c[b+48>>2]=J;c[b+52>>2]=K;c[b+56>>2]=L;c[b+60>>2]=M;c[b+64>>2]=f;c[b+68>>2]=e;c[b+72>>2]=h;c[b+76>>2]=g;g=b+80|0;c[g>>2]=1;h=b+84|0;e=h;f=e+36|0;do{c[e>>2]=0;e=e+4|0}while((e|0)<(f|0));kc(q,o);jc(l,q,1064);f=q+4|0;n=q+8|0;p=q+12|0;r=q+16|0;s=q+20|0;v=q+24|0;x=q+28|0;z=q+32|0;b=q+36|0;g=c[g>>2]|0;t=c[h>>2]|0;w=c[b+88>>2]|0;A=c[b+92>>2]|0;E=c[b+96>>2]|0;G=c[b+100>>2]|0;I=c[b+104>>2]|0;K=c[b+108>>2]|0;M=c[b+112>>2]|0;T=c[b+116>>2]|0;e=(c[f>>2]|0)-t|0;S=(c[n>>2]|0)-w|0;L=(c[p>>2]|0)-A|0;J=(c[r>>2]|0)-E|0;H=(c[s>>2]|0)-G|0;F=(c[v>>2]|0)-I|0;D=(c[x>>2]|0)-K|0;y=(c[z>>2]|0)-M|0;u=(c[B>>2]|0)-T|0;c[q>>2]=(c[q>>2]|0)-g;c[f>>2]=e;c[n>>2]=S;c[p>>2]=L;c[r>>2]=J;c[s>>2]=H;c[v>>2]=F;c[x>>2]=D;c[z>>2]=y;c[B>>2]=u;u=l+4|0;y=l+8|0;D=l+12|0;F=l+16|0;H=l+20|0;J=l+24|0;L=l+28|0;S=l+32|0;e=l+36|0;t=t+(c[u>>2]|0)|0;w=w+(c[y>>2]|0)|0;A=A+(c[D>>2]|0)|0;E=E+(c[F>>2]|0)|0;G=G+(c[H>>2]|0)|0;I=I+(c[J>>2]|0)|0;K=K+(c[L>>2]|0)|0;M=M+(c[S>>2]|0)|0;T=T+(c[e>>2]|0)|0;c[l>>2]=g+(c[l>>2]|0);c[u>>2]=t;c[y>>2]=w;c[D>>2]=A;c[F>>2]=E;c[H>>2]=G;c[J>>2]=I;c[L>>2]=K;c[S>>2]=M;c[e>>2]=T;Kc(m,l);Jc(m,m,l);Kc(b,m);Jc(b,b,l);Jc(b,b,q);Kc(Q,b);Kc(k,Q);Kc(k,k);Jc(k,b,k);Jc(Q,Q,k);Kc(Q,Q);Jc(Q,k,Q);Kc(k,Q);Kc(k,k);Kc(k,k);Kc(k,k);Kc(k,k);Jc(Q,k,Q);Kc(k,Q);Kc(k,k);Kc(k,k);Kc(k,k);Kc(k,k);Kc(k,k);Kc(k,k);Kc(k,k);Kc(k,k);Kc(k,k);Jc(k,k,Q);Kc(j,k);Kc(j,j);Kc(j,j);Kc(j,j);Kc(j,j);Kc(j,j);Kc(j,j);Kc(j,j);Kc(j,j);Kc(j,j);Kc(j,j);Kc(j,j);Kc(j,j);Kc(j,j);Kc(j,j);Kc(j,j);Kc(j,j);Kc(j,j);Kc(j,j);Kc(j,j);Jc(k,j,k);Kc(k,k);Kc(k,k);Kc(k,k);Kc(k,k);Kc(k,k);Kc(k,k);Kc(k,k);Kc(k,k);Kc(k,k);Kc(k,k);Jc(Q,k,Q);Kc(k,Q);e=1;do{Kc(k,k);e=e+1|0}while((e|0)!=50);Jc(k,k,Q);Kc(j,k);e=1;do{Kc(j,j);e=e+1|0}while((e|0)!=100);Jc(k,j,k);Kc(k,k);e=1;do{Kc(k,k);e=e+1|0}while((e|0)!=50);Jc(Q,k,Q);Kc(Q,Q);Kc(Q,Q);Jc(b,Q,b);Jc(b,b,m);Jc(b,b,q);Kc(o,b);Jc(o,o,l);E=c[o>>2]|0;F=c[o+4>>2]|0;G=c[o+8>>2]|0;H=c[o+12>>2]|0;I=c[o+16>>2]|0;J=c[o+20>>2]|0;K=c[o+24>>2]|0;L=c[o+28>>2]|0;M=c[o+32>>2]|0;D=c[o+36>>2]|0;A=c[q>>2]|0;y=c[f>>2]|0;w=c[n>>2]|0;u=c[p>>2]|0;t=c[r>>2]|0;s=c[s>>2]|0;r=c[v>>2]|0;q=c[x>>2]|0;p=c[z>>2]|0;e=c[B>>2]|0;c[P>>2]=E-A;f=P+4|0;c[f>>2]=F-y;g=P+8|0;c[g>>2]=G-w;h=P+12|0;c[h>>2]=H-u;j=P+16|0;c[j>>2]=I-t;k=P+20|0;c[k>>2]=J-s;l=P+24|0;c[l>>2]=K-r;m=P+28|0;c[m>>2]=L-q;n=P+32|0;c[n>>2]=M-p;o=P+36|0;c[o>>2]=D-e;Lc(Q,P);do if(Yc(Q,33004)|0){c[P>>2]=A+E;c[f>>2]=y+F;c[g>>2]=w+G;c[h>>2]=u+H;c[j>>2]=t+I;c[k>>2]=s+J;c[l>>2]=r+K;c[m>>2]=q+L;c[n>>2]=p+M;c[o>>2]=e+D;Lc(Q,P);if(!(Yc(Q,33004)|0)){Jc(b,b,1104);break}else{T=-1;i=R;return T|0}}while(0);Lc(Q,b);if(((d[Q>>0]|0)&1|0)==((d[N>>0]|0)>>>7|0)){A=b+4|0;D=b+8|0;F=b+12|0;H=b+16|0;J=b+20|0;L=b+24|0;N=b+28|0;Q=b+32|0;T=b+36|0;z=0-(c[A>>2]|0)|0;B=0-(c[D>>2]|0)|0;E=0-(c[F>>2]|0)|0;G=0-(c[H>>2]|0)|0;I=0-(c[J>>2]|0)|0;K=0-(c[L>>2]|0)|0;M=0-(c[N>>2]|0)|0;P=0-(c[Q>>2]|0)|0;S=0-(c[T>>2]|0)|0;c[b>>2]=0-(c[b>>2]|0);c[A>>2]=z;c[D>>2]=B;c[F>>2]=E;c[H>>2]=G;c[J>>2]=I;c[L>>2]=K;c[N>>2]=M;c[Q>>2]=P;c[T>>2]=S}Jc(b+120|0,b,O);T=0;i=R;return T|0}function Oc(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0;V=b+40|0;j=b+44|0;m=b+48|0;p=b+52|0;s=b+56|0;v=b+60|0;y=b+64|0;B=b+68|0;E=b+72|0;C=b+76|0;S=b+4|0;P=b+8|0;e=b+12|0;l=b+16|0;n=b+20|0;u=b+24|0;w=b+28|0;D=b+32|0;O=b+36|0;ga=(c[S>>2]|0)+(c[j>>2]|0)|0;fa=(c[P>>2]|0)+(c[m>>2]|0)|0;ea=(c[e>>2]|0)+(c[p>>2]|0)|0;da=(c[l>>2]|0)+(c[s>>2]|0)|0;ca=(c[n>>2]|0)+(c[v>>2]|0)|0;ba=(c[u>>2]|0)+(c[y>>2]|0)|0;aa=(c[w>>2]|0)+(c[B>>2]|0)|0;$=(c[D>>2]|0)+(c[E>>2]|0)|0;Y=(c[O>>2]|0)+(c[C>>2]|0)|0;c[a>>2]=(c[b>>2]|0)+(c[V>>2]|0);ha=a+4|0;c[ha>>2]=ga;ga=a+8|0;c[ga>>2]=fa;fa=a+12|0;c[fa>>2]=ea;ea=a+16|0;c[ea>>2]=da;da=a+20|0;c[da>>2]=ca;ca=a+24|0;c[ca>>2]=ba;ba=a+28|0;c[ba>>2]=aa;aa=a+32|0;c[aa>>2]=$;$=a+36|0;c[$>>2]=Y;Y=a+40|0;S=(c[j>>2]|0)-(c[S>>2]|0)|0;P=(c[m>>2]|0)-(c[P>>2]|0)|0;e=(c[p>>2]|0)-(c[e>>2]|0)|0;l=(c[s>>2]|0)-(c[l>>2]|0)|0;n=(c[v>>2]|0)-(c[n>>2]|0)|0;u=(c[y>>2]|0)-(c[u>>2]|0)|0;w=(c[B>>2]|0)-(c[w>>2]|0)|0;D=(c[E>>2]|0)-(c[D>>2]|0)|0;O=(c[C>>2]|0)-(c[O>>2]|0)|0;c[Y>>2]=(c[V>>2]|0)-(c[b>>2]|0);V=a+44|0;c[V>>2]=S;S=a+48|0;c[S>>2]=P;P=a+52|0;c[P>>2]=e;e=a+56|0;c[e>>2]=l;l=a+60|0;c[l>>2]=n;n=a+64|0;c[n>>2]=u;u=a+68|0;c[u>>2]=w;w=a+72|0;c[w>>2]=D;D=a+76|0;c[D>>2]=O;O=a+80|0;Jc(O,a,d);Jc(Y,Y,d+40|0);C=a+120|0;Jc(C,d+80|0,b+120|0);E=c[b+80>>2]<<1;b=c[b+84>>2]<<1;y=c[b+88>>2]<<1;v=c[b+92>>2]<<1;s=c[b+96>>2]<<1;p=c[b+100>>2]<<1;m=c[b+104>>2]<<1;j=c[b+108>>2]<<1;g=c[b+112>>2]<<1;b=c[b+116>>2]<<1;z=c[o>>2]|0;N=a+84|0;W=c[N>>2]|0;M=a+88|0;T=c[M>>2]|0;L=a+92|0;Q=c[L>>2]|0;K=a+96|0;f=c[K>>2]|0;J=a+100|0;h=c[J>>2]|0;I=a+104|0;o=c[I>>2]|0;H=a+108|0;q=c[H>>2]|0;G=a+112|0;x=c[G>>2]|0;F=a+116|0;z=c[F>>2]|0;_=c[Y>>2]|0;X=c[V>>2]|0;U=c[S>>2]|0;R=c[P>>2]|0;d=c[e>>2]|0;i=c[l>>2]|0;k=c[n>>2]|0;r=c[u>>2]|0;t=c[w>>2]|0;A=c[D>>2]|0;c[a>>2]=Z-_;c[ha>>2]=W-X;c[ga>>2]=T-U;c[fa>>2]=Q-R;c[ea>>2]=f-d;c[da>>2]=h-i;c[ca>>2]=o-k;c[ba>>2]=q-r;c[aa>>2]=x-t;c[$>>2]=z-A;c[Y>>2]=_+Z;c[V>>2]=X+W;c[S>>2]=U+T;c[P>>2]=R+Q;c[e>>2]=d+f;c[l>>2]=i+h;c[n>>2]=k+o;c[u>>2]=r+q;c[w>>2]=t+x;c[D>>2]=A+z;D=c[C>>2]|0;z=a+124|0;A=c[z>>2]|0;w=a+128|0;x=c[w>>2]|0;t=a+132|0;u=c[t>>2]|0;q=a+136|0;r=c[q>>2]|0;n=a+140|0;o=c[n>>2]|0;k=a+144|0;l=c[k>>2]|0;h=a+148|0;i=c[h>>2]|0;e=a+152|0;f=c[e>>2]|0;a=a+156|0;d=c[a>>2]|0;c[O>>2]=D+E;c[N>>2]=A+B;c[M>>2]=x+y;c[L>>2]=u+v;c[K>>2]=r+s;c[J>>2]=o+p;c[I>>2]=l+m;c[H>>2]=i+j;c[G>>2]=f+g;c[F>>2]=d+b;c[C>>2]=E-D;c[z>>2]=B-A;c[w>>2]=y-x;c[t>>2]=v-u;c[q>>2]=s-r;c[n>>2]=p-o;c[k>>2]=m-l;c[h>>2]=j-i;c[e>>2]=g-f;c[a>>2]=b-d;return}function Pc(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0,fb=0,gb=0,hb=0,ib=0,jb=0,kb=0,lb=0,mb=0,nb=0;d=i;S=i=i+63&-64;i=i+48|0;Kc(a,b);aa=a+80|0;ta=b+40|0;Kc(aa,ta);v=a+120|0;ib=c[b+80>>2]|0;Sa=c[b+84>>2]|0;p=c[b+88>>2]|0;x=c[b+92>>2]|0;f=c[b+96>>2]|0;kb=c[b+100>>2]|0;_=c[b+104>>2]|0;wa=c[b+108>>2]|0;l=c[b+112>>2]|0;ua=c[b+116>>2]|0;t=ib<<1;ra=sa<<1;cb=p<<1;g=x<<1;ma=f<<1;e=kb<<1;va=_<<1;n=wa<<1;bb=kb*38|0;qa=_*19|0;q=wa*38|0;h=l*19|0;nb=ua*38|0;jb=((ib|0)<0)<<31>>31;jb=Od(ib|0,jb|0,ib|0,jb|0)|0;ib=C;qa=((t|0)<0)<<31>>31;Ta=((Sa|0)<0)<<31>>31;$a=Od(t|0,qa|0,Sa|0,Ta|0)|0;_a=C;r=((p|0)<0)<<31>>31;Va=Od(p|0,r|0,t|0,qa|0)|0;Ua=C;R=((x|0)<0)<<31>>31;La=Od(x|0,R|0,t|0,qa|0)|0;Ka=C;ka=((f|0)<0)<<31>>31;za=Od(f|0,ka|0,t|0,qa|0)|0;ya=C;lb=((kb|0)<0)<<31>>31;K=Od(kb|0,lb|0,t|0,qa|0)|0;M=C;j=((_|0)<0)<<31>>31;k=Od(_|0,j|0,t|0,qa|0)|0;F=C;xa=((wa|0)<0)<<31>>31;u=Od(wa|0,xa|0,t|0,qa|0)|0;P=C;ma=((l|0)<0)<<31>>31;W=Od(l|0,ma|0,t|0,qa|0)|0;fa=C;oa=((ua|0)<0)<<31>>31;qa=Od(ua|0,oa|0,t|0,qa|0)|0;t=C;pa=((ra|0)<0)<<31>>31;Ta=Od(ra|0,pa|0,Sa|0,Ta|0)|0;Sa=C;Ja=Od(ra|0,pa|0,p|0,r|0)|0;Ia=C;ja=((g|0)<0)<<31>>31;Da=Od(g|0,ja|0,ra|0,pa|0)|0;Ca=C;B=Od(f|0,ka|0,ra|0,pa|0)|0;E=C;la=((e|0)<0)<<31>>31;h=Od(e|0,la|0,ra|0,pa|0)|0;D=C;s=Od(_|0,j|0,ra|0,pa|0)|0;N=C;$=((n|0)<0)<<31>>31;V=Od(n|0,$|0,ra|0,pa|0)|0;ea=C;sa=Od(l|0,ma|0,ra|0,pa|0)|0;na=C;mb=((nb|0)<0)<<31>>31;pa=Od(nb|0,mb|0,ra|0,pa|0)|0;ra=C;Ba=Od(p|0,r|0,p|0,r|0)|0;Aa=C;db=((cb|0)<0)<<31>>31;G=Od(cb|0,db|0,x|0,R|0)|0;I=C;y=Od(f|0,ka|0,cb|0,db|0)|0;A=C;o=Od(kb|0,lb|0,cb|0,db|0)|0;J=C;w=Od(_|0,j|0,cb|0,db|0)|0;ba=C;Z=Od(wa|0,xa|0,cb|0,db|0)|0;ia=C;m=((H|0)<0)<<31>>31;db=Od(H|0,m|0,cb|0,db|0)|0;cb=C;r=Od(nb|0,mb|0,p|0,r|0)|0;p=C;R=Od(g|0,ja|0,x|0,R|0)|0;x=C;q=Od(g|0,ja|0,f|0,ka|0)|0;L=C;U=Od(e|0,la|0,g|0,ja|0)|0;da=C;X=Od(_|0,j|0,g|0,ja|0)|0;ga=C;O=((Q|0)<0)<<31>>31;fb=Od(Q|0,O|0,g|0,ja|0)|0;eb=C;Xa=Od(H|0,m|0,g|0,ja|0)|0;Wa=C;ja=Od(nb|0,mb|0,g|0,ja|0)|0;g=C;T=Od(f|0,ka|0,f|0,ka|0)|0;ca=C;Na=((Ma|0)<0)<<31>>31;Y=Od(Ma|0,Na|0,kb|0,lb|0)|0;ha=C;Ra=((Qa|0)<0)<<31>>31;hb=Od(Qa|0,Ra|0,Ma|0,Na|0)|0;gb=C;Za=Od(Q|0,O|0,f|0,ka|0)|0;Ya=C;Na=Od(H|0,m|0,Ma|0,Na|0)|0;Ma=C;ka=Od(nb|0,mb|0,f|0,ka|0)|0;f=C;lb=Od(bb|0,((bb|0)<0)<<31>>31|0,kb|0,lb|0)|0;kb=C;bb=Od(Qa|0,Ra|0,e|0,la|0)|0;ab=C;Pa=Od(Q|0,O|0,e|0,la|0)|0;Oa=C;Fa=Od(H|0,m|0,e|0,la|0)|0;Ea=C;la=Od(nb|0,mb|0,e|0,la|0)|0;e=C;Ra=Od(Qa|0,Ra|0,_|0,j|0)|0;Qa=C;Ha=Od(Q|0,O|0,_|0,j|0)|0;Ga=C;va=Od(H|0,m|0,va|0,((va|0)<0)<<31>>31|0)|0;z=C;j=Od(nb|0,mb|0,_|0,j|0)|0;_=C;xa=Od(Q|0,O|0,wa|0,xa|0)|0;wa=C;O=Od(H|0,m|0,n|0,$|0)|0;Q=C;$=Od(nb|0,mb|0,n|0,$|0)|0;n=C;m=Od(H|0,m|0,l|0,ma|0)|0;H=C;ma=Od(nb|0,mb|0,l|0,ma|0)|0;l=C;oa=Od(nb|0,mb|0,ua|0,oa|0)|0;ua=C;ib=Dd(lb|0,kb|0,jb|0,ib|0)|0;gb=Dd(ib|0,C|0,hb|0,gb|0)|0;eb=Dd(gb|0,C|0,fb|0,eb|0)|0;cb=Dd(eb|0,C|0,db|0,cb|0)|0;ra=Dd(cb|0,C|0,pa|0,ra|0)|0;pa=C;_a=Dd(bb|0,ab|0,$a|0,_a|0)|0;Ya=Dd(_a|0,C|0,Za|0,Ya|0)|0;Wa=Dd(Ya|0,C|0,Xa|0,Wa|0)|0;p=Dd(Wa|0,C|0,r|0,p|0)|0;r=C;Sa=Dd(Va|0,Ua|0,Ta|0,Sa|0)|0;Qa=Dd(Sa|0,C|0,Ra|0,Qa|0)|0;Oa=Dd(Qa|0,C|0,Pa|0,Oa|0)|0;Ma=Dd(Oa|0,C|0,Na|0,Ma|0)|0;g=Dd(Ma|0,C|0,ja|0,g|0)|0;ja=C;Ia=Dd(La|0,Ka|0,Ja|0,Ia|0)|0;Ga=Dd(Ia|0,C|0,Ha|0,Ga|0)|0;Ea=Dd(Ga|0,C|0,Fa|0,Ea|0)|0;f=Dd(Ea|0,C|0,ka|0,f|0)|0;ka=C;Aa=Dd(Da|0,Ca|0,Ba|0,Aa|0)|0;ya=Dd(Aa|0,C|0,za|0,ya|0)|0;wa=Dd(ya|0,C|0,xa|0,wa|0)|0;z=Dd(wa|0,C|0,va|0,z|0)|0;e=Dd(z|0,C|0,la|0,e|0)|0;la=C;I=Dd(B|0,E|0,G|0,I|0)|0;M=Dd(I|0,C|0,K|0,M|0)|0;Q=Dd(M|0,C|0,O|0,Q|0)|0;_=Dd(Q|0,C|0,j|0,_|0)|0;j=C;A=Dd(R|0,x|0,y|0,A|0)|0;D=Dd(A|0,C|0,h|0,D|0)|0;F=Dd(D|0,C|0,k|0,F|0)|0;H=Dd(F|0,C|0,m|0,H|0)|0;n=Dd(H|0,C|0,$|0,n|0)|0;$=C;L=Dd(o|0,J|0,q|0,L|0)|0;N=Dd(L|0,C|0,s|0,N|0)|0;P=Dd(N|0,C|0,u|0,P|0)|0;l=Dd(P|0,C|0,ma|0,l|0)|0;ma=C;ca=Dd(w|0,ba|0,T|0,ca|0)|0;da=Dd(ca|0,C|0,U|0,da|0)|0;ea=Dd(da|0,C|0,V|0,ea|0)|0;fa=Dd(ea|0,C|0,W|0,fa|0)|0;ua=Dd(fa|0,C|0,oa|0,ua|0)|0;oa=C;ha=Dd(X|0,ga|0,Y|0,ha|0)|0;ia=Dd(ha|0,C|0,Z|0,ia|0)|0;na=Dd(ia|0,C|0,sa|0,na|0)|0;t=Dd(na|0,C|0,qa|0,t|0)|0;qa=C;pa=Hd(ra|0,pa|0,1)|0;ra=C;r=Hd(p|0,r|0,1)|0;p=C;ja=Hd(g|0,ja|0,1)|0;g=C;ka=Hd(f|0,ka|0,1)|0;f=C;la=Hd(e|0,la|0,1)|0;e=C;j=Hd(_|0,j|0,1)|0;_=C;$=Hd(n|0,$|0,1)|0;n=C;ma=Hd(l|0,ma|0,1)|0;l=C;oa=Hd(ua|0,oa|0,1)|0;ua=C;qa=Hd(t|0,qa|0,1)|0;t=C;na=Dd(pa|0,ra|0,33554432,0)|0;na=Ed(na|0,C|0,26)|0;sa=C;p=Dd(na|0,sa|0,r|0,p|0)|0;r=C;sa=Hd(na|0,sa|0,26)|0;sa=Cd(pa|0,ra|0,sa|0,C|0)|0;ra=C;pa=Dd(la|0,e|0,33554432,0)|0;pa=Ed(pa|0,C|0,26)|0;na=C;_=Dd(pa|0,na|0,j|0,_|0)|0;j=C;na=Hd(pa|0,na|0,26)|0;na=Cd(la|0,e|0,na|0,C|0)|0;e=C;la=Dd(p|0,r|0,16777216,0)|0;la=Ed(la|0,C|0,25)|0;pa=C;g=Dd(la|0,pa|0,ja|0,g|0)|0;ja=C;pa=Hd(la|0,pa|0,25)|0;pa=Cd(p|0,r|0,pa|0,C|0)|0;r=C;p=Dd(_|0,j|0,16777216,0)|0;p=Ed(p|0,C|0,25)|0;la=C;n=Dd(p|0,la|0,$|0,n|0)|0;$=C;la=Hd(p|0,la|0,25)|0;la=Cd(_|0,j|0,la|0,C|0)|0;j=C;_=Dd(g|0,ja|0,33554432,0)|0;_=Ed(_|0,C|0,26)|0;p=C;f=Dd(_|0,p|0,ka|0,f|0)|0;ka=C;p=Hd(_|0,p|0,26)|0;p=Cd(g|0,ja|0,p|0,C|0)|0;ja=Dd(n|0,$|0,33554432,0)|0;ja=Ed(ja|0,C|0,26)|0;g=C;l=Dd(ja|0,g|0,ma|0,l|0)|0;ma=C;g=Hd(ja|0,g|0,26)|0;g=Cd(n|0,$|0,g|0,C|0)|0;$=Dd(f|0,ka|0,16777216,0)|0;$=Ed($|0,C|0,25)|0;n=C;e=Dd($|0,n|0,na|0,e|0)|0;na=C;n=Hd($|0,n|0,25)|0;n=Cd(f|0,ka|0,n|0,C|0)|0;ka=Dd(l|0,ma|0,16777216,0)|0;ka=Ed(ka|0,C|0,25)|0;f=C;ua=Dd(ka|0,f|0,oa|0,ua|0)|0;oa=C;f=Hd(ka|0,f|0,25)|0;f=Cd(l|0,ma|0,f|0,C|0)|0;ma=Dd(e|0,na|0,33554432,0)|0;ma=Ed(ma|0,C|0,26)|0;l=C;j=Dd(la|0,j|0,ma|0,l|0)|0;l=Hd(ma|0,l|0,26)|0;l=Cd(e|0,na|0,l|0,C|0)|0;na=Dd(ua|0,oa|0,33554432,0)|0;na=Ed(na|0,C|0,26)|0;e=C;t=Dd(na|0,e|0,qa|0,t|0)|0;qa=C;e=Hd(na|0,e|0,26)|0;e=Cd(ua|0,oa|0,e|0,C|0)|0;oa=Dd(t|0,qa|0,16777216,0)|0;oa=Ed(oa|0,C|0,25)|0;ua=C;na=Od(oa|0,ua|0,19,0)|0;ra=Dd(na|0,C|0,sa|0,ra|0)|0;sa=C;ua=Hd(oa|0,ua|0,25)|0;ua=Cd(t|0,qa|0,ua|0,C|0)|0;qa=Dd(ra|0,sa|0,33554432,0)|0;qa=Ed(qa|0,C|0,26)|0;t=C;r=Dd(pa|0,r|0,qa|0,t|0)|0;t=Hd(qa|0,t|0,26)|0;t=Cd(ra|0,sa|0,t|0,C|0)|0;c[v>>2]=t;t=a+124|0;c[t>>2]=r;r=a+128|0;c[r>>2]=p;p=a+132|0;c[p>>2]=n;n=a+136|0;c[n>>2]=l;l=a+140|0;c[l>>2]=j;j=a+144|0;c[j>>2]=g;g=a+148|0;c[g>>2]=f;f=a+152|0;c[f>>2]=e;e=a+156|0;c[e>>2]=ua;ua=a+40|0;sa=(c[b+44>>2]|0)+(c[b+4>>2]|0)|0;ra=(c[b+48>>2]|0)+(c[b+8>>2]|0)|0;qa=(c[b+52>>2]|0)+(c[b+12>>2]|0)|0;pa=(c[b+56>>2]|0)+(c[b+16>>2]|0)|0;oa=(c[b+60>>2]|0)+(c[b+20>>2]|0)|0;na=(c[b+64>>2]|0)+(c[b+24>>2]|0)|0;ma=(c[b+68>>2]|0)+(c[b+28>>2]|0)|0;la=(c[b+72>>2]|0)+(c[b+32>>2]|0)|0;ka=(c[b+76>>2]|0)+(c[b+36>>2]|0)|0;c[ua>>2]=(c[ta>>2]|0)+(c[b>>2]|0);ta=a+44|0;c[ta>>2]=sa;sa=a+48|0;c[sa>>2]=ra;ra=a+52|0;c[ra>>2]=qa;qa=a+56|0;c[qa>>2]=pa;pa=a+60|0;c[pa>>2]=oa;oa=a+64|0;c[oa>>2]=na;na=a+68|0;c[na>>2]=ma;ma=a+72|0;c[ma>>2]=la;la=a+76|0;c[la>>2]=ka;Kc(S,ua);ka=c[aa>>2]|0;$=a+84|0;ja=c[$>>2]|0;_=a+88|0;ia=c[_>>2]|0;Z=a+92|0;ha=c[Z>>2]|0;Y=a+96|0;ga=c[Y>>2]|0;X=a+100|0;fa=c[X>>2]|0;W=a+104|0;ea=c[W>>2]|0;V=a+108|0;da=c[V>>2]|0;U=a+112|0;ca=c[U>>2]|0;T=a+116|0;ba=c[T>>2]|0;w=c[a>>2]|0;P=a+4|0;u=c[P>>2]|0;N=a+8|0;s=c[N>>2]|0;L=a+12|0;q=c[L>>2]|0;J=a+16|0;o=c[J>>2]|0;H=a+20|0;m=c[H>>2]|0;F=a+24|0;k=c[F>>2]|0;D=a+28|0;h=c[D>>2]|0;A=a+32|0;b=c[A>>2]|0;y=a+36|0;x=c[y>>2]|0;R=w+ka|0;Q=u+ja|0;O=s+ia|0;M=q+ha|0;K=o+ga|0;I=m+fa|0;G=k+ea|0;E=h+da|0;B=b+ca|0;z=x+ba|0;c[ua>>2]=R;c[ta>>2]=Q;c[sa>>2]=O;c[ra>>2]=M;c[qa>>2]=K;c[pa>>2]=I;c[oa>>2]=G;c[na>>2]=E;c[ma>>2]=B;c[la>>2]=z;w=ka-w|0;u=ja-u|0;s=ia-s|0;q=ha-q|0;o=ga-o|0;m=fa-m|0;k=ea-k|0;h=da-h|0;b=ca-b|0;x=ba-x|0;c[aa>>2]=w;c[$>>2]=u;c[_>>2]=s;c[Z>>2]=q;c[Y>>2]=o;c[X>>2]=m;c[W>>2]=k;c[V>>2]=h;c[U>>2]=b;c[T>>2]=x;Q=(c[S+4>>2]|0)-Q|0;O=(c[S+8>>2]|0)-O|0;M=(c[S+12>>2]|0)-M|0;K=(c[S+16>>2]|0)-K|0;I=(c[S+20>>2]|0)-I|0;G=(c[S+24>>2]|0)-G|0;E=(c[S+28>>2]|0)-E|0;B=(c[S+32>>2]|0)-B|0;z=(c[S+36>>2]|0)-z|0;c[a>>2]=(c[S>>2]|0)-R;c[P>>2]=Q;c[N>>2]=O;c[L>>2]=M;c[J>>2]=K;c[H>>2]=I;c[F>>2]=G;c[D>>2]=E;c[A>>2]=B;c[y>>2]=z;u=(c[t>>2]|0)-u|0;s=(c[r>>2]|0)-s|0;q=(c[p>>2]|0)-q|0;o=(c[n>>2]|0)-o|0;m=(c[l>>2]|0)-m|0;k=(c[j>>2]|0)-k|0;h=(c[g>>2]|0)-h|0;b=(c[f>>2]|0)-b|0;a=(c[e>>2]|0)-x|0;c[v>>2]=(c[v>>2]|0)-w;c[t>>2]=u;c[r>>2]=s;c[p>>2]=q;c[n>>2]=o;c[l>>2]=m;c[j>>2]=k;c[g>>2]=h;c[f>>2]=b;c[e>>2]=a;i=d;return}function Qc(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;m=b+40|0;v=b+44|0;u=b+48|0;t=b+52|0;s=b+56|0;r=b+60|0;q=b+64|0;p=b+68|0;o=b+72|0;n=b+76|0;d=b+4|0;e=b+8|0;f=b+12|0;g=b+16|0;h=b+20|0;i=b+24|0;j=b+28|0;k=b+32|0;l=b+36|0;E=(c[d>>2]|0)+(c[v>>2]|0)|0;D=(c[e>>2]|0)+(c[u>>2]|0)|0;C=(c[f>>2]|0)+(c[t>>2]|0)|0;B=(c[g>>2]|0)+(c[s>>2]|0)|0;A=(c[h>>2]|0)+(c[r>>2]|0)|0;z=(c[i>>2]|0)+(c[q>>2]|0)|0;y=(c[j>>2]|0)+(c[p>>2]|0)|0;x=(c[k>>2]|0)+(c[o>>2]|0)|0;w=(c[l>>2]|0)+(c[n>>2]|0)|0;c[a>>2]=(c[b>>2]|0)+(c[m>>2]|0);c[a+4>>2]=E;c[a+8>>2]=D;c[a+12>>2]=C;c[a+16>>2]=B;c[a+20>>2]=A;c[a+24>>2]=z;c[a+28>>2]=y;c[a+32>>2]=x;c[a+36>>2]=w;d=(c[v>>2]|0)-(c[d>>2]|0)|0;e=(c[u>>2]|0)-(c[e>>2]|0)|0;f=(c[t>>2]|0)-(c[f>>2]|0)|0;g=(c[s>>2]|0)-(c[g>>2]|0)|0;h=(c[r>>2]|0)-(c[h>>2]|0)|0;i=(c[q>>2]|0)-(c[i>>2]|0)|0;j=(c[p>>2]|0)-(c[j>>2]|0)|0;k=(c[o>>2]|0)-(c[k>>2]|0)|0;l=(c[n>>2]|0)-(c[l>>2]|0)|0;c[a+40>>2]=(c[m>>2]|0)-(c[b>>2]|0);c[a+44>>2]=d;c[a+48>>2]=e;c[a+52>>2]=f;c[a+56>>2]=g;c[a+60>>2]=h;c[a+64>>2]=i;c[a+68>>2]=j;c[a+72>>2]=k;c[a+76>>2]=l;l=c[b+84>>2]|0;k=c[b+88>>2]|0;j=c[b+92>>2]|0;i=c[b+96>>2]|0;h=c[b+100>>2]|0;g=c[b+104>>2]|0;f=c[b+108>>2]|0;e=c[b+112>>2]|0;d=c[b+116>>2]|0;c[a+80>>2]=c[b+80>>2];c[a+84>>2]=l;c[a+88>>2]=k;c[a+92>>2]=j;c[a+96>>2]=i;c[a+100>>2]=h;c[a+104>>2]=g;c[a+108>>2]=f;c[a+112>>2]=e;c[a+116>>2]=d;Jc(a+120|0,b+120|0,1144);return}function Rc(b,e){b=b|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0;u=i;t=i=i+63&-64;i=i+592|0;p=t+400|0;r=t+520|0;s=t+240|0;q=t+120|0;f=0;do{n=a[e+f>>0]|0;o=f<<1;a[r+o>>0]=n&15;a[r+(o|1)>>0]=(n&255)>>>4;f=f+1|0}while((f|0)!=32);e=0;f=0;do{o=r+f|0;n=(d[o>>0]|0)+e|0;e=(n<<24)+134217728>>28;a[o>>0]=n-(e<<4);f=f+1|0}while((f|0)!=63);f=r+63|0;a[f>>0]=(d[f>>0]|0)+e;e=b;f=e+40|0;do{c[e>>2]=0;e=e+4|0}while((e|0)<(f|0));j=b+40|0;c[j>>2]=1;g=b+44|0;e=g;f=e+36|0;do{c[e>>2]=0;e=e+4|0}while((e|0)<(f|0));k=b+80|0;c[k>>2]=1;h=b+84|0;l=b+120|0;m=s+120|0;n=s+40|0;o=s+80|0;e=h;f=e+76|0;do{c[e>>2]=0;e=e+4|0}while((e|0)<(f|0));e=1;do{sc(t,(e|0) 2|0,a[r+e="">>0]|0);Oc(s,b,t);Jc(b,s,m);Jc(j,n,o);Jc(k,o,m);Jc(l,s,n);e=e+2|0}while((e|0)<64);b=c[b+4>>2]|0;z=c[b+8>>2]|0;y=c[b+12>>2]|0;x=c[b+16>>2]|0;w=c[b+20>>2]|0;v=c[b+24>>2]|0;f=c[b+28>>2]|0;e=c[b+32>>2]|0;A=c[b+36>>2]|0;c[p>>2]=c[b>>2];c[p+4>>2]=B;c[p+8>>2]=z;c[p+12>>2]=y;c[p+16>>2]=x;c[p+20>>2]=w;c[p+24>>2]=v;c[p+28>>2]=f;c[p+32>>2]=e;c[p+36>>2]=A;A=c[g>>2]|0;e=c[b+48>>2]|0;g=c[b+52>>2]|0;f=c[b+56>>2]|0;v=c[b+60>>2]|0;w=c[b+64>>2]|0;x=c[b+68>>2]|0;y=c[b+72>>2]|0;z=c[b+76>>2]|0;c[p+40>>2]=c[j>>2];c[p+44>>2]=A;c[p+48>>2]=e;c[p+52>>2]=g;c[p+56>>2]=f;c[p+60>>2]=v;c[p+64>>2]=w;c[p+68>>2]=x;c[p+72>>2]=y;c[p+76>>2]=z;z=c[h>>2]|0;y=c[b+88>>2]|0;x=c[b+92>>2]|0;w=c[b+96>>2]|0;v=c[b+100>>2]|0;f=c[b+104>>2]|0;g=c[b+108>>2]|0;h=c[b+112>>2]|0;e=c[b+116>>2]|0;c[p+80>>2]=c[k>>2];c[p+84>>2]=z;c[p+88>>2]=y;c[p+92>>2]=x;c[p+96>>2]=w;c[p+100>>2]=v;c[p+104>>2]=f;c[p+108>>2]=g;c[p+112>>2]=h;c[p+116>>2]=e;Pc(s,p);Jc(q,s,m);p=q+40|0;Jc(p,n,o);e=q+80|0;Jc(e,o,m);Pc(s,q);Jc(q,s,m);Jc(p,n,o);Jc(e,o,m);Pc(s,q);Jc(q,s,m);Jc(p,n,o);Jc(e,o,m);Pc(s,q);Jc(b,s,m);Jc(j,n,o);Jc(k,o,m);Jc(l,s,n);e=0;do{Sc(t,(e|0)/2|0,a[r+e>>0]|0);Oc(s,b,t);Jc(b,s,m);Jc(j,n,o);Jc(k,o,m);Jc(l,s,n);e=e+2|0}while((e|0)<64);i=u;return}function sc(a,b,d){a="a|0;b=b|0;d=d|0;var" e="0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0;s=d<<24">>24;s=Gd(s|0,((s|0)<0)<<31>>31|0,63)|0;h=d<<24>>24;s=0-s|0;d=a+4|0;c[d>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;c[d+12>>2]=0;c[d+16>>2]=0;c[d+20>>2]=0;c[d+24>>2]=0;c[d+28>>2]=0;e=a+40|0;c[e>>2]=1;f=a+44|0;g=a+80|0;h=h-((h&s)<<1)&255;i=(h^1)+-1|0;j=1184+(b*960|0)|0;k=a+8|0;l=a+12|0;m=a+16|0;n=a+20|0;o=a+24|0;p=a+28|0;q=a+32|0;r=a+36|0;t=f;u=t+76|0;do{c[t>>2]=0;t=t+4|0}while((t|0)<(u|0));h=i>>31;A=c[1184+(b*960|0)+4>>2]&H;I=c[1184+(b*960|0)+8>>2]&H;K=c[1184+(b*960|0)+12>>2]&H;M=c[1184+(b*960|0)+16>>2]&H;O=c[1184+(b*960|0)+20>>2]&H;Q=c[1184+(b*960|0)+24>>2]&H;S=c[1184+(b*960|0)+28>>2]&H;U=c[1184+(b*960|0)+32>>2]&H;W=c[1184+(b*960|0)+36>>2]&H;c[a>>2]=(c[j>>2]^1)&H^1;c[d>>2]=A;c[k>>2]=I;c[l>>2]=K;c[m>>2]=M;c[n>>2]=O;c[o>>2]=Q;c[p>>2]=S;c[q>>2]=U;c[r>>2]=W;W=a+48|0;U=a+52|0;S=a+56|0;Q=a+60|0;O=a+64|0;M=a+68|0;K=a+72|0;I=a+76|0;A=c[1184+(b*960|0)+44>>2]&H;z=c[1184+(b*960|0)+48>>2]&H;w=c[1184+(b*960|0)+52>>2]&H;B=c[1184+(b*960|0)+56>>2]&H;ia=c[1184+(b*960|0)+60>>2]&H;D=c[1184+(b*960|0)+64>>2]&H;ea=c[1184+(b*960|0)+68>>2]&H;F=c[1184+(b*960|0)+72>>2]&H;ga=c[1184+(b*960|0)+76>>2]&H;c[e>>2]=(c[1184+(b*960|0)+40>>2]^1)&H^1;c[f>>2]=A;c[W>>2]=z;c[U>>2]=w;c[S>>2]=B;c[Q>>2]=ia;c[O>>2]=D;c[M>>2]=ea;c[K>>2]=F;c[I>>2]=ga;ga=c[g>>2]|0;F=a+84|0;ea=c[F>>2]|0;D=a+88|0;ia=c[D>>2]|0;B=a+92|0;w=c[B>>2]|0;z=a+96|0;A=c[z>>2]|0;x=a+100|0;fa=c[x>>2]|0;v=a+104|0;ba=c[v>>2]|0;i=a+108|0;G=c[i>>2]|0;t=a+112|0;_=c[t>>2]|0;u=a+116|0;da=c[u>>2]|0;$=(c[1184+(b*960|0)+84>>2]^ea)&H;aa=(c[1184+(b*960|0)+88>>2]^ia)&H;y=(c[1184+(b*960|0)+92>>2]^w)&H;j=(c[1184+(b*960|0)+96>>2]^A)&H;ha=(c[1184+(b*960|0)+100>>2]^fa)&H;Z=(c[1184+(b*960|0)+104>>2]^ba)&H;ca=(c[1184+(b*960|0)+108>>2]^G)&H;C=(c[1184+(b*960|0)+112>>2]^_)&H;E=(c[1184+(b*960|0)+116>>2]^da)&H;c[g>>2]=(c[1184+(b*960|0)+80>>2]^ga)&H^ga;c[F>>2]=$^ea;c[D>>2]=aa^ia;c[B>>2]=y^w;c[z>>2]=j^A;c[x>>2]=ha^fa;c[v>>2]=Z^ba;c[i>>2]=ca^G;c[t>>2]=C^_;c[u>>2]=E^da;da=c[a>>2]|0;E=c[d>>2]|0;_=c[k>>2]|0;C=c[l>>2]|0;G=c[m>>2]|0;ca=c[n>>2]|0;ba=c[o>>2]|0;Z=c[p>>2]|0;fa=c[q>>2]|0;ha=c[r>>2]|0;A=(h^2)+-1>>31;j=(c[1184+(b*960|0)+124>>2]^E)&A;w=(c[1184+(b*960|0)+128>>2]^_)&A;y=(c[1184+(b*960|0)+132>>2]^C)&A;ia=(c[1184+(b*960|0)+136>>2]^G)&A;aa=(c[1184+(b*960|0)+140>>2]^ca)&A;ea=(c[1184+(b*960|0)+144>>2]^ba)&A;$=(c[1184+(b*960|0)+148>>2]^Z)&A;ga=(c[1184+(b*960|0)+152>>2]^fa)&A;H=(c[1184+(b*960|0)+156>>2]^ha)&A;c[a>>2]=(c[1184+(b*960|0)+120>>2]^da)&A^da;c[d>>2]=j^E;c[k>>2]=w^_;c[l>>2]=y^C;c[m>>2]=ia^G;c[n>>2]=aa^ca;c[o>>2]=ea^ba;c[p>>2]=$^Z;c[q>>2]=ga^fa;c[r>>2]=H^ha;ha=c[e>>2]|0;H=c[f>>2]|0;fa=c[W>>2]|0;ga=c[U>>2]|0;Z=c[S>>2]|0;$=c[Q>>2]|0;ba=c[O>>2]|0;ea=c[M>>2]|0;ca=c[K>>2]|0;aa=c[I>>2]|0;G=(c[1184+(b*960|0)+164>>2]^H)&A;ia=(c[1184+(b*960|0)+168>>2]^fa)&A;C=(c[1184+(b*960|0)+172>>2]^ga)&A;y=(c[1184+(b*960|0)+176>>2]^Z)&A;_=(c[1184+(b*960|0)+180>>2]^$)&A;w=(c[1184+(b*960|0)+184>>2]^ba)&A;E=(c[1184+(b*960|0)+188>>2]^ea)&A;j=(c[1184+(b*960|0)+192>>2]^ca)&A;da=(c[1184+(b*960|0)+196>>2]^aa)&A;c[e>>2]=(c[1184+(b*960|0)+160>>2]^ha)&A^ha;c[f>>2]=G^H;c[W>>2]=ia^fa;c[U>>2]=C^ga;c[S>>2]=y^Z;c[Q>>2]=_^$;c[O>>2]=w^ba;c[M>>2]=E^ea;c[K>>2]=j^ca;c[I>>2]=da^aa;aa=c[g>>2]|0;da=c[F>>2]|0;ca=c[D>>2]|0;j=c[B>>2]|0;ea=c[z>>2]|0;E=c[x>>2]|0;ba=c[v>>2]|0;w=c[i>>2]|0;$=c[t>>2]|0;_=c[u>>2]|0;Z=(c[1184+(b*960|0)+204>>2]^da)&A;y=(c[1184+(b*960|0)+208>>2]^ca)&A;ga=(c[1184+(b*960|0)+212>>2]^j)&A;C=(c[1184+(b*960|0)+216>>2]^ea)&A;fa=(c[1184+(b*960|0)+220>>2]^E)&A;ia=(c[1184+(b*960|0)+224>>2]^ba)&A;H=(c[1184+(b*960|0)+228>>2]^w)&A;G=(c[1184+(b*960|0)+232>>2]^$)&A;ha=(c[1184+(b*960|0)+236>>2]^_)&A;c[g>>2]=(c[1184+(b*960|0)+200>>2]^aa)&A^aa;c[F>>2]=Z^da;c[D>>2]=y^ca;c[B>>2]=ga^j;c[z>>2]=C^ea;c[x>>2]=fa^E;c[v>>2]=ia^ba;c[i>>2]=H^w;c[t>>2]=G^$;c[u>>2]=ha^_;_=c[a>>2]|0;ha=c[d>>2]|0;$=c[k>>2]|0;G=c[l>>2]|0;w=c[m>>2]|0;H=c[n>>2]|0;ba=c[o>>2]|0;ia=c[p>>2]|0;E=c[q>>2]|0;fa=c[r>>2]|0;ea=(h^3)+-1>>31;C=(c[1184+(b*960|0)+244>>2]^ha)&ea;j=(c[1184+(b*960|0)+248>>2]^$)&ea;ga=(c[1184+(b*960|0)+252>>2]^G)&ea;ca=(c[1184+(b*960|0)+256>>2]^w)&ea;y=(c[1184+(b*960|0)+260>>2]^H)&ea;da=(c[1184+(b*960|0)+264>>2]^ba)&ea;Z=(c[1184+(b*960|0)+268>>2]^ia)&ea;aa=(c[1184+(b*960|0)+272>>2]^E)&ea;A=(c[1184+(b*960|0)+276>>2]^fa)&ea;c[a>>2]=(c[1184+(b*960|0)+240>>2]^_)&ea^_;c[d>>2]=C^ha;c[k>>2]=j^$;c[l>>2]=ga^G;c[m>>2]=ca^w;c[n>>2]=y^H;c[o>>2]=da^ba;c[p>>2]=Z^ia;c[q>>2]=aa^E;c[r>>2]=A^fa;fa=c[e>>2]|0;A=c[f>>2]|0;E=c[W>>2]|0;aa=c[U>>2]|0;ia=c[S>>2]|0;Z=c[Q>>2]|0;ba=c[O>>2]|0;da=c[M>>2]|0;H=c[K>>2]|0;y=c[I>>2]|0;w=(c[1184+(b*960|0)+284>>2]^A)&ea;ca=(c[1184+(b*960|0)+288>>2]^E)&ea;G=(c[1184+(b*960|0)+292>>2]^aa)&ea;ga=(c[1184+(b*960|0)+296>>2]^ia)&ea;$=(c[1184+(b*960|0)+300>>2]^Z)&ea;j=(c[1184+(b*960|0)+304>>2]^ba)&ea;ha=(c[1184+(b*960|0)+308>>2]^da)&ea;C=(c[1184+(b*960|0)+312>>2]^H)&ea;_=(c[1184+(b*960|0)+316>>2]^y)&ea;c[e>>2]=(c[1184+(b*960|0)+280>>2]^fa)&ea^fa;c[f>>2]=w^A;c[W>>2]=ca^E;c[U>>2]=G^aa;c[S>>2]=ga^ia;c[Q>>2]=$^Z;c[O>>2]=j^ba;c[M>>2]=ha^da;c[K>>2]=C^H;c[I>>2]=_^y;y=c[g>>2]|0;_=c[F>>2]|0;H=c[D>>2]|0;C=c[B>>2]|0;da=c[z>>2]|0;ha=c[x>>2]|0;ba=c[v>>2]|0;j=c[i>>2]|0;Z=c[t>>2]|0;$=c[u>>2]|0;ia=(c[1184+(b*960|0)+324>>2]^_)&ea;ga=(c[1184+(b*960|0)+328>>2]^H)&ea;aa=(c[1184+(b*960|0)+332>>2]^C)&ea;G=(c[1184+(b*960|0)+336>>2]^da)&ea;E=(c[1184+(b*960|0)+340>>2]^ha)&ea;ca=(c[1184+(b*960|0)+344>>2]^ba)&ea;A=(c[1184+(b*960|0)+348>>2]^j)&ea;w=(c[1184+(b*960|0)+352>>2]^Z)&ea;fa=(c[1184+(b*960|0)+356>>2]^$)&ea;c[g>>2]=(c[1184+(b*960|0)+320>>2]^y)&ea^y;c[F>>2]=ia^_;c[D>>2]=ga^H;c[B>>2]=aa^C;c[z>>2]=G^da;c[x>>2]=E^ha;c[v>>2]=ca^ba;c[i>>2]=A^j;c[t>>2]=w^Z;c[u>>2]=fa^$;$=c[a>>2]|0;fa=c[d>>2]|0;Z=c[k>>2]|0;w=c[l>>2]|0;j=c[m>>2]|0;A=c[n>>2]|0;ba=c[o>>2]|0;ca=c[p>>2]|0;ha=c[q>>2]|0;E=c[r>>2]|0;da=(h^4)+-1>>31;G=(c[1184+(b*960|0)+364>>2]^fa)&da;C=(c[1184+(b*960|0)+368>>2]^Z)&da;aa=(c[1184+(b*960|0)+372>>2]^w)&da;H=(c[1184+(b*960|0)+376>>2]^j)&da;ga=(c[1184+(b*960|0)+380>>2]^A)&da;_=(c[1184+(b*960|0)+384>>2]^ba)&da;ia=(c[1184+(b*960|0)+388>>2]^ca)&da;y=(c[1184+(b*960|0)+392>>2]^ha)&da;ea=(c[1184+(b*960|0)+396>>2]^E)&da;c[a>>2]=(c[1184+(b*960|0)+360>>2]^$)&da^$;c[d>>2]=G^fa;c[k>>2]=C^Z;c[l>>2]=aa^w;c[m>>2]=H^j;c[n>>2]=ga^A;c[o>>2]=_^ba;c[p>>2]=ia^ca;c[q>>2]=y^ha;c[r>>2]=ea^E;E=c[e>>2]|0;ea=c[f>>2]|0;ha=c[W>>2]|0;y=c[U>>2]|0;ca=c[S>>2]|0;ia=c[Q>>2]|0;ba=c[O>>2]|0;_=c[M>>2]|0;A=c[K>>2]|0;ga=c[I>>2]|0;j=(c[1184+(b*960|0)+404>>2]^ea)&da;H=(c[1184+(b*960|0)+408>>2]^ha)&da;w=(c[1184+(b*960|0)+412>>2]^y)&da;aa=(c[1184+(b*960|0)+416>>2]^ca)&da;Z=(c[1184+(b*960|0)+420>>2]^ia)&da;C=(c[1184+(b*960|0)+424>>2]^ba)&da;fa=(c[1184+(b*960|0)+428>>2]^_)&da;G=(c[1184+(b*960|0)+432>>2]^A)&da;$=(c[1184+(b*960|0)+436>>2]^ga)&da;c[e>>2]=(c[1184+(b*960|0)+400>>2]^E)&da^E;c[f>>2]=j^ea;c[W>>2]=H^ha;c[U>>2]=w^y;c[S>>2]=aa^ca;c[Q>>2]=Z^ia;c[O>>2]=C^ba;c[M>>2]=fa^_;c[K>>2]=G^A;c[I>>2]=$^ga;ga=c[g>>2]|0;$=c[F>>2]|0;A=c[D>>2]|0;G=c[B>>2]|0;_=c[z>>2]|0;fa=c[x>>2]|0;ba=c[v>>2]|0;C=c[i>>2]|0;ia=c[t>>2]|0;Z=c[u>>2]|0;ca=(c[1184+(b*960|0)+444>>2]^$)&da;aa=(c[1184+(b*960|0)+448>>2]^A)&da;y=(c[1184+(b*960|0)+452>>2]^G)&da;w=(c[1184+(b*960|0)+456>>2]^_)&da;ha=(c[1184+(b*960|0)+460>>2]^fa)&da;H=(c[1184+(b*960|0)+464>>2]^ba)&da;ea=(c[1184+(b*960|0)+468>>2]^C)&da;j=(c[1184+(b*960|0)+472>>2]^ia)&da;E=(c[1184+(b*960|0)+476>>2]^Z)&da;c[g>>2]=(c[1184+(b*960|0)+440>>2]^ga)&da^ga;c[F>>2]=ca^$;c[D>>2]=aa^A;c[B>>2]=y^G;c[z>>2]=w^_;c[x>>2]=ha^fa;c[v>>2]=H^ba;c[i>>2]=ea^C;c[t>>2]=j^ia;c[u>>2]=E^Z;Z=c[a>>2]|0;E=c[d>>2]|0;ia=c[k>>2]|0;j=c[l>>2]|0;C=c[m>>2]|0;ea=c[n>>2]|0;ba=c[o>>2]|0;H=c[p>>2]|0;fa=c[q>>2]|0;ha=c[r>>2]|0;_=(h^5)+-1>>31;w=(c[1184+(b*960|0)+484>>2]^E)&_;G=(c[1184+(b*960|0)+488>>2]^ia)&_;y=(c[1184+(b*960|0)+492>>2]^j)&_;A=(c[1184+(b*960|0)+496>>2]^C)&_;aa=(c[1184+(b*960|0)+500>>2]^ea)&_;$=(c[1184+(b*960|0)+504>>2]^ba)&_;ca=(c[1184+(b*960|0)+508>>2]^H)&_;ga=(c[1184+(b*960|0)+512>>2]^fa)&_;da=(c[1184+(b*960|0)+516>>2]^ha)&_;c[a>>2]=(c[1184+(b*960|0)+480>>2]^Z)&_^Z;c[d>>2]=w^E;c[k>>2]=G^ia;c[l>>2]=y^j;c[m>>2]=A^C;c[n>>2]=aa^ea;c[o>>2]=$^ba;c[p>>2]=ca^H;c[q>>2]=ga^fa;c[r>>2]=da^ha;ha=c[e>>2]|0;da=c[f>>2]|0;fa=c[W>>2]|0;ga=c[U>>2]|0;H=c[S>>2]|0;ca=c[Q>>2]|0;ba=c[O>>2]|0;$=c[M>>2]|0;ea=c[K>>2]|0;aa=c[I>>2]|0;C=(c[1184+(b*960|0)+524>>2]^da)&_;A=(c[1184+(b*960|0)+528>>2]^fa)&_;j=(c[1184+(b*960|0)+532>>2]^ga)&_;y=(c[1184+(b*960|0)+536>>2]^H)&_;ia=(c[1184+(b*960|0)+540>>2]^ca)&_;G=(c[1184+(b*960|0)+544>>2]^ba)&_;E=(c[1184+(b*960|0)+548>>2]^$)&_;w=(c[1184+(b*960|0)+552>>2]^ea)&_;Z=(c[1184+(b*960|0)+556>>2]^aa)&_;c[e>>2]=(c[1184+(b*960|0)+520>>2]^ha)&_^ha;c[f>>2]=C^da;c[W>>2]=A^fa;c[U>>2]=j^ga;c[S>>2]=y^H;c[Q>>2]=ia^ca;c[O>>2]=G^ba;c[M>>2]=E^$;c[K>>2]=w^ea;c[I>>2]=Z^aa;aa=c[g>>2]|0;Z=c[F>>2]|0;ea=c[D>>2]|0;w=c[B>>2]|0;$=c[z>>2]|0;E=c[x>>2]|0;ba=c[v>>2]|0;G=c[i>>2]|0;ca=c[t>>2]|0;ia=c[u>>2]|0;H=(c[1184+(b*960|0)+564>>2]^Z)&_;y=(c[1184+(b*960|0)+568>>2]^ea)&_;ga=(c[1184+(b*960|0)+572>>2]^w)&_;j=(c[1184+(b*960|0)+576>>2]^$)&_;fa=(c[1184+(b*960|0)+580>>2]^E)&_;A=(c[1184+(b*960|0)+584>>2]^ba)&_;da=(c[1184+(b*960|0)+588>>2]^G)&_;C=(c[1184+(b*960|0)+592>>2]^ca)&_;ha=(c[1184+(b*960|0)+596>>2]^ia)&_;c[g>>2]=(c[1184+(b*960|0)+560>>2]^aa)&_^aa;c[F>>2]=H^Z;c[D>>2]=y^ea;c[B>>2]=ga^w;c[z>>2]=j^$;c[x>>2]=fa^E;c[v>>2]=A^ba;c[i>>2]=da^G;c[t>>2]=C^ca;c[u>>2]=ha^ia;ia=c[a>>2]|0;ha=c[d>>2]|0;ca=c[k>>2]|0;C=c[l>>2]|0;G=c[m>>2]|0;da=c[n>>2]|0;ba=c[o>>2]|0;A=c[p>>2]|0;E=c[q>>2]|0;fa=c[r>>2]|0;$=(h^6)+-1>>31;j=(c[1184+(b*960|0)+604>>2]^ha)&$;w=(c[1184+(b*960|0)+608>>2]^ca)&$;ga=(c[1184+(b*960|0)+612>>2]^C)&$;ea=(c[1184+(b*960|0)+616>>2]^G)&$;y=(c[1184+(b*960|0)+620>>2]^da)&$;Z=(c[1184+(b*960|0)+624>>2]^ba)&$;H=(c[1184+(b*960|0)+628>>2]^A)&$;aa=(c[1184+(b*960|0)+632>>2]^E)&$;_=(c[1184+(b*960|0)+636>>2]^fa)&$;c[a>>2]=(c[1184+(b*960|0)+600>>2]^ia)&$^ia;c[d>>2]=j^ha;c[k>>2]=w^ca;c[l>>2]=ga^C;c[m>>2]=ea^G;c[n>>2]=y^da;c[o>>2]=Z^ba;c[p>>2]=H^A;c[q>>2]=aa^E;c[r>>2]=_^fa;fa=c[e>>2]|0;_=c[f>>2]|0;E=c[W>>2]|0;aa=c[U>>2]|0;A=c[S>>2]|0;H=c[Q>>2]|0;ba=c[O>>2]|0;Z=c[M>>2]|0;da=c[K>>2]|0;y=c[I>>2]|0;G=(c[1184+(b*960|0)+644>>2]^_)&$;ea=(c[1184+(b*960|0)+648>>2]^E)&$;C=(c[1184+(b*960|0)+652>>2]^aa)&$;ga=(c[1184+(b*960|0)+656>>2]^A)&$;ca=(c[1184+(b*960|0)+660>>2]^H)&$;w=(c[1184+(b*960|0)+664>>2]^ba)&$;ha=(c[1184+(b*960|0)+668>>2]^Z)&$;j=(c[1184+(b*960|0)+672>>2]^da)&$;ia=(c[1184+(b*960|0)+676>>2]^y)&$;c[e>>2]=(c[1184+(b*960|0)+640>>2]^fa)&$^fa;c[f>>2]=G^_;c[W>>2]=ea^E;c[U>>2]=C^aa;c[S>>2]=ga^A;c[Q>>2]=ca^H;c[O>>2]=w^ba;c[M>>2]=ha^Z;c[K>>2]=j^da;c[I>>2]=ia^y;y=c[g>>2]|0;ia=c[F>>2]|0;da=c[D>>2]|0;j=c[B>>2]|0;Z=c[z>>2]|0;ha=c[x>>2]|0;ba=c[v>>2]|0;w=c[i>>2]|0;H=c[t>>2]|0;ca=c[u>>2]|0;A=(c[1184+(b*960|0)+684>>2]^ia)&$;ga=(c[1184+(b*960|0)+688>>2]^da)&$;aa=(c[1184+(b*960|0)+692>>2]^j)&$;C=(c[1184+(b*960|0)+696>>2]^Z)&$;E=(c[1184+(b*960|0)+700>>2]^ha)&$;ea=(c[1184+(b*960|0)+704>>2]^ba)&$;_=(c[1184+(b*960|0)+708>>2]^w)&$;G=(c[1184+(b*960|0)+712>>2]^H)&$;fa=(c[1184+(b*960|0)+716>>2]^ca)&$;c[g>>2]=(c[1184+(b*960|0)+680>>2]^y)&$^y;c[F>>2]=A^ia;c[D>>2]=ga^da;c[B>>2]=aa^j;c[z>>2]=C^Z;c[x>>2]=E^ha;c[v>>2]=ea^ba;c[i>>2]=_^w;c[t>>2]=G^H;c[u>>2]=fa^ca;ca=c[a>>2]|0;fa=c[d>>2]|0;H=c[k>>2]|0;G=c[l>>2]|0;w=c[m>>2]|0;_=c[n>>2]|0;ba=c[o>>2]|0;ea=c[p>>2]|0;ha=c[q>>2]|0;E=c[r>>2]|0;Z=(h^7)+-1>>31;C=(c[1184+(b*960|0)+724>>2]^fa)&Z;j=(c[1184+(b*960|0)+728>>2]^H)&Z;aa=(c[1184+(b*960|0)+732>>2]^G)&Z;da=(c[1184+(b*960|0)+736>>2]^w)&Z;ga=(c[1184+(b*960|0)+740>>2]^_)&Z;ia=(c[1184+(b*960|0)+744>>2]^ba)&Z;A=(c[1184+(b*960|0)+748>>2]^ea)&Z;y=(c[1184+(b*960|0)+752>>2]^ha)&Z;$=(c[1184+(b*960|0)+756>>2]^E)&Z;c[a>>2]=(c[1184+(b*960|0)+720>>2]^ca)&Z^ca;c[d>>2]=C^fa;c[k>>2]=j^H;c[l>>2]=aa^G;c[m>>2]=da^w;c[n>>2]=ga^_;c[o>>2]=ia^ba;c[p>>2]=A^ea;c[q>>2]=y^ha;c[r>>2]=$^E;E=c[e>>2]|0;$=c[f>>2]|0;ha=c[W>>2]|0;y=c[U>>2]|0;ea=c[S>>2]|0;A=c[Q>>2]|0;ba=c[O>>2]|0;ia=c[M>>2]|0;_=c[K>>2]|0;ga=c[I>>2]|0;w=(c[1184+(b*960|0)+764>>2]^$)&Z;da=(c[1184+(b*960|0)+768>>2]^ha)&Z;G=(c[1184+(b*960|0)+772>>2]^y)&Z;aa=(c[1184+(b*960|0)+776>>2]^ea)&Z;H=(c[1184+(b*960|0)+780>>2]^A)&Z;j=(c[1184+(b*960|0)+784>>2]^ba)&Z;fa=(c[1184+(b*960|0)+788>>2]^ia)&Z;C=(c[1184+(b*960|0)+792>>2]^_)&Z;ca=(c[1184+(b*960|0)+796>>2]^ga)&Z;c[e>>2]=(c[1184+(b*960|0)+760>>2]^E)&Z^E;c[f>>2]=w^$;c[W>>2]=da^ha;c[U>>2]=G^y;c[S>>2]=aa^ea;c[Q>>2]=H^A;c[O>>2]=j^ba;c[M>>2]=fa^ia;c[K>>2]=C^_;c[I>>2]=ca^ga;ga=c[g>>2]|0;ca=c[F>>2]|0;_=c[D>>2]|0;C=c[B>>2]|0;ia=c[z>>2]|0;fa=c[x>>2]|0;ba=c[v>>2]|0;j=c[i>>2]|0;A=c[t>>2]|0;H=c[u>>2]|0;ea=(c[1184+(b*960|0)+804>>2]^ca)&Z;aa=(c[1184+(b*960|0)+808>>2]^_)&Z;y=(c[1184+(b*960|0)+812>>2]^C)&Z;G=(c[1184+(b*960|0)+816>>2]^ia)&Z;ha=(c[1184+(b*960|0)+820>>2]^fa)&Z;da=(c[1184+(b*960|0)+824>>2]^ba)&Z;$=(c[1184+(b*960|0)+828>>2]^j)&Z;w=(c[1184+(b*960|0)+832>>2]^A)&Z;E=(c[1184+(b*960|0)+836>>2]^H)&Z;c[g>>2]=(c[1184+(b*960|0)+800>>2]^ga)&Z^ga;c[F>>2]=ea^ca;c[D>>2]=aa^_;c[B>>2]=y^C;c[z>>2]=G^ia;c[x>>2]=ha^fa;c[v>>2]=da^ba;c[i>>2]=$^j;c[t>>2]=w^A;c[u>>2]=E^H;H=c[a>>2]|0;E=c[d>>2]|0;A=c[k>>2]|0;w=c[l>>2]|0;j=c[m>>2]|0;$=c[n>>2]|0;ba=c[o>>2]|0;da=c[p>>2]|0;fa=c[q>>2]|0;ha=c[r>>2]|0;ia=(h^8)+-1>>31;G=(c[1184+(b*960|0)+844>>2]^E)&ia;C=(c[1184+(b*960|0)+848>>2]^A)&ia;y=(c[1184+(b*960|0)+852>>2]^w)&ia;h=(c[1184+(b*960|0)+856>>2]^j)&ia;_=(c[1184+(b*960|0)+860>>2]^$)&ia;aa=(c[1184+(b*960|0)+864>>2]^ba)&ia;ca=(c[1184+(b*960|0)+868>>2]^da)&ia;ea=(c[1184+(b*960|0)+872>>2]^fa)&ia;ga=(c[1184+(b*960|0)+876>>2]^ha)&ia;c[a>>2]=(c[1184+(b*960|0)+840>>2]^H)&ia^H;c[d>>2]=G^E;c[k>>2]=C^A;c[l>>2]=y^w;c[m>>2]=h^j;c[n>>2]=_^$;c[o>>2]=aa^ba;c[p>>2]=ca^da;c[q>>2]=ea^fa;c[r>>2]=ga^ha;ha=c[e>>2]|0;ga=c[f>>2]|0;fa=c[W>>2]|0;ea=c[U>>2]|0;da=c[S>>2]|0;ca=c[Q>>2]|0;ba=c[O>>2]|0;aa=c[M>>2]|0;$=c[K>>2]|0;_=c[I>>2]|0;j=(c[1184+(b*960|0)+884>>2]^ga)&ia;h=(c[1184+(b*960|0)+888>>2]^fa)&ia;w=(c[1184+(b*960|0)+892>>2]^ea)&ia;y=(c[1184+(b*960|0)+896>>2]^da)&ia;A=(c[1184+(b*960|0)+900>>2]^ca)&ia;C=(c[1184+(b*960|0)+904>>2]^ba)&ia;E=(c[1184+(b*960|0)+908>>2]^aa)&ia;G=(c[1184+(b*960|0)+912>>2]^$)&ia;H=(c[1184+(b*960|0)+916>>2]^_)&ia;ha=(c[1184+(b*960|0)+880>>2]^ha)&ia^ha;c[e>>2]=ha;ga=j^ga;c[f>>2]=ga;fa=h^fa;c[W>>2]=fa;ea=w^ea;c[U>>2]=ea;da=y^da;c[S>>2]=da;ca=A^ca;c[Q>>2]=ca;ba=C^ba;c[O>>2]=ba;aa=E^aa;c[M>>2]=aa;$=G^$;c[K>>2]=$;_=H^_;c[I>>2]=_;H=c[g>>2]|0;G=c[F>>2]|0;E=c[D>>2]|0;C=c[B>>2]|0;A=c[z>>2]|0;y=c[x>>2]|0;w=c[v>>2]|0;h=c[i>>2]|0;j=c[t>>2]|0;Z=c[u>>2]|0;J=(c[1184+(b*960|0)+924>>2]^G)&ia;L=(c[1184+(b*960|0)+928>>2]^E)&ia;N=(c[1184+(b*960|0)+932>>2]^C)&ia;P=(c[1184+(b*960|0)+936>>2]^A)&ia;R=(c[1184+(b*960|0)+940>>2]^y)&ia;T=(c[1184+(b*960|0)+944>>2]^w)&ia;V=(c[1184+(b*960|0)+948>>2]^h)&ia;X=(c[1184+(b*960|0)+952>>2]^j)&ia;Y=(c[1184+(b*960|0)+956>>2]^Z)&ia;H=(c[1184+(b*960|0)+920>>2]^H)&ia^H;c[g>>2]=H;G=J^G;c[F>>2]=G;E=L^E;c[D>>2]=E;C=N^C;c[B>>2]=C;A=P^A;c[z>>2]=A;y=R^y;c[x>>2]=y;w=T^w;c[v>>2]=w;h=V^h;c[i>>2]=h;j=X^j;c[t>>2]=j;b=Y^Z;c[u>>2]=b;Z=c[a>>2]|0;Y=c[d>>2]|0;X=c[k>>2]|0;V=c[l>>2]|0;T=c[m>>2]|0;R=c[n>>2]|0;P=c[o>>2]|0;N=c[p>>2]|0;L=c[q>>2]|0;J=c[r>>2]|0;c[a>>2]=(ha^Z)&s^Z;c[d>>2]=(ga^Y)&s^Y;c[k>>2]=(fa^X)&s^X;c[l>>2]=(ea^V)&s^V;c[m>>2]=(da^T)&s^T;c[n>>2]=(ca^R)&s^R;c[o>>2]=(ba^P)&s^P;c[p>>2]=(aa^N)&s^N;c[q>>2]=($^L)&s^L;c[r>>2]=(_^J)&s^J;d=c[e>>2]|0;a=c[f>>2]|0;r=c[W>>2]|0;q=c[U>>2]|0;p=c[S>>2]|0;o=c[Q>>2]|0;n=c[O>>2]|0;m=c[M>>2]|0;l=c[K>>2]|0;k=c[I>>2]|0;c[e>>2]=(Z^d)&s^d;c[f>>2]=(Y^a)&s^a;c[W>>2]=(X^r)&s^r;c[U>>2]=(V^q)&s^q;c[S>>2]=(T^p)&s^p;c[Q>>2]=(R^o)&s^o;c[O>>2]=(P^n)&s^n;c[M>>2]=(N^m)&s^m;c[K>>2]=(L^l)&s^l;c[I>>2]=(J^k)&s^k;f=c[g>>2]|0;k=c[F>>2]|0;l=c[D>>2]|0;m=c[B>>2]|0;n=c[z>>2]|0;o=c[x>>2]|0;p=c[v>>2]|0;q=c[i>>2]|0;r=c[t>>2]|0;a=c[u>>2]|0;c[g>>2]=(f^0-H)&s^f;c[F>>2]=(k^0-G)&s^k;c[D>>2]=(l^0-E)&s^l;c[B>>2]=(m^0-C)&s^m;c[z>>2]=(n^0-A)&s^n;c[x>>2]=(o^0-y)&s^o;c[v>>2]=(p^0-w)&s^p;c[i>>2]=(q^0-h)&s^q;c[t>>2]=(r^0-j)&s^r;c[u>>2]=(a^0-b)&s^a;return}function Tc(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;g=i;e=i=i+63&-64;i=i+240|0;d=e+80|0;f=e+40|0;if(Nc(d,b)|0){f=-1;i=g;return f|0}y=e+4|0;c[y>>2]=0;c[y+4>>2]=0;c[y+8>>2]=0;c[y+12>>2]=0;c[y+16>>2]=0;c[y+20>>2]=0;c[y+24>>2]=0;c[y+28>>2]=0;q=d+40|0;p=d+44|0;n=d+48|0;m=d+52|0;l=d+56|0;k=d+60|0;j=d+64|0;h=d+68|0;r=d+72|0;b=d+76|0;z=0-(c[p>>2]|0)|0;x=0-(c[n>>2]|0)|0;w=0-(c[m>>2]|0)|0;v=0-(c[l>>2]|0)|0;u=0-(c[k>>2]|0)|0;t=0-(c[j>>2]|0)|0;s=0-(c[h>>2]|0)|0;d=0-(c[r>>2]|0)|0;o=0-(c[b>>2]|0)|0;c[e>>2]=1-(c[q>>2]|0);c[y>>2]=z;c[e+8>>2]=x;c[e+12>>2]=w;c[e+16>>2]=v;c[e+20>>2]=u;c[e+24>>2]=t;c[e+28>>2]=s;c[e+32>>2]=d;c[e+36>>2]=o;Ic(e,e);o=f+4|0;c[o>>2]=0;c[o+4>>2]=0;c[o+8>>2]=0;c[o+12>>2]=0;c[o+16>>2]=0;c[o+20>>2]=0;c[o+24>>2]=0;c[o+28>>2]=0;p=c[p>>2]|0;n=c[n>>2]|0;m=c[m>>2]|0;l=c[l>>2]|0;k=c[k>>2]|0;j=c[j>>2]|0;h=c[h>>2]|0;d=c[r>>2]|0;b=c[b>>2]|0;c[f>>2]=(c[q>>2]|0)+1;c[o>>2]=p;c[f+8>>2]=n;c[f+12>>2]=m;c[f+16>>2]=l;c[f+20>>2]=k;c[f+24>>2]=j;c[f+28>>2]=h;c[f+32>>2]=d;c[f+36>>2]=b;Jc(f,f,e);Lc(a,f);f=0;i=g;return f|0}function Uc(b,e){b=b|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0;k=i;g=i=i+63&-64;i=i+272|0;h=g;g=g+208|0;f=h+64|0;j=h;l=8;m=j+64|0;do{c[j>>2]=c[l>>2];j=j+4|0;l=l+4|0}while((j|0)<(m|0));j=h+72|0;c[j>>2]=256;c[j+4>>2]=0;j=f;c[j>>2]=0;c[j+4>>2]=0;j=h+80|0;l=e;m=j+32|0;do{a[j>>0]=a[l>>0]|0;j=j+1|0;l=l+1|0}while((j|0)<(m|0));gb(h,g);a[g>>0]=(d[g>>0]|0)&248;j=g+31|0;a[j>>0]=(d[j>>0]|0)&63|64;j=b;l=g;m=j+32|0;do{a[j>>0]=a[l>>0]|0;j=j+1|0;l=l+1|0}while((j|0)<(m|0));i=k;return 0}function="" vc(b,e,f,g,h){b="b|0;e=e|0;f=f|0;g=g|0;h=h|0;var" j="0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0,fb=0,gb=0,hb=0,ib=0,jb=0,kb=0,lb=0,mb=0,nb=0,ob=0,pb=0,qb=0,rb=0;Qa=i;j=i=i+63&-64;i=i+3024|0;Ma=j+2800|0;Na=j+2544|0;Oa=j+2288|0;k=j+2248|0;Ja=j+968|0;Ka=j+808|0;La=j+648|0;t=j+488|0;n=j;p=j+2952|0;Pa=j+2920|0;s=j+328|0;j=j+208|0;if((d[b+63">>0]|0)>31){b=-1;i=Qa;return b|0}if(Nc(s,h)|0){b=-1;i=Qa;return b|0}if(!((a[h+31>>0]|(a[h+30>>0]|(a[h+29>>0]|(a[h+28>>0]|(a[h+27>>0]|(a[h+26>>0]|(a[h+25>>0]|(a[h+24>>0]|(a[h+23>>0]|(a[h+22>>0]|(a[h+21>>0]|(a[h+20>>0]|(a[h+19>>0]|(a[h+18>>0]|(a[h+17>>0]|(a[h+16>>0]|(a[h+15>>0]|(a[h+14>>0]|(a[h+13>>0]|(a[h+12>>0]|(a[h+11>>0]|(a[h+10>>0]|(a[h+9>>0]|(a[h+8>>0]|(a[h+7>>0]|(a[h+6>>0]|(a[h+5>>0]|(a[h+4>>0]|(a[h+3>>0]|(a[h+2>>0]|(a[h+1>>0]|a[h>>0])))))))))))))))))))))))))))))))<<24>>24)){b=-1;i=Qa;return b|0}l=n+64|0;q=l;c[q>>2]=0;c[q+4>>2]=0;q=n;o=8;r=q+64|0;do{c[q>>2]=c[o>>2];q=q+4|0;o=o+4|0}while((q|0)<(r|0));m=n+72|0;q=m;c[q>>2]=256;c[q+4>>2]=0;q=l;c[q>>2]=0;c[q+4>>2]=0;q=n+80|0;o=b;r=q+32|0;do{a[q>>0]=a[o>>0]|0;q=q+1|0;o=o+1|0}while((q|0)<(r|0));q=m;c[q>>2]=512;c[q+4>>2]=0;q=l;c[q>>2]=0;c[q+4>>2]=0;q=n+112|0;o=h;r=q+32|0;do{a[q>>0]=a[o>>0]|0;q=q+1|0;o=o+1|0}while((q|0)<(r|0));fb(n,e,f,g);gb(n,p);wc(p);f=0;do{a[na+f>>0]=(d[p+(f>>3)>>0]|0)>>>(f&7)&1;f=f+1|0}while((f|0)!=256);p=b+32|0;o=0;while(1){e=Na+o|0;a:do if(a[e>>0]|0){h=1;do{g=h+o|0;if((g|0)>=256)break a;m=Na+g|0;f=a[m>>0]|0;b:do if(f<<24>>24){n=a[e>>0]|0;f=f<<24>>24<>0]=l;a[m>>0]=0;break}f=n-f|0;if((f|0)<=-16)break a;a[e="">>0]=f;while(1){f=Na+g|0;if(!(a[f>>0]|0))break;a[f>>0]=0;g=g+1|0;if((g|0)>=256)break b}a[f>>0]=1}while(0);h=h+1|0}while((h|0)<7)}while(0);o=o+1|0;if((o|0)==256){f=0;break}}do{a[oa+f>>0]=(d[p+(f>>3)>>0]|0)>>>(f&7)&1;f=f+1|0}while((f|0)!=256);o=0;do{e=Oa+o|0;c:do if(a[e>>0]|0){h=1;do{g=h+o|0;if((g|0)>=256)break c;m=Oa+g|0;f=a[m>>0]|0;d:do if(f<<24>>24){n=a[e>>0]|0;f=f<<24>>24<>0]=l;a[m>>0]=0;break}f=n-f|0;if((f|0)<=-16)break c;a[e="">>0]=f;while(1){f=Oa+g|0;if(!(a[f>>0]|0))break;a[f>>0]=0;g=g+1|0;if((g|0)>=256)break d}a[f>>0]=1}while(0);h=h+1|0}while((h|0)<7)}while(0);o=o+1|0}while((o|0)!=256);qc(ja,s);ia=c[s+4>>2]|0;r=c[s+8>>2]|0;q=c[s+12>>2]|0;Ga=c[s+16>>2]|0;Fa=c[s+20>>2]|0;Ea=c[s+24>>2]|0;Da=c[s+28>>2]|0;Ca=c[s+32>>2]|0;Ba=c[s+36>>2]|0;c[Ma>>2]=c[s>>2];c[Ma+4>>2]=Ia;c[Ma+8>>2]=r;c[Ma+12>>2]=q;c[Ma+16>>2]=Ga;c[Ma+20>>2]=Fa;c[Ma+24>>2]=Ea;c[Ma+28>>2]=Da;c[Ma+32>>2]=Ca;c[Ma+36>>2]=Ba;Ba=c[s+44>>2]|0;Ca=c[s+48>>2]|0;Da=c[s+52>>2]|0;Ea=c[s+56>>2]|0;Fa=c[s+60>>2]|0;Ga=c[s+64>>2]|0;q=c[s+68>>2]|0;r=c[s+72>>2]|0;Ia=c[s+76>>2]|0;c[Ma+40>>2]=c[s+40>>2];c[Ma+44>>2]=Ba;c[Ma+48>>2]=Ca;c[Ma+52>>2]=Da;c[Ma+56>>2]=Ea;c[Ma+60>>2]=Fa;c[Ma+64>>2]=Ga;c[Ma+68>>2]=q;c[Ma+72>>2]=r;c[Ma+76>>2]=Ia;Ia=c[s+84>>2]|0;r=c[s+88>>2]|0;q=c[s+92>>2]|0;Ga=c[s+96>>2]|0;Fa=c[s+100>>2]|0;Ea=c[s+104>>2]|0;Da=c[s+108>>2]|0;Ca=c[s+112>>2]|0;Ba=c[s+116>>2]|0;c[Ma+80>>2]=c[s+80>>2];c[Ma+84>>2]=Ia;c[Ma+88>>2]=r;c[Ma+92>>2]=q;c[Ma+96>>2]=Ga;c[Ma+100>>2]=Fa;c[Ma+104>>2]=Ea;c[Ma+108>>2]=Da;c[Ma+112>>2]=Ca;c[Ma+116>>2]=Ba;Pc(Ka,Ma);Ba=Ka+120|0;Jc(t,Ka,Ba);Ca=Ka+40|0;Da=Ka+80|0;Jc(t+40|0,Ca,Da);Jc(t+80|0,Da,Ba);Jc(t+120|0,Ka,Ca);Mc(Ka,t,Ja);Jc(La,Ka,Ba);Ea=La+40|0;Jc(Ea,Ca,Da);Fa=La+80|0;Jc(Fa,Da,Ba);Ga=La+120|0;Jc(Ga,Ka,Ca);q=Ja+160|0;Qc(q,La);Mc(Ka,t,q);Jc(La,Ka,Ba);Jc(Ea,Ca,Da);Jc(Fa,Da,Ba);Jc(Ga,Ka,Ca);q=Ja+320|0;Qc(q,La);Mc(Ka,t,q);Jc(La,Ka,Ba);Jc(Ea,Ca,Da);Jc(Fa,Da,Ba);Jc(Ga,Ka,Ca);q=Ja+480|0;Qc(q,La);Mc(Ka,t,q);Jc(La,Ka,Ba);Jc(Ea,Ca,Da);Jc(Fa,Da,Ba);Jc(Ga,Ka,Ca);q=Ja+640|0;Qc(q,La);Mc(Ka,t,q);Jc(La,Ka,Ba);Jc(Ea,Ca,Da);Jc(Fa,Da,Ba);Jc(Ga,Ka,Ca);q=Ja+800|0;Qc(q,La);Mc(Ka,t,q);Jc(La,Ka,Ba);Jc(Ea,Ca,Da);Jc(Fa,Da,Ba);Jc(Ga,Ka,Ca);q=Ja+960|0;Qc(q,La);Mc(Ka,t,q);Jc(La,Ka,Ba);Jc(Ea,Ca,Da);Jc(Fa,Da,Ba);Jc(Ga,Ka,Ca);Qc(Ja+1120|0,La);q=j;r=q+40|0;do{c[q>>2]=0;q=q+4|0}while((q|0)<(r|0));ha=j+40|0;c[ha>>2]=1;q=j+44|0;r=q+36|0;do{c[q>>2]=0;q=q+4|0}while((q|0)<(r|0));ia=j+80|0;c[ia>>2]=1;q=j+84|0;r=q+36|0;do{c[q>>2]=0;q=q+4|0}while((q|0)<(r|0));g=255;while(1){if(a[na+g>>0]|0){f=g;break}if(a[Oa+g>>0]|0){f=g;break}f=g+-1|0;if((g|0)>0)g=f;else break}if((f|0)>-1){l=La+44|0;m=La+48|0;n=La+52|0;e=La+56|0;h=La+60|0;o=La+64|0;p=La+68|0;q=La+72|0;r=La+76|0;s=La+4|0;t=La+8|0;u=La+12|0;v=La+16|0;w=La+20|0;x=La+24|0;y=La+28|0;z=La+32|0;A=La+36|0;B=Ka+4|0;C=Ka+8|0;D=Ka+12|0;E=Ka+16|0;F=Ka+20|0;G=Ka+24|0;H=Ka+28|0;I=Ka+32|0;J=Ka+36|0;K=Ka+44|0;L=Ka+48|0;M=Ka+52|0;N=Ka+56|0;O=Ka+60|0;P=Ka+64|0;Q=Ka+68|0;R=Ka+72|0;S=Ka+76|0;T=La+84|0;U=La+88|0;V=La+92|0;W=La+96|0;X=La+100|0;Y=La+104|0;Z=La+108|0;_=La+112|0;$=La+116|0;aa=k+4|0;ba=k+8|0;ca=k+12|0;da=k+16|0;ea=k+20|0;fa=k+24|0;ga=k+28|0;ha=k+32|0;ia=k+36|0;ja=Ka+84|0;ka=Ka+88|0;la=Ka+92|0;ma=Ka+96|0;na=Ka+100|0;oa=Ka+104|0;pa=Ka+108|0;qa=Ka+112|0;ra=Ka+116|0;sa=Ka+124|0;ta=Ka+128|0;ua=Ka+132|0;va=Ka+136|0;wa=Ka+140|0;xa=Ka+144|0;ya=Ka+148|0;za=Ka+152|0;Aa=Ka+156|0;while(1){Pc(Ka,j);g=a[Na+f>>0]|0;if(g<<24>>24<=0){if(g<<24>>24<0){jc(la,ka,ba);jc(ea,ca,da);jc(fa,da,ba);jc(ga,ka,ca);hb=(g<<24>>24|0)/-2|0;rb=c[Ea>>2]|0;Xa=c[l>>2]|0;Ta=c[m>>2]|0;ib=c[n>>2]|0;mb=c[e>>2]|0;qb=c[h>>2]|0;$a=c[o>>2]|0;bb=c[p>>2]|0;db=c[q>>2]|0;fb=c[r>>2]|0;Za=c[La>>2]|0;Va=c[s>>2]|0;Ra=c[t>>2]|0;kb=c[u>>2]|0;ob=c[v>>2]|0;_a=c[w>>2]|0;ab=c[x>>2]|0;cb=c[y>>2]|0;eb=c[z>>2]|0;gb=c[A>>2]|0;c[Ka>>2]=Za+rb;c[B>>2]=Va+Xa;c[C>>2]=Ra+Ta;c[D>>2]=kb+ib;c[E>>2]=ob+mb;c[F>>2]=_a+qb;c[G>>2]=ab+$a;c[H>>2]=cb+bb;c[I>>2]=eb+db;c[J>>2]=gb+fb;c[Ca>>2]=rb-Za;c[K>>2]=Xa-Va;c[L>>2]=Ta-Ra;c[M>>2]=ib-kb;c[N>>2]=mb-ob;c[O>>2]=qb-_a;c[P>>2]=$a-ab;c[Q>>2]=bb-cb;c[R>>2]=db-eb;c[S>>2]=fb-gb;Jc(Da,Ka,Ja+(hb*160|0)+40|0);Jc(Ca,Ca,Ja+(hb*160|0)|0);Jc(Ba,Ja+(hb*160|0)+120|0,Ga);Jc(Ka,Fa,Ja+(hb*160|0)+80|0);hb=c[Ka>>2]<<1;gb=c[b>>2]<<1;fb=c[c>>2]<<1;eb=c[d>>2]<<1;db=c[e>>2]<<1;cb=c[f>>2]<<1;bb=c[g>>2]<<1;ab=c[h>>2]<<1;$a=c[i>>2]<<1;_a=c[j>>2]<<1;c[k>>2]=hb;c[aa>>2]=gb;c[ba>>2]=fb;c[ca>>2]=eb;c[da>>2]=db;c[ea>>2]=cb;c[fa>>2]=bb;c[ga>>2]=ab;c[ha>>2]=$a;c[ia>>2]=_a;qb=c[Da>>2]|0;ob=c[ja>>2]|0;mb=c[ka>>2]|0;kb=c[la>>2]|0;ib=c[ma>>2]|0;Ra=c[na>>2]|0;Ta=c[oa>>2]|0;Va=c[pa>>2]|0;Xa=c[qa>>2]|0;Za=c[ra>>2]|0;rb=c[Ca>>2]|0;pb=c[K>>2]|0;nb=c[L>>2]|0;lb=c[M>>2]|0;jb=c[N>>2]|0;g=c[O>>2]|0;Sa=c[P>>2]|0;Ua=c[Q>>2]|0;Wa=c[R>>2]|0;Ya=c[S>>2]|0;c[Ka>>2]=qb-rb;c[B>>2]=ob-pb;c[C>>2]=mb-nb;c[D>>2]=kb-lb;c[E>>2]=ib-jb;c[F>>2]=Ra-g;c[G>>2]=Ta-Sa;c[H>>2]=Va-Ua;c[I>>2]=Xa-Wa;c[J>>2]=Za-Ya;c[Ca>>2]=rb+qb;c[K>>2]=pb+ob;c[L>>2]=nb+mb;c[M>>2]=lb+kb;c[N>>2]=jb+ib;c[O>>2]=g+Ra;c[P>>2]=Sa+Ta;c[Q>>2]=Ua+Va;c[R>>2]=Wa+Xa;c[S>>2]=Ya+Za;Za=c[Ba>>2]|0;Ya=c[sa>>2]|0;Xa=c[ta>>2]|0;Wa=c[ua>>2]|0;Va=c[va>>2]|0;Ua=c[wa>>2]|0;Ta=c[xa>>2]|0;Sa=c[ya>>2]|0;Ra=c[za>>2]|0;g=c[Aa>>2]|0;c[Da>>2]=hb-Za;c[ja>>2]=gb-Ya;c[ka>>2]=fb-Xa;c[la>>2]=eb-Wa;c[ma>>2]=db-Va;c[na>>2]=cb-Ua;c[oa>>2]=bb-Ta;c[pa>>2]=ab-Sa;c[qa>>2]=$a-Ra;c[ra>>2]=_a-g;Ya=Ya+(c[aa>>2]|0)|0;Xa=Xa+(c[ba>>2]|0)|0;Wa=Wa+(c[ca>>2]|0)|0;Va=Va+(c[da>>2]|0)|0;Ua=Ua+(c[ea>>2]|0)|0;Ta=Ta+(c[fa>>2]|0)|0;Sa=Sa+(c[ga>>2]|0)|0;Ra=Ra+(c[ha>>2]|0)|0;g=g+(c[ia>>2]|0)|0;c[Ba>>2]=Za+(c[k>>2]|0);c[sa>>2]=Ya;c[ta>>2]=Xa;c[ua>>2]=Wa;c[va>>2]=Va;c[wa>>2]=Ua;c[xa>>2]=Ta;c[ya>>2]=Sa;c[za>>2]=Ra;c[Aa>>2]=g}}else{Jc(La,Ka,Ba);Jc(Ea,Ca,Da);Jc(Fa,Da,Ba);Jc(Ga,Ka,Ca);Mc(Ka,La,Ja+(((g<<24>>24|0)/2|0)*160|0)|0)}g=a[Oa+f>>0]|0;if(g<<24>>24<=0){if(g<<24>>24<0){jc(la,ka,ba);jc(ea,ca,da);jc(fa,da,ba);jc(ga,ka,ca);_a=(g<<24>>24|0)/-2|0;g=c[Ea>>2]|0;kb=c[l>>2]|0;ob=c[m>>2]|0;Za=c[n>>2]|0;Va=c[e>>2]|0;Ra=c[h>>2]|0;gb=c[o>>2]|0;eb=c[p>>2]|0;cb=c[q>>2]|0;ab=c[r>>2]|0;ib=c[La>>2]|0;mb=c[s>>2]|0;qb=c[t>>2]|0;Xa=c[u>>2]|0;Ta=c[v>>2]|0;hb=c[w>>2]|0;fb=c[x>>2]|0;db=c[y>>2]|0;bb=c[z>>2]|0;$a=c[A>>2]|0;c[Ka>>2]=ib+g;c[B>>2]=mb+kb;c[C>>2]=qb+ob;c[D>>2]=Xa+Za;c[E>>2]=Ta+Va;c[F>>2]=hb+Ra;c[G>>2]=fb+gb;c[H>>2]=db+eb;c[I>>2]=bb+cb;c[J>>2]=$a+ab;c[Ca>>2]=g-ib;c[K>>2]=kb-mb;c[L>>2]=ob-qb;c[M>>2]=Za-Xa;c[N>>2]=Va-Ta;c[O>>2]=Ra-hb;c[P>>2]=gb-fb;c[Q>>2]=eb-db;c[R>>2]=cb-bb;c[S>>2]=ab-$a;Jc(Da,Ka,104+(_a*120|0)+40|0);Jc(Ca,Ca,104+(_a*120|0)|0);Jc(Ba,104+(_a*120|0)+80|0,Ga);_a=c[Fa>>2]<<1;$a=c[t>>2]<<1;ab=c[u>>2]<<1;bb=c[v>>2]<<1;cb=c[w>>2]<<1;db=c[x>>2]<<1;eb=c[y>>2]<<1;fb=c[z>>2]<<1;gb=c[_>>2]<<1;hb=c[$>>2]<<1;c[k>>2]=_a;c[aa>>2]=$a;c[ba>>2]=ab;c[ca>>2]=bb;c[da>>2]=cb;c[ea>>2]=db;c[fa>>2]=eb;c[ga>>2]=fb;c[ha>>2]=gb;c[ia>>2]=hb;Ra=c[Da>>2]|0;Ta=c[ja>>2]|0;Va=c[ka>>2]|0;Xa=c[la>>2]|0;Za=c[ma>>2]|0;qb=c[na>>2]|0;ob=c[oa>>2]|0;mb=c[pa>>2]|0;kb=c[qa>>2]|0;ib=c[ra>>2]|0;g=c[Ca>>2]|0;Sa=c[K>>2]|0;Ua=c[L>>2]|0;Wa=c[M>>2]|0;Ya=c[N>>2]|0;rb=c[O>>2]|0;pb=c[P>>2]|0;nb=c[Q>>2]|0;lb=c[R>>2]|0;jb=c[S>>2]|0;c[Ka>>2]=Ra-g;c[B>>2]=Ta-Sa;c[C>>2]=Va-Ua;c[D>>2]=Xa-Wa;c[E>>2]=Za-Ya;c[F>>2]=qb-rb;c[G>>2]=ob-pb;c[H>>2]=mb-nb;c[I>>2]=kb-lb;c[J>>2]=ib-jb;c[Ca>>2]=g+Ra;c[K>>2]=Sa+Ta;c[L>>2]=Ua+Va;c[M>>2]=Wa+Xa;c[N>>2]=Ya+Za;c[O>>2]=rb+qb;c[P>>2]=pb+ob;c[Q>>2]=nb+mb;c[R>>2]=lb+kb;c[S>>2]=jb+ib;ib=c[Ba>>2]|0;jb=c[sa>>2]|0;kb=c[ta>>2]|0;lb=c[ua>>2]|0;mb=c[va>>2]|0;nb=c[wa>>2]|0;ob=c[xa>>2]|0;pb=c[ya>>2]|0;qb=c[za>>2]|0;rb=c[Aa>>2]|0;c[Da>>2]=_a-ib;c[ja>>2]=$a-jb;c[ka>>2]=ab-kb;c[la>>2]=bb-lb;c[ma>>2]=cb-mb;c[na>>2]=db-nb;c[oa>>2]=eb-ob;c[pa>>2]=fb-pb;c[qa>>2]=gb-qb;c[ra>>2]=hb-rb;jb=jb+(c[aa>>2]|0)|0;kb=kb+(c[ba>>2]|0)|0;lb=lb+(c[ca>>2]|0)|0;mb=mb+(c[da>>2]|0)|0;nb=nb+(c[ea>>2]|0)|0;ob=ob+(c[fa>>2]|0)|0;pb=pb+(c[ga>>2]|0)|0;qb=qb+(c[ha>>2]|0)|0;rb=rb+(c[ia>>2]|0)|0;c[Ba>>2]=ib+(c[k>>2]|0);c[sa>>2]=jb;c[ta>>2]=kb;c[ua>>2]=lb;c[va>>2]=mb;c[wa>>2]=nb;c[xa>>2]=ob;c[ya>>2]=pb;c[za>>2]=qb;c[Aa>>2]=rb}}else{Jc(La,Ka,Ba);Jc(Ea,Ca,Da);Jc(Fa,Da,Ba);Jc(Ga,Ka,Ca);Oc(Ka,La,104+(((g<<24>>24|0)/2|0)*120|0)|0)}Jc(j,Ka,Ba);Jc(Ha,Ca,Da);Jc(Ia,Da,Ba);if((f|0)>0)f=f+-1|0;else break}}Ic(k,Ia);Jc(Na,j,k);Jc(Oa,Ha,k);Lc(Pa,Oa);Lc(Ma,Na);j=Pa+31|0;a[j>>0]=d[j>>0]^d[Ma>>0]<<7;j=yc(pa,b)|0;k=(pa|0)==(b|0);f=0;g=0;do{f=a[pa+g>>0]^a[b+g>>0]|f;g=g+1|0}while((g|0)!=32);rb=(k?-1:j)|(((f&255)+511|0)>>>8&1)+-1;i=Qa;return rb|0}function Wc(b){b=b|0;var c=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0,fb=0,gb=0;ea=b+1|0;ba=b+2|0;D=a[ba>>0]|0;f=d[b>>0]|0;n=Hd(d[ea>>0]|0|0,0,8)|0;va=C;D=D&255;V=Hd(D|0,0,16)|0;aa=b+3|0;y=Hd(d[aa>>0]|0|0,0,8)|0;ga=C;$=b+4|0;U=Hd(d[$>>0]|0|0,0,16)|0;ga=ga|C;Y=b+5|0;N=d[Y>>0]|0;X=Hd(N|0,0,24)|0;ga=Gd(y|D|U|X|0,ga|C|0,5)|0;X=b+6|0;U=b+7|0;D=a[U>>0]|0;y=Hd(d[X>>0]|0|0,0,8)|0;Ba=C;D=D&255;T=Hd(D|0,0,16)|0;Ba=Gd(y|N|T|0,Ba|C|0,2)|0;T=b+8|0;N=Hd(d[T>>0]|0|0,0,8)|0;y=C;S=b+9|0;Ca=Hd(d[S>>0]|0|0,0,16)|0;y=y|C;P=b+10|0;Sa=d[P>>0]|0;O=Hd(Sa|0,0,24)|0;y=Gd(N|D|Ca|O|0,y|C|0,7)|0;O=b+11|0;Ca=Hd(d[O>>0]|0|0,0,8)|0;D=C;N=b+12|0;G=Hd(d[N>>0]|0|0,0,16)|0;D=D|C;K=b+13|0;u=d[K>>0]|0;J=Hd(u|0,0,24)|0;D=Gd(Ca|Sa|G|J|0,D|C|0,4)|0;J=b+14|0;G=b+15|0;Sa=a[G>>0]|0;Ca=Hd(d[J>>0]|0|0,0,8)|0;Da=C;Sa=Sa&255;F=Hd(Sa|0,0,16)|0;Da=Gd(Ca|u|F|0,Da|C|0,1)|0;F=b+16|0;u=Hd(d[F>>0]|0|0,0,8)|0;Ca=C;E=b+17|0;w=Hd(d[E>>0]|0|0,0,16)|0;Ca=Ca|C;A=b+18|0;v=d[A>>0]|0;z=Hd(v|0,0,24)|0;Ca=Gd(u|Sa|w|z|0,Ca|C|0,6)|0;z=b+19|0;w=b+20|0;Sa=a[w>>0]|0;u=Hd(d[z>>0]|0|0,0,8)|0;Ta=C;Sa=Hd(Sa&255|0,0,16)|0;Ta=Gd(u|v|Sa|0,Ta|C|0,3)|0;Sa=C;v=b+21|0;u=b+22|0;r=b+23|0;na=a[r>>0]|0;ab=d[v>>0]|0;bb=Hd(d[u>>0]|0|0,0,8)|0;_a=C;na=na&255;$a=Hd(na|0,0,16)|0;q=b+24|0;Ka=Hd(d[q>>0]|0|0,0,8)|0;Pa=C;p=b+25|0;i=Hd(d[p>>0]|0|0,0,16)|0;Pa=Pa|C;m=b+26|0;xa=d[m>>0]|0;l=Hd(xa|0,0,24)|0;Pa=Gd(Ka|na|i|l|0,Pa|C|0,5)|0;l=b+27|0;i=b+28|0;na=a[i>>0]|0;Ka=Hd(d[l>>0]|0|0,0,8)|0;Za=C;na=na&255;h=Hd(na|0,0,16)|0;Za=Gd(Ka|xa|h|0,Za|C|0,2)|0;h=b+29|0;xa=Hd(d[h>>0]|0|0,0,8)|0;Ka=C;g=b+30|0;fb=Hd(d[g>>0]|0|0,0,16)|0;Ka=Ka|C;c=b+31|0;qa=d[c>>0]|0;oa=Hd(qa|0,0,24)|0;Ka=Gd(xa|na|fb|oa|0,Ka|C|0,7)|0;oa=Hd(d[b+32>>0]|0|0,0,8)|0;fb=C;na=Hd(d[b+33>>0]|0|0,0,16)|0;fb=fb|C;xa=d[b+34>>0]|0;la=Hd(xa|0,0,24)|0;fb=Gd(oa|qa|na|la|0,fb|C|0,4)|0;la=a[b+36>>0]|0;na=Hd(d[b+35>>0]|0|0,0,8)|0;qa=C;la=la&255;oa=Hd(la|0,0,16)|0;qa=Gd(na|xa|oa|0,qa|C|0,1)|0;oa=Hd(d[b+37>>0]|0|0,0,8)|0;xa=C;na=Hd(d[b+38>>0]|0|0,0,16)|0;xa=xa|C;Ma=d[b+39>>0]|0;fa=Hd(Ma|0,0,24)|0;xa=Gd(oa|la|na|fa|0,xa|C|0,6)|0;fa=a[b+41>>0]|0;na=Hd(d[b+40>>0]|0|0,0,8)|0;la=C;fa=Hd(fa&255|0,0,16)|0;la=Gd(na|Ma|fa|0,la|C|0,3)|0;fa=C;Ma=a[b+44>>0]|0;na=d[b+42>>0]|0;oa=Hd(d[b+43>>0]|0|0,0,8)|0;j=C;Ma=Ma&255;za=Hd(Ma|0,0,16)|0;ja=Hd(d[b+45>>0]|0|0,0,8)|0;L=C;W=Hd(d[b+46>>0]|0|0,0,16)|0;L=L|C;gb=d[b+47>>0]|0;o=Hd(gb|0,0,24)|0;L=Gd(ja|Ma|W|o|0,L|C|0,5)|0;o=a[b+49>>0]|0;W=Hd(d[b+48>>0]|0|0,0,8)|0;Ma=C;o=o&255;ja=Hd(o|0,0,16)|0;Ma=Gd(W|gb|ja|0,Ma|C|0,2)|0;Ma=Ma&2097151;ja=Hd(d[b+50>>0]|0|0,0,8)|0;gb=C;W=Hd(d[b+51>>0]|0|0,0,16)|0;gb=gb|C;Aa=d[b+52>>0]|0;M=Hd(Aa|0,0,24)|0;gb=Gd(ja|o|W|M|0,gb|C|0,7)|0;gb=gb&2097151;M=Hd(d[b+53>>0]|0|0,0,8)|0;W=C;o=Hd(d[b+54>>0]|0|0,0,16)|0;W=W|C;ja=d[b+55>>0]|0;R=Hd(ja|0,0,24)|0;W=Gd(M|Aa|o|R|0,W|C|0,4)|0;W=W&2097151;R=a[b+57>>0]|0;o=Hd(d[b+56>>0]|0|0,0,8)|0;Aa=C;R=R&255;M=Hd(R|0,0,16)|0;Aa=Gd(o|ja|M|0,Aa|C|0,1)|0;Aa=Aa&2097151;M=Hd(d[b+58>>0]|0|0,0,8)|0;ja=C;o=Hd(d[b+59>>0]|0|0,0,16)|0;ja=ja|C;ha=d[b+60>>0]|0;Q=Hd(ha|0,0,24)|0;ja=Gd(M|R|o|Q|0,ja|C|0,6)|0;ja=ja&2097151;Q=Hd(d[b+61>>0]|0|0,0,8)|0;o=C;R=Hd(d[b+62>>0]|0|0,0,16)|0;o=o|C;M=Hd(d[b+63>>0]|0|0,0,24)|0;o=Gd(Q|ha|R|M|0,o|C|0,3)|0;M=C;R=Od(o|0,M|0,666643,0)|0;ha=C;Q=Od(o|0,M|0,470296,0)|0;I=C;ca=Od(o|0,M|0,654183,0)|0;ta=C;Ea=Od(o|0,M|0,-997805,-1)|0;t=C;k=Od(o|0,M|0,136657,0)|0;B=C;M=Od(o|0,M|0,-683901,-1)|0;j=Dd(M|0,C|0,oa|na|za&2031616|0,j|0)|0;za=C;na=Od(ja|0,0,666643,0)|0;oa=C;M=Od(ja|0,0,470296,0)|0;o=C;Va=Od(ja|0,0,654183,0)|0;s=C;ma=Od(ja|0,0,-997805,-1)|0;_=C;ya=Od(ja|0,0,136657,0)|0;sa=C;ja=Od(ja|0,0,-683901,-1)|0;H=C;e=Od(Aa|0,0,666643,0)|0;ra=C;wa=Od(Aa|0,0,470296,0)|0;La=C;Fa=Od(Aa|0,0,654183,0)|0;da=C;cb=Od(Aa|0,0,-997805,-1)|0;Ua=C;ka=Od(Aa|0,0,136657,0)|0;x=C;Aa=Od(Aa|0,0,-683901,-1)|0;xa=Dd(Aa|0,C|0,xa&2097151|0,0)|0;sa=Dd(xa|0,C|0,ya|0,sa|0)|0;t=Dd(sa|0,C|0,Ea|0,t|0)|0;Ea=C;sa=Od(W|0,0,666643,0)|0;ya=C;xa=Od(W|0,0,470296,0)|0;Aa=C;Wa=Od(W|0,0,654183,0)|0;Z=C;Ha=Od(W|0,0,-997805,-1)|0;Ga=C;eb=Od(W|0,0,136657,0)|0;db=C;W=Od(W|0,0,-683901,-1)|0;pa=C;ia=Od(gb|0,0,666643,0)|0;ua=C;Qa=Od(gb|0,0,470296,0)|0;Ra=C;Oa=Od(gb|0,0,654183,0)|0;Na=C;Ya=Od(gb|0,0,-997805,-1)|0;Xa=C;Ja=Od(gb|0,0,136657,0)|0;Ia=C;gb=Od(gb|0,0,-683901,-1)|0;fb=Dd(gb|0,C|0,fb&2097151|0,0)|0;db=Dd(fb|0,C|0,eb|0,db|0)|0;Ua=Dd(db|0,C|0,cb|0,Ua|0)|0;s=Dd(Ua|0,C|0,Va|0,s|0)|0;I=Dd(s|0,C|0,Q|0,I|0)|0;Q=C;s=Od(Ma|0,0,666643,0)|0;Ca=Dd(s|0,C|0,Ca&2097151|0,0)|0;s=C;Va=Od(Ma|0,0,470296,0)|0;Ua=C;cb=Od(Ma|0,0,654183,0)|0;_a=Dd(cb|0,C|0,bb|ab|$a&2031616|0,_a|0)|0;Ra=Dd(_a|0,C|0,Qa|0,Ra|0)|0;ya=Dd(Ra|0,C|0,sa|0,ya|0)|0;sa=C;Ra=Od(Ma|0,0,-997805,-1)|0;Qa=C;_a=Od(Ma|0,0,136657,0)|0;Za=Dd(_a|0,C|0,Za&2097151|0,0)|0;Xa=Dd(Za|0,C|0,Ya|0,Xa|0)|0;Z=Dd(Xa|0,C|0,Wa|0,Z|0)|0;La=Dd(Z|0,C|0,wa|0,La|0)|0;oa=Dd(La|0,C|0,na|0,oa|0)|0;na=C;Ma=Od(Ma|0,0,-683901,-1)|0;La=C;wa=Dd(Ca|0,s|0,1048576,0)|0;wa=Gd(wa|0,C|0,21)|0;Z=C;Sa=Dd(Va|0,Ua|0,Ta|0,Sa|0)|0;Sa=Dd(Sa|0,C|0,wa|0,Z|0)|0;ua=Dd(Sa|0,C|0,ia|0,ua|0)|0;ia=C;Z=Hd(wa|0,Z|0,21)|0;Z=Cd(Ca|0,s|0,Z|0,C|0)|0;s=C;Ca=Dd(ya|0,sa|0,1048576,0)|0;Ca=Gd(Ca|0,C|0,21)|0;wa=C;Pa=Dd(Ra|0,Qa|0,Pa&2097151|0,0)|0;Na=Dd(Pa|0,C|0,Oa|0,Na|0)|0;Aa=Dd(Na|0,C|0,xa|0,Aa|0)|0;ra=Dd(Aa|0,C|0,e|0,ra|0)|0;ra=Dd(ra|0,C|0,Ca|0,wa|0)|0;e=C;wa=Hd(Ca|0,wa|0,21)|0;Ca=C;Aa=Dd(oa|0,na|0,1048576,0)|0;Aa=Ed(Aa|0,C|0,21)|0;xa=C;Ka=Dd(Ma|0,La|0,Ka&2097151|0,0)|0;Ia=Dd(Ka|0,C|0,Ja|0,Ia|0)|0;Ga=Dd(Ia|0,C|0,Ha|0,Ga|0)|0;da=Dd(Ga|0,C|0,Fa|0,da|0)|0;o=Dd(da|0,C|0,M|0,o|0)|0;ha=Dd(o|0,C|0,R|0,ha|0)|0;ha=Dd(ha|0,C|0,Aa|0,xa|0)|0;R=C;xa=Hd(Aa|0,xa|0,21)|0;Aa=C;o=Dd(I|0,Q|0,1048576,0)|0;o=Ed(o|0,C|0,21)|0;M=C;qa=Dd(W|0,pa|0,qa&2097151|0,0)|0;x=Dd(qa|0,C|0,ka|0,x|0)|0;_=Dd(x|0,C|0,ma|0,_|0)|0;ta=Dd(_|0,C|0,ca|0,ta|0)|0;ta=Dd(ta|0,C|0,o|0,M|0)|0;ca=C;M=Hd(o|0,M|0,21)|0;M=Cd(I|0,Q|0,M|0,C|0)|0;Q=C;I=Dd(t|0,Ea|0,1048576,0)|0;I=Ed(I|0,C|0,21)|0;o=C;fa=Dd(ja|0,H|0,la|0,fa|0)|0;B=Dd(fa|0,C|0,k|0,B|0)|0;B=Dd(B|0,C|0,I|0,o|0)|0;k=C;o=Hd(I|0,o|0,21)|0;o=Cd(t|0,Ea|0,o|0,C|0)|0;Ea=C;t=Dd(j|0,za|0,1048576,0)|0;t=Ed(t|0,C|0,21)|0;I=C;L=Dd(t|0,I|0,L&2097151|0,0)|0;fa=C;I=Hd(t|0,I|0,21)|0;I=Cd(j|0,za|0,I|0,C|0)|0;za=C;j=Dd(ua|0,ia|0,1048576,0)|0;j=Gd(j|0,C|0,21)|0;t=C;la=Hd(j|0,t|0,21)|0;la=Cd(ua|0,ia|0,la|0,C|0)|0;ia=C;ua=Dd(ra|0,e|0,1048576,0)|0;ua=Ed(ua|0,C|0,21)|0;H=C;ja=Hd(ua|0,H|0,21)|0;ja=Cd(ra|0,e|0,ja|0,C|0)|0;e=C;ra=Dd(ha|0,R|0,1048576,0)|0;ra=Ed(ra|0,C|0,21)|0;_=C;Q=Dd(M|0,Q|0,ra|0,_|0)|0;M=C;_=Hd(ra|0,_|0,21)|0;_=Cd(ha|0,R|0,_|0,C|0)|0;R=C;ha=Dd(ta|0,ca|0,1048576,0)|0;ha=Ed(ha|0,C|0,21)|0;ra=C;Ea=Dd(ha|0,ra|0,o|0,Ea|0)|0;o=C;ra=Hd(ha|0,ra|0,21)|0;ra=Cd(ta|0,ca|0,ra|0,C|0)|0;ca=C;ta=Dd(B|0,k|0,1048576,0)|0;ta=Ed(ta|0,C|0,21)|0;ha=C;za=Dd(ta|0,ha|0,I|0,za|0)|0;I=C;ha=Hd(ta|0,ha|0,21)|0;ha=Cd(B|0,k|0,ha|0,C|0)|0;k=C;B=Od(L|0,fa|0,666643,0)|0;Da=Dd(B|0,C|0,Da&2097151|0,0)|0;B=C;ta=Od(L|0,fa|0,470296,0)|0;ta=Dd(Z|0,s|0,ta|0,C|0)|0;s=C;Z=Od(L|0,fa|0,654183,0)|0;Z=Dd(la|0,ia|0,Z|0,C|0)|0;ia=C;la=Od(L|0,fa|0,-997805,-1)|0;ma=C;x=Od(L|0,fa|0,136657,0)|0;x=Dd(ja|0,e|0,x|0,C|0)|0;e=C;fa=Od(L|0,fa|0,-683901,-1)|0;L=C;H=Dd(oa|0,na|0,ua|0,H|0)|0;Aa=Cd(H|0,C|0,xa|0,Aa|0)|0;L=Dd(Aa|0,C|0,fa|0,L|0)|0;fa=C;Aa=Od(za|0,I|0,666643,0)|0;D=Dd(Aa|0,C|0,D&2097151|0,0)|0;Aa=C;xa=Od(za|0,I|0,470296,0)|0;xa=Dd(Da|0,B|0,xa|0,C|0)|0;B=C;Da=Od(za|0,I|0,654183,0)|0;Da=Dd(ta|0,s|0,Da|0,C|0)|0;s=C;ta=Od(za|0,I|0,-997805,-1)|0;ta=Dd(Z|0,ia|0,ta|0,C|0)|0;ia=C;Z=Od(za|0,I|0,136657,0)|0;H=C;I=Od(za|0,I|0,-683901,-1)|0;I=Dd(x|0,e|0,I|0,C|0)|0;e=C;x=Od(ha|0,k|0,666643,0)|0;y=Dd(x|0,C|0,y&2097151|0,0)|0;x=C;za=Od(ha|0,k|0,470296,0)|0;za=Dd(D|0,Aa|0,za|0,C|0)|0;Aa=C;D=Od(ha|0,k|0,654183,0)|0;D=Dd(xa|0,B|0,D|0,C|0)|0;B=C;xa=Od(ha|0,k|0,-997805,-1)|0;xa=Dd(Da|0,s|0,xa|0,C|0)|0;s=C;Da=Od(ha|0,k|0,136657,0)|0;Da=Dd(ta|0,ia|0,Da|0,C|0)|0;ia=C;k=Od(ha|0,k|0,-683901,-1)|0;ha=C;t=Dd(ya|0,sa|0,j|0,t|0)|0;Ca=Cd(t|0,C|0,wa|0,Ca|0)|0;ma=Dd(Ca|0,C|0,la|0,ma|0)|0;H=Dd(ma|0,C|0,Z|0,H|0)|0;ha=Dd(H|0,C|0,k|0,ha|0)|0;k=C;H=Od(Ea|0,o|0,666643,0)|0;Z=C;ma=Od(Ea|0,o|0,470296,0)|0;la=C;Ca=Od(Ea|0,o|0,654183,0)|0;wa=C;t=Od(Ea|0,o|0,-997805,-1)|0;j=C;sa=Od(Ea|0,o|0,136657,0)|0;sa=Dd(xa|0,s|0,sa|0,C|0)|0;s=C;o=Od(Ea|0,o|0,-683901,-1)|0;o=Dd(Da|0,ia|0,o|0,C|0)|0;ia=C;Da=Od(ra|0,ca|0,666643,0)|0;Ea=C;xa=Od(ra|0,ca|0,470296,0)|0;ya=C;ta=Od(ra|0,ca|0,654183,0)|0;ua=C;na=Od(ra|0,ca|0,-997805,-1)|0;oa=C;ja=Od(ra|0,ca|0,136657,0)|0;ka=C;ca=Od(ra|0,ca|0,-683901,-1)|0;ca=Dd(sa|0,s|0,ca|0,C|0)|0;s=C;sa=Od(Q|0,M|0,666643,0)|0;va=Dd(sa|0,C|0,n|f|V&2031616|0,va|0)|0;V=C;f=Od(Q|0,M|0,470296,0)|0;n=C;sa=Od(Q|0,M|0,654183,0)|0;Ba=Dd(sa|0,C|0,Ba&2097151|0,0)|0;Z=Dd(Ba|0,C|0,H|0,Z|0)|0;ya=Dd(Z|0,C|0,xa|0,ya|0)|0;xa=C;Z=Od(Q|0,M|0,-997805,-1)|0;H=C;Ba=Od(Q|0,M|0,136657,0)|0;Ba=Dd(za|0,Aa|0,Ba|0,C|0)|0;wa=Dd(Ba|0,C|0,Ca|0,wa|0)|0;oa=Dd(wa|0,C|0,na|0,oa|0)|0;na=C;M=Od(Q|0,M|0,-683901,-1)|0;Q=C;wa=Dd(va|0,V|0,1048576,0)|0;wa=Ed(wa|0,C|0,21)|0;Ca=C;ga=Dd(f|0,n|0,ga&2097151|0,0)|0;Ea=Dd(ga|0,C|0,Da|0,Ea|0)|0;Ea=Dd(Ea|0,C|0,wa|0,Ca|0)|0;Da=C;Ca=Hd(wa|0,Ca|0,21)|0;Ca=Cd(va|0,V|0,Ca|0,C|0)|0;V=C;va=Dd(ya|0,xa|0,1048576,0)|0;va=Ed(va|0,C|0,21)|0;wa=C;H=Dd(y|0,x|0,Z|0,H|0)|0;la=Dd(H|0,C|0,ma|0,la|0)|0;ua=Dd(la|0,C|0,ta|0,ua|0)|0;ua=Dd(ua|0,C|0,va|0,wa|0)|0;ta=C;wa=Hd(va|0,wa|0,21)|0;va=C;la=Dd(oa|0,na|0,1048576,0)|0;la=Ed(la|0,C|0,21)|0;ma=C;Q=Dd(D|0,B|0,M|0,Q|0)|0;j=Dd(Q|0,C|0,t|0,j|0)|0;ka=Dd(j|0,C|0,ja|0,ka|0)|0;ka=Dd(ka|0,C|0,la|0,ma|0)|0;ja=C;ma=Hd(la|0,ma|0,21)|0;la=C;j=Dd(ca|0,s|0,1048576,0)|0;j=Ed(j|0,C|0,21)|0;t=C;ia=Dd(o|0,ia|0,j|0,t|0)|0;o=C;t=Hd(j|0,t|0,21)|0;t=Cd(ca|0,s|0,t|0,C|0)|0;s=C;ca=Dd(ha|0,k|0,1048576,0)|0;ca=Ed(ca|0,C|0,21)|0;j=C;e=Dd(I|0,e|0,ca|0,j|0)|0;I=C;j=Hd(ca|0,j|0,21)|0;j=Cd(ha|0,k|0,j|0,C|0)|0;k=C;ha=Dd(L|0,fa|0,1048576,0)|0;ha=Ed(ha|0,C|0,21)|0;ca=C;R=Dd(_|0,R|0,ha|0,ca|0)|0;_=C;ca=Hd(ha|0,ca|0,21)|0;ca=Cd(L|0,fa|0,ca|0,C|0)|0;fa=C;L=Dd(Ea|0,Da|0,1048576,0)|0;L=Ed(L|0,C|0,21)|0;ha=C;Q=Hd(L|0,ha|0,21)|0;M=C;B=Dd(ua|0,ta|0,1048576,0)|0;B=Ed(B|0,C|0,21)|0;D=C;H=Hd(B|0,D|0,21)|0;Z=C;x=Dd(ka|0,ja|0,1048576,0)|0;x=Ed(x|0,C|0,21)|0;y=C;s=Dd(t|0,s|0,x|0,y|0)|0;t=C;y=Hd(x|0,y|0,21)|0;x=C;ga=Dd(ia|0,o|0,1048576,0)|0;ga=Ed(ga|0,C|0,21)|0;n=C;k=Dd(j|0,k|0,ga|0,n|0)|0;j=C;n=Hd(ga|0,n|0,21)|0;n=Cd(ia|0,o|0,n|0,C|0)|0;o=C;ia=Dd(e|0,I|0,1048576,0)|0;ia=Ed(ia|0,C|0,21)|0;ga=C;fa=Dd(ca|0,fa|0,ia|0,ga|0)|0;ca=C;ga=Hd(ia|0,ga|0,21)|0;ga=Cd(e|0,I|0,ga|0,C|0)|0;I=C;e=Dd(R|0,_|0,1048576,0)|0;e=Ed(e|0,C|0,21)|0;ia=C;f=Hd(e|0,ia|0,21)|0;f=Cd(R|0,_|0,f|0,C|0)|0;_=C;R=Od(e|0,ia|0,666643,0)|0;R=Dd(Ca|0,V|0,R|0,C|0)|0;V=C;Ca=Od(e|0,ia|0,470296,0)|0;Ba=C;Aa=Od(e|0,ia|0,654183,0)|0;za=C;sa=Od(e|0,ia|0,-997805,-1)|0;ra=C;qa=Od(e|0,ia|0,136657,0)|0;pa=C;ia=Od(e|0,ia|0,-683901,-1)|0;e=C;W=Ed(R|0,V|0,21)|0;da=C;Ba=Dd(Ea|0,Da|0,Ca|0,Ba|0)|0;Ba=Dd(Ba|0,C|0,W|0,da|0)|0;M=Cd(Ba|0,C|0,Q|0,M|0)|0;Q=C;da=Hd(W|0,da|0,21)|0;da=Cd(R|0,V|0,da|0,C|0)|0;V=C;R=Ed(M|0,Q|0,21)|0;W=C;xa=Dd(Aa|0,za|0,ya|0,xa|0)|0;va=Cd(xa|0,C|0,wa|0,va|0)|0;ha=Dd(va|0,C|0,L|0,ha|0)|0;ha=Dd(ha|0,C|0,R|0,W|0)|0;L=C;W=Hd(R|0,W|0,21)|0;W=Cd(M|0,Q|0,W|0,C|0)|0;Q=C;M=Ed(ha|0,L|0,21)|0;R=C;ra=Dd(ua|0,ta|0,sa|0,ra|0)|0;Z=Cd(ra|0,C|0,H|0,Z|0)|0;Z=Dd(Z|0,C|0,M|0,R|0)|0;H=C;R=Hd(M|0,R|0,21)|0;R=Cd(ha|0,L|0,R|0,C|0)|0;L=C;ha=Ed(Z|0,H|0,21)|0;M=C;na=Dd(qa|0,pa|0,oa|0,na|0)|0;la=Cd(na|0,C|0,ma|0,la|0)|0;D=Dd(la|0,C|0,B|0,D|0)|0;D=Dd(D|0,C|0,ha|0,M|0)|0;B=C;M=Hd(ha|0,M|0,21)|0;M=Cd(Z|0,H|0,M|0,C|0)|0;H=C;Z=Ed(D|0,B|0,21)|0;ha=C;e=Dd(ka|0,ja|0,ia|0,e|0)|0;x=Cd(e|0,C|0,y|0,x|0)|0;x=Dd(x|0,C|0,Z|0,ha|0)|0;y=C;ha=Hd(Z|0,ha|0,21)|0;ha=Cd(D|0,B|0,ha|0,C|0)|0;B=C;D=Ed(x|0,y|0,21)|0;Z=C;t=Dd(s|0,t|0,D|0,Z|0)|0;s=C;Z=Hd(D|0,Z|0,21)|0;Z=Cd(x|0,y|0,Z|0,C|0)|0;y=C;x=Ed(t|0,s|0,21)|0;D=C;o=Dd(x|0,D|0,n|0,o|0)|0;n=C;D=Hd(x|0,D|0,21)|0;D=Cd(t|0,s|0,D|0,C|0)|0;s=C;t=Ed(o|0,n|0,21)|0;x=C;j=Dd(k|0,j|0,t|0,x|0)|0;k=C;x=Hd(t|0,x|0,21)|0;x=Cd(o|0,n|0,x|0,C|0)|0;n=C;o=Ed(j|0,k|0,21)|0;t=C;I=Dd(o|0,t|0,ga|0,I|0)|0;ga=C;t=Hd(o|0,t|0,21)|0;t=Cd(j|0,k|0,t|0,C|0)|0;k=C;j=Ed(I|0,ga|0,21)|0;o=C;ca=Dd(fa|0,ca|0,j|0,o|0)|0;fa=C;o=Hd(j|0,o|0,21)|0;o=Cd(I|0,ga|0,o|0,C|0)|0;ga=C;I=Ed(ca|0,fa|0,21)|0;j=C;_=Dd(I|0,j|0,f|0,_|0)|0;f=C;j=Hd(I|0,j|0,21)|0;j=Cd(ca|0,fa|0,j|0,C|0)|0;fa=C;ca=Ed(_|0,f|0,21)|0;I=C;e=Hd(ca|0,I|0,21)|0;e=Cd(_|0,f|0,e|0,C|0)|0;f=C;_=Od(ca|0,I|0,666643,0)|0;V=Dd(_|0,C|0,da|0,V|0)|0;da=C;_=Od(ca|0,I|0,470296,0)|0;_=Dd(W|0,Q|0,_|0,C|0)|0;Q=C;W=Od(ca|0,I|0,654183,0)|0;W=Dd(R|0,L|0,W|0,C|0)|0;L=C;R=Od(ca|0,I|0,-997805,-1)|0;R=Dd(M|0,H|0,R|0,C|0)|0;H=C;M=Od(ca|0,I|0,136657,0)|0;M=Dd(ha|0,B|0,M|0,C|0)|0;B=C;I=Od(ca|0,I|0,-683901,-1)|0;I=Dd(Z|0,y|0,I|0,C|0)|0;y=C;Z=Ed(V|0,da|0,21)|0;ca=C;Q=Dd(_|0,Q|0,Z|0,ca|0)|0;_=C;ca=Hd(Z|0,ca|0,21)|0;ca=Cd(V|0,da|0,ca|0,C|0)|0;da=C;V=Ed(Q|0,_|0,21)|0;Z=C;L=Dd(W|0,L|0,V|0,Z|0)|0;W=C;Z=Hd(V|0,Z|0,21)|0;Z=Cd(Q|0,_|0,Z|0,C|0)|0;_=C;Q=Ed(L|0,W|0,21)|0;V=C;H=Dd(R|0,H|0,Q|0,V|0)|0;R=C;V=Hd(Q|0,V|0,21)|0;V=Cd(L|0,W|0,V|0,C|0)|0;W=C;L=Ed(H|0,R|0,21)|0;Q=C;B=Dd(M|0,B|0,L|0,Q|0)|0;M=C;Q=Hd(L|0,Q|0,21)|0;Q=Cd(H|0,R|0,Q|0,C|0)|0;R=C;H=Ed(B|0,M|0,21)|0;L=C;y=Dd(I|0,y|0,H|0,L|0)|0;I=C;L=Hd(H|0,L|0,21)|0;L=Cd(B|0,M|0,L|0,C|0)|0;M=C;B=Ed(y|0,I|0,21)|0;H=C;s=Dd(B|0,H|0,D|0,s|0)|0;D=C;H=Hd(B|0,H|0,21)|0;H=Cd(y|0,I|0,H|0,C|0)|0;I=C;y=Ed(s|0,D|0,21)|0;B=C;n=Dd(y|0,B|0,x|0,n|0)|0;x=C;B=Hd(y|0,B|0,21)|0;B=Cd(s|0,D|0,B|0,C|0)|0;D=C;s=Ed(n|0,x|0,21)|0;y=C;k=Dd(s|0,y|0,t|0,k|0)|0;t=C;y=Hd(s|0,y|0,21)|0;y=Cd(n|0,x|0,y|0,C|0)|0;x=C;n=Ed(k|0,t|0,21)|0;s=C;ga=Dd(n|0,s|0,o|0,ga|0)|0;o=C;s=Hd(n|0,s|0,21)|0;s=Cd(k|0,t|0,s|0,C|0)|0;t=C;k=Ed(ga|0,o|0,21)|0;n=C;fa=Dd(k|0,n|0,j|0,fa|0)|0;j=C;n=Hd(k|0,n|0,21)|0;n=Cd(ga|0,o|0,n|0,C|0)|0;o=C;ga=Ed(fa|0,j|0,21)|0;k=C;f=Dd(ga|0,k|0,e|0,f|0)|0;e=C;k=Hd(ga|0,k|0,21)|0;k=Cd(fa|0,j|0,k|0,C|0)|0;j=C;a[b>>0]=ca;b=Gd(ca|0,da|0,8)|0;a[ea>>0]=b;b=Gd(ca|0,da|0,16)|0;da=C;ca=Hd(Z|0,_|0,5)|0;a[ba>>0]=ca|b;b=Gd(Z|0,_|0,3)|0;a[aa>>0]=b;b=Gd(Z|0,_|0,11)|0;a[$>>0]=b;b=Gd(Z|0,_|0,19)|0;_=C;Z=Hd(V|0,W|0,2)|0;a[Y>>0]=Z|b;b=Gd(V|0,W|0,6)|0;a[X>>0]=b;b=Gd(V|0,W|0,14)|0;W=C;V=Hd(Q|0,R|0,7)|0;a[U>>0]=V|b;b=Gd(Q|0,R|0,1)|0;a[T>>0]=b;b=Gd(Q|0,R|0,9)|0;a[S>>0]=b;b=Gd(Q|0,R|0,17)|0;R=C;Q=Hd(L|0,M|0,4)|0;a[P>>0]=Q|b;b=Gd(L|0,M|0,4)|0;a[O>>0]=b;b=Gd(L|0,M|0,12)|0;a[N>>0]=b;b=Gd(L|0,M|0,20)|0;M=C;L=Hd(H|0,I|0,1)|0;a[K>>0]=L|b;b=Gd(H|0,I|0,7)|0;a[J>>0]=b;b=Gd(H|0,I|0,15)|0;I=C;H=Hd(B|0,D|0,6)|0;a[G>>0]=H|b;b=Gd(B|0,D|0,2)|0;a[F>>0]=b;b=Gd(B|0,D|0,10)|0;a[E>>0]=b;b=Gd(B|0,D|0,18)|0;D=C;B=Hd(y|0,x|0,3)|0;a[A>>0]=B|b;b=Gd(y|0,x|0,5)|0;a[z>>0]=b;b=Gd(y|0,x|0,13)|0;a[w>>0]=b;a[v>>0]=s;b=Gd(s|0,t|0,8)|0;a[u>>0]=b;b=Gd(s|0,t|0,16)|0;t=C;s=Hd(n|0,o|0,5)|0;a[r>>0]=s|b;b=Gd(n|0,o|0,3)|0;a[q>>0]=b;b=Gd(n|0,o|0,11)|0;a[p>>0]=b;b=Gd(n|0,o|0,19)|0;o=C;n=Hd(k|0,j|0,2)|0;a[m>>0]=n|b;b=Gd(k|0,j|0,6)|0;a[l>>0]=b;j=Gd(k|0,j|0,14)|0;k=C;b=Hd(f|0,e|0,7)|0;a[i>>0]=j|b;b=Gd(f|0,e|0,1)|0;a[h>>0]=b;b=Gd(f|0,e|0,9)|0;a[g>>0]=b;b=Gd(f|0,e|0,17)|0;a[c>>0]=b;return}function Xc(b,e,f,g,h,j){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0,fb=0,gb=0,hb=0,ib=0,jb=0,kb=0,lb=0,mb=0,nb=0,ob=0,pb=0,qb=0,rb=0,sb=0,tb=0,ub=0,vb=0,wb=0,xb=0,yb=0,zb=0,Ab=0,Bb=0,Cb=0,Db=0,Eb=0,Hb=0,Ib=0,Jb=0,Kb=0,Lb=0,Mb=0,Nb=0,Ob=0,Pb=0,Qb=0,Rb=0,Sb=0,Tb=0,Ub=0,Vb=0,Wb=0,Xb=0,Yb=0,Zb=0,_b=0,$b=0,ac=0,bc=0,cc=0,dc=0,ec=0,fc=0,gc=0,hc=0,ic=0,jc=0,kc=0,lc=0,mc=0,nc=0,oc=0,pc=0,qc=0,rc=0,sc=0,tc=0,uc=0,vc=0,wc=0,xc=0,yc=0,zc=0,Ac=0,Bc=0,Cc=0,Dc=0,Ec=0;z=i;p=i=i+63&-64;i=i+896|0;v=p+208|0;u=p+656|0;w=p+616|0;x=p+576|0;s=p;q=p+824|0;t=p+760|0;r=p+696|0;p=p+416|0;k=v+64|0;y=v;A=8;B=y+64|0;do{c[y>>2]=c[A>>2];y=y+4|0;A=A+4|0}while((y|0)<(b|0));y=v+72|0;c[y>>2]=256;c[y+4>>2]=0;y=k;c[y>>2]=0;c[y+4>>2]=0;y=v+80|0;A=j;B=y+32|0;do{a[y>>0]=a[A>>0]|0;y=y+1|0;A=A+1|0}while((y|0)<(b|0));gb(v,q);a[q>>0]=(d[q>>0]|0)&248;k=q+31|0;a[k>>0]=(d[k>>0]|0)&63|64;l=s+64|0;y=l;c[y>>2]=0;c[y+4>>2]=0;y=s;A=8;B=y+64|0;do{c[y>>2]=c[A>>2];y=y+4|0;A=A+4|0}while((y|0)<(b|0));m=s+72|0;n=m;c[n>>2]=256;c[n+4>>2]=0;n=l;c[n>>2]=0;c[n+4>>2]=0;n=s+80|0;y=n;A=q+32|0;B=y+32|0;do{a[y>>0]=a[A>>0]|0;y=y+1|0;A=A+1|0}while((y|0)<(b|0));fb(s,f,g,h);gb(s,t);o=b+32|0;jd(o|0,j+32|0,32)|0;wc(t);rc(p,t);ic(u,p+80|0);jc(w,p,u);jc(x,p+40|0,u);lc(b,x);lc(v,w);y=b+31|0;a[y>>0]=(d[y>>0]|0)^(d[v>>0]|0)<<7;y=l;c[y>>2]=0;c[y+4>>2]=0;y=s;A=8;B=y+64|0;do{c[y>>2]=c[A>>2];y=y+4|0;A=A+4|0}while((y|0)<(b|0));y=m;c[y>>2]=512;c[y+4>>2]=0;y=l;c[y>>2]=0;c[y+4>>2]=0;y=n;A=b;B=y+64|0;do{a[y>>0]=a[A>>0]|0;y=y+1|0;A=A+1|0}while((y|0)<(b|0));fb(s,f,g,h);gb(s,r);wc(r);j=a[r+2>>0]|0;Ta=d[r>>0]|0;xb=Hd(d[r+1>>0]|0|0,0,8)|0;qb=C;J=J&255;kb=Hd(J|0,0,16)|0;kb=xb|Ta|kb&2031616;Ta=Hd(d[r+3>>0]|0|0,0,8)|0;xb=C;F=Hd(d[r+4>>0]|0|0,0,16)|0;xb=xb|C;ub=d[r+5>>0]|0;db=Hd(ub|0,0,24)|0;xb=Gd(Ta|J|F|db|0,xb|C|0,5)|0;xb=xb&2097151;db=a[r+7>>0]|0;F=Hd(d[r+6>>0]|0|0,0,8)|0;J=C;db=db&255;Ta=Hd(db|0,0,16)|0;J=Gd(F|ub|Ta|0,J|C|0,2)|0;J=J&2097151;Ta=Hd(d[r+8>>0]|0|0,0,8)|0;ub=C;F=Hd(d[r+9>>0]|0|0,0,16)|0;ub=ub|C;v=d[r+10>>0]|0;Sa=Hd(v|0,0,24)|0;ub=Gd(Ta|db|F|Sa|0,ub|C|0,7)|0;ub=ub&2097151;Sa=Hd(d[r+11>>0]|0|0,0,8)|0;F=C;db=Hd(d[r+12>>0]|0|0,0,16)|0;F=F|C;Ta=d[r+13>>0]|0;y=Hd(Ta|0,0,24)|0;F=Gd(Sa|v|db|y|0,F|C|0,4)|0;F=F&2097151;y=a[r+15>>0]|0;db=Hd(d[r+14>>0]|0|0,0,8)|0;v=C;y=y&255;Sa=Hd(y|0,0,16)|0;v=Gd(db|Ta|Sa|0,v|C|0,1)|0;v=v&2097151;Sa=Hd(d[r+16>>0]|0|0,0,8)|0;Ta=C;db=Hd(d[r+17>>0]|0|0,0,16)|0;Ta=Ta|C;Bc=d[r+18>>0]|0;ja=Hd(Bc|0,0,24)|0;Ta=Gd(Sa|y|db|ja|0,Ta|C|0,6)|0;Ta=Ta&2097151;ja=a[r+20>>0]|0;db=Hd(d[r+19>>0]|0|0,0,8)|0;y=C;ja=Hd(ja&255|0,0,16)|0;y=Gd(db|Bc|ja|0,y|C|0,3)|0;ja=C;Bc=a[r+23>>0]|0;db=d[r+21>>0]|0;Sa=Hd(d[r+22>>0]|0|0,0,8)|0;sb=C;Bc=Bc&255;Qa=Hd(Bc|0,0,16)|0;Qa=Sa|db|Qa&2031616;db=Hd(d[r+24>>0]|0|0,0,8)|0;Sa=C;m=Hd(d[r+25>>0]|0|0,0,16)|0;Sa=Sa|C;p=d[r+26>>0]|0;s=Hd(p|0,0,24)|0;Sa=Gd(db|Bc|m|s|0,Sa|C|0,5)|0;Sa=Sa&2097151;s=a[r+28>>0]|0;m=Hd(d[r+27>>0]|0|0,0,8)|0;Bc=C;s=s&255;db=Hd(s|0,0,16)|0;Bc=Gd(m|p|db|0,Bc|C|0,2)|0;Bc=Bc&2097151;db=Hd(d[r+29>>0]|0|0,0,8)|0;p=C;m=Hd(d[r+30>>0]|0|0,0,16)|0;p=p|C;Ka=Hd(d[r+31>>0]|0|0,0,24)|0;p=Gd(db|s|m|Ka|0,p|C|0,7)|0;Ka=C;m=a[q+2>>0]|0;s=d[q>>0]|0;db=Hd(d[q+1>>0]|0|0,0,8)|0;ia=C;m=m&255;ha=Hd(m|0,0,16)|0;ha=db|s|ha&2031616;s=Hd(d[q+3>>0]|0|0,0,8)|0;db=C;la=Hd(d[q+4>>0]|0|0,0,16)|0;db=db|C;h=d[q+5>>0]|0;yc=Hd(h|0,0,24)|0;db=Gd(s|m|la|yc|0,db|C|0,5)|0;db=db&2097151;yc=a[q+7>>0]|0;la=Hd(d[q+6>>0]|0|0,0,8)|0;m=C;yc=yc&255;s=Hd(yc|0,0,16)|0;m=Gd(la|h|s|0,m|C|0,2)|0;m=m&2097151;s=Hd(d[q+8>>0]|0|0,0,8)|0;h=C;la=Hd(d[q+9>>0]|0|0,0,16)|0;h=h|C;_a=d[q+10>>0]|0;Pa=Hd(_a|0,0,24)|0;h=Gd(s|yc|la|Pa|0,h|C|0,7)|0;h=h&2097151;Pa=Hd(d[q+11>>0]|0|0,0,8)|0;la=C;yc=Hd(d[q+12>>0]|0|0,0,16)|0;la=la|C;s=d[q+13>>0]|0;Ec=Hd(s|0,0,24)|0;la=Gd(Pa|_a|yc|Ec|0,la|C|0,4)|0;la=la&2097151;Ec=a[q+15>>0]|0;yc=Hd(d[q+14>>0]|0|0,0,8)|0;_a=C;Ec=Ec&255;Pa=Hd(Ec|0,0,16)|0;_a=Gd(yc|s|Pa|0,_a|C|0,1)|0;_a=_a&2097151;Pa=Hd(d[q+16>>0]|0|0,0,8)|0;s=C;yc=Hd(d[q+17>>0]|0|0,0,16)|0;s=s|C;R=d[q+18>>0]|0;Bb=Hd(R|0,0,24)|0;s=Gd(Pa|Ec|yc|Bb|0,s|C|0,6)|0;s=s&2097151;Bb=a[q+20>>0]|0;yc=Hd(d[q+19>>0]|0|0,0,8)|0;Ec=C;Bb=Hd(Bb&255|0,0,16)|0;Ec=Gd(yc|R|Bb|0,Ec|C|0,3)|0;Bb=C;R=a[q+23>>0]|0;yc=d[q+21>>0]|0;Pa=Hd(d[q+22>>0]|0|0,0,8)|0;Da=C;R=R&255;ua=Hd(R|0,0,16)|0;ua=Pa|yc|ua&2031616;yc=Hd(d[q+24>>0]|0|0,0,8)|0;Pa=C;Ma=Hd(d[q+25>>0]|0|0,0,16)|0;Pa=Pa|C;D=d[q+26>>0]|0;zc=Hd(D|0,0,24)|0;Pa=Gd(yc|R|Ma|zc|0,Pa|C|0,5)|0;Pa=Pa&2097151;zc=a[q+28>>0]|0;Ma=Hd(d[q+27>>0]|0|0,0,8)|0;R=C;zc=zc&255;yc=Hd(zc|0,0,16)|0;R=Gd(Ma|D|yc|0,R|C|0,2)|0;R=R&2097151;yc=Hd(d[q+29>>0]|0|0,0,8)|0;D=C;Ma=Hd(d[q+30>>0]|0|0,0,16)|0;D=D|C;Ia=Hd(d[k>>0]|0|0,0,24)|0;D=Gd(yc|zc|Ma|Ia|0,D|C|0,7)|0;Ia=C;Ma=a[t+2>>0]|0;zc=d[t>>0]|0;yc=Hd(d[t+1>>0]|0|0,0,8)|0;ba=C;Ma=Ma&255;Ac=Hd(Ma|0,0,16)|0;Xa=Hd(d[t+3>>0]|0|0,0,8)|0;Ea=C;Ga=Hd(d[t+4>>0]|0|0,0,16)|0;Ea=Ea|C;pb=d[t+5>>0]|0;za=Hd(pb|0,0,24)|0;Ea=Gd(Xa|Ma|Ga|za|0,Ea|C|0,5)|0;za=a[t+7>>0]|0;Ga=Hd(d[t+6>>0]|0|0,0,8)|0;Ma=C;za=za&255;Xa=Hd(za|0,0,16)|0;Ma=Gd(Ga|pb|Xa|0,Ma|C|0,2)|0;Xa=Hd(d[t+8>>0]|0|0,0,8)|0;pb=C;Ga=Hd(d[t+9>>0]|0|0,0,16)|0;pb=pb|C;X=d[t+10>>0]|0;O=Hd(X|0,0,24)|0;pb=Gd(Xa|za|Ga|O|0,pb|C|0,7)|0;O=Hd(d[t+11>>0]|0|0,0,8)|0;Ga=C;za=Hd(d[t+12>>0]|0|0,0,16)|0;Ga=Ga|C;Xa=d[t+13>>0]|0;H=Hd(Xa|0,0,24)|0;Ga=Gd(O|X|za|H|0,Ga|C|0,4)|0;H=a[t+15>>0]|0;za=Hd(d[t+14>>0]|0|0,0,8)|0;X=C;H=H&255;O=Hd(H|0,0,16)|0;X=Gd(za|Xa|O|0,X|C|0,1)|0;O=Hd(d[t+16>>0]|0|0,0,8)|0;Xa=C;za=Hd(d[t+17>>0]|0|0,0,16)|0;Xa=Xa|C;U=d[t+18>>0]|0;w=Hd(U|0,0,24)|0;Xa=Gd(O|H|za|w|0,Xa|C|0,6)|0;w=a[t+20>>0]|0;za=Hd(d[t+19>>0]|0|0,0,8)|0;H=C;w=Hd(w&255|0,0,16)|0;H=Gd(za|U|w|0,H|C|0,3)|0;w=C;U=a[t+23>>0]|0;za=d[t+21>>0]|0;O=Hd(d[t+22>>0]|0|0,0,8)|0;da=C;U=U&255;ea=Hd(U|0,0,16)|0;Ba=Hd(d[t+24>>0]|0|0,0,8)|0;N=C;Ha=Hd(d[t+25>>0]|0|0,0,16)|0;N=N|C;A=d[t+26>>0]|0;ta=Hd(A|0,0,24)|0;N=Gd(Ba|U|Ha|ta|0,N|C|0,5)|0;ta=a[t+28>>0]|0;Ha=Hd(d[t+27>>0]|0|0,0,8)|0;U=C;ta=ta&255;Ba=Hd(ta|0,0,16)|0;U=Gd(Ha|A|Ba|0,U|C|0,2)|0;Ba=Hd(d[t+29>>0]|0|0,0,8)|0;A=C;Ha=Hd(d[t+30>>0]|0|0,0,16)|0;A=A|C;j=Hd(d[t+31>>0]|0|0,0,24)|0;A=Gd(Ba|ta|Ha|j|0,A|C|0,7)|0;j=C;Ha=Od(ha|0,ia|0,kb|0,qb|0)|0;Ha=Dd(yc|zc|Ac&2031616|0,ba|0,Ha|0,C|0)|0;ba=C;Ac=Od(db|0,0,kb|0,qb|0)|0;zc=C;yc=Od(ha|0,ia|0,xb|0,0)|0;ta=C;Ba=Od(m|0,0,kb|0,qb|0)|0;La=C;Ca=Od(db|0,0,xb|0,0)|0;tc=C;pa=Od(ha|0,ia|0,J|0,0)|0;pa=Dd(Ca|0,tc|0,pa|0,C|0)|0;La=Dd(pa|0,C|0,Ba|0,La|0)|0;Ma=Dd(La|0,C|0,Ma&2097151|0,0)|0;La=C;Ba=Od(h|0,0,kb|0,qb|0)|0;pa=C;tc=Od(m|0,0,xb|0,0)|0;Ca=C;xc=Od(db|0,0,J|0,0)|0;wc=C;vc=Od(ha|0,ia|0,ub|0,0)|0;uc=C;Oa=Od(la|0,0,kb|0,qb|0)|0;Fa=C;kc=Od(h|0,0,xb|0,0)|0;Y=C;mc=Od(m|0,0,J|0,0)|0;Na=C;nc=Od(db|0,0,ub|0,0)|0;oc=C;lc=Od(ha|0,ia|0,F|0,0)|0;lc=Dd(nc|0,oc|0,lc|0,C|0)|0;Na=Dd(lc|0,C|0,mc|0,Na|0)|0;Y=Dd(Na|0,C|0,kc|0,Y|0)|0;Fa=Dd(Y|0,C|0,Oa|0,Fa|0)|0;Ga=Dd(Fa|0,C|0,Ga&2097151|0,0)|0;Fa=C;Oa=Od(_a|0,0,kb|0,qb|0)|0;Y=C;kc=Od(la|0,0,xb|0,0)|0;Na=C;mc=Od(h|0,0,J|0,0)|0;lc=C;oc=Od(m|0,0,ub|0,0)|0;nc=C;sc=Od(db|0,0,F|0,0)|0;rc=C;qc=Od(ha|0,ia|0,v|0,0)|0;pc=C;ca=Od(s|0,0,kb|0,qb|0)|0;Ya=C;Zb=Od(_a|0,0,xb|0,0)|0;ka=C;$b=Od(la|0,0,J|0,0)|0;Yb=C;bc=Od(h|0,0,ub|0,0)|0;_b=C;dc=Od(m|0,0,F|0,0)|0;ac=C;ec=Od(db|0,0,v|0,0)|0;fc=C;cc=Od(ha|0,ia|0,Ta|0,0)|0;cc=Dd(ec|0,fc|0,cc|0,C|0)|0;ac=Dd(cc|0,C|0,dc|0,ac|0)|0;_b=Dd(ac|0,C|0,bc|0,_b|0)|0;Yb=Dd(_b|0,C|0,$b|0,Yb|0)|0;ka=Dd(Yb|0,C|0,Zb|0,ka|0)|0;Ya=Dd(ka|0,C|0,ca|0,Ya|0)|0;Xa=Dd(Ya|0,C|0,Xa&2097151|0,0)|0;Ya=C;ca=Od(Ec|0,Bb|0,kb|0,qb|0)|0;ka=C;Zb=Od(s|0,0,xb|0,0)|0;Yb=C;$b=Od(_a|0,0,J|0,0)|0;_b=C;bc=Od(la|0,0,ub|0,0)|0;ac=C;dc=Od(h|0,0,F|0,0)|0;cc=C;fc=Od(m|0,0,v|0,0)|0;ec=C;jc=Od(db|0,0,Ta|0,0)|0;ic=C;hc=Od(ha|0,ia|0,y|0,ja|0)|0;gc=C;Aa=Od(ua|0,Da|0,kb|0,qb|0)|0;Hb=C;Ib=Od(Ec|0,Bb|0,xb|0,0)|0;Jb=C;Kb=Od(s|0,0,J|0,0)|0;Lb=C;Mb=Od(_a|0,0,ub|0,0)|0;Nb=C;Ob=Od(la|0,0,F|0,0)|0;Pb=C;Qb=Od(h|0,0,v|0,0)|0;Rb=C;Sb=Od(m|0,0,Ta|0,0)|0;Tb=C;Vb=Od(db|0,0,y|0,ja|0)|0;Wb=C;Xb=Od(ha|0,ia|0,Qa|0,sb|0)|0;Xb=Dd(Vb|0,Wb|0,Xb|0,C|0)|0;Tb=Dd(Xb|0,C|0,Sb|0,Tb|0)|0;Rb=Dd(Tb|0,C|0,Qb|0,Rb|0)|0;Pb=Dd(Rb|0,C|0,Ob|0,Pb|0)|0;Nb=Dd(Pb|0,C|0,Mb|0,Nb|0)|0;Lb=Dd(Nb|0,C|0,Kb|0,Lb|0)|0;Jb=Dd(Lb|0,C|0,Ib|0,Jb|0)|0;Hb=Dd(Jb|0,C|0,Aa|0,Hb|0)|0;da=Dd(Hb|0,C|0,O|za|ea&2031616|0,da|0)|0;ea=C;za=Od(Pa|0,0,kb|0,qb|0)|0;O=C;Hb=Od(ua|0,Da|0,xb|0,0)|0;Aa=C;Jb=Od(Ec|0,Bb|0,J|0,0)|0;Ib=C;Lb=Od(s|0,0,ub|0,0)|0;Kb=C;Nb=Od(_a|0,0,F|0,0)|0;Mb=C;Pb=Od(la|0,0,v|0,0)|0;Ob=C;Rb=Od(h|0,0,Ta|0,0)|0;Qb=C;Tb=Od(m|0,0,y|0,ja|0)|0;Sb=C;Xb=Od(db|0,0,Qa|0,sb|0)|0;Wb=C;Vb=Od(ha|0,ia|0,Sa|0,0)|0;Ub=C;V=Od(R|0,0,kb|0,qb|0)|0;T=C;hb=Od(Pa|0,0,xb|0,0)|0;W=C;I=Od(ua|0,Da|0,J|0,0)|0;ib=C;vb=Od(Ec|0,Bb|0,ub|0,0)|0;E=C;Q=Od(s|0,0,F|0,0)|0;wb=C;Va=Od(_a|0,0,v|0,0)|0;K=C;nb=Od(la|0,0,Ta|0,0)|0;Wa=C;$=Od(h|0,0,y|0,ja|0)|0;ob=C;bb=Od(m|0,0,Qa|0,sb|0)|0;aa=C;Db=Od(db|0,0,Sa|0,0)|0;Eb=C;cb=Od(ha|0,ia|0,Bc|0,0)|0;cb=Dd(Db|0,Eb|0,cb|0,C|0)|0;aa=Dd(cb|0,C|0,bb|0,aa|0)|0;ob=Dd(aa|0,C|0,$|0,ob|0)|0;Wa=Dd(ob|0,C|0,nb|0,Wa|0)|0;K=Dd(Wa|0,C|0,Va|0,K|0)|0;wb=Dd(K|0,C|0,Q|0,wb|0)|0;E=Dd(wb|0,C|0,vb|0,E|0)|0;ib=Dd(E|0,C|0,I|0,ib|0)|0;W=Dd(ib|0,C|0,hb|0,W|0)|0;T=Dd(W|0,C|0,V|0,T|0)|0;U=Dd(T|0,C|0,U&2097151|0,0)|0;T=C;qb=Od(D|0,Ia|0,kb|0,qb|0)|0;kb=C;V=Od(R|0,0,xb|0,0)|0;W=C;hb=Od(Pa|0,0,J|0,0)|0;ib=C;I=Od(ua|0,Da|0,ub|0,0)|0;E=C;vb=Od(Ec|0,Bb|0,F|0,0)|0;wb=C;Q=Od(s|0,0,v|0,0)|0;K=C;Va=Od(_a|0,0,Ta|0,0)|0;Wa=C;nb=Od(la|0,0,y|0,ja|0)|0;ob=C;$=Od(h|0,0,Qa|0,sb|0)|0;aa=C;bb=Od(m|0,0,Sa|0,0)|0;cb=C;Eb=Od(db|0,0,Bc|0,0)|0;Db=C;ia=Od(ha|0,ia|0,p|0,Ka|0)|0;ha=C;xb=Od(D|0,Ia|0,xb|0,0)|0;yb=C;lb=Od(R|0,0,J|0,0)|0;G=C;ma=Od(Pa|0,0,ub|0,0)|0;mb=C;oa=Od(ua|0,Da|0,F|0,0)|0;ga=C;zb=Od(Ec|0,Bb|0,v|0,0)|0;rb=C;sa=Od(s|0,0,Ta|0,0)|0;Ab=C;xa=Od(_a|0,0,y|0,ja|0)|0;ra=C;Ua=Od(la|0,0,Qa|0,sb|0)|0;wa=C;eb=Od(h|0,0,Sa|0,0)|0;na=C;tb=Od(m|0,0,Bc|0,0)|0;l=C;db=Od(db|0,0,p|0,Ka|0)|0;db=Dd(tb|0,l|0,db|0,C|0)|0;na=Dd(db|0,C|0,eb|0,na|0)|0;wa=Dd(na|0,C|0,Ua|0,wa|0)|0;ra=Dd(wa|0,C|0,xa|0,ra|0)|0;Ab=Dd(ra|0,C|0,sa|0,Ab|0)|0;rb=Dd(Ab|0,C|0,zb|0,rb|0)|0;ga=Dd(rb|0,C|0,oa|0,ga|0)|0;mb=Dd(ga|0,C|0,ma|0,mb|0)|0;G=Dd(mb|0,C|0,lb|0,G|0)|0;yb=Dd(G|0,C|0,xb|0,yb|0)|0;xb=C;J=Od(D|0,Ia|0,J|0,0)|0;G=C;lb=Od(R|0,0,ub|0,0)|0;mb=C;ma=Od(Pa|0,0,F|0,0)|0;ga=C;oa=Od(ua|0,Da|0,v|0,0)|0;rb=C;zb=Od(Ec|0,Bb|0,Ta|0,0)|0;Ab=C;sa=Od(s|0,0,y|0,ja|0)|0;ra=C;xa=Od(_a|0,0,Qa|0,sb|0)|0;wa=C;Ua=Od(la|0,0,Sa|0,0)|0;na=C;eb=Od(h|0,0,Bc|0,0)|0;db=C;m=Od(m|0,0,p|0,Ka|0)|0;l=C;ub=Od(D|0,Ia|0,ub|0,0)|0;tb=C;fb=Od(R|0,0,F|0,0)|0;g=C;L=Od(Pa|0,0,v|0,0)|0;gb=C;r=Od(ua|0,Da|0,Ta|0,0)|0;n=C;fa=Od(Ec|0,Bb|0,y|0,ja|0)|0;x=C;qa=Od(s|0,0,Qa|0,sb|0)|0;k=C;va=Od(_a|0,0,Sa|0,0)|0;M=C;Cb=Od(la|0,0,Bc|0,0)|0;f=C;h=Od(h|0,0,p|0,Ka|0)|0;h=Dd(Cb|0,f|0,h|0,C|0)|0;M=Dd(h|0,C|0,va|0,M|0)|0;k=Dd(M|0,C|0,qa|0,k|0)|0;x=Dd(k|0,C|0,fa|0,x|0)|0;n=Dd(x|0,C|0,r|0,n|0)|0;gb=Dd(n|0,C|0,L|0,gb|0)|0;g=Dd(gb|0,C|0,fb|0,g|0)|0;tb=Dd(g|0,C|0,ub|0,tb|0)|0;ub=C;F=Od(D|0,Ia|0,F|0,0)|0;g=C;fb=Od(R|0,0,v|0,0)|0;gb=C;L=Od(Pa|0,0,Ta|0,0)|0;n=C;r=Od(ua|0,Da|0,y|0,ja|0)|0;x=C;fa=Od(Ec|0,Bb|0,Qa|0,sb|0)|0;k=C;qa=Od(s|0,0,Sa|0,0)|0;M=C;va=Od(_a|0,0,Bc|0,0)|0;h=C;la=Od(la|0,0,p|0,Ka|0)|0;f=C;v=Od(D|0,Ia|0,v|0,0)|0;Cb=C;B=Od(R|0,0,Ta|0,0)|0;S=C;_=Od(Pa|0,0,y|0,ja|0)|0;Ra=C;ab=Od(ua|0,Da|0,Qa|0,sb|0)|0;Z=C;Za=Od(Ec|0,Bb|0,Sa|0,0)|0;$a=C;P=Od(s|0,0,Bc|0,0)|0;u=C;_a=Od(_a|0,0,p|0,Ka|0)|0;_a=Dd(P|0,u|0,_a|0,C|0)|0;$a=Dd(_a|0,C|0,Za|0,$a|0)|0;Z=Dd($a|0,C|0,ab|0,Z|0)|0;Ra=Dd(Z|0,C|0,_|0,Ra|0)|0;S=Dd(Ra|0,C|0,B|0,S|0)|0;Cb=Dd(S|0,C|0,v|0,Cb|0)|0;v=C;Ta=Od(D|0,Ia|0,Ta|0,0)|0;S=C;B=Od(R|0,0,y|0,ja|0)|0;Ra=C;_=Od(Pa|0,0,Qa|0,sb|0)|0;Z=C;ab=Od(ua|0,Da|0,Sa|0,0)|0;$a=C;Za=Od(Ec|0,Bb|0,Bc|0,0)|0;_a=C;s=Od(s|0,0,p|0,Ka|0)|0;u=C;ja=Od(D|0,Ia|0,y|0,ja|0)|0;y=C;P=Od(R|0,0,Qa|0,sb|0)|0;Ja=C;ya=Od(Pa|0,0,Sa|0,0)|0;jb=C;Cc=Od(ua|0,Da|0,Bc|0,0)|0;Dc=C;Bb=Od(Ec|0,Bb|0,p|0,Ka|0)|0;Bb=Dd(Cc|0,Dc|0,Bb|0,C|0)|0;jb=Dd(Bb|0,C|0,ya|0,jb|0)|0;Ja=Dd(jb|0,C|0,P|0,Ja|0)|0;y=Dd(Ja|0,C|0,ja|0,y|0)|0;ja=C;sb=Od(D|0,Ia|0,Qa|0,sb|0)|0;Qa=C;Ja=Od(R|0,0,Sa|0,0)|0;P=C;jb=Od(Pa|0,0,Bc|0,0)|0;ya=C;Da=Od(ua|0,Da|0,p|0,Ka|0)|0;ua=C;Sa=Od(D|0,Ia|0,Sa|0,0)|0;Bb=C;Dc=Od(R|0,0,Bc|0,0)|0;Cc=C;Pa=Od(Pa|0,0,p|0,Ka|0)|0;Pa=Dd(Dc|0,Cc|0,Pa|0,C|0)|0;Bb=Dd(Pa|0,C|0,Sa|0,Bb|0)|0;Sa=C;Bc=Od(D|0,Ia|0,Bc|0,0)|0;Pa=C;R=Od(R|0,0,p|0,Ka|0)|0;R=Dd(Bc|0,Pa|0,R|0,C|0)|0;Pa=C;Ka=Od(D|0,Ia|0,p|0,Ka|0)|0;p=C;Ia=Dd(Ha|0,ba|0,1048576,0)|0;Ia=Gd(Ia|0,C|0,21)|0;D=C;ta=Dd(Ac|0,zc|0,yc|0,ta|0)|0;ta=Dd(ta|0,C|0,Ia|0,D|0)|0;Ea=Dd(ta|0,C|0,Ea&2097151|0,0)|0;ta=C;D=Hd(Ia|0,D|0,21)|0;D=Cd(Ha|0,ba|0,D|0,C|0)|0;ba=C;Ha=Dd(Ma|0,La|0,1048576,0)|0;Ha=Gd(Ha|0,C|0,21)|0;Ia=C;uc=Dd(xc|0,wc|0,vc|0,uc|0)|0;Ca=Dd(uc|0,C|0,tc|0,Ca|0)|0;pa=Dd(Ca|0,C|0,Ba|0,pa|0)|0;pb=Dd(pa|0,C|0,pb&2097151|0,0)|0;pb=Dd(pb|0,C|0,Ha|0,Ia|0)|0;pa=C;Ia=Hd(Ha|0,Ia|0,21)|0;Ha=C;Ba=Dd(Ga|0,Fa|0,1048576,0)|0;Ba=Ed(Ba|0,C|0,21)|0;Ca=C;pc=Dd(sc|0,rc|0,qc|0,pc|0)|0;nc=Dd(pc|0,C|0,oc|0,nc|0)|0;lc=Dd(nc|0,C|0,mc|0,lc|0)|0;Na=Dd(lc|0,C|0,kc|0,Na|0)|0;Y=Dd(Na|0,C|0,Oa|0,Y|0)|0;X=Dd(Y|0,C|0,X&2097151|0,0)|0;X=Dd(X|0,C|0,Ba|0,Ca|0)|0;Y=C;Ca=Hd(Ba|0,Ca|0,21)|0;Ba=C;Oa=Dd(Xa|0,Ya|0,1048576,0)|0;Oa=Ed(Oa|0,C|0,21)|0;Na=C;gc=Dd(jc|0,ic|0,hc|0,gc|0)|0;ec=Dd(gc|0,C|0,fc|0,ec|0)|0;cc=Dd(ec|0,C|0,dc|0,cc|0)|0;ac=Dd(cc|0,C|0,bc|0,ac|0)|0;_b=Dd(ac|0,C|0,$b|0,_b|0)|0;Yb=Dd(_b|0,C|0,Zb|0,Yb|0)|0;ka=Dd(Yb|0,C|0,ca|0,ka|0)|0;w=Dd(ka|0,C|0,H|0,w|0)|0;w=Dd(w|0,C|0,Oa|0,Na|0)|0;H=C;Na=Hd(Oa|0,Na|0,21)|0;Oa=C;ka=Dd(da|0,ea|0,1048576,0)|0;ka=Ed(ka|0,C|0,21)|0;ca=C;Ub=Dd(Xb|0,Wb|0,Vb|0,Ub|0)|0;Sb=Dd(Ub|0,C|0,Tb|0,Sb|0)|0;Qb=Dd(Sb|0,C|0,Rb|0,Qb|0)|0;Ob=Dd(Qb|0,C|0,Pb|0,Ob|0)|0;Mb=Dd(Ob|0,C|0,Nb|0,Mb|0)|0;Kb=Dd(Mb|0,C|0,Lb|0,Kb|0)|0;Ib=Dd(Kb|0,C|0,Jb|0,Ib|0)|0;Aa=Dd(Ib|0,C|0,Hb|0,Aa|0)|0;O=Dd(Aa|0,C|0,za|0,O|0)|0;N=Dd(O|0,C|0,N&2097151|0,0)|0;N=Dd(N|0,C|0,ka|0,ca|0)|0;O=C;ca=Hd(ka|0,ca|0,21)|0;ka=C;za=Dd(U|0,T|0,1048576,0)|0;za=Ed(za|0,C|0,21)|0;Aa=C;ha=Dd(Eb|0,Db|0,ia|0,ha|0)|0;cb=Dd(ha|0,C|0,bb|0,cb|0)|0;aa=Dd(cb|0,C|0,$|0,aa|0)|0;ob=Dd(aa|0,C|0,nb|0,ob|0)|0;Wa=Dd(ob|0,C|0,Va|0,Wa|0)|0;K=Dd(Wa|0,C|0,Q|0,K|0)|0;wb=Dd(K|0,C|0,vb|0,wb|0)|0;E=Dd(wb|0,C|0,I|0,E|0)|0;ib=Dd(E|0,C|0,hb|0,ib|0)|0;W=Dd(ib|0,C|0,V|0,W|0)|0;kb=Dd(W|0,C|0,qb|0,kb|0)|0;j=Dd(kb|0,C|0,A|0,j|0)|0;j=Dd(j|0,C|0,za|0,Aa|0)|0;A=C;Aa=Hd(za|0,Aa|0,21)|0;za=C;kb=Dd(yb|0,xb|0,1048576,0)|0;kb=Ed(kb|0,C|0,21)|0;qb=C;l=Dd(eb|0,db|0,m|0,l|0)|0;na=Dd(l|0,C|0,Ua|0,na|0)|0;wa=Dd(na|0,C|0,xa|0,wa|0)|0;ra=Dd(wa|0,C|0,sa|0,ra|0)|0;Ab=Dd(ra|0,C|0,zb|0,Ab|0)|0;rb=Dd(Ab|0,C|0,oa|0,rb|0)|0;ga=Dd(rb|0,C|0,ma|0,ga|0)|0;mb=Dd(ga|0,C|0,lb|0,mb|0)|0;G=Dd(mb|0,C|0,J|0,G|0)|0;G=Dd(G|0,C|0,kb|0,qb|0)|0;J=C;qb=Hd(kb|0,qb|0,21)|0;kb=C;mb=Dd(tb|0,ub|0,1048576,0)|0;mb=Ed(mb|0,C|0,21)|0;lb=C;f=Dd(va|0,h|0,la|0,f|0)|0;M=Dd(f|0,C|0,qa|0,M|0)|0;k=Dd(M|0,C|0,fa|0,k|0)|0;x=Dd(k|0,C|0,r|0,x|0)|0;n=Dd(x|0,C|0,L|0,n|0)|0;gb=Dd(n|0,C|0,fb|0,gb|0)|0;g=Dd(gb|0,C|0,F|0,g|0)|0;g=Dd(g|0,C|0,mb|0,lb|0)|0;F=C;lb=Hd(mb|0,lb|0,21)|0;mb=C;gb=Dd(Cb|0,v|0,1048576,0)|0;gb=Ed(gb|0,C|0,21)|0;fb=C;u=Dd(Za|0,_a|0,s|0,u|0)|0;$a=Dd(u|0,C|0,ab|0,$a|0)|0;Z=Dd($a|0,C|0,_|0,Z|0)|0;Ra=Dd(Z|0,C|0,B|0,Ra|0)|0;S=Dd(Ra|0,C|0,Ta|0,S|0)|0;S=Dd(S|0,C|0,gb|0,fb|0)|0;Ta=C;fb=Hd(gb|0,fb|0,21)|0;gb=C;Ra=Dd(y|0,ja|0,1048576,0)|0;Ra=Ed(Ra|0,C|0,21)|0;B=C;ua=Dd(jb|0,ya|0,Da|0,ua|0)|0;P=Dd(ua|0,C|0,Ja|0,P|0)|0;Qa=Dd(P|0,C|0,sb|0,Qa|0)|0;Qa=Dd(Qa|0,C|0,Ra|0,B|0)|0;sb=C;B=Hd(Ra|0,B|0,21)|0;B=Cd(y|0,ja|0,B|0,C|0)|0;ja=C;y=Dd(Bb|0,Sa|0,1048576,0)|0;y=Ed(y|0,C|0,21)|0;Ra=C;Pa=Dd(R|0,Pa|0,y|0,Ra|0)|0;R=C;Ra=Hd(y|0,Ra|0,21)|0;Ra=Cd(Bb|0,Sa|0,Ra|0,C|0)|0;Sa=C;Bb=Dd(Ka|0,p|0,1048576,0)|0;Bb=Ed(Bb|0,C|0,21)|0;y=C;P=Hd(Bb|0,y|0,21)|0;P=Cd(Ka|0,p|0,P|0,C|0)|0;p=C;Ka=Dd(Ea|0,ta|0,1048576,0)|0;Ka=Gd(Ka|0,C|0,21)|0;Ja=C;ua=Hd(Ka|0,Ja|0,21)|0;ua=Cd(Ea|0,ta|0,ua|0,C|0)|0;ta=C;Ea=Dd(pb|0,pa|0,1048576,0)|0;Ea=Ed(Ea|0,C|0,21)|0;Da=C;ya=Hd(Ea|0,Da|0,21)|0;ya=Cd(pb|0,pa|0,ya|0,C|0)|0;pa=C;pb=Dd(X|0,Y|0,1048576,0)|0;pb=Ed(pb|0,C|0,21)|0;jb=C;Z=Hd(pb|0,jb|0,21)|0;_=C;$a=Dd(w|0,H|0,1048576,0)|0;$a=Ed($a|0,C|0,21)|0;ab=C;u=Hd($a|0,ab|0,21)|0;s=C;_a=Dd(N|0,O|0,1048576,0)|0;_a=Ed(_a|0,C|0,21)|0;Za=C;n=Hd(_a|0,Za|0,21)|0;L=C;x=Dd(j|0,A|0,1048576,0)|0;x=Ed(x|0,C|0,21)|0;r=C;k=Hd(x|0,r|0,21)|0;fa=C;M=Dd(G|0,J|0,1048576,0)|0;M=Ed(M|0,C|0,21)|0;qa=C;f=Hd(M|0,qa|0,21)|0;la=C;h=Dd(g|0,F|0,1048576,0)|0;h=Ed(h|0,C|0,21)|0;va=C;ga=Hd(h|0,va|0,21)|0;ma=C;rb=Dd(S|0,Ta|0,1048576,0)|0;rb=Ed(rb|0,C|0,21)|0;oa=C;ja=Dd(rb|0,oa|0,B|0,ja|0)|0;B=C;oa=Hd(rb|0,oa|0,21)|0;oa=Cd(S|0,Ta|0,oa|0,C|0)|0;Ta=C;S=Dd(Qa|0,sb|0,1048576,0)|0;S=Ed(S|0,C|0,21)|0;rb=C;Sa=Dd(S|0,rb|0,Ra|0,Sa|0)|0;Ra=C;rb=Hd(S|0,rb|0,21)|0;rb=Cd(Qa|0,sb|0,rb|0,C|0)|0;sb=C;Qa=Dd(Pa|0,R|0,1048576,0)|0;Qa=Ed(Qa|0,C|0,21)|0;S=C;p=Dd(Qa|0,S|0,P|0,p|0)|0;P=C;S=Hd(Qa|0,S|0,21)|0;S=Cd(Pa|0,R|0,S|0,C|0)|0;R=C;Pa=Od(Bb|0,y|0,666643,0)|0;Qa=C;Ab=Od(Bb|0,y|0,470296,0)|0;zb=C;ra=Od(Bb|0,y|0,654183,0)|0;sa=C;wa=Od(Bb|0,y|0,-997805,-1)|0;xa=C;na=Od(Bb|0,y|0,136657,0)|0;Ua=C;y=Od(Bb|0,y|0,-683901,-1)|0;y=Dd(Cb|0,v|0,y|0,C|0)|0;gb=Cd(y|0,C|0,fb|0,gb|0)|0;va=Dd(gb|0,C|0,h|0,va|0)|0;h=C;gb=Od(p|0,P|0,666643,0)|0;fb=C;y=Od(p|0,P|0,470296,0)|0;v=C;Cb=Od(p|0,P|0,654183,0)|0;Bb=C;l=Od(p|0,P|0,-997805,-1)|0;m=C;db=Od(p|0,P|0,136657,0)|0;eb=C;P=Od(p|0,P|0,-683901,-1)|0;p=C;W=Od(S|0,R|0,666643,0)|0;V=C;ib=Od(S|0,R|0,470296,0)|0;hb=C;E=Od(S|0,R|0,654183,0)|0;I=C;wb=Od(S|0,R|0,-997805,-1)|0;vb=C;K=Od(S|0,R|0,136657,0)|0;Q=C;R=Od(S|0,R|0,-683901,-1)|0;S=C;xa=Dd(tb|0,ub|0,wa|0,xa|0)|0;eb=Dd(xa|0,C|0,db|0,eb|0)|0;S=Dd(eb|0,C|0,R|0,S|0)|0;mb=Cd(S|0,C|0,lb|0,mb|0)|0;qa=Dd(mb|0,C|0,M|0,qa|0)|0;M=C;mb=Od(Sa|0,Ra|0,666643,0)|0;lb=C;S=Od(Sa|0,Ra|0,470296,0)|0;R=C;eb=Od(Sa|0,Ra|0,654183,0)|0;db=C;xa=Od(Sa|0,Ra|0,-997805,-1)|0;wa=C;ub=Od(Sa|0,Ra|0,136657,0)|0;tb=C;Ra=Od(Sa|0,Ra|0,-683901,-1)|0;Sa=C;Wa=Od(rb|0,sb|0,666643,0)|0;Va=C;ob=Od(rb|0,sb|0,470296,0)|0;nb=C;aa=Od(rb|0,sb|0,654183,0)|0;$=C;cb=Od(rb|0,sb|0,-997805,-1)|0;bb=C;ha=Od(rb|0,sb|0,136657,0)|0;ia=C;sb=Od(rb|0,sb|0,-683901,-1)|0;rb=C;zb=Dd(Cb|0,Bb|0,Ab|0,zb|0)|0;xb=Dd(zb|0,C|0,yb|0,xb|0)|0;vb=Dd(xb|0,C|0,wb|0,vb|0)|0;tb=Dd(vb|0,C|0,ub|0,tb|0)|0;rb=Dd(tb|0,C|0,sb|0,rb|0)|0;kb=Cd(rb|0,C|0,qb|0,kb|0)|0;r=Dd(kb|0,C|0,x|0,r|0)|0;x=C;kb=Od(ja|0,B|0,666643,0)|0;kb=Dd(pb|0,jb|0,kb|0,C|0)|0;Ya=Dd(kb|0,C|0,Xa|0,Ya|0)|0;Oa=Cd(Ya|0,C|0,Na|0,Oa|0)|0;Na=C;Ya=Od(ja|0,B|0,470296,0)|0;Xa=C;kb=Od(ja|0,B|0,654183,0)|0;jb=C;lb=Dd(ob|0,nb|0,mb|0,lb|0)|0;jb=Dd(lb|0,C|0,kb|0,jb|0)|0;ab=Dd(jb|0,C|0,$a|0,ab|0)|0;ea=Dd(ab|0,C|0,da|0,ea|0)|0;ka=Cd(ea|0,C|0,ca|0,ka|0)|0;ca=C;ea=Od(ja|0,B|0,-997805,-1)|0;da=C;ab=Od(ja|0,B|0,136657,0)|0;$a=C;fb=Dd(ib|0,hb|0,gb|0,fb|0)|0;db=Dd(fb|0,C|0,eb|0,db|0)|0;bb=Dd(db|0,C|0,cb|0,bb|0)|0;$a=Dd(bb|0,C|0,ab|0,$a|0)|0;Za=Dd($a|0,C|0,_a|0,Za|0)|0;T=Dd(Za|0,C|0,U|0,T|0)|0;za=Cd(T|0,C|0,Aa|0,za|0)|0;Aa=C;B=Od(ja|0,B|0,-683901,-1)|0;ja=C;T=Dd(Oa|0,Na|0,1048576,0)|0;T=Ed(T|0,C|0,21)|0;U=C;Va=Dd(Ya|0,Xa|0,Wa|0,Va|0)|0;H=Dd(Va|0,C|0,w|0,H|0)|0;s=Cd(H|0,C|0,u|0,s|0)|0;s=Dd(s|0,C|0,T|0,U|0)|0;u=C;U=Hd(T|0,U|0,21)|0;T=C;H=Dd(ka|0,ca|0,1048576,0)|0;H=Ed(H|0,C|0,21)|0;w=C;V=Dd(S|0,R|0,W|0,V|0)|0;$=Dd(V|0,C|0,aa|0,$|0)|0;da=Dd($|0,C|0,ea|0,da|0)|0;O=Dd(da|0,C|0,N|0,O|0)|0;L=Cd(O|0,C|0,n|0,L|0)|0;L=Dd(L|0,C|0,H|0,w|0)|0;n=C;w=Hd(H|0,w|0,21)|0;H=C;O=Dd(za|0,Aa|0,1048576,0)|0;O=Ed(O|0,C|0,21)|0;N=C;Qa=Dd(y|0,v|0,Pa|0,Qa|0)|0;I=Dd(Qa|0,C|0,E|0,I|0)|0;wa=Dd(I|0,C|0,xa|0,wa|0)|0;ia=Dd(wa|0,C|0,ha|0,ia|0)|0;ja=Dd(ia|0,C|0,B|0,ja|0)|0;A=Dd(ja|0,C|0,j|0,A|0)|0;fa=Cd(A|0,C|0,k|0,fa|0)|0;fa=Dd(fa|0,C|0,O|0,N|0)|0;k=C;N=Hd(O|0,N|0,21)|0;O=C;A=Dd(r|0,x|0,1048576,0)|0;A=Ed(A|0,C|0,21)|0;j=C;sa=Dd(l|0,m|0,ra|0,sa|0)|0;Q=Dd(sa|0,C|0,K|0,Q|0)|0;Sa=Dd(Q|0,C|0,Ra|0,Sa|0)|0;J=Dd(Sa|0,C|0,G|0,J|0)|0;la=Cd(J|0,C|0,f|0,la|0)|0;la=Dd(la|0,C|0,A|0,j|0)|0;f=C;j=Hd(A|0,j|0,21)|0;j=Cd(r|0,x|0,j|0,C|0)|0;x=C;r=Dd(qa|0,M|0,1048576,0)|0;r=Ed(r|0,C|0,21)|0;A=C;Ua=Dd(P|0,p|0,na|0,Ua|0)|0;F=Dd(Ua|0,C|0,g|0,F|0)|0;ma=Cd(F|0,C|0,ga|0,ma|0)|0;ma=Dd(ma|0,C|0,r|0,A|0)|0;ga=C;A=Hd(r|0,A|0,21)|0;A=Cd(qa|0,M|0,A|0,C|0)|0;M=C;qa=Dd(va|0,h|0,1048576,0)|0;qa=Ed(qa|0,C|0,21)|0;r=C;Ta=Dd(qa|0,r|0,oa|0,Ta|0)|0;oa=C;r=Hd(qa|0,r|0,21)|0;r=Cd(va|0,h|0,r|0,C|0)|0;h=C;va=Dd(s|0,u|0,1048576,0)|0;va=Ed(va|0,C|0,21)|0;qa=C;F=Hd(va|0,qa|0,21)|0;g=C;Ua=Dd(L|0,n|0,1048576,0)|0;Ua=Ed(Ua|0,C|0,21)|0;na=C;p=Hd(Ua|0,na|0,21)|0;P=C;J=Dd(fa|0,k|0,1048576,0)|0;J=Ed(J|0,C|0,21)|0;G=C;x=Dd(J|0,G|0,j|0,x|0)|0;j=C;G=Hd(J|0,G|0,21)|0;G=Cd(fa|0,k|0,G|0,C|0)|0;k=C;fa=Dd(la|0,f|0,1048576,0)|0;fa=Ed(fa|0,C|0,21)|0;J=C;M=Dd(fa|0,J|0,A|0,M|0)|0;A=C;J=Hd(fa|0,J|0,21)|0;J=Cd(la|0,f|0,J|0,C|0)|0;f=C;la=Dd(ma|0,ga|0,1048576,0)|0;la=Ed(la|0,C|0,21)|0;fa=C;h=Dd(la|0,fa|0,r|0,h|0)|0;r=C;fa=Hd(la|0,fa|0,21)|0;fa=Cd(ma|0,ga|0,fa|0,C|0)|0;ga=C;ma=Od(Ta|0,oa|0,666643,0)|0;la=C;Sa=Od(Ta|0,oa|0,470296,0)|0;Ra=C;Q=Od(Ta|0,oa|0,654183,0)|0;K=C;sa=Od(Ta|0,oa|0,-997805,-1)|0;ra=C;m=Od(Ta|0,oa|0,136657,0)|0;l=C;oa=Od(Ta|0,oa|0,-683901,-1)|0;oa=Dd(Ua|0,na|0,oa|0,C|0)|0;Aa=Dd(oa|0,C|0,za|0,Aa|0)|0;O=Cd(Aa|0,C|0,N|0,O|0)|0;N=C;Aa=Od(h|0,r|0,666643,0)|0;za=C;oa=Od(h|0,r|0,470296,0)|0;na=C;Ua=Od(h|0,r|0,654183,0)|0;Ta=C;ja=Od(h|0,r|0,-997805,-1)|0;B=C;ia=Od(h|0,r|0,136657,0)|0;ha=C;r=Od(h|0,r|0,-683901,-1)|0;h=C;wa=Od(fa|0,ga|0,666643,0)|0;wa=Dd(ya|0,pa|0,wa|0,C|0)|0;pa=C;ya=Od(fa|0,ga|0,470296,0)|0;xa=C;I=Od(fa|0,ga|0,654183,0)|0;E=C;Qa=Od(fa|0,ga|0,-997805,-1)|0;Pa=C;v=Od(fa|0,ga|0,136657,0)|0;y=C;ga=Od(fa|0,ga|0,-683901,-1)|0;fa=C;ra=Dd(ia|0,ha|0,sa|0,ra|0)|0;fa=Dd(ra|0,C|0,ga|0,fa|0)|0;qa=Dd(fa|0,C|0,va|0,qa|0)|0;ca=Dd(qa|0,C|0,ka|0,ca|0)|0;H=Cd(ca|0,C|0,w|0,H|0)|0;w=C;ca=Od(M|0,A|0,666643,0)|0;ka=C;qa=Od(M|0,A|0,470296,0)|0;qa=Dd(wa|0,pa|0,qa|0,C|0)|0;pa=C;wa=Od(M|0,A|0,654183,0)|0;va=C;fa=Od(M|0,A|0,-997805,-1)|0;ga=C;ra=Od(M|0,A|0,136657,0)|0;sa=C;A=Od(M|0,A|0,-683901,-1)|0;M=C;ha=Od(J|0,f|0,666643,0)|0;ia=C;da=Od(J|0,f|0,470296,0)|0;ea=C;$=Od(J|0,f|0,654183,0)|0;aa=C;V=Od(J|0,f|0,-997805,-1)|0;W=C;R=Od(J|0,f|0,136657,0)|0;S=C;f=Od(J|0,f|0,-683901,-1)|0;J=C;Ra=Dd(Ua|0,Ta|0,Sa|0,Ra|0)|0;Pa=Dd(Ra|0,C|0,Qa|0,Pa|0)|0;Na=Dd(Pa|0,C|0,Oa|0,Na|0)|0;T=Cd(Na|0,C|0,U|0,T|0)|0;sa=Dd(T|0,C|0,ra|0,sa|0)|0;J=Dd(sa|0,C|0,f|0,J|0)|0;f=C;sa=Od(x|0,j|0,666643,0)|0;ba=Dd(sa|0,C|0,D|0,ba|0)|0;D=C;sa=Od(x|0,j|0,470296,0)|0;ra=C;T=Od(x|0,j|0,654183,0)|0;U=C;Ja=Dd(Ma|0,La|0,Ka|0,Ja|0)|0;Ha=Cd(Ja|0,C|0,Ia|0,Ha|0)|0;ka=Dd(Ha|0,C|0,ca|0,ka|0)|0;U=Dd(ka|0,C|0,T|0,U|0)|0;ea=Dd(U|0,C|0,da|0,ea|0)|0;da=C;U=Od(x|0,j|0,-997805,-1)|0;T=C;ka=Od(x|0,j|0,136657,0)|0;ca=C;Da=Dd(Ga|0,Fa|0,Ea|0,Da|0)|0;Ba=Cd(Da|0,C|0,Ca|0,Ba|0)|0;za=Dd(Ba|0,C|0,Aa|0,za|0)|0;xa=Dd(za|0,C|0,ya|0,xa|0)|0;va=Dd(xa|0,C|0,wa|0,va|0)|0;ca=Dd(va|0,C|0,ka|0,ca|0)|0;W=Dd(ca|0,C|0,V|0,W|0)|0;V=C;j=Od(x|0,j|0,-683901,-1)|0;x=C;ca=Dd(ba|0,D|0,1048576,0)|0;ca=Ed(ca|0,C|0,21)|0;ka=C;ra=Dd(ua|0,ta|0,sa|0,ra|0)|0;ia=Dd(ra|0,C|0,ha|0,ia|0)|0;ia=Dd(ia|0,C|0,ca|0,ka|0)|0;ha=C;ka=Hd(ca|0,ka|0,21)|0;ka=Cd(ba|0,D|0,ka|0,C|0)|0;D=C;ba=Dd(ea|0,da|0,1048576,0)|0;ba=Ed(ba|0,C|0,21)|0;ca=C;T=Dd(qa|0,pa|0,U|0,T|0)|0;aa=Dd(T|0,C|0,$|0,aa|0)|0;aa=Dd(aa|0,C|0,ba|0,ca|0)|0;$=C;ca=Hd(ba|0,ca|0,21)|0;ba=C;T=Dd(W|0,V|0,1048576,0)|0;T=Ed(T|0,C|0,21)|0;U=C;la=Dd(oa|0,na|0,ma|0,la|0)|0;E=Dd(la|0,C|0,I|0,E|0)|0;Y=Dd(E|0,C|0,X|0,Y|0)|0;_=Cd(Y|0,C|0,Z|0,_|0)|0;ga=Dd(_|0,C|0,fa|0,ga|0)|0;x=Dd(ga|0,C|0,j|0,x|0)|0;S=Dd(x|0,C|0,R|0,S|0)|0;S=Dd(S|0,C|0,T|0,U|0)|0;R=C;U=Hd(T|0,U|0,21)|0;T=C;x=Dd(J|0,f|0,1048576,0)|0;x=Ed(x|0,C|0,21)|0;j=C;K=Dd(ja|0,B|0,Q|0,K|0)|0;y=Dd(K|0,C|0,v|0,y|0)|0;u=Dd(y|0,C|0,s|0,u|0)|0;g=Cd(u|0,C|0,F|0,g|0)|0;M=Dd(g|0,C|0,A|0,M|0)|0;M=Dd(M|0,C|0,x|0,j|0)|0;A=C;j=Hd(x|0,j|0,21)|0;j=Cd(J|0,f|0,j|0,C|0)|0;f=C;J=Dd(H|0,w|0,1048576,0)|0;J=Ed(J|0,C|0,21)|0;x=C;l=Dd(r|0,h|0,m|0,l|0)|0;n=Dd(l|0,C|0,L|0,n|0)|0;n=Dd(n|0,C|0,J|0,x|0)|0;P=Cd(n|0,C|0,p|0,P|0)|0;p=C;x=Hd(J|0,x|0,21)|0;x=Cd(H|0,w|0,x|0,C|0)|0;w=C;H=Dd(O|0,N|0,1048576,0)|0;H=Ed(H|0,C|0,21)|0;J=C;k=Dd(G|0,k|0,H|0,J|0)|0;G=C;J=Hd(H|0,J|0,21)|0;H=C;n=Dd(ia|0,ha|0,1048576,0)|0;n=Ed(n|0,C|0,21)|0;L=C;l=Hd(n|0,L|0,21)|0;m=C;h=Dd(aa|0,$|0,1048576,0)|0;h=Ed(h|0,C|0,21)|0;r=C;g=Hd(h|0,r|0,21)|0;F=C;u=Dd(S|0,R|0,1048576,0)|0;u=Ed(u|0,C|0,21)|0;s=C;f=Dd(j|0,f|0,u|0,s|0)|0;j=C;s=Hd(u|0,s|0,21)|0;u=C;y=Dd(M|0,A|0,1048576,0)|0;y=Ed(y|0,C|0,21)|0;v=C;w=Dd(x|0,w|0,y|0,v|0)|0;x=C;v=Hd(y|0,v|0,21)|0;v=Cd(M|0,A|0,v|0,C|0)|0;A=C;M=Dd(P|0,p|0,1048576,0)|0;M=Ed(M|0,C|0,21)|0;y=C;K=Hd(M|0,y|0,21)|0;K=Cd(P|0,p|0,K|0,C|0)|0;p=C;P=Dd(k|0,G|0,1048576,0)|0;P=Ed(P|0,C|0,21)|0;Q=C;B=Hd(P|0,Q|0,21)|0;B=Cd(k|0,G|0,B|0,C|0)|0;G=C;k=Od(P|0,Q|0,666643,0)|0;k=Dd(ka|0,D|0,k|0,C|0)|0;D=C;ka=Od(P|0,Q|0,470296,0)|0;ja=C;ga=Od(P|0,Q|0,654183,0)|0;fa=C;_=Od(P|0,Q|0,-997805,-1)|0;Z=C;Y=Od(P|0,Q|0,136657,0)|0;X=C;Q=Od(P|0,Q|0,-683901,-1)|0;P=C;E=Ed(k|0,D|0,21)|0;I=C;ha=Dd(ka|0,ja|0,ia|0,ha|0)|0;m=Cd(ha|0,C|0,l|0,m|0)|0;m=Dd(m|0,C|0,E|0,I|0)|0;l=C;I=Hd(E|0,I|0,21)|0;I=Cd(k|0,D|0,I|0,C|0)|0;D=C;k=Ed(m|0,l|0,21)|0;E=C;da=Dd(ga|0,fa|0,ea|0,da|0)|0;ba=Cd(da|0,C|0,ca|0,ba|0)|0;L=Dd(ba|0,C|0,n|0,L|0)|0;L=Dd(L|0,C|0,k|0,E|0)|0;n=C;E=Hd(k|0,E|0,21)|0;E=Cd(m|0,l|0,E|0,C|0)|0;l=C;m=Ed(L|0,n|0,21)|0;k=C;Z=Dd(aa|0,$|0,_|0,Z|0)|0;F=Cd(Z|0,C|0,g|0,F|0)|0;F=Dd(F|0,C|0,m|0,k|0)|0;g=C;k=Hd(m|0,k|0,21)|0;k=Cd(L|0,n|0,k|0,C|0)|0;n=C;L=Ed(F|0,g|0,21)|0;m=C;V=Dd(Y|0,X|0,W|0,V|0)|0;T=Cd(V|0,C|0,U|0,T|0)|0;r=Dd(T|0,C|0,h|0,r|0)|0;r=Dd(r|0,C|0,L|0,m|0)|0;h=C;m=Hd(L|0,m|0,21)|0;m=Cd(F|0,g|0,m|0,C|0)|0;g=C;F=Ed(r|0,h|0,21)|0;L=C;P=Dd(S|0,R|0,Q|0,P|0)|0;u=Cd(P|0,C|0,s|0,u|0)|0;u=Dd(u|0,C|0,F|0,L|0)|0;s=C;L=Hd(F|0,L|0,21)|0;L=Cd(r|0,h|0,L|0,C|0)|0;h=C;r=Ed(u|0,s|0,21)|0;F=C;j=Dd(f|0,j|0,r|0,F|0)|0;f=C;F=Hd(r|0,F|0,21)|0;F=Cd(u|0,s|0,F|0,C|0)|0;s=C;u=Ed(j|0,f|0,21)|0;r=C;A=Dd(u|0,r|0,v|0,A|0)|0;v=C;r=Hd(u|0,r|0,21)|0;r=Cd(j|0,f|0,r|0,C|0)|0;f=C;j=Ed(A|0,v|0,21)|0;u=C;x=Dd(w|0,x|0,j|0,u|0)|0;w=C;u=Hd(j|0,u|0,21)|0;u=Cd(A|0,v|0,u|0,C|0)|0;v=C;A=Ed(x|0,w|0,21)|0;j=C;p=Dd(A|0,j|0,K|0,p|0)|0;K=C;j=Hd(A|0,j|0,21)|0;j=Cd(x|0,w|0,j|0,C|0)|0;w=C;x=Ed(p|0,K|0,21)|0;A=C;y=Dd(O|0,N|0,M|0,y|0)|0;H=Cd(y|0,C|0,J|0,H|0)|0;H=Dd(H|0,C|0,x|0,A|0)|0;J=C;A=Hd(x|0,A|0,21)|0;A=Cd(p|0,K|0,A|0,C|0)|0;K=C;p=Ed(H|0,J|0,21)|0;x=C;G=Dd(p|0,x|0,B|0,G|0)|0;B=C;x=Hd(p|0,x|0,21)|0;x=Cd(H|0,J|0,x|0,C|0)|0;J=C;H=Ed(G|0,B|0,21)|0;p=C;y=Hd(H|0,p|0,21)|0;y=Cd(G|0,B|0,y|0,C|0)|0;B=C;G=Od(H|0,p|0,666643,0)|0;D=Dd(G|0,C|0,I|0,D|0)|0;I=C;G=Od(H|0,p|0,470296,0)|0;G=Dd(E|0,l|0,G|0,C|0)|0;l=C;E=Od(H|0,p|0,654183,0)|0;E=Dd(k|0,n|0,E|0,C|0)|0;n=C;k=Od(H|0,p|0,-997805,-1)|0;k=Dd(m|0,g|0,k|0,C|0)|0;g=C;m=Od(H|0,p|0,136657,0)|0;m=Dd(L|0,h|0,m|0,C|0)|0;h=C;p=Od(H|0,p|0,-683901,-1)|0;p=Dd(F|0,s|0,p|0,C|0)|0;s=C;F=Ed(D|0,I|0,21)|0;H=C;l=Dd(G|0,l|0,F|0,H|0)|0;G=C;H=Hd(F|0,H|0,21)|0;H=Cd(D|0,I|0,H|0,C|0)|0;I=C;D=Ed(l|0,G|0,21)|0;F=C;n=Dd(E|0,n|0,D|0,F|0)|0;E=C;F=Hd(D|0,F|0,21)|0;F=Cd(l|0,G|0,F|0,C|0)|0;G=C;l=Ed(n|0,E|0,21)|0;D=C;g=Dd(k|0,g|0,l|0,D|0)|0;k=C;D=Hd(l|0,D|0,21)|0;D=Cd(n|0,E|0,D|0,C|0)|0;E=C;n=Ed(g|0,k|0,21)|0;l=C;h=Dd(m|0,h|0,n|0,l|0)|0;m=C;l=Hd(n|0,l|0,21)|0;l=Cd(g|0,k|0,l|0,C|0)|0;k=C;g=Ed(h|0,m|0,21)|0;n=C;s=Dd(p|0,s|0,g|0,n|0)|0;p=C;n=Hd(g|0,n|0,21)|0;n=Cd(h|0,m|0,n|0,C|0)|0;m=C;h=Ed(s|0,p|0,21)|0;g=C;f=Dd(h|0,g|0,r|0,f|0)|0;r=C;g=Hd(h|0,g|0,21)|0;g=Cd(s|0,p|0,g|0,C|0)|0;p=C;s=Ed(f|0,r|0,21)|0;h=C;v=Dd(s|0,h|0,u|0,v|0)|0;u=C;h=Hd(s|0,h|0,21)|0;h=Cd(f|0,r|0,h|0,C|0)|0;r=C;f=Ed(v|0,u|0,21)|0;s=C;w=Dd(f|0,s|0,j|0,w|0)|0;j=C;s=Hd(f|0,s|0,21)|0;s=Cd(v|0,u|0,s|0,C|0)|0;u=C;v=Ed(w|0,j|0,21)|0;f=C;K=Dd(v|0,f|0,A|0,K|0)|0;A=C;f=Hd(v|0,f|0,21)|0;f=Cd(w|0,j|0,f|0,C|0)|0;j=C;w=Ed(K|0,A|0,21)|0;v=C;J=Dd(w|0,v|0,x|0,J|0)|0;x=C;v=Hd(w|0,v|0,21)|0;v=Cd(K|0,A|0,v|0,C|0)|0;A=C;K=Ed(J|0,x|0,21)|0;w=C;B=Dd(K|0,w|0,y|0,B|0)|0;y=C;w=Hd(K|0,w|0,21)|0;w=Cd(J|0,x|0,w|0,C|0)|0;x=C;a[o>>0]=H;o=Gd(H|0,I|0,8)|0;a[b+33>>0]=o;o=Gd(H|0,I|0,16)|0;I=C;H=Hd(F|0,G|0,5)|0;a[b+34>>0]=H|o;o=Gd(F|0,G|0,3)|0;a[b+35>>0]=o;o=Gd(F|0,G|0,11)|0;a[b+36>>0]=o;o=Gd(F|0,G|0,19)|0;G=C;F=Hd(D|0,E|0,2)|0;a[b+37>>0]=F|o;o=Gd(D|0,E|0,6)|0;a[b+38>>0]=o;o=Gd(D|0,E|0,14)|0;E=C;D=Hd(l|0,k|0,7)|0;a[b+39>>0]=D|o;o=Gd(l|0,k|0,1)|0;a[b+40>>0]=o;o=Gd(l|0,k|0,9)|0;a[b+41>>0]=o;o=Gd(l|0,k|0,17)|0;k=C;l=Hd(n|0,m|0,4)|0;a[b+42>>0]=l|o;o=Gd(n|0,m|0,4)|0;a[b+43>>0]=o;o=Gd(n|0,m|0,12)|0;a[b+44>>0]=o;o=Gd(n|0,m|0,20)|0;m=C;n=Hd(g|0,p|0,1)|0;a[b+45>>0]=n|o;o=Gd(g|0,p|0,7)|0;a[b+46>>0]=o;p=Gd(g|0,p|0,15)|0;o=C;g=Hd(h|0,r|0,6)|0;a[b+47>>0]=g|p;p=Gd(h|0,r|0,2)|0;a[b+48>>0]=p;p=Gd(h|0,r|0,10)|0;a[b+49>>0]=p;r=Gd(h|0,r|0,18)|0;h=C;p=Hd(s|0,u|0,3)|0;a[b+50>>0]=p|r;r=Gd(s|0,u|0,5)|0;a[b+51>>0]=r;u=Gd(s|0,u|0,13)|0;a[b+52>>0]=u;a[b+53>>0]=f;u=Gd(f|0,j|0,8)|0;a[b+54>>0]=u;j=Gd(f|0,j|0,16)|0;f=C;u=Hd(v|0,A|0,5)|0;a[b+55>>0]=u|j;j=Gd(v|0,A|0,3)|0;a[b+56>>0]=j;j=Gd(v|0,A|0,11)|0;a[b+57>>0]=j;A=Gd(v|0,A|0,19)|0;v=C;j=Hd(w|0,x|0,2)|0;a[b+58>>0]=j|A;A=Gd(w|0,x|0,6)|0;a[b+59>>0]=A;x=Gd(w|0,x|0,14)|0;w=C;A=Hd(B|0,y|0,7)|0;a[b+60>>0]=x|A;A=Gd(B|0,y|0,1)|0;a[b+61>>0]=A;A=Gd(B|0,y|0,9)|0;a[b+62>>0]=A;y=Gd(B|0,y|0,17)|0;a[b+63>>0]=y;y=q;B=y+64|0;do{a[y>>0]=0;y=y+1|0}while((y|0)<(b|0));y=t;b=y+64|0;do{a[y>>0]=0;y=y+1|0}while((y|0)<(b|0));if(!e){i=z;return}ec=e;c[ec>>2]=64;c[Ec+4>>2]=0;i=z;return}function Yc(b,c){b=b|0;c=c|0;return ((((a[c+1>>0]^a[b+1>>0]|a[c>>0]^a[b>>0]|a[c+2>>0]^a[b+2>>0]|a[c+3>>0]^a[b+3>>0]|a[c+4>>0]^a[b+4>>0]|a[c+5>>0]^a[b+5>>0]|a[c+6>>0]^a[b+6>>0]|a[c+7>>0]^a[b+7>>0]|a[c+8>>0]^a[b+8>>0]|a[c+9>>0]^a[b+9>>0]|a[c+10>>0]^a[b+10>>0]|a[c+11>>0]^a[b+11>>0]|a[c+12>>0]^a[b+12>>0]|a[c+13>>0]^a[b+13>>0]|a[c+14>>0]^a[b+14>>0]|a[c+15>>0]^a[b+15>>0]|a[c+16>>0]^a[b+16>>0]|a[c+17>>0]^a[b+17>>0]|a[c+18>>0]^a[b+18>>0]|a[c+19>>0]^a[b+19>>0]|a[c+20>>0]^a[b+20>>0]|a[c+21>>0]^a[b+21>>0]|a[c+22>>0]^a[b+22>>0]|a[c+23>>0]^a[b+23>>0]|a[c+24>>0]^a[b+24>>0]|a[c+25>>0]^a[b+25>>0]|a[c+26>>0]^a[b+26>>0]|a[c+27>>0]^a[b+27>>0]|a[c+28>>0]^a[b+28>>0]|a[c+29>>0]^a[b+29>>0]|a[c+30>>0]^a[b+30>>0]|a[c+31>>0]^a[b+31>>0])&255)+511|0)>>>8&1)+-1|0}function Zc(a){a=a|0;c[7976]=a;return 0}function _c(){return Ba(0)|0}function $c(){Ba(1);return}function ad(a){a=a|0;var b=0,d=0;b=c[7976]|0;if((b|0)!=0?(d=c[b+12>>2]|0,(d|0)!=0):0){a=Ea[d&31](a)|0;return a|0}if(a>>>0<2){a=0;return a|0}b="((0-a|0)">>>0)%(a>>>0)|0;do d=Ba(0)|0;while(d>>>0>>0);a=(d>>>0)%(a>>>0)|0;return a|0}function bd(b,c){b=b|0;c=c|0;var d=0;if(!c)return;else d=0;do{a[b+d>>0]=Ba(0)|0;d=d+1|0}while((d|0)!=(c|0));return}function cd(){var a=0;a=c[7976]|0;if(!a){a=0;return a|0}a=c[a+20>>2]|0;if(!a){a=0;return a|0}a=Da[a&31]()|0;return a|0}function dd(){var a=0,b=0;if(c[7977]|0){b=1;return b|0}Ba(1);a=na(30)|0;if((a|0)>0)c[7978]=a;else a=c[7978]|0;if(a>>>0<16)ra();else b="0;do{Ba(0)|0;b=b+1|0}while((b|0)!=16);c[7977]=1;b=0;return" b|0}function="" ed(a,b){a="a|0;b=b|0;Fd(a|0,0,b|0)|0;return}function" fd(b,c,e,f){b="b|0;c=c|0;e=e|0;f=f|0;var" g="0,h=0,i=0,j=0;g=f<<1;if(!(f">>>0<2147483647&g>>>0>>0))ra();if(!f){f=0;f=b+f|0;a[f>>0]=0;return b|0}else c=0;do{j=d[e+c>>0]|0;i=j&15;j=j>>>4;h=c<<1;a[b+h>>0]=j+87+((j+65526|0)>>>8&217);a[b+(h|1)>>0]=((i<<8)+22272+(i+65526&55552)|0)>>>8;c=c+1|0}while((c|0)!=(f|0));j=b+g|0;a[j>>0]=0;return b|0}function gd(b,e,f,g,h,i,j){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;a:do if(!g){n=0;l=0;o=0;k=0}else{b:do if(!h){n=0;r=0;l=0;k=0;while(1){p=d[f+l>>0]|0;m=p^48;o=(m+65526|0)>>>8;p=(p&223)+201|0;q=p&255;q=(q+65526^q+65520)>>>8;if(!((q|o)&255)){o=0;break a}m=q&p|o&m;if(n>>>0>=e>>>0){m=k;break b}if(!(k<<24>>24))m=m<<4&255;else{a[b+n>>0]=m|r&255;n=n+1|0;m=r}k=(k&255^255)&255;l=l+1|0;if(l>>>0>>0)r=m;else{o=0;break a}}}else{n=0;u=0;l=0;k=0;while(1){t=k<<24>>24==0;c:do if(!t){q=d[f+l>>0]|0;m=q^48;o=(m+65526|0)>>>8;q=(q&223)+201|0;p=q&255;p=(p+65526^p+65520)>>>8;if(!((p|o)&255)){o=0;break a}}else while(1){q=a[f+l>>0]|0;r=q&255;m=r^48;o=(m+65526|0)>>>8;s=(r&223)+201|0;p=s&255;p=(p+65526^p+65520)>>>8;if((p|o)&255){q=s;break c}s=ud(h,r)|0;if((s|0)==0?1:(a[s>>0]|0)!=q<<24>>24){o=0;k=0;break a}l=l+1|0;if(l>>>0>=g>>>0){o=0;k=0;break a}}while(0);m=p&q|o&m;if(n>>>0>=e>>>0){m=k;break b}if(t)m=m<<4&255;else{a[b+n>>0]=m|u&255;n=n+1|0;m=u}k=(k&255^255)&255;l=l+1|0;if(l>>>0>>0)u=m;else{o=0;break a}}}while(0);if(!(c[7979]|0))k=31964;else k=c[(oa()|0)+60>>2]|0;c[k>>2]=34;o=-1;k=m}while(0);if(j)c[j>>2]=f+(((k<<24>>24!=0)<<31>>31)+l);if(!i)return o|0;c[i>>2]=n;return o|0}function hd(){return 33779}function id(){return 8}function jd(){return 0}function kd(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0,fb=0,gb=0,hb=0,ib=0,jb=0,kb=0,lb=0,mb=0,nb=0,ob=0,pb=0,qb=0,rb=0,sb=0,tb=0,ub=0,vb=0,wb=0,xb=0,yb=0,zb=0,Ab=0,Bb=0,Cb=0,Db=0,Eb=0,Fb=0,Gb=0,Hb=0,Ib=0,Jb=0,Kb=0,Lb=0,Mb=0,Nb=0,Ob=0,Pb=0,Qb=0,Rb=0,Sb=0,Tb=0,Ub=0,Vb=0,Wb=0,Xb=0,Yb=0,Zb=0,_b=0,$b=0,ac=0,bc=0,cc=0,dc=0,ec=0,fc=0,gc=0,hc=0,ic=0,jc=0,kc=0,lc=0,mc=0,nc=0,oc=0,pc=0,qc=0,rc=0,sc=0,tc=0,uc=0,vc=0,wc=0,xc=0,yc=0,zc=0,Ac=0,Bc=0,Cc=0,Dc=0,Ec=0,Fc=0,Gc=0,Hc=0,Ic=0,Jc=0,Kc=0,Lc=0,Mc=0,Nc=0,Oc=0,Pc=0,Qc=0,Rc=0,Sc=0;l=c[b>>2]|0;s=c[b+4>>2]|0;j=c[b+8>>2]|0;Rb=c[b+12>>2]|0;e=c[b+16>>2]|0;za=c[b+20>>2]|0;ya=c[b+24>>2]|0;zb=c[b+28>>2]|0;h=c[b+32>>2]|0;ga=c[b+36>>2]|0;H=c[d>>2]|0;J=c[d+4>>2]|0;F=c[d+8>>2]|0;D=c[d+12>>2]|0;A=c[d+16>>2]|0;y=c[d+20>>2]|0;w=c[d+24>>2]|0;u=c[d+28>>2]|0;k=c[d+32>>2]|0;t=c[d+36>>2]|0;Oc=J*19|0;bc=F*19|0;rb=D*19|0;Ha=A*19|0;jc=y*19|0;Db=w*19|0;Ta=u*19|0;Sc=k*19|0;Qc=t*19|0;p=s<<1;f=rb<<1;m=za<<1;i=zb<<1;d=ga<<1;o=((l|0)<0)<<31>>31;I=((H|0)<0)<<31>>31;Mc=Od(H|0,I|0,l|0,o|0)|0;Lc=C;K=((J|0)<0)<<31>>31;wc=Od(J|0,K|0,l|0,o|0)|0;vc=C;G=((F|0)<0)<<31>>31;ub=Od(F|0,G|0,l|0,o|0)|0;tb=C;E=((D|0)<0)<<31>>31;Ka=Od(D|0,E|0,l|0,o|0)|0;Ja=C;B=((A|0)<0)<<31>>31;mc=Od(A|0,B|0,l|0,o|0)|0;lc=C;z=((y|0)<0)<<31>>31;Gb=Od(y|0,z|0,l|0,o|0)|0;Fb=C;x=((w|0)<0)<<31>>31;Wa=Od(w|0,x|0,l|0,o|0)|0;Va=C;v=((u|0)<0)<<31>>31;ja=Od(u|0,v|0,l|0,o|0)|0;ia=C;Pc=((k|0)<0)<<31>>31;P=Od(k|0,Pc|0,l|0,o|0)|0;O=C;o=Od(t|0,((t|0)<0)<<31>>31|0,l|0,o|0)|0;l=C;t=((s|0)<0)<<31>>31;dc=Od(H|0,I|0,s|0,t|0)|0;ec=C;n=((p|0)<0)<<31>>31;yb=Od(J|0,K|0,p|0,n|0)|0;xb=C;Ma=Od(F|0,G|0,s|0,t|0)|0;La=C;oc=Od(D|0,E|0,p|0,n|0)|0;nc=C;Ib=Od(A|0,B|0,s|0,t|0)|0;Hb=C;Ya=Od(y|0,z|0,p|0,n|0)|0;Xa=C;la=Od(w|0,x|0,s|0,t|0)|0;ka=C;R=Od(u|0,v|0,p|0,n|0)|0;Q=C;t=Od(k|0,Pc|0,s|0,t|0)|0;s=C;Pc=((Qc|0)<0)<<31>>31;n=Od(Qc|0,Pc|0,p|0,n|0)|0;p=C;k=((j|0)<0)<<31>>31;wb=Od(H|0,I|0,j|0,k|0)|0;vb=C;Qa=Od(J|0,K|0,j|0,k|0)|0;Pa=C;qc=Od(F|0,G|0,j|0,k|0)|0;pc=C;Kb=Od(D|0,E|0,j|0,k|0)|0;Jb=C;_a=Od(A|0,B|0,j|0,k|0)|0;Za=C;na=Od(y|0,z|0,j|0,k|0)|0;ma=C;T=Od(w|0,x|0,j|0,k|0)|0;S=C;v=Od(u|0,v|0,j|0,k|0)|0;u=C;Rc=((Sc|0)<0)<<31>>31;yc=Od(Sc|0,Rc|0,j|0,k|0)|0;xc=C;k=Od(Qc|0,Pc|0,j|0,k|0)|0;j=C;Sb=((Rb|0)<0)<<31>>31;Oa=Od(H|0,I|0,Rb|0,Sb|0)|0;Na=C;fa=((f|0)<0)<<31>>31;uc=Od(J|0,K|0,f|0,fa|0)|0;tc=C;Mb=Od(F|0,G|0,Rb|0,Sb|0)|0;Lb=C;ab=Od(D|0,E|0,f|0,fa|0)|0;$a=C;pa=Od(A|0,B|0,Rb|0,Sb|0)|0;oa=C;V=Od(y|0,z|0,f|0,fa|0)|0;U=C;x=Od(w|0,x|0,Rb|0,Sb|0)|0;w=C;Ua=((Ta|0)<0)<<31>>31;Ac=Od(Ta|0,Ua|0,f|0,fa|0)|0;zc=C;Sb=Od(Sc|0,Rc|0,Rb|0,Sb|0)|0;Rb=C;fa=Od(Qc|0,Pc|0,f|0,fa|0)|0;f=C;N=((e|0)<0)<<31>>31;sc=Od(H|0,I|0,e|0,N|0)|0;rc=C;Qb=Od(J|0,K|0,e|0,N|0)|0;Pb=C;cb=Od(F|0,G|0,e|0,N|0)|0;bb=C;ra=Od(D|0,E|0,e|0,N|0)|0;qa=C;X=Od(A|0,B|0,e|0,N|0)|0;W=C;z=Od(y|0,z|0,e|0,N|0)|0;y=C;Eb=((Db|0)<0)<<31>>31;Cc=Od(Db|0,Eb|0,e|0,N|0)|0;Bc=C;Ub=Od(Ta|0,Ua|0,e|0,N|0)|0;Tb=C;ib=Od(Sc|0,Rc|0,e|0,N|0)|0;hb=C;N=Od(Qc|0,Pc|0,e|0,N|0)|0;e=C;Aa=((za|0)<0)<<31>>31;Ob=Od(H|0,I|0,za|0,Aa|0)|0;Nb=C;b=((M|0)<0)<<31>>31;gb=Od(J|0,K|0,M|0,b|0)|0;fb=C;ta=Od(F|0,G|0,za|0,Aa|0)|0;sa=C;Z=Od(D|0,E|0,M|0,b|0)|0;Y=C;B=Od(A|0,B|0,za|0,Aa|0)|0;A=C;kc=((jc|0)<0)<<31>>31;Ec=Od(jc|0,kc|0,M|0,b|0)|0;Dc=C;Wb=Od(Db|0,Eb|0,za|0,Aa|0)|0;Vb=C;kb=Od(Ta|0,Ua|0,M|0,b|0)|0;jb=C;Aa=Od(Sc|0,Rc|0,za|0,Aa|0)|0;za=C;b=Od(Qc|0,Pc|0,M|0,b|0)|0;M=C;g=((ya|0)<0)<<31>>31;eb=Od(H|0,I|0,ya|0,g|0)|0;db=C;xa=Od(J|0,K|0,ya|0,g|0)|0;wa=C;$=Od(F|0,G|0,ya|0,g|0)|0;_=C;E=Od(D|0,E|0,ya|0,g|0)|0;D=C;Ia=((Ha|0)<0)<<31>>31;Gc=Od(Ha|0,Ia|0,ya|0,g|0)|0;Fc=C;Yb=Od(jc|0,kc|0,ya|0,g|0)|0;Xb=C;mb=Od(Db|0,Eb|0,ya|0,g|0)|0;lb=C;Ca=Od(Ta|0,Ua|0,ya|0,g|0)|0;Ba=C;m=Od(Sc|0,Rc|0,ya|0,g|0)|0;r=C;g=Od(Qc|0,Pc|0,ya|0,g|0)|0;ya=C;Ab=((zb|0)<0)<<31>>31;va=Od(H|0,I|0,zb|0,Ab|0)|0;ua=C;ea=((i|0)<0)<<31>>31;da=Od(J|0,K|0,i|0,ea|0)|0;ca=C;G=Od(F|0,G|0,zb|0,Ab|0)|0;F=C;sb=((rb|0)<0)<<31>>31;Ic=Od(rb|0,sb|0,i|0,ea|0)|0;Hc=C;_b=Od(Ha|0,Ia|0,zb|0,Ab|0)|0;Zb=C;ob=Od(jc|0,kc|0,i|0,ea|0)|0;nb=C;Ea=Od(Db|0,Eb|0,zb|0,Ab|0)|0;Da=C;gc=Od(Ta|0,Ua|0,i|0,ea|0)|0;fc=C;Ab=Od(Sc|0,Rc|0,zb|0,Ab|0)|0;zb=C;ea=Od(Qc|0,Pc|0,i|0,ea|0)|0;i=C;L=((h|0)<0)<<31>>31;ba=Od(H|0,I|0,h|0,L|0)|0;aa=C;K=Od(J|0,K|0,h|0,L|0)|0;J=C;cc=((bc|0)<0)<<31>>31;Kc=Od(bc|0,cc|0,h|0,L|0)|0;Jc=C;ac=Od(rb|0,sb|0,h|0,L|0)|0;$b=C;qb=Od(Ha|0,Ia|0,h|0,L|0)|0;pb=C;Ga=Od(jc|0,kc|0,h|0,L|0)|0;Fa=C;ic=Od(Db|0,Eb|0,h|0,L|0)|0;hc=C;Cb=Od(Ta|0,Ua|0,h|0,L|0)|0;Bb=C;Sa=Od(Sc|0,Rc|0,h|0,L|0)|0;Ra=C;L=Od(Qc|0,Pc|0,h|0,L|0)|0;h=C;ha=((ga|0)<0)<<31>>31;I=Od(H|0,I|0,ga|0,ha|0)|0;H=C;q=((d|0)<0)<<31>>31;Oc=Od(Oc|0,((Oc|0)<0)<<31>>31|0,d|0,q|0)|0;Nc=C;cc=Od(bc|0,cc|0,ga|0,ha|0)|0;bc=C;sb=Od(rb|0,sb|0,d|0,q|0)|0;rb=C;Ia=Od(Ha|0,Ia|0,ga|0,ha|0)|0;Ha=C;kc=Od(jc|0,kc|0,d|0,q|0)|0;jc=C;Eb=Od(Db|0,Eb|0,ga|0,ha|0)|0;Db=C;Ua=Od(Ta|0,Ua|0,d|0,q|0)|0;Ta=C;ha=Od(Sc|0,Rc|0,ga|0,ha|0)|0;ga=C;q=Od(Qc|0,Pc|0,d|0,q|0)|0;d=C;Lc=Dd(Oc|0,Nc|0,Mc|0,Lc|0)|0;Jc=Dd(Lc|0,C|0,Kc|0,Jc|0)|0;Hc=Dd(Jc|0,C|0,Ic|0,Hc|0)|0;Fc=Dd(Hc|0,C|0,Gc|0,Fc|0)|0;Dc=Dd(Fc|0,C|0,Ec|0,Dc|0)|0;Bc=Dd(Dc|0,C|0,Cc|0,Bc|0)|0;zc=Dd(Bc|0,C|0,Ac|0,zc|0)|0;xc=Dd(zc|0,C|0,yc|0,xc|0)|0;p=Dd(xc|0,C|0,n|0,p|0)|0;n=C;ec=Dd(wc|0,vc|0,dc|0,ec|0)|0;dc=C;rc=Dd(uc|0,tc|0,sc|0,rc|0)|0;pc=Dd(rc|0,C|0,qc|0,pc|0)|0;nc=Dd(pc|0,C|0,oc|0,nc|0)|0;lc=Dd(nc|0,C|0,mc|0,lc|0)|0;jc=Dd(lc|0,C|0,kc|0,jc|0)|0;hc=Dd(jc|0,C|0,ic|0,hc|0)|0;fc=Dd(hc|0,C|0,gc|0,fc|0)|0;r=Dd(fc|0,C|0,m|0,r|0)|0;M=Dd(r|0,C|0,b|0,M|0)|0;b=C;r=Dd(p|0,n|0,33554432,0)|0;r=Ed(r|0,C|0,26)|0;m=C;bc=Dd(ec|0,dc|0,cc|0,bc|0)|0;$b=Dd(bc|0,C|0,ac|0,$b|0)|0;Zb=Dd($b|0,C|0,_b|0,Zb|0)|0;Xb=Dd(Zb|0,C|0,Yb|0,Xb|0)|0;Vb=Dd(Xb|0,C|0,Wb|0,Vb|0)|0;Tb=Dd(Vb|0,C|0,Ub|0,Tb|0)|0;Rb=Dd(Tb|0,C|0,Sb|0,Rb|0)|0;j=Dd(Rb|0,C|0,k|0,j|0)|0;j=Dd(j|0,C|0,r|0,m|0)|0;k=C;m=Hd(r|0,m|0,26)|0;m=Cd(p|0,n|0,m|0,C|0)|0;n=C;p=Dd(M|0,b|0,33554432,0)|0;p=Ed(p|0,C|0,26)|0;r=C;Nb=Dd(Qb|0,Pb|0,Ob|0,Nb|0)|0;Lb=Dd(Nb|0,C|0,Mb|0,Lb|0)|0;Jb=Dd(Lb|0,C|0,Kb|0,Jb|0)|0;Hb=Dd(Jb|0,C|0,Ib|0,Hb|0)|0;Fb=Dd(Hb|0,C|0,Gb|0,Fb|0)|0;Db=Dd(Fb|0,C|0,Eb|0,Db|0)|0;Bb=Dd(Db|0,C|0,Cb|0,Bb|0)|0;zb=Dd(Bb|0,C|0,Ab|0,zb|0)|0;ya=Dd(zb|0,C|0,g|0,ya|0)|0;ya=Dd(ya|0,C|0,p|0,r|0)|0;g=C;r=Hd(p|0,r|0,26)|0;r=Cd(M|0,b|0,r|0,C|0)|0;b=C;M=Dd(j|0,k|0,16777216,0)|0;M=Ed(M|0,C|0,25)|0;p=C;vb=Dd(yb|0,xb|0,wb|0,vb|0)|0;tb=Dd(vb|0,C|0,ub|0,tb|0)|0;rb=Dd(tb|0,C|0,sb|0,rb|0)|0;pb=Dd(rb|0,C|0,qb|0,pb|0)|0;nb=Dd(pb|0,C|0,ob|0,nb|0)|0;lb=Dd(nb|0,C|0,mb|0,lb|0)|0;jb=Dd(lb|0,C|0,kb|0,jb|0)|0;hb=Dd(jb|0,C|0,ib|0,hb|0)|0;f=Dd(hb|0,C|0,fa|0,f|0)|0;f=Dd(f|0,C|0,M|0,p|0)|0;fa=C;p=Hd(M|0,p|0,25)|0;p=Cd(j|0,k|0,p|0,C|0)|0;k=C;j=Dd(ya|0,g|0,16777216,0)|0;j=Ed(j|0,C|0,25)|0;M=C;db=Dd(gb|0,fb|0,eb|0,db|0)|0;bb=Dd(db|0,C|0,cb|0,bb|0)|0;$a=Dd(bb|0,C|0,ab|0,$a|0)|0;Za=Dd($a|0,C|0,_a|0,Za|0)|0;Xa=Dd(Za|0,C|0,Ya|0,Xa|0)|0;Va=Dd(Xa|0,C|0,Wa|0,Va|0)|0;Ta=Dd(Va|0,C|0,Ua|0,Ta|0)|0;Ra=Dd(Ta|0,C|0,Sa|0,Ra|0)|0;i=Dd(Ra|0,C|0,ea|0,i|0)|0;i=Dd(i|0,C|0,j|0,M|0)|0;ea=C;M=Hd(j|0,M|0,25)|0;M=Cd(ya|0,g|0,M|0,C|0)|0;g=C;ya=Dd(f|0,fa|0,33554432,0)|0;ya=Ed(ya|0,C|0,26)|0;j=C;Na=Dd(Qa|0,Pa|0,Oa|0,Na|0)|0;La=Dd(Na|0,C|0,Ma|0,La|0)|0;Ja=Dd(La|0,C|0,Ka|0,Ja|0)|0;Ha=Dd(Ja|0,C|0,Ia|0,Ha|0)|0;Fa=Dd(Ha|0,C|0,Ga|0,Fa|0)|0;Da=Dd(Fa|0,C|0,Ea|0,Da|0)|0;Ba=Dd(Da|0,C|0,Ca|0,Ba|0)|0;za=Dd(Ba|0,C|0,Aa|0,za|0)|0;e=Dd(za|0,C|0,N|0,e|0)|0;e=Dd(e|0,C|0,ya|0,j|0)|0;N=C;j=Hd(ya|0,j|0,26)|0;j=Cd(f|0,fa|0,j|0,C|0)|0;fa=Dd(i|0,ea|0,33554432,0)|0;fa=Ed(fa|0,C|0,26)|0;f=C;ua=Dd(xa|0,wa|0,va|0,ua|0)|0;sa=Dd(ua|0,C|0,ta|0,sa|0)|0;qa=Dd(sa|0,C|0,ra|0,qa|0)|0;oa=Dd(qa|0,C|0,pa|0,oa|0)|0;ma=Dd(oa|0,C|0,na|0,ma|0)|0;ka=Dd(ma|0,C|0,la|0,ka|0)|0;ia=Dd(ka|0,C|0,ja|0,ia|0)|0;ga=Dd(ia|0,C|0,ha|0,ga|0)|0;h=Dd(ga|0,C|0,L|0,h|0)|0;h=Dd(h|0,C|0,fa|0,f|0)|0;L=C;f=Hd(fa|0,f|0,26)|0;f=Cd(i|0,ea|0,f|0,C|0)|0;ea=Dd(e|0,N|0,16777216,0)|0;ea=Ed(ea|0,C|0,25)|0;i=C;b=Dd(ea|0,i|0,r|0,b|0)|0;r=C;i=Hd(ea|0,i|0,25)|0;i=Cd(e|0,N|0,i|0,C|0)|0;N=Dd(h|0,L|0,16777216,0)|0;N=Ed(N|0,C|0,25)|0;e=C;aa=Dd(da|0,ca|0,ba|0,aa|0)|0;_=Dd(aa|0,C|0,$|0,_|0)|0;Y=Dd(_|0,C|0,Z|0,Y|0)|0;W=Dd(Y|0,C|0,X|0,W|0)|0;U=Dd(W|0,C|0,V|0,U|0)|0;S=Dd(U|0,C|0,T|0,S|0)|0;Q=Dd(S|0,C|0,R|0,Q|0)|0;O=Dd(Q|0,C|0,P|0,O|0)|0;d=Dd(O|0,C|0,q|0,d|0)|0;d=Dd(d|0,C|0,N|0,e|0)|0;q=C;e=Hd(N|0,e|0,25)|0;e=Cd(h|0,L|0,e|0,C|0)|0;L=Dd(b|0,r|0,33554432,0)|0;L=Ed(L|0,C|0,26)|0;h=C;g=Dd(M|0,g|0,L|0,h|0)|0;h=Hd(L|0,h|0,26)|0;h=Cd(b|0,r|0,h|0,C|0)|0;r=Dd(d|0,q|0,33554432,0)|0;r=Ed(r|0,C|0,26)|0;b=C;H=Dd(K|0,J|0,I|0,H|0)|0;F=Dd(H|0,C|0,G|0,F|0)|0;D=Dd(F|0,C|0,E|0,D|0)|0;A=Dd(D|0,C|0,B|0,A|0)|0;y=Dd(A|0,C|0,z|0,y|0)|0;w=Dd(y|0,C|0,x|0,w|0)|0;u=Dd(w|0,C|0,v|0,u|0)|0;s=Dd(u|0,C|0,t|0,s|0)|0;l=Dd(s|0,C|0,o|0,l|0)|0;l=Dd(l|0,C|0,r|0,b|0)|0;o=C;b=Hd(r|0,b|0,26)|0;b=Cd(d|0,q|0,b|0,C|0)|0;q=Dd(l|0,o|0,16777216,0)|0;q=Ed(q|0,C|0,25)|0;d=C;r=Od(q|0,d|0,19,0)|0;n=Dd(r|0,C|0,m|0,n|0)|0;m=C;d=Hd(q|0,d|0,25)|0;d=Cd(l|0,o|0,d|0,C|0)|0;o=Dd(n|0,m|0,33554432,0)|0;o=Ed(o|0,C|0,26)|0;l=C;k=Dd(p|0,k|0,o|0,l|0)|0;l=Hd(o|0,l|0,26)|0;l=Cd(n|0,m|0,l|0,C|0)|0;c[a>>2]=l;c[a+4>>2]=k;c[a+8>>2]=j;c[a+12>>2]=i;c[a+16>>2]=h;c[a+20>>2]=g;c[a+24>>2]=f;c[a+28>>2]=e;c[a+32>>2]=b;c[a+36>>2]=d;return}function ld(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0,fb=0,gb=0;bb=c[b>>2]|0;ua=c[b+4>>2]|0;j=c[b+8>>2]|0;la=c[b+12>>2]|0;e=c[b+16>>2]|0;db=c[b+20>>2]|0;Y=c[b+24>>2]|0;La=c[b+28>>2]|0;h=c[b+32>>2]|0;b=c[b+36>>2]|0;l=bb<<1;p=ua<<1;xa=j<<1;f=la<<1;na=e<<1;b=db<<1;m=y<<1;i=la<<1;ka=db*38|0;ra=y*19|0;va=la*38|0;da=h*19|0;gb=b*38|0;cb=((bb|0)<0)<<31>>31;cb=Od(bb|0,cb|0,bb|0,cb|0)|0;bb=C;o=((l|0)<0)<<31>>31;ta=((ua|0)<0)<<31>>31;Ia=Od(l|0,o|0,ua|0,ta|0)|0;Ha=C;k=((j|0)<0)<<31>>31;Wa=Od(j|0,k|0,l|0,o|0)|0;Va=C;ma=((la|0)<0)<<31>>31;Ua=Od(la|0,ma|0,l|0,o|0)|0;Ta=C;D=((e|0)<0)<<31>>31;Oa=Od(e|0,D|0,l|0,o|0)|0;Na=C;eb=((db|0)<0)<<31>>31;ya=Od(db|0,eb|0,l|0,o|0)|0;xa=C;g=((Y|0)<0)<<31>>31;ga=Od(Y|0,g|0,l|0,o|0)|0;fa=C;Ma=((La|0)<0)<<31>>31;R=Od(La|0,Ma|0,l|0,o|0)|0;Q=C;A=((h|0)<0)<<31>>31;F=Od(h|0,A|0,l|0,o|0)|0;E=C;q=((b|0)<0)<<31>>31;o=Od(b|0,q|0,l|0,o|0)|0;l=C;n=((p|0)<0)<<31>>31;ta=Od(p|0,n|0,ua|0,ta|0)|0;ua=C;ba=Od(p|0,n|0,j|0,k|0)|0;ca=C;P=((f|0)<0)<<31>>31;Sa=Od(f|0,P|0,p|0,n|0)|0;Ra=C;Ca=Od(e|0,D|0,p|0,n|0)|0;Ba=C;d=((B|0)<0)<<31>>31;ia=Od(B|0,d|0,p|0,n|0)|0;ha=C;T=Od(Y|0,g|0,p|0,n|0)|0;S=C;O=((i|0)<0)<<31>>31;H=Od(i|0,O|0,p|0,n|0)|0;G=C;t=Od(h|0,A|0,p|0,n|0)|0;s=C;fb=((gb|0)<0)<<31>>31;n=Od(gb|0,fb|0,p|0,n|0)|0;p=C;Qa=Od(j|0,k|0,j|0,k|0)|0;Pa=C;Ya=((Xa|0)<0)<<31>>31;Aa=Od(Xa|0,Ya|0,la|0,ma|0)|0;za=C;ka=Od(e|0,D|0,Xa|0,Ya|0)|0;ja=C;X=Od(db|0,eb|0,Xa|0,Ya|0)|0;W=C;N=Od(Y|0,g|0,Xa|0,Ya|0)|0;M=C;v=Od(La|0,Ma|0,Xa|0,Ya|0)|0;u=C;ea=((da|0)<0)<<31>>31;Ya=Od(da|0,ea|0,Xa|0,Ya|0)|0;Xa=C;k=Od(gb|0,fb|0,j|0,k|0)|0;j=C;ma=Od(f|0,P|0,la|0,ma|0)|0;la=C;V=Od(f|0,P|0,e|0,D|0)|0;U=C;J=Od(B|0,d|0,f|0,P|0)|0;I=C;z=Od(Y|0,g|0,f|0,P|0)|0;y=C;wa=((va|0)<0)<<31>>31;_a=Od(va|0,wa|0,f|0,P|0)|0;Za=C;Ea=Od(da|0,ea|0,f|0,P|0)|0;Da=C;P=Od(gb|0,fb|0,f|0,P|0)|0;f=C;L=Od(e|0,D|0,e|0,D|0)|0;K=C;oa=((na|0)<0)<<31>>31;x=Od(na|0,oa|0,db|0,eb|0)|0;w=C;sa=((ra|0)<0)<<31>>31;ab=Od(ra|0,sa|0,na|0,oa|0)|0;$a=C;Ga=Od(va|0,wa|0,e|0,D|0)|0;Fa=C;oa=Od(da|0,ea|0,na|0,oa|0)|0;na=C;D=Od(gb|0,fb|0,e|0,D|0)|0;e=C;eb=Od(Ka|0,((Ka|0)<0)<<31>>31|0,db|0,eb|0)|0;db=C;Ka=Od(ra|0,sa|0,B|0,d|0)|0;Ja=C;qa=Od(va|0,wa|0,B|0,d|0)|0;pa=C;_=Od(da|0,ea|0,B|0,d|0)|0;Z=C;d=Od(gb|0,fb|0,B|0,d|0)|0;B=C;sa=Od(ra|0,sa|0,Y|0,g|0)|0;ra=C;aa=Od(va|0,wa|0,Y|0,g|0)|0;$=C;m=Od(da|0,ea|0,m|0,((m|0)<0)<<31>>31|0)|0;r=C;g=Od(gb|0,fb|0,Y|0,g|0)|0;Y=C;Ma=Od(va|0,wa|0,La|0,Ma|0)|0;La=C;wa=Od(da|0,ea|0,i|0,O|0)|0;va=C;O=Od(gb|0,fb|0,i|0,O|0)|0;i=C;ea=Od(da|0,ea|0,h|0,A|0)|0;da=C;A=Od(gb|0,fb|0,h|0,A|0)|0;h=C;q=Od(gb|0,fb|0,b|0,q|0)|0;b=C;bb=Dd(eb|0,db|0,cb|0,bb|0)|0;$a=Dd(bb|0,C|0,ab|0,$a|0)|0;Za=Dd($a|0,C|0,_a|0,Za|0)|0;Xa=Dd(Za|0,C|0,Ya|0,Xa|0)|0;p=Dd(Xa|0,C|0,n|0,p|0)|0;n=C;ua=Dd(Wa|0,Va|0,ta|0,ua|0)|0;ta=C;ca=Dd(Ua|0,Ta|0,ba|0,ca|0)|0;ba=C;Pa=Dd(Sa|0,Ra|0,Qa|0,Pa|0)|0;Na=Dd(Pa|0,C|0,Oa|0,Na|0)|0;La=Dd(Na|0,C|0,Ma|0,La|0)|0;r=Dd(La|0,C|0,m|0,r|0)|0;B=Dd(r|0,C|0,d|0,B|0)|0;d=C;r=Dd(p|0,n|0,33554432,0)|0;r=Ed(r|0,C|0,26)|0;m=C;Ha=Dd(Ka|0,Ja|0,Ia|0,Ha|0)|0;Fa=Dd(Ha|0,C|0,Ga|0,Fa|0)|0;Da=Dd(Fa|0,C|0,Ea|0,Da|0)|0;j=Dd(Da|0,C|0,k|0,j|0)|0;j=Dd(j|0,C|0,r|0,m|0)|0;k=C;m=Hd(r|0,m|0,26)|0;m=Cd(p|0,n|0,m|0,C|0)|0;n=C;p=Dd(B|0,d|0,33554432,0)|0;p=Ed(p|0,C|0,26)|0;r=C;za=Dd(Ca|0,Ba|0,Aa|0,za|0)|0;xa=Dd(za|0,C|0,ya|0,xa|0)|0;va=Dd(xa|0,C|0,wa|0,va|0)|0;Y=Dd(va|0,C|0,g|0,Y|0)|0;Y=Dd(Y|0,C|0,p|0,r|0)|0;g=C;r=Hd(p|0,r|0,26)|0;r=Cd(B|0,d|0,r|0,C|0)|0;d=C;B=Dd(j|0,k|0,16777216,0)|0;B=Ed(B|0,C|0,25)|0;p=C;ra=Dd(ua|0,ta|0,sa|0,ra|0)|0;pa=Dd(ra|0,C|0,qa|0,pa|0)|0;na=Dd(pa|0,C|0,oa|0,na|0)|0;f=Dd(na|0,C|0,P|0,f|0)|0;f=Dd(f|0,C|0,B|0,p|0)|0;P=C;p=Hd(B|0,p|0,25)|0;p=Cd(j|0,k|0,p|0,C|0)|0;k=C;j=Dd(Y|0,g|0,16777216,0)|0;j=Ed(j|0,C|0,25)|0;B=C;ja=Dd(ma|0,la|0,ka|0,ja|0)|0;ha=Dd(ja|0,C|0,ia|0,ha|0)|0;fa=Dd(ha|0,C|0,ga|0,fa|0)|0;da=Dd(fa|0,C|0,ea|0,da|0)|0;i=Dd(da|0,C|0,O|0,i|0)|0;i=Dd(i|0,C|0,j|0,B|0)|0;O=C;B=Hd(j|0,B|0,25)|0;B=Cd(Y|0,g|0,B|0,C|0)|0;g=C;Y=Dd(f|0,P|0,33554432,0)|0;Y=Ed(Y|0,C|0,26)|0;j=C;$=Dd(ca|0,ba|0,aa|0,$|0)|0;Z=Dd($|0,C|0,_|0,Z|0)|0;e=Dd(Z|0,C|0,D|0,e|0)|0;e=Dd(e|0,C|0,Y|0,j|0)|0;D=C;j=Hd(Y|0,j|0,26)|0;j=Cd(f|0,P|0,j|0,C|0)|0;P=Dd(i|0,O|0,33554432,0)|0;P=Ed(P|0,C|0,26)|0;f=C;U=Dd(X|0,W|0,V|0,U|0)|0;S=Dd(U|0,C|0,T|0,S|0)|0;Q=Dd(S|0,C|0,R|0,Q|0)|0;h=Dd(Q|0,C|0,A|0,h|0)|0;h=Dd(h|0,C|0,P|0,f|0)|0;A=C;f=Hd(P|0,f|0,26)|0;f=Cd(i|0,O|0,f|0,C|0)|0;O=Dd(e|0,D|0,16777216,0)|0;O=Ed(O|0,C|0,25)|0;i=C;d=Dd(O|0,i|0,r|0,d|0)|0;r=C;i=Hd(O|0,i|0,25)|0;i=Cd(e|0,D|0,i|0,C|0)|0;D=Dd(h|0,A|0,16777216,0)|0;D=Ed(D|0,C|0,25)|0;e=C;K=Dd(N|0,M|0,L|0,K|0)|0;I=Dd(K|0,C|0,J|0,I|0)|0;G=Dd(I|0,C|0,H|0,G|0)|0;E=Dd(G|0,C|0,F|0,E|0)|0;b=Dd(E|0,C|0,q|0,b|0)|0;b=Dd(b|0,C|0,D|0,e|0)|0;q=C;e=Hd(D|0,e|0,25)|0;e=Cd(h|0,A|0,e|0,C|0)|0;A=Dd(d|0,r|0,33554432,0)|0;A=Ed(A|0,C|0,26)|0;h=C;g=Dd(B|0,g|0,A|0,h|0)|0;h=Hd(A|0,h|0,26)|0;h=Cd(d|0,r|0,h|0,C|0)|0;r=Dd(b|0,q|0,33554432,0)|0;r=Ed(r|0,C|0,26)|0;d=C;w=Dd(z|0,y|0,x|0,w|0)|0;u=Dd(w|0,C|0,v|0,u|0)|0;s=Dd(u|0,C|0,t|0,s|0)|0;l=Dd(s|0,C|0,o|0,l|0)|0;l=Dd(l|0,C|0,r|0,d|0)|0;o=C;d=Hd(r|0,d|0,26)|0;d=Cd(b|0,q|0,d|0,C|0)|0;q=Dd(l|0,o|0,16777216,0)|0;q=Ed(q|0,C|0,25)|0;b=C;r=Od(q|0,b|0,19,0)|0;n=Dd(r|0,C|0,m|0,n|0)|0;m=C;b=Hd(q|0,b|0,25)|0;b=Cd(l|0,o|0,b|0,C|0)|0;o=Dd(n|0,m|0,33554432,0)|0;o=Ed(o|0,C|0,26)|0;l=C;k=Dd(p|0,k|0,o|0,l|0)|0;l=Hd(o|0,l|0,26)|0;l=Cd(n|0,m|0,l|0,C|0)|0;c[a>>2]=l;c[a+4>>2]=k;c[a+8>>2]=j;c[a+12>>2]=i;c[a+16>>2]=h;c[a+20>>2]=g;c[a+24>>2]=f;c[a+28>>2]=e;c[a+32>>2]=d;c[a+36>>2]=b;return}function md(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0,fb=0,gb=0,hb=0,ib=0,jb=0,kb=0,lb=0,mb=0,nb=0;Ya=i;Oa=i=i+63&-64;i=i+480|0;Ta=Oa+400|0;Ua=Oa+360|0;Va=Oa+320|0;Sa=Oa+280|0;Ma=Oa+440|0;Pa=Oa+240|0;Wa=Oa+200|0;Xa=Oa+160|0;Qa=Oa+120|0;Ra=Oa+80|0;Na=Oa+40|0;h=Ma;g=h+32|0;do{a[h>>0]=a[e>>0]|0;h=h+1|0;e=e+1|0}while((h|0)<(g|0));a[ma>>0]=(d[Ma>>0]|0)&248;m=Ma+31|0;a[m>>0]=(d[m>>0]|0)&63|64;m=d[f>>0]|0;Da=Hd(d[f+1>>0]|0|0,0,8)|0;j=C;va=Hd(d[f+2>>0]|0|0,0,16)|0;j=j|C;Aa=Hd(d[f+3>>0]|0|0,0,24)|0;j=j|C;k=a[f+6>>0]|0;l=d[f+4>>0]|0;ya=Hd(d[f+5>>0]|0|0,0,8)|0;za=C;k=Hd(k&255|0,0,16)|0;za=Hd(ya|l|k|0,za|C|0,6)|0;k=C;l=a[f+9>>0]|0;ya=d[f+7>>0]|0;n=Hd(d[f+8>>0]|0|0,0,8)|0;Ea=C;l=Hd(l&255|0,0,16)|0;Ea=Hd(n|ya|l|0,Ea|C|0,5)|0;l=C;ya=a[f+12>>0]|0;n=d[f+10>>0]|0;Ga=Hd(d[f+11>>0]|0|0,0,8)|0;xa=C;ya=Hd(ya&255|0,0,16)|0;xa=Hd(Ga|n|ya|0,xa|C|0,3)|0;ya=C;n=a[f+15>>0]|0;Ga=d[f+13>>0]|0;h=Hd(d[f+14>>0]|0|0,0,8)|0;Ia=C;n=Hd(n&255|0,0,16)|0;Ia=Hd(h|Ga|n|0,Ia|C|0,2)|0;n=C;Ga=d[f+16>>0]|0;h=Hd(d[f+17>>0]|0|0,0,8)|0;Ca=C;p=Hd(d[f+18>>0]|0|0,0,16)|0;Ca=Ca|C;Ba=Hd(d[f+19>>0]|0|0,0,24)|0;Ba=h|Ga|p|Ba;Ca=Ca|C;p=a[f+22>>0]|0;Ga=d[f+20>>0]|0;h=Hd(d[f+21>>0]|0|0,0,8)|0;g=C;p=Hd(p&255|0,0,16)|0;g=Hd(h|Ga|p|0,g|C|0,7)|0;p=C;Ga=a[f+25>>0]|0;h=d[f+23>>0]|0;q=Hd(d[f+24>>0]|0|0,0,8)|0;Fa=C;Ga=Hd(Ga&255|0,0,16)|0;Fa=Hd(q|h|Ga|0,Fa|C|0,5)|0;Ga=C;h=a[f+28>>0]|0;q=d[f+26>>0]|0;Ka=Hd(d[f+27>>0]|0|0,0,8)|0;La=C;h=Hd(h&255|0,0,16)|0;La=Hd(Ka|q|h|0,La|C|0,4)|0;h=C;q=a[f+31>>0]|0;Ka=d[f+29>>0]|0;f=Hd(d[f+30>>0]|0|0,0,8)|0;Ja=C;q=Hd(q&255|0,0,16)|0;Ja=Hd(f|Ka|q|0,Ja|C|0,2)|0;Ja=Ja&33554428;q=Dd(Ja|0,0,16777216,0)|0;q=Gd(q|0,C|0,25)|0;Ka=C;f=Cd(0,0,q|0,Ka|0)|0;j=Dd(f&19|0,0,Da|m|va|Aa|0,j|0)|0;Aa=C;Ka=Hd(q|0,Ka|0,25)|0;q=C;f=Dd(za|0,k|0,16777216,0)|0;f=Gd(f|0,C|0,25)|0;va=C;l=Dd(Ea|0,l|0,f|0,va|0)|0;Ea=C;va=Hd(f|0,va|0,25)|0;va=Cd(za|0,k|0,va|0,C|0)|0;f=C;k=Dd(xa|0,ya|0,16777216,0)|0;k=Gd(k|0,C|0,25)|0;za=C;n=Dd(Ia|0,n|0,k|0,za|0)|0;Ia=C;za=Hd(k|0,za|0,25)|0;k=C;m=Dd(Ba|0,Ca|0,16777216,0)|0;m=Gd(m|0,C|0,25)|0;Da=C;p=Dd(g|0,p|0,m|0,Da|0)|0;g=C;Da=Hd(m|0,Da|0,25)|0;m=C;o=Dd(Fa|0,Ga|0,16777216,0)|0;o=Gd(o|0,C|0,25)|0;Ha=C;h=Dd(La|0,h|0,o|0,Ha|0)|0;La=C;Ha=Hd(o|0,Ha|0,25)|0;o=C;wa=Dd(j|0,Aa|0,33554432,0)|0;wa=Ed(wa|0,C|0,26)|0;e=C;f=Dd(va|0,f|0,wa|0,e|0)|0;e=Hd(wa|0,e|0,26)|0;e=Cd(j|0,Aa|0,e|0,C|0)|0;Aa=Dd(l|0,Ea|0,33554432,0)|0;Aa=Ed(Aa|0,C|0,26)|0;j=C;ya=Dd(Aa|0,j|0,xa|0,ya|0)|0;k=Cd(ya|0,C|0,za|0,k|0)|0;j=Hd(Aa|0,j|0,26)|0;j=Cd(l|0,Ea|0,j|0,C|0)|0;Ea=Dd(n|0,Ia|0,33554432,0)|0;Ea=Ed(Ea|0,C|0,26)|0;l=C;Ca=Dd(Ea|0,l|0,Ba|0,Ca|0)|0;m=Cd(Ca|0,C|0,Da|0,m|0)|0;l=Hd(Ea|0,l|0,26)|0;l=Cd(n|0,Ia|0,l|0,C|0)|0;Ia=Dd(p|0,g|0,33554432,0)|0;Ia=Ed(Ia|0,C|0,26)|0;n=C;Ga=Dd(Ia|0,n|0,Fa|0,Ga|0)|0;o=Cd(Ga|0,C|0,Ha|0,o|0)|0;n=Hd(Ia|0,n|0,26)|0;n=Cd(p|0,g|0,n|0,C|0)|0;g=Dd(h|0,La|0,33554432,0)|0;g=Ed(g|0,C|0,26)|0;p=C;Ja=Dd(Ja|0,0,g|0,p|0)|0;q=Cd(Ja|0,C|0,Ka|0,q|0)|0;p=Hd(g|0,p|0,26)|0;p=Cd(h|0,La|0,p|0,C|0)|0;c[Pa>>2]=e;c[Pa+4>>2]=f;c[Pa+8>>2]=j;c[Pa+12>>2]=k;c[Pa+16>>2]=l;c[Pa+20>>2]=m;c[Pa+24>>2]=n;c[Pa+28>>2]=o;c[Pa+32>>2]=p;c[Pa+36>>2]=q;c[Wa>>2]=1;La=Wa+4|0;h=La;g=h+36|0;do{c[h>>2]=0;h=h+4|0}while((h|0)<(g|0));h=xa;g=h+40|0;do{c[h>>2]=0;h=h+4|0}while((h|0)<(g|0));c[qa>>2]=e;ta=Qa+4|0;c[ta>>2]=f;ua=Qa+8|0;c[ua>>2]=j;va=Qa+12|0;c[va>>2]=k;wa=Qa+16|0;c[wa>>2]=l;xa=Qa+20|0;c[xa>>2]=m;ya=Qa+24|0;c[ya>>2]=n;za=Qa+28|0;c[za>>2]=o;Aa=Qa+32|0;c[Aa>>2]=p;Ba=Qa+36|0;c[Ba>>2]=q;c[Ra>>2]=1;Ca=Ra+4|0;h=Ca;g=h+36|0;do{c[h>>2]=0;h=h+4|0}while((h|0)<(g|0));da=wa+8|0;ea=wa+12|0;fa=wa+16|0;ga=wa+20|0;ha=wa+24|0;ia=wa+28|0;ja=wa+32|0;ka=wa+36|0;m=xa+4|0;n=xa+8|0;o=xa+12|0;p=xa+16|0;q=xa+20|0;r=xa+24|0;s=xa+28|0;t=xa+32|0;u=xa+36|0;v=ra+8|0;w=ra+12|0;x=ra+16|0;y=ra+20|0;z=ra+24|0;_=ra+28|0;$=ra+32|0;aa=ra+36|0;ba=na+4|0;ca=na+8|0;da=na+12|0;ea=na+16|0;fa=na+20|0;ga=na+24|0;ha=na+28|0;ia=na+32|0;ja=na+36|0;ka=oa+4|0;la=oa+8|0;ma=oa+12|0;na=oa+16|0;oa=oa+20|0;pa=oa+24|0;qa=oa+28|0;ra=oa+32|0;sa=oa+36|0;l=1;k=0;j=0;i=0;h=0;g=0;f=0;e=0;d=0;h=0;r=0;s=0;t=0;u=0;v=0;w=0;x=0;y=0;z=0;a=254;b=0;while(1){g=(d[ma+((a|0) 8|0)="">>0]|0)>>>(A&7)&1;nb=0-(g^B)|0;bb=(e^L)&nb;ab=(f^K)&nb;$a=(j^J)&nb;_a=(k^I)&nb;Za=(l^H)&nb;kb=(m^G)&nb;mb=(n^F)&nb;B=(o^E)&nb;jb=(p^D)&nb;lb=(q^h)&nb;c[Wa>>2]=bb^L;c[La>>2]=ab^K;c[Da>>2]=$a^J;c[Ea>>2]=_a^I;c[Fa>>2]=Za^H;c[Ga>>2]=kb^G;c[Ha>>2]=mb^F;c[Ia>>2]=B^E;c[Ja>>2]=jb^D;c[Ka>>2]=lb^h;bb=bb^e;c[Qa>>2]=bb;ab=ab^f;c[ta>>2]=ab;$a=$a^j;c[ua>>2]=$a;_a=_a^k;c[va>>2]=_a;Za=Za^l;c[wa>>2]=Za;I=kb^m;c[xa>>2]=I;E=mb^n;c[ya>>2]=E;l=B^o;c[za>>2]=l;j=jb^p;c[Aa>>2]=j;f=lb^q;c[Ba>>2]=f;K=c[U>>2]|0;lb=c[Ra>>2]|0;jb=c[Ca>>2]|0;B=c[V>>2]|0;p=c[W>>2]|0;q=c[X>>2]|0;D=c[Y>>2]|0;F=c[Z>>2]|0;H=c[_>>2]|0;J=c[$>>2]|0;L=c[aa>>2]|0;mb=(lb^r)&nb;kb=(jb^s)&nb;ib=(B^t)&nb;hb=(p^u)&nb;gb=(q^v)&nb;fb=(D^w)&nb;eb=(F^x)&nb;db=(H^y)&nb;cb=(J^z)&nb;o=(L^K)&nb;e=mb^r;c[Xa>>2]=e;h=kb^s;c[M>>2]=h;k=ib^t;c[N>>2]=k;m=hb^u;c[O>>2]=m;n=gb^v;c[P>>2]=n;r=fb^w;c[Q>>2]=r;v=eb^x;c[R>>2]=v;x=db^y;c[S>>2]=x;G=cb^z;c[T>>2]=G;K=o^K;c[U>>2]=K;s=mb^lb;c[Ra>>2]=s;u=kb^jb;c[Ca>>2]=u;B=ib^B;c[V>>2]=B;p=hb^p;c[W>>2]=p;q=gb^q;c[X>>2]=q;D=fb^D;c[Y>>2]=D;F=eb^F;c[Z>>2]=F;H=db^H;c[_>>2]=H;J=cb^J;c[$>>2]=J;L=o^L;c[aa>>2]=L;c[Na>>2]=bb-s;c[ba>>2]=ab-u;c[ca>>2]=$a-B;c[da>>2]=_a-p;c[ea>>2]=Za-q;c[fa>>2]=I-D;c[ga>>2]=E-F;c[ha>>2]=l-H;c[ia>>2]=j-J;c[ja>>2]=f-L;f=c[Wa>>2]|0;j=c[La>>2]|0;l=c[Da>>2]|0;w=c[Ea>>2]|0;o=c[Fa>>2]|0;t=c[Ga>>2]|0;z=c[Ha>>2]|0;E=c[Ia>>2]|0;I=c[Ja>>2]|0;y=c[Ka>>2]|0;c[Oa>>2]=f-e;c[ka>>2]=j-h;c[la>>2]=l-k;c[ma>>2]=w-m;c[na>>2]=o-n;c[oa>>2]=t-r;c[pa>>2]=z-v;c[qa>>2]=E-x;c[ra>>2]=I-G;c[sa>>2]=y-K;c[Wa>>2]=e+f;c[La>>2]=h+j;c[Da>>2]=k+l;c[Ea>>2]=m+w;c[Fa>>2]=n+o;c[Ga>>2]=r+t;c[Ha>>2]=v+z;c[Ia>>2]=x+E;c[Ja>>2]=G+I;c[Ka>>2]=K+y;u=u+(c[ta>>2]|0)|0;B=B+(c[ua>>2]|0)|0;p=p+(c[va>>2]|0)|0;q=q+(c[wa>>2]|0)|0;D=D+(c[xa>>2]|0)|0;F=F+(c[ya>>2]|0)|0;H=H+(c[za>>2]|0)|0;J=J+(c[Aa>>2]|0)|0;L=L+(c[Ba>>2]|0)|0;c[Xa>>2]=s+(c[Qa>>2]|0);c[M>>2]=u;c[N>>2]=B;c[O>>2]=p;c[P>>2]=q;c[Q>>2]=D;c[R>>2]=F;c[S>>2]=H;c[T>>2]=J;c[U>>2]=L;kd(Ra,Na,Wa);kd(Xa,Xa,Oa);ld(Na,Oa);ld(Oa,Wa);L=c[Ra>>2]|0;J=c[Ca>>2]|0;H=c[V>>2]|0;F=c[W>>2]|0;D=c[X>>2]|0;q=c[Y>>2]|0;p=c[Z>>2]|0;B=c[_>>2]|0;u=c[$>>2]|0;s=c[aa>>2]|0;y=c[Xa>>2]|0;K=c[M>>2]|0;I=c[N>>2]|0;G=c[O>>2]|0;E=c[P>>2]|0;z=c[Q>>2]|0;x=c[R>>2]|0;v=c[S>>2]|0;t=c[T>>2]|0;r=c[U>>2]|0;c[Qa>>2]=y+L;c[ta>>2]=K+J;c[ua>>2]=I+H;c[va>>2]=G+F;c[wa>>2]=E+D;c[xa>>2]=z+q;c[ya>>2]=x+p;c[za>>2]=v+B;c[Aa>>2]=t+u;c[Ba>>2]=r+s;c[Xa>>2]=L-y;c[M>>2]=J-K;c[N>>2]=H-I;c[O>>2]=F-G;c[P>>2]=D-E;c[Q>>2]=q-z;c[R>>2]=p-x;c[S>>2]=B-v;c[T>>2]=u-t;c[U>>2]=s-r;kd(Wa,Oa,Na);r=(c[Oa>>2]|0)-(c[Na>>2]|0)|0;s=(c[ka>>2]|0)-(c[ba>>2]|0)|0;t=(c[la>>2]|0)-(c[ca>>2]|0)|0;u=(c[ma>>2]|0)-(c[da>>2]|0)|0;v=(c[na>>2]|0)-(c[ea>>2]|0)|0;B=(c[oa>>2]|0)-(c[fa>>2]|0)|0;x=(c[pa>>2]|0)-(c[ga>>2]|0)|0;p=(c[qa>>2]|0)-(c[ha>>2]|0)|0;z=(c[ra>>2]|0)-(c[ia>>2]|0)|0;q=(c[sa>>2]|0)-(c[ja>>2]|0)|0;c[Oa>>2]=r;c[ka>>2]=s;c[la>>2]=t;c[ma>>2]=u;c[na>>2]=v;c[oa>>2]=B;c[pa>>2]=x;c[qa>>2]=p;c[ra>>2]=z;c[sa>>2]=q;ld(Xa,Xa);r=Od(r|0,((r|0)<0)<<31>>31|0,121666,0)|0;E=C;s=Od(s|0,((s|0)<0)<<31>>31|0,121666,0)|0;D=C;t=Od(t|0,((t|0)<0)<<31>>31|0,121666,0)|0;G=C;u=Od(u|0,((u|0)<0)<<31>>31|0,121666,0)|0;F=C;v=Od(v|0,((v|0)<0)<<31>>31|0,121666,0)|0;I=C;B=Od(B|0,((B|0)<0)<<31>>31|0,121666,0)|0;H=C;x=Od(x|0,((x|0)<0)<<31>>31|0,121666,0)|0;K=C;p=Od(p|0,((p|0)<0)<<31>>31|0,121666,0)|0;J=C;z=Od(z|0,((z|0)<0)<<31>>31|0,121666,0)|0;y=C;q=Od(q|0,((q|0)<0)<<31>>31|0,121666,0)|0;L=C;o=Dd(q|0,L|0,16777216,0)|0;o=Ed(o|0,C|0,25)|0;w=C;n=Od(o|0,w|0,19,0)|0;E=Dd(n|0,C|0,r|0,E|0)|0;r=C;w=Hd(o|0,w|0,25)|0;w=Cd(q|0,L|0,w|0,C|0)|0;L=C;q=Dd(s|0,D|0,16777216,0)|0;q=Ed(q|0,C|0,25)|0;o=C;G=Dd(q|0,o|0,t|0,G|0)|0;t=C;o=Hd(q|0,o|0,25)|0;o=Cd(s|0,D|0,o|0,C|0)|0;D=C;s=Dd(u|0,F|0,16777216,0)|0;s=Ed(s|0,C|0,25)|0;q=C;I=Dd(s|0,q|0,v|0,I|0)|0;v=C;q=Hd(s|0,q|0,25)|0;q=Cd(u|0,F|0,q|0,C|0)|0;F=C;u=Dd(B|0,H|0,16777216,0)|0;u=Ed(u|0,C|0,25)|0;s=C;K=Dd(u|0,s|0,x|0,K|0)|0;x=C;s=Hd(u|0,s|0,25)|0;s=Cd(B|0,H|0,s|0,C|0)|0;H=C;B=Dd(p|0,J|0,16777216,0)|0;B=Ed(B|0,C|0,25)|0;u=C;y=Dd(B|0,u|0,z|0,y|0)|0;z=C;u=Hd(B|0,u|0,25)|0;u=Cd(p|0,J|0,u|0,C|0)|0;J=C;p=Dd(E|0,r|0,33554432,0)|0;p=Ed(p|0,C|0,26)|0;B=C;D=Dd(o|0,D|0,p|0,B|0)|0;B=Hd(p|0,B|0,26)|0;B=Cd(E|0,r|0,B|0,C|0)|0;r=Dd(G|0,t|0,33554432,0)|0;r=Ed(r|0,C|0,26)|0;E=C;F=Dd(q|0,F|0,r|0,E|0)|0;E=Hd(r|0,E|0,26)|0;E=Cd(G|0,t|0,E|0,C|0)|0;t=Dd(I|0,v|0,33554432,0)|0;t=Ed(t|0,C|0,26)|0;G=C;H=Dd(s|0,H|0,t|0,G|0)|0;G=Hd(t|0,G|0,26)|0;G=Cd(I|0,v|0,G|0,C|0)|0;v=Dd(K|0,x|0,33554432,0)|0;v=Ed(v|0,C|0,26)|0;I=C;J=Dd(u|0,J|0,v|0,I|0)|0;I=Hd(v|0,I|0,26)|0;I=Cd(K|0,x|0,I|0,C|0)|0;x=Dd(y|0,z|0,33554432,0)|0;x=Ed(x|0,C|0,26)|0;K=C;L=Dd(w|0,L|0,x|0,K|0)|0;K=Hd(x|0,K|0,26)|0;K=Cd(y|0,z|0,K|0,C|0)|0;c[Ra>>2]=B;c[Ca>>2]=D;c[V>>2]=E;c[W>>2]=F;c[X>>2]=G;c[Y>>2]=H;c[Z>>2]=I;c[_>>2]=J;c[$>>2]=K;c[aa>>2]=L;ld(Qa,Qa);D=D+(c[ba>>2]|0)|0;E=E+(c[ca>>2]|0)|0;F=F+(c[da>>2]|0)|0;G=G+(c[ea>>2]|0)|0;H=H+(c[fa>>2]|0)|0;I=I+(c[ga>>2]|0)|0;J=J+(c[ha>>2]|0)|0;K=K+(c[ia>>2]|0)|0;L=L+(c[ja>>2]|0)|0;c[Na>>2]=B+(c[Na>>2]|0);c[ba>>2]=D;c[ca>>2]=E;c[da>>2]=F;c[ea>>2]=G;c[fa>>2]=H;c[ga>>2]=I;c[ha>>2]=J;c[ia>>2]=K;c[ja>>2]=L;kd(Ra,Pa,Xa);kd(Xa,Oa,Na);if((A|0)<=0)break;e=c[qa>>2]|0;L=c[Wa>>2]|0;f=c[ta>>2]|0;K=c[La>>2]|0;j=c[ua>>2]|0;J=c[Da>>2]|0;k=c[va>>2]|0;I=c[Ea>>2]|0;l=c[wa>>2]|0;H=c[Fa>>2]|0;m=c[xa>>2]|0;G=c[Ga>>2]|0;n=c[ya>>2]|0;F=c[Ha>>2]|0;o=c[za>>2]|0;E=c[Ia>>2]|0;p=c[Aa>>2]|0;D=c[Ja>>2]|0;q=c[Ba>>2]|0;h=c[Ka>>2]|0;r=c[Xa>>2]|0;s=c[M>>2]|0;t=c[N>>2]|0;u=c[O>>2]|0;v=c[P>>2]|0;w=c[Q>>2]|0;x=c[R>>2]|0;y=c[S>>2]|0;z=c[T>>2]|0;A=A+-1|0;B=g}ka=c[Wa>>2]|0;la=c[La>>2]|0;ma=c[Da>>2]|0;na=c[Ea>>2]|0;oa=c[Fa>>2]|0;pa=c[Ga>>2]|0;qa=c[Ha>>2]|0;ra=c[Ia>>2]|0;sa=c[Ja>>2]|0;lb=c[Ka>>2]|0;hb=c[Qa>>2]|0;db=c[ta>>2]|0;$a=c[ua>>2]|0;Pa=c[va>>2]|0;mb=c[wa>>2]|0;ib=c[xa>>2]|0;eb=c[ya>>2]|0;ab=c[za>>2]|0;Oa=c[Aa>>2]|0;Ma=c[Ba>>2]|0;nb=0-g|0;jb=(hb^ka)&nb;fb=(db^la)&nb;bb=($a^ma)&nb;Za=(Pa^na)&nb;e=(mb^oa)&nb;kb=(ib^pa)&nb;gb=(eb^qa)&nb;cb=(ab^ra)&nb;_a=(Oa^sa)&nb;Na=(Ma^lb)&nb;c[Wa>>2]=jb^ka;c[La>>2]=fb^la;c[Da>>2]=bb^ma;c[Ea>>2]=Za^na;c[Fa>>2]=e^oa;c[Ga>>2]=kb^pa;c[Ha>>2]=gb^qa;c[Ia>>2]=cb^ra;c[Ja>>2]=_a^sa;c[Ka>>2]=Na^lb;c[Qa>>2]=jb^hb;c[ta>>2]=fb^db;c[ua>>2]=bb^$a;c[va>>2]=Za^Pa;c[wa>>2]=e^mb;c[xa>>2]=kb^ib;c[ya>>2]=gb^eb;c[za>>2]=cb^ab;c[Aa>>2]=_a^Oa;c[Ba>>2]=Na^Ma;va=c[Xa>>2]|0;wa=c[M>>2]|0;xa=c[N>>2]|0;ya=c[O>>2]|0;za=c[P>>2]|0;Aa=c[Q>>2]|0;Ba=c[R>>2]|0;Ma=c[S>>2]|0;Na=c[T>>2]|0;Oa=c[U>>2]|0;Qa=c[Ra>>2]|0;_a=c[Ca>>2]|0;ab=c[V>>2]|0;cb=c[W>>2]|0;eb=c[X>>2]|0;gb=c[Y>>2]|0;ib=c[Z>>2]|0;kb=c[_>>2]|0;mb=c[$>>2]|0;e=c[aa>>2]|0;Pa=(Qa^va)&nb;Za=(_a^wa)&nb;$a=(ab^xa)&nb;bb=(cb^ya)&nb;db=(eb^za)&nb;fb=(gb^Aa)&nb;hb=(ib^Ba)&nb;jb=(kb^Ma)&nb;lb=(mb^Na)&nb;nb=(e^Oa)&nb;c[Xa>>2]=Pa^va;c[M>>2]=Za^wa;c[N>>2]=$a^xa;c[O>>2]=bb^ya;c[P>>2]=db^za;c[Q>>2]=fb^Aa;c[R>>2]=hb^Ba;c[S>>2]=jb^Ma;c[T>>2]=lb^Na;c[U>>2]=nb^Oa;c[Ra>>2]=Pa^Qa;c[Ca>>2]=Za^_a;c[V>>2]=$a^ab;c[W>>2]=bb^cb;c[X>>2]=db^eb;c[Y>>2]=fb^gb;c[Z>>2]=hb^ib;c[_>>2]=jb^kb;c[$>>2]=lb^mb;c[aa>>2]=nb^e;ld(Ta,Xa);ld(Ua,Ta);ld(Ua,Ua);kd(Ua,Xa,Ua);kd(Ta,Ta,Ua);ld(Va,Ta);kd(Ua,Ua,Va);ld(Va,Ua);ld(Va,Va);ld(Va,Va);ld(Va,Va);ld(Va,Va);kd(Ua,Va,Ua);ld(Va,Ua);ld(Va,Va);ld(Va,Va);ld(Va,Va);ld(Va,Va);ld(Va,Va);ld(Va,Va);ld(Va,Va);ld(Va,Va);ld(Va,Va);kd(Va,Va,Ua);ld(Sa,Va);ld(Sa,Sa);ld(Sa,Sa);ld(Sa,Sa);ld(Sa,Sa);ld(Sa,Sa);ld(Sa,Sa);ld(Sa,Sa);ld(Sa,Sa);ld(Sa,Sa);ld(Sa,Sa);ld(Sa,Sa);ld(Sa,Sa);ld(Sa,Sa);ld(Sa,Sa);ld(Sa,Sa);ld(Sa,Sa);ld(Sa,Sa);ld(Sa,Sa);ld(Sa,Sa);kd(Va,Sa,Va);ld(Va,Va);ld(Va,Va);ld(Va,Va);ld(Va,Va);ld(Va,Va);ld(Va,Va);ld(Va,Va);ld(Va,Va);ld(Va,Va);ld(Va,Va);kd(Ua,Va,Ua);ld(Va,Ua);e=1;do{ld(Va,Va);e=e+1|0}while((e|0)!=50);kd(Va,Va,Ua);ld(Sa,Va);e=1;do{ld(Sa,Sa);e=e+1|0}while((e|0)!=100);kd(Va,Sa,Va);ld(Va,Va);e=1;do{ld(Va,Va);e=e+1|0}while((e|0)!=50);kd(Ua,Va,Ua);ld(Ua,Ua);ld(Ua,Ua);ld(Ua,Ua);ld(Ua,Ua);ld(Ua,Ua);kd(Xa,Ua,Ta);kd(Wa,Wa,Xa);eb=c[Wa>>2]|0;fb=c[La>>2]|0;gb=c[Da>>2]|0;hb=c[Ea>>2]|0;ib=c[Fa>>2]|0;jb=c[Ga>>2]|0;kb=c[Ha>>2]|0;lb=c[Ia>>2]|0;nb=c[Ja>>2]|0;mb=c[Ka>>2]|0;eb=(((((((((((((mb*19|0)+16777216>>25)+eb>>26)+fb>>25)+gb>>26)+hb>>25)+ib>>26)+jb>>25)+kb>>26)+lb>>25)+nb>>26)+mb>>25)*19|0)+eb|0;db=eb>>26;fb=db+fb|0;db=eb-(db<<26)|0;eb=fb>>25;gb=eb+gb|0;eb=fb-(eb<<25)|0;fb=gb>>26;hb=fb+hb|0;fb=gb-(fb<<26)|0;gb=hb>>25;ib=gb+ib|0;gb=hb-(gb<<25)|0;hb=ib>>26;jb=hb+jb|0;hb=ib-(hb<<26)|0;ib=jb>>25;kb=ib+kb|0;ib=jb-(ib<<25)|0;jb=kb>>26;lb=jb+lb|0;jb=kb-(jb<<26)|0;kb=lb>>25;nb=kb+nb|0;kb=lb-(kb<<25)|0;lb=nb>>26;mb=lb+mb|0;lb=nb-(lb<<26)|0;nb=mb&33554431;a[b>>0]=db;a[b+1>>0]=db>>>8;a[b+2>>0]=db>>>16;a[b+3>>0]=eb<<2|db>>>24;a[b+4>>0]=eb>>>6;a[b+5>>0]=eb>>>14;a[b+6>>0]=fb<<3|eb>>>22;a[b+7>>0]=fb>>>5;a[b+8>>0]=fb>>>13;a[b+9>>0]=gb<<5|fb>>>21;a[b+10>>0]=gb>>>3;a[b+11>>0]=gb>>>11;a[b+12>>0]=hb<<6|gb>>>19;a[b+13>>0]=hb>>>2;a[b+14>>0]=hb>>>10;a[b+15>>0]=hb>>>18;a[b+16>>0]=ib;a[b+17>>0]=ib>>>8;a[b+18>>0]=ib>>>16;a[b+19>>0]=jb<<1|ib>>>24;a[b+20>>0]=jb>>>7;a[b+21>>0]=jb>>>15;a[b+22>>0]=kb<<3|jb>>>23;a[b+23>>0]=kb>>>5;a[b+24>>0]=kb>>>13;a[b+25>>0]=lb<<4|kb>>>21;a[b+26>>0]=lb>>>4;a[b+27>>0]=lb>>>12;a[b+28>>0]=lb>>>20|nb<<6;a[b+29>>0]=mb>>>2;a[b+30>>0]=mb>>>10;a[b+31>>0]=nb>>>18;i=Ya;return}function nd(b,e,f,g,h,j,k,l){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;var m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,D=0;D=i;B=i=i+63&-64;i=i+112|0;v=B;A=B+48|0;B=B+16|0;if((f|0)==0&(g|0)==0){i=D;return}n=B;m=n+32|0;do{a[n>>0]=a[l>>0]|0;n=n+1|0;l=l+1|0}while((n|0)<(m|0));s=h;p=s;s=s+4|0;s=d[s>>0]|d[s+1>>0]<<8|d[s+2>>0]<<16|d[s+3>>0]<<24;o=v;c[o>>2]=d[p>>0]|d[p+1>>0]<<8|d[p+2>>0]<<16|d[p+3>>0]<<24;c[o+4>>2]=s;o=v+8|0;a[o>>0]=j;s=Gd(j|0,k|0,8)|0;p=v+9|0;a[p>>0]=s;s=Gd(j|0,k|0,16)|0;q=v+10|0;a[q>>0]=s;s=Gd(j|0,k|0,24)|0;r=v+11|0;a[r>>0]=s;s=v+12|0;a[s>>0]=k;n=Gd(j|0,k|0,40)|0;t=v+13|0;a[t>>0]=n;n=Gd(j|0,k|0,48)|0;u=v+14|0;a[u>>0]=n;k=Gd(j|0,k|0,56)|0;j=v+15|0;a[j>>0]=k;if(g>>>0>0|(g|0)==0&f>>>0>63){n=e;h=f;l=g;do{ob(A,v,B,33833);m=0;do{a[b+m>>0]=a[A+m>>0]^a[n+m>>0];m=m+1|0}while((m|0)!=64);f=c[o>>2]|0;g=(f&255)+1|0;a[o>>0]=g;g=(f>>>8&255)+(g>>>8)|0;a[p>>0]=g;g=(f>>>16&255)+(g>>>8)|0;a[q>>0]=g;g=(f>>>24)+(g>>>8)|0;a[r>>0]=g;f=c[s>>2]|0;g=(f&255)+(g>>>8)|0;a[s>>0]=g;g=(f>>>8&255)+(g>>>8)|0;a[t>>0]=g;g=(f>>>16&255)+(g>>>8)|0;a[u>>0]=g;a[j>>0]=(f>>>24)+(g>>>8);h=Dd(h|0,l|0,-64,-1)|0;l=C;b=b+64|0;n=n+64|0}while(l>>>0>0|(l|0)==0&h>>>0>63);if(!((h|0)==0&(l|0)==0)){x=b;y=h;z=n;w=8}}else{x=b;y=f;z=e;w=8}if((w|0)==8?(ob(A,v,B,33833),(y|0)!=0):0){l=0;do{a[x+l>>0]=a[A+l>>0]^a[z+l>>0];l=l+1|0}while((l|0)!=(y|0))}n=A;m=n+64|0;do{a[n>>0]=0;n=n+1|0}while((n|0)<(m|0));n=b;m=n+32|0;do{a[n>>0]=0;n=n+1|0}while((n|0)<(m|0));i=d;return}function od(){var="" a="0;if(!(c[7979]|0))a=31964;else">>2]|0;return a|0}function pd(a){a=a|0;var b=0,d=0;d=i;b=i=i+63&-64;i=i+16|0;c[b>>2]=c[a+60>>2];a=pa(6,b|0)|0;if(a>>>0>4294963200){if(!(c[7979]|0))b=31964;else b=c[(oa()|0)+60>>2]|0;c[b>>2]=0-a;a=-1}i=d;return a|0}function qd(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;g=i;e=i=i+63&-64;i=i+32|0;h=e;e=e+20|0;c[h>>2]=c[a+60>>2];c[h+4>>2]=0;c[h+8>>2]=b;c[h+12>>2]=e;c[h+16>>2]=d;b=ya(140,h|0)|0;if(b>>>0<=4294963200)if((b|0)<0)f=7;else a="c[e">>2]|0;else{if(!(c[7979]|0))a=31964;else a=c[(oa()|0)+60>>2]|0;c[a>>2]=0-b;f=7}if((f|0)==7){c[e>>2]=-1;a=-1}i=g;return a|0}function rd(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;q=i;k=i=i+63&-64;i=i+48|0;n=k+16|0;m=k;k=k+32|0;o=a+28|0;g=c[o>>2]|0;c[k>>2]=g;p=a+20|0;g=(c[p>>2]|0)-g|0;c[k+4>>2]=g;c[k+8>>2]=b;c[k+12>>2]=d;j=a+60|0;l=a+44|0;f=2;g=g+d|0;while(1){if(!(c[7979]|0)){c[n>>2]=c[j>>2];c[n+4>>2]=k;c[n+8>>2]=f;b=Aa(146,n|0)|0;if(b>>>0>4294963200){if(!(c[7979]|0))e=31964;else e=c[(oa()|0)+60>>2]|0;c[e>>2]=0-b;b=-1}}else{ua(18,a|0);c[m>>2]=c[j>>2];c[m+4>>2]=k;c[m+8>>2]=f;b=Aa(146,m|0)|0;if(b>>>0>4294963200){if(!(c[7979]|0))e=31964;else e=c[(oa()|0)+60>>2]|0;c[e>>2]=0-b;b=-1}la(0)}if((g|0)==(b|0)){b=13;break}if((b|0)<0){b=15;break}g=g-b|0;e=c[k+4>>2]|0;if(b>>>0<=e>>>0)if((f|0)==2){c[o>>2]=(c[o>>2]|0)+b;h=e;e=k;f=2}else{h=e;e=k}else{h=c[l>>2]|0;c[o>>2]=h;c[p>>2]=h;h=c[k+12>>2]|0;b=b-e|0;e=k+8|0;f=f+-1|0}c[e>>2]=(c[e>>2]|0)+b;c[e+4>>2]=h-b;k=e}if((b|0)==13){n=c[l>>2]|0;c[a+16>>2]=n+(c[a+48>>2]|0);a=n;c[o>>2]=a;c[p>>2]=a}else if((b|0)==15){c[a+16>>2]=0;c[o>>2]=0;c[p>>2]=0;c[a>>2]=c[a>>2]|32;if((f|0)==2)d=0;else d=d-(c[k+4>>2]|0)|0}i=q;return d|0}function sd(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;g=i;h=i=i+63&-64;i=i+80|0;f=h;c[b+36>>2]=20;if((c[b>>2]&64|0)==0?(c[f>>2]=c[b+60>>2],c[f+4>>2]=21505,c[f+8>>2]=h+12,(wa(54,f|0)|0)!=0):0)a[b+75>>0]=-1;h=rd(b,d,e)|0;i=g;return h|0}function td(a){a=a|0;var b=0;if(!a){if(!(c[7990]|0))a=0;else a=td(c[7990]|0)|0;ma(31944);b=c[7985]|0;if(b)do{if((c[b+20>>2]|0)>>>0>(c[b+28>>2]|0)>>>0)a=xd(b)|0|a;b=c[b+56>>2]|0}while((b|0)!=0);xa(31944)}else a=xd(a)|0;return a|0}function ud(b,d){b=b|0;d=d|0;var e=0,f=0,g=0;f=d&255;a:do if(!f)b=b+(vd(b)|0)|0;else{if(b&3){e=d&255;do{g=a[b>>0]|0;if(g<<24>>24==0?1:g<<24>>24==e<<24>>24)break a;b=b+1|0}while((b&3|0)!=0)}f=_(f,16843009)|0;e=c[b>>2]|0;b:do if(!((e&-2139062144^-2139062144)&e+-16843009))do{g=e^f;if((g&-2139062144^-2139062144)&g+-16843009)break b;b=b+4|0;e=c[b>>2]|0}while(((e&-2139062144^-2139062144)&e+-16843009|0)==0);while(0);e=d&255;while(1){g=a[b>>0]|0;if(g<<24>>24==0?1:g<<24>>24==e<<24>>24)break;else b=b+1|0}}while(0);return b|0}function vd(b){b=b|0;var d=0,e=0,f=0;f=b;a:do if(!(f&3))e=4;else{d=b;b=f;while(1){if(!(a[d>>0]|0))break a;d=d+1|0;b=d;if(!(b&3)){b=d;e=4;break}}}while(0);if((e|0)==4){while(1){d=c[b>>2]|0;if(!((d&-2139062144^-2139062144)&d+-16843009))b=b+4|0;else break}if((d&255)<<24>>24)do b=b+1|0;while((a[b>>0]|0)!=0)}return b-f|0}function wd(a){a=a|0;return}function xd(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=a+20|0;g=a+28|0;if((c[b>>2]|0)>>>0>(c[g>>2]|0)>>>0?(Fa[c[a+36>>2]&31](a,0,0)|0,(c[b>>2]|0)==0):0)b=-1;else{h=a+4|0;d=c[h>>2]|0;e=a+8|0;f=c[e>>2]|0;if(d>>>0>>0)Fa[c[a+40>>2]&31](a,d-f|0,1)|0;c[a+16>>2]=0;c[g>>2]=0;c[b>>2]=0;c[e>>2]=0;c[h>>2]=0;b=0}return b|0} function Hb(a,b){a=a|0;b=b|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0;h=i;g=i=i+63&-64;i=i+640|0;e=0;do{j=b+(e<<3)|0;o=d[j+7>>0]|0;p=Hd(d[j+6>>0]|0|0,0,8)|0;f=C;n=Hd(d[j+5>>0]|0|0,0,16)|0;f=f|C;m=Hd(d[j+4>>0]|0|0,0,24)|0;f=f|C|(d[j+3>>0]|0);l=Hd(d[j+2>>0]|0|0,0,40)|0;f=f|C;k=Hd(d[j+1>>0]|0|0,0,48)|0;k=Dd(p|o|n|m|l|0,f|0,k|0,C|0)|0;f=C;j=Hd(d[j>>0]|0|0,0,56)|0;j=Dd(k|0,f|0,j|0,C|0)|0;f=g+(e<<3)|0;c[f>>2]=j;c[f+4>>2]=C;e=e+1|0}while((e|0)!=16);e=g;b=c[e>>2]|0;e=c[e+4>>2]|0;f=16;do{s=g+(f+-2<<3)|0;w=c[s>>2]|0;s=c[s+4>>2]|0;r=Gd(w|0,s|0,19)|0;j=C;q=Hd(w|0,s|0,45)|0;j=j|C;u=Gd(w|0,s|0,61)|0;v=C;t=Hd(w|0,s|0,3)|0;v=v|C;s=Gd(w|0,s|0,6)|0;j=v^C^j;v=g+(f+-7<<3)|0;w=c[v>>2]|0;v=c[v+4>>2]|0;n=g+(f+-15<<3)|0;y=b;b=c[n>>2]|0;x=e;e=c[n+4>>2]|0;n=Gd(b|0,e|0,1)|0;o=C;p=Hd(b|0,e|0,63)|0;o=o|C;k=Gd(b|0,e|0,8)|0;z=C;l=Hd(b|0,e|0,56)|0;z=z|C;m=Gd(b|0,e|0,7)|0;o=z^C^o;v=Dd(y|0,x|0,w|0,v|0)|0;j=Dd(v|0,C|0,(u|t)^s^(r|q)|0,j|0)|0;o=Dd(j|0,C|0,(k|l)^m^(n|p)|0,o|0)|0;p=g+(f<<3)|0;c[p>>2]=o;c[p+4>>2]=C;f=f+1|0}while((f|0)!=80);K=a;I=c[K>>2]|0;K=c[K+4>>2]|0;e=a+8|0;A=e;B=c[A>>2]|0;A=c[A+4>>2]|0;k=a+16|0;f=k;b=c[f>>2]|0;f=c[f+4>>2]|0;n=a+24|0;l=n;j=c[l>>2]|0;l=c[l+4>>2]|0;q=a+32|0;m=q;p=c[m>>2]|0;m=c[m+4>>2]|0;t=a+40|0;o=t;s=c[o>>2]|0;o=c[o+4>>2]|0;w=a+48|0;r=w;v=c[r>>2]|0;r=c[r+4>>2]|0;z=a+56|0;u=z;y=c[u>>2]|0;u=c[u+4>>2]|0;H=Gd(p|0,m|0,14)|0;D=C;x=Hd(p|0,m|0,50)|0;D=D|C;M=Gd(p|0,m|0,18)|0;E=C;L=Hd(p|0,m|0,46)|0;E=D^(E|C);D=Gd(p|0,m|0,41)|0;G=C;J=Hd(p|0,m|0,23)|0;G=E^(G|C);E=g;F=c[E>>2]|0;E=c[E+4>>2]|0;u=Dd(y|0,u|0,-685199838,1116352408)|0;E=Dd(u|0,C|0,F|0,E|0)|0;G=Dd(E|0,C|0,(H|x)^(M|L)^(D|J)|0,G|0)|0;G=Dd(G|0,C|0,(v^s)&p^v|0,(r^o)&m^r|0)|0;J=C;D=Gd(I|0,K|0,28)|0;L=C;M=Hd(I|0,K|0,36)|0;L=L|C;x=Gd(I|0,K|0,34)|0;H=C;E=Hd(I|0,K|0,30)|0;H=L^(H|C);L=Gd(I|0,K|0,39)|0;F=C;u=Hd(I|0,K|0,25)|0;F=Dd((b|B)&I|b&B|0,(f|A)&K|f&A|0,(D|M)^(x|E)^(L|u)|0,H^(F|C)|0)|0;H=C;l=Dd(j|0,l|0,G|0,J|0)|0;j=C;J=Dd(F|0,H|0,G|0,J|0)|0;G=C;H=Gd(l|0,j|0,14)|0;F=C;u=Hd(l|0,j|0,50)|0;F=F|C;L=Gd(l|0,j|0,18)|0;E=C;x=Hd(l|0,j|0,46)|0;E=F^(E|C);F=Gd(l|0,j|0,41)|0;M=C;D=Hd(l|0,j|0,23)|0;M=E^(M|C);E=g+8|0;y=c[E>>2]|0;E=c[E+4>>2]|0;r=Dd(v|0,r|0,602891725,1899447441)|0;E=Dd(r|0,C|0,y|0,E|0)|0;M=Dd(E|0,C|0,(H|u)^(L|x)^(F|D)|0,M|0)|0;M=Dd(M|0,C|0,(s^p)&l^s|0,(o^m)&j^o|0)|0;D=C;F=Gd(J|0,G|0,28)|0;x=C;L=Hd(J|0,G|0,36)|0;x=x|C;u=Gd(J|0,G|0,34)|0;H=C;E=Hd(J|0,G|0,30)|0;H=x^(H|C);x=Gd(J|0,G|0,39)|0;y=C;r=Hd(J|0,G|0,25)|0;y=Dd((B|I)&J|B&I|0,(A|K)&G|A&K|0,(F|L)^(u|E)^(x|r)|0,H^(y|C)|0)|0;H=C;f=Dd(b|0,f|0,M|0,D|0)|0;b=C;D=Dd(y|0,H|0,M|0,D|0)|0;M=C;H=Gd(f|0,b|0,14)|0;y=C;r=Hd(f|0,b|0,50)|0;y=y|C;x=Gd(f|0,b|0,18)|0;E=C;u=Hd(f|0,b|0,46)|0;E=y^(E|C);y=Gd(f|0,b|0,41)|0;L=C;F=Hd(f|0,b|0,23)|0;L=E^(L|C);E=g+16|0;v=c[E>>2]|0;E=c[E+4>>2]|0;o=Dd(s|0,o|0,-330482897,-1245643825)|0;E=Dd(o|0,C|0,v|0,E|0)|0;L=Dd(E|0,C|0,(H|r)^(x|u)^(y|F)|0,L|0)|0;L=Dd(L|0,C|0,(p^l)&f^p|0,(m^j)&b^m|0)|0;F=C;y=Gd(D|0,M|0,28)|0;u=C;x=Hd(D|0,M|0,36)|0;u=u|C;r=Gd(D|0,M|0,34)|0;H=C;E=Hd(D|0,M|0,30)|0;H=u^(H|C);u=Gd(D|0,M|0,39)|0;v=C;o=Hd(D|0,M|0,25)|0;v=Dd((I|J)&D|I&J|0,(K|G)&M|K&G|0,(y|x)^(r|E)^(u|o)|0,H^(v|C)|0)|0;H=C;A=Dd(B|0,A|0,L|0,F|0)|0;B=C;F=Dd(v|0,H|0,L|0,F|0)|0;L=C;H=Gd(A|0,B|0,14)|0;v=C;o=Hd(A|0,B|0,50)|0;v=v|C;u=Gd(A|0,B|0,18)|0;E=C;r=Hd(A|0,B|0,46)|0;E=v^(E|C);v=Gd(A|0,B|0,41)|0;x=C;y=Hd(A|0,B|0,23)|0;x=E^(x|C);E=g+24|0;s=c[E>>2]|0;E=c[E+4>>2]|0;m=Dd(p|0,m|0,-2121671748,-373957723)|0;E=Dd(m|0,C|0,s|0,E|0)|0;x=Dd(E|0,C|0,(H|o)^(u|r)^(v|y)|0,x|0)|0;x=Dd(x|0,C|0,(l^f)&A^l|0,(j^b)&B^j|0)|0;y=C;v=Gd(F|0,L|0,28)|0;r=C;u=Hd(F|0,L|0,36)|0;r=r|C;o=Gd(F|0,L|0,34)|0;H=C;E=Hd(F|0,L|0,30)|0;H=r^(H|C);r=Gd(F|0,L|0,39)|0;s=C;m=Hd(F|0,L|0,25)|0;s=Dd((J|D)&F|J&D|0,(G|M)&L|G&M|0,(v|u)^(o|E)^(r|m)|0,H^(s|C)|0)|0;H=C;K=Dd(I|0,K|0,x|0,y|0)|0;I=C;y=Dd(s|0,H|0,x|0,y|0)|0;x=C;H=Gd(K|0,I|0,14)|0;s=C;m=Hd(K|0,I|0,50)|0;s=s|C;r=Gd(K|0,I|0,18)|0;E=C;o=Hd(K|0,I|0,46)|0;E=s^(E|C);s=Gd(K|0,I|0,41)|0;u=C;v=Hd(K|0,I|0,23)|0;u=E^(u|C);E=g+32|0;p=c[E>>2]|0;E=c[E+4>>2]|0;j=Dd(l|0,j|0,-213338824,961987163)|0;E=Dd(j|0,C|0,p|0,E|0)|0;u=Dd(E|0,C|0,(H|m)^(r|o)^(s|v)|0,u|0)|0;u=Dd(u|0,C|0,(f^A)&K^f|0,(b^B)&I^b|0)|0;v=C;s=Gd(y|0,x|0,28)|0;o=C;r=Hd(y|0,x|0,36)|0;o=o|C;m=Gd(y|0,x|0,34)|0;H=C;E=Hd(y|0,x|0,30)|0;H=o^(H|C);o=Gd(y|0,x|0,39)|0;p=C;j=Hd(y|0,x|0,25)|0;p=Dd((D|F)&y|D&F|0,(M|L)&x|M&L|0,(s|r)^(m|E)^(o|j)|0,H^(p|C)|0)|0;H=C;G=Dd(J|0,G|0,u|0,v|0)|0;J=C;v=Dd(p|0,H|0,u|0,v|0)|0;u=C;H=Gd(G|0,J|0,14)|0;p=C;j=Hd(G|0,J|0,50)|0;p=p|C;o=Gd(G|0,J|0,18)|0;E=C;m=Hd(G|0,J|0,46)|0;E=p^(E|C);p=Gd(G|0,J|0,41)|0;r=C;s=Hd(G|0,J|0,23)|0;r=E^(r|C);E=g+40|0;l=c[E>>2]|0;E=c[E+4>>2]|0;b=Dd(f|0,b|0,-1241133031,1508970993)|0;E=Dd(b|0,C|0,l|0,E|0)|0;r=Dd(E|0,C|0,(H|j)^(o|m)^(p|s)|0,r|0)|0;r=Dd(r|0,C|0,(A^K)&G^A|0,(B^I)&J^B|0)|0;s=C;p=Gd(v|0,u|0,28)|0;m=C;o=Hd(v|0,u|0,36)|0;m=m|C;j=Gd(v|0,u|0,34)|0;H=C;E=Hd(v|0,u|0,30)|0;H=m^(H|C);m=Gd(v|0,u|0,39)|0;l=C;b=Hd(v|0,u|0,25)|0;l=Dd((F|y)&v|F&y|0,(L|x)&u|L&x|0,(p|o)^(j|E)^(m|b)|0,H^(l|C)|0)|0;H=C;M=Dd(D|0,M|0,r|0,s|0)|0;D=C;s=Dd(l|0,H|0,r|0,s|0)|0;r=C;H=Gd(M|0,D|0,14)|0;l=C;b=Hd(M|0,D|0,50)|0;l=l|C;m=Gd(M|0,D|0,18)|0;E=C;j=Hd(M|0,D|0,46)|0;E=l^(E|C);l=Gd(M|0,D|0,41)|0;o=C;p=Hd(M|0,D|0,23)|0;o=E^(o|C);E=g+48|0;f=c[E>>2]|0;E=c[E+4>>2]|0;B=Dd(A|0,B|0,-1357295717,-1841331548)|0;E=Dd(B|0,C|0,f|0,E|0)|0;o=Dd(E|0,C|0,(H|b)^(m|j)^(l|p)|0,o|0)|0;o=Dd(o|0,C|0,(K^G)&M^K|0,(I^J)&D^I|0)|0;p=C;l=Gd(s|0,r|0,28)|0;j=C;m=Hd(s|0,r|0,36)|0;j=j|C;b=Gd(s|0,r|0,34)|0;H=C;E=Hd(s|0,r|0,30)|0;H=j^(H|C);j=Gd(s|0,r|0,39)|0;f=C;B=Hd(s|0,r|0,25)|0;f=Dd((y|v)&s|y&v|0,(x|u)&r|x&u|0,(l|m)^(b|E)^(j|B)|0,H^(f|C)|0)|0;H=C;L=Dd(F|0,L|0,o|0,p|0)|0;F=C;p=Dd(f|0,H|0,o|0,p|0)|0;o=C;H=Gd(L|0,F|0,14)|0;f=C;B=Hd(L|0,F|0,50)|0;f=f|C;j=Gd(L|0,F|0,18)|0;E=C;b=Hd(L|0,F|0,46)|0;E=f^(E|C);f=Gd(L|0,F|0,41)|0;m=C;l=Hd(L|0,F|0,23)|0;m=E^(m|C);E=g+56|0;A=c[E>>2]|0;E=c[E+4>>2]|0;I=Dd(K|0,I|0,-630357736,-1424204075)|0;E=Dd(I|0,C|0,A|0,E|0)|0;m=Dd(E|0,C|0,(H|B)^(j|b)^(f|l)|0,m|0)|0;m=Dd(m|0,C|0,(G^M)&L^G|0,(J^D)&F^J|0)|0;l=C;f=Gd(p|0,o|0,28)|0;b=C;j=Hd(p|0,o|0,36)|0;b=b|C;B=Gd(p|0,o|0,34)|0;H=C;E=Hd(p|0,o|0,30)|0;H=b^(H|C);b=Gd(p|0,o|0,39)|0;A=C;I=Hd(p|0,o|0,25)|0;A=Dd((v|s)&p|v&s|0,(u|r)&o|u&r|0,(f|j)^(B|E)^(b|I)|0,H^(A|C)|0)|0;H=C;x=Dd(y|0,x|0,m|0,l|0)|0;y=C;l=Dd(A|0,H|0,m|0,l|0)|0;m=C;H=Gd(x|0,y|0,14)|0;A=C;I=Hd(x|0,y|0,50)|0;A=A|C;b=Gd(x|0,y|0,18)|0;E=C;B=Hd(x|0,y|0,46)|0;E=A^(E|C);A=Gd(x|0,y|0,41)|0;j=C;f=Hd(x|0,y|0,23)|0;j=E^(j|C);E=g+64|0;K=c[E>>2]|0;E=c[E+4>>2]|0;J=Dd(G|0,J|0,-1560083902,-670586216)|0;E=Dd(J|0,C|0,K|0,E|0)|0;j=Dd(E|0,C|0,(H|I)^(b|B)^(A|f)|0,j|0)|0;j=Dd(j|0,C|0,(M^L)&x^M|0,(D^F)&y^D|0)|0;f=C;A=Gd(l|0,m|0,28)|0;B=C;b=Hd(l|0,m|0,36)|0;B=B|C;I=Gd(l|0,m|0,34)|0;H=C;E=Hd(l|0,m|0,30)|0;H=B^(H|C);B=Gd(l|0,m|0,39)|0;K=C;J=Hd(l|0,m|0,25)|0;K=Dd((s|p)&l|s&p|0,(r|o)&m|r&o|0,(A|b)^(I|E)^(B|J)|0,H^(K|C)|0)|0;H=C;u=Dd(v|0,u|0,j|0,f|0)|0;v=C;f=Dd(K|0,H|0,j|0,f|0)|0;j=C;H=Gd(u|0,v|0,14)|0;K=C;J=Hd(u|0,v|0,50)|0;K=K|C;B=Gd(u|0,v|0,18)|0;E=C;I=Hd(u|0,v|0,46)|0;E=K^(E|C);K=Gd(u|0,v|0,41)|0;b=C;A=Hd(u|0,v|0,23)|0;b=E^(b|C);E=g+72|0;G=c[E>>2]|0;E=c[E+4>>2]|0;D=Dd(M|0,D|0,1164996542,310598401)|0;E=Dd(D|0,C|0,G|0,E|0)|0;b=Dd(E|0,C|0,(H|J)^(B|I)^(K|A)|0,b|0)|0;b=Dd(b|0,C|0,(L^x)&u^L|0,(F^y)&v^F|0)|0;A=C;K=Gd(f|0,j|0,28)|0;I=C;B=Hd(f|0,j|0,36)|0;I=I|C;J=Gd(f|0,j|0,34)|0;H=C;E=Hd(f|0,j|0,30)|0;H=I^(H|C);I=Gd(f|0,j|0,39)|0;G=C;D=Hd(f|0,j|0,25)|0;G=Dd((p|l)&f|p&l|0,(o|m)&j|o&m|0,(K|B)^(J|E)^(I|D)|0,H^(G|C)|0)|0;H=C;r=Dd(s|0,r|0,b|0,A|0)|0;s=C;A=Dd(G|0,H|0,b|0,A|0)|0;b=C;H=Gd(r|0,s|0,14)|0;G=C;D=Hd(r|0,s|0,50)|0;G=G|C;I=Gd(r|0,s|0,18)|0;E=C;J=Hd(r|0,s|0,46)|0;E=G^(E|C);G=Gd(r|0,s|0,41)|0;B=C;K=Hd(r|0,s|0,23)|0;B=E^(B|C);E=g+80|0;M=c[E>>2]|0;E=c[E+4>>2]|0;F=Dd(L|0,F|0,1323610764,607225278)|0;E=Dd(F|0,C|0,M|0,E|0)|0;B=Dd(E|0,C|0,(H|D)^(I|J)^(G|K)|0,B|0)|0;B=Dd(B|0,C|0,(x^u)&r^x|0,(y^v)&s^y|0)|0;K=C;G=Gd(A|0,b|0,28)|0;J=C;I=Hd(A|0,b|0,36)|0;J=J|C;D=Gd(A|0,b|0,34)|0;H=C;E=Hd(A|0,b|0,30)|0;H=J^(H|C);J=Gd(A|0,b|0,39)|0;M=C;F=Hd(A|0,b|0,25)|0;M=Dd((l|f)&A|l&f|0,(m|j)&b|m&j|0,(G|I)^(D|E)^(J|F)|0,H^(M|C)|0)|0;H=C;o=Dd(p|0,o|0,B|0,K|0)|0;p=C;K=Dd(M|0,H|0,B|0,K|0)|0;B=C;H=Gd(o|0,p|0,14)|0;M=C;F=Hd(o|0,p|0,50)|0;M=M|C;J=Gd(o|0,p|0,18)|0;E=C;D=Hd(o|0,p|0,46)|0;E=M^(E|C);M=Gd(o|0,p|0,41)|0;I=C;G=Hd(o|0,p|0,23)|0;I=E^(I|C);E=g+88|0;L=c[E>>2]|0;E=c[E+4>>2]|0;y=Dd(x|0,y|0,-704662302,1426881987)|0;E=Dd(y|0,C|0,L|0,E|0)|0;I=Dd(E|0,C|0,(H|F)^(J|D)^(M|G)|0,I|0)|0;I=Dd(I|0,C|0,(u^r)&o^u|0,(v^s)&p^v|0)|0;G=C;M=Gd(K|0,B|0,28)|0;D=C;J=Hd(K|0,B|0,36)|0;D=D|C;F=Gd(K|0,B|0,34)|0;H=C;E=Hd(K|0,B|0,30)|0;H=D^(H|C);D=Gd(K|0,B|0,39)|0;L=C;y=Hd(K|0,B|0,25)|0;L=Dd((f|A)&K|f&A|0,(j|b)&B|j&b|0,(M|J)^(F|E)^(D|y)|0,H^(L|C)|0)|0;H=C;m=Dd(l|0,m|0,I|0,G|0)|0;l=C;G=Dd(L|0,H|0,I|0,G|0)|0;I=C;H=Gd(m|0,l|0,14)|0;L=C;y=Hd(m|0,l|0,50)|0;L=L|C;D=Gd(m|0,l|0,18)|0;E=C;F=Hd(m|0,l|0,46)|0;E=L^(E|C);L=Gd(m|0,l|0,41)|0;J=C;M=Hd(m|0,l|0,23)|0;J=E^(J|C);E=g+96|0;x=c[E>>2]|0;E=c[E+4>>2]|0;v=Dd(u|0,v|0,-226784913,1925078388)|0;E=Dd(v|0,C|0,x|0,E|0)|0;J=Dd(E|0,C|0,(H|y)^(D|F)^(L|M)|0,J|0)|0;J=Dd(J|0,C|0,(r^o)&m^r|0,(s^p)&l^s|0)|0;M=C;L=Gd(G|0,I|0,28)|0;F=C;D=Hd(G|0,I|0,36)|0;F=F|C;y=Gd(G|0,I|0,34)|0;H=C;E=Hd(G|0,I|0,30)|0;H=F^(H|C);F=Gd(G|0,I|0,39)|0;x=C;v=Hd(G|0,I|0,25)|0;x=Dd((A|K)&G|A&K|0,(b|B)&I|b&B|0,(L|D)^(y|E)^(F|v)|0,H^(x|C)|0)|0;H=C;j=Dd(f|0,j|0,J|0,M|0)|0;f=C;M=Dd(x|0,H|0,J|0,M|0)|0;J=C;H=Gd(j|0,f|0,14)|0;x=C;v=Hd(j|0,f|0,50)|0;x=x|C;F=Gd(j|0,f|0,18)|0;E=C;y=Hd(j|0,f|0,46)|0;E=x^(E|C);x=Gd(j|0,f|0,41)|0;D=C;L=Hd(j|0,f|0,23)|0;D=E^(D|C);E=g+104|0;u=c[E>>2]|0;E=c[E+4>>2]|0;s=Dd(r|0,s|0,991336113,-2132889090)|0;E=Dd(s|0,C|0,u|0,E|0)|0;D=Dd(E|0,C|0,(H|v)^(F|y)^(x|L)|0,D|0)|0;D=Dd(D|0,C|0,(o^m)&j^o|0,(p^l)&f^p|0)|0;L=C;x=Gd(M|0,J|0,28)|0;y=C;F=Hd(M|0,J|0,36)|0;y=y|C;v=Gd(M|0,J|0,34)|0;H=C;E=Hd(M|0,J|0,30)|0;H=y^(H|C);y=Gd(M|0,J|0,39)|0;u=C;s=Hd(M|0,J|0,25)|0;u=Dd((K|G)&M|K&G|0,(B|I)&J|B&I|0,(x|F)^(v|E)^(y|s)|0,H^(u|C)|0)|0;H=C;b=Dd(A|0,b|0,D|0,L|0)|0;A=C;L=Dd(u|0,H|0,D|0,L|0)|0;D=C;H=Gd(b|0,A|0,14)|0;u=C;s=Hd(b|0,A|0,50)|0;u=u|C;y=Gd(b|0,A|0,18)|0;E=C;v=Hd(b|0,A|0,46)|0;E=u^(E|C);u=Gd(b|0,A|0,41)|0;F=C;x=Hd(b|0,A|0,23)|0;F=E^(F|C);E=g+112|0;r=c[E>>2]|0;E=c[E+4>>2]|0;p=Dd(o|0,p|0,633803317,-1680079193)|0;E=Dd(p|0,C|0,r|0,E|0)|0;F=Dd(E|0,C|0,(H|s)^(y|v)^(u|x)|0,F|0)|0;F=Dd(F|0,C|0,(m^j)&b^m|0,(l^f)&A^l|0)|0;x=C;u=Gd(L|0,D|0,28)|0;v=C;y=Hd(L|0,D|0,36)|0;v=v|C;s=Gd(L|0,D|0,34)|0;H=C;E=Hd(L|0,D|0,30)|0;H=v^(H|C);v=Gd(L|0,D|0,39)|0;r=C;p=Hd(L|0,D|0,25)|0;r=Dd((G|M)&L|G&M|0,(I|J)&D|I&J|0,(u|y)^(s|E)^(v|p)|0,H^(r|C)|0)|0;H=C;B=Dd(K|0,B|0,F|0,x|0)|0;K=C;x=Dd(r|0,H|0,F|0,x|0)|0;F=C;H=Gd(B|0,K|0,14)|0;r=C;p=Hd(B|0,K|0,50)|0;r=r|C;v=Gd(B|0,K|0,18)|0;E=C;s=Hd(B|0,K|0,46)|0;E=r^(E|C);r=Gd(B|0,K|0,41)|0;y=C;u=Hd(B|0,K|0,23)|0;y=E^(y|C);E=g+120|0;o=c[E>>2]|0;E=c[E+4>>2]|0;l=Dd(m|0,l|0,-815192428,-1046744716)|0;E=Dd(l|0,C|0,o|0,E|0)|0;y=Dd(E|0,C|0,(H|p)^(v|s)^(r|u)|0,y|0)|0;y=Dd(y|0,C|0,(j^b)&B^j|0,(f^A)&K^f|0)|0;u=C;r=Gd(x|0,F|0,28)|0;s=C;v=Hd(x|0,F|0,36)|0;s=s|C;p=Gd(x|0,F|0,34)|0;H=C;E=Hd(x|0,F|0,30)|0;H=s^(H|C);s=Gd(x|0,F|0,39)|0;o=C;l=Hd(x|0,F|0,25)|0;o=Dd((M|L)&x|M&L|0,(J|D)&F|J&D|0,(r|v)^(p|E)^(s|l)|0,H^(o|C)|0)|0;H=C;I=Dd(G|0,I|0,y|0,u|0)|0;G=C;u=Dd(o|0,H|0,y|0,u|0)|0;y=C;H=Gd(I|0,G|0,14)|0;o=C;l=Hd(I|0,G|0,50)|0;o=o|C;s=Gd(I|0,G|0,18)|0;E=C;p=Hd(I|0,G|0,46)|0;E=o^(E|C);o=Gd(I|0,G|0,41)|0;v=C;r=Hd(I|0,G|0,23)|0;v=E^(v|C);E=g+128|0;m=c[E>>2]|0;E=c[E+4>>2]|0;f=Dd(j|0,f|0,-1628353838,-459576895)|0;E=Dd(f|0,C|0,m|0,E|0)|0;v=Dd(E|0,C|0,(H|l)^(s|p)^(o|r)|0,v|0)|0;v=Dd(v|0,C|0,(b^B)&I^b|0,(A^K)&G^A|0)|0;r=C;o=Gd(u|0,y|0,28)|0;p=C;s=Hd(u|0,y|0,36)|0;p=p|C;l=Gd(u|0,y|0,34)|0;H=C;E=Hd(u|0,y|0,30)|0;H=p^(H|C);p=Gd(u|0,y|0,39)|0;m=C;f=Hd(u|0,y|0,25)|0;m=Dd((L|x)&u|L&x|0,(D|F)&y|D&F|0,(o|s)^(l|E)^(p|f)|0,H^(m|C)|0)|0;H=C;J=Dd(M|0,J|0,v|0,r|0)|0;M=C;r=Dd(m|0,H|0,v|0,r|0)|0;v=C;H=Gd(J|0,M|0,14)|0;m=C;f=Hd(J|0,M|0,50)|0;m=m|C;p=Gd(J|0,M|0,18)|0;E=C;l=Hd(J|0,M|0,46)|0;E=m^(E|C);m=Gd(J|0,M|0,41)|0;s=C;o=Hd(J|0,M|0,23)|0;s=E^(s|C);E=g+136|0;j=c[E>>2]|0;E=c[E+4>>2]|0;A=Dd(b|0,A|0,944711139,-272742522)|0;E=Dd(A|0,C|0,j|0,E|0)|0;s=Dd(E|0,C|0,(H|f)^(p|l)^(m|o)|0,s|0)|0;s=Dd(s|0,C|0,(B^I)&J^B|0,(K^G)&M^K|0)|0;o=C;m=Gd(r|0,v|0,28)|0;l=C;p=Hd(r|0,v|0,36)|0;l=l|C;f=Gd(r|0,v|0,34)|0;H=C;E=Hd(r|0,v|0,30)|0;H=l^(H|C);l=Gd(r|0,v|0,39)|0;j=C;A=Hd(r|0,v|0,25)|0;j=Dd((x|u)&r|x&u|0,(F|y)&v|F&y|0,(m|p)^(f|E)^(l|A)|0,H^(j|C)|0)|0;H=C;D=Dd(L|0,D|0,s|0,o|0)|0;L=C;o=Dd(j|0,H|0,s|0,o|0)|0;s=C;H=Gd(D|0,L|0,14)|0;j=C;A=Hd(D|0,L|0,50)|0;j=j|C;l=Gd(D|0,L|0,18)|0;E=C;f=Hd(D|0,L|0,46)|0;E=j^(E|C);j=Gd(D|0,L|0,41)|0;p=C;m=Hd(D|0,L|0,23)|0;p=E^(p|C);E=g+144|0;b=c[E>>2]|0;E=c[E+4>>2]|0;K=Dd(B|0,K|0,-1953704523,264347078)|0;E=Dd(K|0,C|0,b|0,E|0)|0;p=Dd(E|0,C|0,(H|A)^(l|f)^(j|m)|0,p|0)|0;p=Dd(p|0,C|0,(I^J)&D^I|0,(G^M)&L^G|0)|0;m=C;j=Gd(o|0,s|0,28)|0;f=C;l=Hd(o|0,s|0,36)|0;f=f|C;A=Gd(o|0,s|0,34)|0;H=C;E=Hd(o|0,s|0,30)|0;H=f^(H|C);f=Gd(o|0,s|0,39)|0;b=C;K=Hd(o|0,s|0,25)|0;b=Dd((u|r)&o|u&r|0,(y|v)&s|y&v|0,(j|l)^(A|E)^(f|K)|0,H^(b|C)|0)|0;H=C;F=Dd(x|0,F|0,p|0,m|0)|0;x=C;m=Dd(b|0,H|0,p|0,m|0)|0;p=C;H=Gd(F|0,x|0,14)|0;b=C;K=Hd(F|0,x|0,50)|0;b=b|C;f=Gd(F|0,x|0,18)|0;E=C;A=Hd(F|0,x|0,46)|0;E=b^(E|C);b=Gd(F|0,x|0,41)|0;l=C;j=Hd(F|0,x|0,23)|0;l=E^(l|C);E=g+152|0;B=c[E>>2]|0;E=c[E+4>>2]|0;G=Dd(I|0,G|0,2007800933,604807628)|0;E=Dd(G|0,C|0,B|0,E|0)|0;l=Dd(E|0,C|0,(H|K)^(f|A)^(b|j)|0,l|0)|0;l=Dd(l|0,C|0,(J^D)&F^J|0,(M^L)&x^M|0)|0;j=C;b=Gd(m|0,p|0,28)|0;A=C;f=Hd(m|0,p|0,36)|0;A=A|C;K=Gd(m|0,p|0,34)|0;H=C;E=Hd(m|0,p|0,30)|0;H=A^(H|C);A=Gd(m|0,p|0,39)|0;B=C;G=Hd(m|0,p|0,25)|0;B=Dd((r|o)&m|r&o|0,(v|s)&p|v&s|0,(b|f)^(K|E)^(A|G)|0,H^(B|C)|0)|0;H=C;y=Dd(u|0,y|0,l|0,j|0)|0;u=C;j=Dd(B|0,H|0,l|0,j|0)|0;l=C;H=Gd(y|0,u|0,14)|0;B=C;G=Hd(y|0,u|0,50)|0;B=B|C;A=Gd(y|0,u|0,18)|0;E=C;K=Hd(y|0,u|0,46)|0;E=B^(E|C);B=Gd(y|0,u|0,41)|0;f=C;b=Hd(y|0,u|0,23)|0;f=E^(f|C);E=g+160|0;I=c[E>>2]|0;E=c[E+4>>2]|0;M=Dd(J|0,M|0,1495990901,770255983)|0;E=Dd(M|0,C|0,I|0,E|0)|0;f=Dd(E|0,C|0,(H|G)^(A|K)^(B|b)|0,f|0)|0;f=Dd(f|0,C|0,(D^F)&y^D|0,(L^x)&u^L|0)|0;b=C;B=Gd(j|0,l|0,28)|0;K=C;A=Hd(j|0,l|0,36)|0;K=K|C;G=Gd(j|0,l|0,34)|0;H=C;E=Hd(j|0,l|0,30)|0;H=K^(H|C);K=Gd(j|0,l|0,39)|0;I=C;M=Hd(j|0,l|0,25)|0;I=Dd((o|m)&j|o&m|0,(s|p)&l|s&p|0,(B|A)^(G|E)^(K|M)|0,H^(I|C)|0)|0;H=C;v=Dd(r|0,v|0,f|0,b|0)|0;r=C;b=Dd(I|0,H|0,f|0,b|0)|0;f=C;H=Gd(v|0,r|0,14)|0;I=C;M=Hd(v|0,r|0,50)|0;I=I|C;K=Gd(v|0,r|0,18)|0;E=C;G=Hd(v|0,r|0,46)|0;E=I^(E|C);I=Gd(v|0,r|0,41)|0;A=C;B=Hd(v|0,r|0,23)|0;A=E^(A|C);E=g+168|0;J=c[E>>2]|0;E=c[E+4>>2]|0;L=Dd(D|0,L|0,1856431235,1249150122)|0;E=Dd(L|0,C|0,J|0,E|0)|0;A=Dd(E|0,C|0,(H|M)^(K|G)^(I|B)|0,A|0)|0;A=Dd(A|0,C|0,(F^y)&v^F|0,(x^u)&r^x|0)|0;B=C;I=Gd(b|0,f|0,28)|0;G=C;K=Hd(b|0,f|0,36)|0;G=G|C;M=Gd(b|0,f|0,34)|0;H=C;E=Hd(b|0,f|0,30)|0;H=G^(H|C);G=Gd(b|0,f|0,39)|0;J=C;L=Hd(b|0,f|0,25)|0;J=Dd((m|j)&b|m&j|0,(p|l)&f|p&l|0,(I|K)^(M|E)^(G|L)|0,H^(J|C)|0)|0;H=C;s=Dd(o|0,s|0,A|0,B|0)|0;o=C;B=Dd(J|0,H|0,A|0,B|0)|0;A=C;H=Gd(s|0,o|0,14)|0;J=C;L=Hd(s|0,o|0,50)|0;J=J|C;G=Gd(s|0,o|0,18)|0;E=C;M=Hd(s|0,o|0,46)|0;E=J^(E|C);J=Gd(s|0,o|0,41)|0;K=C;I=Hd(s|0,o|0,23)|0;K=E^(K|C);E=g+176|0;D=c[E>>2]|0;E=c[E+4>>2]|0;x=Dd(F|0,x|0,-1119749164,1555081692)|0;E=Dd(x|0,C|0,D|0,E|0)|0;K=Dd(E|0,C|0,(H|L)^(G|M)^(J|I)|0,K|0)|0;K=Dd(K|0,C|0,(y^v)&s^y|0,(u^r)&o^u|0)|0;I=C;J=Gd(B|0,A|0,28)|0;M=C;G=Hd(B|0,A|0,36)|0;M=M|C;L=Gd(B|0,A|0,34)|0;H=C;E=Hd(B|0,A|0,30)|0;H=M^(H|C);M=Gd(B|0,A|0,39)|0;D=C;x=Hd(B|0,A|0,25)|0;D=Dd((j|b)&B|j&b|0,(l|f)&A|l&f|0,(J|G)^(L|E)^(M|x)|0,H^(D|C)|0)|0;H=C;p=Dd(m|0,p|0,K|0,I|0)|0;m=C;I=Dd(D|0,H|0,K|0,I|0)|0;K=C;H=Gd(p|0,m|0,14)|0;D=C;x=Hd(p|0,m|0,50)|0;D=D|C;M=Gd(p|0,m|0,18)|0;E=C;L=Hd(p|0,m|0,46)|0;E=D^(E|C);D=Gd(p|0,m|0,41)|0;G=C;J=Hd(p|0,m|0,23)|0;G=E^(G|C);E=g+184|0;F=c[E>>2]|0;E=c[E+4>>2]|0;u=Dd(y|0,u|0,-2096016459,1996064986)|0;E=Dd(u|0,C|0,F|0,E|0)|0;G=Dd(E|0,C|0,(H|x)^(M|L)^(D|J)|0,G|0)|0;G=Dd(G|0,C|0,(v^s)&p^v|0,(r^o)&m^r|0)|0;J=C;D=Gd(I|0,K|0,28)|0;L=C;M=Hd(I|0,K|0,36)|0;L=L|C;x=Gd(I|0,K|0,34)|0;H=C;E=Hd(I|0,K|0,30)|0;H=L^(H|C);L=Gd(I|0,K|0,39)|0;F=C;u=Hd(I|0,K|0,25)|0;F=Dd((b|B)&I|b&B|0,(f|A)&K|f&A|0,(D|M)^(x|E)^(L|u)|0,H^(F|C)|0)|0;H=C;l=Dd(j|0,l|0,G|0,J|0)|0;j=C;J=Dd(F|0,H|0,G|0,J|0)|0;G=C;H=Gd(l|0,j|0,14)|0;F=C;u=Hd(l|0,j|0,50)|0;F=F|C;L=Gd(l|0,j|0,18)|0;E=C;x=Hd(l|0,j|0,46)|0;E=F^(E|C);F=Gd(l|0,j|0,41)|0;M=C;D=Hd(l|0,j|0,23)|0;M=E^(M|C);E=g+192|0;y=c[E>>2]|0;E=c[E+4>>2]|0;r=Dd(v|0,r|0,-295247957,-1740746414)|0;E=Dd(r|0,C|0,y|0,E|0)|0;M=Dd(E|0,C|0,(H|u)^(L|x)^(F|D)|0,M|0)|0;M=Dd(M|0,C|0,(s^p)&l^s|0,(o^m)&j^o|0)|0;D=C;F=Gd(J|0,G|0,28)|0;x=C;L=Hd(J|0,G|0,36)|0;x=x|C;u=Gd(J|0,G|0,34)|0;H=C;E=Hd(J|0,G|0,30)|0;H=x^(H|C);x=Gd(J|0,G|0,39)|0;y=C;r=Hd(J|0,G|0,25)|0;y=Dd((B|I)&J|B&I|0,(A|K)&G|A&K|0,(F|L)^(u|E)^(x|r)|0,H^(y|C)|0)|0;H=C;f=Dd(b|0,f|0,M|0,D|0)|0;b=C;D=Dd(y|0,H|0,M|0,D|0)|0;M=C;H=Gd(f|0,b|0,14)|0;y=C;r=Hd(f|0,b|0,50)|0;y=y|C;x=Gd(f|0,b|0,18)|0;E=C;u=Hd(f|0,b|0,46)|0;E=y^(E|C);y=Gd(f|0,b|0,41)|0;L=C;F=Hd(f|0,b|0,23)|0;L=E^(L|C);E=g+200|0;v=c[E>>2]|0;E=c[E+4>>2]|0;o=Dd(s|0,o|0,766784016,-1473132947)|0;E=Dd(o|0,C|0,v|0,E|0)|0;L=Dd(E|0,C|0,(H|r)^(x|u)^(y|F)|0,L|0)|0;L=Dd(L|0,C|0,(p^l)&f^p|0,(m^j)&b^m|0)|0;F=C;y=Gd(D|0,M|0,28)|0;u=C;x=Hd(D|0,M|0,36)|0;u=u|C;r=Gd(D|0,M|0,34)|0;H=C;E=Hd(D|0,M|0,30)|0;H=u^(H|C);u=Gd(D|0,M|0,39)|0;v=C;o=Hd(D|0,M|0,25)|0;v=Dd((I|J)&D|I&J|0,(K|G)&M|K&G|0,(y|x)^(r|E)^(u|o)|0,H^(v|C)|0)|0;H=C;A=Dd(B|0,A|0,L|0,F|0)|0;B=C;F=Dd(v|0,H|0,L|0,F|0)|0;L=C;H=Gd(A|0,B|0,14)|0;v=C;o=Hd(A|0,B|0,50)|0;v=v|C;u=Gd(A|0,B|0,18)|0;E=C;r=Hd(A|0,B|0,46)|0;E=v^(E|C);v=Gd(A|0,B|0,41)|0;x=C;y=Hd(A|0,B|0,23)|0;x=E^(x|C);E=g+208|0;s=c[E>>2]|0;E=c[E+4>>2]|0;m=Dd(p|0,m|0,-1728372417,-1341970488)|0;E=Dd(m|0,C|0,s|0,E|0)|0;x=Dd(E|0,C|0,(H|o)^(u|r)^(v|y)|0,x|0)|0;x=Dd(x|0,C|0,(l^f)&A^l|0,(j^b)&B^j|0)|0;y=C;v=Gd(F|0,L|0,28)|0;r=C;u=Hd(F|0,L|0,36)|0;r=r|C;o=Gd(F|0,L|0,34)|0;H=C;E=Hd(F|0,L|0,30)|0;H=r^(H|C);r=Gd(F|0,L|0,39)|0;s=C;m=Hd(F|0,L|0,25)|0;s=Dd((J|D)&F|J&D|0,(G|M)&L|G&M|0,(v|u)^(o|E)^(r|m)|0,H^(s|C)|0)|0;H=C;K=Dd(I|0,K|0,x|0,y|0)|0;I=C;y=Dd(s|0,H|0,x|0,y|0)|0;x=C;H=Gd(K|0,I|0,14)|0;s=C;m=Hd(K|0,I|0,50)|0;s=s|C;r=Gd(K|0,I|0,18)|0;E=C;o=Hd(K|0,I|0,46)|0;E=s^(E|C);s=Gd(K|0,I|0,41)|0;u=C;v=Hd(K|0,I|0,23)|0;u=E^(u|C);E=g+216|0;p=c[E>>2]|0;E=c[E+4>>2]|0;j=Dd(l|0,j|0,-1091629340,-1084653625)|0;E=Dd(j|0,C|0,p|0,E|0)|0;u=Dd(E|0,C|0,(H|m)^(r|o)^(s|v)|0,u|0)|0;u=Dd(u|0,C|0,(f^A)&K^f|0,(b^B)&I^b|0)|0;v=C;s=Gd(y|0,x|0,28)|0;o=C;r=Hd(y|0,x|0,36)|0;o=o|C;m=Gd(y|0,x|0,34)|0;H=C;E=Hd(y|0,x|0,30)|0;H=o^(H|C);o=Gd(y|0,x|0,39)|0;p=C;j=Hd(y|0,x|0,25)|0;p=Dd((D|F)&y|D&F|0,(M|L)&x|M&L|0,(s|r)^(m|E)^(o|j)|0,H^(p|C)|0)|0;H=C;G=Dd(J|0,G|0,u|0,v|0)|0;J=C;v=Dd(p|0,H|0,u|0,v|0)|0;u=C;H=Gd(G|0,J|0,14)|0;p=C;j=Hd(G|0,J|0,50)|0;p=p|C;o=Gd(G|0,J|0,18)|0;E=C;m=Hd(G|0,J|0,46)|0;E=p^(E|C);p=Gd(G|0,J|0,41)|0;r=C;s=Hd(G|0,J|0,23)|0;r=E^(r|C);E=g+224|0;l=c[E>>2]|0;E=c[E+4>>2]|0;b=Dd(f|0,b|0,1034457026,-958395405)|0;E=Dd(b|0,C|0,l|0,E|0)|0;r=Dd(E|0,C|0,(H|j)^(o|m)^(p|s)|0,r|0)|0;r=Dd(r|0,C|0,(A^K)&G^A|0,(B^I)&J^B|0)|0;s=C;p=Gd(v|0,u|0,28)|0;m=C;o=Hd(v|0,u|0,36)|0;m=m|C;j=Gd(v|0,u|0,34)|0;H=C;E=Hd(v|0,u|0,30)|0;H=m^(H|C);m=Gd(v|0,u|0,39)|0;l=C;b=Hd(v|0,u|0,25)|0;l=Dd((F|y)&v|F&y|0,(L|x)&u|L&x|0,(p|o)^(j|E)^(m|b)|0,H^(l|C)|0)|0;H=C;M=Dd(D|0,M|0,r|0,s|0)|0;D=C;s=Dd(l|0,H|0,r|0,s|0)|0;r=C;H=Gd(M|0,D|0,14)|0;l=C;b=Hd(M|0,D|0,50)|0;l=l|C;m=Gd(M|0,D|0,18)|0;E=C;j=Hd(M|0,D|0,46)|0;E=l^(E|C);l=Gd(M|0,D|0,41)|0;o=C;p=Hd(M|0,D|0,23)|0;o=E^(o|C);E=g+232|0;f=c[E>>2]|0;E=c[E+4>>2]|0;B=Dd(A|0,B|0,-1828018395,-710438585)|0;E=Dd(B|0,C|0,f|0,E|0)|0;o=Dd(E|0,C|0,(H|b)^(m|j)^(l|p)|0,o|0)|0;o=Dd(o|0,C|0,(K^G)&M^K|0,(I^J)&D^I|0)|0;p=C;l=Gd(s|0,r|0,28)|0;j=C;m=Hd(s|0,r|0,36)|0;j=j|C;b=Gd(s|0,r|0,34)|0;H=C;E=Hd(s|0,r|0,30)|0;H=j^(H|C);j=Gd(s|0,r|0,39)|0;f=C;B=Hd(s|0,r|0,25)|0;f=Dd((y|v)&s|y&v|0,(x|u)&r|x&u|0,(l|m)^(b|E)^(j|B)|0,H^(f|C)|0)|0;H=C;L=Dd(F|0,L|0,o|0,p|0)|0;F=C;p=Dd(f|0,H|0,o|0,p|0)|0;o=C;H=Gd(L|0,F|0,14)|0;f=C;B=Hd(L|0,F|0,50)|0;f=f|C;j=Gd(L|0,F|0,18)|0;E=C;b=Hd(L|0,F|0,46)|0;E=f^(E|C);f=Gd(L|0,F|0,41)|0;m=C;l=Hd(L|0,F|0,23)|0;m=E^(m|C);E=g+240|0;A=c[E>>2]|0;E=c[E+4>>2]|0;I=Dd(K|0,I|0,-536640913,113926993)|0;E=Dd(I|0,C|0,A|0,E|0)|0;m=Dd(E|0,C|0,(H|B)^(j|b)^(f|l)|0,m|0)|0;m=Dd(m|0,C|0,(G^M)&L^G|0,(J^D)&F^J|0)|0;l=C;f=Gd(p|0,o|0,28)|0;b=C;j=Hd(p|0,o|0,36)|0;b=b|C;B=Gd(p|0,o|0,34)|0;H=C;E=Hd(p|0,o|0,30)|0;H=b^(H|C);b=Gd(p|0,o|0,39)|0;A=C;I=Hd(p|0,o|0,25)|0;A=Dd((v|s)&p|v&s|0,(u|r)&o|u&r|0,(f|j)^(B|E)^(b|I)|0,H^(A|C)|0)|0;H=C;x=Dd(y|0,x|0,m|0,l|0)|0;y=C;l=Dd(A|0,H|0,m|0,l|0)|0;m=C;H=Gd(x|0,y|0,14)|0;A=C;I=Hd(x|0,y|0,50)|0;A=A|C;b=Gd(x|0,y|0,18)|0;E=C;B=Hd(x|0,y|0,46)|0;E=A^(E|C);A=Gd(x|0,y|0,41)|0;j=C;f=Hd(x|0,y|0,23)|0;j=E^(j|C);E=g+248|0;K=c[E>>2]|0;E=c[E+4>>2]|0;J=Dd(G|0,J|0,168717936,338241895)|0;E=Dd(J|0,C|0,K|0,E|0)|0;j=Dd(E|0,C|0,(H|I)^(b|B)^(A|f)|0,j|0)|0;j=Dd(j|0,C|0,(M^L)&x^M|0,(D^F)&y^D|0)|0;f=C;A=Gd(l|0,m|0,28)|0;B=C;b=Hd(l|0,m|0,36)|0;B=B|C;I=Gd(l|0,m|0,34)|0;H=C;E=Hd(l|0,m|0,30)|0;H=B^(H|C);B=Gd(l|0,m|0,39)|0;K=C;J=Hd(l|0,m|0,25)|0;K=Dd((s|p)&l|s&p|0,(r|o)&m|r&o|0,(A|b)^(I|E)^(B|J)|0,H^(K|C)|0)|0;H=C;u=Dd(v|0,u|0,j|0,f|0)|0;v=C;f=Dd(K|0,H|0,j|0,f|0)|0;j=C;H=Gd(u|0,v|0,14)|0;K=C;J=Hd(u|0,v|0,50)|0;K=K|C;B=Gd(u|0,v|0,18)|0;E=C;I=Hd(u|0,v|0,46)|0;E=K^(E|C);K=Gd(u|0,v|0,41)|0;b=C;A=Hd(u|0,v|0,23)|0;b=E^(b|C);E=g+256|0;G=c[E>>2]|0;E=c[E+4>>2]|0;D=Dd(M|0,D|0,1188179964,666307205)|0;E=Dd(D|0,C|0,G|0,E|0)|0;b=Dd(E|0,C|0,(H|J)^(B|I)^(K|A)|0,b|0)|0;b=Dd(b|0,C|0,(L^x)&u^L|0,(F^y)&v^F|0)|0;A=C;K=Gd(f|0,j|0,28)|0;I=C;B=Hd(f|0,j|0,36)|0;I=I|C;J=Gd(f|0,j|0,34)|0;H=C;E=Hd(f|0,j|0,30)|0;H=I^(H|C);I=Gd(f|0,j|0,39)|0;G=C;D=Hd(f|0,j|0,25)|0;G=Dd((p|l)&f|p&l|0,(o|m)&j|o&m|0,(K|B)^(J|E)^(I|D)|0,H^(G|C)|0)|0;H=C;r=Dd(s|0,r|0,b|0,A|0)|0;s=C;A=Dd(G|0,H|0,b|0,A|0)|0;b=C;H=Gd(r|0,s|0,14)|0;G=C;D=Hd(r|0,s|0,50)|0;G=G|C;I=Gd(r|0,s|0,18)|0;E=C;J=Hd(r|0,s|0,46)|0;E=G^(E|C);G=Gd(r|0,s|0,41)|0;B=C;K=Hd(r|0,s|0,23)|0;B=E^(B|C);E=g+264|0;M=c[E>>2]|0;E=c[E+4>>2]|0;F=Dd(L|0,F|0,1546045734,773529912)|0;E=Dd(F|0,C|0,M|0,E|0)|0;B=Dd(E|0,C|0,(H|D)^(I|J)^(G|K)|0,B|0)|0;B=Dd(B|0,C|0,(x^u)&r^x|0,(y^v)&s^y|0)|0;K=C;G=Gd(A|0,b|0,28)|0;J=C;I=Hd(A|0,b|0,36)|0;J=J|C;D=Gd(A|0,b|0,34)|0;H=C;E=Hd(A|0,b|0,30)|0;H=J^(H|C);J=Gd(A|0,b|0,39)|0;M=C;F=Hd(A|0,b|0,25)|0;M=Dd((l|f)&A|l&f|0,(m|j)&b|m&j|0,(G|I)^(D|E)^(J|F)|0,H^(M|C)|0)|0;H=C;o=Dd(p|0,o|0,B|0,K|0)|0;p=C;K=Dd(M|0,H|0,B|0,K|0)|0;B=C;H=Gd(o|0,p|0,14)|0;M=C;F=Hd(o|0,p|0,50)|0;M=M|C;J=Gd(o|0,p|0,18)|0;E=C;D=Hd(o|0,p|0,46)|0;E=M^(E|C);M=Gd(o|0,p|0,41)|0;I=C;G=Hd(o|0,p|0,23)|0;I=E^(I|C);E=g+272|0;L=c[E>>2]|0;E=c[E+4>>2]|0;y=Dd(x|0,y|0,1522805485,1294757372)|0;E=Dd(y|0,C|0,L|0,E|0)|0;I=Dd(E|0,C|0,(H|F)^(J|D)^(M|G)|0,I|0)|0;I=Dd(I|0,C|0,(u^r)&o^u|0,(v^s)&p^v|0)|0;G=C;M=Gd(K|0,B|0,28)|0;D=C;J=Hd(K|0,B|0,36)|0;D=D|C;F=Gd(K|0,B|0,34)|0;H=C;E=Hd(K|0,B|0,30)|0;H=D^(H|C);D=Gd(K|0,B|0,39)|0;L=C;y=Hd(K|0,B|0,25)|0;L=Dd((f|A)&K|f&A|0,(j|b)&B|j&b|0,(M|J)^(F|E)^(D|y)|0,H^(L|C)|0)|0;H=C;m=Dd(l|0,m|0,I|0,G|0)|0;l=C;G=Dd(L|0,H|0,I|0,G|0)|0;I=C;H=Gd(m|0,l|0,14)|0;L=C;y=Hd(m|0,l|0,50)|0;L=L|C;D=Gd(m|0,l|0,18)|0;E=C;F=Hd(m|0,l|0,46)|0;E=L^(E|C);L=Gd(m|0,l|0,41)|0;J=C;M=Hd(m|0,l|0,23)|0;J=E^(J|C);E=g+280|0;x=c[E>>2]|0;E=c[E+4>>2]|0;v=Dd(u|0,v|0,-1651133473,1396182291)|0;E=Dd(v|0,C|0,x|0,E|0)|0;J=Dd(E|0,C|0,(H|y)^(D|F)^(L|M)|0,J|0)|0;J=Dd(J|0,C|0,(r^o)&m^r|0,(s^p)&l^s|0)|0;M=C;L=Gd(G|0,I|0,28)|0;F=C;D=Hd(G|0,I|0,36)|0;F=F|C;y=Gd(G|0,I|0,34)|0;H=C;E=Hd(G|0,I|0,30)|0;H=F^(H|C);F=Gd(G|0,I|0,39)|0;x=C;v=Hd(G|0,I|0,25)|0;x=Dd((A|K)&G|A&K|0,(b|B)&I|b&B|0,(L|D)^(y|E)^(F|v)|0,H^(x|C)|0)|0;H=C;j=Dd(f|0,j|0,J|0,M|0)|0;f=C;M=Dd(x|0,H|0,J|0,M|0)|0;J=C;H=Gd(j|0,f|0,14)|0;x=C;v=Hd(j|0,f|0,50)|0;x=x|C;F=Gd(j|0,f|0,18)|0;E=C;y=Hd(j|0,f|0,46)|0;E=x^(E|C);x=Gd(j|0,f|0,41)|0;D=C;L=Hd(j|0,f|0,23)|0;D=E^(D|C);E=g+288|0;u=c[E>>2]|0;E=c[E+4>>2]|0;s=Dd(r|0,s|0,-1951439906,1695183700)|0;E=Dd(s|0,C|0,u|0,E|0)|0;D=Dd(E|0,C|0,(H|v)^(F|y)^(x|L)|0,D|0)|0;D=Dd(D|0,C|0,(o^m)&j^o|0,(p^l)&f^p|0)|0;L=C;x=Gd(M|0,J|0,28)|0;y=C;F=Hd(M|0,J|0,36)|0;y=y|C;v=Gd(M|0,J|0,34)|0;H=C;E=Hd(M|0,J|0,30)|0;H=y^(H|C);y=Gd(M|0,J|0,39)|0;u=C;s=Hd(M|0,J|0,25)|0;u=Dd((K|G)&M|K&G|0,(B|I)&J|B&I|0,(x|F)^(v|E)^(y|s)|0,H^(u|C)|0)|0;H=C;b=Dd(A|0,b|0,D|0,L|0)|0;A=C;L=Dd(u|0,H|0,D|0,L|0)|0;D=C;H=Gd(b|0,A|0,14)|0;u=C;s=Hd(b|0,A|0,50)|0;u=u|C;y=Gd(b|0,A|0,18)|0;E=C;v=Hd(b|0,A|0,46)|0;E=u^(E|C);u=Gd(b|0,A|0,41)|0;F=C;x=Hd(b|0,A|0,23)|0;F=E^(F|C);E=g+296|0;r=c[E>>2]|0;E=c[E+4>>2]|0;p=Dd(o|0,p|0,1014477480,1986661051)|0;E=Dd(p|0,C|0,r|0,E|0)|0;F=Dd(E|0,C|0,(H|s)^(y|v)^(u|x)|0,F|0)|0;F=Dd(F|0,C|0,(m^j)&b^m|0,(l^f)&A^l|0)|0;x=C;u=Gd(L|0,D|0,28)|0;v=C;y=Hd(L|0,D|0,36)|0;v=v|C;s=Gd(L|0,D|0,34)|0;H=C;E=Hd(L|0,D|0,30)|0;H=v^(H|C);v=Gd(L|0,D|0,39)|0;r=C;p=Hd(L|0,D|0,25)|0;r=Dd((G|M)&L|G&M|0,(I|J)&D|I&J|0,(u|y)^(s|E)^(v|p)|0,H^(r|C)|0)|0;H=C;B=Dd(K|0,B|0,F|0,x|0)|0;K=C;x=Dd(r|0,H|0,F|0,x|0)|0;F=C;H=Gd(B|0,K|0,14)|0;r=C;p=Hd(B|0,K|0,50)|0;r=r|C;v=Gd(B|0,K|0,18)|0;E=C;s=Hd(B|0,K|0,46)|0;E=r^(E|C);r=Gd(B|0,K|0,41)|0;y=C;u=Hd(B|0,K|0,23)|0;y=E^(y|C);E=g+304|0;o=c[E>>2]|0;E=c[E+4>>2]|0;l=Dd(m|0,l|0,1206759142,-2117940946)|0;E=Dd(l|0,C|0,o|0,E|0)|0;y=Dd(E|0,C|0,(H|p)^(v|s)^(r|u)|0,y|0)|0;y=Dd(y|0,C|0,(j^b)&B^j|0,(f^A)&K^f|0)|0;u=C;r=Gd(x|0,F|0,28)|0;s=C;v=Hd(x|0,F|0,36)|0;s=s|C;p=Gd(x|0,F|0,34)|0;H=C;E=Hd(x|0,F|0,30)|0;H=s^(H|C);s=Gd(x|0,F|0,39)|0;o=C;l=Hd(x|0,F|0,25)|0;o=Dd((M|L)&x|M&L|0,(J|D)&F|J&D|0,(r|v)^(p|E)^(s|l)|0,H^(o|C)|0)|0;H=C;I=Dd(G|0,I|0,y|0,u|0)|0;G=C;u=Dd(o|0,H|0,y|0,u|0)|0;y=C;H=Gd(I|0,G|0,14)|0;o=C;l=Hd(I|0,G|0,50)|0;o=o|C;s=Gd(I|0,G|0,18)|0;E=C;p=Hd(I|0,G|0,46)|0;E=o^(E|C);o=Gd(I|0,G|0,41)|0;v=C;r=Hd(I|0,G|0,23)|0;v=E^(v|C);E=g+312|0;m=c[E>>2]|0;E=c[E+4>>2]|0;f=Dd(j|0,f|0,344077627,-1838011259)|0;E=Dd(f|0,C|0,m|0,E|0)|0;v=Dd(E|0,C|0,(H|l)^(s|p)^(o|r)|0,v|0)|0;v=Dd(v|0,C|0,(b^B)&I^b|0,(A^K)&G^A|0)|0;r=C;o=Gd(u|0,y|0,28)|0;p=C;s=Hd(u|0,y|0,36)|0;p=p|C;l=Gd(u|0,y|0,34)|0;H=C;E=Hd(u|0,y|0,30)|0;H=p^(H|C);p=Gd(u|0,y|0,39)|0;m=C;f=Hd(u|0,y|0,25)|0;m=Dd((L|x)&u|L&x|0,(D|F)&y|D&F|0,(o|s)^(l|E)^(p|f)|0,H^(m|C)|0)|0;H=C;J=Dd(M|0,J|0,v|0,r|0)|0;M=C;r=Dd(m|0,H|0,v|0,r|0)|0;v=C;H=Gd(J|0,M|0,14)|0;m=C;f=Hd(J|0,M|0,50)|0;m=m|C;p=Gd(J|0,M|0,18)|0;E=C;l=Hd(J|0,M|0,46)|0;E=m^(E|C);m=Gd(J|0,M|0,41)|0;s=C;o=Hd(J|0,M|0,23)|0;s=E^(s|C);E=g+320|0;j=c[E>>2]|0;E=c[E+4>>2]|0;A=Dd(b|0,A|0,1290863460,-1564481375)|0;E=Dd(A|0,C|0,j|0,E|0)|0;s=Dd(E|0,C|0,(H|f)^(p|l)^(m|o)|0,s|0)|0;s=Dd(s|0,C|0,(B^I)&J^B|0,(K^G)&M^K|0)|0;o=C;m=Gd(r|0,v|0,28)|0;l=C;p=Hd(r|0,v|0,36)|0;l=l|C;f=Gd(r|0,v|0,34)|0;H=C;E=Hd(r|0,v|0,30)|0;H=l^(H|C);l=Gd(r|0,v|0,39)|0;j=C;A=Hd(r|0,v|0,25)|0;j=Dd((x|u)&r|x&u|0,(F|y)&v|F&y|0,(m|p)^(f|E)^(l|A)|0,H^(j|C)|0)|0;H=C;D=Dd(L|0,D|0,s|0,o|0)|0;L=C;o=Dd(j|0,H|0,s|0,o|0)|0;s=C;H=Gd(D|0,L|0,14)|0;j=C;A=Hd(D|0,L|0,50)|0;j=j|C;l=Gd(D|0,L|0,18)|0;E=C;f=Hd(D|0,L|0,46)|0;E=j^(E|C);j=Gd(D|0,L|0,41)|0;p=C;m=Hd(D|0,L|0,23)|0;p=E^(p|C);E=g+328|0;b=c[E>>2]|0;E=c[E+4>>2]|0;K=Dd(B|0,K|0,-1136513023,-1474664885)|0;E=Dd(K|0,C|0,b|0,E|0)|0;p=Dd(E|0,C|0,(H|A)^(l|f)^(j|m)|0,p|0)|0;p=Dd(p|0,C|0,(I^J)&D^I|0,(G^M)&L^G|0)|0;m=C;j=Gd(o|0,s|0,28)|0;f=C;l=Hd(o|0,s|0,36)|0;f=f|C;A=Gd(o|0,s|0,34)|0;H=C;E=Hd(o|0,s|0,30)|0;H=f^(H|C);f=Gd(o|0,s|0,39)|0;b=C;K=Hd(o|0,s|0,25)|0;b=Dd((u|r)&o|u&r|0,(y|v)&s|y&v|0,(j|l)^(A|E)^(f|K)|0,H^(b|C)|0)|0;H=C;F=Dd(x|0,F|0,p|0,m|0)|0;x=C;m=Dd(b|0,H|0,p|0,m|0)|0;p=C;H=Gd(F|0,x|0,14)|0;b=C;K=Hd(F|0,x|0,50)|0;b=b|C;f=Gd(F|0,x|0,18)|0;E=C;A=Hd(F|0,x|0,46)|0;E=b^(E|C);b=Gd(F|0,x|0,41)|0;l=C;j=Hd(F|0,x|0,23)|0;l=E^(l|C);E=g+336|0;B=c[E>>2]|0;E=c[E+4>>2]|0;G=Dd(I|0,G|0,-789014639,-1035236496)|0;E=Dd(G|0,C|0,B|0,E|0)|0;l=Dd(E|0,C|0,(H|K)^(f|A)^(b|j)|0,l|0)|0;l=Dd(l|0,C|0,(J^D)&F^J|0,(M^L)&x^M|0)|0;j=C;b=Gd(m|0,p|0,28)|0;A=C;f=Hd(m|0,p|0,36)|0;A=A|C;K=Gd(m|0,p|0,34)|0;H=C;E=Hd(m|0,p|0,30)|0;H=A^(H|C);A=Gd(m|0,p|0,39)|0;B=C;G=Hd(m|0,p|0,25)|0;B=Dd((r|o)&m|r&o|0,(v|s)&p|v&s|0,(b|f)^(K|E)^(A|G)|0,H^(B|C)|0)|0;H=C;y=Dd(u|0,y|0,l|0,j|0)|0;u=C;j=Dd(B|0,H|0,l|0,j|0)|0;l=C;H=Gd(y|0,u|0,14)|0;B=C;G=Hd(y|0,u|0,50)|0;B=B|C;A=Gd(y|0,u|0,18)|0;E=C;K=Hd(y|0,u|0,46)|0;E=B^(E|C);B=Gd(y|0,u|0,41)|0;f=C;b=Hd(y|0,u|0,23)|0;f=E^(f|C);E=g+344|0;I=c[E>>2]|0;E=c[E+4>>2]|0;M=Dd(J|0,M|0,106217008,-949202525)|0;E=Dd(M|0,C|0,I|0,E|0)|0;f=Dd(E|0,C|0,(H|G)^(A|K)^(B|b)|0,f|0)|0;f=Dd(f|0,C|0,(D^F)&y^D|0,(L^x)&u^L|0)|0;b=C;B=Gd(j|0,l|0,28)|0;K=C;A=Hd(j|0,l|0,36)|0;K=K|C;G=Gd(j|0,l|0,34)|0;H=C;E=Hd(j|0,l|0,30)|0;H=K^(H|C);K=Gd(j|0,l|0,39)|0;I=C;M=Hd(j|0,l|0,25)|0;I=Dd((o|m)&j|o&m|0,(s|p)&l|s&p|0,(B|A)^(G|E)^(K|M)|0,H^(I|C)|0)|0;H=C;v=Dd(r|0,v|0,f|0,b|0)|0;r=C;b=Dd(I|0,H|0,f|0,b|0)|0;f=C;H=Gd(v|0,r|0,14)|0;I=C;M=Hd(v|0,r|0,50)|0;I=I|C;K=Gd(v|0,r|0,18)|0;E=C;G=Hd(v|0,r|0,46)|0;E=I^(E|C);I=Gd(v|0,r|0,41)|0;A=C;B=Hd(v|0,r|0,23)|0;A=E^(A|C);E=g+352|0;J=c[E>>2]|0;E=c[E+4>>2]|0;L=Dd(D|0,L|0,-688958952,-778901479)|0;E=Dd(L|0,C|0,J|0,E|0)|0;A=Dd(E|0,C|0,(H|M)^(K|G)^(I|B)|0,A|0)|0;A=Dd(A|0,C|0,(F^y)&v^F|0,(x^u)&r^x|0)|0;B=C;I=Gd(b|0,f|0,28)|0;G=C;K=Hd(b|0,f|0,36)|0;G=G|C;M=Gd(b|0,f|0,34)|0;H=C;E=Hd(b|0,f|0,30)|0;H=G^(H|C);G=Gd(b|0,f|0,39)|0;J=C;L=Hd(b|0,f|0,25)|0;J=Dd((m|j)&b|m&j|0,(p|l)&f|p&l|0,(I|K)^(M|E)^(G|L)|0,H^(J|C)|0)|0;H=C;s=Dd(o|0,s|0,A|0,B|0)|0;o=C;B=Dd(J|0,H|0,A|0,B|0)|0;A=C;H=Gd(s|0,o|0,14)|0;J=C;L=Hd(s|0,o|0,50)|0;J=J|C;G=Gd(s|0,o|0,18)|0;E=C;M=Hd(s|0,o|0,46)|0;E=J^(E|C);J=Gd(s|0,o|0,41)|0;K=C;I=Hd(s|0,o|0,23)|0;K=E^(K|C);E=g+360|0;D=c[E>>2]|0;E=c[E+4>>2]|0;x=Dd(F|0,x|0,1432725776,-694614492)|0;E=Dd(x|0,C|0,D|0,E|0)|0;K=Dd(E|0,C|0,(H|L)^(G|M)^(J|I)|0,K|0)|0;K=Dd(K|0,C|0,(y^v)&s^y|0,(u^r)&o^u|0)|0;I=C;J=Gd(B|0,A|0,28)|0;M=C;G=Hd(B|0,A|0,36)|0;M=M|C;L=Gd(B|0,A|0,34)|0;H=C;E=Hd(B|0,A|0,30)|0;H=M^(H|C);M=Gd(B|0,A|0,39)|0;D=C;x=Hd(B|0,A|0,25)|0;D=Dd((j|b)&B|j&b|0,(l|f)&A|l&f|0,(J|G)^(L|E)^(M|x)|0,H^(D|C)|0)|0;H=C;p=Dd(m|0,p|0,K|0,I|0)|0;m=C;I=Dd(D|0,H|0,K|0,I|0)|0;K=C;H=Gd(p|0,m|0,14)|0;D=C;x=Hd(p|0,m|0,50)|0;D=D|C;M=Gd(p|0,m|0,18)|0;E=C;L=Hd(p|0,m|0,46)|0;E=D^(E|C);D=Gd(p|0,m|0,41)|0;G=C;J=Hd(p|0,m|0,23)|0;G=E^(G|C);E=g+368|0;F=c[E>>2]|0;E=c[E+4>>2]|0;u=Dd(y|0,u|0,1467031594,-200395387)|0;E=Dd(u|0,C|0,F|0,E|0)|0;G=Dd(E|0,C|0,(H|x)^(M|L)^(D|J)|0,G|0)|0;G=Dd(G|0,C|0,(v^s)&p^v|0,(r^o)&m^r|0)|0;J=C;D=Gd(I|0,K|0,28)|0;L=C;M=Hd(I|0,K|0,36)|0;L=L|C;x=Gd(I|0,K|0,34)|0;H=C;E=Hd(I|0,K|0,30)|0;H=L^(H|C);L=Gd(I|0,K|0,39)|0;F=C;u=Hd(I|0,K|0,25)|0;F=Dd((b|B)&I|b&B|0,(f|A)&K|f&A|0,(D|M)^(x|E)^(L|u)|0,H^(F|C)|0)|0;H=C;l=Dd(j|0,l|0,G|0,J|0)|0;j=C;J=Dd(F|0,H|0,G|0,J|0)|0;G=C;H=Gd(l|0,j|0,14)|0;F=C;u=Hd(l|0,j|0,50)|0;F=F|C;L=Gd(l|0,j|0,18)|0;E=C;x=Hd(l|0,j|0,46)|0;E=F^(E|C);F=Gd(l|0,j|0,41)|0;M=C;D=Hd(l|0,j|0,23)|0;M=E^(M|C);E=g+376|0;y=c[E>>2]|0;E=c[E+4>>2]|0;r=Dd(v|0,r|0,851169720,275423344)|0;E=Dd(r|0,C|0,y|0,E|0)|0;M=Dd(E|0,C|0,(H|u)^(L|x)^(F|D)|0,M|0)|0;M=Dd(M|0,C|0,(s^p)&l^s|0,(o^m)&j^o|0)|0;D=C;F=Gd(J|0,G|0,28)|0;x=C;L=Hd(J|0,G|0,36)|0;x=x|C;u=Gd(J|0,G|0,34)|0;H=C;E=Hd(J|0,G|0,30)|0;H=x^(H|C);x=Gd(J|0,G|0,39)|0;y=C;r=Hd(J|0,G|0,25)|0;y=Dd((B|I)&J|B&I|0,(A|K)&G|A&K|0,(F|L)^(u|E)^(x|r)|0,H^(y|C)|0)|0;H=C;f=Dd(b|0,f|0,M|0,D|0)|0;b=C;D=Dd(y|0,H|0,M|0,D|0)|0;M=C;H=Gd(f|0,b|0,14)|0;y=C;r=Hd(f|0,b|0,50)|0;y=y|C;x=Gd(f|0,b|0,18)|0;E=C;u=Hd(f|0,b|0,46)|0;E=y^(E|C);y=Gd(f|0,b|0,41)|0;L=C;F=Hd(f|0,b|0,23)|0;L=E^(L|C);E=g+384|0;v=c[E>>2]|0;E=c[E+4>>2]|0;o=Dd(s|0,o|0,-1194143544,430227734)|0;E=Dd(o|0,C|0,v|0,E|0)|0;L=Dd(E|0,C|0,(H|r)^(x|u)^(y|F)|0,L|0)|0;L=Dd(L|0,C|0,(p^l)&f^p|0,(m^j)&b^m|0)|0;F=C;y=Gd(D|0,M|0,28)|0;u=C;x=Hd(D|0,M|0,36)|0;u=u|C;r=Gd(D|0,M|0,34)|0;H=C;E=Hd(D|0,M|0,30)|0;H=u^(H|C);u=Gd(D|0,M|0,39)|0;v=C;o=Hd(D|0,M|0,25)|0;v=Dd((I|J)&D|I&J|0,(K|G)&M|K&G|0,(y|x)^(r|E)^(u|o)|0,H^(v|C)|0)|0;H=C;A=Dd(B|0,A|0,L|0,F|0)|0;B=C;F=Dd(v|0,H|0,L|0,F|0)|0;L=C;H=Gd(A|0,B|0,14)|0;v=C;o=Hd(A|0,B|0,50)|0;v=v|C;u=Gd(A|0,B|0,18)|0;E=C;r=Hd(A|0,B|0,46)|0;E=v^(E|C);v=Gd(A|0,B|0,41)|0;x=C;y=Hd(A|0,B|0,23)|0;x=E^(x|C);E=g+392|0;s=c[E>>2]|0;E=c[E+4>>2]|0;m=Dd(p|0,m|0,1363258195,506948616)|0;E=Dd(m|0,C|0,s|0,E|0)|0;x=Dd(E|0,C|0,(H|o)^(u|r)^(v|y)|0,x|0)|0;x=Dd(x|0,C|0,(l^f)&A^l|0,(j^b)&B^j|0)|0;y=C;v=Gd(F|0,L|0,28)|0;r=C;u=Hd(F|0,L|0,36)|0;r=r|C;o=Gd(F|0,L|0,34)|0;H=C;E=Hd(F|0,L|0,30)|0;H=r^(H|C);r=Gd(F|0,L|0,39)|0;s=C;m=Hd(F|0,L|0,25)|0;s=Dd((J|D)&F|J&D|0,(G|M)&L|G&M|0,(v|u)^(o|E)^(r|m)|0,H^(s|C)|0)|0;H=C;K=Dd(I|0,K|0,x|0,y|0)|0;I=C;y=Dd(s|0,H|0,x|0,y|0)|0;x=C;H=Gd(K|0,I|0,14)|0;s=C;m=Hd(K|0,I|0,50)|0;s=s|C;r=Gd(K|0,I|0,18)|0;E=C;o=Hd(K|0,I|0,46)|0;E=s^(E|C);s=Gd(K|0,I|0,41)|0;u=C;v=Hd(K|0,I|0,23)|0;u=E^(u|C);E=g+400|0;p=c[E>>2]|0;E=c[E+4>>2]|0;j=Dd(l|0,j|0,-544281703,659060556)|0;E=Dd(j|0,C|0,p|0,E|0)|0;u=Dd(E|0,C|0,(H|m)^(r|o)^(s|v)|0,u|0)|0;u=Dd(u|0,C|0,(f^A)&K^f|0,(b^B)&I^b|0)|0;v=C;s=Gd(y|0,x|0,28)|0;o=C;r=Hd(y|0,x|0,36)|0;o=o|C;m=Gd(y|0,x|0,34)|0;H=C;E=Hd(y|0,x|0,30)|0;H=o^(H|C);o=Gd(y|0,x|0,39)|0;p=C;j=Hd(y|0,x|0,25)|0;p=Dd((D|F)&y|D&F|0,(M|L)&x|M&L|0,(s|r)^(m|E)^(o|j)|0,H^(p|C)|0)|0;H=C;G=Dd(J|0,G|0,u|0,v|0)|0;J=C;v=Dd(p|0,H|0,u|0,v|0)|0;u=C;H=Gd(G|0,J|0,14)|0;p=C;j=Hd(G|0,J|0,50)|0;p=p|C;o=Gd(G|0,J|0,18)|0;E=C;m=Hd(G|0,J|0,46)|0;E=p^(E|C);p=Gd(G|0,J|0,41)|0;r=C;s=Hd(G|0,J|0,23)|0;r=E^(r|C);E=g+408|0;l=c[E>>2]|0;E=c[E+4>>2]|0;b=Dd(f|0,b|0,-509917016,883997877)|0;E=Dd(b|0,C|0,l|0,E|0)|0;r=Dd(E|0,C|0,(H|j)^(o|m)^(p|s)|0,r|0)|0;r=Dd(r|0,C|0,(A^K)&G^A|0,(B^I)&J^B|0)|0;s=C;p=Gd(v|0,u|0,28)|0;m=C;o=Hd(v|0,u|0,36)|0;m=m|C;j=Gd(v|0,u|0,34)|0;H=C;E=Hd(v|0,u|0,30)|0;H=m^(H|C);m=Gd(v|0,u|0,39)|0;l=C;b=Hd(v|0,u|0,25)|0;l=Dd((F|y)&v|F&y|0,(L|x)&u|L&x|0,(p|o)^(j|E)^(m|b)|0,H^(l|C)|0)|0;H=C;M=Dd(D|0,M|0,r|0,s|0)|0;D=C;s=Dd(l|0,H|0,r|0,s|0)|0;r=C;H=Gd(M|0,D|0,14)|0;l=C;b=Hd(M|0,D|0,50)|0;l=l|C;m=Gd(M|0,D|0,18)|0;E=C;j=Hd(M|0,D|0,46)|0;E=l^(E|C);l=Gd(M|0,D|0,41)|0;o=C;p=Hd(M|0,D|0,23)|0;o=E^(o|C);E=g+416|0;f=c[E>>2]|0;E=c[E+4>>2]|0;B=Dd(A|0,B|0,-976659869,958139571)|0;E=Dd(B|0,C|0,f|0,E|0)|0;o=Dd(E|0,C|0,(H|b)^(m|j)^(l|p)|0,o|0)|0;o=Dd(o|0,C|0,(K^G)&M^K|0,(I^J)&D^I|0)|0;p=C;l=Gd(s|0,r|0,28)|0;j=C;m=Hd(s|0,r|0,36)|0;j=j|C;b=Gd(s|0,r|0,34)|0;H=C;E=Hd(s|0,r|0,30)|0;H=j^(H|C);j=Gd(s|0,r|0,39)|0;f=C;B=Hd(s|0,r|0,25)|0;f=Dd((y|v)&s|y&v|0,(x|u)&r|x&u|0,(l|m)^(b|E)^(j|B)|0,H^(f|C)|0)|0;H=C;L=Dd(F|0,L|0,o|0,p|0)|0;F=C;p=Dd(f|0,H|0,o|0,p|0)|0;o=C;H=Gd(L|0,F|0,14)|0;f=C;B=Hd(L|0,F|0,50)|0;f=f|C;j=Gd(L|0,F|0,18)|0;E=C;b=Hd(L|0,F|0,46)|0;E=f^(E|C);f=Gd(L|0,F|0,41)|0;m=C;l=Hd(L|0,F|0,23)|0;m=E^(m|C);E=g+424|0;A=c[E>>2]|0;E=c[E+4>>2]|0;I=Dd(K|0,I|0,-482243893,1322822218)|0;E=Dd(I|0,C|0,A|0,E|0)|0;m=Dd(E|0,C|0,(H|B)^(j|b)^(f|l)|0,m|0)|0;m=Dd(m|0,C|0,(G^M)&L^G|0,(J^D)&F^J|0)|0;l=C;f=Gd(p|0,o|0,28)|0;b=C;j=Hd(p|0,o|0,36)|0;b=b|C;B=Gd(p|0,o|0,34)|0;H=C;E=Hd(p|0,o|0,30)|0;H=b^(H|C);b=Gd(p|0,o|0,39)|0;A=C;I=Hd(p|0,o|0,25)|0;A=Dd((v|s)&p|v&s|0,(u|r)&o|u&r|0,(f|j)^(B|E)^(b|I)|0,H^(A|C)|0)|0;H=C;x=Dd(y|0,x|0,m|0,l|0)|0;y=C;l=Dd(A|0,H|0,m|0,l|0)|0;m=C;H=Gd(x|0,y|0,14)|0;A=C;I=Hd(x|0,y|0,50)|0;A=A|C;b=Gd(x|0,y|0,18)|0;E=C;B=Hd(x|0,y|0,46)|0;E=A^(E|C);A=Gd(x|0,y|0,41)|0;j=C;f=Hd(x|0,y|0,23)|0;j=E^(j|C);E=g+432|0;K=c[E>>2]|0;E=c[E+4>>2]|0;J=Dd(G|0,J|0,2003034995,1537002063)|0;E=Dd(J|0,C|0,K|0,E|0)|0;j=Dd(E|0,C|0,(H|I)^(b|B)^(A|f)|0,j|0)|0;j=Dd(j|0,C|0,(M^L)&x^M|0,(D^F)&y^D|0)|0;f=C;A=Gd(l|0,m|0,28)|0;B=C;b=Hd(l|0,m|0,36)|0;B=B|C;I=Gd(l|0,m|0,34)|0;H=C;E=Hd(l|0,m|0,30)|0;H=B^(H|C);B=Gd(l|0,m|0,39)|0;K=C;J=Hd(l|0,m|0,25)|0;K=Dd((s|p)&l|s&p|0,(r|o)&m|r&o|0,(A|b)^(I|E)^(B|J)|0,H^(K|C)|0)|0;H=C;u=Dd(v|0,u|0,j|0,f|0)|0;v=C;f=Dd(K|0,H|0,j|0,f|0)|0;j=C;H=Gd(u|0,v|0,14)|0;K=C;J=Hd(u|0,v|0,50)|0;K=K|C;B=Gd(u|0,v|0,18)|0;E=C;I=Hd(u|0,v|0,46)|0;E=K^(E|C);K=Gd(u|0,v|0,41)|0;b=C;A=Hd(u|0,v|0,23)|0;b=E^(b|C);E=g+440|0;G=c[E>>2]|0;E=c[E+4>>2]|0;D=Dd(M|0,D|0,-692930397,1747873779)|0;E=Dd(D|0,C|0,G|0,E|0)|0;b=Dd(E|0,C|0,(H|J)^(B|I)^(K|A)|0,b|0)|0;b=Dd(b|0,C|0,(L^x)&u^L|0,(F^y)&v^F|0)|0;A=C;K=Gd(f|0,j|0,28)|0;I=C;B=Hd(f|0,j|0,36)|0;I=I|C;J=Gd(f|0,j|0,34)|0;H=C;E=Hd(f|0,j|0,30)|0;H=I^(H|C);I=Gd(f|0,j|0,39)|0;G=C;D=Hd(f|0,j|0,25)|0;G=Dd((p|l)&f|p&l|0,(o|m)&j|o&m|0,(K|B)^(J|E)^(I|D)|0,H^(G|C)|0)|0;H=C;r=Dd(s|0,r|0,b|0,A|0)|0;s=C;A=Dd(G|0,H|0,b|0,A|0)|0;b=C;H=Gd(r|0,s|0,14)|0;G=C;D=Hd(r|0,s|0,50)|0;G=G|C;I=Gd(r|0,s|0,18)|0;E=C;J=Hd(r|0,s|0,46)|0;E=G^(E|C);G=Gd(r|0,s|0,41)|0;B=C;K=Hd(r|0,s|0,23)|0;B=E^(B|C);E=g+448|0;M=c[E>>2]|0;E=c[E+4>>2]|0;F=Dd(L|0,F|0,1575990012,1955562222)|0;E=Dd(F|0,C|0,M|0,E|0)|0;B=Dd(E|0,C|0,(H|D)^(I|J)^(G|K)|0,B|0)|0;B=Dd(B|0,C|0,(x^u)&r^x|0,(y^v)&s^y|0)|0;K=C;G=Gd(A|0,b|0,28)|0;J=C;I=Hd(A|0,b|0,36)|0;J=J|C;D=Gd(A|0,b|0,34)|0;H=C;E=Hd(A|0,b|0,30)|0;H=J^(H|C);J=Gd(A|0,b|0,39)|0;M=C;F=Hd(A|0,b|0,25)|0;M=Dd((l|f)&A|l&f|0,(m|j)&b|m&j|0,(G|I)^(D|E)^(J|F)|0,H^(M|C)|0)|0;H=C;o=Dd(p|0,o|0,B|0,K|0)|0;p=C;K=Dd(M|0,H|0,B|0,K|0)|0;B=C;H=Gd(o|0,p|0,14)|0;M=C;F=Hd(o|0,p|0,50)|0;M=M|C;J=Gd(o|0,p|0,18)|0;E=C;D=Hd(o|0,p|0,46)|0;E=M^(E|C);M=Gd(o|0,p|0,41)|0;I=C;G=Hd(o|0,p|0,23)|0;I=E^(I|C);E=g+456|0;L=c[E>>2]|0;E=c[E+4>>2]|0;y=Dd(x|0,y|0,1125592928,2024104815)|0;E=Dd(y|0,C|0,L|0,E|0)|0;I=Dd(E|0,C|0,(H|F)^(J|D)^(M|G)|0,I|0)|0;I=Dd(I|0,C|0,(u^r)&o^u|0,(v^s)&p^v|0)|0;G=C;M=Gd(K|0,B|0,28)|0;D=C;J=Hd(K|0,B|0,36)|0;D=D|C;F=Gd(K|0,B|0,34)|0;H=C;E=Hd(K|0,B|0,30)|0;H=D^(H|C);D=Gd(K|0,B|0,39)|0;L=C;y=Hd(K|0,B|0,25)|0;L=Dd((f|A)&K|f&A|0,(j|b)&B|j&b|0,(M|J)^(F|E)^(D|y)|0,H^(L|C)|0)|0;H=C;m=Dd(l|0,m|0,I|0,G|0)|0;l=C;G=Dd(L|0,H|0,I|0,G|0)|0;I=C;H=Gd(m|0,l|0,14)|0;L=C;y=Hd(m|0,l|0,50)|0;L=L|C;D=Gd(m|0,l|0,18)|0;E=C;F=Hd(m|0,l|0,46)|0;E=L^(E|C);L=Gd(m|0,l|0,41)|0;J=C;M=Hd(m|0,l|0,23)|0;J=E^(J|C);E=g+464|0;x=c[E>>2]|0;E=c[E+4>>2]|0;v=Dd(u|0,v|0,-1578062990,-2067236844)|0;E=Dd(v|0,C|0,x|0,E|0)|0;J=Dd(E|0,C|0,(H|y)^(D|F)^(L|M)|0,J|0)|0;J=Dd(J|0,C|0,(r^o)&m^r|0,(s^p)&l^s|0)|0;M=C;L=Gd(G|0,I|0,28)|0;F=C;D=Hd(G|0,I|0,36)|0;F=F|C;y=Gd(G|0,I|0,34)|0;H=C;E=Hd(G|0,I|0,30)|0;H=F^(H|C);F=Gd(G|0,I|0,39)|0;x=C;v=Hd(G|0,I|0,25)|0;x=Dd((A|K)&G|A&K|0,(b|B)&I|b&B|0,(L|D)^(y|E)^(F|v)|0,H^(x|C)|0)|0;H=C;j=Dd(f|0,j|0,J|0,M|0)|0;f=C;M=Dd(x|0,H|0,J|0,M|0)|0;J=C;H=Gd(j|0,f|0,14)|0;x=C;v=Hd(j|0,f|0,50)|0;x=x|C;F=Gd(j|0,f|0,18)|0;E=C;y=Hd(j|0,f|0,46)|0;E=x^(E|C);x=Gd(j|0,f|0,41)|0;D=C;L=Hd(j|0,f|0,23)|0;D=E^(D|C);E=g+472|0;u=c[E>>2]|0;E=c[E+4>>2]|0;s=Dd(r|0,s|0,442776044,-1933114872)|0;E=Dd(s|0,C|0,u|0,E|0)|0;D=Dd(E|0,C|0,(H|v)^(F|y)^(x|L)|0,D|0)|0;D=Dd(D|0,C|0,(o^m)&j^o|0,(p^l)&f^p|0)|0;L=C;x=Gd(M|0,J|0,28)|0;y=C;F=Hd(M|0,J|0,36)|0;y=y|C;v=Gd(M|0,J|0,34)|0;H=C;E=Hd(M|0,J|0,30)|0;H=y^(H|C);y=Gd(M|0,J|0,39)|0;u=C;s=Hd(M|0,J|0,25)|0;u=Dd((K|G)&M|K&G|0,(B|I)&J|B&I|0,(x|F)^(v|E)^(y|s)|0,H^(u|C)|0)|0;H=C;b=Dd(A|0,b|0,D|0,L|0)|0;A=C;L=Dd(u|0,H|0,D|0,L|0)|0;D=C;H=Gd(b|0,A|0,14)|0;u=C;s=Hd(b|0,A|0,50)|0;u=u|C;y=Gd(b|0,A|0,18)|0;E=C;v=Hd(b|0,A|0,46)|0;E=u^(E|C);u=Gd(b|0,A|0,41)|0;F=C;x=Hd(b|0,A|0,23)|0;F=E^(F|C);E=g+480|0;r=c[E>>2]|0;E=c[E+4>>2]|0;p=Dd(o|0,p|0,593698344,-1866530822)|0;E=Dd(p|0,C|0,r|0,E|0)|0;F=Dd(E|0,C|0,(H|s)^(y|v)^(u|x)|0,F|0)|0;F=Dd(F|0,C|0,(m^j)&b^m|0,(l^f)&A^l|0)|0;x=C;u=Gd(L|0,D|0,28)|0;v=C;y=Hd(L|0,D|0,36)|0;v=v|C;s=Gd(L|0,D|0,34)|0;H=C;E=Hd(L|0,D|0,30)|0;H=v^(H|C);v=Gd(L|0,D|0,39)|0;r=C;p=Hd(L|0,D|0,25)|0;r=Dd((G|M)&L|G&M|0,(I|J)&D|I&J|0,(u|y)^(s|E)^(v|p)|0,H^(r|C)|0)|0;H=C;B=Dd(K|0,B|0,F|0,x|0)|0;K=C;x=Dd(r|0,H|0,F|0,x|0)|0;F=C;H=Gd(B|0,K|0,14)|0;r=C;p=Hd(B|0,K|0,50)|0;r=r|C;v=Gd(B|0,K|0,18)|0;E=C;s=Hd(B|0,K|0,46)|0;E=r^(E|C);r=Gd(B|0,K|0,41)|0;y=C;u=Hd(B|0,K|0,23)|0;y=E^(y|C);E=g+488|0;o=c[E>>2]|0;E=c[E+4>>2]|0;l=Dd(m|0,l|0,-561857047,-1538233109)|0;E=Dd(l|0,C|0,o|0,E|0)|0;y=Dd(E|0,C|0,(H|p)^(v|s)^(r|u)|0,y|0)|0;y=Dd(y|0,C|0,(j^b)&B^j|0,(f^A)&K^f|0)|0;u=C;r=Gd(x|0,F|0,28)|0;s=C;v=Hd(x|0,F|0,36)|0;s=s|C;p=Gd(x|0,F|0,34)|0;H=C;E=Hd(x|0,F|0,30)|0;H=s^(H|C);s=Gd(x|0,F|0,39)|0;o=C;l=Hd(x|0,F|0,25)|0;o=Dd((M|L)&x|M&L|0,(J|D)&F|J&D|0,(r|v)^(p|E)^(s|l)|0,H^(o|C)|0)|0;H=C;I=Dd(G|0,I|0,y|0,u|0)|0;G=C;u=Dd(o|0,H|0,y|0,u|0)|0;y=C;H=Gd(I|0,G|0,14)|0;o=C;l=Hd(I|0,G|0,50)|0;o=o|C;s=Gd(I|0,G|0,18)|0;E=C;p=Hd(I|0,G|0,46)|0;E=o^(E|C);o=Gd(I|0,G|0,41)|0;v=C;r=Hd(I|0,G|0,23)|0;v=E^(v|C);E=g+496|0;m=c[E>>2]|0;E=c[E+4>>2]|0;f=Dd(j|0,f|0,-1295615723,-1090935817)|0;E=Dd(f|0,C|0,m|0,E|0)|0;v=Dd(E|0,C|0,(H|l)^(s|p)^(o|r)|0,v|0)|0;v=Dd(v|0,C|0,(b^B)&I^b|0,(A^K)&G^A|0)|0;r=C;o=Gd(u|0,y|0,28)|0;p=C;s=Hd(u|0,y|0,36)|0;p=p|C;l=Gd(u|0,y|0,34)|0;H=C;E=Hd(u|0,y|0,30)|0;H=p^(H|C);p=Gd(u|0,y|0,39)|0;m=C;f=Hd(u|0,y|0,25)|0;m=Dd((L|x)&u|L&x|0,(D|F)&y|D&F|0,(o|s)^(l|E)^(p|f)|0,H^(m|C)|0)|0;H=C;J=Dd(M|0,J|0,v|0,r|0)|0;M=C;r=Dd(m|0,H|0,v|0,r|0)|0;v=C;H=Gd(J|0,M|0,14)|0;m=C;f=Hd(J|0,M|0,50)|0;m=m|C;p=Gd(J|0,M|0,18)|0;E=C;l=Hd(J|0,M|0,46)|0;E=m^(E|C);m=Gd(J|0,M|0,41)|0;s=C;o=Hd(J|0,M|0,23)|0;s=E^(s|C);E=g+504|0;j=c[E>>2]|0;E=c[E+4>>2]|0;A=Dd(b|0,A|0,-479046869,-965641998)|0;E=Dd(A|0,C|0,j|0,E|0)|0;s=Dd(E|0,C|0,(H|f)^(p|l)^(m|o)|0,s|0)|0;s=Dd(s|0,C|0,(B^I)&J^B|0,(K^G)&M^K|0)|0;o=C;m=Gd(r|0,v|0,28)|0;l=C;p=Hd(r|0,v|0,36)|0;l=l|C;f=Gd(r|0,v|0,34)|0;H=C;E=Hd(r|0,v|0,30)|0;H=l^(H|C);l=Gd(r|0,v|0,39)|0;j=C;A=Hd(r|0,v|0,25)|0;j=Dd((x|u)&r|x&u|0,(F|y)&v|F&y|0,(m|p)^(f|E)^(l|A)|0,H^(j|C)|0)|0;H=C;D=Dd(L|0,D|0,s|0,o|0)|0;L=C;o=Dd(j|0,H|0,s|0,o|0)|0;s=C;H=Gd(D|0,L|0,14)|0;j=C;A=Hd(D|0,L|0,50)|0;j=j|C;l=Gd(D|0,L|0,18)|0;E=C;f=Hd(D|0,L|0,46)|0;E=j^(E|C);j=Gd(D|0,L|0,41)|0;p=C;m=Hd(D|0,L|0,23)|0;p=E^(p|C);E=g+512|0;b=c[E>>2]|0;E=c[E+4>>2]|0;K=Dd(B|0,K|0,-366583396,-903397682)|0;E=Dd(K|0,C|0,b|0,E|0)|0;p=Dd(E|0,C|0,(H|A)^(l|f)^(j|m)|0,p|0)|0;p=Dd(p|0,C|0,(I^J)&D^I|0,(G^M)&L^G|0)|0;m=C;j=Gd(o|0,s|0,28)|0;f=C;l=Hd(o|0,s|0,36)|0;f=f|C;A=Gd(o|0,s|0,34)|0;H=C;E=Hd(o|0,s|0,30)|0;H=f^(H|C);f=Gd(o|0,s|0,39)|0;b=C;K=Hd(o|0,s|0,25)|0;b=Dd((u|r)&o|u&r|0,(y|v)&s|y&v|0,(j|l)^(A|E)^(f|K)|0,H^(b|C)|0)|0;H=C;F=Dd(x|0,F|0,p|0,m|0)|0;x=C;m=Dd(b|0,H|0,p|0,m|0)|0;p=C;H=Gd(F|0,x|0,14)|0;b=C;K=Hd(F|0,x|0,50)|0;b=b|C;f=Gd(F|0,x|0,18)|0;E=C;A=Hd(F|0,x|0,46)|0;E=b^(E|C);b=Gd(F|0,x|0,41)|0;l=C;j=Hd(F|0,x|0,23)|0;l=E^(l|C);E=g+520|0;B=c[E>>2]|0;E=c[E+4>>2]|0;G=Dd(I|0,G|0,566280711,-779700025)|0;E=Dd(G|0,C|0,B|0,E|0)|0;l=Dd(E|0,C|0,(H|K)^(f|A)^(b|j)|0,l|0)|0;l=Dd(l|0,C|0,(J^D)&F^J|0,(M^L)&x^M|0)|0;j=C;b=Gd(m|0,p|0,28)|0;A=C;f=Hd(m|0,p|0,36)|0;A=A|C;K=Gd(m|0,p|0,34)|0;H=C;E=Hd(m|0,p|0,30)|0;H=A^(H|C);A=Gd(m|0,p|0,39)|0;B=C;G=Hd(m|0,p|0,25)|0;B=Dd((r|o)&m|r&o|0,(v|s)&p|v&s|0,(b|f)^(K|E)^(A|G)|0,H^(B|C)|0)|0;H=C;y=Dd(u|0,y|0,l|0,j|0)|0;u=C;j=Dd(B|0,H|0,l|0,j|0)|0;l=C;H=Gd(y|0,u|0,14)|0;B=C;G=Hd(y|0,u|0,50)|0;B=B|C;A=Gd(y|0,u|0,18)|0;E=C;K=Hd(y|0,u|0,46)|0;E=B^(E|C);B=Gd(y|0,u|0,41)|0;f=C;b=Hd(y|0,u|0,23)|0;f=E^(f|C);E=g+528|0;I=c[E>>2]|0;E=c[E+4>>2]|0;M=Dd(J|0,M|0,-840897762,-354779690)|0;E=Dd(M|0,C|0,I|0,E|0)|0;f=Dd(E|0,C|0,(H|G)^(A|K)^(B|b)|0,f|0)|0;f=Dd(f|0,C|0,(D^F)&y^D|0,(L^x)&u^L|0)|0;b=C;B=Gd(j|0,l|0,28)|0;K=C;A=Hd(j|0,l|0,36)|0;K=K|C;G=Gd(j|0,l|0,34)|0;H=C;E=Hd(j|0,l|0,30)|0;H=K^(H|C);K=Gd(j|0,l|0,39)|0;I=C;M=Hd(j|0,l|0,25)|0;I=Dd((o|m)&j|o&m|0,(s|p)&l|s&p|0,(B|A)^(G|E)^(K|M)|0,H^(I|C)|0)|0;H=C;v=Dd(r|0,v|0,f|0,b|0)|0;r=C;b=Dd(I|0,H|0,f|0,b|0)|0;f=C;H=Gd(v|0,r|0,14)|0;I=C;M=Hd(v|0,r|0,50)|0;I=I|C;K=Gd(v|0,r|0,18)|0;E=C;G=Hd(v|0,r|0,46)|0;E=I^(E|C);I=Gd(v|0,r|0,41)|0;A=C;B=Hd(v|0,r|0,23)|0;A=E^(A|C);E=g+536|0;J=c[E>>2]|0;E=c[E+4>>2]|0;L=Dd(D|0,L|0,-294727304,-176337025)|0;E=Dd(L|0,C|0,J|0,E|0)|0;A=Dd(E|0,C|0,(H|M)^(K|G)^(I|B)|0,A|0)|0;A=Dd(A|0,C|0,(F^y)&v^F|0,(x^u)&r^x|0)|0;B=C;I=Gd(b|0,f|0,28)|0;G=C;K=Hd(b|0,f|0,36)|0;G=G|C;M=Gd(b|0,f|0,34)|0;H=C;E=Hd(b|0,f|0,30)|0;H=G^(H|C);G=Gd(b|0,f|0,39)|0;J=C;L=Hd(b|0,f|0,25)|0;J=Dd((m|j)&b|m&j|0,(p|l)&f|p&l|0,(I|K)^(M|E)^(G|L)|0,H^(J|C)|0)|0;H=C;s=Dd(o|0,s|0,A|0,B|0)|0;o=C;B=Dd(J|0,H|0,A|0,B|0)|0;A=C;H=Gd(s|0,o|0,14)|0;J=C;L=Hd(s|0,o|0,50)|0;J=J|C;G=Gd(s|0,o|0,18)|0;E=C;M=Hd(s|0,o|0,46)|0;E=J^(E|C);J=Gd(s|0,o|0,41)|0;K=C;I=Hd(s|0,o|0,23)|0;K=E^(K|C);E=g+544|0;D=c[E>>2]|0;E=c[E+4>>2]|0;x=Dd(F|0,x|0,1914138554,116418474)|0;E=Dd(x|0,C|0,D|0,E|0)|0;K=Dd(E|0,C|0,(H|L)^(G|M)^(J|I)|0,K|0)|0;K=Dd(K|0,C|0,(y^v)&s^y|0,(u^r)&o^u|0)|0;I=C;J=Gd(B|0,A|0,28)|0;M=C;G=Hd(B|0,A|0,36)|0;M=M|C;L=Gd(B|0,A|0,34)|0;H=C;E=Hd(B|0,A|0,30)|0;H=M^(H|C);M=Gd(B|0,A|0,39)|0;D=C;x=Hd(B|0,A|0,25)|0;D=Dd((j|b)&B|j&b|0,(l|f)&A|l&f|0,(J|G)^(L|E)^(M|x)|0,H^(D|C)|0)|0;H=C;p=Dd(m|0,p|0,K|0,I|0)|0;m=C;I=Dd(D|0,H|0,K|0,I|0)|0;K=C;H=Gd(p|0,m|0,14)|0;D=C;x=Hd(p|0,m|0,50)|0;D=D|C;M=Gd(p|0,m|0,18)|0;E=C;L=Hd(p|0,m|0,46)|0;E=D^(E|C);D=Gd(p|0,m|0,41)|0;G=C;J=Hd(p|0,m|0,23)|0;G=E^(G|C);E=g+552|0;F=c[E>>2]|0;E=c[E+4>>2]|0;u=Dd(y|0,u|0,-1563912026,174292421)|0;E=Dd(u|0,C|0,F|0,E|0)|0;G=Dd(E|0,C|0,(H|x)^(M|L)^(D|J)|0,G|0)|0;G=Dd(G|0,C|0,(v^s)&p^v|0,(r^o)&m^r|0)|0;J=C;D=Gd(I|0,K|0,28)|0;L=C;M=Hd(I|0,K|0,36)|0;L=L|C;x=Gd(I|0,K|0,34)|0;H=C;E=Hd(I|0,K|0,30)|0;H=L^(H|C);L=Gd(I|0,K|0,39)|0;F=C;u=Hd(I|0,K|0,25)|0;F=Dd((b|B)&I|b&B|0,(f|A)&K|f&A|0,(D|M)^(x|E)^(L|u)|0,H^(F|C)|0)|0;H=C;l=Dd(j|0,l|0,G|0,J|0)|0;j=C;J=Dd(F|0,H|0,G|0,J|0)|0;G=C;H=Gd(l|0,j|0,14)|0;F=C;u=Hd(l|0,j|0,50)|0;F=F|C;L=Gd(l|0,j|0,18)|0;E=C;x=Hd(l|0,j|0,46)|0;E=F^(E|C);F=Gd(l|0,j|0,41)|0;M=C;D=Hd(l|0,j|0,23)|0;M=E^(M|C);E=g+560|0;y=c[E>>2]|0;E=c[E+4>>2]|0;r=Dd(v|0,r|0,-1090974290,289380356)|0;E=Dd(r|0,C|0,y|0,E|0)|0;M=Dd(E|0,C|0,(H|u)^(L|x)^(F|D)|0,M|0)|0;M=Dd(M|0,C|0,(s^p)&l^s|0,(o^m)&j^o|0)|0;D=C;F=Gd(J|0,G|0,28)|0;x=C;L=Hd(J|0,G|0,36)|0;x=x|C;u=Gd(J|0,G|0,34)|0;H=C;E=Hd(J|0,G|0,30)|0;H=x^(H|C);x=Gd(J|0,G|0,39)|0;y=C;r=Hd(J|0,G|0,25)|0;y=Dd((B|I)&J|B&I|0,(A|K)&G|A&K|0,(F|L)^(u|E)^(x|r)|0,H^(y|C)|0)|0;H=C;f=Dd(b|0,f|0,M|0,D|0)|0;b=C;D=Dd(y|0,H|0,M|0,D|0)|0;M=C;H=Gd(f|0,b|0,14)|0;y=C;r=Hd(f|0,b|0,50)|0;y=y|C;x=Gd(f|0,b|0,18)|0;E=C;u=Hd(f|0,b|0,46)|0;E=y^(E|C);y=Gd(f|0,b|0,41)|0;L=C;F=Hd(f|0,b|0,23)|0;L=E^(L|C);E=g+568|0;v=c[E>>2]|0;E=c[E+4>>2]|0;o=Dd(s|0,o|0,320620315,460393269)|0;E=Dd(o|0,C|0,v|0,E|0)|0;L=Dd(E|0,C|0,(H|r)^(x|u)^(y|F)|0,L|0)|0;L=Dd(L|0,C|0,(p^l)&f^p|0,(m^j)&b^m|0)|0;F=C;y=Gd(D|0,M|0,28)|0;u=C;x=Hd(D|0,M|0,36)|0;u=u|C;r=Gd(D|0,M|0,34)|0;H=C;E=Hd(D|0,M|0,30)|0;H=u^(H|C);u=Gd(D|0,M|0,39)|0;v=C;o=Hd(D|0,M|0,25)|0;v=Dd((I|J)&D|I&J|0,(K|G)&M|K&G|0,(y|x)^(r|E)^(u|o)|0,H^(v|C)|0)|0;H=C;A=Dd(B|0,A|0,L|0,F|0)|0;B=C;F=Dd(v|0,H|0,L|0,F|0)|0;L=C;H=Gd(A|0,B|0,14)|0;v=C;o=Hd(A|0,B|0,50)|0;v=v|C;u=Gd(A|0,B|0,18)|0;E=C;r=Hd(A|0,B|0,46)|0;E=v^(E|C);v=Gd(A|0,B|0,41)|0;x=C;y=Hd(A|0,B|0,23)|0;x=E^(x|C);E=g+576|0;s=c[E>>2]|0;E=c[E+4>>2]|0;m=Dd(p|0,m|0,587496836,685471733)|0;E=Dd(m|0,C|0,s|0,E|0)|0;x=Dd(E|0,C|0,(H|o)^(u|r)^(v|y)|0,x|0)|0;x=Dd(x|0,C|0,(l^f)&A^l|0,(j^b)&B^j|0)|0;y=C;v=Gd(F|0,L|0,28)|0;r=C;u=Hd(F|0,L|0,36)|0;r=r|C;o=Gd(F|0,L|0,34)|0;H=C;E=Hd(F|0,L|0,30)|0;H=r^(H|C);r=Gd(F|0,L|0,39)|0;s=C;m=Hd(F|0,L|0,25)|0;s=Dd((J|D)&F|J&D|0,(G|M)&L|G&M|0,(v|u)^(o|E)^(r|m)|0,H^(s|C)|0)|0;H=C;K=Dd(I|0,K|0,x|0,y|0)|0;I=C;y=Dd(s|0,H|0,x|0,y|0)|0;x=C;H=Gd(K|0,I|0,14)|0;s=C;m=Hd(K|0,I|0,50)|0;s=s|C;r=Gd(K|0,I|0,18)|0;E=C;o=Hd(K|0,I|0,46)|0;E=s^(E|C);s=Gd(K|0,I|0,41)|0;u=C;v=Hd(K|0,I|0,23)|0;u=E^(u|C);E=g+584|0;p=c[E>>2]|0;E=c[E+4>>2]|0;j=Dd(l|0,j|0,1086792851,852142971)|0;E=Dd(j|0,C|0,p|0,E|0)|0;u=Dd(E|0,C|0,(H|m)^(r|o)^(s|v)|0,u|0)|0;u=Dd(u|0,C|0,(f^A)&K^f|0,(b^B)&I^b|0)|0;v=C;s=Gd(y|0,x|0,28)|0;o=C;r=Hd(y|0,x|0,36)|0;o=o|C;m=Gd(y|0,x|0,34)|0;H=C;E=Hd(y|0,x|0,30)|0;H=o^(H|C);o=Gd(y|0,x|0,39)|0;p=C;j=Hd(y|0,x|0,25)|0;p=Dd((D|F)&y|D&F|0,(M|L)&x|M&L|0,(s|r)^(m|E)^(o|j)|0,H^(p|C)|0)|0;H=C;G=Dd(J|0,G|0,u|0,v|0)|0;J=C;v=Dd(p|0,H|0,u|0,v|0)|0;u=C;H=Gd(G|0,J|0,14)|0;p=C;j=Hd(G|0,J|0,50)|0;p=p|C;o=Gd(G|0,J|0,18)|0;E=C;m=Hd(G|0,J|0,46)|0;E=p^(E|C);p=Gd(G|0,J|0,41)|0;r=C;s=Hd(G|0,J|0,23)|0;r=E^(r|C);E=g+592|0;l=c[E>>2]|0;E=c[E+4>>2]|0;b=Dd(f|0,b|0,365543100,1017036298)|0;E=Dd(b|0,C|0,l|0,E|0)|0;r=Dd(E|0,C|0,(H|j)^(o|m)^(p|s)|0,r|0)|0;r=Dd(r|0,C|0,(A^K)&G^A|0,(B^I)&J^B|0)|0;s=C;p=Gd(v|0,u|0,28)|0;m=C;o=Hd(v|0,u|0,36)|0;m=m|C;j=Gd(v|0,u|0,34)|0;H=C;E=Hd(v|0,u|0,30)|0;H=m^(H|C);m=Gd(v|0,u|0,39)|0;l=C;b=Hd(v|0,u|0,25)|0;l=Dd((F|y)&v|F&y|0,(L|x)&u|L&x|0,(p|o)^(j|E)^(m|b)|0,H^(l|C)|0)|0;H=C;M=Dd(D|0,M|0,r|0,s|0)|0;D=C;s=Dd(l|0,H|0,r|0,s|0)|0;r=C;H=Gd(M|0,D|0,14)|0;l=C;b=Hd(M|0,D|0,50)|0;l=l|C;m=Gd(M|0,D|0,18)|0;E=C;j=Hd(M|0,D|0,46)|0;E=l^(E|C);l=Gd(M|0,D|0,41)|0;o=C;p=Hd(M|0,D|0,23)|0;o=E^(o|C);E=g+600|0;f=c[E>>2]|0;E=c[E+4>>2]|0;B=Dd(A|0,B|0,-1676669620,1126000580)|0;E=Dd(B|0,C|0,f|0,E|0)|0;o=Dd(E|0,C|0,(H|b)^(m|j)^(l|p)|0,o|0)|0;o=Dd(o|0,C|0,(K^G)&M^K|0,(I^J)&D^I|0)|0;p=C;l=Gd(s|0,r|0,28)|0;j=C;m=Hd(s|0,r|0,36)|0;j=j|C;b=Gd(s|0,r|0,34)|0;H=C;E=Hd(s|0,r|0,30)|0;H=j^(H|C);j=Gd(s|0,r|0,39)|0;f=C;B=Hd(s|0,r|0,25)|0;f=Dd((y|v)&s|y&v|0,(x|u)&r|x&u|0,(l|m)^(b|E)^(j|B)|0,H^(f|C)|0)|0;H=C;L=Dd(F|0,L|0,o|0,p|0)|0;F=C;p=Dd(f|0,H|0,o|0,p|0)|0;o=C;H=Gd(L|0,F|0,14)|0;f=C;B=Hd(L|0,F|0,50)|0;f=f|C;j=Gd(L|0,F|0,18)|0;E=C;b=Hd(L|0,F|0,46)|0;E=f^(E|C);f=Gd(L|0,F|0,41)|0;m=C;l=Hd(L|0,F|0,23)|0;m=E^(m|C);E=g+608|0;A=c[E>>2]|0;E=c[E+4>>2]|0;I=Dd(K|0,I|0,-885112138,1288033470)|0;E=Dd(I|0,C|0,A|0,E|0)|0;m=Dd(E|0,C|0,(H|B)^(j|b)^(f|l)|0,m|0)|0;m=Dd(m|0,C|0,(G^M)&L^G|0,(J^D)&F^J|0)|0;l=C;f=Gd(p|0,o|0,28)|0;b=C;j=Hd(p|0,o|0,36)|0;b=b|C;B=Gd(p|0,o|0,34)|0;H=C;E=Hd(p|0,o|0,30)|0;H=b^(H|C);b=Gd(p|0,o|0,39)|0;A=C;I=Hd(p|0,o|0,25)|0;A=Dd((v|s)&p|v&s|0,(u|r)&o|u&r|0,(f|j)^(B|E)^(b|I)|0,H^(A|C)|0)|0;H=C;x=Dd(y|0,x|0,m|0,l|0)|0;y=C;l=Dd(A|0,H|0,m|0,l|0)|0;m=C;H=Gd(x|0,y|0,14)|0;A=C;I=Hd(x|0,y|0,50)|0;A=A|C;b=Gd(x|0,y|0,18)|0;E=C;B=Hd(x|0,y|0,46)|0;E=A^(E|C);A=Gd(x|0,y|0,41)|0;j=C;f=Hd(x|0,y|0,23)|0;j=E^(j|C);E=g+616|0;K=c[E>>2]|0;E=c[E+4>>2]|0;J=Dd(G|0,J|0,-60457430,1501505948)|0;E=Dd(J|0,C|0,K|0,E|0)|0;j=Dd(E|0,C|0,(H|I)^(b|B)^(A|f)|0,j|0)|0;j=Dd(j|0,C|0,(M^L)&x^M|0,(D^F)&y^D|0)|0;f=C;A=Gd(l|0,m|0,28)|0;B=C;b=Hd(l|0,m|0,36)|0;B=B|C;I=Gd(l|0,m|0,34)|0;H=C;E=Hd(l|0,m|0,30)|0;H=B^(H|C);B=Gd(l|0,m|0,39)|0;K=C;J=Hd(l|0,m|0,25)|0;K=Dd((s|p)&l|s&p|0,(r|o)&m|r&o|0,(A|b)^(I|E)^(B|J)|0,H^(K|C)|0)|0;H=C;u=Dd(v|0,u|0,j|0,f|0)|0;v=C;f=Dd(K|0,H|0,j|0,f|0)|0;j=C;H=Gd(u|0,v|0,14)|0;K=C;J=Hd(u|0,v|0,50)|0;K=K|C;B=Gd(u|0,v|0,18)|0;E=C;I=Hd(u|0,v|0,46)|0;E=K^(E|C);K=Gd(u|0,v|0,41)|0;b=C;A=Hd(u|0,v|0,23)|0;b=E^(b|C);E=g+624|0;G=c[E>>2]|0;E=c[E+4>>2]|0;D=Dd(M|0,D|0,987167468,1607167915)|0;E=Dd(D|0,C|0,G|0,E|0)|0;b=Dd(E|0,C|0,(H|J)^(B|I)^(K|A)|0,b|0)|0;b=Dd(b|0,C|0,(L^x)&u^L|0,(F^y)&v^F|0)|0;A=C;K=Gd(f|0,j|0,28)|0;I=C;B=Hd(f|0,j|0,36)|0;I=I|C;J=Gd(f|0,j|0,34)|0;H=C;E=Hd(f|0,j|0,30)|0;H=I^(H|C);I=Gd(f|0,j|0,39)|0;G=C;D=Hd(f|0,j|0,25)|0;G=Dd((p|l)&f|p&l|0,(o|m)&j|o&m|0,(K|B)^(J|E)^(I|D)|0,H^(G|C)|0)|0;H=C;r=Dd(s|0,r|0,b|0,A|0)|0;s=C;A=Dd(G|0,H|0,b|0,A|0)|0;b=C;H=Gd(r|0,s|0,14)|0;G=C;D=Hd(r|0,s|0,50)|0;G=G|C;I=Gd(r|0,s|0,18)|0;E=C;J=Hd(r|0,s|0,46)|0;E=G^(E|C);G=Gd(r|0,s|0,41)|0;B=C;K=Hd(r|0,s|0,23)|0;B=E^(B|C);g=g+632|0;E=c[g>>2]|0;g=c[g+4>>2]|0;F=Dd(L|0,F|0,1246189591,1816402316)|0;g=Dd(F|0,C|0,E|0,g|0)|0;g=Dd(g|0,C|0,(H|D)^(I|J)^(G|K)|0,B|0)|0;g=Dd(g|0,C|0,(x^u)&r^x|0,(y^v)&s^y|0)|0;B=C;K=Gd(A|0,b|0,28)|0;G=C;J=Hd(A|0,b|0,36)|0;G=G|C;I=Gd(A|0,b|0,34)|0;D=C;H=Hd(A|0,b|0,30)|0;D=G^(D|C);G=Gd(A|0,b|0,39)|0;E=C;F=Hd(A|0,b|0,25)|0;E=Dd((l|f)&A|l&f|0,(m|j)&b|m&j|0,(K|J)^(I|H)^(G|F)|0,D^(E|C)|0)|0;D=C;o=Dd(p|0,o|0,g|0,B|0)|0;p=C;B=Dd(E|0,D|0,g|0,B|0)|0;g=a;B=Dd(c[g>>2]|0,c[g+4>>2]|0,B|0,C|0)|0;g=a;c[g>>2]=B;c[g+4>>2]=C;g=e;g=Dd(c[g>>2]|0,c[g+4>>2]|0,A|0,b|0)|0;a=e;c[a>>2]=g;c[a+4>>2]=C;a=k;j=Dd(c[a>>2]|0,c[a+4>>2]|0,f|0,j|0)|0;c[k>>2]=j;c[k+4>>2]=C;k=n;m=Dd(c[k>>2]|0,c[k+4>>2]|0,l|0,m|0)|0;c[n>>2]=m;c[n+4>>2]=C;n=q;p=Dd(c[n>>2]|0,c[n+4>>2]|0,o|0,p|0)|0;c[q>>2]=p;c[q+4>>2]=C;q=t;s=Dd(c[q>>2]|0,c[q+4>>2]|0,r|0,s|0)|0;c[t>>2]=s;c[t+4>>2]=C;t=w;v=Dd(c[t>>2]|0,c[t+4>>2]|0,u|0,v|0)|0;c[w>>2]=v;c[w+4>>2]=C;w=z;y=Dd(c[w>>2]|0,c[w+4>>2]|0,x|0,y|0)|0;c[z>>2]=y;c[z+4>>2]=C;i=h;return}function Ib(){return 144}function Jb(){return 16}function Kb(){return 32}function Lb(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0;f=i;g=i=i+63&-64;i=i+144|0;Ub(g,e);Tb(g,b,c,d);Rb(g,a);i=f;return 0}function Mb(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;return Qb(a,b,c,d,e)|0}function Nb(a,b){a=a|0;b=b|0;Ub(a,b);return 0}function Ob(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;Tb(a,b,c,d);return 0}function Pb(a,b){a=a|0;b=b|0;Rb(a,b);return 0}function Qb(b,c,d,e,f){b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0;h=i;g=i=i+63&-64;i=i+160|0;j=g;g=g+144|0;Ub(j,f);Tb(j,c,d,e);Rb(j,g);i=h;return ((((a[g+1>>0]^a[b+1>>0]|a[g>>0]^a[b>>0]|a[g+2>>0]^a[b+2>>0]|a[g+3>>0]^a[b+3>>0]|a[g+4>>0]^a[b+4>>0]|a[g+5>>0]^a[b+5>>0]|a[g+6>>0]^a[b+6>>0]|a[g+7>>0]^a[b+7>>0]|a[g+8>>0]^a[b+8>>0]|a[g+9>>0]^a[b+9>>0]|a[g+10>>0]^a[b+10>>0]|a[g+11>>0]^a[b+11>>0]|a[g+12>>0]^a[b+12>>0]|a[g+13>>0]^a[b+13>>0]|a[g+14>>0]^a[b+14>>0]|a[g+15>>0]^a[b+15>>0])&255)+511|0)>>>8&1)+-1|0}function Rb(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;h=b+56|0;g=c[h>>2]|0;h=c[h+4>>2]|0;if(!((g|0)==0&(h|0)==0)){e=b+64|0;a[e+g>>0]=1;f=Dd(g|0,h|0,1,0)|0;i=C;if(i>>>0<0|(i|0)==0&f>>>0<16){i=cd(14,0,g|0,h|0)|0;fd(b+(f+64)|0,0,i+1|0)|0}a[b+80>>0]=1;Sb(b,e,16,0)}i=c[b+24>>2]|0;p=(c[b+28>>2]|0)+(i>>>26)|0;e=p&67108863;n=(p>>>26)+(c[b+32>>2]|0)|0;m=n&67108863;f=(n>>>26)+(c[b+36>>2]|0)|0;h=((f>>>26)*5|0)+(c[b+20>>2]|0)|0;g=h&67108863;i=(h>>>26)+(i&67108863)|0;r=((g+5|0)>>>26)+i|0;q=r>>>26;o=(q+e|0)>>>26;k=(f|-67108864)+((o+m|0)>>>26)|0;l=(k>>>31)+-1|0;j=k>>31;i=r&67108863&l|j&i;e=q+p&67108863&l|j&e;m=o+n&67108863&l|j&m;g=Dd(h+5&67108863&l|j&g|i<<26|0,0,c[b+40>>2]|0,0)|0;h=C;i=Dd(i>>>6|e<<20|0,0,c[b+44>>2]|0,0)|0;h=Dd(i|0,C|0,h|0,0)|0;i=C;e=Dd(e>>>12|m<<14|0,0,c[b+48>>2]|0,0)|0;i=Dd(e|0,C|0,i|0,0)|0;e=C;f=Dd(m>>>18|(l&k|j&f)<<8|0,0,c[b+52>>2]|0,0)|0;e=Dd(f|0,C|0,e|0,0)|0;a[d>>0]=g;a[d+1>>0]=g>>>8;a[d+2>>0]=g>>>16;a[d+3>>0]=g>>>24;a[d+4>>0]=h;a[d+5>>0]=h>>>8;a[d+6>>0]=h>>>16;a[d+7>>0]=h>>>24;a[d+8>>0]=i;a[d+9>>0]=i>>>8;a[d+10>>0]=i>>>16;a[d+11>>0]=i>>>24;a[d+12>>0]=e;a[d+13>>0]=e>>>8;a[d+14>>0]=e>>>16;a[d+15>>0]=e>>>24;e=b+88|0;do{a[b>>0]=0;b=b+1|0}while((b|0)<(e|0));return}function sb(b,e,f,g){b="b|0;e=e|0;f=f|0;g=g|0;var" h="0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0;s=(a[b+80">>0]|0)!=0?0:16777216;t=c[b+4>>2]|0;u=c[b+8>>2]|0;m=c[b+12>>2]|0;n=c[b+16>>2]|0;v=b+20|0;l=c[v>>2]|0;w=b+24|0;k=c[w>>2]|0;x=b+28|0;j=c[x>>2]|0;y=b+32|0;i=c[y>>2]|0;z=b+36|0;h=c[z>>2]|0;if(!(g>>>0>0|(g|0)==0&f>>>0>15)){q=l;r=k;s=j;t=i;u=h;c[v>>2]=q;c[w>>2]=r;c[x>>2]=s;c[y>>2]=t;c[z>>2]=u;return}o=n*5|0;p=m*5|0;q=u*5|0;r=t*5|0;b=c[b>>2]|0;while(1){J=d[e+3>>0]|0;B=(d[e+1>>0]<<8|d[e>>0]|d[e+2>>0]<<16|j<<24&50331648)+l|0;h=d[e+6>>0]|0;J=((d[e+4>>0]<<8|j|d[e+5>>0]<<16|h<<24)>>>2&67108863)+k|0;G=d[e+9>>0]|0;H=((d[e+7>>0]<<8|h|d[e+8>>0]<<16|g<<24)>>>4&67108863)+j|0;G=((d[e+10>>0]<<8|g|d[e+11>>0]<<16|d[e+12>>0]<<24)>>>6)+i|0;l=(d[e+13>>0]|s|d[e+14>>0]<<8|d[e+15>>0]<<16)+h|0;k=od(b|0,0,b|0,0)|0;j=c;a=od(j|0,0,o|0,0)|0;j=dd(a|0,c|0,k|0,j|0)|0;k=c;a=od(h|0,0,p|0,0)|0;a=dd(j|0,k|0,a|0,c|0)|0;k=c;j=od(g|0,0,q|0,0)|0;j=dd(a|0,k|0,j|0,c|0)|0;k=c;a=od(l|0,0,r|0,0)|0;a=dd(j|0,k|0,a|0,c|0)|0;k=c;j=od(b|0,0,t|0,0)|0;i=c;f=od(j|0,0,b|0,0)|0;i=dd(f|0,c|0,j|0,i|0)|0;j=c;f=od(h|0,0,o|0,0)|0;f=dd(i|0,j|0,f|0,c|0)|0;j=c;i=od(g|0,0,p|0,0)|0;i=dd(f|0,j|0,i|0,c|0)|0;j=c;f=od(l|0,0,q|0,0)|0;f=dd(i|0,j|0,f|0,c|0)|0;j=c;i=od(b|0,0,u|0,0)|0;h=c;e=od(j|0,0,t|0,0)|0;h=dd(e|0,c|0,i|0,h|0)|0;i=c;e=od(h|0,0,b|0,0)|0;e=dd(h|0,i|0,e|0,c|0)|0;i=c;h=od(g|0,0,o|0,0)|0;h=dd(e|0,i|0,h|0,c|0)|0;i=c;e=od(l|0,0,p|0,0)|0;e=dd(h|0,i|0,e|0,c|0)|0;i=c;h=od(b|0,0,m|0,0)|0;i=c;d=od(j|0,0,u|0,0)|0;i=dd(d|0,c|0,h|0,i|0)|0;h=c;d=od(h|0,0,t|0,0)|0;d=dd(i|0,h|0,d|0,c|0)|0;h=c;i=od(g|0,0,b|0,0)|0;i=dd(d|0,h|0,i|0,c|0)|0;h=c;d=od(l|0,0,o|0,0)|0;d=dd(i|0,h|0,d|0,c|0)|0;h=c;b=od(b|0,0,n|0,0)|0;i=c;j=od(j|0,0,m|0,0)|0;i=dd(j|0,c|0,b|0,i|0)|0;b=c;h=od(h|0,0,u|0,0)|0;h=dd(i|0,b|0,h|0,c|0)|0;b=c;g=od(g|0,0,t|0,0)|0;g=dd(h|0,b|0,g|0,c|0)|0;b=c;l=od(l|0,0,b|0,0)|0;l=dd(g|0,b|0,l|0,c|0)|0;b=c;k=gd(a|0,k|0,26)|0;k=dd(f|0,j|0,k|0,0)|0;j=gd(k|0,c|0,26)|0;j=dd(e|0,i|0,j|0,0)|0;i=gd(j|0,c|0,26)|0;j=j&67108863;i=dd(d|0,h|0,i|0,0)|0;h=gd(i|0,c|0,26)|0;i=i&67108863;h=dd(l|0,b|0,h|0,0)|0;b=gd(h|0,c|0,26)|0;h=h&67108863;b=b*5|0;l=b+a&67108863;k=((b+(a&67108863)|0)>>>26)+(k&67108863)|0;f=Dd(f|0,g|0,-16,-1)|0;g=C;if(!(g>>>0>0|(g|0)==0&f>>>0>15))break;else e=e+16|0}c[v>>2]=l;c[w>>2]=k;c[x>>2]=j;c[y>>2]=i;c[z>>2]=h;return}function Tb(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;n=b+56|0;g=n;h=c[g>>2]|0;g=c[g+4>>2]|0;do if(!((h|0)==0&(g|0)==0)){l=Cd(16,0,h|0,g|0)|0;m=C;k=m>>>0>f>>>0|(m|0)==(f|0)&l>>>0>e>>>0;l=k?e:l;m=k?f:m;if(!((l|0)==0&(m|0)==0)){j=b+64|0;k=0;i=0;do{o=a[d+k>>0]|0;g=Dd(h|0,g|0,k|0,i|0)|0;a[j+g>>0]=o;k=Dd(k|0,i|0,1,0)|0;i=C;g=n;h=c[g>>2]|0;g=c[g+4>>2]|0}while(i>>>0>>0|(i|0)==(m|0)&k>>>0>>0)}o=Dd(h|0,g|0,l|0,m|0)|0;k=C;j=n;c[j>>2]=o;c[j+4>>2]=k;if(k>>>0<0|(k|0)==0&o>>>0<16)return;else{e=cd(e|0,f|0,l|0,m|0)|0;f=c;sb(b,b+64|0,16,0);o=n;c[o>>2]=0;c[o+4>>2]=0;d=d+l|0;break}}while(0);if(f>>>0>0|(f|0)==0&e>>>0>15){i=e&-16;Sb(b,d,i,f);e=Cd(e|0,f|0,i|0,f|0)|0;d=d+i|0;i=C}else i=f;if((e|0)==0&(i|0)==0)return;f=b+64|0;g=0;h=0;do{b=a[d+g>>0]|0;o=n;o=Dd(c[o>>2]|0,c[o+4>>2]|0,g|0,h|0)|0;a[f+o>>0]=b;g=Dd(g|0,h|0,1,0)|0;h=C}while(h>>>0>>0|(h|0)==(i|0)&g>>>0>>0);b=n;b=Dd(c[b>>2]|0,c[b+4>>2]|0,e|0,i|0)|0;o=n;c[o>>2]=b;c[o+4>>2]=C;return}function Ub(b,e){b=b|0;e=e|0;var f=0,g=0;f=e+3|0;c[b>>2]=(d[e+1>>0]|0)<<8|(d[e>>0]|0)|(d[e+2>>0]|0)<<16|(d[f>>0]|0)<<24&50331648;g=e+6|0;c[b+4>>2]=((d[e+4>>0]|0)<<8|(d[f>>0]|0)|(d[e+5>>0]|0)<<16|(d[g>>0]|0)<<24)>>>2&67108611;f=e+9|0;c[b+8>>2]=((d[e+7>>0]|0)<<8|(d[g>>0]|0)|(d[e+8>>0]|0)<<16|(d[f>>0]|0)<<24)>>>4&67092735;c[b+12>>2]=((d[e+10>>0]|0)<<8|(d[f>>0]|0)|(d[e+11>>0]|0)<<16|(d[e+12>>0]|0)<<24)>>>6&66076671;c[b+16>>2]=(d[e+14>>0]|0)<<8|(d[e+13>>0]|0)|(d[e+15>>0]|0)<<16&983040;f=b+20|0;c[f>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;c[f+12>>2]=0;c[f+16>>2]=0;c[b+40>>2]=(d[e+17>>0]|0)<<8|(d[e+16>>0]|0)|(d[e+18>>0]|0)<<16|(d[e+19>>0]|0)<<24;c[b+44>>2]=(d[e+21>>0]|0)<<8|(d[e+20>>0]|0)|(d[e+22>>0]|0)<<16|(d[e+23>>0]|0)<<24;c[b+48>>2]=(d[e+25>>0]|0)<<8|(d[e+24>>0]|0)|(d[e+26>>0]|0)<<16|(d[e+27>>0]|0)<<24;c[b+52>>2]=(d[e+29>>0]|0)<<8|(d[e+28>>0]|0)|(d[e+30>>0]|0)<<16|(d[e+31>>0]|0)<<24;e=b+56|0;c[e>>2]=0;c[e+4>>2]=0;a[b+80>>0]=0;return}function Vb(b,e,f,g,h){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;w=i;t=i=i+63&-64;i=i+48|0;j=t+8|0;u=t+4|0;if((a[g>>0]|0)!=36){h=0;i=w;return h|0}if((a[g+1>>0]|0)!=55){h=0;i=w;return h|0}if((a[g+2>>0]|0)!=36){h=0;i=w;return h|0}o=a[g+3>>0]|0;n=o&255;a:do if(1){l=65;k=34881;do{if((a[k>>0]|0)==o<<24>>24)break a;k=k+1|0;l=l+-1|0;m=(l|0)!=0}while(m&(k&3|0)!=0);if(!m){h=0;i=w;return h|0}}else{l=65;k=34881}while(0);b:do if((a[k>>0]|0)!=o<<24>>24){m=_(n,16843009)|0;c:do if(l>>>0>3)while(1){s=c[k>>2]^m;if((s&-2139062144^-2139062144)&s+-16843009)break c;k=k+4|0;l=l+-4|0;if(l>>>0<=3){v=12;break}}else v="12;while(0);if((v|0)==12)if(!l){h=0;i=w;return" h|0}while(1){if((a[k="">>0]|0)==o<<24>>24)break b;l=l+-1|0;if(!l){j=0;break}else k=k+1|0}i=w;return j|0}while(0);if((k|0)==0|(l|0)==0){h=0;i=w;return h|0}r=Hd(1,0,k-34881|0)|0;s=C;k=Xb(u,g+4|0)|0;if(!k){h=0;i=w;return h|0}q=Xb(t,k)|0;if(!q){h=0;i=w;return h|0}o=q;p=o-g|0;n=(o&3|0)==0;d:do if(n){k=q;v=22}else{l=q;k=o;while(1){if(!(a[l>>0]|0))break d;l=l+1|0;k=l;if(!(k&3)){k=l;v=22;break}}}while(0);if((v|0)==22){while(1){l=c[k>>2]|0;if(!((l&-2139062144^-2139062144)&l+-16843009))k=k+4|0;else break}if((l&255)<<24>>24)do k=k+1|0;while((a[k>>0]|0)!=0)}l=k-o+1|0;while(1){k=l+-1|0;if(!l){v=32;break}m=q+k|0;if((a[m>>0]|0)==36){v=30;break}else l=k}if((v|0)==30)if(!m)v=32;else l=l+-1|0;if((v|0)==32){e:do if(n){k=q;v=35}else{k=q;l=o;while(1){if(!(a[k>>0]|0)){k=l;break e}k=k+1|0;l=k;if(!(l&3)){v=35;break}}}while(0);if((v|0)==35){while(1){l=c[k>>2]|0;if(!((l&-2139062144^-2139062144)&l+-16843009))k=k+4|0;else break}if((l&255)<<24>>24)do k=k+1|0;while((a[k>>0]|0)!=0)}l=k-o|0}k=l+p|0;p=k+45|0;if(p>>>0>102|p>>>0>>0){h=0;i=w;return h|0}if(hc(b,e,f,q,l,r,s,c[u>>2]|0,c[t>>2]|0,j,32)|0){h=0;i=w;return h|0}Id(h|0,g|0,k|0)|0;s=h+k|0;r=s+1|0;a[s>>0]=36;s=r;r=h+102-r|0;k=0;f:while(1){if(k>>>0<32){p=0;q=k;k=0}else break;do{g="q;q=q+1|0;k=d[j+g">>0]<>>0<32&p>>>0<24);if(!p)k=s;else{l=k;m=r;n=s;o=0;while(1){if(!m){v=50;break f}k="n+1|0;a[n">>0]=a[34881+(l&63)>>0]|0;o=o+6|0;if(o>>>0>=p>>>0)break;else{l=l>>>6;m=m+-1|0;n=k}}}g=(k|0)==0;r=(g?0:s-k|0)+r|0;if(g){v=50;break}else{s=k;k=q}}if((v|0)==50){k=j+32|0;do{a[j>>0]=0;j=j+1|0}while((j|0)<(k|0));h=0;i=w;return h|0}k="j+32|0;do{a[j">>0]=0;j=j+1|0}while((j|0)<(k|0));if(!((s|0)!=0&s>>>0<(h+102|0)>>>0)){h=0;i=w;return h|0}a[s>>0]=0;i=w;return h|0}function Wb(a,b,d,e,f,g,h,j,k,l){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;var m=0,n=0;m=i;n=i=i+63&-64;i=i+16|0;c[n+4>>2]=0;c[n>>2]=0;c[n+8>>2]=0;f=hc(n,a,b,d,e,f,g,h,j,k,l)|0;g=c[n>>2]|0;if(!g){i=m;return f|0}zd(g);i=m;return f|0}function Xb(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;i=a[d>>0]|0;h=i&255;a:do if(1){e=65;f=34881;do{if((a[f>>0]|0)==i<<24>>24)break a;f=f+1|0;e=e+-1|0;g=(e|0)!=0}while(g&(f&3|0)!=0);if(!g){d=0;n=0;c[b>>2]=n;return d|0}}else{e=65;f=34881}while(0);b:do if((a[f>>0]|0)!=i<<24>>24){g=_(h,16843009)|0;c:do if(e>>>0>3)while(1){m=c[f>>2]^g;if((m&-2139062144^-2139062144)&m+-16843009)break c;f=f+4|0;e=e+-4|0;if(e>>>0<=3){n=9;break}}else n="9;while(0);if((n|0)==9)if(!e){d=0;n=0;c[b">>2]=n;return d|0}while(1){if((a[f>>0]|0)==i<<24>>24)break b;e=e+-1|0;if(!e){e=0;f=0;break}else f=f+1|0}c[b>>2]=f;return e|0}while(0);if((f|0)==0|(e|0)==0){d=0;n=0;c[b>>2]=n;return d|0}j=a[d+1>>0]|0;i=j&255;d:do if(1){e=65;g=34881;do{if((a[g>>0]|0)==j<<24>>24)break d;g=g+1|0;e=e+-1|0;h=(e|0)!=0}while(h&(g&3|0)!=0);if(!h){d=0;n=0;c[b>>2]=n;return d|0}}else{e=65;g=34881}while(0);e:do if((a[g>>0]|0)!=j<<24>>24){h=_(i,16843009)|0;f:do if(e>>>0>3)while(1){m=c[g>>2]^h;if((m&-2139062144^-2139062144)&m+-16843009)break f;g=g+4|0;e=e+-4|0;if(e>>>0<=3){n=22;break}}else n="22;while(0);if((n|0)==22)if(!e){d=0;n=0;c[b">>2]=n;return d|0}while(1){if((a[g>>0]|0)==j<<24>>24)break e;e=e+-1|0;if(!e){e=0;f=0;break}else g=g+1|0}c[b>>2]=f;return e|0}while(0);if((g|0)==0|(e|0)==0){d=0;n=0;c[b>>2]=n;return d|0}k=a[d+2>>0]|0;j=k&255;g:do if(1){e=65;h=34881;do{if((a[h>>0]|0)==k<<24>>24)break g;h=h+1|0;e=e+-1|0;i=(e|0)!=0}while(i&(h&3|0)!=0);if(!i){d=0;n=0;c[b>>2]=n;return d|0}}else{e=65;h=34881}while(0);h:do if((a[h>>0]|0)!=k<<24>>24){i=_(j,16843009)|0;i:do if(e>>>0>3)while(1){m=c[h>>2]^i;if((m&-2139062144^-2139062144)&m+-16843009)break i;h=h+4|0;e=e+-4|0;if(e>>>0<=3){n=36;break}}else n="36;while(0);if((n|0)==36)if(!e){d=0;n=0;c[b">>2]=n;return d|0}while(1){if((a[h>>0]|0)==k<<24>>24)break h;e=e+-1|0;if(!e){e=0;f=0;break}else h=h+1|0}c[b>>2]=f;return e|0}while(0);if((h|0)==0|(e|0)==0){d=0;n=0;c[b>>2]=n;return d|0}l=a[d+3>>0]|0;k=l&255;j:do if(1){e=65;i=34881;do{if((a[i>>0]|0)==l<<24>>24)break j;i=i+1|0;e=e+-1|0;j=(e|0)!=0}while(j&(i&3|0)!=0);if(!j){d=0;n=0;c[b>>2]=n;return d|0}}else{e=65;i=34881}while(0);k:do if((a[i>>0]|0)==l<<24>>24)m=i;else{j=_(k,16843009)|0;l:do if(e>>>0>3)while(1){m=c[i>>2]^j;if((m&-2139062144^-2139062144)&m+-16843009)break l;i=i+4|0;e=e+-4|0;if(e>>>0<=3){n=49;break}}else n="49;while(0);if((n|0)==49)if(!e){d=0;n=0;c[b">>2]=n;return d|0}while(1){if((a[i>>0]|0)==l<<24>>24){m=i;break k}e=e+-1|0;if(!e){e=0;f=0;break}else i=i+1|0}c[b>>2]=f;return e|0}while(0);if((m|0)==0|(e|0)==0){d=0;n=0;c[b>>2]=n;return d|0}l=a[d+4>>0]|0;k=l&255;m:do if(1){i=65;e=34881;do{if((a[e>>0]|0)==l<<24>>24)break m;e=e+1|0;i=i+-1|0;j=(i|0)!=0}while(j&(e&3|0)!=0);if(!j){d=0;n=0;c[b>>2]=n;return d|0}}else{i=65;e=34881}while(0);n:do if((a[e>>0]|0)!=l<<24>>24){j=_(k,16843009)|0;o:do if(i>>>0>3)while(1){k=c[e>>2]^j;if((k&-2139062144^-2139062144)&k+-16843009)break o;e=e+4|0;i=i+-4|0;if(i>>>0<=3){n=62;break}}else n="62;while(0);if((n|0)==62)if(!i){d=0;n=0;c[b">>2]=n;return d|0}while(1){if((a[e>>0]|0)==l<<24>>24)break n;i=i+-1|0;if(!i){e=0;f=0;break}else e=e+1|0}c[b>>2]=f;return e|0}while(0);if((e|0)==0|(i|0)==0){d=0;n=0;c[b>>2]=n;return d|0}d=d+5|0;n=e-34881<<24|(m-34881<<18|(h-34881<<12|(g-34881<<6|f-34881)));c[b>>2]=n;return d|0}function Yb(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;A=i;w=i=i+63&-64;i=i+560|0;r=w+488|0;z=w+456|0;v=w+208|0;x=w;y=w+416|0;w=w+424|0;n=v+32|0;if(d>>>0<=64){p=n;c[p>>2]=0;c[p+4>>2]=0;c[v>>2]=c[18];c[v+4>>2]=c[19];c[v+8>>2]=c[20];c[v+12>>2]=c[21];c[v+16>>2]=c[22];c[v+20>>2]=c[23];c[v+24>>2]=c[24];c[v+28>>2]=c[25];p=r;q=p+64|0;do{a[p>>0]=54;p=p+1|0}while((p|0)<(q|0));l=(d|0)==0;if(!l){j=d;k=n;a[r>>0]=a[b>>0]^54;if((j|0)==1)d=j;else{d=j;m=8}}else k=n}else{c[v>>2]=c[18];c[v+4>>2]=c[19];c[v+8>>2]=c[20];c[v+12>>2]=c[21];c[v+16>>2]=c[22];c[v+20>>2]=c[23];c[v+24>>2]=c[24];c[v+28>>2]=c[25];p=Hd(d|0,0,3)|0;l=n;c[l>>2]=p;c[l+4>>2]=C;l=v+40|0;p=l;m=b;q=p+64|0;do{a[p>>0]=a[m>>0]|0;p=p+1|0;m=m+1|0}while((p|0)<(q|0));eb(v,l);j=b+64|0;k=dd(d|0,0,-64,-1)|0;b=c;if(b>>>0>0|(b|0)==0&k>>>0>63){do{Eb(v,j);j=j+64|0;k=Dd(k|0,b|0,-64,-1)|0;b=C}while(b>>>0>0|(b|0)==0&k>>>0>63);b=k}else b=k;Id(l|0,j|0,b|0)|0;Db(v,z);p=n;c[p>>2]=0;c[p+4>>2]=0;c[v>>2]=c[18];c[v+4>>2]=c[19];c[v+8>>2]=c[20];c[v+12>>2]=c[21];c[v+16>>2]=c[22];c[v+20>>2]=c[23];c[v+24>>2]=c[24];c[v+28>>2]=c[25];p=r;q=p+64|0;do{a[p>>0]=54;p=p+1|0}while((p|0)<(q|0));a[r>>0]=a[z>>0]^54;d=32;b=z;k=n;l=0;m=8}if((m|0)==8){j=1;do{u=r+j|0;a[u>>0]=a[u>>0]^a[b+j>>0];j=j+1|0}while((j|0)!=(d|0))}o=k;c[o>>2]=512;c[o+4>>2]=0;o=v+40|0;p=o;m=r;q=p+64|0;do{a[p>>0]=a[m>>0]|0;p=p+1|0;m=m+1|0}while((p|0)<(q|0));eb(v,o);n=v+104|0;m=v+136|0;p=m;c[p>>2]=0;c[p+4>>2]=0;c[n>>2]=c[18];c[n+4>>2]=c[19];c[n+8>>2]=c[20];c[n+12>>2]=c[21];c[n+16>>2]=c[22];c[n+20>>2]=c[23];c[n+24>>2]=c[24];c[n+28>>2]=c[25];p=r;q=p+64|0;do{a[p>>0]=92;p=p+1|0}while((p|0)<(q|0));if(!l?(a[r>>0]=a[b>>0]^92,(d|0)!=1):0){j=1;do{u=r+j|0;a[u>>0]=a[u>>0]^a[b+j>>0];j=j+1|0}while((j|0)!=(d|0))}j=m;c[j>>2]=512;c[j+4>>2]=0;j=v+144|0;p=j;m=r;q=p+64|0;do{a[p>>0]=a[m>>0]|0;p=p+1|0;m=m+1|0}while((p|0)<(q|0));eb(n,j);do if(f){b="k;t=c[b">>2]|0;b=c[b+4>>2]|0;j=Gd(t|0,b|0,3)|0;j=j&63;u=Hd(f|0,0,3)|0;u=Dd(t|0,b|0,u|0,C|0)|0;b=k;c[b>>2]=u;c[b+4>>2]=C;b=64-j|0;j=v+40+j|0;if(b>>>0>f>>>0){Id(j|0,e|0,f|0)|0;break}Id(j|0,e|0,b|0)|0;Eb(v,o);j=e+b|0;k=Cd(f|0,0,b|0,0)|0;b=C;if(b>>>0>0|(b|0)==0&k>>>0>63){do{Eb(v,j);j=j+64|0;k=Dd(k|0,b|0,-64,-1)|0;b=C}while(b>>>0>0|(b|0)==0&k>>>0>63);b=k}else b=k;Id(o|0,j|0,b|0)|0}while(0);if(!h){i=A;return}l=y+3|0;d=y+2|0;n=y+1|0;o=x+32|0;r=x+104|0;e=x+136|0;f=x+144|0;s=x+40|0;t=0;u=0;do{u=u+1|0;a[l>>0]=u;a[d>>0]=u>>>8;a[n>>0]=u>>>16;a[y>>0]=u>>>24;Id(x|0,v|0,208)|0;q=o;b=c[q>>2]|0;q=c[q+4>>2]|0;j=Gd(b|0,q|0,3)|0;j=j&63;q=Dd(b|0,q|0,32,0)|0;b=o;c[b>>2]=q;c[b+4>>2]=C;b=64-j|0;j=x+40+j|0;if(b>>>0>4){q=c[y>>2]|0;a[j>>0]=q;a[j+1>>0]=q>>8;a[j+2>>0]=q>>16;a[j+3>>0]=q>>24}else{Id(j|0,y|0,b|0)|0;Eb(x,s);j=y+b|0;k=Cd(4,0,b|0,0)|0;b=C;if(b>>>0>0|(b|0)==0&k>>>0>63){do{Eb(x,j);j=j+64|0;k=Dd(k|0,b|0,-64,-1)|0;b=C}while(b>>>0>0|(b|0)==0&k>>>0>63);b=k}else b=k;Id(s|0,j|0,b|0)|0}Db(x,z);q=e;b=c[q>>2]|0;q=c[q+4>>2]|0;j=Gd(b|0,q|0,3)|0;j=j&63;q=Dd(b|0,q|0,256,0)|0;b=e;c[b>>2]=q;c[b+4>>2]=C;b=64-j|0;j=x+144+j|0;if(b>>>0>32){p=j;m=z;q=p+32|0;do{a[p>>0]=a[m>>0]|0;p=p+1|0;m=m+1|0}while((p|0)<(q|0))}else{id(j|0,z|0,b|0)|0;eb(r,f);j=z+b|0;k=cd(32,0,b|0,0)|0;b=c;if(b>>>0>0|(b|0)==0&k>>>0>63){do{Eb(r,j);j=j+64|0;k=Dd(k|0,b|0,-64,-1)|0;b=C}while(b>>>0>0|(b|0)==0&k>>>0>63);b=k}else b=k;Id(f|0,j|0,b|0)|0}Db(r,w);q=h-t|0;Id(g+t|0,w|0,(q>>>0>32?32:q)|0)|0;t=u<<5}while(t>>>0>>0);i=A;return}function Zb(){return 32}function _b(){return 102}function $b(){return 32984}function ac(){return 524288}function bc(){return 16777216}function cc(){return 33554432}function dc(){return 1073741824}function ec(a,b,d,e,f,g,h,j,k,l){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;var m=0,n=0,o=0,p=0;o=i;n=i=i+63&-64;i=i+16|0;Fd(a|0,0,b|0)|0;m=g|d;if(m>>>0>0|(m|0)==0&(f|b)>>>0>4294967295){if(!(c[7979]|0))d=31964;else d=c[(oa()|0)+60>>2]|0;c[d>>2]=27;n=-1;i=o;return n|0}g=k>>>0<0|(k|0)==0&j>>>0<32768;m=g?32768:j;k=g?0:k;a:do if(k="">>>0<0|(k|0)==0&m>>>0>>5>>>0){g=Gd(m|0,k|0,6)|0;j=C;k=1;while(1){m=Hd(1,0,k|0)|0;l=C;d=k+1|0;if(l>>>0>j>>>0|(l|0)==(j|0)&m>>>0>g>>>0){d=k;g=1;break a}if(d>>>0<63)k=d;else{g=1;break}}}else{g=l>>>11;j=1;while(1){l=Hd(1,0,j|0)|0;p=C;d=j+1|0;if(p>>>0>0|(p|0)==0&l>>>0>g>>>0){d=j;break}if(d>>>0<63)j=d;else break}g="Gd(m|0,k|0,2)|0;g=Gd(g|0,C|0,d|0)|0;p=C;m=p">>>0>0|(p|0)==0&g>>>0>1073741823;g=m?1073741823:g;g=g>>>3}while(0);d=Hd(1,0,d|0)|0;c[n+4>>2]=0;c[n>>2]=0;c[n+8>>2]=0;g=hc(n,e,f,h,32,d,C,8,g,a,b)|0;d=c[n>>2]|0;if(d)zd(d);p=g;i=o;return p|0}function fc(b,e,f,g,h,j,k){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;w=i;v=i=i+63&-64;i=i+112|0;t=v+72|0;u=v+12|0;l=b;m=l+102|0;do{a[l>>0]=0;l=l+1|0}while((l|0)<(m|0));if(g>>>0>0|(g|0)==0&f>>>0>4294967295){if(!(c[7979]|0))g=31964;else g=c[(oa()|0)+60>>2]|0;c[g>>2]=27;v=-1;i=w;return v|0}m=j>>>0<0|(j|0)==0&h>>>0<32768;n=m?32768:h;m=m?0:j;a:do if(m="">>>0<0|(m|0)==0&n>>>0>>5>>>0){h=Gd(n|0,m|0,6)|0;l=C;m=1;while(1){k=Hd(1,0,m|0)|0;n=C;g=m+1|0;if(n>>>0>l>>>0|(n|0)==(l|0)&k>>>0>h>>>0){g=m;h=1;break a}if(g>>>0<63)m=g;else{h=1;break}}}else{h=k>>>11;l=1;while(1){k=Hd(1,0,l|0)|0;j=C;g=l+1|0;if(j>>>0>0|(j|0)==0&k>>>0>h>>>0){g=l;break}if(g>>>0<63)l=g;else break}h="Gd(n|0,m|0,2)|0;h=Gd(h|0,C|0,g|0)|0;k=C;n=k">>>0>0|(k|0)==0&h>>>0>1073741823;h=n?1073741823:h;h=h>>>3}while(0);l=0;do{a[t+l>>0]=Ba(0)|0;l=l+1|0}while((l|0)!=32);b:do if((((((((g>>>0<=63?(k=hd(h|0,0,3)|0,n=c,!(n>>>0>0|(n|0)==0&k>>>0>1073741823)):0)?(a[u>>0]=36,a[u+1>>0]=55,a[u+2>>0]=36,a[u+3>>0]=a[34881+g>>0]|0,a[u+4>>0]=54,k=u+5|0,o=u+9|0,a[k>>0]=46,a[k+1>>0]=46,a[k+2>>0]=46,a[k+3>>0]=46,(o|0)!=0):0)?(p=o,r=u+58|0,(r|0)!=(p|0)):0)?(q=r-p|0,a[o>>0]=a[34881+(h&63)>>0]|0,(q|0)!=1):0)?(a[u+10>>0]=a[34881+(h>>>6&63)>>0]|0,(q|0)!=2):0)?(a[u+11>>0]=a[34881+(h>>>12&63)>>0]|0,(q|0)!=3):0)?(a[u+12>>0]=a[34881+(h>>>18&63)>>0]|0,(q|0)!=4):0)?(s=u+14|0,a[u+13>>0]=a[34881+(h>>>24)>>0]|0,(s|0)!=0):0){p=s;o=r-s|0;g=0;while(1){if(g>>>0<32){n=0;k=g;g=0}else break;do{s="k;k=k+1|0;g=(d[t+s">>0]|0)<>>0<32&n>>>0<24);if(!n)g=p;else{h=g;l=o;m=p;j=0;while(1){if(!l)break b;g="m+1|0;a[m">>0]=a[34881+(h&63)>>0]|0;j=j+6|0;if(j>>>0>=n>>>0)break;else{h=h>>>6;l=l+-1|0;m=g}}}s=(g|0)==0;o=(s?0:p-g|0)+o|0;if(s)break b;else{p=g;g=k}}if(p>>>0<(u+58|0)>>>0){a[p>>0]=0;l=v+4|0;c[l>>2]=0;c[v>>2]=0;m=v+8|0;c[m>>2]=0;g=(Vb(v,e,f,u,b)|0)==0;h=c[v>>2]|0;if(h)zd(h);c[l>>2]=0;c[v>>2]=0;c[m>>2]=0;if(!g){v=0;i=w;return v|0}if(!(c[7979]|0))g=31964;else g=c[(oa()|0)+60>>2]|0;c[g>>2]=22;v=-1;i=w;return v|0}}while(0);if(!(c[7979]|0))g=31964;else g=c[(oa()|0)+60>>2]|0;c[g>>2]=22;v=-1;i=w;return v|0}function gc(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0;m=i;l=i=i+63&-64;i=i+128|0;f=l+12|0;a:do if(b&3){g=102;h=b;do{if(!(a[h>>0]|0)){k=5;break a}h=h+1|0;g=g+-1|0;j=(g|0)!=0}while(j&(h&3|0)!=0);if(j)k=5;else g=0}else{g=102;h=b;k=5}while(0);b:do if((k|0)==5)if(a[h>>0]|0){c:do if(g>>>0>3)while(1){j=c[h>>2]|0;if((j&-2139062144^-2139062144)&j+-16843009)break;h=h+4|0;g=g+-4|0;if(g>>>0<=3){k=10;break c}}else="" k="10;while(0);if((k|0)==10)if(!g){g=0;break}while(1){if(!(a[h">>0]|0))break b;h=h+1|0;g=g+-1|0;if(!g){g=0;break}}}while(0);if((((g|0)!=0?h:0)|0)!=(b+101|0)){b=-1;i=m;return b|0}j=l+4|0;c[j>>2]=0;c[l>>2]=0;k=l+8|0;c[k>>2]=0;g=(Vb(l,d,e,b,f)|0)==0;h=c[l>>2]|0;if(h)zd(h);c[j>>2]=0;c[l>>2]=0;c[k>>2]=0;if(g){b=-1;i=m;return b|0}else{g=0;h=0}do{g=a[b+h>>0]^a[f+h>>0]|g;h=h+1|0}while((h|0)!=102);h=(((g&255)+511|0)>>>8&1)+-1|0;g=f+102|0;do{a[f>>0]=0;f=f+1|0}while((f|0)<(g|0));b=h;i=m;return b|0}function="" hc(b,e,f,g,h,i,j,k,l,m,n){b="b|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;var" o="0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0;J=Od(l|0,0,k|0,0)|0;I=C;if(I">>>0>0|(I|0)==0&J>>>0>1073741823){if(!(c[7979]|0))o=31964;else o=c[(oa()|0)+60>>2]|0;c[o>>2]=27;f=-1;return f|0}if(j>>>0>0|(j|0)==0&i>>>0>4294967295){if(!(c[7979]|0))o=31964;else o=c[(oa()|0)+60>>2]|0;c[o>>2]=27;f=-1;return f|0}G=Dd(i|0,j|0,-1,-1)|0;H=C;if(j>>>0<0|(j|0)==0&i>>>0<2|((g&i|0)!=0|(h&j|0)!=0)){if(!(c[7979]|0))o=31964;else o="c[(oa()|0)+60">>2]|0;c[o>>2]=22;f=-1;return f|0}if((k|0)==0|(l|0)==0){if(!(c[7979]|0))o=31964;else o=c[(oa()|0)+60>>2]|0;c[o>>2]=22;f=-1;return f|0}if(!(k>>>0>16777215?1:(33554431/(l>>>0)|0)>>>0>>0)?!(0>>0|(0==(j|0)?(33554431/(k>>>0)|0)>>>0>>0:0)):0){I=k<<7;j=_(i,l)|0;y=od(i|0,0,i|0,j|0)|0;o=y+j|0;if(o>>>0>>0){if(!(c[7979]|0))o=31964;else o=c[(oa()|0)+60>>2]|0;c[o>>2]=12;f=-1;return f|0}F=k<<8|64;w=o+f|0;if(w>>>0>>0){if(!(c[7979]|0))o=31964;else o=c[(oa()|0)+60>>2]|0;c[o>>2]=12;f=-1;return f|0}x=b+8|0;do if((c[x>>2]|0)>>>0>>0){o=c[b>>2]|0;if(o)zd(o);v=b+4|0;c[v>>2]=0;c[b>>2]=0;c[x>>2]=0;do if(w>>>0<=4294967168){if(w>>>0>=4294967168){if(!(c[7979]|0))o=31964;else o=c[(oa()|0)+60>>2]|0;c[o>>2]=12;q=12;o=0;break}t=w|8;o=yd(t+76|0)|0;if(o){s=o+-8|0;do if(o&63){r=o+63&-64;F=r+-8|0;q=s;r=(F-q|0)>>>0>15?F:r+56|0;q=r-q|0;o=o+-4|0;F=c[o>>2]|0;p=(F&-8)-q|0;if(!(F&3)){c[r>>2]=(c[s>>2]|0)+q;c[r+4>>2]=p;break}else{F=r+4|0;c[F>>2]=p|c[F>>2]&1|2;E=r+p+4|0;c[E>>2]=c[E>>2]|1;c[o>>2]=q|c[o>>2]&1|2;c[F>>2]=c[F>>2]|1;Ad(s,q);break}}else r=s;while(0);o=r+4|0;p=c[o>>2]|0;if((p&3|0)!=0?(u=p&-8,u>>>0>(t+16|0)>>>0):0){F=u-t|0;E=r+t|0;c[o>>2]=t|p&1|2;c[E+4>>2]=F|3;D=E+F+4|0;c[D>>2]=c[D>>2]|1;Ad(E,F)}q=0;o=r+8|0}else{q=12;o=0}}else{q=12;o=0}while(0);if(!(c[7979]|0))p=31964;else p=c[(oa()|0)+60>>2]|0;c[p>>2]=q;if(!q){c[b>>2]=o;c[v>>2]=o;c[x>>2]=(o|0)!=0?w:0;if(!o)o=-1;else break;return o|0}else{c[b>>2]=0;c[v>>2]=0;c[x>>2]=0;f=-1;return f|0}}else o=c[b+4>>2]|0;while(0);F=o+J|0;E=F+y|0;Yb(e,f,g,h,o,J);t=k<<5;u=e+(t<<2)|0;v=e+(k<<6<<2)|0;w=(t|0)==0;x=(i|0)==0&(j|0)==0;b=t&1073741792;y=(b|0)==0;h=i+-64|0;g=e+h|0;h=u+h|0;z=h+4|0;a=g+4|0;d=0;do{b=o+(_(i,d)|0)|0;if(!w){p=0;do{s=b+(p<<2)|0;c[e+(p<<2)>>2]=(d[s+1>>0]|0)<<8|(d[s>>0]|0)|(d[s+2>>0]|0)<<16|(d[s+3>>0]|0)<<24;p=p+1|0}while((p|0)!=(t|0))}a:do if(!x){if(y){p="0;q=0;do{ic(E,u,v,k);ic(u,E,v,k);p=Dd(p|0,q|0,2,0)|0;q=C}while(q">>>0>>0|(q|0)==(j|0)&p>>>0>>0)}else{r=0;s=0;do{p=Od(r|0,s|0,t|0,0)|0;p=F+(p<<2)|0;q=0;do{c[p+(q<<2)>>2]=c[E+(q<<2)>>2];q=q+1|0}while((q|0)!=(b|0));ic(E,u,v,k);p=Od(r|1|0,s|0,t|0,0)|0;p=F+(p<<2)|0;q=0;do{c[p+(q<<2)>>2]=c[u+(q<<2)>>2];q=q+1|0}while((q|0)!=(b|0));ic(u,E,v,k);r=Dd(r|0,s|0,2,0)|0;s=C}while(s>>>0>>0|(s|0)==(j|0)&r>>>0>>0)}if(y){p=0;q=0;while(1){ic(E,u,v,k);ic(u,E,v,k);p=Dd(p|0,q|0,2,0)|0;q=C;if(!(q>>>0>>0|(q|0)==(j|0)&p>>>0>>0))break a}}else{r=0;s=0}do{p=Od(c[g>>2]&G|0,c[A>>2]&H|0,t|0,0)|0;p=F+(p<<2)|0;q=0;do{k=e+(q<<2)|0;c[k>>2]=c[K>>2]^c[p+(q<<2)>>2];q=q+1|0}while((q|0)!=(b|0));ic(E,u,v,k);p=Od(c[h>>2]&G|0,c[z>>2]&H|0,t|0,0)|0;p=F+(p<<2)|0;q=0;do{k=u+(q<<2)|0;c[k>>2]=c[K>>2]^c[p+(q<<2)>>2];q=q+1|0}while((q|0)!=(b|0));ic(u,E,v,k);r=Dd(r|0,s|0,2,0)|0;s=C}while(s>>>0>>0|(s|0)==(j|0)&r>>>0>>0)}while(0);if(!w){p=0;do{K=B+(p<<2)|0;s=c[e+(p<<2)>>2]|0;a[K>>0]=s;a[K+1>>0]=s>>>8;a[K+2>>0]=s>>>16;a[K+3>>0]=s>>>24;p=p+1|0}while((p|0)!=(t|0))}D=D+1|0}while((D|0)!=(l|0));Yb(e,f,o,J,m,n);K=0;return K|0}if(!(c[7979]|0))o=31964;else o=c[(oa()|0)+60>>2]|0;c[o>>2]=12;K=-1;return K|0}function ic(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0;w=e<<1;m=a+((e<<5)+-16<<2)|0;o=c[m>>2]|0;c[d>>2]=o;q=c[m+4>>2]|0;L=d+4|0;c[L>>2]=q;t=c[m+8>>2]|0;x=d+8|0;c[x>>2]=t;u=c[m+12>>2]|0;y=d+12|0;c[y>>2]=u;s=c[m+16>>2]|0;z=d+16|0;c[z>>2]=s;r=c[m+20>>2]|0;A=d+20|0;c[A>>2]=r;p=c[m+24>>2]|0;B=d+24|0;c[B>>2]=p;n=c[m+28>>2]|0;C=d+28|0;c[C>>2]=n;l=c[m+32>>2]|0;D=d+32|0;c[D>>2]=l;j=c[m+36>>2]|0;E=d+36|0;c[E>>2]=j;h=c[m+40>>2]|0;F=d+40|0;c[F>>2]=h;f=c[m+44>>2]|0;G=d+44|0;c[G>>2]=f;g=c[m+48>>2]|0;H=d+48|0;c[H>>2]=g;i=c[m+52>>2]|0;I=d+52|0;c[I>>2]=i;k=c[m+56>>2]|0;J=d+56|0;c[J>>2]=k;m=c[m+60>>2]|0;K=d+60|0;c[K>>2]=m;if(!w)return;v=e<<4;e=0;while(1){m=e<<4;n=a+(m<<2)|0;c[d>>2]=o^c[N>>2];c[L>>2]=q^c[N+4>>2];c[x>>2]=t^c[N+8>>2];c[y>>2]=u^c[N+12>>2];c[z>>2]=s^c[N+16>>2];c[A>>2]=r^c[N+20>>2];c[B>>2]=p^c[N+24>>2];c[C>>2]=n^c[N+28>>2];c[D>>2]=l^c[N+32>>2];c[E>>2]=j^c[N+36>>2];c[F>>2]=h^c[N+40>>2];c[G>>2]=f^c[N+44>>2];c[H>>2]=g^c[N+48>>2];c[I>>2]=i^c[N+52>>2];c[J>>2]=k^c[N+56>>2];c[K>>2]=m^c[N+60>>2];jc(d);u=e<<3;t=b+(u<<2)|0;c[t>>2]=c[d>>2];c[t+4>>2]=c[L>>2];c[t+8>>2]=c[x>>2];c[t+12>>2]=c[y>>2];c[t+16>>2]=c[z>>2];c[t+20>>2]=c[A>>2];c[t+24>>2]=c[B>>2];c[t+28>>2]=c[C>>2];c[t+32>>2]=c[D>>2];c[t+36>>2]=c[E>>2];c[t+40>>2]=c[F>>2];c[t+44>>2]=c[G>>2];c[t+48>>2]=c[H>>2];c[t+52>>2]=c[I>>2];c[t+56>>2]=c[J>>2];c[t+60>>2]=c[K>>2];t=a+((M|16)<<2)|0;c[d>>2]=c[d>>2]^c[t>>2];c[L>>2]=c[L>>2]^c[t+4>>2];c[x>>2]=c[x>>2]^c[t+8>>2];c[y>>2]=c[y>>2]^c[t+12>>2];c[z>>2]=c[z>>2]^c[t+16>>2];c[A>>2]=c[A>>2]^c[t+20>>2];c[B>>2]=c[B>>2]^c[t+24>>2];c[C>>2]=c[C>>2]^c[t+28>>2];c[D>>2]=c[D>>2]^c[t+32>>2];c[E>>2]=c[E>>2]^c[t+36>>2];c[F>>2]=c[F>>2]^c[t+40>>2];c[G>>2]=c[G>>2]^c[t+44>>2];c[H>>2]=c[H>>2]^c[t+48>>2];c[I>>2]=c[I>>2]^c[t+52>>2];c[J>>2]=c[J>>2]^c[t+56>>2];c[K>>2]=c[K>>2]^c[t+60>>2];jc(d);u=b+(u+v<<2)|0;c[u>>2]=c[d>>2];c[u+4>>2]=c[L>>2];c[u+8>>2]=c[x>>2];c[u+12>>2]=c[y>>2];c[u+16>>2]=c[z>>2];c[u+20>>2]=c[A>>2];c[u+24>>2]=c[B>>2];c[u+28>>2]=c[C>>2];c[u+32>>2]=c[D>>2];c[u+36>>2]=c[E>>2];c[u+40>>2]=c[F>>2];c[u+44>>2]=c[G>>2];c[u+48>>2]=c[H>>2];c[u+52>>2]=c[I>>2];c[u+56>>2]=c[J>>2];c[u+60>>2]=c[K>>2];e=e+2|0;if(e>>>0>=w>>>0)break;f=c[G>>2]|0;g=c[H>>2]|0;i=c[I>>2]|0;k=c[J>>2]|0;m=c[K>>2]|0;o=c[d>>2]|0;q=c[L>>2]|0;t=c[x>>2]|0;u=c[y>>2]|0;s=c[z>>2]|0;r=c[A>>2]|0;p=c[B>>2]|0;n=c[C>>2]|0;l=c[D>>2]|0;j=c[E>>2]|0;h=c[F>>2]|0}return}function jc(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0;b=a+4|0;z=a+8|0;A=a+12|0;B=a+16|0;F=a+20|0;f=a+24|0;k=a+28|0;n=a+32|0;s=a+36|0;t=a+40|0;u=a+44|0;v=a+48|0;w=a+52|0;x=a+56|0;y=a+60|0;d=c[b>>2]|0;e=c[F>>2]|0;g=c[s>>2]|0;h=c[w>>2]|0;i=c[f>>2]|0;j=c[t>>2]|0;l=c[x>>2]|0;m=c[z>>2]|0;o=c[u>>2]|0;p=c[y>>2]|0;q=c[A>>2]|0;r=c[k>>2]|0;C=c[v>>2]|0;D=c[a>>2]|0;E=c[B>>2]|0;G=c[n>>2]|0;H=0;do{R=C+D|0;R=(R<<7|r>>>25)^E;O=R+D|0;O=(O<<9|o>>>23)^G;L=O+R|0;L=(L<<13|l>>>19)^C;U=L+O|0;U=(U<<18|u>>>14)^D;N=d+e|0;N=(N<<7|n>>>25)^g;K=N+e|0;K=(K<<9|k>>>23)^h;X=K+N|0;X=(X<<13|x>>>19)^d;Q=X+K|0;Q=(Q<<18|q>>>14)^e;J=i+j|0;J=(J<<7|j>>>25)^l;W=J+j|0;W=(W<<9|w>>>23)^m;T=W+J|0;T=(T<<13|t>>>19)^i;M=T+W|0;M=(M<<18|m>>>14)^j;V=o+p|0;V=(V<<7|v>>>25)^q;S=V+p|0;S=(S<<9|s>>>23)^r;P=S+V|0;P=(P<<13|p>>>19)^o;I=P+S|0;I=(I<<18|i>>>14)^p;Y=V+U|0;d=(Y<<7|y>>>25)^X;X=d+U|0;m=(X<<9|x>>>23)^W;W=m+d|0;q=(W<<13|w>>>19)^V;V=q+m|0;D=(V<<18|v>>>14)^U;U=R+Q|0;i=(U<<7|u>>>25)^T;T=i+Q|0;r=(T<<9|t>>>23)^S;S=r+i|0;E=(S<<13|s>>>19)^R;R=E+r|0;e=(R<<18|r>>>14)^Q;Q=N+M|0;o=(Q<<7|q>>>25)^P;P=o+M|0;G=(P<<9|p>>>23)^O;O=G+o|0;g=(O<<13|o>>>19)^N;N=g+G|0;j=(N<<18|n>>>14)^M;M=J+I|0;C=(M<<7|m>>>25)^L;L=C+I|0;h=(L<<9|l>>>23)^K;K=h+C|0;l=(K<<13|k>>>19)^J;J=l+h|0;p=(J<<18|j>>>14)^I;H=H+2|0}while(H>>>0<8);c[a>>2]=(c[a>>2]|0)+D;c[b>>2]=(c[b>>2]|0)+d;c[z>>2]=(c[z>>2]|0)+m;c[A>>2]=(c[A>>2]|0)+q;c[B>>2]=(c[B>>2]|0)+E;c[F>>2]=(c[F>>2]|0)+e;c[f>>2]=(c[f>>2]|0)+i;c[k>>2]=(c[k>>2]|0)+r;c[n>>2]=(c[n>>2]|0)+G;c[s>>2]=(c[s>>2]|0)+g;c[t>>2]=(c[t>>2]|0)+j;c[u>>2]=(c[u>>2]|0)+o;c[v>>2]=(c[v>>2]|0)+C;c[w>>2]=(c[w>>2]|0)+h;c[x>>2]=(c[x>>2]|0)+l;c[y>>2]=(c[y>>2]|0)+p;return}function kc(){return 32}function lc(){return 32}function mc(a,b){a=a|0;b=b|0;md(a,b,33785);return 0}function nc(a,b,c){a=a|0;b=b|0;c=c|0;md(a,b,c);return 0}function oc(){return 32}function pc(){return 24}function qc(){return 16}function rc(b,c,d,e,f,g,h){b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;r=i;q=i=i+63&-64;i=i+240|0;p=q;o=q+176|0;q=q+144|0;nb(q,g,h,32988);h=b;j=d;if(b>>>0>=d>>>0?0>>0|0==(f|0)&(h-j|0)>>>0>>0:0)k=5;else if(d>>>0>=b>>>0?0>>0|0==(f|0)&(j-h|0)>>>0>>0:0)k=5;if((k|0)==5){Jd(b|0,d|0,e|0)|0;d=b}h=o;k=h+32|0;do{a[h>>0]=0;h=h+1|0}while((h|0)<(k|0));l=f>>>0>0|(f|0)==0&e>>>0>32;m=l?32:e;n=l?0:f;h=(m|0)==0&(n|0)==0;if(!h){k=f>>>0<0|(f|0)==0&e>>>0<32;k=dd((k?e:32)|0,(k?f:0)|0,-1,0)|0;id(o+32|0,d|0,k+1|0)|0}k=dd(m|0,n|0,32,0)|0;j=g+16|0;nd(o,o,k,c,j,0,0,q);ub(p,o);if(!h){g=f>>>0<0|(f|0)==0&e>>>0<32;g=dd((g?e:32)|0,(g?f:0)|0,-1,0)|0;id(b|0,o+32|0,g+1|0)|0}h=o;k=h+64|0;do{a[h>>0]=0;h=h+1|0}while((h|0)<(k|0));if(!l){tb(p,b,e,f);rb(p,c);i=r;return 0}o="Cd(e|0,f|0,m|0,n|0)|0;nd(b+m|0,d+m|0,o,C,j,1,0,q);Tb(p,b,e,f);Rb(p,c);i=r;return" 0}function="" sc(a,b,c,d,e,f){a="a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;if(d">>>0>0|(d|0)==0&c>>>0>4294967279){e=-1;return e|0}rc(a+16|0,a,b,c,d,e,f)|0;e=0;return e|0}function tc(b,e,f,g,h,j,k){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;t=i;s=i=i+63&-64;i=i+208|0;m=s;o=s+144|0;n=s+112|0;r=s+48|0;s=s+16|0;nb(s,j,k,32988);q=j+16|0;k=n;j=s;l=k+32|0;do{a[k>>0]=a[j>>0]|0;k=k+1|0;j=j+1|0}while((k|0)<(l|0));l=q;j=l;l=l+4|0;l=d[l>>0]|d[l+1>>0]<<8|d[l+2>>0]<<16|d[l+3>>0]<<24;k=m;c[k>>2]=d[j>>0]|d[j+1>>0]<<8|d[j+2>>0]<<16|d[j+3>>0]<<24;c[k+4>>2]=l;k=m+8|0;c[k>>2]=0;c[k+4>>2]=0;ob(o,m,n,33817);k=0;do{a[r+k>>0]=a[o+k>>0]|0;k=k+1|0}while((k|0)!=32);if(Qb(f,e,g,h,r)|0){k=s;l=k+32|0;do{a[k>>0]=0;k=k+1|0}while((k|0)<(l|0));s=-1;i=t;return s|0}k="e;j=b;if(e">>>0>=b>>>0?0>>0|0==(h|0)&(k-j|0)>>>0>>0:0)p=9;else if(b>>>0>=e>>>0?0>>0|0==(h|0)&(j-k|0)>>>0>>0:0)p=9;if((p|0)==9){Jd(b|0,e|0,g|0)|0;e=b}k=h>>>0>0|(h|0)==0&g>>>0>32;j=k?32:g;l=k?0:h;if((j|0)==0&(l|0)==0)nd(r,r,32,0,q,0,0,s);else{f=r+32|0;p=h>>>0<0|(h|0)==0&g>>>0<32;p=dd((p?g:32)|0,(p?h:0)|0,-1,0)|0;p=p+1|0;id(f|0,e|0,p|0)|0;o=dd(j|0,l|0,32,0)|0;nd(r,r,o,c,q,0,0,s);id(b|0,f|0,p|0)|0}if(k){r=cd(g|0,h|0,j|0,l|0)|0;nd(b+j|0,e+j|0,r,c,q,1,0,s)}k=s;l=k+32|0;do{a[k>>0]=0;k=k+1|0}while((k|0)<(l|0));s=0;i=t;return s|0}function="" uc(a,b,c,d,e,f){a="a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;if(d">>>0<0|(d|0)==0&c>>>0<16){e=-1;return e|0}d="Dd(c|0,d|0,-16,-1)|0;e=tc(a,b+16|0,b,d,C,e,f)|0;return" e|0}function="" vc(){return="" 8}function="" wc(){return="" 16}function="" xc(b,c,e,f,g){b="b|0;c=c|0;e=e|0;f=f|0;g=g|0;var" h="0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;h=d[g">>0]|0;o=Hd(d[g+1>>0]|0|0,0,8)|0;n=C;j=Hd(d[g+2>>0]|0|0,0,16)|0;n=n|C;k=Hd(d[g+3>>0]|0|0,0,24)|0;n=n|C|(d[g+4>>0]|0);r=Hd(d[g+5>>0]|0|0,0,40)|0;n=n|C;i=Hd(d[g+6>>0]|0|0,0,48)|0;n=n|C;l=Hd(d[g+7>>0]|0|0,0,56)|0;l=o|h|j|k|r|i|l;n=n|C;i=d[g+8>>0]|0;r=Hd(d[g+9>>0]|0|0,0,8)|0;k=C;j=Hd(d[g+10>>0]|0|0,0,16)|0;k=k|C;h=Hd(d[g+11>>0]|0|0,0,24)|0;k=k|C|(d[g+12>>0]|0);o=Hd(d[g+13>>0]|0|0,0,40)|0;k=k|C;p=Hd(d[g+14>>0]|0|0,0,48)|0;k=k|C;m=Hd(d[g+15>>0]|0|0,0,56)|0;m=r|i|j|h|o|p|m;k=k|C;p=e&7;o=c+e+(0-p)|0;e=Hd(e|0,f|0,56)|0;g=C;h=m^2037671283;j=k^1952801890;i=l^1852142177;f=n^1819895653;m=m^1852075885;k=k^1685025377;l=l^1886610805;n=n^1936682341;if((o|0)!=(c|0)){do{x=d[c>>0]|0;y=Hd(d[c+1>>0]|0|0,0,8)|0;r=C;w=Hd(d[c+2>>0]|0|0,0,16)|0;r=r|C;t=Hd(d[c+3>>0]|0|0,0,24)|0;r=r|C|(d[c+4>>0]|0);u=Hd(d[c+5>>0]|0|0,0,40)|0;r=r|C;v=Hd(d[c+6>>0]|0|0,0,48)|0;r=r|C;s=Hd(d[c+7>>0]|0|0,0,56)|0;s=y|x|w|t|u|v|s;r=r|C;v=s^h;u=r^j;n=Dd(l|0,n|0,m|0,k|0)|0;l=C;t=Hd(m|0,k|0,13)|0;h=C;m=Gd(m|0,k|0,51)|0;m=(t|m)^n;h=(h|C)^l;f=Dd(v|0,u|0,i|0,f|0)|0;i=C;t=Hd(v|0,u|0,16)|0;j=C;u=Gd(v|0,u|0,48)|0;u=(t|u)^f;j=(j|C)^i;n=Dd(u|0,j|0,l|0,n|0)|0;l=C;t=Hd(u|0,j|0,21)|0;k=C;j=Gd(u|0,j|0,43)|0;j=(t|j)^n;k=(k|C)^l;i=Dd(f|0,i|0,m|0,h|0)|0;f=C;t=Hd(m|0,h|0,17)|0;u=C;h=Gd(m|0,h|0,47)|0;h=i^(t|h);u=f^(u|C);l=Dd(n|0,l|0,h|0,u|0)|0;n=C;t=Hd(h|0,u|0,13)|0;m=C;u=Gd(h|0,u|0,51)|0;u=(t|u)^l;m=(m|C)^n;i=Dd(j|0,k|0,f|0,i|0)|0;f=C;t=Hd(j|0,k|0,16)|0;h=C;k=Gd(j|0,k|0,48)|0;k=(t|k)^i;h=(h|C)^f;l=Dd(k|0,h|0,n|0,l|0)|0;n=C;t=Hd(k|0,h|0,21)|0;j=C;h=Gd(k|0,h|0,43)|0;h=(t|h)^l;j=(j|C)^n;f=Dd(i|0,f|0,u|0,m|0)|0;i=C;t=Hd(u|0,m|0,17)|0;k=C;m=Gd(u|0,m|0,47)|0;m=(t|m)^f;k=(k|C)^i;l=l^s;n=n^r;c=c+8|0}while((c|0)!=(o|0));c=o}switch(p|0){case 7:{e=Hd(d[c+6>>0]|0|0,0,48)|0|e;g=C|g;q=5;break}case 6:{q=5;break}case 5:{q=6;break}case 4:{q=7;break}case 3:{q=8;break}case 2:{q=9;break}case 1:{q=10;break}default:{}}if((q|0)==5){y=Hd(d[c+5>>0]|0|0,0,40)|0;g=C|g;e=y|e;q=6}if((q|0)==6){g=d[c+4>>0]|0|g;q=7}if((q|0)==7){y=Hd(d[c+3>>0]|0|0,0,24)|0;e=y|e;g=C|g;q=8}if((q|0)==8){y=Hd(d[c+2>>0]|0|0,0,16)|0;e=y|e;g=C|g;q=9}if((q|0)==9){y=Hd(d[c+1>>0]|0|0,0,8)|0;e=y|e;g=C|g;q=10}if((q|0)==10)e=d[c>>0]|0|e;y=e^h;r=g^j;s=Dd(l|0,n|0,m|0,k|0)|0;q=C;w=Hd(m|0,k|0,13)|0;t=C;x=Gd(m|0,k|0,51)|0;x=(w|x)^s;t=(t|C)^q;w=Dd(y|0,r|0,i|0,f|0)|0;v=C;u=Hd(y|0,r|0,16)|0;p=C;r=Gd(y|0,r|0,48)|0;r=(u|r)^w;p=(p|C)^v;s=Dd(r|0,p|0,q|0,s|0)|0;q=C;u=Hd(r|0,p|0,21)|0;y=C;p=Gd(r|0,p|0,43)|0;p=(u|p)^s;y=(y|C)^q;v=Dd(w|0,v|0,x|0,t|0)|0;w=C;u=Hd(x|0,t|0,17)|0;r=C;t=Gd(x|0,t|0,47)|0;t=v^(u|t);r=w^(r|C);q=Dd(s|0,q|0,t|0,r|0)|0;s=C;u=Hd(t|0,r|0,13)|0;x=C;r=Gd(t|0,r|0,51)|0;r=(u|r)^q;x=(x|C)^s;v=Dd(p|0,y|0,w|0,v|0)|0;w=C;u=Hd(p|0,y|0,16)|0;t=C;y=Gd(p|0,y|0,48)|0;y=(u|y)^v;t=(t|C)^w;q=Dd(y|0,t|0,s|0,q|0)|0;s=C;u=Hd(y|0,t|0,21)|0;p=C;t=Gd(y|0,t|0,43)|0;t=(u|t)^q;p=(p|C)^s;w=Dd(v|0,w|0,r|0,x|0)|0;v=C;u=Hd(r|0,x|0,17)|0;y=C;x=Gd(r|0,x|0,47)|0;x=(u|x)^w;y=(y|C)^v;s=Dd(q^e|0,s^g|0,x|0,y|0)|0;q=C;u=Hd(x|0,y|0,13)|0;r=C;y=Gd(x|0,y|0,51)|0;y=s^(u|y);r=q^(r|C);w=Dd(t|0,p|0,v^255|0,w|0)|0;v=C;u=Hd(t|0,p|0,16)|0;x=C;p=Gd(t|0,p|0,48)|0;p=(u|p)^w;x=(x|C)^v;s=Dd(p|0,x|0,q|0,s|0)|0;q=C;u=Hd(p|0,x|0,21)|0;t=C;x=Gd(p|0,x|0,43)|0;x=(u|x)^s;t=(t|C)^q;v=Dd(w|0,v|0,y|0,r|0)|0;w=C;u=Hd(y|0,r|0,17)|0;p=C;r=Gd(y|0,r|0,47)|0;r=(u|r)^v;p=(p|C)^w;q=Dd(s|0,q|0,r|0,p|0)|0;s=C;u=Hd(r|0,p|0,13)|0;y=C;p=Gd(r|0,p|0,51)|0;p=(u|p)^q;y=(y|C)^s;v=Dd(x|0,t|0,w|0,v|0)|0;w=C;u=Hd(x|0,t|0,16)|0;r=C;t=Gd(x|0,t|0,48)|0;t=(u|t)^v;r=(r|C)^w;q=Dd(t|0,r|0,s|0,q|0)|0;s=C;u=Hd(t|0,r|0,21)|0;x=C;r=Gd(t|0,r|0,43)|0;r=(u|r)^q;x=(x|C)^s;w=Dd(v|0,w|0,p|0,y|0)|0;v=C;u=Hd(p|0,y|0,17)|0;t=C;y=Gd(p|0,y|0,47)|0;y=(u|y)^w;t=(t|C)^v;s=Dd(q|0,s|0,y|0,t|0)|0;q=C;u=Hd(y|0,t|0,13)|0;p=C;t=Gd(y|0,t|0,51)|0;t=(u|t)^s;p=(p|C)^q;w=Dd(r|0,x|0,v|0,w|0)|0;v=C;u=Hd(r|0,x|0,16)|0;y=C;x=Gd(r|0,x|0,48)|0;x=(u|x)^w;y=(y|C)^v;s=Dd(x|0,y|0,q|0,s|0)|0;q=C;u=Hd(x|0,y|0,21)|0;r=C;y=Gd(x|0,y|0,43)|0;y=(u|y)^s;r=(r|C)^q;v=Dd(w|0,v|0,t|0,p|0)|0;w=C;u=Hd(t|0,p|0,17)|0;x=C;p=Gd(t|0,p|0,47)|0;p=(u|p)^v;x=(x|C)^w;q=Dd(s|0,q|0,p|0,x|0)|0;s=C;u=Hd(p|0,x|0,13)|0;t=C;x=Gd(p|0,x|0,51)|0;q=(u|x)^q;s=(t|C)^s;v=Dd(y|0,r|0,w|0,v|0)|0;w=C;t=Hd(y|0,r|0,16)|0;x=C;r=Gd(y|0,r|0,48)|0;r=(t|r)^v;x=(x|C)^w;t=Hd(r|0,x|0,21)|0;y=C;x=Gd(r|0,x|0,43)|0;y=y|C;w=Dd(v|0,w|0,q|0,s|0)|0;v=C;r=Hd(q|0,s|0,17)|0;u=C;s=Gd(q|0,s|0,47)|0;x=(r|s)^w^v^(t|x);y=(u|C)^v^w^y;a[b>>0]=x;a[b+1>>0]=x>>>8;a[b+2>>0]=x>>>16;a[b+3>>0]=x>>>24;a[b+4>>0]=y;w=Gd(x|0,y|0,40)|0;a[b+5>>0]=w;w=Gd(x|0,y|0,48)|0;a[b+6>>0]=w;y=Gd(x|0,y|0,56)|0;a[b+7>>0]=y;return 0}function yc(){return 64}function zc(){return 32}function Ac(){return 32}function Bc(){return 64}function Cc(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;o=i;h=i=i+63&-64;i=i+496|0;k=h;j=h+448|0;l=h+408|0;m=h+368|0;h=h+208|0;g=k+64|0;n=k;p=8;q=n+64|0;do{c[n>>2]=c[p>>2];n=n+4|0;p=p+4|0}while((n|0)<(q|0));n=k+72|0;c[n>>2]=256;c[n+4>>2]=0;n=g;c[n>>2]=0;c[n+4>>2]=0;n=k+80|0;p=f;q=n+32|0;do{a[n>>0]=a[p>>0]|0;n=n+1|0;p=p+1|0}while((n|0)<(q|0));gb(k,e);a[e>>0]=(d[e>>0]|0)&248;q=e+31|0;a[q>>0]=(d[q>>0]|0)&63|64;Rc(h,e);Ic(j,h+80|0);Jc(l,h,j);Jc(m,h+40|0,j);Lc(b,m);Lc(k,l);q=b+31|0;a[q>>0]=(d[q>>0]|0)^(d[k>>0]|0)<<7;jd(e|0,f|0,32)|0;jd(e+32|0,b|0,32)|0;i=o;return 0}function="" dc(b,e){b="b|0;e=e|0;var" f="0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;q=i;n=i=i+63&-64;i=i+528|0;m=n;l=n+448|0;o=n+408|0;p=n+368|0;k=n+208|0;n=n+488|0;f=0;do{a[n+f">>0]=Ba(0)|0;f=f+1|0}while((f|0)!=32);f=m+64|0;g=m;h=8;j=g+64|0;do{c[g>>2]=c[h>>2];g=g+4|0;h=h+4|0}while((g|0)<(j|0));g=m+72|0;c[g>>2]=256;c[g+4>>2]=0;g=f;c[g>>2]=0;c[g+4>>2]=0;g=m+80|0;h=n;j=g+32|0;do{a[g>>0]=a[h>>0]|0;g=g+1|0;h=h+1|0}while((g|0)<(j|0));gb(m,e);a[e>>0]=(d[e>>0]|0)&248;g=e+31|0;a[g>>0]=(d[g>>0]|0)&63|64;Rc(k,e);Ic(l,k+80|0);Jc(o,k,l);Jc(p,k+40|0,l);Lc(b,p);Lc(m,o);g=b+31|0;a[g>>0]=(d[g>>0]|0)^(d[m>>0]|0)<<7;g=e;h=n;j=g+32|0;do{a[g>>0]=a[h>>0]|0;g=g+1|0;h=h+1|0}while((g|0)<(j|0));jd(e+32|0,b|0,32)|0;i=q;return 0}function="" ec(a,b,d,e,f,g){a="a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var" h="0,j=0,k=0;h=i;j=i=i+63&-64;i=i+16|0;k=a+64|0;Jd(k|0,d|0,e|0)|0;Xc(a,j,k,e,f,g);g=j;d=(b|0)!=0;if((c[g">>2]|0)==64&(c[g+4>>2]|0)==0){if(!d){k=0;i=h;return k|0}j=Dd(e|0,f|0,64,0)|0;k=b;c[k>>2]=j;c[k+4>>2]=C;k=0;i=h;return k|0}else{if(d){k=b;c[k>>2]=0;c[k+4>>2]=0}k=Dd(e|0,f|0,64,0)|0;Fd(a|0,0,k|0)|0;k=-1;i=h;return k|0}return 0}function Fc(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0;e=Dd(e|0,f|0,-64,-1)|0;f=C;do if(!(f>>>0>0|(f|0)==0&e>>>0>4294967231)){h=d+64|0;if(Vc(d,h,e,f,g)|0){Fd(a|0,0,e|0)|0;break}if(b){d=b;c[d>>2]=e;c[d+4>>2]=f}Jd(a|0,h|0,e|0)|0;d=0;return d|0}while(0);if(!b){d=-1;return d|0}d=b;c[d>>2]=0;c[d+4>>2]=0;d=-1;return d|0}function Gc(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;Xc(a,b,c,d,e,f);return 0}function Hc(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;return Vc(a,b,c,d,e)|0}function Ic(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0;g=i;c=i=i+63&-64;i=i+160|0;d=c+120|0;e=c+80|0;f=c+40|0;Kc(d,b);Kc(e,d);Kc(e,e);Jc(e,b,e);Jc(d,d,e);Kc(f,d);Jc(e,e,f);Kc(f,e);Kc(f,f);Kc(f,f);Kc(f,f);Kc(f,f);Jc(e,f,e);Kc(f,e);Kc(f,f);Kc(f,f);Kc(f,f);Kc(f,f);Kc(f,f);Kc(f,f);Kc(f,f);Kc(f,f);Kc(f,f);Jc(f,f,e);Kc(c,f);Kc(c,c);Kc(c,c);Kc(c,c);Kc(c,c);Kc(c,c);Kc(c,c);Kc(c,c);Kc(c,c);Kc(c,c);Kc(c,c);Kc(c,c);Kc(c,c);Kc(c,c);Kc(c,c);Kc(c,c);Kc(c,c);Kc(c,c);Kc(c,c);Kc(c,c);Jc(f,c,f);Kc(f,f);Kc(f,f);Kc(f,f);Kc(f,f);Kc(f,f);Kc(f,f);Kc(f,f);Kc(f,f);Kc(f,f);Kc(f,f);Jc(e,f,e);Kc(f,e);b=1;do{Kc(f,f);b=b+1|0}while((b|0)!=50);Jc(f,f,e);Kc(c,f);b=1;do{Kc(c,c);b=b+1|0}while((b|0)!=100);Jc(f,c,f);Kc(f,f);b=1;do{Kc(f,f);b=b+1|0}while((b|0)!=50);Jc(e,f,e);Kc(e,e);Kc(e,e);Kc(e,e);Kc(e,e);Kc(e,e);Jc(a,e,d);i=g;return}function Jc(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0,fb=0,gb=0,hb=0,ib=0,jb=0,kb=0,lb=0,mb=0,nb=0,ob=0,pb=0,qb=0,rb=0,sb=0,tb=0,ub=0,vb=0,wb=0,xb=0,yb=0,zb=0,Ab=0,Bb=0,Cb=0,Db=0,Eb=0,Fb=0,Gb=0,Hb=0,Ib=0,Jb=0,Kb=0,Lb=0,Mb=0,Nb=0,Ob=0,Pb=0,Qb=0,Rb=0,Sb=0,Tb=0,Ub=0,Vb=0,Wb=0,Xb=0,Yb=0,Zb=0,_b=0,$b=0,ac=0,bc=0,cc=0,dc=0,ec=0,fc=0,gc=0,hc=0,ic=0,jc=0,kc=0,lc=0,mc=0,nc=0,oc=0,pc=0,qc=0,rc=0,sc=0,tc=0,uc=0,vc=0,wc=0,xc=0,yc=0,zc=0,Ac=0,Bc=0,Cc=0,Dc=0,Ec=0,Fc=0,Gc=0,Hc=0,Ic=0,Jc=0,Kc=0,Lc=0,Mc=0,Nc=0,Oc=0,Pc=0,Qc=0,Rc=0,Sc=0;l=c[b>>2]|0;s=c[b+4>>2]|0;j=c[b+8>>2]|0;Rb=c[b+12>>2]|0;e=c[b+16>>2]|0;za=c[b+20>>2]|0;ya=c[b+24>>2]|0;zb=c[b+28>>2]|0;h=c[b+32>>2]|0;ga=c[b+36>>2]|0;H=c[d>>2]|0;J=c[d+4>>2]|0;F=c[d+8>>2]|0;D=c[d+12>>2]|0;A=c[d+16>>2]|0;y=c[d+20>>2]|0;w=c[d+24>>2]|0;u=c[d+28>>2]|0;k=c[d+32>>2]|0;t=c[d+36>>2]|0;Oc=J*19|0;bc=F*19|0;rb=D*19|0;Ha=A*19|0;jc=y*19|0;Db=w*19|0;Ta=u*19|0;Sc=k*19|0;Qc=t*19|0;p=s<<1;f=rb<<1;m=za<<1;i=zb<<1;d=ga<<1;o=((l|0)<0)<<31>>31;I=((H|0)<0)<<31>>31;Mc=Od(H|0,I|0,l|0,o|0)|0;Lc=C;K=((J|0)<0)<<31>>31;wc=Od(J|0,K|0,l|0,o|0)|0;vc=C;G=((F|0)<0)<<31>>31;ub=Od(F|0,G|0,l|0,o|0)|0;tb=C;E=((D|0)<0)<<31>>31;Ka=Od(D|0,E|0,l|0,o|0)|0;Ja=C;B=((A|0)<0)<<31>>31;mc=Od(A|0,B|0,l|0,o|0)|0;lc=C;z=((y|0)<0)<<31>>31;Gb=Od(y|0,z|0,l|0,o|0)|0;Fb=C;x=((w|0)<0)<<31>>31;Wa=Od(w|0,x|0,l|0,o|0)|0;Va=C;v=((u|0)<0)<<31>>31;ja=Od(u|0,v|0,l|0,o|0)|0;ia=C;Pc=((k|0)<0)<<31>>31;P=Od(k|0,Pc|0,l|0,o|0)|0;O=C;o=Od(t|0,((t|0)<0)<<31>>31|0,l|0,o|0)|0;l=C;t=((s|0)<0)<<31>>31;dc=Od(H|0,I|0,s|0,t|0)|0;ec=C;n=((p|0)<0)<<31>>31;yb=Od(J|0,K|0,p|0,n|0)|0;xb=C;Ma=Od(F|0,G|0,s|0,t|0)|0;La=C;oc=Od(D|0,E|0,p|0,n|0)|0;nc=C;Ib=Od(A|0,B|0,s|0,t|0)|0;Hb=C;Ya=Od(y|0,z|0,p|0,n|0)|0;Xa=C;la=Od(w|0,x|0,s|0,t|0)|0;ka=C;R=Od(u|0,v|0,p|0,n|0)|0;Q=C;t=Od(k|0,Pc|0,s|0,t|0)|0;s=C;Pc=((Qc|0)<0)<<31>>31;n=Od(Qc|0,Pc|0,p|0,n|0)|0;p=C;k=((j|0)<0)<<31>>31;wb=Od(H|0,I|0,j|0,k|0)|0;vb=C;Qa=Od(J|0,K|0,j|0,k|0)|0;Pa=C;qc=Od(F|0,G|0,j|0,k|0)|0;pc=C;Kb=Od(D|0,E|0,j|0,k|0)|0;Jb=C;_a=Od(A|0,B|0,j|0,k|0)|0;Za=C;na=Od(y|0,z|0,j|0,k|0)|0;ma=C;T=Od(w|0,x|0,j|0,k|0)|0;S=C;v=Od(u|0,v|0,j|0,k|0)|0;u=C;Rc=((Sc|0)<0)<<31>>31;yc=Od(Sc|0,Rc|0,j|0,k|0)|0;xc=C;k=Od(Qc|0,Pc|0,j|0,k|0)|0;j=C;Sb=((Rb|0)<0)<<31>>31;Oa=Od(H|0,I|0,Rb|0,Sb|0)|0;Na=C;fa=((f|0)<0)<<31>>31;uc=Od(J|0,K|0,f|0,fa|0)|0;tc=C;Mb=Od(F|0,G|0,Rb|0,Sb|0)|0;Lb=C;ab=Od(D|0,E|0,f|0,fa|0)|0;$a=C;pa=Od(A|0,B|0,Rb|0,Sb|0)|0;oa=C;V=Od(y|0,z|0,f|0,fa|0)|0;U=C;x=Od(w|0,x|0,Rb|0,Sb|0)|0;w=C;Ua=((Ta|0)<0)<<31>>31;Ac=Od(Ta|0,Ua|0,f|0,fa|0)|0;zc=C;Sb=Od(Sc|0,Rc|0,Rb|0,Sb|0)|0;Rb=C;fa=Od(Qc|0,Pc|0,f|0,fa|0)|0;f=C;N=((e|0)<0)<<31>>31;sc=Od(H|0,I|0,e|0,N|0)|0;rc=C;Qb=Od(J|0,K|0,e|0,N|0)|0;Pb=C;cb=Od(F|0,G|0,e|0,N|0)|0;bb=C;ra=Od(D|0,E|0,e|0,N|0)|0;qa=C;X=Od(A|0,B|0,e|0,N|0)|0;W=C;z=Od(y|0,z|0,e|0,N|0)|0;y=C;Eb=((Db|0)<0)<<31>>31;Cc=Od(Db|0,Eb|0,e|0,N|0)|0;Bc=C;Ub=Od(Ta|0,Ua|0,e|0,N|0)|0;Tb=C;ib=Od(Sc|0,Rc|0,e|0,N|0)|0;hb=C;N=Od(Qc|0,Pc|0,e|0,N|0)|0;e=C;Aa=((za|0)<0)<<31>>31;Ob=Od(H|0,I|0,za|0,Aa|0)|0;Nb=C;b=((M|0)<0)<<31>>31;gb=Od(J|0,K|0,M|0,b|0)|0;fb=C;ta=Od(F|0,G|0,za|0,Aa|0)|0;sa=C;Z=Od(D|0,E|0,M|0,b|0)|0;Y=C;B=Od(A|0,B|0,za|0,Aa|0)|0;A=C;kc=((jc|0)<0)<<31>>31;Ec=Od(jc|0,kc|0,M|0,b|0)|0;Dc=C;Wb=Od(Db|0,Eb|0,za|0,Aa|0)|0;Vb=C;kb=Od(Ta|0,Ua|0,M|0,b|0)|0;jb=C;Aa=Od(Sc|0,Rc|0,za|0,Aa|0)|0;za=C;b=Od(Qc|0,Pc|0,M|0,b|0)|0;M=C;g=((ya|0)<0)<<31>>31;eb=Od(H|0,I|0,ya|0,g|0)|0;db=C;xa=Od(J|0,K|0,ya|0,g|0)|0;wa=C;$=Od(F|0,G|0,ya|0,g|0)|0;_=C;E=Od(D|0,E|0,ya|0,g|0)|0;D=C;Ia=((Ha|0)<0)<<31>>31;Gc=Od(Ha|0,Ia|0,ya|0,g|0)|0;Fc=C;Yb=Od(jc|0,kc|0,ya|0,g|0)|0;Xb=C;mb=Od(Db|0,Eb|0,ya|0,g|0)|0;lb=C;Ca=Od(Ta|0,Ua|0,ya|0,g|0)|0;Ba=C;m=Od(Sc|0,Rc|0,ya|0,g|0)|0;r=C;g=Od(Qc|0,Pc|0,ya|0,g|0)|0;ya=C;Ab=((zb|0)<0)<<31>>31;va=Od(H|0,I|0,zb|0,Ab|0)|0;ua=C;ea=((i|0)<0)<<31>>31;da=Od(J|0,K|0,i|0,ea|0)|0;ca=C;G=Od(F|0,G|0,zb|0,Ab|0)|0;F=C;sb=((rb|0)<0)<<31>>31;Ic=Od(rb|0,sb|0,i|0,ea|0)|0;Hc=C;_b=Od(Ha|0,Ia|0,zb|0,Ab|0)|0;Zb=C;ob=Od(jc|0,kc|0,i|0,ea|0)|0;nb=C;Ea=Od(Db|0,Eb|0,zb|0,Ab|0)|0;Da=C;gc=Od(Ta|0,Ua|0,i|0,ea|0)|0;fc=C;Ab=Od(Sc|0,Rc|0,zb|0,Ab|0)|0;zb=C;ea=Od(Qc|0,Pc|0,i|0,ea|0)|0;i=C;L=((h|0)<0)<<31>>31;ba=Od(H|0,I|0,h|0,L|0)|0;aa=C;K=Od(J|0,K|0,h|0,L|0)|0;J=C;cc=((bc|0)<0)<<31>>31;Kc=Od(bc|0,cc|0,h|0,L|0)|0;Jc=C;ac=Od(rb|0,sb|0,h|0,L|0)|0;$b=C;qb=Od(Ha|0,Ia|0,h|0,L|0)|0;pb=C;Ga=Od(jc|0,kc|0,h|0,L|0)|0;Fa=C;ic=Od(Db|0,Eb|0,h|0,L|0)|0;hc=C;Cb=Od(Ta|0,Ua|0,h|0,L|0)|0;Bb=C;Sa=Od(Sc|0,Rc|0,h|0,L|0)|0;Ra=C;L=Od(Qc|0,Pc|0,h|0,L|0)|0;h=C;ha=((ga|0)<0)<<31>>31;I=Od(H|0,I|0,ga|0,ha|0)|0;H=C;q=((d|0)<0)<<31>>31;Oc=Od(Oc|0,((Oc|0)<0)<<31>>31|0,d|0,q|0)|0;Nc=C;cc=Od(bc|0,cc|0,ga|0,ha|0)|0;bc=C;sb=Od(rb|0,sb|0,d|0,q|0)|0;rb=C;Ia=Od(Ha|0,Ia|0,ga|0,ha|0)|0;Ha=C;kc=Od(jc|0,kc|0,d|0,q|0)|0;jc=C;Eb=Od(Db|0,Eb|0,ga|0,ha|0)|0;Db=C;Ua=Od(Ta|0,Ua|0,d|0,q|0)|0;Ta=C;ha=Od(Sc|0,Rc|0,ga|0,ha|0)|0;ga=C;q=Od(Qc|0,Pc|0,d|0,q|0)|0;d=C;Lc=Dd(Oc|0,Nc|0,Mc|0,Lc|0)|0;Jc=Dd(Lc|0,C|0,Kc|0,Jc|0)|0;Hc=Dd(Jc|0,C|0,Ic|0,Hc|0)|0;Fc=Dd(Hc|0,C|0,Gc|0,Fc|0)|0;Dc=Dd(Fc|0,C|0,Ec|0,Dc|0)|0;Bc=Dd(Dc|0,C|0,Cc|0,Bc|0)|0;zc=Dd(Bc|0,C|0,Ac|0,zc|0)|0;xc=Dd(zc|0,C|0,yc|0,xc|0)|0;p=Dd(xc|0,C|0,n|0,p|0)|0;n=C;ec=Dd(wc|0,vc|0,dc|0,ec|0)|0;dc=C;rc=Dd(uc|0,tc|0,sc|0,rc|0)|0;pc=Dd(rc|0,C|0,qc|0,pc|0)|0;nc=Dd(pc|0,C|0,oc|0,nc|0)|0;lc=Dd(nc|0,C|0,mc|0,lc|0)|0;jc=Dd(lc|0,C|0,kc|0,jc|0)|0;hc=Dd(jc|0,C|0,ic|0,hc|0)|0;fc=Dd(hc|0,C|0,gc|0,fc|0)|0;r=Dd(fc|0,C|0,m|0,r|0)|0;M=Dd(r|0,C|0,b|0,M|0)|0;b=C;r=Dd(p|0,n|0,33554432,0)|0;r=Ed(r|0,C|0,26)|0;m=C;bc=Dd(ec|0,dc|0,cc|0,bc|0)|0;$b=Dd(bc|0,C|0,ac|0,$b|0)|0;Zb=Dd($b|0,C|0,_b|0,Zb|0)|0;Xb=Dd(Zb|0,C|0,Yb|0,Xb|0)|0;Vb=Dd(Xb|0,C|0,Wb|0,Vb|0)|0;Tb=Dd(Vb|0,C|0,Ub|0,Tb|0)|0;Rb=Dd(Tb|0,C|0,Sb|0,Rb|0)|0;j=Dd(Rb|0,C|0,k|0,j|0)|0;j=Dd(j|0,C|0,r|0,m|0)|0;k=C;m=Hd(r|0,m|0,26)|0;m=Cd(p|0,n|0,m|0,C|0)|0;n=C;p=Dd(M|0,b|0,33554432,0)|0;p=Ed(p|0,C|0,26)|0;r=C;Nb=Dd(Qb|0,Pb|0,Ob|0,Nb|0)|0;Lb=Dd(Nb|0,C|0,Mb|0,Lb|0)|0;Jb=Dd(Lb|0,C|0,Kb|0,Jb|0)|0;Hb=Dd(Jb|0,C|0,Ib|0,Hb|0)|0;Fb=Dd(Hb|0,C|0,Gb|0,Fb|0)|0;Db=Dd(Fb|0,C|0,Eb|0,Db|0)|0;Bb=Dd(Db|0,C|0,Cb|0,Bb|0)|0;zb=Dd(Bb|0,C|0,Ab|0,zb|0)|0;ya=Dd(zb|0,C|0,g|0,ya|0)|0;ya=Dd(ya|0,C|0,p|0,r|0)|0;g=C;r=Hd(p|0,r|0,26)|0;r=Cd(M|0,b|0,r|0,C|0)|0;b=C;M=Dd(j|0,k|0,16777216,0)|0;M=Ed(M|0,C|0,25)|0;p=C;vb=Dd(yb|0,xb|0,wb|0,vb|0)|0;tb=Dd(vb|0,C|0,ub|0,tb|0)|0;rb=Dd(tb|0,C|0,sb|0,rb|0)|0;pb=Dd(rb|0,C|0,qb|0,pb|0)|0;nb=Dd(pb|0,C|0,ob|0,nb|0)|0;lb=Dd(nb|0,C|0,mb|0,lb|0)|0;jb=Dd(lb|0,C|0,kb|0,jb|0)|0;hb=Dd(jb|0,C|0,ib|0,hb|0)|0;f=Dd(hb|0,C|0,fa|0,f|0)|0;f=Dd(f|0,C|0,M|0,p|0)|0;fa=C;p=Hd(M|0,p|0,25)|0;p=Cd(j|0,k|0,p|0,C|0)|0;k=C;j=Dd(ya|0,g|0,16777216,0)|0;j=Ed(j|0,C|0,25)|0;M=C;db=Dd(gb|0,fb|0,eb|0,db|0)|0;bb=Dd(db|0,C|0,cb|0,bb|0)|0;$a=Dd(bb|0,C|0,ab|0,$a|0)|0;Za=Dd($a|0,C|0,_a|0,Za|0)|0;Xa=Dd(Za|0,C|0,Ya|0,Xa|0)|0;Va=Dd(Xa|0,C|0,Wa|0,Va|0)|0;Ta=Dd(Va|0,C|0,Ua|0,Ta|0)|0;Ra=Dd(Ta|0,C|0,Sa|0,Ra|0)|0;i=Dd(Ra|0,C|0,ea|0,i|0)|0;i=Dd(i|0,C|0,j|0,M|0)|0;ea=C;M=Hd(j|0,M|0,25)|0;M=Cd(ya|0,g|0,M|0,C|0)|0;g=C;ya=Dd(f|0,fa|0,33554432,0)|0;ya=Ed(ya|0,C|0,26)|0;j=C;Na=Dd(Qa|0,Pa|0,Oa|0,Na|0)|0;La=Dd(Na|0,C|0,Ma|0,La|0)|0;Ja=Dd(La|0,C|0,Ka|0,Ja|0)|0;Ha=Dd(Ja|0,C|0,Ia|0,Ha|0)|0;Fa=Dd(Ha|0,C|0,Ga|0,Fa|0)|0;Da=Dd(Fa|0,C|0,Ea|0,Da|0)|0;Ba=Dd(Da|0,C|0,Ca|0,Ba|0)|0;za=Dd(Ba|0,C|0,Aa|0,za|0)|0;e=Dd(za|0,C|0,N|0,e|0)|0;e=Dd(e|0,C|0,ya|0,j|0)|0;N=C;j=Hd(ya|0,j|0,26)|0;j=Cd(f|0,fa|0,j|0,C|0)|0;fa=Dd(i|0,ea|0,33554432,0)|0;fa=Ed(fa|0,C|0,26)|0;f=C;ua=Dd(xa|0,wa|0,va|0,ua|0)|0;sa=Dd(ua|0,C|0,ta|0,sa|0)|0;qa=Dd(sa|0,C|0,ra|0,qa|0)|0;oa=Dd(qa|0,C|0,pa|0,oa|0)|0;ma=Dd(oa|0,C|0,na|0,ma|0)|0;ka=Dd(ma|0,C|0,la|0,ka|0)|0;ia=Dd(ka|0,C|0,ja|0,ia|0)|0;ga=Dd(ia|0,C|0,ha|0,ga|0)|0;h=Dd(ga|0,C|0,L|0,h|0)|0;h=Dd(h|0,C|0,fa|0,f|0)|0;L=C;f=Hd(fa|0,f|0,26)|0;f=Cd(i|0,ea|0,f|0,C|0)|0;ea=Dd(e|0,N|0,16777216,0)|0;ea=Ed(ea|0,C|0,25)|0;i=C;b=Dd(ea|0,i|0,r|0,b|0)|0;r=C;i=Hd(ea|0,i|0,25)|0;i=Cd(e|0,N|0,i|0,C|0)|0;N=Dd(h|0,L|0,16777216,0)|0;N=Ed(N|0,C|0,25)|0;e=C;aa=Dd(da|0,ca|0,ba|0,aa|0)|0;_=Dd(aa|0,C|0,$|0,_|0)|0;Y=Dd(_|0,C|0,Z|0,Y|0)|0;W=Dd(Y|0,C|0,X|0,W|0)|0;U=Dd(W|0,C|0,V|0,U|0)|0;S=Dd(U|0,C|0,T|0,S|0)|0;Q=Dd(S|0,C|0,R|0,Q|0)|0;O=Dd(Q|0,C|0,P|0,O|0)|0;d=Dd(O|0,C|0,q|0,d|0)|0;d=Dd(d|0,C|0,N|0,e|0)|0;q=C;e=Hd(N|0,e|0,25)|0;e=Cd(h|0,L|0,e|0,C|0)|0;L=Dd(b|0,r|0,33554432,0)|0;L=Ed(L|0,C|0,26)|0;h=C;g=Dd(M|0,g|0,L|0,h|0)|0;h=Hd(L|0,h|0,26)|0;h=Cd(b|0,r|0,h|0,C|0)|0;r=Dd(d|0,q|0,33554432,0)|0;r=Ed(r|0,C|0,26)|0;b=C;H=Dd(K|0,J|0,I|0,H|0)|0;F=Dd(H|0,C|0,G|0,F|0)|0;D=Dd(F|0,C|0,E|0,D|0)|0;A=Dd(D|0,C|0,B|0,A|0)|0;y=Dd(A|0,C|0,z|0,y|0)|0;w=Dd(y|0,C|0,x|0,w|0)|0;u=Dd(w|0,C|0,v|0,u|0)|0;s=Dd(u|0,C|0,t|0,s|0)|0;l=Dd(s|0,C|0,o|0,l|0)|0;l=Dd(l|0,C|0,r|0,b|0)|0;o=C;b=Hd(r|0,b|0,26)|0;b=Cd(d|0,q|0,b|0,C|0)|0;q=Dd(l|0,o|0,16777216,0)|0;q=Ed(q|0,C|0,25)|0;d=C;r=Od(q|0,d|0,19,0)|0;n=Dd(r|0,C|0,m|0,n|0)|0;m=C;d=Hd(q|0,d|0,25)|0;d=Cd(l|0,o|0,d|0,C|0)|0;o=Dd(n|0,m|0,33554432,0)|0;o=Ed(o|0,C|0,26)|0;l=C;k=Dd(p|0,k|0,o|0,l|0)|0;l=Hd(o|0,l|0,26)|0;l=Cd(n|0,m|0,l|0,C|0)|0;c[a>>2]=l;c[a+4>>2]=k;c[a+8>>2]=j;c[a+12>>2]=i;c[a+16>>2]=h;c[a+20>>2]=g;c[a+24>>2]=f;c[a+28>>2]=e;c[a+32>>2]=b;c[a+36>>2]=d;return}function Kc(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0,fb=0,gb=0;bb=c[b>>2]|0;ua=c[b+4>>2]|0;j=c[b+8>>2]|0;la=c[b+12>>2]|0;e=c[b+16>>2]|0;db=c[b+20>>2]|0;Y=c[b+24>>2]|0;La=c[b+28>>2]|0;h=c[b+32>>2]|0;b=c[b+36>>2]|0;l=bb<<1;p=ua<<1;xa=j<<1;f=la<<1;na=e<<1;b=db<<1;m=y<<1;i=la<<1;ka=db*38|0;ra=y*19|0;va=la*38|0;da=h*19|0;gb=b*38|0;cb=((bb|0)<0)<<31>>31;cb=Od(bb|0,cb|0,bb|0,cb|0)|0;bb=C;o=((l|0)<0)<<31>>31;ta=((ua|0)<0)<<31>>31;Ia=Od(l|0,o|0,ua|0,ta|0)|0;Ha=C;k=((j|0)<0)<<31>>31;Wa=Od(j|0,k|0,l|0,o|0)|0;Va=C;ma=((la|0)<0)<<31>>31;Ua=Od(la|0,ma|0,l|0,o|0)|0;Ta=C;D=((e|0)<0)<<31>>31;Oa=Od(e|0,D|0,l|0,o|0)|0;Na=C;eb=((db|0)<0)<<31>>31;ya=Od(db|0,eb|0,l|0,o|0)|0;xa=C;g=((Y|0)<0)<<31>>31;ga=Od(Y|0,g|0,l|0,o|0)|0;fa=C;Ma=((La|0)<0)<<31>>31;R=Od(La|0,Ma|0,l|0,o|0)|0;Q=C;A=((h|0)<0)<<31>>31;F=Od(h|0,A|0,l|0,o|0)|0;E=C;q=((b|0)<0)<<31>>31;o=Od(b|0,q|0,l|0,o|0)|0;l=C;n=((p|0)<0)<<31>>31;ta=Od(p|0,n|0,ua|0,ta|0)|0;ua=C;ba=Od(p|0,n|0,j|0,k|0)|0;ca=C;P=((f|0)<0)<<31>>31;Sa=Od(f|0,P|0,p|0,n|0)|0;Ra=C;Ca=Od(e|0,D|0,p|0,n|0)|0;Ba=C;d=((B|0)<0)<<31>>31;ia=Od(B|0,d|0,p|0,n|0)|0;ha=C;T=Od(Y|0,g|0,p|0,n|0)|0;S=C;O=((i|0)<0)<<31>>31;H=Od(i|0,O|0,p|0,n|0)|0;G=C;t=Od(h|0,A|0,p|0,n|0)|0;s=C;fb=((gb|0)<0)<<31>>31;n=Od(gb|0,fb|0,p|0,n|0)|0;p=C;Qa=Od(j|0,k|0,j|0,k|0)|0;Pa=C;Ya=((Xa|0)<0)<<31>>31;Aa=Od(Xa|0,Ya|0,la|0,ma|0)|0;za=C;ka=Od(e|0,D|0,Xa|0,Ya|0)|0;ja=C;X=Od(db|0,eb|0,Xa|0,Ya|0)|0;W=C;N=Od(Y|0,g|0,Xa|0,Ya|0)|0;M=C;v=Od(La|0,Ma|0,Xa|0,Ya|0)|0;u=C;ea=((da|0)<0)<<31>>31;Ya=Od(da|0,ea|0,Xa|0,Ya|0)|0;Xa=C;k=Od(gb|0,fb|0,j|0,k|0)|0;j=C;ma=Od(f|0,P|0,la|0,ma|0)|0;la=C;V=Od(f|0,P|0,e|0,D|0)|0;U=C;J=Od(B|0,d|0,f|0,P|0)|0;I=C;z=Od(Y|0,g|0,f|0,P|0)|0;y=C;wa=((va|0)<0)<<31>>31;_a=Od(va|0,wa|0,f|0,P|0)|0;Za=C;Ea=Od(da|0,ea|0,f|0,P|0)|0;Da=C;P=Od(gb|0,fb|0,f|0,P|0)|0;f=C;L=Od(e|0,D|0,e|0,D|0)|0;K=C;oa=((na|0)<0)<<31>>31;x=Od(na|0,oa|0,db|0,eb|0)|0;w=C;sa=((ra|0)<0)<<31>>31;ab=Od(ra|0,sa|0,na|0,oa|0)|0;$a=C;Ga=Od(va|0,wa|0,e|0,D|0)|0;Fa=C;oa=Od(da|0,ea|0,na|0,oa|0)|0;na=C;D=Od(gb|0,fb|0,e|0,D|0)|0;e=C;eb=Od(Ka|0,((Ka|0)<0)<<31>>31|0,db|0,eb|0)|0;db=C;Ka=Od(ra|0,sa|0,B|0,d|0)|0;Ja=C;qa=Od(va|0,wa|0,B|0,d|0)|0;pa=C;_=Od(da|0,ea|0,B|0,d|0)|0;Z=C;d=Od(gb|0,fb|0,B|0,d|0)|0;B=C;sa=Od(ra|0,sa|0,Y|0,g|0)|0;ra=C;aa=Od(va|0,wa|0,Y|0,g|0)|0;$=C;m=Od(da|0,ea|0,m|0,((m|0)<0)<<31>>31|0)|0;r=C;g=Od(gb|0,fb|0,Y|0,g|0)|0;Y=C;Ma=Od(va|0,wa|0,La|0,Ma|0)|0;La=C;wa=Od(da|0,ea|0,i|0,O|0)|0;va=C;O=Od(gb|0,fb|0,i|0,O|0)|0;i=C;ea=Od(da|0,ea|0,h|0,A|0)|0;da=C;A=Od(gb|0,fb|0,h|0,A|0)|0;h=C;q=Od(gb|0,fb|0,b|0,q|0)|0;b=C;bb=Dd(eb|0,db|0,cb|0,bb|0)|0;$a=Dd(bb|0,C|0,ab|0,$a|0)|0;Za=Dd($a|0,C|0,_a|0,Za|0)|0;Xa=Dd(Za|0,C|0,Ya|0,Xa|0)|0;p=Dd(Xa|0,C|0,n|0,p|0)|0;n=C;ua=Dd(Wa|0,Va|0,ta|0,ua|0)|0;ta=C;ca=Dd(Ua|0,Ta|0,ba|0,ca|0)|0;ba=C;Pa=Dd(Sa|0,Ra|0,Qa|0,Pa|0)|0;Na=Dd(Pa|0,C|0,Oa|0,Na|0)|0;La=Dd(Na|0,C|0,Ma|0,La|0)|0;r=Dd(La|0,C|0,m|0,r|0)|0;B=Dd(r|0,C|0,d|0,B|0)|0;d=C;r=Dd(p|0,n|0,33554432,0)|0;r=Ed(r|0,C|0,26)|0;m=C;Ha=Dd(Ka|0,Ja|0,Ia|0,Ha|0)|0;Fa=Dd(Ha|0,C|0,Ga|0,Fa|0)|0;Da=Dd(Fa|0,C|0,Ea|0,Da|0)|0;j=Dd(Da|0,C|0,k|0,j|0)|0;j=Dd(j|0,C|0,r|0,m|0)|0;k=C;m=Hd(r|0,m|0,26)|0;m=Cd(p|0,n|0,m|0,C|0)|0;n=C;p=Dd(B|0,d|0,33554432,0)|0;p=Ed(p|0,C|0,26)|0;r=C;za=Dd(Ca|0,Ba|0,Aa|0,za|0)|0;xa=Dd(za|0,C|0,ya|0,xa|0)|0;va=Dd(xa|0,C|0,wa|0,va|0)|0;Y=Dd(va|0,C|0,g|0,Y|0)|0;Y=Dd(Y|0,C|0,p|0,r|0)|0;g=C;r=Hd(p|0,r|0,26)|0;r=Cd(B|0,d|0,r|0,C|0)|0;d=C;B=Dd(j|0,k|0,16777216,0)|0;B=Ed(B|0,C|0,25)|0;p=C;ra=Dd(ua|0,ta|0,sa|0,ra|0)|0;pa=Dd(ra|0,C|0,qa|0,pa|0)|0;na=Dd(pa|0,C|0,oa|0,na|0)|0;f=Dd(na|0,C|0,P|0,f|0)|0;f=Dd(f|0,C|0,B|0,p|0)|0;P=C;p=Hd(B|0,p|0,25)|0;p=Cd(j|0,k|0,p|0,C|0)|0;k=C;j=Dd(Y|0,g|0,16777216,0)|0;j=Ed(j|0,C|0,25)|0;B=C;ja=Dd(ma|0,la|0,ka|0,ja|0)|0;ha=Dd(ja|0,C|0,ia|0,ha|0)|0;fa=Dd(ha|0,C|0,ga|0,fa|0)|0;da=Dd(fa|0,C|0,ea|0,da|0)|0;i=Dd(da|0,C|0,O|0,i|0)|0;i=Dd(i|0,C|0,j|0,B|0)|0;O=C;B=Hd(j|0,B|0,25)|0;B=Cd(Y|0,g|0,B|0,C|0)|0;g=C;Y=Dd(f|0,P|0,33554432,0)|0;Y=Ed(Y|0,C|0,26)|0;j=C;$=Dd(ca|0,ba|0,aa|0,$|0)|0;Z=Dd($|0,C|0,_|0,Z|0)|0;e=Dd(Z|0,C|0,D|0,e|0)|0;e=Dd(e|0,C|0,Y|0,j|0)|0;D=C;j=Hd(Y|0,j|0,26)|0;j=Cd(f|0,P|0,j|0,C|0)|0;P=Dd(i|0,O|0,33554432,0)|0;P=Ed(P|0,C|0,26)|0;f=C;U=Dd(X|0,W|0,V|0,U|0)|0;S=Dd(U|0,C|0,T|0,S|0)|0;Q=Dd(S|0,C|0,R|0,Q|0)|0;h=Dd(Q|0,C|0,A|0,h|0)|0;h=Dd(h|0,C|0,P|0,f|0)|0;A=C;f=Hd(P|0,f|0,26)|0;f=Cd(i|0,O|0,f|0,C|0)|0;O=Dd(e|0,D|0,16777216,0)|0;O=Ed(O|0,C|0,25)|0;i=C;d=Dd(O|0,i|0,r|0,d|0)|0;r=C;i=Hd(O|0,i|0,25)|0;i=Cd(e|0,D|0,i|0,C|0)|0;D=Dd(h|0,A|0,16777216,0)|0;D=Ed(D|0,C|0,25)|0;e=C;K=Dd(N|0,M|0,L|0,K|0)|0;I=Dd(K|0,C|0,J|0,I|0)|0;G=Dd(I|0,C|0,H|0,G|0)|0;E=Dd(G|0,C|0,F|0,E|0)|0;b=Dd(E|0,C|0,q|0,b|0)|0;b=Dd(b|0,C|0,D|0,e|0)|0;q=C;e=Hd(D|0,e|0,25)|0;e=Cd(h|0,A|0,e|0,C|0)|0;A=Dd(d|0,r|0,33554432,0)|0;A=Ed(A|0,C|0,26)|0;h=C;g=Dd(B|0,g|0,A|0,h|0)|0;h=Hd(A|0,h|0,26)|0;h=Cd(d|0,r|0,h|0,C|0)|0;r=Dd(b|0,q|0,33554432,0)|0;r=Ed(r|0,C|0,26)|0;d=C;w=Dd(z|0,y|0,x|0,w|0)|0;u=Dd(w|0,C|0,v|0,u|0)|0;s=Dd(u|0,C|0,t|0,s|0)|0;l=Dd(s|0,C|0,o|0,l|0)|0;l=Dd(l|0,C|0,r|0,d|0)|0;o=C;d=Hd(r|0,d|0,26)|0;d=Cd(b|0,q|0,d|0,C|0)|0;q=Dd(l|0,o|0,16777216,0)|0;q=Ed(q|0,C|0,25)|0;b=C;r=Od(q|0,b|0,19,0)|0;n=Dd(r|0,C|0,m|0,n|0)|0;m=C;b=Hd(q|0,b|0,25)|0;b=Cd(l|0,o|0,b|0,C|0)|0;o=Dd(n|0,m|0,33554432,0)|0;o=Ed(o|0,C|0,26)|0;l=C;k=Dd(p|0,k|0,o|0,l|0)|0;l=Hd(o|0,l|0,26)|0;l=Cd(n|0,m|0,l|0,C|0)|0;c[a>>2]=l;c[a+4>>2]=k;c[a+8>>2]=j;c[a+12>>2]=i;c[a+16>>2]=h;c[a+20>>2]=g;c[a+24>>2]=f;c[a+28>>2]=e;c[a+32>>2]=d;c[a+36>>2]=b;return}function Lc(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;m=c[d>>2]|0;l=c[d+4>>2]|0;k=c[d+8>>2]|0;j=c[d+12>>2]|0;i=c[d+16>>2]|0;h=c[d+20>>2]|0;g=c[d+24>>2]|0;f=c[d+28>>2]|0;o=c[d+32>>2]|0;e=c[d+36>>2]|0;m=(((((((((((((e*19|0)+16777216>>25)+m>>26)+l>>25)+k>>26)+j>>25)+i>>26)+h>>25)+g>>26)+f>>25)+o>>26)+e>>25)*19|0)+m|0;n=m>>26;l=n+l|0;n=m-(n<<26)|0;m=l>>25;k=m+k|0;m=l-(m<<25)|0;l=k>>26;j=l+j|0;l=k-(l<<26)|0;k=j>>25;i=k+i|0;k=j-(k<<25)|0;j=i>>26;h=j+h|0;j=i-(j<<26)|0;i=h>>25;g=i+g|0;i=h-(i<<25)|0;h=g>>26;f=h+f|0;h=g-(h<<26)|0;g=f>>25;d=g+o|0;g=f-(g<<25)|0;f=d>>26;e=f+e|0;f=d-(f<<26)|0;d=e&33554431;a[b>>0]=n;a[b+1>>0]=n>>>8;a[b+2>>0]=n>>>16;a[b+3>>0]=m<<2|n>>>24;a[b+4>>0]=m>>>6;a[b+5>>0]=m>>>14;a[b+6>>0]=l<<3|m>>>22;a[b+7>>0]=l>>>5;a[b+8>>0]=l>>>13;a[b+9>>0]=k<<5|l>>>21;a[b+10>>0]=k>>>3;a[b+11>>0]=k>>>11;a[b+12>>0]=j<<6|k>>>19;a[b+13>>0]=j>>>2;a[b+14>>0]=j>>>10;a[b+15>>0]=j>>>18;a[b+16>>0]=i;a[b+17>>0]=i>>>8;a[b+18>>0]=i>>>16;a[b+19>>0]=h<<1|i>>>24;a[b+20>>0]=h>>>7;a[b+21>>0]=h>>>15;a[b+22>>0]=g<<3|h>>>23;a[b+23>>0]=g>>>5;a[b+24>>0]=g>>>13;a[b+25>>0]=f<<4|g>>>21;a[b+26>>0]=f>>>4;a[b+27>>0]=f>>>12;a[b+28>>0]=f>>>20|d<<6;a[b+29>>0]=e>>>2;a[b+30>>0]=e>>>10;a[b+31>>0]=d>>>18;return}function Mc(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0;V=b+40|0;j=b+44|0;m=b+48|0;p=b+52|0;s=b+56|0;v=b+60|0;y=b+64|0;B=b+68|0;E=b+72|0;C=b+76|0;S=b+4|0;P=b+8|0;e=b+12|0;l=b+16|0;n=b+20|0;u=b+24|0;w=b+28|0;D=b+32|0;O=b+36|0;ga=(c[S>>2]|0)+(c[j>>2]|0)|0;fa=(c[P>>2]|0)+(c[m>>2]|0)|0;ea=(c[e>>2]|0)+(c[p>>2]|0)|0;da=(c[l>>2]|0)+(c[s>>2]|0)|0;ca=(c[n>>2]|0)+(c[v>>2]|0)|0;ba=(c[u>>2]|0)+(c[y>>2]|0)|0;aa=(c[w>>2]|0)+(c[B>>2]|0)|0;$=(c[D>>2]|0)+(c[E>>2]|0)|0;Y=(c[O>>2]|0)+(c[C>>2]|0)|0;c[a>>2]=(c[b>>2]|0)+(c[V>>2]|0);ha=a+4|0;c[ha>>2]=ga;ga=a+8|0;c[ga>>2]=fa;fa=a+12|0;c[fa>>2]=ea;ea=a+16|0;c[ea>>2]=da;da=a+20|0;c[da>>2]=ca;ca=a+24|0;c[ca>>2]=ba;ba=a+28|0;c[ba>>2]=aa;aa=a+32|0;c[aa>>2]=$;$=a+36|0;c[$>>2]=Y;Y=a+40|0;S=(c[j>>2]|0)-(c[S>>2]|0)|0;P=(c[m>>2]|0)-(c[P>>2]|0)|0;e=(c[p>>2]|0)-(c[e>>2]|0)|0;l=(c[s>>2]|0)-(c[l>>2]|0)|0;n=(c[v>>2]|0)-(c[n>>2]|0)|0;u=(c[y>>2]|0)-(c[u>>2]|0)|0;w=(c[B>>2]|0)-(c[w>>2]|0)|0;D=(c[E>>2]|0)-(c[D>>2]|0)|0;O=(c[C>>2]|0)-(c[O>>2]|0)|0;c[Y>>2]=(c[V>>2]|0)-(c[b>>2]|0);V=a+44|0;c[V>>2]=S;S=a+48|0;c[S>>2]=P;P=a+52|0;c[P>>2]=e;e=a+56|0;c[e>>2]=l;l=a+60|0;c[l>>2]=n;n=a+64|0;c[n>>2]=u;u=a+68|0;c[u>>2]=w;w=a+72|0;c[w>>2]=D;D=a+76|0;c[D>>2]=O;O=a+80|0;Jc(O,a,d);Jc(Y,Y,d+40|0);C=a+120|0;Jc(C,d+120|0,b+120|0);Jc(a,b+80|0,d+80|0);E=c[a>>2]<<1;b=c[ha>>2]<<1;y=c[ga>>2]<<1;v=c[fa>>2]<<1;s=c[ea>>2]<<1;p=c[da>>2]<<1;m=c[ca>>2]<<1;j=c[ba>>2]<<1;g=c[aa>>2]<<1;b=c[$>>2]<<1;z=c[o>>2]|0;N=a+84|0;W=c[N>>2]|0;M=a+88|0;T=c[M>>2]|0;L=a+92|0;Q=c[L>>2]|0;K=a+96|0;f=c[K>>2]|0;J=a+100|0;h=c[J>>2]|0;I=a+104|0;o=c[I>>2]|0;H=a+108|0;q=c[H>>2]|0;G=a+112|0;x=c[G>>2]|0;F=a+116|0;z=c[F>>2]|0;_=c[Y>>2]|0;X=c[V>>2]|0;U=c[S>>2]|0;R=c[P>>2]|0;d=c[e>>2]|0;i=c[l>>2]|0;k=c[n>>2]|0;r=c[u>>2]|0;t=c[w>>2]|0;A=c[D>>2]|0;c[a>>2]=Z-_;c[ha>>2]=W-X;c[ga>>2]=T-U;c[fa>>2]=Q-R;c[ea>>2]=f-d;c[da>>2]=h-i;c[ca>>2]=o-k;c[ba>>2]=q-r;c[aa>>2]=x-t;c[$>>2]=z-A;c[Y>>2]=_+Z;c[V>>2]=X+W;c[S>>2]=U+T;c[P>>2]=R+Q;c[e>>2]=d+f;c[l>>2]=i+h;c[n>>2]=k+o;c[u>>2]=r+q;c[w>>2]=t+x;c[D>>2]=A+z;D=c[C>>2]|0;z=a+124|0;A=c[z>>2]|0;w=a+128|0;x=c[w>>2]|0;t=a+132|0;u=c[t>>2]|0;q=a+136|0;r=c[q>>2]|0;n=a+140|0;o=c[n>>2]|0;k=a+144|0;l=c[k>>2]|0;h=a+148|0;i=c[h>>2]|0;e=a+152|0;f=c[e>>2]|0;a=a+156|0;d=c[a>>2]|0;c[O>>2]=D+E;c[N>>2]=A+B;c[M>>2]=x+y;c[L>>2]=u+v;c[K>>2]=r+s;c[J>>2]=o+p;c[I>>2]=l+m;c[H>>2]=i+j;c[G>>2]=f+g;c[F>>2]=d+b;c[C>>2]=E-D;c[z>>2]=B-A;c[w>>2]=y-x;c[t>>2]=v-u;c[q>>2]=s-r;c[n>>2]=p-o;c[k>>2]=m-l;c[h>>2]=j-i;c[e>>2]=g-f;c[a>>2]=b-d;return} function Ha(a){a=a|0;var b=0;b=i;i=i+a|0;i=i+15&-16;return b|0}function Ia(){return i|0}function Ja(a){a=a|0;i=a}function Ka(a,b){a=a|0;b=b|0;i=a;j=b}function La(a,b){a=a|0;b=b|0;if(!n){n=a;o=b}}function Ma(b){b=b|0;a[k>>0]=a[b>>0];a[k+1>>0]=a[b+1>>0];a[k+2>>0]=a[b+2>>0];a[k+3>>0]=a[b+3>>0]}function Na(b){b=b|0;a[k>>0]=a[b>>0];a[k+1>>0]=a[b+1>>0];a[k+2>>0]=a[b+2>>0];a[k+3>>0]=a[b+3>>0];a[k+4>>0]=a[b+4>>0];a[k+5>>0]=a[b+5>>0];a[k+6>>0]=a[b+6>>0];a[k+7>>0]=a[b+7>>0]}function Oa(a){a=a|0;C=a}function Pa(){return C|0}function Qa(){return 32}function Ra(){return 32}function Sa(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;Ua(a,b,c,d,e);return 0}function Ta(b,c,d,e,f){b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;h=i;i=i+32|0;g=h;Ua(g,c,d,e,f);d=Yc(b,g)|0;e=(g|0)==(b|0);c=0;f=0;do{c=a[b+f>>0]^a[g+f>>0]|c;f=f+1|0}while((f|0)!=32);i=h;return (e?-1:d)|(((c&255)+511|0)>>>8&1)+-1|0}function Ua(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;s=i;i=i+608|0;r=s+480|0;o=s+416|0;n=s;j=n+64|0;c[j>>2]=0;c[j+4>>2]=0;c[j+8>>2]=0;c[j+12>>2]=0;h=n;k=8;l=h+64|0;do{c[h>>2]=c[k>>2];h=h+4|0;k=k+4|0}while((h|0)<(l|0));h=r;l=h+128|0;do{a[h>>0]=54;h=h+1|0}while((h|0)<(l|0));a[r>>0]=a[g>>0]^54;h=1;do{q=r+h|0;a[q>>0]=a[q>>0]^a[g+h>>0];h=h+1|0}while((h|0)!=32);h=n+72|0;c[h>>2]=1024;c[h+4>>2]=0;c[j>>2]=0;c[j+4>>2]=0;j=n+80|0;h=j;k=r;l=h+128|0;do{a[h>>0]=a[k>>0]|0;h=h+1|0;k=k+1|0}while((h|0)<(l|0));hb(n,j);j=a[g>>0]|0;q=n+208|0;m=n+272|0;c[m>>2]=0;c[m+4>>2]=0;c[m+8>>2]=0;c[m+12>>2]=0;h=q;k=8;l=h+64|0;do{c[h>>2]=c[k>>2];h=h+4|0;k=k+4|0}while((h|0)<(l|0));h=r;l=h+128|0;do{a[h>>0]=92;h=h+1|0}while((h|0)<(l|0));a[r>>0]=j^92;h=1;do{p=r+h|0;a[p>>0]=a[p>>0]^a[g+h>>0];h=h+1|0}while((h|0)!=32);j=n+280|0;p=j;c[p>>2]=1024;c[p+4>>2]=0;p=m;c[p>>2]=0;c[p+4>>2]=0;p=n+288|0;h=p;k=r;l=h+128|0;do{a[h>>0]=a[k>>0]|0;h=h+1|0;k=k+1|0}while((h|0)<(l|0));hb(q,p);fb(n,d,e,f);gb(n,o);f=j;d=c[f>>2]|0;f=c[f+4>>2]|0;k=Gd(d|0,f|0,3)|0;k=k&127;h=Dd(d|0,f|0,512,0)|0;c[j>>2]=h;c[j+4>>2]=C;j=m;h=c[j>>2]|0;j=c[j+4>>2]|0;if(f>>>0>4294967295|(f|0)==-1&d>>>0>4294966783){h=Dd(h|0,j|0,1,0)|0;j=C;d=m;c[d>>2]=h;c[d+4>>2]=j}g=m;c[g>>2]=h;c[g+4>>2]=j;j=Cd(128,0,k|0,0)|0;g=C;h=n+288+k|0;if(g>>>0>0|(g|0)==0&j>>>0>64){k=o;l=h+64|0;do{a[h>>0]=a[k>>0]|0;h=h+1|0;k=k+1|0}while((h|0)<(l|0));gb(q,r);h=b;k=r;l=h+32|0;do{a[h>>0]=a[k>>0]|0;h=h+1|0;k=k+1|0}while((h|0)<(l|0));i=s;return}id(h|0,o|0,j|0)|0;hb(q,p);h=o+j|0;j=cd(64,0,j|0,g|0)|0;g=c;if(g>>>0>0|(g|0)==0&j>>>0>127)do{Hb(q,h);h=h+128|0;j=Dd(j|0,g|0,-128,-1)|0;g=C}while(g>>>0>0|(g|0)==0&j>>>0>127);Id(p|0,h|0,j|0)|0;Gb(q,r);h=b;k=r;l=h+32|0;do{a[h>>0]=a[k>>0]|0;h=h+1|0;k=k+1|0}while((h|0)<(l|0));i=s;return}function va(){return="" 32}function="" wa(){return="" xa(){return="" ya(){return="" za(){return="" 24}function="" _a(){return="" 16}function="" $a(b,d,e){b="b|0;d=d|0;e=e|0;var" f="0,g=0,h=0,j=0,k=0,l=0,m=0;k=i;i=i+272|0;h=k;g=k+208|0;f=h+64|0;j=h;l=8;m=j+64|0;do{c[j">>2]=c[l>>2];j=j+4|0;l=l+4|0}while((j|0)<(m|0));j=h+72|0;c[j>>2]=256;c[j+4>>2]=0;j=f;c[j>>2]=0;c[j+4>>2]=0;j=h+80|0;l=e;m=j+32|0;do{a[j>>0]=a[l>>0]|0;j=j+1|0;l=l+1|0}while((j|0)<(m|0));gb(h,g);j=d;l=g;m=j+32|0;do{a[j>>0]=a[l>>0]|0;j=j+1|0;l=l+1|0}while((j|0)<(m|0));md(b,d,33785);i=k;return 0}function="" ab(b,c){b="b|0;c=c|0;var" d="0;d=0;do{a[c+d">>0]=Ba(0)|0;d=d+1|0}while((d|0)!=32);md(b,c,33785);return 0}function bb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=i;i=i+32|0;e=d;md(e,c,b);nb(a,32576,e,32592);i=d;return 0}function cb(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;rc(a,b,c,d,e,f,g)|0;return 0}function db(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0;j=i;i=i+64|0;l=j+32|0;k=j;md(l,h,g);nb(k,32576,l,32592);rc(a,b,c,d,e,f,k)|0;i=j;return 0}function eb(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;if(d>>>0>0|(d|0)==0&c>>>0>4294967279){e=-1;return e|0}rc(a+16|0,a,b,c,d,e,f)|0;e=0;return e|0}function fb(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0;k=i;i=i+64|0;j=k+32|0;h=k;if(d>>>0>0|(d|0)==0&c>>>0>4294967279){g=-1;i=k;return g|0}md(j,g,f);nb(h,32576,j,32592);rc(a+16|0,a,b,c,d,e,h)|0;g=0;i=k;return g|0}function gb(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;return tc(a,b,c,d,e,f,g)|0}function hb(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0;j=i;i=i+64|0;l=j+32|0;k=j;md(l,h,g);nb(k,32576,l,32592);h=tc(a,b,c,d,e,f,k)|0;i=j;return h|0}function ib(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;if(d>>>0<0|(d|0)==0&c>>>0<16){e=-1;return e|0}d="Dd(c|0,d|0,-16,-1)|0;e=tc(a,b+16|0,b,d,C,e,f)|0;return" e|0}function="" jb(a,b,c,d,e,f,g){a="a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;var" h="0,j=0,k=0;k=i;i=i+64|0;j=k+32|0;h=k;if(d">>>0<0|(d|0)==0&c>>>0<16){g=-1;i=k;return g|0}c="Dd(c|0,d|0,-16,-1)|0;d=C;md(j,g,f);nb(h,32576,j,32592);g=tc(a,b+16|0,b,c,d,e,h)|0;i=k;return" g|0}function="" kb(b,d,e,f,g){b="b|0;d=d|0;e=e|0;f=f|0;g=g|0;var" h="0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;A=i;v=i=i+63&-64;i=i+480|0;y=v;w=v+448|0;x=v+424|0;j=v+392|0;v=v+360|0;h=0;do{a[v+h">>0]=Ba(0)|0;h=h+1|0}while((h|0)!=32);md(j,v,33785);h=b;o=j;p=h+32|0;do{a[h>>0]=a[o>>0]|0;h=h+1|0;o=o+1|0}while((h|0)<(p|0));fd(y|0,0,357)|0;q=y;c[q>>2]=-222443248;c[q+4>>2]=1779033703;q=y+8|0;c[q>>2]=-2067093701;c[q+4>>2]=-1150833019;q=y+16|0;c[q>>2]=-23791573;c[q+4>>2]=1013904242;q=y+24|0;c[q>>2]=1595750129;c[q+4>>2]=-1521486534;q=y+32|0;c[q>>2]=-1377402159;c[q+4>>2]=1359893119;q=y+40|0;c[q>>2]=725511199;c[q+4>>2]=-1694144372;q=y+48|0;c[q>>2]=-79577749;c[q+4>>2]=528734635;q=y+56|0;c[q>>2]=327033209;c[q+4>>2]=1541459225;q=y+352|0;r=y+96|0;s=y+64|0;t=y+72|0;u=y+224|0;h=0;m=0;n=32;while(1){l=256-h|0;h=y+96+h|0;if(!(m>>>0>0|(m|0)==0&n>>>0>l>>>0)){z=5;break}Id(h|0,j|0,l|0)|0;c[q>>2]=(c[q>>2]|0)+l;p=s;h=c[p>>2]|0;p=c[p+4>>2]|0;k=Dd(h|0,p|0,128,0)|0;o=s;c[o>>2]=k;c[o+4>>2]=C;o=t;o=Dd((p>>>0>4294967295|(p|0)==-1&h>>>0>4294967167)&1|0,0,c[o>>2]|0,c[o+4>>2]|0)|0;h=t;c[h>>2]=o;c[h+4>>2]=C;Ab(y,r);h=r;o=u;p=h+128|0;do{c[h>>2]=c[o>>2];h=h+4|0;o=o+4|0}while((h|0)<(p|0));h=(c[q>>2]|0)+-128|0;c[q>>2]=h;k=Cd(n|0,m|0,l|0,0)|0;if((n|0)==(l|0)&(m|0)==0){n=g;l=0;m=32;break}else{j=j+l|0;m=C;n=k}}if((z|0)==5){Id(h|0,j|0,n|0)|0;h=Dd(c[q>>2]|0,0,n|0,m|0)|0;c[q>>2]=h;n=g;l=0;m=32}while(1){k=256-h|0;h=y+96+h|0;if(!(l>>>0>0|(l|0)==0&m>>>0>k>>>0)){z=8;break}Id(h|0,n|0,k|0)|0;c[q>>2]=(c[q>>2]|0)+k;p=s;h=c[p>>2]|0;p=c[p+4>>2]|0;j=Dd(h|0,p|0,128,0)|0;o=s;c[o>>2]=j;c[o+4>>2]=C;o=t;o=Dd((p>>>0>4294967295|(p|0)==-1&h>>>0>4294967167)&1|0,0,c[o>>2]|0,c[o+4>>2]|0)|0;h=t;c[h>>2]=o;c[h+4>>2]=C;Ab(y,r);h=r;o=u;p=h+128|0;do{c[h>>2]=c[o>>2];h=h+4|0;o=o+4|0}while((h|0)<(p|0));h=(c[q>>2]|0)+-128|0;c[q>>2]=h;j=Cd(m|0,l|0,k|0,0)|0;if((m|0)==(k|0)&(l|0)==0)break;else{n=n+k|0;l=C;m=j}}if((z|0)==8){Id(h|0,n|0,m|0)|0;z=Dd(c[q>>2]|0,0,m|0,l|0)|0;c[q>>2]=z}zb(y,x,24)|0;if(f>>>0>0|(f|0)==0&e>>>0>4294967279){z=-1;i=A;return z|0}md(y,v,g);nb(w,32576,y,32592);rc(b+48|0,b+32|0,d,e,f,x,w)|0;z=0;i=A;return z|0}function lb(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;y=i;v=i=i+63&-64;i=i+416|0;w=v;u=v+384|0;v=v+360|0;if(e>>>0<0|(e|0)==0&d>>>0<48){x=-1;i=y;return x|0}fd(w|0,0,357)|0;p="w;c[p">>2]=-222443248;c[p+4>>2]=1779033703;p=w+8|0;c[p>>2]=-2067093701;c[p+4>>2]=-1150833019;p=w+16|0;c[p>>2]=-23791573;c[p+4>>2]=1013904242;p=w+24|0;c[p>>2]=1595750129;c[p+4>>2]=-1521486534;p=w+32|0;c[p>>2]=-1377402159;c[p+4>>2]=1359893119;p=w+40|0;c[p>>2]=725511199;c[p+4>>2]=-1694144372;p=w+48|0;c[p>>2]=-79577749;c[p+4>>2]=528734635;p=w+56|0;c[p>>2]=327033209;c[p+4>>2]=1541459225;p=w+352|0;q=w+96|0;r=w+64|0;s=w+72|0;t=w+224|0;k=b;h=0;m=0;n=32;while(1){l=256-h|0;h=w+96+h|0;if(!(m>>>0>0|(m|0)==0&n>>>0>l>>>0)){x=4;break}Id(h|0,k|0,l|0)|0;c[p>>2]=(c[p>>2]|0)+l;o=r;h=c[o>>2]|0;o=c[o+4>>2]|0;z=Dd(h|0,o|0,128,0)|0;j=r;c[j>>2]=z;c[j+4>>2]=C;j=s;j=Dd((o>>>0>4294967295|(o|0)==-1&h>>>0>4294967167)&1|0,0,c[j>>2]|0,c[j+4>>2]|0)|0;h=s;c[h>>2]=j;c[h+4>>2]=C;Ab(w,q);h=q;j=t;o=h+128|0;do{c[h>>2]=c[j>>2];h=h+4|0;j=j+4|0}while((h|0)<(o|0));h=(c[p>>2]|0)+-128|0;c[p>>2]=h;j=Cd(n|0,m|0,l|0,0)|0;if((n|0)==(l|0)&(m|0)==0){l=0;m=32;break}else{k=k+l|0;m=C;n=j}}if((x|0)==4){Id(h|0,k|0,n|0)|0;h=Dd(c[p>>2]|0,0,n|0,m|0)|0;c[p>>2]=h;l=0;m=32}while(1){k=256-h|0;h=w+96+h|0;if(!(l>>>0>0|(l|0)==0&m>>>0>k>>>0)){x=7;break}Id(h|0,f|0,k|0)|0;c[p>>2]=(c[p>>2]|0)+k;o=r;h=c[o>>2]|0;o=c[o+4>>2]|0;z=Dd(h|0,o|0,128,0)|0;j=r;c[j>>2]=z;c[j+4>>2]=C;j=s;j=Dd((o>>>0>4294967295|(o|0)==-1&h>>>0>4294967167)&1|0,0,c[j>>2]|0,c[j+4>>2]|0)|0;h=s;c[h>>2]=j;c[h+4>>2]=C;Ab(w,q);h=q;j=t;o=h+128|0;do{c[h>>2]=c[j>>2];h=h+4|0;j=j+4|0}while((h|0)<(o|0));h=(c[p>>2]|0)+-128|0;c[p>>2]=h;j=Cd(m|0,l|0,k|0,0)|0;if((m|0)==(k|0)&(l|0)==0)break;else{f=f+k|0;l=C;m=j}}if((x|0)==7){Id(h|0,f|0,m|0)|0;z=Dd(c[p>>2]|0,0,m|0,l|0)|0;c[p>>2]=z}zb(w,v,24)|0;if((d&-16|0)==32&(e|0)==0){z=-1;i=y;return z|0}x=Dd(d|0,e|0,-48,-1)|0;z=C;md(w,g,b);nb(u,32576,w,32592);z=tc(a,b+48|0,b+32|0,x,z,v,u)|0;i=y;return z|0}function mb(){return 48}function nb(b,c,e,f){b=b|0;c=c|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0;k=20;l=(d[f+1>>0]|0)<<8|(d[f>>0]|0)|(d[f+2>>0]|0)<<16|(d[f+3>>0]|0)<<24;m=(d[e+1>>0]|0)<<8|(d[e>>0]|0)|(d[e+2>>0]|0)<<16|(d[e+3>>0]|0)<<24;n=(d[f+9>>0]|0)<<8|(d[f+8>>0]|0)|(d[f+10>>0]|0)<<16|(d[f+11>>0]|0)<<24;o=(d[e+17>>0]|0)<<8|(d[e+16>>0]|0)|(d[e+18>>0]|0)<<16|(d[e+19>>0]|0)<<24;p=(d[e+21>>0]|0)<<8|(d[e+20>>0]|0)|(d[e+22>>0]|0)<<16|(d[e+23>>0]|0)<<24;q=(d[e+25>>0]|0)<<8|(d[e+24>>0]|0)|(d[e+26>>0]|0)<<16|(d[e+27>>0]|0)<<24;r=(d[e+29>>0]|0)<<8|(d[e+28>>0]|0)|(d[e+30>>0]|0)<<16|(d[e+31>>0]|0)<<24;s=(d[f+13>>0]|0)<<8|(d[f+12>>0]|0)|(d[f+14>>0]|0)<<16|(d[f+15>>0]|0)<<24;t=(d[e+5>>0]|0)<<8|(d[e+4>>0]|0)|(d[e+6>>0]|0)<<16|(d[e+7>>0]|0)<<24;u=(d[e+9>>0]|0)<<8|(d[e+8>>0]|0)|(d[e+10>>0]|0)<<16|(d[e+11>>0]|0)<<24;j=(d[e+13>>0]|0)<<8|(d[e+12>>0]|0)|(d[e+14>>0]|0)<<16|(d[e+15>>0]|0)<<24;f=(d[f+5>>0]|0)<<8|(d[f+4>>0]|0)|(d[f+6>>0]|0)<<16|(d[f+7>>0]|0)<<24;g=(d[c+1>>0]|0)<<8|(d[c>>0]|0)|(d[c+2>>0]|0)<<16|(d[c+3>>0]|0)<<24;h=(d[c+5>>0]|0)<<8|(d[c+4>>0]|0)|(d[c+6>>0]|0)<<16|(d[c+7>>0]|0)<<24;i=(d[c+9>>0]|0)<<8|(d[c+8>>0]|0)|(d[c+10>>0]|0)<<16|(d[c+11>>0]|0)<<24;e=(d[c+13>>0]|0)<<8|(d[c+12>>0]|0)|(d[c+14>>0]|0)<<16|(d[c+15>>0]|0)<<24;while(1){d=p+l|0;d=(d>>>25|D<<7)^j;a=d+l|0;a=(a>>>23|A<<9)^i;x=a+d|0;x=(x>>>19|x<<13)^p;g=x+a|0;g=(g>>>14|G<<18)^l;z=f+m|0;z=e^(z>>>25|z<<7);w=z+f|0;w=q^(w>>>23|w<<9);j=w+z|0;j=(j>>>19|J<<13)^m;c=j+w|0;c=(c>>>14|C<<18)^f;v=n+g|0;v=r^(v>>>25|v<<7);i=v+n|0;i=(i>>>23|I<<9)^t;f=i+v|0;f=(f>>>19|F<<13)^g;y=f+i|0;y=(y>>>14|y<<18)^n;h=s+o|0;h=(h>>>25|H<<7)^u;e=h+s|0;e=(e>>>23|E<<9)^h;b=e+h|0;b=(b>>>19|B<<13)^o;c=b+e|0;c=(c>>>14|c<<18)^s;k=g+h|0;m=(k>>>25|K<<7)^j;j=m+g|0;t=(j>>>23|J<<9)^i;i=t+m|0;u=(i>>>19|I<<13)^h;h=u+t|0;l=(h>>>14|H<<18)^g;g=c+d|0;g=(g>>>25|G<<7)^f;f=g+c|0;h=(f>>>23|F<<9)^e;e=h+g|0;j=(e>>>19|E<<13)^d;d=j+h|0;f=(d>>>14|D<<18)^c;c=y+z|0;o=(c>>>25|C<<7)^b;b=o+y|0;i=(b>>>23|B<<9)^a;a=i+o|0;e=(a>>>19|A<<13)^z;z=e+i|0;n=(z>>>14|z<<18)^y;y=c+v|0;p=(y>>>25|y<<7)^x;x=p+c|0;q=(x>>>23|x<<9)^w;w=q+p|0;r=(w>>>19|w<<13)^v;v=r+q|0;s=(v>>>14|v<<18)^c;if((k|0)<=2)break;else k="k+-2|0}a[b">>0]=l;a[b+1>>0]=l>>>8;a[b+2>>0]=l>>>16;a[b+3>>0]=l>>>24;a[b+4>>0]=f;a[b+5>>0]=f>>>8;a[b+6>>0]=f>>>16;a[b+7>>0]=f>>>24;a[b+8>>0]=n;a[b+9>>0]=n>>>8;a[b+10>>0]=n>>>16;a[b+11>>0]=n>>>24;a[b+12>>0]=s;a[b+13>>0]=s>>>8;a[b+14>>0]=s>>>16;a[b+15>>0]=s>>>24;a[b+16>>0]=g;a[b+17>>0]=g>>>8;a[b+18>>0]=g>>>16;a[b+19>>0]=g>>>24;a[b+20>>0]=h;a[b+21>>0]=h>>>8;a[b+22>>0]=h>>>16;a[b+23>>0]=h>>>24;a[b+24>>0]=i;a[b+25>>0]=i>>>8;a[b+26>>0]=i>>>16;a[b+27>>0]=i>>>24;a[b+28>>0]=e;a[b+29>>0]=e>>>8;a[b+30>>0]=e>>>16;a[b+31>>0]=e>>>24;return}function ob(b,c,e,f){b=b|0;c=c|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0;F=(d[f+1>>0]|0)<<8|(d[f>>0]|0)|(d[f+2>>0]|0)<<16|(d[f+3>>0]|0)<<24;g=(d[e+1>>0]|0)<<8|(d[e>>0]|0)|(d[e+2>>0]|0)<<16|(d[e+3>>0]|0)<<24;h=(d[e+5>>0]|0)<<8|(d[e+4>>0]|0)|(d[e+6>>0]|0)<<16|(d[e+7>>0]|0)<<24;i=(d[e+9>>0]|0)<<8|(d[e+8>>0]|0)|(d[e+10>>0]|0)<<16|(d[e+11>>0]|0)<<24;j=(d[e+13>>0]|0)<<8|(d[e+12>>0]|0)|(d[e+14>>0]|0)<<16|(d[e+15>>0]|0)<<24;b=(d[f+5>>0]|0)<<8|(d[f+4>>0]|0)|(d[f+6>>0]|0)<<16|(d[f+7>>0]|0)<<24;c=(d[c+1>>0]|0)<<8|(d[c>>0]|0)|(d[c+2>>0]|0)<<16|(d[c+3>>0]|0)<<24;d=(d[c+5>>0]|0)<<8|(d[c+4>>0]|0)|(d[c+6>>0]|0)<<16|(d[c+7>>0]|0)<<24;e=(d[c+9>>0]|0)<<8|(d[c+8>>0]|0)|(d[c+10>>0]|0)<<16|(d[c+11>>0]|0)<<24;w=(d[c+13>>0]|0)<<8|(d[c+12>>0]|0)|(d[c+14>>0]|0)<<16|(d[c+15>>0]|0)<<24;x=(d[f+9>>0]|0)<<8|(d[f+8>>0]|0)|(d[f+10>>0]|0)<<16|(d[f+11>>0]|0)<<24;y=(d[e+17>>0]|0)<<8|(d[e+16>>0]|0)|(d[e+18>>0]|0)<<16|(d[e+19>>0]|0)<<24;z=(d[e+21>>0]|0)<<8|(d[e+20>>0]|0)|(d[e+22>>0]|0)<<16|(d[e+23>>0]|0)<<24;a=(d[e+25>>0]|0)<<8|(d[e+24>>0]|0)|(d[e+26>>0]|0)<<16|(d[e+27>>0]|0)<<24;v=(d[e+29>>0]|0)<<8|(d[e+28>>0]|0)|(d[e+30>>0]|0)<<16|(d[e+31>>0]|0)<<24;c=(d[f+13>>0]|0)<<8|(d[f+12>>0]|0)|(d[f+14>>0]|0)<<16|(d[f+15>>0]|0)<<24;e=20;f=f;g=g;h=x;i=y;j=z;k=a;l=v;m=c;n=h;o=i;p=j;q=b;r=c;s=d;t=e;u=w;while(1){t=f+j|0;t=(t>>>25|T<<7)^p;q=t+f|0;q=(q>>>23|Q<<9)^t;n=q+t|0;n=(n>>>19|N<<13)^j;w=n+q|0;w=(w>>>14|W<<18)^f;p=g+q|0;p=(p>>>25|P<<7)^u;m=p+q|0;m=(m>>>23|M<<9)^k;z=m+p|0;z=(z>>>19|Z<<13)^g;s=z+m|0;s=(s>>>14|S<<18)^q;l=r+h|0;l=(l>>>25|L<<7)^l;y=l+h|0;y=(y>>>23|Y<<9)^n;v=y+l|0;v=(v>>>19|V<<13)^r;o=v+y|0;o=(o>>>14|O<<18)^h;x=i+m|0;x=o^(x>>>25|X<<7);u=x+m|0;u=(u>>>23|U<<9)^s;r=u+x|0;r=(r>>>19|R<<13)^i;k=r+u|0;k=(k>>>14|K<<18)^m;_=w+x|0;g=(_>>>25|_<<7)^z;z=g+w|0;n=(z>>>23|Z<<9)^y;y=n+g|0;o=(y>>>19|Y<<13)^x;x=o+n|0;f=(x>>>14|X<<18)^w;w=s+t|0;r=(w>>>25|W<<7)^v;v=r+s|0;s=(v>>>23|V<<9)^u;u=s+r|0;p=(u>>>19|U<<13)^t;t=p+s|0;q=(t>>>14|T<<18)^s;s=o+p|0;i=(s>>>25|S<<7)^r;r=i+o|0;t=(r>>>23|R<<9)^q;q=t+i|0;u=(q>>>19|Q<<13)^p;p=u+t|0;h=(p>>>14|P<<18)^o;o=k+l|0;j=(o>>>25|O<<7)^n;n=j+k|0;k=(n>>>23|N<<9)^m;m=k+j|0;l=(m>>>19|M<<13)^l;l=l+k|0;m=(l>>>14|L<<18)^k;if((e|0)<=2)break;else e="e+-2|0}L=f+F|0;M=g+G|0;N=n+H|0;O=o+I|0;P=p+J|0;Q=q+B|0;R=r+C|0;S=s+D|0;T=t+E|0;U=u+w|0;V=h+x|0;W=i+y|0;X=j+z|0;Y=k+A|0;Z=l+v|0;_=m+c|0;a[b">>0]=L;a[b+1>>0]=L>>>8;a[b+2>>0]=L>>>16;a[b+3>>0]=L>>>24;a[b+4>>0]=M;a[b+5>>0]=M>>>8;a[b+6>>0]=M>>>16;a[b+7>>0]=M>>>24;a[b+8>>0]=N;a[b+9>>0]=N>>>8;a[b+10>>0]=N>>>16;a[b+11>>0]=N>>>24;a[b+12>>0]=O;a[b+13>>0]=O>>>8;a[b+14>>0]=O>>>16;a[b+15>>0]=O>>>24;a[b+16>>0]=P;a[b+17>>0]=P>>>8;a[b+18>>0]=P>>>16;a[b+19>>0]=P>>>24;a[b+20>>0]=Q;a[b+21>>0]=Q>>>8;a[b+22>>0]=Q>>>16;a[b+23>>0]=Q>>>24;a[b+24>>0]=R;a[b+25>>0]=R>>>8;a[b+26>>0]=R>>>16;a[b+27>>0]=R>>>24;a[b+28>>0]=S;a[b+29>>0]=S>>>8;a[b+30>>0]=S>>>16;a[b+31>>0]=S>>>24;a[b+32>>0]=T;a[b+33>>0]=T>>>8;a[b+34>>0]=T>>>16;a[b+35>>0]=T>>>24;a[b+36>>0]=U;a[b+37>>0]=U>>>8;a[b+38>>0]=U>>>16;a[b+39>>0]=U>>>24;a[b+40>>0]=V;a[b+41>>0]=V>>>8;a[b+42>>0]=V>>>16;a[b+43>>0]=V>>>24;a[b+44>>0]=W;a[b+45>>0]=W>>>8;a[b+46>>0]=W>>>16;a[b+47>>0]=W>>>24;a[b+48>>0]=X;a[b+49>>0]=X>>>8;a[b+50>>0]=X>>>16;a[b+51>>0]=X>>>24;a[b+52>>0]=Y;a[b+53>>0]=Y>>>8;a[b+54>>0]=Y>>>16;a[b+55>>0]=Y>>>24;a[b+56>>0]=Z;a[b+57>>0]=Z>>>8;a[b+58>>0]=Z>>>16;a[b+59>>0]=Z>>>24;a[b+60>>0]=_;a[b+61>>0]=_>>>8;a[b+62>>0]=_>>>16;a[b+63>>0]=_>>>24;return}function pb(){return 16}function qb(){return 64}function rb(){return 32}function sb(){return 16}function tb(){return 64}function ub(){return 32}function vb(){return 384}function wb(b,e,f,g,h,j,k){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;v=i;t=i=i+63&-64;i=i+496|0;n=t+360|0;if((e+-1|0)>>>0>63|k>>>0>64){u=-1;i=v;return u|0}if(e>>>0>=256)za(32608,32628,18,32680);if(k>>>0>=256)za(32707,32628,19,32680);m=k&255;do if(!((b|0)==0|(f|0)==0&((g|0)!=0|(h|0)!=0)|((e&255)+-1&255)>63)?(l=m<<24>>24==0,!((m&255)>64|((j|0)!=0|l)^1)):0){if(l){Fd(t|0,0,357)|0;m=t;c[m>>2]=e&255^-222443256;c[m+4>>2]=1779033703;m=t+8|0;c[m>>2]=-2067093701;c[m+4>>2]=-1150833019;m=t+16|0;c[m>>2]=-23791573;c[m+4>>2]=1013904242;m=t+24|0;c[m>>2]=1595750129;c[m+4>>2]=-1521486534;m=t+32|0;c[m>>2]=-1377402159;c[m+4>>2]=1359893119;m=t+40|0;c[m>>2]=725511199;c[m+4>>2]=-1694144372;m=t+48|0;c[m>>2]=-79577749;c[m+4>>2]=528734635;m=t+56|0;c[m>>2]=327033209;c[m+4>>2]=1541459225;m=0}else{if((j|0)==0|(m+-1&255)>63){l=-1;break}l=k&255;Fd(t|0,0,357)|0;s=Hd(l|0,0,8)|0;o=t;c[o>>2]=(s|e&255)^-222443256;c[o+4>>2]=C^1779033703;o=t+8|0;c[o>>2]=-2067093701;c[o+4>>2]=-1150833019;o=t+16|0;c[o>>2]=-23791573;c[o+4>>2]=1013904242;o=t+24|0;c[o>>2]=1595750129;c[o+4>>2]=-1521486534;o=t+32|0;c[o>>2]=-1377402159;c[o+4>>2]=1359893119;o=t+40|0;c[o>>2]=725511199;c[o+4>>2]=-1694144372;o=t+48|0;c[o>>2]=-79577749;c[o+4>>2]=528734635;o=t+56|0;c[o>>2]=327033209;c[o+4>>2]=1541459225;Fd(n+l|0,0,(m<<24>>24<0?0:128-l|0)|0)|0;id(n|0,j|0,l|0)|0;l=t+352|0;o=t+96|0;m=o+128|0;do{a[o>>0]=a[n>>0]|0;o=o+1|0;n=n+1|0}while((o|0)<(m|0));c[l>>2]=128;m=128}k=t+352|0;if(!((g|0)==0&(h|0)==0)){q=t+96|0;j=t+64|0;r=t+72|0;s=t+224|0;p=f;while(1){f=256-m|0;l=t+96+m|0;if(!(h>>>0>0|(h|0)==0&g>>>0>f>>>0)){u=16;break}Id(l|0,p|0,f|0)|0;c[k>>2]=(c[k>>2]|0)+f;m=j;o=c[m>>2]|0;m=c[m+4>>2]|0;l=Dd(o|0,m|0,128,0)|0;n=j;c[n>>2]=l;c[n+4>>2]=C;n=r;n=Dd((m>>>0>4294967295|(m|0)==-1&o>>>0>4294967167)&1|0,0,c[n>>2]|0,c[n+4>>2]|0)|0;o=r;c[o>>2]=n;c[o+4>>2]=C;Ab(t,q);o=q;n=s;m=o+128|0;do{c[o>>2]=c[n>>2];o=o+4|0;n=n+4|0}while((o|0)<(m|0));m=(c[k>>2]|0)+-128|0;c[k>>2]=m;l=Cd(g|0,h|0,f|0,0)|0;if((g|0)==(f|0)&(h|0)==0)break;else{p=p+f|0;h=C;g=l}}if((u|0)==16){Id(l|0,p|0,g|0)|0;m=Dd(c[k>>2]|0,0,g|0,h|0)|0;c[k>>2]=m}l=e&255;if(m>>>0>128){s=j;e=c[s>>2]|0;s=c[s+4>>2]|0;m=Dd(e|0,s|0,128,0)|0;n=j;c[n>>2]=m;c[n+4>>2]=C;n=t+72|0;m=n;m=Dd((s>>>0>4294967295|(s|0)==-1&e>>>0>4294967167)&1|0,0,c[m>>2]|0,c[m+4>>2]|0)|0;e=n;c[e>>2]=m;c[e+4>>2]=C;e=t+96|0;Ab(t,e);m=(c[k>>2]|0)+-128|0;c[k>>2]=m;Jd(e|0,t+224|0,m|0)|0;m=c[k>>2]|0}else u=19}else{j=t+64|0;l=e&255;u=19}if((u|0)==19)n=t+72|0;u=j;u=Dd(c[u>>2]|0,c[u+4>>2]|0,m|0,0)|0;s=C;r=j;c[r>>2]=u;c[r+4>>2]=s;r=n;e=r;r=r+4|0;r=Dd((s>>>0<0|(s|0)==0&u>>>0>>0)&1|0,0,d[e>>0]|d[e+1>>0]<<8|d[e+2>>0]<<16|d[e+3>>0]<<24|0,d[r>>0]|d[r+1>>0]<<8|d[r+2>>0]<<16|d[r+3>>0]<<24|0)|0;e=c;u=n;s=u;a[s>>0]=r;a[s+1>>0]=r>>8;a[s+2>>0]=r>>16;a[s+3>>0]=r>>24;u=u+4|0;a[u>>0]=e;a[u+1>>0]=e>>8;a[u+2>>0]=e>>16;a[u+3>>0]=e>>24;if(a[t+356>>0]|0){u=t+88|0;c[u>>2]=-1;c[u+4>>2]=-1}u=t+80|0;c[u>>2]=-1;c[u+4>>2]=-1;Fd(t+96+m|0,0,256-m|0)|0;Ab(t,t+96|0);Id(b|0,t|0,l|0)|0;l=0}else l=-1;while(0);u=l;i=v;return u|0}function xb(b,c,d,e){b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0;j=i;f=i=i+63&-64;i=i+128|0;if(d>>>0>64|(e+-1|0)>>>0>63){b=-1;i=j;return b|0}if(e>>>0>=256)za(32608,32628,53,32727);if(d>>>0>=256)za(32707,32628,54,32727);h=e&255;if((c|0)==0|(d|0)==0){if((h+-1&255)>63){b=-1;i=j;return b|0}Fd(b|0,0,357)|0;c=e&255^-222443256;e=b;d=e;a[d>>0]=c;a[d+1>>0]=c>>8;a[d+2>>0]=c>>16;a[d+3>>0]=c>>24;e=e+4|0;a[e>>0]=103;a[e+1>>0]=230;a[e+2>>0]=9;a[e+3>>0]=106;e=b+8|0;d=e;a[d>>0]=-2067093701;a[d+1>>0]=-2067093701>>8;a[d+2>>0]=-2067093701>>16;a[d+3>>0]=-2067093701>>24;e=e+4|0;a[e>>0]=-1150833019;a[e+1>>0]=-1150833019>>8;a[e+2>>0]=-1150833019>>16;a[e+3>>0]=-1150833019>>24;e=b+16|0;d=e;a[d>>0]=-23791573;a[d+1>>0]=-23791573>>8;a[d+2>>0]=-23791573>>16;a[d+3>>0]=-23791573>>24;e=e+4|0;a[e>>0]=114;a[e+1>>0]=243;a[e+2>>0]=110;a[e+3>>0]=60;e=b+24|0;d=e;a[d>>0]=241;a[d+1>>0]=54;a[d+2>>0]=29;a[d+3>>0]=95;e=e+4|0;a[e>>0]=-1521486534;a[e+1>>0]=-1521486534>>8;a[e+2>>0]=-1521486534>>16;a[e+3>>0]=-1521486534>>24;e=b+32|0;d=e;a[d>>0]=-1377402159;a[d+1>>0]=-1377402159>>8;a[d+2>>0]=-1377402159>>16;a[d+3>>0]=-1377402159>>24;e=e+4|0;a[e>>0]=127;a[e+1>>0]=82;a[e+2>>0]=14;a[e+3>>0]=81;e=b+40|0;d=e;a[d>>0]=31;a[d+1>>0]=108;a[d+2>>0]=62;a[d+3>>0]=43;e=e+4|0;a[e>>0]=-1694144372;a[e+1>>0]=-1694144372>>8;a[e+2>>0]=-1694144372>>16;a[e+3>>0]=-1694144372>>24;e=b+48|0;d=e;a[d>>0]=-79577749;a[d+1>>0]=-79577749>>8;a[d+2>>0]=-79577749>>16;a[d+3>>0]=-79577749>>24;e=e+4|0;a[e>>0]=171;a[e+1>>0]=217;a[e+2>>0]=131;a[e+3>>0]=31;b=b+56|0;e=b;a[e>>0]=121;a[e+1>>0]=33;a[e+2>>0]=126;a[e+3>>0]=19;b=b+4|0;a[b>>0]=25;a[b+1>>0]=205;a[b+2>>0]=224;a[b+3>>0]=91;b=0;i=j;return b|0}else{g=d&255;if((h+-1&255)>63|(g+-1&255)>63){b=-1;i=j;return b|0}h=d&255;Fd(b|0,0,357)|0;l=Hd(h|0,0,8)|0;l=(l|e&255)^-222443256;d=C^1779033703;e=b;k=e;a[k>>0]=l;a[k+1>>0]=l>>8;a[k+2>>0]=l>>16;a[k+3>>0]=l>>24;e=e+4|0;a[e>>0]=d;a[e+1>>0]=d>>8;a[e+2>>0]=d>>16;a[e+3>>0]=d>>24;e=b+8|0;d=e;a[d>>0]=-2067093701;a[d+1>>0]=-2067093701>>8;a[d+2>>0]=-2067093701>>16;a[d+3>>0]=-2067093701>>24;e=e+4|0;a[e>>0]=-1150833019;a[e+1>>0]=-1150833019>>8;a[e+2>>0]=-1150833019>>16;a[e+3>>0]=-1150833019>>24;e=b+16|0;d=e;a[d>>0]=-23791573;a[d+1>>0]=-23791573>>8;a[d+2>>0]=-23791573>>16;a[d+3>>0]=-23791573>>24;e=e+4|0;a[e>>0]=114;a[e+1>>0]=243;a[e+2>>0]=110;a[e+3>>0]=60;e=b+24|0;d=e;a[d>>0]=241;a[d+1>>0]=54;a[d+2>>0]=29;a[d+3>>0]=95;e=e+4|0;a[e>>0]=-1521486534;a[e+1>>0]=-1521486534>>8;a[e+2>>0]=-1521486534>>16;a[e+3>>0]=-1521486534>>24;e=b+32|0;d=e;a[d>>0]=-1377402159;a[d+1>>0]=-1377402159>>8;a[d+2>>0]=-1377402159>>16;a[d+3>>0]=-1377402159>>24;e=e+4|0;a[e>>0]=127;a[e+1>>0]=82;a[e+2>>0]=14;a[e+3>>0]=81;e=b+40|0;d=e;a[d>>0]=31;a[d+1>>0]=108;a[d+2>>0]=62;a[d+3>>0]=43;e=e+4|0;a[e>>0]=-1694144372;a[e+1>>0]=-1694144372>>8;a[e+2>>0]=-1694144372>>16;a[e+3>>0]=-1694144372>>24;e=b+48|0;d=e;a[d>>0]=-79577749;a[d+1>>0]=-79577749>>8;a[d+2>>0]=-79577749>>16;a[d+3>>0]=-79577749>>24;e=e+4|0;a[e>>0]=171;a[e+1>>0]=217;a[e+2>>0]=131;a[e+3>>0]=31;e=b+56|0;d=e;a[d>>0]=121;a[d+1>>0]=33;a[d+2>>0]=126;a[d+3>>0]=19;e=e+4|0;a[e>>0]=25;a[e+1>>0]=205;a[e+2>>0]=224;a[e+3>>0]=91;Fd(f+h|0,0,(g<<24>>24<0?0:128-h|0)|0)|0;id(f|0,c|0,h|0)|0;c=b+352|0;h=b+96|0;g=h+128|0;do{a[h>>0]=a[f>>0]|0;h=h+1|0;f=f+1|0}while((h|0)<(g|0));a[c>>0]=128;a[c+1>>0]=0;a[c+2>>0]=0;a[c+3>>0]=0;l=0;i=j;return l|0}return 0}function yb(b,c,e,f){b=b|0;c=c|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;if((e|0)==0&(f|0)==0)return 0;k=b+352|0;l=b+96|0;m=b+64|0;n=b+72|0;o=b+224|0;g=d[k>>0]|d[k+1>>0]<<8|d[k+2>>0]<<16|d[k+3>>0]<<24;j=e;while(1){i=256-g|0;e=b+96+g|0;if(!(f>>>0>0|(f|0)==0&j>>>0>i>>>0))break;Id(e|0,c|0,i|0)|0;h=(d[k>>0]|d[k+1>>0]<<8|d[k+2>>0]<<16|d[k+3>>0]<<24)+i|0;a[k>>0]=h;a[k+1>>0]=h>>8;a[k+2>>0]=h>>16;a[k+3>>0]=h>>24;h=m;e=h;e=d[e>>0]|d[e+1>>0]<<8|d[e+2>>0]<<16|d[e+3>>0]<<24;h=h+4|0;h=d[h>>0]|d[h+1>>0]<<8|d[h+2>>0]<<16|d[h+3>>0]<<24;s=dd(e|0,h|0,128,0)|0;g=c;q=m;r=q;a[r>>0]=s;a[r+1>>0]=s>>8;a[r+2>>0]=s>>16;a[r+3>>0]=s>>24;q=q+4|0;a[q>>0]=g;a[q+1>>0]=g>>8;a[q+2>>0]=g>>16;a[q+3>>0]=g>>24;q=n;g=q;q=q+4|0;q=Dd((h>>>0>4294967295|(h|0)==-1&e>>>0>4294967167)&1|0,0,d[g>>0]|d[g+1>>0]<<8|d[g+2>>0]<<16|d[g+3>>0]<<24|0,d[q>>0]|d[q+1>>0]<<8|d[q+2>>0]<<16|d[q+3>>0]<<24|0)|0;g=c;e=n;h=e;a[h>>0]=q;a[h+1>>0]=q>>8;a[h+2>>0]=q>>16;a[h+3>>0]=q>>24;e=e+4|0;a[e>>0]=g;a[e+1>>0]=g>>8;a[e+2>>0]=g>>16;a[e+3>>0]=g>>24;Ab(b,l);e=l;g=o;h=e+128|0;do{a[e>>0]=a[g>>0]|0;e=e+1|0;g=g+1|0}while((e|0)<(h|0));g=(d[k>>0]|d[k+1>>0]<<8|d[k+2>>0]<<16|d[k+3>>0]<<24)+-128|0;a[k>>0]=g;a[k+1>>0]=g>>8;a[k+2>>0]=g>>16;a[k+3>>0]=g>>24;e=Cd(j|0,f|0,i|0,0)|0;if((j|0)==(i|0)&(f|0)==0){p=6;break}else{c=c+i|0;f=C;j=e}}if((p|0)==6)return 0;Id(e|0,c|0,j|0)|0;s=Dd(d[k>>0]|d[k+1>>0]<<8|d[k+2>>0]<<16|d[k+3>>0]<<24|0,0,j|0,f|0)|0;a[k>>0]=s;a[k+1>>0]=s>>8;a[k+2>>0]=s>>16;a[k+3>>0]=s>>24;return 0}function zb(b,c,e){b=b|0;c=c|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;if(e>>>0>=256)za(32608,32628,106,32759);f=e&255;if(!(f<<24>>24)){b=-1;return b|0}if((f&255)>64){b=-1;return b|0}g=b+352|0;f=d[g>>0]|d[g+1>>0]<<8|d[g+2>>0]<<16|d[g+3>>0]<<24;i=b+64|0;if(f>>>0>128){k=i;j=k;j=d[j>>0]|d[j+1>>0]<<8|d[j+2>>0]<<16|d[j+3>>0]<<24;k=k+4|0;k=d[k>>0]|d[k+1>>0]<<8|d[k+2>>0]<<16|d[k+3>>0]<<24;m=dd(j|0,k|0,128,0)|0;l=c;h=i;f=h;a[f>>0]=m;a[f+1>>0]=m>>8;a[f+2>>0]=m>>16;a[f+3>>0]=m>>24;h=h+4|0;a[h>>0]=l;a[h+1>>0]=l>>8;a[h+2>>0]=l>>16;a[h+3>>0]=l>>24;h=b+72|0;l=h;f=l;l=l+4|0;l=Dd((k>>>0>4294967295|(k|0)==-1&j>>>0>4294967167)&1|0,0,d[f>>0]|d[f+1>>0]<<8|d[f+2>>0]<<16|d[f+3>>0]<<24|0,d[l>>0]|d[l+1>>0]<<8|d[l+2>>0]<<16|d[l+3>>0]<<24|0)|0;f=c;j=h;k=j;a[k>>0]=l;a[k+1>>0]=l>>8;a[k+2>>0]=l>>16;a[k+3>>0]=l>>24;j=j+4|0;a[j>>0]=f;a[j+1>>0]=f>>8;a[j+2>>0]=f>>16;a[j+3>>0]=f>>24;j=b+96|0;Ab(b,j);f=(d[g>>0]|d[g+1>>0]<<8|d[g+2>>0]<<16|d[g+3>>0]<<24)+-128|0;a[g>>0]=f;a[g+1>>0]=f>>8;a[g+2>>0]=f>>16;a[g+3>>0]=f>>24;Jd(j|0,b+224|0,f|0)|0;f=d[g>>0]|d[g+1>>0]<<8|d[g+2>>0]<<16|d[g+3>>0]<<24}else h="b+72|0;m=i;k=m;m=m+4|0;m=Dd(d[k">>0]|d[k+1>>0]<<8|d[k+2>>0]<<16|d[k+3>>0]<<24|0,d[m>>0]|d[m+1>>0]<<8|d[m+2>>0]<<16|d[m+3>>0]<<24|0,f|0,0)|0;k=c;j=i;l=j;a[l>>0]=m;a[l+1>>0]=m>>8;a[l+2>>0]=m>>16;a[l+3>>0]=m>>24;j=j+4|0;a[j>>0]=k;a[j+1>>0]=k>>8;a[j+2>>0]=k>>16;a[j+3>>0]=k>>24;j=h;l=j;j=j+4|0;j=Dd((k>>>0<0|(k|0)==0&m>>>0>>0)&1|0,0,d[l>>0]|d[l+1>>0]<<8|d[l+2>>0]<<16|d[l+3>>0]<<24|0,d[j>>0]|d[j+1>>0]<<8|d[j+2>>0]<<16|d[j+3>>0]<<24|0)|0;l=c;m=h;k=m;a[k>>0]=j;a[k+1>>0]=j>>8;a[k+2>>0]=j>>16;a[k+3>>0]=j>>24;m=m+4|0;a[m>>0]=l;a[m+1>>0]=l>>8;a[m+2>>0]=l>>16;a[m+3>>0]=l>>24;if(a[b+356>>0]|0){m=b+88|0;l=m;a[l>>0]=-1;a[l+1>>0]=-1>>8;a[l+2>>0]=-1>>16;a[l+3>>0]=-1>>24;m=m+4|0;a[m>>0]=-1;a[m+1>>0]=-1>>8;a[m+2>>0]=-1>>16;a[m+3>>0]=-1>>24}m=b+80|0;l=m;a[l>>0]=-1;a[l+1>>0]=-1>>8;a[l+2>>0]=-1>>16;a[l+3>>0]=-1>>24;m=m+4|0;a[m>>0]=-1;a[m+1>>0]=-1>>8;a[m+2>>0]=-1>>16;a[m+3>>0]=-1>>24;Fd(b+96+f|0,0,256-f|0)|0;Ab(b,b+96|0);Id(c|0,b|0,e&255|0)|0;m=0;return m|0}function Ab(b,c){b=b|0;c=c|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0;P=c;R=P;R=d[R>>0]|d[R+1>>0]<<8|d[r+2>>0]<<16|d[r+3>>0]<<24;p=p+4|0;p=d[p>>0]|d[P+1>>0]<<8|d[p+2>>0]<<16|d[p+3>>0]<<24;u=c+8|0;w=u;w=d[w>>0]|d[W+1>>0]<<8|d[w+2>>0]<<16|d[w+3>>0]<<24;u=u+4|0;u=d[u>>0]|d[U+1>>0]<<8|d[u+2>>0]<<16|d[u+3>>0]<<24;x=c+16|0;t=x;t=d[t>>0]|d[t+1>>0]<<8|d[t+2>>0]<<16|d[t+3>>0]<<24;x=x+4|0;x=d[x>>0]|d[x+1>>0]<<8|d[x+2>>0]<<16|d[x+3>>0]<<24;l=c+24|0;h=l;h=d[h>>0]|d[h+1>>0]<<8|d[h+2>>0]<<16|d[h+3>>0]<<24;l=l+4|0;l=d[l>>0]|d[l+1>>0]<<8|d[l+2>>0]<<16|d[l+3>>0]<<24;$=c+32|0;p=$;p=d[p>>0]|d[p+1>>0]<<8|d[p+2>>0]<<16|d[p+3>>0]<<24;$=$+4|0;$=d[$>>0]|d[$+1>>0]<<8|d[$+2>>0]<<16|d[$+3>>0]<<24;f=c+40|0;h=f;h=d[h>>0]|d[H+1>>0]<<8|d[h+2>>0]<<16|d[h+3>>0]<<24;f=f+4|0;f=d[f>>0]|d[F+1>>0]<<8|d[f+2>>0]<<16|d[f+3>>0]<<24;u=c+48|0;s=u;s=d[s>>0]|d[s+1>>0]<<8|d[s+2>>0]<<16|d[s+3>>0]<<24;u=u+4|0;u=d[u>>0]|d[u+1>>0]<<8|d[u+2>>0]<<16|d[u+3>>0]<<24;r=c+56|0;n=r;n=d[n>>0]|d[n+1>>0]<<8|d[n+2>>0]<<16|d[n+3>>0]<<24;r=r+4|0;r=d[r>>0]|d[r+1>>0]<<8|d[r+2>>0]<<16|d[r+3>>0]<<24;i=c+64|0;g=i;g=d[g>>0]|d[g+1>>0]<<8|d[g+2>>0]<<16|d[g+3>>0]<<24;i=i+4|0;i=d[i>>0]|d[i+1>>0]<<8|d[i+2>>0]<<16|d[i+3>>0]<<24;y=c+72|0;j=y;j=d[j>>0]|d[j+1>>0]<<8|d[j+2>>0]<<16|d[j+3>>0]<<24;y=y+4|0;y=d[y>>0]|d[Y+1>>0]<<8|d[y+2>>0]<<16|d[y+3>>0]<<24;o=c+80|0;m=o;m=d[m>>0]|d[m+1>>0]<<8|d[m+2>>0]<<16|d[m+3>>0]<<24;o=o+4|0;o=d[o>>0]|d[o+1>>0]<<8|d[o+2>>0]<<16|d[o+3>>0]<<24;k=c+88|0;m=k;m=d[m>>0]|d[M+1>>0]<<8|d[m+2>>0]<<16|d[m+3>>0]<<24;k=k+4|0;k=d[k>>0]|d[K+1>>0]<<8|d[k+2>>0]<<16|d[k+3>>0]<<24;f=c+96|0;e=f;e=d[e>>0]|d[e+1>>0]<<8|d[e+2>>0]<<16|d[e+3>>0]<<24;f=f+4|0;f=d[f>>0]|d[f+1>>0]<<8|d[f+2>>0]<<16|d[f+3>>0]<<24;s=c+104|0;b=s;b=d[b>>0]|d[B+1>>0]<<8|d[b+2>>0]<<16|d[b+3>>0]<<24;s=s+4|0;s=d[s>>0]|d[S+1>>0]<<8|d[s+2>>0]<<16|d[s+3>>0]<<24;sa=c+112|0;ra=sa;ra=d[ra>>0]|d[ra+1>>0]<<8|d[ra+2>>0]<<16|d[ra+3>>0]<<24;sa=sa+4|0;sa=d[sa>>0]|d[sa+1>>0]<<8|d[sa+2>>0]<<16|d[sa+3>>0]<<24;a=c+120|0;y=a;y=d[y>>0]|d[y+1>>0]<<8|d[y+2>>0]<<16|d[y+3>>0]<<24;a=a+4|0;a=d[a>>0]|d[A+1>>0]<<8|d[a+2>>0]<<16|d[a+3>>0]<<24;ca=b;v=ca;ca=ca+4|0;n=b+8|0;oa=n;na=oa;na=d[na>>0]|d[na+1>>0]<<8|d[na+2>>0]<<16|d[na+3>>0]<<24;oa=oa+4|0;oa=d[oa>>0]|d[oa+1>>0]<<8|d[oa+2>>0]<<16|d[oa+3>>0]<<24;i=b+16|0;ka=i;ja=ka;ja=d[ja>>0]|d[ja+1>>0]<<8|d[ja+2>>0]<<16|d[ja+3>>0]<<24;ka=ka+4|0;ka=d[ka>>0]|d[ka+1>>0]<<8|d[ka+2>>0]<<16|d[ka+3>>0]<<24;d=b+24|0;ga=d;fa=ga;fa=d[fa>>0]|d[fa+1>>0]<<8|d[fa+2>>0]<<16|d[fa+3>>0]<<24;ga=ga+4|0;ga=d[ga>>0]|d[ga+1>>0]<<8|d[ga+2>>0]<<16|d[ga+3>>0]<<24;w=b+32|0;ma=w;la=ma;la=d[la>>0]|d[la+1>>0]<<8|d[la+2>>0]<<16|d[la+3>>0]<<24;ma=ma+4|0;ma=d[ma>>0]|d[ma+1>>0]<<8|d[ma+2>>0]<<16|d[ma+3>>0]<<24;q=b+40|0;ia=q;ha=ia;ha=d[ha>>0]|d[ha+1>>0]<<8|d[ha+2>>0]<<16|d[ha+3>>0]<<24;ia=ia+4|0;ia=d[ia>>0]|d[ia+1>>0]<<8|d[ia+2>>0]<<16|d[ia+3>>0]<<24;k=b+48|0;ua=k;ta=ua;ta=d[ta>>0]|d[ta+1>>0]<<8|d[ta+2>>0]<<16|d[ta+3>>0]<<24;ua=ua+4|0;ua=d[ua>>0]|d[ua+1>>0]<<8|d[ua+2>>0]<<16|d[ua+3>>0]<<24;c=b+56|0;qa=c;pa=qa;pa=d[pa>>0]|d[pa+1>>0]<<8|d[pa+2>>0]<<16|d[pa+3>>0]<<24;qa=qa+4|0;qa=d[qa>>0]|d[qa+1>>0]<<8|d[qa+2>>0]<<16|d[qa+3>>0]<<24;ba=b+64|0;aa=ba;ba=ba+4|0;aa=(d[aa>>0]|d[aa+1>>0]<<8|d[aa+2>>0]<<16|d[aa+3>>0]<<24)^-1377402159;ba=(d[ba>>0]|d[ba+1>>0]<<8|d[ba+2>>0]<<16|d[ba+3>>0]<<24)^1359893119;_=b+72|0;z=_;_=_+4|0;z=(d[z>>0]|d[Z+1>>0]<<8|d[z+2>>0]<<16|d[z+3>>0]<<24)^725511199;_=(d[_>>0]|d[_+1>>0]<<8|d[_+2>>0]<<16|d[_+3>>0]<<24)^-1694144372;x=b+80|0;v=x;x=x+4|0;v=(d[v>>0]|d[V+1>>0]<<8|d[v+2>>0]<<16|d[v+3>>0]<<24)^-79577749;x=(d[x>>0]|d[X+1>>0]<<8|d[x+2>>0]<<16|d[x+3>>0]<<24)^528734635;ea=b+88|0;da=ea;ea=ea+4|0;da=(d[da>>0]|d[da+1>>0]<<8|d[da+2>>0]<<16|d[da+3>>0]<<24)^327033209;ea=(d[ea>>0]|d[ea+1>>0]<<8|d[ea+2>>0]<<16|d[ea+3>>0]<<24)^1541459225;ca=dd(la|0,ma|0,d[v>>0]|d[v+1>>0]<<8|d[v+2>>0]<<16|d[v+3>>0]<<24|0,d[ca>>0]|d[ca+1>>0]<<8|d[ca+2>>0]<<16|d[ca+3>>0]<<24|0)|0;ca=dd(ca|0,c|0,r|0,p|0)|0;v=c;aa=aa^ca;ba=ba^v;q=dd(ba|0,aa|0,-205731576,1779033703)|0;t=c;la=q^la;ma=t^ma;o=gd(la|0,ma|0,24)|0;l=c;ma=hd(la|0,ma|0,40)|0;o=ma|o;l=c|l;v=dd(w|0,u|0,ca|0,v|0)|0;v=dd(v|0,c|0,o|0,l|0)|0;ca=c;ba=v^ba;aa=ca^aa;ma=gd(ba|0,aa|0,16)|0;la=c;aa=hd(ba|0,aa|0,48)|0;ma=aa|ma;la=c|la;t=dd(ma|0,la|0,q|0,t|0)|0;q=c;o=t^o;l=q^l;aa=gd(o|0,l|0,63)|0;ba=c;l=hd(o|0,l|0,1)|0;aa=l|aa;ba=c|ba;oa=dd(ha|0,ia|0,na|0,oa|0)|0;oa=dd(oa|0,c|0,t|0,x|0)|0;na=c;z=z^oa;_=_^na;l=dd(_|0,z|0,-2067093701,-1150833019)|0;o=c;ha=l^ha;ia=o^ia;j=gd(ha|0,ia|0,24)|0;g=c;ia=hd(ha|0,ia|0,40)|0;j=ia|j;g=c|g;na=dd(h|0,l|0,oa|0,na|0)|0;na=dd(na|0,c|0,j|0,g|0)|0;oa=c;_=na^_;z=oa^z;ia=gd(_|0,z|0,16)|0;ha=c;z=hd(_|0,z|0,48)|0;ia=z|ia;ha=c|ha;o=dd(ia|0,ha|0,l|0,o|0)|0;l=c;j=o^j;g=l^g;z=gd(j|0,g|0,63)|0;_=c;g=hd(j|0,g|0,1)|0;z=g|z;_=c|_;ka=dd(ta|0,ua|0,ja|0,ka|0)|0;ka=dd(ka|0,c|0,p|0,$|0)|0;ja=c;v=v^ka;x=x^ja;g=dd(x|0,v|0,-23791573,1013904242)|0;j=c;ta=g^ta;ua=j^ua;e=gd(ta|0,ua|0,24)|0;z=c;ua=hd(ta|0,ua|0,40)|0;e=ua|e;z=c|z;ja=dd(h|0,f|0,ka|0,ja|0)|0;ja=dd(ja|0,c|0,e|0,z|0)|0;ka=c;x=ja^x;v=ka^v;ua=gd(x|0,v|0,16)|0;ta=c;v=hd(x|0,v|0,48)|0;ua=v|ua;ta=c|ta;j=dd(ua|0,ta|0,g|0,j|0)|0;g=c;e=j^e;z=g^z;v=gd(e|0,z|0,63)|0;x=c;z=hd(e|0,z|0,1)|0;v=z|v;x=c|x;ga=dd(pa|0,qa|0,fa|0,ga|0)|0;ga=dd(ga|0,c|0,s|0,u|0)|0;fa=c;da=da^ga;ea=ea^fa;z=dd(ea|0,da|0,1595750129,-1521486534)|0;e=c;pa=z^pa;qa=e^qa;wa=gd(pa|0,qa|0,24)|0;va=c;qa=hd(pa|0,qa|0,40)|0;wa=qa|wa;va=c|va;fa=dd(n|0,r|0,ga|0,fa|0)|0;fa=dd(fa|0,c|0,wa|0,va|0)|0;ga=c;ea=fa^ea;da=ga^da;qa=gd(ea|0,da|0,16)|0;pa=c;da=hd(ea|0,da|0,48)|0;qa=da|qa;pa=c|pa;e=dd(qa|0,pa|0,z|0,e|0)|0;z=c;wa=e^wa;va=z^va;da=gd(wa|0,va|0,63)|0;ea=c;va=hd(wa|0,va|0,1)|0;da=va|da;ea=c|ea;ca=dd(z|0,_|0,v|0,ca|0)|0;ca=dd(ca|0,c|0,g|0,i|0)|0;v=c;qa=qa^ca;pa=pa^v;g=dd(pa|0,qa|0,j|0,g|0)|0;j=c;z=g^z;_=j^_;va=gd(z|0,_|0,24)|0;wa=c;_=hd(z|0,_|0,40)|0;va=_|va;wa=c|wa;v=dd(j|0,y|0,ca|0,v|0)|0;v=dd(v|0,c|0,va|0,wa|0)|0;ca=c;pa=v^pa;qa=ca^qa;_=gd(pa|0,qa|0,16)|0;z=c;qa=hd(pa|0,qa|0,48)|0;_=qa|_;z=c|z;j=dd(_|0,z|0,g|0,j|0)|0;g=c;va=j^va;wa=g^wa;qa=gd(va|0,wa|0,63)|0;pa=c;wa=hd(va|0,wa|0,1)|0;qa=wa|qa;pa=c|pa;oa=dd(v|0,x|0,na|0,oa|0)|0;oa=dd(oa|0,c|0,m|0,o|0)|0;na=c;ma=ma^oa;la=la^na;z=dd(la|0,ma|0,e|0,z|0)|0;e=c;v=z^v;x=e^x;wa=gd(v|0,x|0,24)|0;va=c;x=hd(v|0,x|0,40)|0;wa=x|wa;va=c|va;na=dd(m|0,k|0,oa|0,na|0)|0;na=dd(na|0,c|0,wa|0,va|0)|0;oa=c;la=na^la;ma=oa^ma;x=gd(la|0,ma|0,16)|0;v=c;ma=hd(la|0,ma|0,48)|0;x=ma|x;v=c|v;e=dd(x|0,v|0,z|0,e|0)|0;z=c;wa=e^wa;va=z^va;ma=gd(wa|0,va|0,63)|0;la=c;va=hd(wa|0,va|0,1)|0;ma=va|ma;la=c|la;ka=dd(da|0,ea|0,ja|0,ka|0)|0;ka=dd(ka|0,c|0,e|0,f|0)|0;ja=c;ia=ia^ka;ha=ha^ja;q=dd(ha|0,ia|0,t|0,q|0)|0;t=c;da=q^da;ea=t^ea;va=gd(da|0,ea|0,24)|0;wa=c;ea=hd(da|0,ea|0,40)|0;va=ea|va;wa=c|wa;ja=dd(b|0,s|0,ka|0,ja|0)|0;ja=dd(ja|0,c|0,va|0,wa|0)|0;ka=c;ha=ja^ha;ia=ka^ia;ea=gd(ha|0,ia|0,16)|0;da=c;ia=hd(ha|0,ia|0,48)|0;ea=ia|ea;da=c|da;t=dd(ea|0,da|0,q|0,t|0)|0;q=c;va=t^va;wa=q^wa;ia=gd(va|0,wa|0,63)|0;ha=c;wa=hd(va|0,wa|0,1)|0;ia=wa|ia;ha=c|ha;ga=dd(aa|0,ba|0,fa|0,ga|0)|0;ga=dd(ga|0,c|0,ra|0,sa|0)|0;fa=c;ua=ua^ga;ta=ta^fa;l=dd(ta|0,ua|0,o|0,l|0)|0;o=c;aa=l^aa;ba=o^ba;wa=gd(aa|0,ba|0,24)|0;va=c;ba=hd(aa|0,ba|0,40)|0;wa=ba|wa;va=c|va;fa=dd(y|0,a|0,ga|0,fa|0)|0;fa=dd(fa|0,c|0,wa|0,va|0)|0;ga=c;ta=fa^ta;ua=ga^ua;ba=gd(ta|0,ua|0,16)|0;aa=c;ua=hd(ta|0,ua|0,48)|0;ba=ua|ba;aa=c|aa;o=dd(ba|0,aa|0,l|0,o|0)|0;l=c;wa=o^wa;va=l^va;ua=gd(wa|0,va|0,63)|0;ta=c;va=hd(wa|0,va|0,1)|0;ua=va|ua;ta=c|ta;ca=dd(ra|0,sa|0,v|0,ca|0)|0;ca=dd(ca|0,c|0,ua|0,ta|0)|0;v=c;x=ca^x;v=v^v;q=dd(v|0,x|0,t|0,q|0)|0;t=c;ua=q^ua;ta=t^ta;va=gd(ua|0,ta|0,24)|0;wa=c;ta=hd(ua|0,ta|0,40)|0;va=ta|va;wa=c|wa;v=dd(m|0,o|0,ca|0,v|0)|0;v=dd(v|0,c|0,va|0,wa|0)|0;ca=c;v=v^v;x=ca^x;ta=gd(v|0,x|0,16)|0;ua=c;x=hd(v|0,x|0,48)|0;ta=x|ta;ua=c|ua;t=dd(ta|0,ua|0,q|0,t|0)|0;q=c;va=t^va;wa=q^wa;x=gd(va|0,wa|0,63)|0;v=c;wa=hd(va|0,wa|0,1)|0;x=wa|x;v=c|v;oa=dd(qa|0,pa|0,na|0,oa|0)|0;oa=dd(oa|0,c|0,p|0,$|0)|0;na=c;ea=ea^oa;da=da^na;l=dd(da|0,ea|0,o|0,l|0)|0;o=c;qa=l^qa;pa=o^pa;wa=gd(qa|0,pa|0,24)|0;va=c;pa=hd(qa|0,pa|0,40)|0;wa=pa|wa;va=c|va;na=dd(g|0,i|0,oa|0,na|0)|0;na=dd(na|0,c|0,wa|0,va|0)|0;oa=c;da=na^da;ea=oa^ea;pa=gd(da|0,ea|0,16)|0;qa=c;ea=hd(da|0,ea|0,48)|0;pa=ea|pa;qa=c|qa;o=dd(pa|0,qa|0,l|0,o|0)|0;l=c;wa=o^wa;va=l^va;ea=gd(wa|0,va|0,63)|0;da=c;va=hd(wa|0,va|0,1)|0;ea=va|ea;da=c|da;ka=dd(ma|0,la|0,ja|0,ka|0)|0;ka=dd(ka|0,c|0,j|0,y|0)|0;ja=c;ba=ba^ka;aa=aa^ja;g=dd(aa|0,ba|0,j|0,g|0)|0;j=c;ma=g^ma;la=j^la;va=gd(ma|0,la|0,24)|0;wa=c;la=hd(ma|0,la|0,40)|0;va=la|va;wa=c|wa;ja=dd(y|0,a|0,ka|0,ja|0)|0;ja=dd(ja|0,c|0,va|0,wa|0)|0;ka=c;aa=ja^aa;ba=ka^ba;la=gd(aa|0,ba|0,16)|0;ma=c;ba=hd(aa|0,ba|0,48)|0;la=ba|la;ma=c|ma;j=dd(la|0,ma|0,g|0,j|0)|0;g=c;va=j^va;wa=g^wa;ba=gd(va|0,wa|0,63)|0;aa=c;wa=hd(va|0,wa|0,1)|0;ba=wa|ba;aa=c|aa;ga=dd(ia|0,ha|0,fa|0,ga|0)|0;ga=dd(ga|0,c|0,b|0,s|0)|0;fa=c;_=_^ga;z=z^fa;z=dd(z|0,_|0,e|0,z|0)|0;e=c;ia=z^ia;ha=e^ha;wa=gd(ia|0,ha|0,24)|0;va=c;ha=hd(ia|0,ha|0,40)|0;wa=ha|wa;va=c|va;fa=dd(s|0,u|0,ga|0,fa|0)|0;fa=dd(fa|0,c|0,wa|0,va|0)|0;ga=c;z=fa^z;_=ga^_;ha=gd(z|0,_|0,16)|0;ia=c;_=hd(z|0,_|0,48)|0;ha=_|ha;ia=c|ia;e=dd(ha|0,ia|0,z|0,e|0)|0;z=c;wa=e^wa;va=z^va;_=gd(wa|0,va|0,63)|0;z=c;va=hd(wa|0,va|0,1)|0;_=va|_;z=c|z;ca=dd(ea|0,da|0,v|0,ca|0)|0;ca=dd(ca|0,c|0,w|0,u|0)|0;v=c;ha=ha^ca;ia=ia^v;g=dd(ia|0,ha|0,j|0,g|0)|0;j=c;ea=g^ea;da=j^da;va=gd(ea|0,da|0,24)|0;wa=c;da=hd(ea|0,da|0,40)|0;va=da|va;wa=c|wa;v=dd(e|0,f|0,ca|0,v|0)|0;v=dd(v|0,c|0,va|0,wa|0)|0;ca=c;ia=v^ia;ha=ca^ha;da=gd(ia|0,ha|0,16)|0;ea=c;ha=hd(ia|0,ha|0,48)|0;da=ha|da;ea=c|ea;j=dd(da|0,ea|0,g|0,j|0)|0;g=c;va=j^va;wa=g^wa;ha=gd(va|0,wa|0,63)|0;ia=c;wa=hd(va|0,wa|0,1)|0;ha=wa|ha;ia=c|ia;oa=dd(ba|0,aa|0,na|0,oa|0)|0;oa=dd(oa|0,c|0,r|0,p|0)|0;na=c;ta=ta^oa;ua=ua^na;z=dd(ua|0,ta|0,e|0,z|0)|0;e=c;ba=z^ba;aa=e^aa;wa=gd(ba|0,aa|0,24)|0;va=c;aa=hd(ba|0,aa|0,40)|0;wa=aa|wa;va=c|va;na=dd(t|0,x|0,oa|0,na|0)|0;na=dd(na|0,c|0,wa|0,va|0)|0;oa=c;ua=na^ua;ta=oa^ta;aa=gd(ua|0,ta|0,16)|0;ba=c;ta=hd(ua|0,ta|0,48)|0;aa=ta|aa;ba=c|ba;e=dd(aa|0,ba|0,z|0,e|0)|0;z=c;wa=e^wa;va=z^va;ta=gd(wa|0,va|0,63)|0;ua=c;va=hd(wa|0,va|0,1)|0;ta=va|ta;ua=c|ua;ka=dd(_|0,z|0,ja|0,ka|0)|0;ka=dd(ka|0,c|0,m|0,k|0)|0;ja=c;pa=pa^ka;qa=qa^ja;q=dd(qa|0,pa|0,t|0,q|0)|0;t=c;_=q^_;z=t^z;va=gd(_|0,z|0,24)|0;wa=c;z=hd(_|0,z|0,40)|0;va=z|va;wa=c|wa;ja=dd(n|0,r|0,ka|0,ja|0)|0;ja=dd(ja|0,c|0,va|0,wa|0)|0;ka=c;qa=ja^qa;pa=ka^pa;z=gd(qa|0,pa|0,16)|0;_=c;pa=hd(qa|0,pa|0,48)|0;z=pa|z;_=c|_;t=dd(z|0,_|0,q|0,t|0)|0;q=c;va=t^va;wa=q^wa;pa=gd(va|0,wa|0,63)|0;qa=c;wa=hd(va|0,wa|0,1)|0;pa=wa|pa;qa=c|qa;ga=dd(x|0,v|0,fa|0,ga|0)|0;ga=dd(ga|0,c|0,h|0,f|0)|0;fa=c;la=la^ga;ma=ma^fa;l=dd(ma|0,la|0,o|0,l|0)|0;o=c;x=l^x;v=o^v;wa=gd(x|0,v|0,24)|0;va=c;v=hd(x|0,v|0,40)|0;wa=v|wa;va=c|va;fa=dd(h|0,l|0,ga|0,fa|0)|0;fa=dd(fa|0,c|0,wa|0,va|0)|0;ga=c;ma=fa^ma;la=ga^la;v=gd(ma|0,la|0,16)|0;x=c;la=hd(ma|0,la|0,48)|0;v=la|v;x=c|x;o=dd(v|0,x|0,l|0,o|0)|0;l=c;wa=o^wa;va=l^va;la=gd(wa|0,va|0,63)|0;ma=c;va=hd(wa|0,va|0,1)|0;la=va|la;ma=c|ma;ca=dd(m|0,k|0,v|0,ca|0)|0;ca=dd(ca|0,c|0,la|0,ma|0)|0;v=c;aa=ca^aa;ba=v^ba;q=dd(ba|0,aa|0,t|0,q|0)|0;t=c;la=q^la;ma=t^ma;va=gd(la|0,ma|0,24)|0;wa=c;ma=hd(la|0,ma|0,40)|0;va=ma|va;wa=c|wa;v=dd(g|0,i|0,ca|0,v|0)|0;v=dd(v|0,c|0,va|0,wa|0)|0;ca=c;ba=v^ba;aa=ca^aa;ma=gd(ba|0,aa|0,16)|0;la=c;aa=hd(ba|0,aa|0,48)|0;ma=aa|ma;la=c|la;t=dd(ma|0,la|0,q|0,t|0)|0;q=c;va=t^va;wa=q^wa;aa=gd(va|0,wa|0,63)|0;ba=c;wa=hd(va|0,wa|0,1)|0;aa=wa|aa;ba=c|ba;oa=dd(ha|0,ia|0,na|0,oa|0)|0;oa=dd(oa|0,c|0,e|0,f|0)|0;na=c;z=z^oa;_=_^na;l=dd(_|0,z|0,o|0,l|0)|0;o=c;ha=l^ha;ia=o^ia;wa=gd(ha|0,ia|0,24)|0;va=c;ia=hd(ha|0,ia|0,40)|0;wa=ia|wa;va=c|va;na=dd(r|0,p|0,oa|0,na|0)|0;na=dd(na|0,c|0,wa|0,va|0)|0;oa=c;_=na^_;z=oa^z;ia=gd(_|0,z|0,16)|0;ha=c;z=hd(_|0,z|0,48)|0;ia=z|ia;ha=c|ha;o=dd(ia|0,ha|0,l|0,o|0)|0;l=c;wa=o^wa;va=l^va;z=gd(wa|0,va|0,63)|0;_=c;va=hd(wa|0,va|0,1)|0;z=va|z;_=c|_;ka=dd(ta|0,ua|0,ja|0,ka|0)|0;ka=dd(ka|0,c|0,h|0,f|0)|0;ja=c;v=v^ka;x=x^ja;g=dd(x|0,v|0,j|0,g|0)|0;j=c;ta=g^ta;ua=j^ua;va=gd(ta|0,ua|0,24)|0;wa=c;ua=hd(ta|0,ua|0,40)|0;va=ua|va;wa=c|wa;ja=dd(t|0,x|0,ka|0,ja|0)|0;ja=dd(ja|0,c|0,va|0,wa|0)|0;ka=c;x=ja^x;v=ka^v;ua=gd(x|0,v|0,16)|0;ta=c;v=hd(x|0,v|0,48)|0;ua=v|ua;ta=c|ta;j=dd(ua|0,ta|0,g|0,j|0)|0;g=c;va=j^va;wa=g^wa;v=gd(va|0,wa|0,63)|0;x=c;wa=hd(va|0,wa|0,1)|0;v=wa|v;x=c|x;ga=dd(pa|0,qa|0,fa|0,ga|0)|0;ga=dd(ga|0,c|0,y|0,a|0)|0;fa=c;da=da^ga;ea=ea^fa;z=dd(ea|0,da|0,e|0,z|0)|0;e=c;pa=z^pa;qa=e^qa;wa=gd(pa|0,qa|0,24)|0;va=c;qa=hd(pa|0,qa|0,40)|0;wa=qa|wa;va=c|va;fa=dd(b|0,s|0,ga|0,fa|0)|0;fa=dd(fa|0,c|0,wa|0,va|0)|0;ga=c;ea=fa^ea;da=ga^da;qa=gd(ea|0,da|0,16)|0;pa=c;da=hd(ea|0,da|0,48)|0;qa=da|qa;pa=c|pa;e=dd(qa|0,pa|0,z|0,e|0)|0;z=c;wa=e^wa;va=z^va;da=gd(wa|0,va|0,63)|0;ea=c;va=hd(wa|0,va|0,1)|0;da=va|da;ea=c|ea;ca=dd(z|0,_|0,v|0,ca|0)|0;ca=dd(ca|0,c|0,m|0,o|0)|0;v=c;qa=qa^ca;pa=pa^v;g=dd(pa|0,qa|0,j|0,g|0)|0;j=c;z=g^z;_=j^_;va=gd(z|0,_|0,24)|0;wa=c;_=hd(z|0,_|0,40)|0;va=_|va;wa=c|wa;v=dd(ra|0,sa|0,ca|0,v|0)|0;v=dd(v|0,c|0,va|0,wa|0)|0;ca=c;pa=v^pa;qa=ca^qa;_=gd(pa|0,qa|0,16)|0;z=c;qa=hd(pa|0,qa|0,48)|0;_=qa|_;z=c|z;j=dd(_|0,z|0,g|0,j|0)|0;g=c;va=j^va;wa=g^wa;qa=gd(va|0,wa|0,63)|0;pa=c;wa=hd(va|0,wa|0,1)|0;qa=wa|qa;pa=c|pa;oa=dd(v|0,x|0,na|0,oa|0)|0;oa=dd(oa|0,c|0,h|0,l|0)|0;na=c;ma=ma^oa;la=la^na;z=dd(la|0,ma|0,e|0,z|0)|0;e=c;v=z^v;x=e^x;wa=gd(v|0,x|0,24)|0;va=c;x=hd(v|0,x|0,40)|0;wa=x|wa;va=c|va;na=dd(s|0,u|0,oa|0,na|0)|0;na=dd(na|0,c|0,wa|0,va|0)|0;oa=c;la=na^la;ma=oa^ma;x=gd(la|0,ma|0,16)|0;v=c;ma=hd(la|0,ma|0,48)|0;x=ma|x;v=c|v;e=dd(x|0,v|0,z|0,e|0)|0;z=c;wa=e^wa;va=z^va;ma=gd(wa|0,va|0,63)|0;la=c;va=hd(wa|0,va|0,1)|0;ma=va|ma;la=c|la;ka=dd(da|0,ea|0,ja|0,ka|0)|0;ka=dd(ka|0,c|0,n|0,r|0)|0;ja=c;ia=ia^ka;ha=ha^ja;q=dd(ha|0,ia|0,t|0,q|0)|0;t=c;da=q^da;ea=t^ea;va=gd(da|0,ea|0,24)|0;wa=c;ea=hd(da|0,ea|0,40)|0;va=ea|va;wa=c|wa;ja=dd(w|0,u|0,ka|0,ja|0)|0;ja=dd(ja|0,c|0,va|0,wa|0)|0;ka=c;ha=ja^ha;ia=ka^ia;ea=gd(ha|0,ia|0,16)|0;da=c;ia=hd(ha|0,ia|0,48)|0;ea=ia|ea;da=c|da;t=dd(ea|0,da|0,q|0,t|0)|0;q=c;va=t^va;wa=q^wa;ia=gd(va|0,wa|0,63)|0;ha=c;wa=hd(va|0,wa|0,1)|0;ia=wa|ia;ha=c|ha;ga=dd(aa|0,ba|0,fa|0,ga|0)|0;ga=dd(ga|0,c|0,j|0,y|0)|0;fa=c;ua=ua^ga;ta=ta^fa;l=dd(ta|0,ua|0,o|0,l|0)|0;o=c;aa=l^aa;ba=o^ba;wa=gd(aa|0,ba|0,24)|0;va=c;ba=hd(aa|0,ba|0,40)|0;wa=ba|wa;va=c|va;fa=dd(p|0,$|0,ga|0,fa|0)|0;fa=dd(fa|0,c|0,wa|0,va|0)|0;ga=c;ta=fa^ta;ua=ga^ua;ba=gd(ta|0,ua|0,16)|0;aa=c;ua=hd(ta|0,ua|0,48)|0;ba=ua|ba;aa=c|aa;o=dd(ba|0,aa|0,l|0,o|0)|0;l=c;wa=o^wa;va=l^va;ua=gd(wa|0,va|0,63)|0;ta=c;va=hd(wa|0,va|0,1)|0;ua=va|ua;ta=c|ta;ca=dd(n|0,r|0,v|0,ca|0)|0;ca=dd(ca|0,c|0,ua|0,ta|0)|0;v=c;x=ca^x;v=v^v;q=dd(v|0,x|0,t|0,q|0)|0;t=c;ua=q^ua;ta=t^ta;va=gd(ua|0,ta|0,24)|0;wa=c;ta=hd(ua|0,ta|0,40)|0;va=ta|va;wa=c|wa;v=dd(j|0,y|0,ca|0,v|0)|0;v=dd(v|0,c|0,va|0,wa|0)|0;ca=c;v=v^v;x=ca^x;ta=gd(v|0,x|0,16)|0;ua=c;x=hd(v|0,x|0,48)|0;ta=x|ta;ua=c|ua;t=dd(ta|0,ua|0,q|0,t|0)|0;q=c;va=t^va;wa=q^wa;x=gd(va|0,wa|0,63)|0;v=c;wa=hd(va|0,wa|0,1)|0;x=wa|x;v=c|v;oa=dd(qa|0,pa|0,na|0,oa|0)|0;oa=dd(oa|0,c|0,h|0,l|0)|0;na=c;ea=ea^oa;da=da^na;l=dd(da|0,ea|0,o|0,l|0)|0;o=c;qa=l^qa;pa=o^pa;wa=gd(qa|0,pa|0,24)|0;va=c;pa=hd(qa|0,pa|0,40)|0;wa=pa|wa;va=c|va;na=dd(w|0,u|0,oa|0,na|0)|0;na=dd(na|0,c|0,wa|0,va|0)|0;oa=c;da=na^da;ea=oa^ea;pa=gd(da|0,ea|0,16)|0;qa=c;ea=hd(da|0,ea|0,48)|0;pa=ea|pa;qa=c|qa;o=dd(pa|0,qa|0,l|0,o|0)|0;l=c;wa=o^wa;va=l^va;ea=gd(wa|0,va|0,63)|0;da=c;va=hd(wa|0,va|0,1)|0;ea=va|ea;da=c|da;ka=dd(ma|0,la|0,ja|0,ka|0)|0;ka=dd(ka|0,c|0,b|0,s|0)|0;ja=c;ba=ba^ka;aa=aa^ja;g=dd(aa|0,ba|0,j|0,g|0)|0;j=c;ma=g^ma;la=j^la;va=gd(ma|0,la|0,24)|0;wa=c;la=hd(ma|0,la|0,40)|0;va=la|va;wa=c|wa;ja=dd(e|0,f|0,ka|0,ja|0)|0;ja=dd(ja|0,c|0,va|0,wa|0)|0;ka=c;aa=ja^aa;ba=ka^ba;la=gd(aa|0,ba|0,16)|0;ma=c;ba=hd(aa|0,ba|0,48)|0;la=ba|la;ma=c|ma;j=dd(la|0,ma|0,g|0,j|0)|0;g=c;va=j^va;wa=g^wa;ba=gd(va|0,wa|0,63)|0;aa=c;wa=hd(va|0,wa|0,1)|0;ba=wa|ba;aa=c|aa;ga=dd(ia|0,ha|0,fa|0,ga|0)|0;ga=dd(ga|0,c|0,m|0,k|0)|0;fa=c;_=_^ga;z=z^fa;z=dd(z|0,_|0,e|0,z|0)|0;e=c;ia=z^ia;ha=e^ha;wa=gd(ia|0,ha|0,24)|0;va=c;ha=hd(ia|0,ha|0,40)|0;wa=ha|wa;va=c|va;fa=dd(ra|0,sa|0,ga|0,fa|0)|0;fa=dd(fa|0,c|0,wa|0,va|0)|0;ga=c;z=fa^z;_=ga^_;ha=gd(z|0,_|0,16)|0;ia=c;_=hd(z|0,_|0,48)|0;ha=_|ha;ia=c|ia;e=dd(ha|0,ia|0,z|0,e|0)|0;z=c;wa=e^wa;va=z^va;_=gd(wa|0,va|0,63)|0;z=c;va=hd(wa|0,va|0,1)|0;_=va|_;z=c|z;ca=dd(ea|0,da|0,v|0,ca|0)|0;ca=dd(ca|0,c|0,t|0,x|0)|0;v=c;ha=ha^ca;ia=ia^v;g=dd(ia|0,ha|0,j|0,g|0)|0;j=c;ea=g^ea;da=j^da;va=gd(ea|0,da|0,24)|0;wa=c;da=hd(ea|0,da|0,40)|0;va=da|va;wa=c|wa;v=dd(s|0,u|0,ca|0,v|0)|0;v=dd(v|0,c|0,va|0,wa|0)|0;ca=c;ia=v^ia;ha=ca^ha;da=gd(ia|0,ha|0,16)|0;ea=c;ha=hd(ia|0,ha|0,48)|0;da=ha|da;ea=c|ea;j=dd(da|0,ea|0,g|0,j|0)|0;g=c;va=j^va;wa=g^wa;ha=gd(va|0,wa|0,63)|0;ia=c;wa=hd(va|0,wa|0,1)|0;ha=wa|ha;ia=c|ia;oa=dd(ba|0,aa|0,na|0,oa|0)|0;oa=dd(oa|0,c|0,h|0,f|0)|0;na=c;ta=ta^oa;ua=ua^na;z=dd(ua|0,ta|0,e|0,z|0)|0;e=c;ba=z^ba;aa=e^aa;wa=gd(ba|0,aa|0,24)|0;va=c;aa=hd(ba|0,aa|0,40)|0;wa=aa|wa;va=c|va;na=dd(m|0,o|0,oa|0,na|0)|0;na=dd(na|0,c|0,wa|0,va|0)|0;oa=c;ua=na^ua;ta=oa^ta;aa=gd(ua|0,ta|0,16)|0;ba=c;ta=hd(ua|0,ta|0,48)|0;aa=ta|aa;ba=c|ba;e=dd(aa|0,ba|0,z|0,e|0)|0;z=c;wa=e^wa;va=z^va;ta=gd(wa|0,va|0,63)|0;ua=c;va=hd(wa|0,va|0,1)|0;ta=va|ta;ua=c|ua;ka=dd(_|0,z|0,ja|0,ka|0)|0;ka=dd(ka|0,c|0,p|0,$|0)|0;ja=c;pa=pa^ka;qa=qa^ja;q=dd(qa|0,pa|0,t|0,q|0)|0;t=c;_=q^_;z=t^z;va=gd(_|0,z|0,24)|0;wa=c;z=hd(_|0,z|0,40)|0;va=z|va;wa=c|wa;ja=dd(r|0,p|0,ka|0,ja|0)|0;ja=dd(ja|0,c|0,va|0,wa|0)|0;ka=c;qa=ja^qa;pa=ka^pa;z=gd(qa|0,pa|0,16)|0;_=c;pa=hd(qa|0,pa|0,48)|0;z=pa|z;_=c|_;t=dd(z|0,_|0,q|0,t|0)|0;q=c;va=t^va;wa=q^wa;pa=gd(va|0,wa|0,63)|0;qa=c;wa=hd(va|0,wa|0,1)|0;pa=wa|pa;qa=c|qa;ga=dd(x|0,v|0,fa|0,ga|0)|0;ga=dd(ga|0,c|0,y|0,a|0)|0;fa=c;la=la^ga;ma=ma^fa;l=dd(ma|0,la|0,o|0,l|0)|0;o=c;x=l^x;v=o^v;wa=gd(x|0,v|0,24)|0;va=c;v=hd(x|0,v|0,40)|0;wa=v|wa;va=c|va;fa=dd(g|0,i|0,ga|0,fa|0)|0;fa=dd(fa|0,c|0,wa|0,va|0)|0;ga=c;ma=fa^ma;la=ga^la;v=gd(ma|0,la|0,16)|0;x=c;la=hd(ma|0,la|0,48)|0;v=la|v;x=c|x;o=dd(v|0,x|0,l|0,o|0)|0;l=c;wa=o^wa;va=l^va;la=gd(wa|0,va|0,63)|0;ma=c;va=hd(wa|0,va|0,1)|0;la=va|la;ma=c|ma;ca=dd(j|0,y|0,v|0,ca|0)|0;ca=dd(ca|0,c|0,la|0,ma|0)|0;v=c;aa=ca^aa;ba=v^ba;q=dd(ba|0,aa|0,t|0,q|0)|0;t=c;la=q^la;ma=t^ma;va=gd(la|0,ma|0,24)|0;wa=c;ma=hd(la|0,ma|0,40)|0;va=ma|va;wa=c|wa;v=dd(r|0,p|0,ca|0,v|0)|0;v=dd(v|0,c|0,va|0,wa|0)|0;ca=c;ba=v^ba;aa=ca^aa;ma=gd(ba|0,aa|0,16)|0;la=c;aa=hd(ba|0,aa|0,48)|0;ma=aa|ma;la=c|la;t=dd(ma|0,la|0,q|0,t|0)|0;q=c;va=t^va;wa=q^wa;aa=gd(va|0,wa|0,63)|0;ba=c;wa=hd(va|0,wa|0,1)|0;aa=wa|aa;ba=c|ba;oa=dd(ha|0,ia|0,na|0,oa|0)|0;oa=dd(oa|0,c|0,h|0,f|0)|0;na=c;z=z^oa;_=_^na;l=dd(_|0,z|0,o|0,l|0)|0;o=c;ha=l^ha;ia=o^ia;wa=gd(ha|0,ia|0,24)|0;va=c;ia=hd(ha|0,ia|0,40)|0;wa=ia|wa;va=c|va;na=dd(n|0,r|0,oa|0,na|0)|0;na=dd(na|0,c|0,wa|0,va|0)|0;oa=c;_=na^_;z=oa^z;ia=gd(_|0,z|0,16)|0;ha=c;z=hd(_|0,z|0,48)|0;ia=z|ia;ha=c|ha;o=dd(ia|0,ha|0,l|0,o|0)|0;l=c;wa=o^wa;va=l^va;z=gd(wa|0,va|0,63)|0;_=c;va=hd(wa|0,va|0,1)|0;z=va|z;_=c|_;ka=dd(ta|0,ua|0,ja|0,ka|0)|0;ka=dd(ka|0,c|0,t|0,x|0)|0;ja=c;v=v^ka;x=x^ja;g=dd(x|0,v|0,j|0,g|0)|0;j=c;ta=g^ta;ua=j^ua;va=gd(ta|0,ua|0,24)|0;wa=c;ua=hd(ta|0,ua|0,40)|0;va=ua|va;wa=c|wa;ja=dd(p|0,$|0,ka|0,ja|0)|0;ja=dd(ja|0,c|0,va|0,wa|0)|0;ka=c;x=ja^x;v=ka^v;ua=gd(x|0,v|0,16)|0;ta=c;v=hd(x|0,v|0,48)|0;ua=v|ua;ta=c|ta;j=dd(ua|0,ta|0,g|0,j|0)|0;g=c;va=j^va;wa=g^wa;v=gd(va|0,wa|0,63)|0;x=c;wa=hd(va|0,wa|0,1)|0;v=wa|v;x=c|x;ga=dd(pa|0,qa|0,fa|0,ga|0)|0;ga=dd(ga|0,c|0,m|0,o|0)|0;fa=c;da=da^ga;ea=ea^fa;z=dd(ea|0,da|0,e|0,z|0)|0;e=c;pa=z^pa;qa=e^qa;wa=gd(pa|0,qa|0,24)|0;va=c;qa=hd(pa|0,qa|0,40)|0;wa=qa|wa;va=c|va;fa=dd(y|0,a|0,ga|0,fa|0)|0;fa=dd(fa|0,c|0,wa|0,va|0)|0;ga=c;ea=fa^ea;da=ga^da;qa=gd(ea|0,da|0,16)|0;pa=c;da=hd(ea|0,da|0,48)|0;qa=da|qa;pa=c|pa;e=dd(qa|0,pa|0,z|0,e|0)|0;z=c;wa=e^wa;va=z^va;da=gd(wa|0,va|0,63)|0;ea=c;va=hd(wa|0,va|0,1)|0;da=va|da;ea=c|ea;ca=dd(z|0,_|0,v|0,ca|0)|0;ca=dd(ca|0,c|0,ra|0,sa|0)|0;v=c;qa=qa^ca;pa=pa^v;g=dd(pa|0,qa|0,j|0,g|0)|0;j=c;z=g^z;_=j^_;va=gd(z|0,_|0,24)|0;wa=c;_=hd(z|0,_|0,40)|0;va=_|va;wa=c|wa;v=dd(w|0,u|0,ca|0,v|0)|0;v=dd(v|0,c|0,va|0,wa|0)|0;ca=c;pa=v^pa;qa=ca^qa;_=gd(pa|0,qa|0,16)|0;z=c;qa=hd(pa|0,qa|0,48)|0;_=qa|_;z=c|z;j=dd(_|0,z|0,g|0,j|0)|0;g=c;va=j^va;wa=g^wa;qa=gd(va|0,wa|0,63)|0;pa=c;wa=hd(va|0,wa|0,1)|0;qa=wa|qa;pa=c|pa;oa=dd(v|0,x|0,na|0,oa|0)|0;oa=dd(oa|0,c|0,m|0,k|0)|0;na=c;ma=ma^oa;la=la^na;z=dd(la|0,ma|0,e|0,z|0)|0;e=c;v=z^v;x=e^x;wa=gd(v|0,x|0,24)|0;va=c;x=hd(v|0,x|0,40)|0;wa=x|wa;va=c|va;na=dd(e|0,f|0,oa|0,na|0)|0;na=dd(na|0,c|0,wa|0,va|0)|0;oa=c;la=na^la;ma=oa^ma;x=gd(la|0,ma|0,16)|0;v=c;ma=hd(la|0,ma|0,48)|0;x=ma|x;v=c|v;e=dd(x|0,v|0,z|0,e|0)|0;z=c;wa=e^wa;va=z^va;ma=gd(wa|0,va|0,63)|0;la=c;va=hd(wa|0,va|0,1)|0;ma=va|ma;la=c|la;ka=dd(da|0,ea|0,ja|0,ka|0)|0;ka=dd(ka|0,c|0,s|0,u|0)|0;ja=c;ia=ia^ka;ha=ha^ja;q=dd(ha|0,ia|0,t|0,q|0)|0;t=c;da=q^da;ea=t^ea;va=gd(da|0,ea|0,24)|0;wa=c;ea=hd(da|0,ea|0,40)|0;va=ea|va;wa=c|wa;ja=dd(g|0,i|0,ka|0,ja|0)|0;ja=dd(ja|0,c|0,va|0,wa|0)|0;ka=c;ha=ja^ha;ia=ka^ia;ea=gd(ha|0,ia|0,16)|0;da=c;ia=hd(ha|0,ia|0,48)|0;ea=ia|ea;da=c|da;t=dd(ea|0,da|0,q|0,t|0)|0;q=c;va=t^va;wa=q^wa;ia=gd(va|0,wa|0,63)|0;ha=c;wa=hd(va|0,wa|0,1)|0;ia=wa|ia;ha=c|ha;ga=dd(aa|0,ba|0,fa|0,ga|0)|0;ga=dd(ga|0,c|0,h|0,l|0)|0;fa=c;ua=ua^ga;ta=ta^fa;l=dd(ta|0,ua|0,o|0,l|0)|0;o=c;aa=l^aa;ba=o^ba;wa=gd(aa|0,ba|0,24)|0;va=c;ba=hd(aa|0,ba|0,40)|0;wa=ba|wa;va=c|va;fa=dd(b|0,s|0,ga|0,fa|0)|0;fa=dd(fa|0,c|0,wa|0,va|0)|0;ga=c;ta=fa^ta;ua=ga^ua;ba=gd(ta|0,ua|0,16)|0;aa=c;ua=hd(ta|0,ua|0,48)|0;ba=ua|ba;aa=c|aa;o=dd(ba|0,aa|0,l|0,o|0)|0;l=c;wa=o^wa;va=l^va;ua=gd(wa|0,va|0,63)|0;ta=c;va=hd(wa|0,va|0,1)|0;ua=va|ua;ta=c|ta;ca=dd(t|0,x|0,v|0,ca|0)|0;ca=dd(ca|0,c|0,ua|0,ta|0)|0;v=c;x=ca^x;v=v^v;q=dd(v|0,x|0,t|0,q|0)|0;t=c;ua=q^ua;ta=t^ta;va=gd(ua|0,ta|0,24)|0;wa=c;ta=hd(ua|0,ta|0,40)|0;va=ta|va;wa=c|wa;v=dd(e|0,f|0,ca|0,v|0)|0;v=dd(v|0,c|0,va|0,wa|0)|0;ca=c;v=v^v;x=ca^x;ta=gd(v|0,x|0,16)|0;ua=c;x=hd(v|0,x|0,48)|0;ta=x|ta;ua=c|ua;t=dd(ta|0,ua|0,q|0,t|0)|0;q=c;va=t^va;wa=q^wa;x=gd(va|0,wa|0,63)|0;v=c;wa=hd(va|0,wa|0,1)|0;x=wa|x;v=c|v;oa=dd(qa|0,pa|0,na|0,oa|0)|0;oa=dd(oa|0,c|0,s|0,u|0)|0;na=c;ea=ea^oa;da=da^na;l=dd(da|0,ea|0,o|0,l|0)|0;o=c;qa=l^qa;pa=o^pa;wa=gd(qa|0,pa|0,24)|0;va=c;pa=hd(qa|0,pa|0,40)|0;wa=pa|wa;va=c|va;na=dd(m|0,o|0,oa|0,na|0)|0;na=dd(na|0,c|0,wa|0,va|0)|0;oa=c;da=na^da;ea=oa^ea;pa=gd(da|0,ea|0,16)|0;qa=c;ea=hd(da|0,ea|0,48)|0;pa=ea|pa;qa=c|qa;o=dd(pa|0,qa|0,l|0,o|0)|0;l=c;wa=o^wa;va=l^va;ea=gd(wa|0,va|0,63)|0;da=c;va=hd(wa|0,va|0,1)|0;ea=va|ea;da=c|da;ka=dd(ma|0,la|0,ja|0,ka|0)|0;ka=dd(ka|0,c|0,r|0,p|0)|0;ja=c;ba=ba^ka;aa=aa^ja;g=dd(aa|0,ba|0,j|0,g|0)|0;j=c;ma=g^ma;la=j^la;va=gd(ma|0,la|0,24)|0;wa=c;la=hd(ma|0,la|0,40)|0;va=la|va;wa=c|wa;ja=dd(m|0,k|0,ka|0,ja|0)|0;ja=dd(ja|0,c|0,va|0,wa|0)|0;ka=c;aa=ja^aa;ba=ka^ba;la=gd(aa|0,ba|0,16)|0;ma=c;ba=hd(aa|0,ba|0,48)|0;la=ba|la;ma=c|ma;j=dd(la|0,ma|0,g|0,j|0)|0;g=c;va=j^va;wa=g^wa;ba=gd(va|0,wa|0,63)|0;aa=c;wa=hd(va|0,wa|0,1)|0;ba=wa|ba;aa=c|aa;ga=dd(ia|0,ha|0,fa|0,ga|0)|0;ga=dd(ga|0,c|0,g|0,i|0)|0;fa=c;_=_^ga;z=z^fa;z=dd(z|0,_|0,e|0,z|0)|0;e=c;ia=z^ia;ha=e^ha;wa=gd(ia|0,ha|0,24)|0;va=c;ha=hd(ia|0,ha|0,40)|0;wa=ha|wa;va=c|va;fa=dd(h|0,l|0,ga|0,fa|0)|0;fa=dd(fa|0,c|0,wa|0,va|0)|0;ga=c;z=fa^z;_=ga^_;ha=gd(z|0,_|0,16)|0;ia=c;_=hd(z|0,_|0,48)|0;ha=_|ha;ia=c|ia;e=dd(ha|0,ia|0,z|0,e|0)|0;z=c;wa=e^wa;va=z^va;_=gd(wa|0,va|0,63)|0;z=c;va=hd(wa|0,va|0,1)|0;_=va|_;z=c|z;ca=dd(ea|0,da|0,v|0,ca|0)|0;ca=dd(ca|0,c|0,p|0,$|0)|0;v=c;ha=ha^ca;ia=ia^v;g=dd(ia|0,ha|0,j|0,g|0)|0;j=c;ea=g^ea;da=j^da;va=gd(ea|0,da|0,24)|0;wa=c;da=hd(ea|0,da|0,40)|0;va=da|va;wa=c|wa;v=dd(b|0,s|0,ca|0,v|0)|0;v=dd(v|0,c|0,va|0,wa|0)|0;ca=c;ia=v^ia;ha=ca^ha;da=gd(ia|0,ha|0,16)|0;ea=c;ha=hd(ia|0,ha|0,48)|0;da=ha|da;ea=c|ea;j=dd(da|0,ea|0,g|0,j|0)|0;g=c;va=j^va;wa=g^wa;ha=gd(va|0,wa|0,63)|0;ia=c;wa=hd(va|0,wa|0,1)|0;ha=wa|ha;ia=c|ia;oa=dd(ba|0,aa|0,na|0,oa|0)|0;oa=dd(oa|0,c|0,n|0,r|0)|0;na=c;ta=ta^oa;ua=ua^na;z=dd(ua|0,ta|0,e|0,z|0)|0;e=c;ba=z^ba;aa=e^aa;wa=gd(ba|0,aa|0,24)|0;va=c;aa=hd(ba|0,aa|0,40)|0;wa=aa|wa;va=c|va;na=dd(h|0,f|0,oa|0,na|0)|0;na=dd(na|0,c|0,wa|0,va|0)|0;oa=c;ua=na^ua;ta=oa^ta;aa=gd(ua|0,ta|0,16)|0;ba=c;ta=hd(ua|0,ta|0,48)|0;aa=ta|aa;ba=c|ba;e=dd(aa|0,ba|0,z|0,e|0)|0;z=c;wa=e^wa;va=z^va;ta=gd(wa|0,va|0,63)|0;ua=c;va=hd(wa|0,va|0,1)|0;ta=va|ta;ua=c|ua;ka=dd(_|0,z|0,ja|0,ka|0)|0;ka=dd(ka|0,c|0,y|0,a|0)|0;ja=c;pa=pa^ka;qa=qa^ja;q=dd(qa|0,pa|0,t|0,q|0)|0;t=c;_=q^_;z=t^z;va=gd(_|0,z|0,24)|0;wa=c;z=hd(_|0,z|0,40)|0;va=z|va;wa=c|wa;ja=dd(ra|0,sa|0,ka|0,ja|0)|0;ja=dd(ja|0,c|0,va|0,wa|0)|0;ka=c;qa=ja^qa;pa=ka^pa;z=gd(qa|0,pa|0,16)|0;_=c;pa=hd(qa|0,pa|0,48)|0;z=pa|z;_=c|_;t=dd(z|0,_|0,q|0,t|0)|0;q=c;va=t^va;wa=q^wa;pa=gd(va|0,wa|0,63)|0;qa=c;wa=hd(va|0,wa|0,1)|0;pa=wa|pa;qa=c|qa;ga=dd(x|0,v|0,fa|0,ga|0)|0;ga=dd(ga|0,c|0,w|0,u|0)|0;fa=c;la=la^ga;ma=ma^fa;l=dd(ma|0,la|0,o|0,l|0)|0;o=c;x=l^x;v=o^v;wa=gd(x|0,v|0,24)|0;va=c;v=hd(x|0,v|0,40)|0;wa=v|wa;va=c|va;fa=dd(j|0,y|0,ga|0,fa|0)|0;fa=dd(fa|0,c|0,wa|0,va|0)|0;ga=c;ma=fa^ma;la=ga^la;v=gd(ma|0,la|0,16)|0;x=c;la=hd(ma|0,la|0,48)|0;v=la|v;x=c|x;o=dd(v|0,x|0,l|0,o|0)|0;l=c;wa=o^wa;va=l^va;la=gd(wa|0,va|0,63)|0;ma=c;va=hd(wa|0,va|0,1)|0;la=va|la;ma=c|ma;ca=dd(e|0,f|0,v|0,ca|0)|0;ca=dd(ca|0,c|0,la|0,ma|0)|0;v=c;aa=ca^aa;ba=v^ba;q=dd(ba|0,aa|0,t|0,q|0)|0;t=c;la=q^la;ma=t^ma;va=gd(la|0,ma|0,24)|0;wa=c;ma=hd(la|0,ma|0,40)|0;va=ma|va;wa=c|wa;v=dd(h|0,f|0,ca|0,v|0)|0;v=dd(v|0,c|0,va|0,wa|0)|0;ca=c;ba=v^ba;aa=ca^aa;ma=gd(ba|0,aa|0,16)|0;la=c;aa=hd(ba|0,aa|0,48)|0;ma=aa|ma;la=c|la;t=dd(ma|0,la|0,q|0,t|0)|0;q=c;va=t^va;wa=q^wa;aa=gd(va|0,wa|0,63)|0;ba=c;wa=hd(va|0,wa|0,1)|0;aa=wa|aa;ba=c|ba;oa=dd(ha|0,ia|0,na|0,oa|0)|0;oa=dd(oa|0,c|0,w|0,u|0)|0;na=c;z=z^oa;_=_^na;l=dd(_|0,z|0,o|0,l|0)|0;o=c;ha=l^ha;ia=o^ia;wa=gd(ha|0,ia|0,24)|0;va=c;ia=hd(ha|0,ia|0,40)|0;wa=ia|wa;va=c|va;na=dd(y|0,a|0,oa|0,na|0)|0;na=dd(na|0,c|0,wa|0,va|0)|0;oa=c;_=na^_;z=oa^z;ia=gd(_|0,z|0,16)|0;ha=c;z=hd(_|0,z|0,48)|0;ia=z|ia;ha=c|ha;o=dd(ia|0,ha|0,l|0,o|0)|0;l=c;wa=o^wa;va=l^va;z=gd(wa|0,va|0,63)|0;_=c;va=hd(wa|0,va|0,1)|0;z=va|z;_=c|_;ka=dd(ta|0,ua|0,ja|0,ka|0)|0;ka=dd(ka|0,c|0,ra|0,sa|0)|0;ja=c;v=v^ka;x=x^ja;g=dd(x|0,v|0,j|0,g|0)|0;j=c;ta=g^ta;ua=j^ua;va=gd(ta|0,ua|0,24)|0;wa=c;ua=hd(ta|0,ua|0,40)|0;va=ua|va;wa=c|wa;ja=dd(b|0,s|0,ka|0,ja|0)|0;ja=dd(ja|0,c|0,va|0,wa|0)|0;ka=c;x=ja^x;v=ka^v;ua=gd(x|0,v|0,16)|0;ta=c;v=hd(x|0,v|0,48)|0;ua=v|ua;ta=c|ta;j=dd(ua|0,ta|0,g|0,j|0)|0;g=c;va=j^va;wa=g^wa;v=gd(va|0,wa|0,63)|0;x=c;wa=hd(va|0,wa|0,1)|0;v=wa|v;x=c|x;ga=dd(pa|0,qa|0,fa|0,ga|0)|0;ga=dd(ga|0,c|0,p|0,$|0)|0;fa=c;da=da^ga;ea=ea^fa;z=dd(ea|0,da|0,e|0,z|0)|0;e=c;pa=z^pa;qa=e^qa;wa=gd(pa|0,qa|0,24)|0;va=c;qa=hd(pa|0,qa|0,40)|0;wa=qa|wa;va=c|va;fa=dd(m|0,o|0,ga|0,fa|0)|0;fa=dd(fa|0,c|0,wa|0,va|0)|0;ga=c;ea=fa^ea;da=ga^da;qa=gd(ea|0,da|0,16)|0;pa=c;da=hd(ea|0,da|0,48)|0;qa=da|qa;pa=c|pa;e=dd(qa|0,pa|0,z|0,e|0)|0;z=c;wa=e^wa;va=z^va;da=gd(wa|0,va|0,63)|0;ea=c;va=hd(wa|0,va|0,1)|0;da=va|da;ea=c|ea;ca=dd(z|0,_|0,v|0,ca|0)|0;ca=dd(ca|0,c|0,r|0,p|0)|0;v=c;qa=qa^ca;pa=pa^v;g=dd(pa|0,qa|0,j|0,g|0)|0;j=c;z=g^z;_=j^_;va=gd(z|0,_|0,24)|0;wa=c;_=hd(z|0,_|0,40)|0;va=_|va;wa=c|wa;v=dd(n|0,r|0,ca|0,v|0)|0;v=dd(v|0,c|0,va|0,wa|0)|0;ca=c;pa=v^pa;qa=ca^qa;_=gd(pa|0,qa|0,16)|0;z=c;qa=hd(pa|0,qa|0,48)|0;_=qa|_;z=c|z;j=dd(_|0,z|0,g|0,j|0)|0;g=c;va=j^va;wa=g^wa;qa=gd(va|0,wa|0,63)|0;pa=c;wa=hd(va|0,wa|0,1)|0;qa=wa|qa;pa=c|pa;oa=dd(v|0,x|0,na|0,oa|0)|0;oa=dd(oa|0,c|0,s|0,u|0)|0;na=c;ma=ma^oa;la=la^na;z=dd(la|0,ma|0,e|0,z|0)|0;e=c;v=z^v;x=e^x;wa=gd(v|0,x|0,24)|0;va=c;x=hd(v|0,x|0,40)|0;wa=x|wa;va=c|va;na=dd(h|0,l|0,oa|0,na|0)|0;na=dd(na|0,c|0,wa|0,va|0)|0;oa=c;la=na^la;ma=oa^ma;x=gd(la|0,ma|0,16)|0;v=c;ma=hd(la|0,ma|0,48)|0;x=ma|x;v=c|v;e=dd(x|0,v|0,z|0,e|0)|0;z=c;wa=e^wa;va=z^va;ma=gd(wa|0,va|0,63)|0;la=c;va=hd(wa|0,va|0,1)|0;ma=va|ma;la=c|la;ka=dd(da|0,ea|0,ja|0,ka|0)|0;ka=dd(ka|0,c|0,j|0,y|0)|0;ja=c;ia=ia^ka;ha=ha^ja;q=dd(ha|0,ia|0,t|0,q|0)|0;t=c;da=q^da;ea=t^ea;va=gd(da|0,ea|0,24)|0;wa=c;ea=hd(da|0,ea|0,40)|0;va=ea|va;wa=c|wa;ja=dd(t|0,x|0,ka|0,ja|0)|0;ja=dd(ja|0,c|0,va|0,wa|0)|0;ka=c;ha=ja^ha;ia=ka^ia;ea=gd(ha|0,ia|0,16)|0;da=c;ia=hd(ha|0,ia|0,48)|0;ea=ia|ea;da=c|da;t=dd(ea|0,da|0,q|0,t|0)|0;q=c;va=t^va;wa=q^wa;ia=gd(va|0,wa|0,63)|0;ha=c;wa=hd(va|0,wa|0,1)|0;ia=wa|ia;ha=c|ha;ga=dd(aa|0,ba|0,fa|0,ga|0)|0;ga=dd(ga|0,c|0,g|0,i|0)|0;fa=c;ua=ua^ga;ta=ta^fa;l=dd(ta|0,ua|0,o|0,l|0)|0;o=c;aa=l^aa;ba=o^ba;wa=gd(aa|0,ba|0,24)|0;va=c;ba=hd(aa|0,ba|0,40)|0;wa=ba|wa;va=c|va;fa=dd(m|0,k|0,ga|0,fa|0)|0;fa=dd(fa|0,c|0,wa|0,va|0)|0;ga=c;ta=fa^ta;ua=ga^ua;ba=gd(ta|0,ua|0,16)|0;aa=c;ua=hd(ta|0,ua|0,48)|0;ba=ua|ba;aa=c|aa;o=dd(ba|0,aa|0,l|0,o|0)|0;l=c;wa=o^wa;va=l^va;ua=gd(wa|0,va|0,63)|0;ta=c;va=hd(wa|0,va|0,1)|0;ua=va|ua;ta=c|ta;ca=dd(b|0,s|0,v|0,ca|0)|0;ca=dd(ca|0,c|0,ua|0,ta|0)|0;v=c;x=ca^x;v=v^v;q=dd(v|0,x|0,t|0,q|0)|0;t=c;ua=q^ua;ta=t^ta;va=gd(ua|0,ta|0,24)|0;wa=c;ta=hd(ua|0,ta|0,40)|0;va=ta|va;wa=c|wa;v=dd(m|0,k|0,ca|0,v|0)|0;v=dd(v|0,c|0,va|0,wa|0)|0;ca=c;v=v^v;x=ca^x;ta=gd(v|0,x|0,16)|0;ua=c;x=hd(v|0,x|0,48)|0;ta=x|ta;ua=c|ua;t=dd(ta|0,ua|0,q|0,t|0)|0;q=c;va=t^va;wa=q^wa;x=gd(va|0,wa|0,63)|0;v=c;wa=hd(va|0,wa|0,1)|0;x=wa|x;v=c|v;oa=dd(qa|0,pa|0,na|0,oa|0)|0;oa=dd(oa|0,c|0,n|0,r|0)|0;na=c;ea=ea^oa;da=da^na;l=dd(da|0,ea|0,o|0,l|0)|0;o=c;qa=l^qa;pa=o^pa;wa=gd(qa|0,pa|0,24)|0;va=c;pa=hd(qa|0,pa|0,40)|0;wa=pa|wa;va=c|va;na=dd(ra|0,sa|0,oa|0,na|0)|0;na=dd(na|0,c|0,wa|0,va|0)|0;oa=c;da=na^da;ea=oa^ea;pa=gd(da|0,ea|0,16)|0;qa=c;ea=hd(da|0,ea|0,48)|0;pa=ea|pa;qa=c|qa;o=dd(pa|0,qa|0,l|0,o|0)|0;l=c;wa=o^wa;va=l^va;ea=gd(wa|0,va|0,63)|0;da=c;va=hd(wa|0,va|0,1)|0;ea=va|ea;da=c|da;ka=dd(ma|0,la|0,ja|0,ka|0)|0;ka=dd(ka|0,c|0,e|0,f|0)|0;ja=c;ba=ba^ka;aa=aa^ja;g=dd(aa|0,ba|0,j|0,g|0)|0;j=c;ma=g^ma;la=j^la;va=gd(ma|0,la|0,24)|0;wa=c;la=hd(ma|0,la|0,40)|0;va=la|va;wa=c|wa;ja=dd(w|0,u|0,ka|0,ja|0)|0;ja=dd(ja|0,c|0,va|0,wa|0)|0;ka=c;aa=ja^aa;ba=ka^ba;la=gd(aa|0,ba|0,16)|0;ma=c;ba=hd(aa|0,ba|0,48)|0;la=ba|la;ma=c|ma;j=dd(la|0,ma|0,g|0,j|0)|0;g=c;va=j^va;wa=g^wa;ba=gd(va|0,wa|0,63)|0;aa=c;wa=hd(va|0,wa|0,1)|0;ba=wa|ba;aa=c|aa;ga=dd(ia|0,ha|0,fa|0,ga|0)|0;ga=dd(ga|0,c|0,h|0,l|0)|0;fa=c;_=_^ga;z=z^fa;z=dd(z|0,_|0,e|0,z|0)|0;e=c;ia=z^ia;ha=e^ha;wa=gd(ia|0,ha|0,24)|0;va=c;ha=hd(ia|0,ha|0,40)|0;wa=ha|wa;va=c|va;fa=dd(j|0,y|0,ga|0,fa|0)|0;fa=dd(fa|0,c|0,wa|0,va|0)|0;ga=c;z=fa^z;_=ga^_;ha=gd(z|0,_|0,16)|0;ia=c;_=hd(z|0,_|0,48)|0;ha=_|ha;ia=c|ia;e=dd(ha|0,ia|0,z|0,e|0)|0;z=c;wa=e^wa;va=z^va;_=gd(wa|0,va|0,63)|0;z=c;va=hd(wa|0,va|0,1)|0;_=va|_;z=c|z;ca=dd(ea|0,da|0,v|0,ca|0)|0;ca=dd(ca|0,c|0,h|0,f|0)|0;v=c;ha=ha^ca;ia=ia^v;g=dd(ia|0,ha|0,j|0,g|0)|0;j=c;ea=g^ea;da=j^da;va=gd(ea|0,da|0,24)|0;wa=c;da=hd(ea|0,da|0,40)|0;va=da|va;wa=c|wa;v=dd(r|0,p|0,ca|0,v|0)|0;v=dd(v|0,c|0,va|0,wa|0)|0;ca=c;ia=v^ia;ha=ca^ha;da=gd(ia|0,ha|0,16)|0;ea=c;ha=hd(ia|0,ha|0,48)|0;da=ha|da;ea=c|ea;j=dd(da|0,ea|0,g|0,j|0)|0;g=c;va=j^va;wa=g^wa;ha=gd(va|0,wa|0,63)|0;ia=c;wa=hd(va|0,wa|0,1)|0;ha=wa|ha;ia=c|ia;oa=dd(ba|0,aa|0,na|0,oa|0)|0;oa=dd(oa|0,c|0,y|0,a|0)|0;na=c;ta=ta^oa;ua=ua^na;z=dd(ua|0,ta|0,e|0,z|0)|0;e=c;ba=z^ba;aa=e^aa;wa=gd(ba|0,aa|0,24)|0;va=c;aa=hd(ba|0,aa|0,40)|0;wa=aa|wa;va=c|va;na=dd(p|0,$|0,oa|0,na|0)|0;na=dd(na|0,c|0,wa|0,va|0)|0;oa=c;ua=na^ua;ta=oa^ta;aa=gd(ua|0,ta|0,16)|0;ba=c;ta=hd(ua|0,ta|0,48)|0;aa=ta|aa;ba=c|ba;e=dd(aa|0,ba|0,z|0,e|0)|0;z=c;wa=e^wa;va=z^va;ta=gd(wa|0,va|0,63)|0;ua=c;va=hd(wa|0,va|0,1)|0;ta=va|ta;ua=c|ua;ka=dd(_|0,z|0,ja|0,ka|0)|0;ka=dd(ka|0,c|0,g|0,i|0)|0;ja=c;pa=pa^ka;qa=qa^ja;q=dd(qa|0,pa|0,t|0,q|0)|0;t=c;_=q^_;z=t^z;va=gd(_|0,z|0,24)|0;wa=c;z=hd(_|0,z|0,40)|0;va=z|va;wa=c|wa;ja=dd(s|0,u|0,ka|0,ja|0)|0;ja=dd(ja|0,c|0,va|0,wa|0)|0;ka=c;qa=ja^qa;pa=ka^pa;z=gd(qa|0,pa|0,16)|0;_=c;pa=hd(qa|0,pa|0,48)|0;z=pa|z;_=c|_;t=dd(z|0,_|0,q|0,t|0)|0;q=c;va=t^va;wa=q^wa;pa=gd(va|0,wa|0,63)|0;qa=c;wa=hd(va|0,wa|0,1)|0;pa=wa|pa;qa=c|qa;ga=dd(x|0,v|0,fa|0,ga|0)|0;ga=dd(ga|0,c|0,t|0,x|0)|0;fa=c;la=la^ga;ma=ma^fa;l=dd(ma|0,la|0,o|0,l|0)|0;o=c;x=l^x;v=o^v;wa=gd(x|0,v|0,24)|0;va=c;v=hd(x|0,v|0,40)|0;wa=v|wa;va=c|va;fa=dd(m|0,o|0,ga|0,fa|0)|0;fa=dd(fa|0,c|0,wa|0,va|0)|0;ga=c;ma=fa^ma;la=ga^la;v=gd(ma|0,la|0,16)|0;x=c;la=hd(ma|0,la|0,48)|0;v=la|v;x=c|x;o=dd(v|0,x|0,l|0,o|0)|0;l=c;wa=o^wa;va=l^va;la=gd(wa|0,va|0,63)|0;ma=c;va=hd(wa|0,va|0,1)|0;la=va|la;ma=c|ma;ca=dd(s|0,u|0,v|0,ca|0)|0;ca=dd(ca|0,c|0,la|0,ma|0)|0;v=c;aa=ca^aa;ba=v^ba;q=dd(ba|0,aa|0,t|0,q|0)|0;t=c;la=q^la;ma=t^ma;va=gd(la|0,ma|0,24)|0;wa=c;ma=hd(la|0,ma|0,40)|0;va=ma|va;wa=c|wa;v=dd(y|0,a|0,ca|0,v|0)|0;v=dd(v|0,c|0,va|0,wa|0)|0;ca=c;ba=v^ba;aa=ca^aa;ma=gd(ba|0,aa|0,16)|0;la=c;aa=hd(ba|0,aa|0,48)|0;ma=aa|ma;la=c|la;t=dd(ma|0,la|0,q|0,t|0)|0;q=c;va=t^va;wa=q^wa;aa=gd(va|0,wa|0,63)|0;ba=c;wa=hd(va|0,wa|0,1)|0;aa=wa|aa;ba=c|ba;oa=dd(ha|0,ia|0,na|0,oa|0)|0;oa=dd(oa|0,c|0,ra|0,sa|0)|0;na=c;z=z^oa;_=_^na;l=dd(_|0,z|0,o|0,l|0)|0;o=c;ha=l^ha;ia=o^ia;wa=gd(ha|0,ia|0,24)|0;va=c;ia=hd(ha|0,ia|0,40)|0;wa=ia|wa;va=c|va;na=dd(j|0,y|0,oa|0,na|0)|0;na=dd(na|0,c|0,wa|0,va|0)|0;oa=c;_=na^_;z=oa^z;ia=gd(_|0,z|0,16)|0;ha=c;z=hd(_|0,z|0,48)|0;ia=z|ia;ha=c|ha;o=dd(ia|0,ha|0,l|0,o|0)|0;l=c;wa=o^wa;va=l^va;z=gd(wa|0,va|0,63)|0;_=c;va=hd(wa|0,va|0,1)|0;z=va|z;_=c|_;ka=dd(ta|0,ua|0,ja|0,ka|0)|0;ka=dd(ka|0,c|0,m|0,k|0)|0;ja=c;v=v^ka;x=x^ja;g=dd(x|0,v|0,j|0,g|0)|0;j=c;ta=g^ta;ua=j^ua;va=gd(ta|0,ua|0,24)|0;wa=c;ua=hd(ta|0,ua|0,40)|0;va=ua|va;wa=c|wa;ja=dd(h|0,l|0,ka|0,ja|0)|0;ja=dd(ja|0,c|0,va|0,wa|0)|0;ka=c;x=ja^x;v=ka^v;ua=gd(x|0,v|0,16)|0;ta=c;v=hd(x|0,v|0,48)|0;ua=v|ua;ta=c|ta;j=dd(ua|0,ta|0,g|0,j|0)|0;g=c;va=j^va;wa=g^wa;v=gd(va|0,wa|0,63)|0;x=c;wa=hd(va|0,wa|0,1)|0;v=wa|v;x=c|x;ga=dd(pa|0,qa|0,fa|0,ga|0)|0;ga=dd(ga|0,c|0,r|0,p|0)|0;fa=c;da=da^ga;ea=ea^fa;z=dd(ea|0,da|0,e|0,z|0)|0;e=c;pa=z^pa;qa=e^qa;wa=gd(pa|0,qa|0,24)|0;va=c;qa=hd(pa|0,qa|0,40)|0;wa=qa|wa;va=c|va;fa=dd(g|0,i|0,ga|0,fa|0)|0;fa=dd(fa|0,c|0,wa|0,va|0)|0;ga=c;ea=fa^ea;da=ga^da;qa=gd(ea|0,da|0,16)|0;pa=c;da=hd(ea|0,da|0,48)|0;qa=da|qa;pa=c|pa;e=dd(qa|0,pa|0,z|0,e|0)|0;z=c;wa=e^wa;va=z^va;da=gd(wa|0,va|0,63)|0;ea=c;va=hd(wa|0,va|0,1)|0;da=va|da;ea=c|ea;ca=dd(z|0,_|0,v|0,ca|0)|0;ca=dd(ca|0,c|0,e|0,f|0)|0;v=c;qa=qa^ca;pa=pa^v;g=dd(pa|0,qa|0,j|0,g|0)|0;j=c;z=g^z;_=j^_;va=gd(z|0,_|0,24)|0;wa=c;_=hd(z|0,_|0,40)|0;va=_|va;wa=c|wa;v=dd(t|0,x|0,ca|0,v|0)|0;v=dd(v|0,c|0,va|0,wa|0)|0;ca=c;pa=v^pa;qa=ca^qa;_=gd(pa|0,qa|0,16)|0;z=c;qa=hd(pa|0,qa|0,48)|0;_=qa|_;z=c|z;j=dd(_|0,z|0,g|0,j|0)|0;g=c;va=j^va;wa=g^wa;qa=gd(va|0,wa|0,63)|0;pa=c;wa=hd(va|0,wa|0,1)|0;qa=wa|qa;pa=c|pa;oa=dd(v|0,x|0,na|0,oa|0)|0;oa=dd(oa|0,c|0,b|0,s|0)|0;na=c;ma=ma^oa;la=la^na;z=dd(la|0,ma|0,e|0,z|0)|0;e=c;v=z^v;x=e^x;wa=gd(v|0,x|0,24)|0;va=c;x=hd(v|0,x|0,40)|0;wa=x|wa;va=c|va;na=dd(n|0,r|0,oa|0,na|0)|0;na=dd(na|0,c|0,wa|0,va|0)|0;oa=c;la=na^la;ma=oa^ma;x=gd(la|0,ma|0,16)|0;v=c;ma=hd(la|0,ma|0,48)|0;x=ma|x;v=c|v;e=dd(x|0,v|0,z|0,e|0)|0;z=c;wa=e^wa;va=z^va;ma=gd(wa|0,va|0,63)|0;la=c;va=hd(wa|0,va|0,1)|0;ma=va|ma;la=c|la;ka=dd(da|0,ea|0,ja|0,ka|0)|0;ka=dd(ka|0,c|0,w|0,u|0)|0;ja=c;ia=ia^ka;ha=ha^ja;q=dd(ha|0,ia|0,t|0,q|0)|0;t=c;da=q^da;ea=t^ea;va=gd(da|0,ea|0,24)|0;wa=c;ea=hd(da|0,ea|0,40)|0;va=ea|va;wa=c|wa;ja=dd(p|0,$|0,ka|0,ja|0)|0;ja=dd(ja|0,c|0,va|0,wa|0)|0;ka=c;ha=ja^ha;ia=ka^ia;ea=gd(ha|0,ia|0,16)|0;da=c;ia=hd(ha|0,ia|0,48)|0;ea=ia|ea;da=c|da;t=dd(ea|0,da|0,q|0,t|0)|0;q=c;va=t^va;wa=q^wa;ia=gd(va|0,wa|0,63)|0;ha=c;wa=hd(va|0,wa|0,1)|0;ia=wa|ia;ha=c|ha;ga=dd(aa|0,ba|0,fa|0,ga|0)|0;ga=dd(ga|0,c|0,m|0,o|0)|0;fa=c;ua=ua^ga;ta=ta^fa;l=dd(ta|0,ua|0,o|0,l|0)|0;o=c;aa=l^aa;ba=o^ba;wa=gd(aa|0,ba|0,24)|0;va=c;ba=hd(aa|0,ba|0,40)|0;wa=ba|wa;va=c|va;fa=dd(h|0,f|0,ga|0,fa|0)|0;fa=dd(fa|0,c|0,wa|0,va|0)|0;ga=c;ta=fa^ta;ua=ga^ua;ba=gd(ta|0,ua|0,16)|0;aa=c;ua=hd(ta|0,ua|0,48)|0;ba=ua|ba;aa=c|aa;o=dd(ba|0,aa|0,l|0,o|0)|0;l=c;wa=o^wa;va=l^va;ua=gd(wa|0,va|0,63)|0;ta=c;va=hd(wa|0,va|0,1)|0;ua=va|ua;ta=c|ta;ca=dd(m|0,o|0,v|0,ca|0)|0;ca=dd(ca|0,c|0,ua|0,ta|0)|0;v=c;x=ca^x;v=v^v;q=dd(v|0,x|0,t|0,q|0)|0;t=c;ua=q^ua;ta=t^ta;va=gd(ua|0,ta|0,24)|0;wa=c;ta=hd(ua|0,ta|0,40)|0;va=ta|va;wa=c|wa;v=dd(t|0,x|0,ca|0,v|0)|0;v=dd(v|0,c|0,va|0,wa|0)|0;ca=c;v=v^v;x=ca^x;ta=gd(v|0,x|0,16)|0;ua=c;x=hd(v|0,x|0,48)|0;ta=x|ta;ua=c|ua;t=dd(ta|0,ua|0,q|0,t|0)|0;q=c;va=t^va;wa=q^wa;x=gd(va|0,wa|0,63)|0;v=c;wa=hd(va|0,wa|0,1)|0;x=wa|x;v=c|v;oa=dd(qa|0,pa|0,na|0,oa|0)|0;oa=dd(oa|0,c|0,g|0,i|0)|0;na=c;ea=ea^oa;da=da^na;l=dd(da|0,ea|0,o|0,l|0)|0;o=c;qa=l^qa;pa=o^pa;wa=gd(qa|0,pa|0,24)|0;va=c;pa=hd(qa|0,pa|0,40)|0;wa=pa|wa;va=c|va;na=dd(p|0,$|0,oa|0,na|0)|0;na=dd(na|0,c|0,wa|0,va|0)|0;oa=c;da=na^da;ea=oa^ea;pa=gd(da|0,ea|0,16)|0;qa=c;ea=hd(da|0,ea|0,48)|0;pa=ea|pa;qa=c|qa;o=dd(pa|0,qa|0,l|0,o|0)|0;l=c;wa=o^wa;va=l^va;ea=gd(wa|0,va|0,63)|0;da=c;va=hd(wa|0,va|0,1)|0;ea=va|ea;da=c|da;ka=dd(ma|0,la|0,ja|0,ka|0)|0;ka=dd(ka|0,c|0,n|0,r|0)|0;ja=c;ba=ba^ka;aa=aa^ja;g=dd(aa|0,ba|0,j|0,g|0)|0;j=c;ma=g^ma;la=j^la;va=gd(ma|0,la|0,24)|0;wa=c;la=hd(ma|0,la|0,40)|0;va=la|va;wa=c|wa;ja=dd(s|0,u|0,ka|0,ja|0)|0;ja=dd(ja|0,c|0,va|0,wa|0)|0;ka=c;aa=ja^aa;ba=ka^ba;la=gd(aa|0,ba|0,16)|0;ma=c;ba=hd(aa|0,ba|0,48)|0;la=ba|la;ma=c|ma;j=dd(la|0,ma|0,g|0,j|0)|0;g=c;va=j^va;wa=g^wa;ba=gd(va|0,wa|0,63)|0;aa=c;wa=hd(va|0,wa|0,1)|0;ba=wa|ba;aa=c|aa;ga=dd(ia|0,ha|0,fa|0,ga|0)|0;ga=dd(ga|0,c|0,w|0,u|0)|0;fa=c;_=_^ga;z=z^fa;z=dd(z|0,_|0,e|0,z|0)|0;e=c;ia=z^ia;ha=e^ha;wa=gd(ia|0,ha|0,24)|0;va=c;ha=hd(ia|0,ha|0,40)|0;wa=ha|wa;va=c|va;fa=dd(h|0,f|0,ga|0,fa|0)|0;fa=dd(fa|0,c|0,wa|0,va|0)|0;ga=c;z=fa^z;_=ga^_;ha=gd(z|0,_|0,16)|0;ia=c;_=hd(z|0,_|0,48)|0;ha=_|ha;ia=c|ia;e=dd(ha|0,ia|0,z|0,e|0)|0;z=c;wa=e^wa;va=z^va;_=gd(wa|0,va|0,63)|0;z=c;va=hd(wa|0,va|0,1)|0;_=va|_;z=c|z;ca=dd(ea|0,da|0,v|0,ca|0)|0;ca=dd(ca|0,c|0,y|0,a|0)|0;v=c;ha=ha^ca;ia=ia^v;g=dd(ia|0,ha|0,j|0,g|0)|0;j=c;ea=g^ea;da=j^da;va=gd(ea|0,da|0,24)|0;wa=c;da=hd(ea|0,da|0,40)|0;va=da|va;wa=c|wa;v=dd(m|0,k|0,ca|0,v|0)|0;v=dd(v|0,c|0,va|0,wa|0)|0;ca=c;ia=v^ia;ha=ca^ha;da=gd(ia|0,ha|0,16)|0;ea=c;ha=hd(ia|0,ha|0,48)|0;da=ha|da;ea=c|ea;j=dd(da|0,ea|0,g|0,j|0)|0;g=c;va=j^va;wa=g^wa;ha=gd(va|0,wa|0,63)|0;ia=c;wa=hd(va|0,wa|0,1)|0;ha=wa|ha;ia=c|ia;oa=dd(ba|0,aa|0,na|0,oa|0)|0;oa=dd(oa|0,c|0,j|0,y|0)|0;na=c;ta=ta^oa;ua=ua^na;z=dd(ua|0,ta|0,e|0,z|0)|0;e=c;ba=z^ba;aa=e^aa;wa=gd(ba|0,aa|0,24)|0;va=c;aa=hd(ba|0,aa|0,40)|0;wa=aa|wa;va=c|va;na=dd(ra|0,sa|0,oa|0,na|0)|0;na=dd(na|0,c|0,wa|0,va|0)|0;oa=c;ua=na^ua;ta=oa^ta;aa=gd(ua|0,ta|0,16)|0;ba=c;ta=hd(ua|0,ta|0,48)|0;aa=ta|aa;ba=c|ba;e=dd(aa|0,ba|0,z|0,e|0)|0;z=c;wa=e^wa;va=z^va;ta=gd(wa|0,va|0,63)|0;ua=c;va=hd(wa|0,va|0,1)|0;ta=va|ta;ua=c|ua;ka=dd(_|0,z|0,ja|0,ka|0)|0;ka=dd(ka|0,c|0,h|0,l|0)|0;ja=c;pa=pa^ka;qa=qa^ja;q=dd(qa|0,pa|0,t|0,q|0)|0;t=c;_=q^_;z=t^z;va=gd(_|0,z|0,24)|0;wa=c;z=hd(_|0,z|0,40)|0;va=z|va;wa=c|wa;ja=dd(e|0,f|0,ka|0,ja|0)|0;ja=dd(ja|0,c|0,va|0,wa|0)|0;ka=c;qa=ja^qa;pa=ka^pa;z=gd(qa|0,pa|0,16)|0;_=c;pa=hd(qa|0,pa|0,48)|0;z=pa|z;_=c|_;t=dd(z|0,_|0,q|0,t|0)|0;q=c;va=t^va;wa=q^wa;pa=gd(va|0,wa|0,63)|0;qa=c;wa=hd(va|0,wa|0,1)|0;pa=wa|pa;qa=c|qa;ga=dd(x|0,v|0,fa|0,ga|0)|0;ga=dd(ga|0,c|0,b|0,s|0)|0;fa=c;la=la^ga;ma=ma^fa;l=dd(ma|0,la|0,o|0,l|0)|0;o=c;x=l^x;v=o^v;wa=gd(x|0,v|0,24)|0;va=c;v=hd(x|0,v|0,40)|0;wa=v|wa;va=c|va;fa=dd(r|0,p|0,ga|0,fa|0)|0;fa=dd(fa|0,c|0,wa|0,va|0)|0;ga=c;ma=fa^ma;la=ga^la;v=gd(ma|0,la|0,16)|0;x=c;la=hd(ma|0,la|0,48)|0;v=la|v;x=c|x;o=dd(v|0,x|0,l|0,o|0)|0;l=c;wa=o^wa;va=l^va;la=gd(wa|0,va|0,63)|0;ma=c;va=hd(wa|0,va|0,1)|0;la=va|la;ma=c|ma;ca=dd(r|0,p|0,v|0,ca|0)|0;ca=dd(ca|0,c|0,la|0,ma|0)|0;v=c;aa=ca^aa;ba=v^ba;q=dd(ba|0,aa|0,t|0,q|0)|0;t=c;la=q^la;ma=t^ma;va=gd(la|0,ma|0,24)|0;wa=c;ma=hd(la|0,ma|0,40)|0;va=ma|va;wa=c|wa;v=dd(w|0,u|0,ca|0,v|0)|0;v=dd(v|0,c|0,va|0,wa|0)|0;ca=c;ba=v^ba;aa=ca^aa;ma=gd(ba|0,aa|0,16)|0;la=c;aa=hd(ba|0,aa|0,48)|0;ma=aa|ma;la=c|la;t=dd(ma|0,la|0,q|0,t|0)|0;q=c;va=t^va;wa=q^wa;aa=gd(va|0,wa|0,63)|0;ba=c;wa=hd(va|0,wa|0,1)|0;aa=wa|aa;ba=c|ba;oa=dd(ha|0,ia|0,na|0,oa|0)|0;oa=dd(oa|0,c|0,t|0,x|0)|0;na=c;z=z^oa;_=_^na;l=dd(_|0,z|0,o|0,l|0)|0;o=c;ha=l^ha;ia=o^ia;wa=gd(ha|0,ia|0,24)|0;va=c;ia=hd(ha|0,ia|0,40)|0;wa=ia|wa;va=c|va;na=dd(h|0,l|0,oa|0,na|0)|0;na=dd(na|0,c|0,wa|0,va|0)|0;oa=c;_=na^_;z=oa^z;ia=gd(_|0,z|0,16)|0;ha=c;z=hd(_|0,z|0,48)|0;ia=z|ia;ha=c|ha;o=dd(ia|0,ha|0,l|0,o|0)|0;l=c;wa=o^wa;va=l^va;z=gd(wa|0,va|0,63)|0;_=c;va=hd(wa|0,va|0,1)|0;z=va|z;_=c|_;ka=dd(ta|0,ua|0,ja|0,ka|0)|0;ka=dd(ka|0,c|0,p|0,$|0)|0;ja=c;v=v^ka;x=x^ja;g=dd(x|0,v|0,j|0,g|0)|0;j=c;ta=g^ta;ua=j^ua;va=gd(ta|0,ua|0,24)|0;wa=c;ua=hd(ta|0,ua|0,40)|0;va=ua|va;wa=c|wa;ja=dd(h|0,f|0,ka|0,ja|0)|0;ja=dd(ja|0,c|0,va|0,wa|0)|0;ka=c;x=ja^x;v=ka^v;ua=gd(x|0,v|0,16)|0;ta=c;v=hd(x|0,v|0,48)|0;ua=v|ua;ta=c|ta;j=dd(ua|0,ta|0,g|0,j|0)|0;g=c;va=j^va;wa=g^wa;v=gd(va|0,wa|0,63)|0;x=c;wa=hd(va|0,wa|0,1)|0;v=wa|v;x=c|x;ga=dd(pa|0,qa|0,fa|0,ga|0)|0;ga=dd(ga|0,c|0,s|0,u|0)|0;fa=c;da=da^ga;ea=ea^fa;z=dd(ea|0,da|0,e|0,z|0)|0;e=c;pa=z^pa;qa=e^qa;wa=gd(pa|0,qa|0,24)|0;va=c;qa=hd(pa|0,qa|0,40)|0;wa=qa|wa;va=c|va;fa=dd(n|0,r|0,ga|0,fa|0)|0;fa=dd(fa|0,c|0,wa|0,va|0)|0;ga=c;ea=fa^ea;da=ga^da;qa=gd(ea|0,da|0,16)|0;pa=c;da=hd(ea|0,da|0,48)|0;qa=da|qa;pa=c|pa;e=dd(qa|0,pa|0,z|0,e|0)|0;z=c;wa=e^wa;va=z^va;da=gd(wa|0,va|0,63)|0;ea=c;va=hd(wa|0,va|0,1)|0;da=va|da;ea=c|ea;ca=dd(z|0,_|0,v|0,ca|0)|0;ca=dd(ca|0,c|0,g|0,i|0)|0;v=c;qa=qa^ca;pa=pa^v;g=dd(pa|0,qa|0,j|0,g|0)|0;j=c;z=g^z;_=j^_;va=gd(z|0,_|0,24)|0;wa=c;_=hd(z|0,_|0,40)|0;va=_|va;wa=c|wa;v=dd(j|0,y|0,ca|0,v|0)|0;v=dd(v|0,c|0,va|0,wa|0)|0;ca=c;pa=v^pa;qa=ca^qa;_=gd(pa|0,qa|0,16)|0;z=c;qa=hd(pa|0,qa|0,48)|0;_=qa|_;z=c|z;j=dd(_|0,z|0,g|0,j|0)|0;g=c;va=j^va;wa=g^wa;qa=gd(va|0,wa|0,63)|0;pa=c;wa=hd(va|0,wa|0,1)|0;qa=wa|qa;pa=c|pa;oa=dd(v|0,x|0,na|0,oa|0)|0;oa=dd(oa|0,c|0,m|0,o|0)|0;na=c;ma=ma^oa;la=la^na;z=dd(la|0,ma|0,e|0,z|0)|0;e=c;v=z^v;x=e^x;wa=gd(v|0,x|0,24)|0;va=c;x=hd(v|0,x|0,40)|0;wa=x|wa;va=c|va;na=dd(m|0,k|0,oa|0,na|0)|0;na=dd(na|0,c|0,wa|0,va|0)|0;oa=c;la=na^la;ma=oa^ma;x=gd(la|0,ma|0,16)|0;v=c;ma=hd(la|0,ma|0,48)|0;x=ma|x;v=c|v;e=dd(x|0,v|0,z|0,e|0)|0;z=c;wa=e^wa;va=z^va;ma=gd(wa|0,va|0,63)|0;la=c;va=hd(wa|0,va|0,1)|0;ma=va|ma;la=c|la;ka=dd(da|0,ea|0,ja|0,ka|0)|0;ka=dd(ka|0,c|0,e|0,f|0)|0;ja=c;ia=ia^ka;ha=ha^ja;q=dd(ha|0,ia|0,t|0,q|0)|0;t=c;da=q^da;ea=t^ea;va=gd(da|0,ea|0,24)|0;wa=c;ea=hd(da|0,ea|0,40)|0;va=ea|va;wa=c|wa;ja=dd(b|0,s|0,ka|0,ja|0)|0;ja=dd(ja|0,c|0,va|0,wa|0)|0;ka=c;ha=ja^ha;ia=ka^ia;ea=gd(ha|0,ia|0,16)|0;da=c;ia=hd(ha|0,ia|0,48)|0;ea=ia|ea;da=c|da;t=dd(ea|0,da|0,q|0,t|0)|0;q=c;va=t^va;wa=q^wa;ia=gd(va|0,wa|0,63)|0;ha=c;wa=hd(va|0,wa|0,1)|0;ia=wa|ia;ha=c|ha;ga=dd(aa|0,ba|0,fa|0,ga|0)|0;ga=dd(ga|0,c|0,ra|0,sa|0)|0;fa=c;ua=ua^ga;ta=ta^fa;l=dd(ta|0,ua|0,o|0,l|0)|0;o=c;aa=l^aa;ba=o^ba;wa=gd(aa|0,ba|0,24)|0;va=c;ba=hd(aa|0,ba|0,40)|0;wa=ba|wa;va=c|va;fa=dd(y|0,a|0,ga|0,fa|0)|0;fa=dd(fa|0,c|0,wa|0,va|0)|0;ga=c;ta=fa^ta;ua=ga^ua;ba=gd(ta|0,ua|0,16)|0;aa=c;ua=hd(ta|0,ua|0,48)|0;ba=ua|ba;aa=c|aa;o=dd(ba|0,aa|0,l|0,o|0)|0;l=c;wa=o^wa;va=l^va;ua=gd(wa|0,va|0,63)|0;ta=c;va=hd(wa|0,va|0,1)|0;ua=va|ua;ta=c|ta;ca=dd(ra|0,sa|0,v|0,ca|0)|0;ca=dd(ca|0,c|0,ua|0,ta|0)|0;v=c;x=ca^x;v=v^v;q=dd(v|0,x|0,t|0,q|0)|0;t=c;ua=q^ua;ta=t^ta;sa=gd(ua|0,ta|0,24)|0;ra=c;ta=hd(ua|0,ta|0,40)|0;sa=ta|sa;ra=c|ra;v=dd(m|0,o|0,ca|0,v|0)|0;v=dd(v|0,c|0,sa|0,ra|0)|0;ca=c;v=v^v;x=ca^x;o=gd(v|0,x|0,16)|0;m=c;x=hd(v|0,x|0,48)|0;o=x|o;m=c|m;t=dd(o|0,m|0,q|0,t|0)|0;q=c;sa=t^sa;ra=q^ra;x=gd(sa|0,ra|0,63)|0;v=c;ra=hd(sa|0,ra|0,1)|0;x=ra|x;v=c|v;oa=dd(qa|0,pa|0,na|0,oa|0)|0;$=dd(oa|0,c|0,p|0,$|0)|0;p=c;ea=ea^$;da=da^p;l=dd(da|0,ea|0,o|0,l|0)|0;o=c;qa=l^qa;pa=o^pa;oa=gd(qa|0,pa|0,24)|0;na=c;pa=hd(qa|0,pa|0,40)|0;oa=pa|oa;na=c|na;p=dd(g|0,i|0,$|0,p|0)|0;p=dd(p|0,c|0,oa|0,na|0)|0;$=c;da=p^da;ea=$^ea;i=gd(da|0,ea|0,16)|0;g=c;ea=hd(da|0,ea|0,48)|0;i=ea|i;g=c|g;o=dd(i|0,g|0,l|0,o|0)|0;l=c;oa=o^oa;na=l^na;ea=gd(oa|0,na|0,63)|0;da=c;na=hd(oa|0,na|0,1)|0;ea=na|ea;da=c|da;ka=dd(ma|0,la|0,ja|0,ka|0)|0;y=dd(ka|0,c|0,j|0,y|0)|0;j=c;ba=ba^y;aa=aa^j;g=dd(aa|0,ba|0,j|0,g|0)|0;j=c;ma=g^ma;la=j^la;ka=gd(ma|0,la|0,24)|0;ja=c;la=hd(ma|0,la|0,40)|0;ka=la|ka;ja=c|ja;j=dd(y|0,a|0,y|0,j|0)|0;j=dd(j|0,c|0,ka|0,ja|0)|0;y=c;aa=j^aa;ba=y^ba;a=gd(aa|0,ba|0,16)|0;y=c;ba=hd(aa|0,ba|0,48)|0;a=ba|a;y=c|y;j=dd(a|0,y|0,g|0,j|0)|0;g=c;ka=j^ka;ja=g^ja;ba=gd(ka|0,ja|0,63)|0;aa=c;ja=hd(ka|0,ja|0,1)|0;ba=ja|ba;aa=c|aa;ga=dd(ia|0,ha|0,fa|0,ga|0)|0;s=dd(ga|0,c|0,b|0,s|0)|0;b=c;_=_^s;z=z^b;z=dd(z|0,_|0,e|0,z|0)|0;e=c;ia=z^ia;ha=e^ha;ga=gd(ia|0,ha|0,24)|0;fa=c;ha=hd(ia|0,ha|0,40)|0;ga=ha|ga;fa=c|fa;b=dd(s|0,u|0,s|0,b|0)|0;b=dd(b|0,c|0,ga|0,fa|0)|0;s=c;z=b^z;_=s^_;u=gd(z|0,_|0,16)|0;s=c;_=hd(z|0,_|0,48)|0;u=_|u;s=c|s;e=dd(u|0,s|0,z|0,e|0)|0;z=c;ga=e^ga;fa=z^fa;_=gd(ga|0,fa|0,63)|0;z=c;fa=hd(ga|0,fa|0,1)|0;_=fa|_;z=c|z;ca=dd(ea|0,da|0,v|0,ca|0)|0;u=dd(ca|0,c|0,w|0,u|0)|0;w=c;u=u^u;s=s^w;g=dd(s|0,u|0,j|0,g|0)|0;j=c;ea=g^ea;da=j^da;ca=gd(ea|0,da|0,24)|0;v=c;da=hd(ea|0,da|0,40)|0;ca=da|ca;v=c|v;w=dd(e|0,f|0,u|0,w|0)|0;w=dd(w|0,c|0,ca|0,v|0)|0;u=c;s=w^s;u=u^u;f=gd(s|0,u|0,16)|0;e=c;u=hd(s|0,u|0,48)|0;f=u|f;e=c|e;j=dd(f|0,e|0,g|0,j|0)|0;g=c;ca=j^ca;v=g^v;u=gd(ca|0,v|0,63)|0;s=c;v=hd(ca|0,v|0,1)|0;s=c|s;$=dd(ba|0,aa|0,p|0,$|0)|0;p=dd($|0,c|0,r|0,p|0)|0;r=c;o=o^p;m=m^r;z=dd(m|0,o|0,e|0,z|0)|0;e=c;ba=z^ba;aa=e^aa;$=gd(ba|0,aa|0,24)|0;p=c;aa=hd(ba|0,aa|0,40)|0;$=aa|$;p=c|p;r=dd(t|0,x|0,p|0,r|0)|0;r=dd(r|0,c|0,$|0,p|0)|0;p=c;m=r^m;o=p^o;x=gd(m|0,o|0,16)|0;t=c;o=hd(m|0,o|0,48)|0;x=o|x;t=c|t;e=dd(x|0,t|0,z|0,e|0)|0;z=c;$=e^$;p=z^p;o=gd($|0,p|0,63)|0;m=c;p=hd($|0,p|0,1)|0;m=c|m;y=dd(_|0,z|0,j|0,y|0)|0;k=dd(y|0,c|0,m|0,k|0)|0;m=c;i=i^k;g=g^m;q=dd(g|0,i|0,t|0,q|0)|0;t=c;_=q^_;z=t^z;y=gd(_|0,z|0,24)|0;j=c;z=hd(_|0,z|0,40)|0;y=z|y;j=c|j;m=dd(n|0,r|0,k|0,m|0)|0;m=dd(m|0,c|0,y|0,j|0)|0;k=c;g=m^g;i=k^i;r=gd(g|0,i|0,16)|0;n=c;i=hd(g|0,i|0,48)|0;r=i|r;n=c|n;t=dd(r|0,n|0,q|0,t|0)|0;q=c;y=t^y;j=q^j;i=gd(y|0,j|0,63)|0;g=c;j=hd(y|0,j|0,1)|0;g=c|g;s=dd(x|0,v|0,b|0,s|0)|0;f=dd(s|0,c|0,h|0,f|0)|0;h=c;a=a^f;y=y^h;l=dd(y|0,a|0,o|0,l|0)|0;o=c;x=l^x;v=o^v;s=gd(x|0,v|0,24)|0;b=c;v=hd(x|0,v|0,40)|0;s=v|s;b=c|b;h=dd(h|0,l|0,f|0,h|0)|0;h=dd(h|0,c|0,s|0,b|0)|0;f=c;y=h^y;a=f^a;l=gd(y|0,a|0,16)|0;h=c;a=hd(y|0,a|0,48)|0;l=a|l;h=c|h;o=dd(l|0,h|0,l|0,o|0)|0;l=c;s=o^s;b=l^b;a=gd(s|0,b|0,63)|0;y=c;b=hd(s|0,b|0,1)|0;s=b;v=s;s=s+4|0;t=w^(d[v>>0]|d[V+1>>0]<<8|d[v+2>>0]<<16|d[v+3>>0]<<24)^t;q=u^(d[s>>0]|d[S+1>>0]<<8|d[s+2>>0]<<16|d[s+3>>0]<<24)^q;s=b;a[s>>0]=T;a[S+1>>0]=T>>8;a[S+2>>0]=T>>16;a[S+3>>0]=T>>24;b=b+4|0;a[b>>0]=Q;a[b+1>>0]=Q>>8;a[b+2>>0]=Q>>16;a[b+3>>0]=Q>>24;b=N;Q=b;b=b+4|0;O=R^(d[Q>>0]|d[Q+1>>0]<<8|d[q+2>>0]<<16|d[q+3>>0]<<24)^o;l=p^(d[b>>0]|d[b+1>>0]<<8|d[b+2>>0]<<16|d[b+3>>0]<<24)^l;b=n;n=b;a[n>>0]=O;a[N+1>>0]=O>>8;a[N+2>>0]=O>>16;a[N+3>>0]=O>>24;b=b+4|0;a[b>>0]=L;a[b+1>>0]=L>>8;a[b+2>>0]=L>>16;a[b+3>>0]=L>>24;b=I;L=b;b=b+4|0;J=M^(d[L>>0]|d[L+1>>0]<<8|d[l+2>>0]<<16|d[l+3>>0]<<24)^j;g=k^(d[b>>0]|d[b+1>>0]<<8|d[b+2>>0]<<16|d[b+3>>0]<<24)^g;b=i;i=b;a[i>>0]=J;a[I+1>>0]=J>>8;a[I+2>>0]=J>>16;a[I+3>>0]=J>>24;b=b+4|0;a[b>>0]=G;a[b+1>>0]=G>>8;a[b+2>>0]=G>>16;a[b+3>>0]=G>>24;b=D;G=b;b=b+4|0;E=H^(d[G>>0]|d[G+1>>0]<<8|d[g+2>>0]<<16|d[g+3>>0]<<24)^e;z=f^(d[b>>0]|d[b+1>>0]<<8|d[b+2>>0]<<16|d[b+3>>0]<<24)^z;b=d;d=b;a[d>>0]=E;a[D+1>>0]=E>>8;a[D+2>>0]=E>>16;a[D+3>>0]=E>>24;b=b+4|0;a[b>>0]=z;a[b+1>>0]=z>>8;a[b+2>>0]=z>>16;a[b+3>>0]=z>>24;b=w;z=b;b=b+4|0;x=(B|A)^(d[z>>0]|d[z+1>>0]<<8|d[z+2>>0]<<16|d[z+3>>0]<<24)^x;t=(c|y)^(d[b>>0]|d[b+1>>0]<<8|d[b+2>>0]<<16|d[b+3>>0]<<24)^t;b=w;w=b;a[w>>0]=x;a[w+1>>0]=x>>8;a[w+2>>0]=x>>16;a[w+3>>0]=x>>24;b=b+4|0;a[b>>0]=t;a[b+1>>0]=t>>8;a[b+2>>0]=t>>16;a[b+3>>0]=t>>24;b=q;t=b;b=b+4|0;r=(v|u)^(d[t>>0]|d[t+1>>0]<<8|d[t+2>>0]<<16|d[t+3>>0]<<24)^r;n=s^(d[b>>0]|d[b+1>>0]<<8|d[b+2>>0]<<16|d[b+3>>0]<<24)^n;b=q;q=b;a[q>>0]=r;a[q+1>>0]=r>>8;a[q+2>>0]=r>>16;a[q+3>>0]=r>>24;b=b+4|0;a[b>>0]=n;a[b+1>>0]=n>>8;a[b+2>>0]=n>>16;a[b+3>>0]=n>>24;b=k;n=b;b=b+4|0;l=(p|o)^(d[n>>0]|d[n+1>>0]<<8|d[n+2>>0]<<16|d[n+3>>0]<<24)^l;h=m^(d[b>>0]|d[b+1>>0]<<8|d[b+2>>0]<<16|d[b+3>>0]<<24)^h;b=k;k=b;a[k>>0]=l;a[k+1>>0]=l>>8;a[k+2>>0]=l>>16;a[k+3>>0]=l>>24;b=b+4|0;a[b>>0]=h;a[b+1>>0]=h>>8;a[b+2>>0]=h>>16;a[b+3>>0]=h>>24;b=c;h=b;b=b+4|0;f=(j|i)^(d[h>>0]|d[h+1>>0]<<8|d[h+2>>0]<<16|d[h+3>>0]<<24)^f;b=g^(d[b>>0]|d[b+1>>0]<<8|d[b+2>>0]<<16|d[b+3>>0]<<24)^e;e=c;a[e>>0]=f;a[e+1>>0]=f>>8;a[e+2>>0]=f>>16;a[e+3>>0]=f>>24;c=c+4|0;a[c>>0]=b;a[c+1>>0]=b>>8;a[c+2>>0]=b>>16;a[c+3>>0]=b>>24;return}function Bb(){return 64}function Cb(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0;n=i;m=i=i+63&-64;i=i+208|0;g=m+64|0;h=m;j=8;k=h+64|0;do{c[h>>2]=c[j>>2];h=h+4|0;j=j+4|0}while((h|0)<(k|0));h=hd(e|0,f|0,3)|0;j=c;k=gd(e|0,f|0,61)|0;l=m+72|0;c[l>>2]=h;c[l+4>>2]=j;l=g;c[l>>2]=k;c[l+4>>2]=C;l=m+80|0;if(f>>>0<0|(f|0)==0&e>>>0<128){id(l|0,d|0,e|0)|0;gb(m,b);i=n;return 0}h="l;j=d;k=h+128|0;do{a[h">>0]=a[j>>0]|0;h=h+1|0;j=j+1|0}while((h|0)<(k|0));hb(m,l);g=d+128|0;d=dd(e|0,f|0,-128,-1)|0;h=c;if(h>>>0>0|(h|0)==0&d>>>0>127)do{Hb(m,g);g=g+128|0;d=Dd(d|0,h|0,-128,-1)|0;h=C}while(h>>>0>0|(h|0)==0&d>>>0>127);Id(l|0,g|0,d|0)|0;Gb(m,b);i=n;return 0}function Db(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;n=i;m=i=i+63&-64;i=i+16|0;l=b+32|0;e=l;f=c[e>>2]|0;e=c[e+4>>2]|0;a[m+7>>0]=f;g=Gd(f|0,e|0,8)|0;a[m+6>>0]=g;g=Gd(f|0,e|0,16)|0;a[m+5>>0]=g;g=Gd(f|0,e|0,24)|0;a[m+4>>0]=g;a[m+3>>0]=e;g=Gd(f|0,e|0,40)|0;a[m+2>>0]=g;g=Gd(f|0,e|0,48)|0;a[m+1>>0]=g;g=Gd(f|0,e|0,56)|0;a[m>>0]=g;g=Gd(f|0,e|0,3)|0;g=g&63;k=g>>>0<56?56:120;j=k-g|0;do if((k|0)!="(g|0)){h=Hd(j|0,0,3)|0;f=Dd(h|0,C|0,f|0,e|0)|0;e=C;h=l;c[h">>2]=f;c[h+4>>2]=e;h=64-g|0;g=b+40+g|0;if(j>>>0>>0){Id(g|0,32792,j|0)|0;break}Id(g|0,32792,h|0)|0;k=b+40|0;Eb(b,k);e=32792+h|0;g=Cd(j|0,0,h|0,0)|0;f=C;if(f>>>0>0|(f|0)==0&g>>>0>63){do{Eb(b,e);e=e+64|0;g=Dd(g|0,f|0,-64,-1)|0;f=C}while(f>>>0>0|(f|0)==0&g>>>0>63);f=g}else f=g;Id(k|0,e|0,f|0)|0;e=l;f=c[e>>2]|0;e=c[e+4>>2]|0}while(0);k=Gd(f|0,e|0,3)|0;k=k&63;e=Dd(f|0,e|0,64,0)|0;f=l;c[f>>2]=e;c[f+4>>2]=C;f=64-k|0;e=b+40+k|0;if(f>>>0>8){k=c[m>>2]|0;m=c[m+4>>2]|0;l=e;a[l>>0]=k;a[l+1>>0]=k>>8;a[l+2>>0]=k>>16;a[l+3>>0]=k>>24;e=e+4|0;a[e>>0]=m;a[e+1>>0]=m>>8;a[e+2>>0]=m>>16;a[e+3>>0]=m>>24;e=b}else{Id(e|0,m|0,f|0)|0;h=b+40|0;Eb(b,h);e=m+f|0;g=Cd(8,0,f|0,0)|0;f=C;if(f>>>0>0|(f|0)==0&g>>>0>63){do{Eb(b,e);e=e+64|0;g=Dd(g|0,f|0,-64,-1)|0;f=C}while(f>>>0>0|(f|0)==0&g>>>0>63);f=g}else f=g;Id(h|0,e|0,f|0)|0;e=b}e=c[e>>2]|0;a[d+3>>0]=e;a[d+2>>0]=e>>>8;a[d+1>>0]=e>>>16;a[d>>0]=e>>>24;e=c[b+4>>2]|0;a[d+7>>0]=e;a[d+6>>0]=e>>>8;a[d+5>>0]=e>>>16;a[d+4>>0]=e>>>24;e=c[b+8>>2]|0;a[d+11>>0]=e;a[d+10>>0]=e>>>8;a[d+9>>0]=e>>>16;a[d+8>>0]=e>>>24;e=c[b+12>>2]|0;a[d+15>>0]=e;a[d+14>>0]=e>>>8;a[d+13>>0]=e>>>16;a[d+12>>0]=e>>>24;e=c[b+16>>2]|0;a[d+19>>0]=e;a[d+18>>0]=e>>>8;a[d+17>>0]=e>>>16;a[d+16>>0]=e>>>24;e=c[b+20>>2]|0;a[d+23>>0]=e;a[d+22>>0]=e>>>8;a[d+21>>0]=e>>>16;a[d+20>>0]=e>>>24;e=c[b+24>>2]|0;a[d+27>>0]=e;a[d+26>>0]=e>>>8;a[d+25>>0]=e>>>16;a[d+24>>0]=e>>>24;e=c[b+28>>2]|0;a[d+31>>0]=e;a[d+30>>0]=e>>>8;a[d+29>>0]=e>>>16;a[d+28>>0]=e>>>24;e=b+104|0;do{a[b>>0]=0;b=b+1|0}while((b|0)<(e|0));i=n;return}function eb(a,b){a="a|0;b=b|0;var" e="0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;g=i;f=i=i+63&-64;i=i+256|0;e=0;do{h=b+(e<<2)|0;c[f+(e<<2)">>2]=(d[h+2>>0]|0)<<8|(d[h+3>>0]|0)|(d[h+1>>0]|0)<<16|(d[h>>0]|0)<<24;e=e+1|0}while((e|0)!=16);b=c[f>>2]|0;e=16;do{h=c[f+(e+-2<<2)>>2]|0;j=b;b=c[f+(e+-15<<2)>>2]|0;c[f+(e<<2)>>2]=j+(c[f+(e+-7<<2)>>2]|0)+((h>>>19|h<<13)^h>>>10^(h>>>17|h<<15))+((b>>>18|b<<14)^b>>>3^(b>>>7|b<<25));e=e+1|0}while((e|0)!=64);u=c[a>>2]|0;s=a+4|0;t=c[s>>2]|0;q=a+8|0;r=c[q>>2]|0;o=a+12|0;m=a+16|0;n=c[m>>2]|0;k=a+20|0;l=c[k>>2]|0;e=a+24|0;b=c[e>>2]|0;j=a+28|0;h=(c[j>>2]|0)+1116352408+(c[f>>2]|0)+((n>>>6|n<<26)^(n>>>11|n<<21)^(n>>>25|n<<7))+((b^l)&n^b)|0;p=(c[o>>2]|0)+h|0;h=((r|t)&u|r&t)+((u>>>2|u<<30)^(u>>>13|u<<19)^(u>>>22|u<<10))+h|0;b=b+1899447441+(c[f+4>>2]|0)+((p>>>6|p<<26)^(p>>>11|p<<21)^(p>>>25|p<<7))+((l^n)&p^l)|0;r=r+b|0;b=((t|u)&h|t&u)+((h>>>2|h<<30)^(h>>>13|h<<19)^(h>>>22|h<<10))+b|0;l=l+-1245643825+(c[f+8>>2]|0)+((r>>>6|r<<26)^(r>>>11|r<<21)^(r>>>25|r<<7))+((n^p)&r^n)|0;t=t+l|0;l=((u|h)&b|u&h)+((b>>>2|b<<30)^(b>>>13|b<<19)^(b>>>22|b<<10))+l|0;n=n+-373957723+(c[f+12>>2]|0)+((t>>>6|t<<26)^(t>>>11|t<<21)^(t>>>25|t<<7))+((p^r)&t^p)|0;u=u+n|0;n=((h|b)&l|h&b)+((l>>>2|l<<30)^(l>>>13|l<<19)^(l>>>22|l<<10))+n|0;p=p+961987163+(c[f+16>>2]|0)+((u>>>6|u<<26)^(u>>>11|u<<21)^(u>>>25|u<<7))+((r^t)&u^r)|0;h=h+p|0;p=((b|l)&n|b&l)+((n>>>2|n<<30)^(n>>>13|n<<19)^(n>>>22|n<<10))+p|0;r=r+1508970993+(c[f+20>>2]|0)+((h>>>6|h<<26)^(h>>>11|h<<21)^(h>>>25|h<<7))+((t^u)&h^t)|0;b=b+r|0;r=((l|n)&p|l&n)+((p>>>2|p<<30)^(p>>>13|p<<19)^(p>>>22|p<<10))+r|0;t=t+-1841331548+(c[f+24>>2]|0)+((b>>>6|b<<26)^(b>>>11|b<<21)^(b>>>25|b<<7))+((u^h)&b^u)|0;l=l+t|0;t=((n|p)&r|n&p)+((r>>>2|r<<30)^(r>>>13|r<<19)^(r>>>22|r<<10))+t|0;u=u+-1424204075+(c[f+28>>2]|0)+((l>>>6|l<<26)^(l>>>11|l<<21)^(l>>>25|l<<7))+((h^b)&l^h)|0;n=n+u|0;u=((p|r)&t|p&r)+((t>>>2|t<<30)^(t>>>13|t<<19)^(t>>>22|t<<10))+u|0;h=h+-670586216+(c[f+32>>2]|0)+((n>>>6|n<<26)^(n>>>11|n<<21)^(n>>>25|n<<7))+((b^l)&n^b)|0;p=p+h|0;h=((r|t)&u|r&t)+((u>>>2|u<<30)^(u>>>13|u<<19)^(u>>>22|u<<10))+h|0;b=b+310598401+(c[f+36>>2]|0)+((p>>>6|p<<26)^(p>>>11|p<<21)^(p>>>25|p<<7))+((l^n)&p^l)|0;r=r+b|0;b=((t|u)&h|t&u)+((h>>>2|h<<30)^(h>>>13|h<<19)^(h>>>22|h<<10))+b|0;l=l+607225278+(c[f+40>>2]|0)+((r>>>6|r<<26)^(r>>>11|r<<21)^(r>>>25|r<<7))+((n^p)&r^n)|0;t=t+l|0;l=((u|h)&b|u&h)+((b>>>2|b<<30)^(b>>>13|b<<19)^(b>>>22|b<<10))+l|0;n=n+1426881987+(c[f+44>>2]|0)+((t>>>6|t<<26)^(t>>>11|t<<21)^(t>>>25|t<<7))+((p^r)&t^p)|0;u=u+n|0;n=((h|b)&l|h&b)+((l>>>2|l<<30)^(l>>>13|l<<19)^(l>>>22|l<<10))+n|0;p=p+1925078388+(c[f+48>>2]|0)+((u>>>6|u<<26)^(u>>>11|u<<21)^(u>>>25|u<<7))+((r^t)&u^r)|0;h=h+p|0;p=((b|l)&n|b&l)+((n>>>2|n<<30)^(n>>>13|n<<19)^(n>>>22|n<<10))+p|0;r=r+-2132889090+(c[f+52>>2]|0)+((h>>>6|h<<26)^(h>>>11|h<<21)^(h>>>25|h<<7))+((t^u)&h^t)|0;b=b+r|0;r=((l|n)&p|l&n)+((p>>>2|p<<30)^(p>>>13|p<<19)^(p>>>22|p<<10))+r|0;t=t+-1680079193+(c[f+56>>2]|0)+((b>>>6|b<<26)^(b>>>11|b<<21)^(b>>>25|b<<7))+((u^h)&b^u)|0;l=l+t|0;t=((n|p)&r|n&p)+((r>>>2|r<<30)^(r>>>13|r<<19)^(r>>>22|r<<10))+t|0;u=u+-1046744716+(c[f+60>>2]|0)+((l>>>6|l<<26)^(l>>>11|l<<21)^(l>>>25|l<<7))+((h^b)&l^h)|0;n=n+u|0;u=((p|r)&t|p&r)+((t>>>2|t<<30)^(t>>>13|t<<19)^(t>>>22|t<<10))+u|0;h=h+-459576895+(c[f+64>>2]|0)+((n>>>6|n<<26)^(n>>>11|n<<21)^(n>>>25|n<<7))+((b^l)&n^b)|0;p=p+h|0;h=((r|t)&u|r&t)+((u>>>2|u<<30)^(u>>>13|u<<19)^(u>>>22|u<<10))+h|0;b=b+-272742522+(c[f+68>>2]|0)+((p>>>6|p<<26)^(p>>>11|p<<21)^(p>>>25|p<<7))+((l^n)&p^l)|0;r=r+b|0;b=((t|u)&h|t&u)+((h>>>2|h<<30)^(h>>>13|h<<19)^(h>>>22|h<<10))+b|0;l=l+264347078+(c[f+72>>2]|0)+((r>>>6|r<<26)^(r>>>11|r<<21)^(r>>>25|r<<7))+((n^p)&r^n)|0;t=t+l|0;l=((u|h)&b|u&h)+((b>>>2|b<<30)^(b>>>13|b<<19)^(b>>>22|b<<10))+l|0;n=n+604807628+(c[f+76>>2]|0)+((t>>>6|t<<26)^(t>>>11|t<<21)^(t>>>25|t<<7))+((p^r)&t^p)|0;u=u+n|0;n=((h|b)&l|h&b)+((l>>>2|l<<30)^(l>>>13|l<<19)^(l>>>22|l<<10))+n|0;p=p+770255983+(c[f+80>>2]|0)+((u>>>6|u<<26)^(u>>>11|u<<21)^(u>>>25|u<<7))+((r^t)&u^r)|0;h=h+p|0;p=((b|l)&n|b&l)+((n>>>2|n<<30)^(n>>>13|n<<19)^(n>>>22|n<<10))+p|0;r=r+1249150122+(c[f+84>>2]|0)+((h>>>6|h<<26)^(h>>>11|h<<21)^(h>>>25|h<<7))+((t^u)&h^t)|0;b=b+r|0;r=((l|n)&p|l&n)+((p>>>2|p<<30)^(p>>>13|p<<19)^(p>>>22|p<<10))+r|0;t=t+1555081692+(c[f+88>>2]|0)+((b>>>6|b<<26)^(b>>>11|b<<21)^(b>>>25|b<<7))+((u^h)&b^u)|0;l=l+t|0;t=((n|p)&r|n&p)+((r>>>2|r<<30)^(r>>>13|r<<19)^(r>>>22|r<<10))+t|0;u=u+1996064986+(c[f+92>>2]|0)+((l>>>6|l<<26)^(l>>>11|l<<21)^(l>>>25|l<<7))+((h^b)&l^h)|0;n=n+u|0;u=((p|r)&t|p&r)+((t>>>2|t<<30)^(t>>>13|t<<19)^(t>>>22|t<<10))+u|0;h=h+-1740746414+(c[f+96>>2]|0)+((n>>>6|n<<26)^(n>>>11|n<<21)^(n>>>25|n<<7))+((b^l)&n^b)|0;p=p+h|0;h=((r|t)&u|r&t)+((u>>>2|u<<30)^(u>>>13|u<<19)^(u>>>22|u<<10))+h|0;b=b+-1473132947+(c[f+100>>2]|0)+((p>>>6|p<<26)^(p>>>11|p<<21)^(p>>>25|p<<7))+((l^n)&p^l)|0;r=r+b|0;b=((t|u)&h|t&u)+((h>>>2|h<<30)^(h>>>13|h<<19)^(h>>>22|h<<10))+b|0;l=l+-1341970488+(c[f+104>>2]|0)+((r>>>6|r<<26)^(r>>>11|r<<21)^(r>>>25|r<<7))+((n^p)&r^n)|0;t=t+l|0;l=((u|h)&b|u&h)+((b>>>2|b<<30)^(b>>>13|b<<19)^(b>>>22|b<<10))+l|0;n=n+-1084653625+(c[f+108>>2]|0)+((t>>>6|t<<26)^(t>>>11|t<<21)^(t>>>25|t<<7))+((p^r)&t^p)|0;u=u+n|0;n=((h|b)&l|h&b)+((l>>>2|l<<30)^(l>>>13|l<<19)^(l>>>22|l<<10))+n|0;p=p+-958395405+(c[f+112>>2]|0)+((u>>>6|u<<26)^(u>>>11|u<<21)^(u>>>25|u<<7))+((r^t)&u^r)|0;h=h+p|0;p=((b|l)&n|b&l)+((n>>>2|n<<30)^(n>>>13|n<<19)^(n>>>22|n<<10))+p|0;r=r+-710438585+(c[f+116>>2]|0)+((h>>>6|h<<26)^(h>>>11|h<<21)^(h>>>25|h<<7))+((t^u)&h^t)|0;b=b+r|0;r=((l|n)&p|l&n)+((p>>>2|p<<30)^(p>>>13|p<<19)^(p>>>22|p<<10))+r|0;t=t+113926993+(c[f+120>>2]|0)+((b>>>6|b<<26)^(b>>>11|b<<21)^(b>>>25|b<<7))+((u^h)&b^u)|0;l=l+t|0;t=((n|p)&r|n&p)+((r>>>2|r<<30)^(r>>>13|r<<19)^(r>>>22|r<<10))+t|0;u=u+338241895+(c[f+124>>2]|0)+((l>>>6|l<<26)^(l>>>11|l<<21)^(l>>>25|l<<7))+((h^b)&l^h)|0;n=n+u|0;u=((p|r)&t|p&r)+((t>>>2|t<<30)^(t>>>13|t<<19)^(t>>>22|t<<10))+u|0;h=h+666307205+(c[f+128>>2]|0)+((n>>>6|n<<26)^(n>>>11|n<<21)^(n>>>25|n<<7))+((b^l)&n^b)|0;p=p+h|0;h=((r|t)&u|r&t)+((u>>>2|u<<30)^(u>>>13|u<<19)^(u>>>22|u<<10))+h|0;b=b+773529912+(c[f+132>>2]|0)+((p>>>6|p<<26)^(p>>>11|p<<21)^(p>>>25|p<<7))+((l^n)&p^l)|0;r=r+b|0;b=((t|u)&h|t&u)+((h>>>2|h<<30)^(h>>>13|h<<19)^(h>>>22|h<<10))+b|0;l=l+1294757372+(c[f+136>>2]|0)+((r>>>6|r<<26)^(r>>>11|r<<21)^(r>>>25|r<<7))+((n^p)&r^n)|0;t=t+l|0;l=((u|h)&b|u&h)+((b>>>2|b<<30)^(b>>>13|b<<19)^(b>>>22|b<<10))+l|0;n=n+1396182291+(c[f+140>>2]|0)+((t>>>6|t<<26)^(t>>>11|t<<21)^(t>>>25|t<<7))+((p^r)&t^p)|0;u=u+n|0;n=((h|b)&l|h&b)+((l>>>2|l<<30)^(l>>>13|l<<19)^(l>>>22|l<<10))+n|0;p=p+1695183700+(c[f+144>>2]|0)+((u>>>6|u<<26)^(u>>>11|u<<21)^(u>>>25|u<<7))+((r^t)&u^r)|0;h=h+p|0;p=((b|l)&n|b&l)+((n>>>2|n<<30)^(n>>>13|n<<19)^(n>>>22|n<<10))+p|0;r=r+1986661051+(c[f+148>>2]|0)+((h>>>6|h<<26)^(h>>>11|h<<21)^(h>>>25|h<<7))+((t^u)&h^t)|0;b=b+r|0;r=((l|n)&p|l&n)+((p>>>2|p<<30)^(p>>>13|p<<19)^(p>>>22|p<<10))+r|0;t=t+-2117940946+(c[f+152>>2]|0)+((b>>>6|b<<26)^(b>>>11|b<<21)^(b>>>25|b<<7))+((u^h)&b^u)|0;l=l+t|0;t=((n|p)&r|n&p)+((r>>>2|r<<30)^(r>>>13|r<<19)^(r>>>22|r<<10))+t|0;u=u+-1838011259+(c[f+156>>2]|0)+((l>>>6|l<<26)^(l>>>11|l<<21)^(l>>>25|l<<7))+((h^b)&l^h)|0;n=n+u|0;u=((p|r)&t|p&r)+((t>>>2|t<<30)^(t>>>13|t<<19)^(t>>>22|t<<10))+u|0;h=h+-1564481375+(c[f+160>>2]|0)+((n>>>6|n<<26)^(n>>>11|n<<21)^(n>>>25|n<<7))+((b^l)&n^b)|0;p=p+h|0;h=((r|t)&u|r&t)+((u>>>2|u<<30)^(u>>>13|u<<19)^(u>>>22|u<<10))+h|0;b=b+-1474664885+(c[f+164>>2]|0)+((p>>>6|p<<26)^(p>>>11|p<<21)^(p>>>25|p<<7))+((l^n)&p^l)|0;r=r+b|0;b=((t|u)&h|t&u)+((h>>>2|h<<30)^(h>>>13|h<<19)^(h>>>22|h<<10))+b|0;l=l+-1035236496+(c[f+168>>2]|0)+((r>>>6|r<<26)^(r>>>11|r<<21)^(r>>>25|r<<7))+((n^p)&r^n)|0;t=t+l|0;l=((u|h)&b|u&h)+((b>>>2|b<<30)^(b>>>13|b<<19)^(b>>>22|b<<10))+l|0;n=n+-949202525+(c[f+172>>2]|0)+((t>>>6|t<<26)^(t>>>11|t<<21)^(t>>>25|t<<7))+((p^r)&t^p)|0;u=u+n|0;n=((h|b)&l|h&b)+((l>>>2|l<<30)^(l>>>13|l<<19)^(l>>>22|l<<10))+n|0;p=p+-778901479+(c[f+176>>2]|0)+((u>>>6|u<<26)^(u>>>11|u<<21)^(u>>>25|u<<7))+((r^t)&u^r)|0;h=h+p|0;p=((b|l)&n|b&l)+((n>>>2|n<<30)^(n>>>13|n<<19)^(n>>>22|n<<10))+p|0;r=r+-694614492+(c[f+180>>2]|0)+((h>>>6|h<<26)^(h>>>11|h<<21)^(h>>>25|h<<7))+((t^u)&h^t)|0;b=b+r|0;r=((l|n)&p|l&n)+((p>>>2|p<<30)^(p>>>13|p<<19)^(p>>>22|p<<10))+r|0;t=t+-200395387+(c[f+184>>2]|0)+((b>>>6|b<<26)^(b>>>11|b<<21)^(b>>>25|b<<7))+((u^h)&b^u)|0;l=l+t|0;t=((n|p)&r|n&p)+((r>>>2|r<<30)^(r>>>13|r<<19)^(r>>>22|r<<10))+t|0;u=u+275423344+(c[f+188>>2]|0)+((l>>>6|l<<26)^(l>>>11|l<<21)^(l>>>25|l<<7))+((h^b)&l^h)|0;n=n+u|0;u=((p|r)&t|p&r)+((t>>>2|t<<30)^(t>>>13|t<<19)^(t>>>22|t<<10))+u|0;h=h+430227734+(c[f+192>>2]|0)+((n>>>6|n<<26)^(n>>>11|n<<21)^(n>>>25|n<<7))+((b^l)&n^b)|0;p=p+h|0;h=((r|t)&u|r&t)+((u>>>2|u<<30)^(u>>>13|u<<19)^(u>>>22|u<<10))+h|0;b=b+506948616+(c[f+196>>2]|0)+((p>>>6|p<<26)^(p>>>11|p<<21)^(p>>>25|p<<7))+((l^n)&p^l)|0;r=r+b|0;b=((t|u)&h|t&u)+((h>>>2|h<<30)^(h>>>13|h<<19)^(h>>>22|h<<10))+b|0;l=l+659060556+(c[f+200>>2]|0)+((r>>>6|r<<26)^(r>>>11|r<<21)^(r>>>25|r<<7))+((n^p)&r^n)|0;t=t+l|0;l=((u|h)&b|u&h)+((b>>>2|b<<30)^(b>>>13|b<<19)^(b>>>22|b<<10))+l|0;n=n+883997877+(c[f+204>>2]|0)+((t>>>6|t<<26)^(t>>>11|t<<21)^(t>>>25|t<<7))+((p^r)&t^p)|0;u=u+n|0;n=((h|b)&l|h&b)+((l>>>2|l<<30)^(l>>>13|l<<19)^(l>>>22|l<<10))+n|0;p=p+958139571+(c[f+208>>2]|0)+((u>>>6|u<<26)^(u>>>11|u<<21)^(u>>>25|u<<7))+((r^t)&u^r)|0;h=h+p|0;p=((b|l)&n|b&l)+((n>>>2|n<<30)^(n>>>13|n<<19)^(n>>>22|n<<10))+p|0;r=r+1322822218+(c[f+212>>2]|0)+((h>>>6|h<<26)^(h>>>11|h<<21)^(h>>>25|h<<7))+((t^u)&h^t)|0;b=b+r|0;r=((l|n)&p|l&n)+((p>>>2|p<<30)^(p>>>13|p<<19)^(p>>>22|p<<10))+r|0;t=t+1537002063+(c[f+216>>2]|0)+((b>>>6|b<<26)^(b>>>11|b<<21)^(b>>>25|b<<7))+((u^h)&b^u)|0;l=l+t|0;t=((n|p)&r|n&p)+((r>>>2|r<<30)^(r>>>13|r<<19)^(r>>>22|r<<10))+t|0;u=u+1747873779+(c[f+220>>2]|0)+((l>>>6|l<<26)^(l>>>11|l<<21)^(l>>>25|l<<7))+((h^b)&l^h)|0;n=n+u|0;u=((p|r)&t|p&r)+((t>>>2|t<<30)^(t>>>13|t<<19)^(t>>>22|t<<10))+u|0;h=h+1955562222+(c[f+224>>2]|0)+((n>>>6|n<<26)^(n>>>11|n<<21)^(n>>>25|n<<7))+((b^l)&n^b)|0;p=p+h|0;h=((r|t)&u|r&t)+((u>>>2|u<<30)^(u>>>13|u<<19)^(u>>>22|u<<10))+h|0;b=b+2024104815+(c[f+228>>2]|0)+((p>>>6|p<<26)^(p>>>11|p<<21)^(p>>>25|p<<7))+((l^n)&p^l)|0;r=r+b|0;b=((t|u)&h|t&u)+((h>>>2|h<<30)^(h>>>13|h<<19)^(h>>>22|h<<10))+b|0;l=l+-2067236844+(c[f+232>>2]|0)+((r>>>6|r<<26)^(r>>>11|r<<21)^(r>>>25|r<<7))+((n^p)&r^n)|0;t=t+l|0;l=((u|h)&b|u&h)+((b>>>2|b<<30)^(b>>>13|b<<19)^(b>>>22|b<<10))+l|0;n=n+-1933114872+(c[f+236>>2]|0)+((t>>>6|t<<26)^(t>>>11|t<<21)^(t>>>25|t<<7))+((p^r)&t^p)|0;u=u+n|0;n=((h|b)&l|h&b)+((l>>>2|l<<30)^(l>>>13|l<<19)^(l>>>22|l<<10))+n|0;p=p+-1866530822+(c[f+240>>2]|0)+((u>>>6|u<<26)^(u>>>11|u<<21)^(u>>>25|u<<7))+((r^t)&u^r)|0;h=h+p|0;p=((b|l)&n|b&l)+((n>>>2|n<<30)^(n>>>13|n<<19)^(n>>>22|n<<10))+p|0;r=r+-1538233109+(c[f+244>>2]|0)+((h>>>6|h<<26)^(h>>>11|h<<21)^(h>>>25|h<<7))+((t^u)&h^t)|0;b=b+r|0;r=((l|n)&p|l&n)+((p>>>2|p<<30)^(p>>>13|p<<19)^(p>>>22|p<<10))+r|0;t=t+-1090935817+(c[f+248>>2]|0)+((b>>>6|b<<26)^(b>>>11|b<<21)^(b>>>25|b<<7))+((u^h)&b^u)|0;l=l+t|0;t=((n|p)&r|n&p)+((r>>>2|r<<30)^(r>>>13|r<<19)^(r>>>22|r<<10))+t|0;f=u+-965641998+(c[f+252>>2]|0)+((l>>>6|l<<26)^(l>>>11|l<<21)^(l>>>25|l<<7))+((h^b)&l^h)|0;c[a>>2]=(c[a>>2]|0)+(((p|r)&t|p&r)+((t>>>2|t<<30)^(t>>>13|t<<19)^(t>>>22|t<<10))+f);c[s>>2]=(c[s>>2]|0)+t;c[q>>2]=(c[q>>2]|0)+r;c[o>>2]=(c[o>>2]|0)+p;c[m>>2]=(c[m>>2]|0)+(n+f);c[k>>2]=(c[k>>2]|0)+l;c[e>>2]=(c[e>>2]|0)+b;c[j>>2]=(c[j>>2]|0)+h;i=g;return}function Fb(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;j=a+72|0;m=j;o=c[m>>2]|0;m=c[m+4>>2]|0;k=Gd(o|0,m|0,3)|0;k=k&127;l=Hd(d|0,e|0,3)|0;n=C;h=Gd(d|0,e|0,61)|0;i=C;m=Dd(o|0,m|0,l|0,n|0)|0;o=C;c[j>>2]=m;c[j+4>>2]=o;j=a+64|0;g=j;f=c[g>>2]|0;g=c[g+4>>2]|0;if(o>>>0>>0|(o|0)==(n|0)&m>>>0>>0){f=Dd(f|0,g|0,1,0)|0;g=C;o=j;c[o>>2]=f;c[o+4>>2]=g}h=Dd(f|0,g|0,h|0,i|0)|0;g=j;c[g>>2]=h;c[g+4>>2]=C;g=Cd(128,0,k|0,0)|0;h=C;f=a+80+k|0;if(h>>>0>e>>>0|(h|0)==(e|0)&g>>>0>d>>>0){Id(f|0,b|0,d|0)|0;return}Id(f|0,b|0,g|0)|0;i=a+80|0;Hb(a,i);f=b+g|0;g=Cd(d|0,e|0,g|0,h|0)|0;h=C;if(h>>>0>0|(h|0)==0&g>>>0>127)do{Hb(a,f);f=f+128|0;g=Dd(g|0,h|0,-128,-1)|0;h=C}while(h>>>0>0|(h|0)==0&g>>>0>127);Id(i|0,f|0,g|0)|0;return}function Gb(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;s=i;e=i=i+63&-64;i=i+16|0;r=b+64|0;f=r;g=c[f>>2]|0;f=c[f+4>>2]|0;a[e+7>>0]=g;q=Gd(g|0,f|0,8)|0;a[e+6>>0]=q;q=Gd(g|0,f|0,16)|0;a[e+5>>0]=q;q=Gd(g|0,f|0,24)|0;a[e+4>>0]=q;a[e+3>>0]=f;q=Gd(g|0,f|0,40)|0;a[e+2>>0]=q;q=Gd(g|0,f|0,48)|0;a[e+1>>0]=q;q=Gd(g|0,f|0,56)|0;a[e>>0]=q;q=b+72|0;j=q;h=c[j>>2]|0;j=c[j+4>>2]|0;a[e+15>>0]=h;n=Gd(h|0,j|0,8)|0;a[e+14>>0]=n;n=Gd(h|0,j|0,16)|0;a[e+13>>0]=n;n=Gd(h|0,j|0,24)|0;a[e+12>>0]=n;a[e+11>>0]=j;n=Gd(h|0,j|0,40)|0;a[e+10>>0]=n;n=Gd(h|0,j|0,48)|0;a[e+9>>0]=n;n=Gd(h|0,j|0,56)|0;a[e+8>>0]=n;n=Gd(h|0,j|0,3)|0;n=n&127;o=0<0|0==0&n>>>0<112;o=cd((o?112:240)|0,(o?0:0)|0,n|0,0)|0;p=c;m=hd(o|0,p|0,3)|0;t=c;k=gd(o|0,p|0,61)|0;l=c;j=dd(m|0,t|0,h|0,j|0)|0;h=c;u=q;c[u>>2]=j;c[u+4>>2]=h;if(h>>>0>>0|(h|0)==(t|0)&j>>>0>>0){g=Dd(g|0,f|0,1,0)|0;f=C;u=r;c[u>>2]=g;c[u+4>>2]=f}g=Dd(g|0,f|0,k|0,l|0)|0;f=C;l=r;c[l>>2]=g;c[l+4>>2]=f;l=Cd(128,0,n|0,0)|0;m=C;k=b+80+n|0;if(p>>>0>>0|(p|0)==(m|0)&o>>>0>>0)Id(k|0,32856,o|0)|0;else{Id(k|0,32856,l|0)|0;j=b+80|0;Hb(b,j);f=32856+l|0;g=Cd(o|0,p|0,l|0,m|0)|0;h=C;if(h>>>0>0|(h|0)==0&g>>>0>127)do{Hb(b,f);f=f+128|0;g=Dd(g|0,h|0,-128,-1)|0;h=C}while(h>>>0>0|(h|0)==0&g>>>0>127);Id(j|0,f|0,g|0)|0;h=q;f=r;j=c[h>>2]|0;h=c[h+4>>2]|0;g=c[f>>2]|0;f=c[f+4>>2]|0}k=Gd(j|0,h|0,3)|0;k=k&127;t=Dd(j|0,h|0,128,0)|0;u=q;c[u>>2]=t;c[u+4>>2]=C;if(h>>>0>4294967295|(h|0)==-1&j>>>0>4294967167){g=Dd(g|0,f|0,1,0)|0;f=C;u=r;c[u>>2]=g;c[u+4>>2]=f}h=r;c[h>>2]=g;c[h+4>>2]=f;g=Cd(128,0,k|0,0)|0;h=C;f=b+80+k|0;if(h>>>0>0|(h|0)==0&g>>>0>16){g=f;f=g+16|0;do{a[g>>0]=a[e>>0]|0;g=g+1|0;e=e+1|0}while((g|0)<(f|0))}else{id(f|0,e|0,g|0)|0;j=b+80|0;hb(b,j);e=e+g|0;f=cd(16,0,g|0,h|0)|0;g=c;if(g>>>0>0|(g|0)==0&f>>>0>127)do{Hb(b,e);e=e+128|0;f=Dd(f|0,g|0,-128,-1)|0;g=C}while(g>>>0>0|(g|0)==0&f>>>0>127);Id(j|0,e|0,f|0)|0}e=0;do{u=d+(e<<3)|0;t=b+(e<<3)|0;r=c[t>>2]|0;t=c[t+4>>2]|0;a[u+7>>0]=r;q=Gd(r|0,t|0,8)|0;a[u+6>>0]=q;q=Gd(r|0,t|0,16)|0;a[u+5>>0]=q;q=Gd(r|0,t|0,24)|0;a[u+4>>0]=q;a[u+3>>0]=t;q=Gd(r|0,t|0,40)|0;a[u+2>>0]=q;q=Gd(r|0,t|0,48)|0;a[u+1>>0]=q;t=Gd(r|0,t|0,56)|0;a[u>>0]=t;e=e+1|0}while((e|0)!=8);Fd(b|0,0,208)|0;i=s;return} function yd(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0;do if(a>>>0<245){o=a>>>0<11?16:a+11&-8;a=o>>>3;j=c[8020]|0;b=j>>>a;if(b&3){b=(b&1^1)+a|0;d=32120+(b<<1<<2)|0;e=d+8|0;f=c[e>>2]|0;g=f+8|0;h=c[g>>2]|0;do if((d|0)!=(h|0)){if(h>>>0<(c[8024]|0)>>>0)ra();a=h+12|0;if((c[a>>2]|0)==(f|0)){c[a>>2]=d;c[e>>2]=h;break}else ra()}else c[8020]=j&~(1<>2]=G|3;G=f+G+4|0;c[G>>2]=c[G>>2]|1;G=g;return G|0}h=c[8022]|0;if(o>>>0>h>>>0){if(b){d=2<>>12&16;d=d>>>i;f=d>>>5&8;d=d>>>f;g=d>>>2&4;d=d>>>g;e=d>>>1&2;d=d>>>e;b=d>>>1&1;b=(f|i|g|e|b)+(d>>>b)|0;d=32120+(b<<1<<2)|0;e=d+8|0;g=c[e>>2]|0;i=g+8|0;f=c[i>>2]|0;do if((d|0)!=(f|0)){if(f>>>0<(c[8024]|0)>>>0)ra();a=f+12|0;if((c[a>>2]|0)==(g|0)){c[a>>2]=d;c[e>>2]=f;k=c[8022]|0;break}else ra()}else{c[8020]=j&~(1<>2]=o|3;e=g+o|0;c[e+4>>2]=h|1;c[e+h>>2]=h;if(k){f=c[8025]|0;b=k>>>3;d=32120+(b<<1<<2)|0;a=c[8020]|0;b=1<>2]|0;if(b>>>0<(c[8024]|0)>>>0)ra();else{l=a;m=b}}else{c[8020]=a|b;l=d+8|0;m=d}c[l>>2]=f;c[m+12>>2]=f;c[f+8>>2]=m;c[f+12>>2]=d}c[8022]=h;c[8025]=e;G=i;return G|0}a=c[8021]|0;if(a){i=(a&0-a)+-1|0;F=i>>>12&16;i=i>>>F;E=i>>>5&8;i=i>>>E;G=i>>>2&4;i=i>>>G;b=i>>>1&2;i=i>>>b;j=i>>>1&1;j=c[32384+((E|F|G|b|j)+(i>>>j)<<2)>>2]|0;i=(c[j+4>>2]&-8)-o|0;b=j;while(1){a=c[b+16>>2]|0;if(!a){a=c[b+20>>2]|0;if(!a)break}b=(c[a+4>>2]&-8)-o|0;G=b>>>0>>0;i=G?b:i;b=a;j=G?a:j}f=c[8024]|0;if(j>>>0>>0)ra();h=j+o|0;if(j>>>0>=h>>>0)ra();g=c[j+24>>2]|0;d=c[j+12>>2]|0;do if((d|0)==(j|0)){b=j+20|0;a=c[b>>2]|0;if(!a){b=j+16|0;a=c[b>>2]|0;if(!a){n=0;break}}while(1){d=a+20|0;e=c[d>>2]|0;if(e){a=e;b=d;continue}d=a+16|0;e=c[d>>2]|0;if(!e)break;else{a=e;b=d}}if(b>>>0>>0)ra();else{c[b>>2]=0;n=a;break}}else{e=c[j+8>>2]|0;if(e>>>0>>0)ra();a=e+12|0;if((c[a>>2]|0)!=(j|0))ra();b=d+8|0;if((c[b>>2]|0)==(j|0)){c[a>>2]=d;c[b>>2]=e;n=d;break}else ra()}while(0);do if(g){a=c[j+28>>2]|0;b=32384+(a<<2)|0;if((j|0)==(c[b>>2]|0)){c[b>>2]=n;if(!n){c[8021]=c[8021]&~(1<>>0<(c[8024]|0)>>>0)ra();a=g+16|0;if((c[a>>2]|0)==(j|0))c[a>>2]=n;else c[g+20>>2]=n;if(!n)break}b=c[8024]|0;if(n>>>0>>0)ra();c[n+24>>2]=g;a=c[j+16>>2]|0;do if(a)if(a>>>0>>0)ra();else{c[n+16>>2]=a;c[a+24>>2]=n;break}while(0);a=c[j+20>>2]|0;if(a)if(a>>>0<(c[8024]|0)>>>0)ra();else{c[n+20>>2]=a;c[a+24>>2]=n;break}}while(0);if(i>>>0<16){g=i+o|0;c[j+4>>2]=G|3;G=j+G+4|0;c[G>>2]=c[G>>2]|1}else{c[j+4>>2]=o|3;c[h+4>>2]=i|1;c[h+i>>2]=i;a=c[8022]|0;if(a){e=c[8025]|0;b=a>>>3;d=32120+(b<<1<<2)|0;a=c[8020]|0;b=1<>2]|0;if(b>>>0<(c[8024]|0)>>>0)ra();else{p=a;q=b}}else{c[8020]=a|b;p=d+8|0;q=d}c[p>>2]=e;c[q+12>>2]=e;c[e+8>>2]=q;c[e+12>>2]=d}c[8022]=i;c[8025]=h}G=j+8|0;return G|0}}}else if(a>>>0<=4294967231){a=a+11|0;o=a&-8;k=c[8021]|0;if(k){d=0-o|0;a=a>>>8;if(a)if(o>>>0>16777215)j=31;else{q=(a+1048320|0)>>>16&8;z=a<>>16&4;z=z<>>16&2;j=14-(p|q|j)+(z<>>15)|0;j=o>>>(j+7|0)&1|j<<1}else j="0;b=c[32384+(j<<2)">>2]|0;a:do if(!b){a=0;b=0;z=86}else{f=d;a=0;h=o<<((j|0)==31?0:25-(j>>>1)|0);i=b;b=0;while(1){e=c[i+4>>2]&-8;d=e-o|0;if(d>>>0>>0)if((e|0)==(o|0)){a=i;b=i;z=90;break a}else b=i;else d=f;e=c[i+20>>2]|0;i=c[i+16+(h>>>31<<2)>>2]|0;a=(e|0)==0|(e|0)==(i|0)?a:e;e=(i|0)==0;if(e){z=86;break}else{f=d;h=h<<(e&1^1)}}}while(0);if((z|0)==86){if((a|0)==0&(b|0)==0){a=2<>>12&16;q=q>>>m;l=q>>>5&8;q=q>>>l;n=q>>>2&4;q=q>>>n;p=q>>>1&2;q=q>>>p;a=q>>>1&1;a=c[32384+((l|m|n|p|a)+(q>>>a)<<2)>>2]|0}if(!a){i=d;j=b}else z=90}if((z|0)==90)while(1){z=0;q=(c[a+4>>2]&-8)-o|0;e=q>>>0>>0;d=e?q:d;b=e?a:b;e=c[a+16>>2]|0;if(e){a=e;z=90;continue}a=c[a+20>>2]|0;if(!a){i=d;j=b;break}else z=90}if((j|0)!=0?i>>>0<((c[8022]|0)-o|0)>>>0:0){f=c[8024]|0;if(j>>>0>>0)ra();h=j+o|0;if(j>>>0>=h>>>0)ra();g=c[j+24>>2]|0;d=c[j+12>>2]|0;do if((d|0)==(j|0)){b=j+20|0;a=c[b>>2]|0;if(!a){b=j+16|0;a=c[b>>2]|0;if(!a){s=0;break}}while(1){d=a+20|0;e=c[d>>2]|0;if(e){a=e;b=d;continue}d=a+16|0;e=c[d>>2]|0;if(!e)break;else{a=e;b=d}}if(b>>>0>>0)ra();else{c[b>>2]=0;s=a;break}}else{e=c[j+8>>2]|0;if(e>>>0>>0)ra();a=e+12|0;if((c[a>>2]|0)!=(j|0))ra();b=d+8|0;if((c[b>>2]|0)==(j|0)){c[a>>2]=d;c[b>>2]=e;s=d;break}else ra()}while(0);do if(g){a=c[j+28>>2]|0;b=32384+(a<<2)|0;if((j|0)==(c[b>>2]|0)){c[b>>2]=s;if(!s){c[8021]=c[8021]&~(1<>>0<(c[8024]|0)>>>0)ra();a=g+16|0;if((c[a>>2]|0)==(j|0))c[a>>2]=s;else c[g+20>>2]=s;if(!s)break}b=c[8024]|0;if(s>>>0>>0)ra();c[s+24>>2]=g;a=c[j+16>>2]|0;do if(a)if(a>>>0>>0)ra();else{c[s+16>>2]=a;c[a+24>>2]=s;break}while(0);a=c[j+20>>2]|0;if(a)if(a>>>0<(c[8024]|0)>>>0)ra();else{c[s+20>>2]=a;c[a+24>>2]=s;break}}while(0);do if(i>>>0>=16){c[j+4>>2]=o|3;c[h+4>>2]=i|1;c[h+i>>2]=i;a=i>>>3;if(i>>>0<256){d=32120+(a<<1<<2)|0;b=c[8020]|0;a=1<>2]|0;if(b>>>0<(c[8024]|0)>>>0)ra();else{t=a;v=b}}else{c[8020]=b|a;t=d+8|0;v=d}c[t>>2]=h;c[v+12>>2]=h;c[h+8>>2]=v;c[h+12>>2]=d;break}a=i>>>8;if(a)if(i>>>0>16777215)d=31;else{F=(a+1048320|0)>>>16&8;G=a<>>16&4;G=G<>>16&2;d=14-(E|F|d)+(G<>>15)|0;d=i>>>(d+7|0)&1|d<<1}else d="0;e=32384+(d<<2)|0;c[h+28">>2]=d;a=h+16|0;c[a+4>>2]=0;c[a>>2]=0;a=c[8021]|0;b=1<>2]=h;c[h+24>>2]=e;c[h+12>>2]=h;c[h+8>>2]=h;break}d=i<<((d|0)==31?0:25-(d>>>1)|0);e=c[e>>2]|0;while(1){if((c[e+4>>2]&-8|0)==(i|0)){z=148;break}b=e+16+(d>>>31<<2)|0;a=c[b>>2]|0;if(!a){z=145;break}else{d=d<<1;e=a}}if((z|0)==145)if(b>>>0<(c[8024]|0)>>>0)ra();else{c[b>>2]=h;c[h+24>>2]=e;c[h+12>>2]=h;c[h+8>>2]=h;break}else if((z|0)==148){a=e+8|0;b=c[a>>2]|0;G=c[8024]|0;if(b>>>0>=G>>>0&e>>>0>=G>>>0){c[b+12>>2]=h;c[a>>2]=h;c[h+8>>2]=b;c[h+12>>2]=e;c[h+24>>2]=0;break}else ra()}}else{G=i+o|0;c[j+4>>2]=G|3;G=j+G+4|0;c[G>>2]=c[G>>2]|1}while(0);G=j+8|0;return G|0}}}else o=-1;while(0);d=c[8022]|0;if(d>>>0>=o>>>0){a=d-o|0;b=c[8025]|0;if(a>>>0>15){G=b+o|0;c[8025]=G;c[8022]=a;c[G+4>>2]=a|1;c[G+a>>2]=a;c[b+4>>2]=o|3}else{c[8022]=0;c[8025]=0;c[b+4>>2]=d|3;G=b+d+4|0;c[G>>2]=c[G>>2]|1}G=b+8|0;return G|0}a=c[8023]|0;if(a>>>0>o>>>0){E=a-o|0;c[8023]=E;G=c[8026]|0;F=G+o|0;c[8026]=F;c[F+4>>2]=E|1;c[G+4>>2]=o|3;G=G+8|0;return G|0}do if(!(c[8138]|0)){a=na(30)|0;if(!(a+-1&a)){c[8140]=a;c[8139]=a;c[8141]=-1;c[8142]=-1;c[8143]=0;c[8131]=0;c[8138]=(ta(0)|0)&-16^1431655768;break}else ra()}while(0);h=o+48|0;e=c[8140]|0;i=o+47|0;d=e+i|0;e=0-e|0;j=d&e;if(j>>>0<=o>>>0){G=0;return G|0}a=c[8130]|0;if((a|0)!=0?(t=c[8128]|0,v=t+j|0,v>>>0<=t>>>0|v>>>0>a>>>0):0){G=0;return G|0}b:do if(!(c[8131]&4)){b=c[8026]|0;c:do if(b){f=32528;while(1){a=c[f>>2]|0;if(a>>>0<=b>>>0?(r=f+4|0,(a+(c[r>>2]|0)|0)>>>0>b>>>0):0)break;a=c[f+8>>2]|0;if(!a){z=173;break c}else f=a}a=d-(c[8023]|0)&e;if(a>>>0<2147483647){b=sa(a|0)|0;if((b|0)==((c[f>>2]|0)+(c[r>>2]|0)|0)){if((b|0)!=(-1|0)){h=b;g=a;z=193;break b}}else z=183}}else z=173;while(0);do if((z|0)==173?(u=sa(0)|0,(u|0)!=(-1|0)):0){a=u;b=c[8139]|0;d=b+-1|0;if(!(d&a))a=j;else a=j-a+(d+a&0-b)|0;b=c[8128]|0;d=b+a|0;if(a>>>0>o>>>0&a>>>0<2147483647){v=c[8130]|0;if((v|0)!=0?d>>>0<=b>>>0|d>>>0>v>>>0:0)break;b=sa(a|0)|0;if((b|0)==(u|0)){h=u;g=a;z=193;break b}else z=183}}while(0);d:do if((z|0)==183){d=0-a|0;do if(h>>>0>a>>>0&(a>>>0<2147483647&(b|0)!=(-1|0))?(w=c[8140]|0,w=i-a+w&0-w,w>>>0<2147483647):0)if((sa(w|0)|0)==(-1|0)){sa(d|0)|0;break d}else{a="w+a|0;break}while(0);if((b|0)!=(-1|0)){h=b;g=a;z=193;break" b}}while(0);c[8131]="c[8131]|4;z=190}else" z="190;while(0);if((((z|0)==190?j">>>0<2147483647:0)?(x=sa(j|0)|0,y=sa(0)|0,x>>>0>>0&((x|0)!=(-1|0)&(y|0)!=(-1|0))):0)?(g=y-x|0,g>>>0>(o+40|0)>>>0):0){h=x;z=193}if((z|0)==193){a=(c[8128]|0)+g|0;c[8128]=a;if(a>>>0>(c[8129]|0)>>>0)c[8129]=a;k=c[8026]|0;do if(k){f=32528;while(1){a=c[f>>2]|0;b=f+4|0;d=c[b>>2]|0;if((h|0)==(a+d|0)){z=203;break}e=c[f+8>>2]|0;if(!e)break;else f=e}if(((z|0)==203?(c[f+12>>2]&8|0)==0:0)?k>>>0>>0&k>>>0>=a>>>0:0){c[b>>2]=d+g;G=k+8|0;G=(G&7|0)==0?0:0-G&7;F=k+G|0;G=g-G+(c[8023]|0)|0;c[8026]=F;c[8023]=G;c[F+4>>2]=G|1;c[F+G+4>>2]=40;c[8027]=c[8142];break}a=c[8024]|0;if(h>>>0>>0){c[8024]=h;i=h}else i=a;b=h+g|0;a=32528;while(1){if((c[a>>2]|0)==(b|0)){z=211;break}a=c[a+8>>2]|0;if(!a){b=32528;break}}if((z|0)==211)if(!(c[a+12>>2]&8)){c[a>>2]=h;m=a+4|0;c[m>>2]=(c[m>>2]|0)+g;m=h+8|0;m=h+((m&7|0)==0?0:0-m&7)|0;a=b+8|0;a=b+((a&7|0)==0?0:0-a&7)|0;l=m+o|0;j=a-m-o|0;c[m+4>>2]=o|3;do if((a|0)!=(k|0)){if((a|0)==(c[8025]|0)){G=(c[8022]|0)+j|0;c[8022]=G;c[8025]=l;c[l+4>>2]=G|1;c[l+G>>2]=G;break}b=c[a+4>>2]|0;if((b&3|0)==1){h=b&-8;f=b>>>3;e:do if(b>>>0>=256){g=c[a+24>>2]|0;e=c[a+12>>2]|0;do if((e|0)==(a|0)){e=a+16|0;d=e+4|0;b=c[d>>2]|0;if(!b){b=c[e>>2]|0;if(!b){E=0;break}else d=e}while(1){e=b+20|0;f=c[e>>2]|0;if(f){b=f;d=e;continue}e=b+16|0;f=c[e>>2]|0;if(!f)break;else{b=f;d=e}}if(d>>>0>>0)ra();else{c[d>>2]=0;E=b;break}}else{f=c[a+8>>2]|0;if(f>>>0>>0)ra();b=f+12|0;if((c[b>>2]|0)!=(a|0))ra();d=e+8|0;if((c[d>>2]|0)==(a|0)){c[b>>2]=e;c[d>>2]=f;E=e;break}else ra()}while(0);if(!g)break;b=c[a+28>>2]|0;d=32384+(b<<2)|0;do if((a|0)!="(c[d">>2]|0)){if(g>>>0<(c[8024]|0)>>>0)ra();b=g+16|0;if((c[b>>2]|0)==(a|0))c[b>>2]=E;else c[g+20>>2]=E;if(!E)break e}else{c[d>>2]=E;if(E)break;c[8021]=c[8021]&~(1<>>0>>0)ra();c[E+24>>2]=g;b=a+16|0;d=c[b>>2]|0;do if(d)if(d>>>0>>0)ra();else{c[E+16>>2]=d;c[d+24>>2]=E;break}while(0);b=c[b+4>>2]|0;if(!b)break;if(b>>>0<(c[8024]|0)>>>0)ra();else{c[E+20>>2]=b;c[b+24>>2]=E;break}}else{d=c[a+8>>2]|0;e=c[a+12>>2]|0;b=32120+(f<<1<<2)|0;do if((d|0)!="(b|0)){if(d">>>0>>0)ra();if((c[d+12>>2]|0)==(a|0))break;ra()}while(0);if((e|0)==(d|0)){c[8020]=c[8020]&~(1<>>0>>0)ra();b=e+8|0;if((c[b>>2]|0)==(a|0)){B=b;break}ra()}while(0);c[d+12>>2]=e;c[B>>2]=d}while(0);a=a+h|0;f=h+j|0}else f=j;a=a+4|0;c[a>>2]=c[a>>2]&-2;c[l+4>>2]=f|1;c[l+f>>2]=f;a=f>>>3;if(f>>>0<256){d=32120+(a<<1<<2)|0;b=c[8020]|0;a=1<>2]|0;if(b>>>0>=(c[8024]|0)>>>0){F=a;G=b;break}ra()}while(0);c[F>>2]=l;c[G+12>>2]=l;c[l+8>>2]=G;c[l+12>>2]=d;break}a=f>>>8;do if(!a)d=0;else{if(f>>>0>16777215){d=31;break}F=(a+1048320|0)>>>16&8;G=a<>>16&4;G=G<>>16&2;d=14-(E|F|d)+(G<>>15)|0;d=f>>>(d+7|0)&1|d<<1}while(0);e=32384+(d<<2)|0;c[l+28>>2]=d;a=l+16|0;c[a+4>>2]=0;c[a>>2]=0;a=c[8021]|0;b=1<>2]=l;c[l+24>>2]=e;c[l+12>>2]=l;c[l+8>>2]=l;break}d=f<<((d|0)==31?0:25-(d>>>1)|0);e=c[e>>2]|0;while(1){if((c[e+4>>2]&-8|0)==(f|0)){z=281;break}b=e+16+(d>>>31<<2)|0;a=c[b>>2]|0;if(!a){z=278;break}else{d=d<<1;e=a}}if((z|0)==278)if(b>>>0<(c[8024]|0)>>>0)ra();else{c[b>>2]=l;c[l+24>>2]=e;c[l+12>>2]=l;c[l+8>>2]=l;break}else if((z|0)==281){a=e+8|0;b=c[a>>2]|0;G=c[8024]|0;if(b>>>0>=G>>>0&e>>>0>=G>>>0){c[b+12>>2]=l;c[a>>2]=l;c[l+8>>2]=b;c[l+12>>2]=e;c[l+24>>2]=0;break}else ra()}}else{G=(c[8023]|0)+j|0;c[8023]=G;c[8026]=l;c[l+4>>2]=G|1}while(0);G=m+8|0;return G|0}else b=32528;while(1){a=c[b>>2]|0;if(a>>>0<=k>>>0?(A=a+(c[b+4>>2]|0)|0,A>>>0>k>>>0):0)break;b=c[b+8>>2]|0}f=A+-47|0;b=f+8|0;b=f+((b&7|0)==0?0:0-b&7)|0;f=k+16|0;b=b>>>0>>0?k:b;a=b+8|0;d=h+8|0;d=(d&7|0)==0?0:0-d&7;G=h+d|0;d=g+-40-d|0;c[8026]=G;c[8023]=d;c[G+4>>2]=d|1;c[G+d+4>>2]=40;c[8027]=c[8142];d=b+4|0;c[d>>2]=27;c[a>>2]=c[8132];c[a+4>>2]=c[8133];c[a+8>>2]=c[8134];c[a+12>>2]=c[8135];c[8132]=h;c[8133]=g;c[8135]=0;c[8134]=a;a=b+24|0;do{a=a+4|0;c[a>>2]=7}while((a+4|0)>>>0>>0);if((b|0)!=(k|0)){g=b-k|0;c[d>>2]=c[d>>2]&-2;c[k+4>>2]=g|1;c[b>>2]=g;a=g>>>3;if(g>>>0<256){d=32120+(a<<1<<2)|0;b=c[8020]|0;a=1<>2]|0;if(b>>>0<(c[8024]|0)>>>0)ra();else{C=a;D=b}}else{c[8020]=b|a;C=d+8|0;D=d}c[C>>2]=k;c[D+12>>2]=k;c[k+8>>2]=D;c[k+12>>2]=d;break}a=g>>>8;if(a)if(g>>>0>16777215)d=31;else{F=(a+1048320|0)>>>16&8;G=a<>>16&4;G=G<>>16&2;d=14-(E|F|d)+(G<>>15)|0;d=g>>>(d+7|0)&1|d<<1}else d="0;e=32384+(d<<2)|0;c[k+28">>2]=d;c[k+20>>2]=0;c[f>>2]=0;a=c[8021]|0;b=1<>2]=k;c[k+24>>2]=e;c[k+12>>2]=k;c[k+8>>2]=k;break}d=g<<((d|0)==31?0:25-(d>>>1)|0);e=c[e>>2]|0;while(1){if((c[e+4>>2]&-8|0)==(g|0)){z=307;break}b=e+16+(d>>>31<<2)|0;a=c[b>>2]|0;if(!a){z=304;break}else{d=d<<1;e=a}}if((z|0)==304)if(b>>>0<(c[8024]|0)>>>0)ra();else{c[b>>2]=k;c[k+24>>2]=e;c[k+12>>2]=k;c[k+8>>2]=k;break}else if((z|0)==307){a=e+8|0;b=c[a>>2]|0;G=c[8024]|0;if(b>>>0>=G>>>0&e>>>0>=G>>>0){c[b+12>>2]=k;c[a>>2]=k;c[k+8>>2]=b;c[k+12>>2]=e;c[k+24>>2]=0;break}else ra()}}}else{G=c[8024]|0;if((G|0)==0|h>>>0>>0)c[8024]=h;c[8132]=h;c[8133]=g;c[8135]=0;c[8029]=c[8138];c[8028]=-1;a=0;do{G=32120+(a<<1<<2)|0;c[g+12>>2]=G;c[G+8>>2]=G;a=a+1|0}while((a|0)!=32);G=h+8|0;G=(G&7|0)==0?0:0-G&7;F=h+G|0;G=g+-40-G|0;c[8026]=F;c[8023]=G;c[F+4>>2]=G|1;c[F+G+4>>2]=40;c[8027]=c[8142]}while(0);a=c[8023]|0;if(a>>>0>o>>>0){E=a-o|0;c[8023]=E;G=c[8026]|0;F=G+o|0;c[8026]=F;c[F+4>>2]=E|1;c[G+4>>2]=o|3;G=G+8|0;return G|0}}if(!(c[7979]|0))a=31964;else a=c[(oa()|0)+60>>2]|0;c[a>>2]=12;G=0;return G|0}function zd(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;if(!a)return;d=a+-8|0;h=c[8024]|0;if(d>>>0>>0)ra();a=c[a+-4>>2]|0;b=a&3;if((b|0)==1)ra();e=a&-8;m=d+e|0;do if(!(a&1)){a=c[d>>2]|0;if(!b)return;k=d+(0-a)|0;j=a+e|0;if(k>>>0>>0)ra();if((k|0)==(c[8025]|0)){a=m+4|0;b=c[a>>2]|0;if((b&3|0)!=3){q=k;f=j;break}c[8022]=j;c[a>>2]=b&-2;c[k+4>>2]=j|1;c[k+j>>2]=j;return}e=a>>>3;if(a>>>0<256){b=c[k+8>>2]|0;d=c[k+12>>2]|0;a=32120+(e<<1<<2)|0;if((b|0)!=(a|0)){if(b>>>0>>0)ra();if((c[b+12>>2]|0)!=(k|0))ra()}if((d|0)==(b|0)){c[8020]=c[8020]&~(1<>>0>>0)ra();a=d+8|0;if((c[a>>2]|0)==(k|0))g=a;else ra()}else g=d+8|0;c[b+12>>2]=d;c[g>>2]=b;q=k;f=j;break}g=c[k+24>>2]|0;d=c[k+12>>2]|0;do if((d|0)==(k|0)){d=k+16|0;b=d+4|0;a=c[b>>2]|0;if(!a){a=c[d>>2]|0;if(!a){i=0;break}else b=d}while(1){d=a+20|0;e=c[d>>2]|0;if(e){a=e;b=d;continue}d=a+16|0;e=c[d>>2]|0;if(!e)break;else{a=e;b=d}}if(b>>>0>>0)ra();else{c[b>>2]=0;i=a;break}}else{e=c[k+8>>2]|0;if(e>>>0>>0)ra();a=e+12|0;if((c[a>>2]|0)!=(k|0))ra();b=d+8|0;if((c[b>>2]|0)==(k|0)){c[a>>2]=d;c[b>>2]=e;i=d;break}else ra()}while(0);if(g){a=c[k+28>>2]|0;b=32384+(a<<2)|0;if((k|0)==(c[b>>2]|0)){c[b>>2]=i;if(!i){c[8021]=c[8021]&~(1<>>0<(c[8024]|0)>>>0)ra();a=g+16|0;if((c[a>>2]|0)==(k|0))c[a>>2]=i;else c[g+20>>2]=i;if(!i){q=k;f=j;break}}d=c[8024]|0;if(i>>>0>>0)ra();c[i+24>>2]=g;a=k+16|0;b=c[a>>2]|0;do if(b)if(b>>>0>>0)ra();else{c[i+16>>2]=b;c[b+24>>2]=i;break}while(0);a=c[a+4>>2]|0;if(a)if(a>>>0<(c[8024]|0)>>>0)ra();else{c[i+20>>2]=a;c[a+24>>2]=i;q=k;f=j;break}else{q=k;f=j}}else{q=k;f=j}}else{q=d;f=e}while(0);if(q>>>0>=m>>>0)ra();a=m+4|0;b=c[a>>2]|0;if(!(b&1))ra();if(!(b&2)){if((m|0)==(c[8026]|0)){p=(c[8023]|0)+f|0;c[8023]=p;c[8026]=q;c[q+4>>2]=p|1;if((q|0)!=(c[8025]|0))return;c[8025]=0;c[8022]=0;return}if((m|0)==(c[8025]|0)){p=(c[8022]|0)+f|0;c[8022]=p;c[8025]=q;c[q+4>>2]=p|1;c[q+p>>2]=p;return}f=(b&-8)+f|0;e=b>>>3;do if(b>>>0>=256){g=c[m+24>>2]|0;a=c[m+12>>2]|0;do if((a|0)==(m|0)){d=m+16|0;b=d+4|0;a=c[b>>2]|0;if(!a){a=c[d>>2]|0;if(!a){n=0;break}else b=d}while(1){d=a+20|0;e=c[d>>2]|0;if(e){a=e;b=d;continue}d=a+16|0;e=c[d>>2]|0;if(!e)break;else{a=e;b=d}}if(b>>>0<(c[8024]|0)>>>0)ra();else{c[b>>2]=0;n=a;break}}else{b=c[m+8>>2]|0;if(b>>>0<(c[8024]|0)>>>0)ra();d=b+12|0;if((c[d>>2]|0)!=(m|0))ra();e=a+8|0;if((c[e>>2]|0)==(m|0)){c[d>>2]=a;c[e>>2]=b;n=a;break}else ra()}while(0);if(g){a=c[m+28>>2]|0;b=32384+(a<<2)|0;if((m|0)==(c[b>>2]|0)){c[b>>2]=n;if(!n){c[8021]=c[8021]&~(1<>>0<(c[8024]|0)>>>0)ra();a=g+16|0;if((c[a>>2]|0)==(m|0))c[a>>2]=n;else c[g+20>>2]=n;if(!n)break}d=c[8024]|0;if(n>>>0>>0)ra();c[n+24>>2]=g;a=m+16|0;b=c[a>>2]|0;do if(b)if(b>>>0>>0)ra();else{c[n+16>>2]=b;c[b+24>>2]=n;break}while(0);a=c[a+4>>2]|0;if(a)if(a>>>0<(c[8024]|0)>>>0)ra();else{c[n+20>>2]=a;c[a+24>>2]=n;break}}}else{b=c[m+8>>2]|0;d=c[m+12>>2]|0;a=32120+(e<<1<<2)|0;if((b|0)!=(a|0)){if(b>>>0<(c[8024]|0)>>>0)ra();if((c[b+12>>2]|0)!=(m|0))ra()}if((d|0)==(b|0)){c[8020]=c[8020]&~(1<>>0<(c[8024]|0)>>>0)ra();a=d+8|0;if((c[a>>2]|0)==(m|0))l=a;else ra()}else l=d+8|0;c[b+12>>2]=d;c[l>>2]=b}while(0);c[q+4>>2]=f|1;c[q+f>>2]=f;if((q|0)==(c[8025]|0)){c[8022]=f;return}}else{c[a>>2]=b&-2;c[q+4>>2]=f|1;c[q+f>>2]=f}a=f>>>3;if(f>>>0<256){d=32120+(a<<1<<2)|0;b=c[8020]|0;a=1<>2]|0;if(b>>>0<(c[8024]|0)>>>0)ra();else{o=a;p=b}}else{c[8020]=b|a;o=d+8|0;p=d}c[o>>2]=q;c[p+12>>2]=q;c[q+8>>2]=p;c[q+12>>2]=d;return}a=f>>>8;if(a)if(f>>>0>16777215)d=31;else{o=(a+1048320|0)>>>16&8;p=a<>>16&4;p=p<>>16&2;d=14-(n|o|d)+(p<>>15)|0;d=f>>>(d+7|0)&1|d<<1}else d="0;e=32384+(d<<2)|0;c[q+28">>2]=d;c[q+20>>2]=0;c[q+16>>2]=0;a=c[8021]|0;b=1<>>1)|0);e=c[e>>2]|0;while(1){if((c[e+4>>2]&-8|0)==(f|0)){a=130;break}b=e+16+(d>>>31<<2)|0;a=c[b>>2]|0;if(!a){a=127;break}else{d=d<<1;e=a}}if((a|0)==127)if(b>>>0<(c[8024]|0)>>>0)ra();else{c[b>>2]=q;c[q+24>>2]=e;c[q+12>>2]=q;c[q+8>>2]=q;break}else if((a|0)==130){a=e+8|0;b=c[a>>2]|0;p=c[8024]|0;if(b>>>0>=p>>>0&e>>>0>=p>>>0){c[b+12>>2]=q;c[a>>2]=q;c[q+8>>2]=b;c[q+12>>2]=e;c[q+24>>2]=0;break}else ra()}}else{c[8021]=a|b;c[e>>2]=q;c[q+24>>2]=e;c[q+12>>2]=q;c[q+8>>2]=q}while(0);q=(c[8028]|0)+-1|0;c[8028]=q;if(!q)a=32536;else return;while(1){a=c[a>>2]|0;if(!a)break;else a=a+8|0}c[8028]=-1;return}function Ad(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;o=a+b|0;d=c[a+4>>2]|0;do if(!(d&1)){g=c[a>>2]|0;if(!(d&3))return;l=a+(0-g)|0;k=g+b|0;i=c[8024]|0;if(l>>>0>>0)ra();if((l|0)==(c[8025]|0)){a=o+4|0;d=c[a>>2]|0;if((d&3|0)!=3){r=l;f=k;break}c[8022]=k;c[a>>2]=d&-2;c[l+4>>2]=k|1;c[l+k>>2]=k;return}e=g>>>3;if(g>>>0<256){a=c[l+8>>2]|0;b=c[l+12>>2]|0;d=32120+(e<<1<<2)|0;if((a|0)!=(d|0)){if(a>>>0>>0)ra();if((c[a+12>>2]|0)!=(l|0))ra()}if((b|0)==(a|0)){c[8020]=c[8020]&~(1<>>0>>0)ra();d=b+8|0;if((c[d>>2]|0)==(l|0))h=d;else ra()}else h=b+8|0;c[a+12>>2]=b;c[h>>2]=a;r=l;f=k;break}g=c[l+24>>2]|0;b=c[l+12>>2]|0;do if((b|0)==(l|0)){b=l+16|0;a=b+4|0;d=c[a>>2]|0;if(!d){d=c[b>>2]|0;if(!d){j=0;break}else a=b}while(1){b=d+20|0;e=c[b>>2]|0;if(e){d=e;a=b;continue}b=d+16|0;e=c[b>>2]|0;if(!e)break;else{d=e;a=b}}if(a>>>0>>0)ra();else{c[a>>2]=0;j=d;break}}else{e=c[l+8>>2]|0;if(e>>>0>>0)ra();d=e+12|0;if((c[d>>2]|0)!=(l|0))ra();a=b+8|0;if((c[a>>2]|0)==(l|0)){c[d>>2]=b;c[a>>2]=e;j=b;break}else ra()}while(0);if(g){d=c[l+28>>2]|0;a=32384+(d<<2)|0;if((l|0)==(c[a>>2]|0)){c[a>>2]=j;if(!j){c[8021]=c[8021]&~(1<>>0<(c[8024]|0)>>>0)ra();d=g+16|0;if((c[d>>2]|0)==(l|0))c[d>>2]=j;else c[g+20>>2]=j;if(!j){r=l;f=k;break}}b=c[8024]|0;if(j>>>0>>0)ra();c[j+24>>2]=g;d=l+16|0;a=c[d>>2]|0;do if(a)if(a>>>0>>0)ra();else{c[j+16>>2]=a;c[a+24>>2]=j;break}while(0);d=c[d+4>>2]|0;if(d)if(d>>>0<(c[8024]|0)>>>0)ra();else{c[j+20>>2]=d;c[d+24>>2]=j;r=l;f=k;break}else{r=l;f=k}}else{r=l;f=k}}else{r=a;f=b}while(0);h=c[8024]|0;if(o>>>0>>0)ra();d=o+4|0;a=c[d>>2]|0;if(!(a&2)){if((o|0)==(c[8026]|0)){q=(c[8023]|0)+f|0;c[8023]=q;c[8026]=r;c[r+4>>2]=q|1;if((r|0)!=(c[8025]|0))return;c[8025]=0;c[8022]=0;return}if((o|0)==(c[8025]|0)){q=(c[8022]|0)+f|0;c[8022]=q;c[8025]=r;c[r+4>>2]=q|1;c[r+q>>2]=q;return}f=(a&-8)+f|0;e=a>>>3;do if(a>>>0>=256){g=c[o+24>>2]|0;b=c[o+12>>2]|0;do if((b|0)==(o|0)){b=o+16|0;a=b+4|0;d=c[a>>2]|0;if(!d){d=c[b>>2]|0;if(!d){n=0;break}else a=b}while(1){b=d+20|0;e=c[b>>2]|0;if(e){d=e;a=b;continue}b=d+16|0;e=c[b>>2]|0;if(!e)break;else{d=e;a=b}}if(a>>>0>>0)ra();else{c[a>>2]=0;n=d;break}}else{e=c[o+8>>2]|0;if(e>>>0>>0)ra();d=e+12|0;if((c[d>>2]|0)!=(o|0))ra();a=b+8|0;if((c[a>>2]|0)==(o|0)){c[d>>2]=b;c[a>>2]=e;n=b;break}else ra()}while(0);if(g){d=c[o+28>>2]|0;a=32384+(d<<2)|0;if((o|0)==(c[a>>2]|0)){c[a>>2]=n;if(!n){c[8021]=c[8021]&~(1<>>0<(c[8024]|0)>>>0)ra();d=g+16|0;if((c[d>>2]|0)==(o|0))c[d>>2]=n;else c[g+20>>2]=n;if(!n)break}b=c[8024]|0;if(n>>>0>>0)ra();c[n+24>>2]=g;d=o+16|0;a=c[d>>2]|0;do if(a)if(a>>>0>>0)ra();else{c[n+16>>2]=a;c[a+24>>2]=n;break}while(0);d=c[d+4>>2]|0;if(d)if(d>>>0<(c[8024]|0)>>>0)ra();else{c[n+20>>2]=d;c[d+24>>2]=n;break}}}else{a=c[o+8>>2]|0;b=c[o+12>>2]|0;d=32120+(e<<1<<2)|0;if((a|0)!=(d|0)){if(a>>>0>>0)ra();if((c[a+12>>2]|0)!=(o|0))ra()}if((b|0)==(a|0)){c[8020]=c[8020]&~(1<>>0>>0)ra();d=b+8|0;if((c[d>>2]|0)==(o|0))m=d;else ra()}else m=b+8|0;c[a+12>>2]=b;c[m>>2]=a}while(0);c[r+4>>2]=f|1;c[r+f>>2]=f;if((r|0)==(c[8025]|0)){c[8022]=f;return}}else{c[d>>2]=a&-2;c[r+4>>2]=f|1;c[r+f>>2]=f}d=f>>>3;if(f>>>0<256){b=32120+(d<<1<<2)|0;a=c[8020]|0;d=1<>2]|0;if(a>>>0<(c[8024]|0)>>>0)ra();else{p=d;q=a}}else{c[8020]=a|d;p=b+8|0;q=b}c[p>>2]=r;c[q+12>>2]=r;c[r+8>>2]=q;c[r+12>>2]=b;return}d=f>>>8;if(d)if(f>>>0>16777215)b=31;else{p=(d+1048320|0)>>>16&8;q=d<>>16&4;q=q<>>16&2;b=14-(o|p|b)+(q<>>15)|0;b=f>>>(b+7|0)&1|b<<1}else b="0;e=32384+(b<<2)|0;c[r+28">>2]=b;c[r+20>>2]=0;c[r+16>>2]=0;d=c[8021]|0;a=1<>2]=r;c[r+24>>2]=e;c[r+12>>2]=r;c[r+8>>2]=r;return}b=f<<((b|0)==31?0:25-(b>>>1)|0);e=c[e>>2]|0;while(1){if((c[e+4>>2]&-8|0)==(f|0)){d=127;break}a=e+16+(b>>>31<<2)|0;d=c[a>>2]|0;if(!d){d=124;break}else{b=b<<1;e=d}}if((d|0)==124){if(a>>>0<(c[8024]|0)>>>0)ra();c[a>>2]=r;c[r+24>>2]=e;c[r+12>>2]=r;c[r+8>>2]=r;return}else if((d|0)==127){d=e+8|0;a=c[d>>2]|0;q=c[8024]|0;if(!(a>>>0>=q>>>0&e>>>0>=q>>>0))ra();c[a+12>>2]=r;c[d>>2]=r;c[r+8>>2]=a;c[r+12>>2]=e;c[r+24>>2]=0;return}}function Bd(){}function Cd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;d=b-d-(c>>>0>a>>>0|0)>>>0;return (C=d,a-c>>>0|0)|0}function Dd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;c=a+c>>>0;return (C=b+d+(c>>>0>>0|0)>>>0,c|0)|0}function Ed(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){c=b>>c;return a>>>c|(b&(1<>c-32|0}function Fd(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;f=b+e|0;if((e|0)>=20){d=d&255;h=b&3;i=d|d<<8|d<<16|d<<24;g=f&~3;if(h){h=b+4-h|0;while((b|0)<(h|0)){a[b>>0]=d;b=b+1|0}}while((b|0)<(g|0)){c[b>>2]=i;b=b+4|0}}while((b|0)<(f|0)){a[b>>0]=d;b=b+1|0}return b-e|0}function Gd(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){c=b>>>c;return a>>>c|(b&(1<>>c-32|0}function Hd(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){c=b<>>32-c;return a<=4096)return va(b|0,d|0,e|0)|0;f=b|0;if((b&3)==(d&3)){while(b&3){if(!e)return f|0;a[b>>0]=a[d>>0]|0;b=b+1|0;d=d+1|0;e=e-1|0}while((e|0)>=4){c[b>>2]=c[d>>2];b=b+4|0;d=d+4|0;e=e-4|0}}while((e|0)>0){a[b>>0]=a[d>>0]|0;b=b+1|0;d=d+1|0;e=e-1|0}return f|0}function Jd(b,c,d){b=b|0;c=c|0;d=d|0;var e=0;if((c|0)<(b|0)&(b|0)<(c+d|0)){e=b;c=c+d|0;b=b+d|0;while((d|0)>0){b=b-1|0;c=c-1|0;d=d-1|0;a[b>>0]=a[c>>0]|0}b=e}else Id(b,c,d)|0;return b|0}function Kd(b){b=b|0;var c=0;c=a[m+(b&255)>>0]|0;if((c|0)<8)return c|0;c="a[m+(b">>8&255)>>0]|0;if((c|0)<8)return c+8|0;c="a[m+(b">>16&255)>>0]|0;if((c|0)<8)return c+16|0;return="" (a[m+(b="">>>24)>>0]|0)+24|0}function Ld(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0;f=a&65535;e=b&65535;c=_(e,f)|0;d=a>>>16;a=(c>>>16)+(_(e,d)|0)|0;e=b>>>16;b=_(e,f)|0;return (C=(a>>>16)+(_(e,d)|0)+(((a&65535)+b|0)>>>16)|0,a+b<<16|c&65535|0)|0}function md(a,b,c,d){a="a|0;b=b|0;c=c|0;d=d|0;var" e="0,f=0,g=0,h=0,i=0,j=0;j=b">>31|((b|0)<0?-1:0)<<1;i=((b|0)<0?-1:0)>>31|((b|0)<0?-1:0)<<1;f=d>>31|((d|0)<0?-1:0)<<1;e=((d|0)<0?-1:0)>>31|((d|0)<0?-1:0)<<1;h=cd(j^a,i^b,j,i)|0;g=c;a=f^j;b=e^i;return cd((rd(h,g,cd(f^c,e^d,f,e)|0,c,0)|0)^a,c^b,a,b)|0}function="" nd(a,b,d,e){a="a|0;b=b|0;d=d|0;e=e|0;var" f="0,g=0,h=0,j=0,k=0,l=0;f=i;i=i+16|0;j=f|0;h=b">>31|((b|0)<0?-1:0)<<1;g=((b|0)<0?-1:0)>>31|((b|0)<0?-1:0)<<1;l=e>>31|((e|0)<0?-1:0)<<1;k=((e|0)<0?-1:0)>>31|((e|0)<0?-1:0)<<1;a=cd(h^a,g^b,h,g)|0;b=c;rd(a,b,cd(l^d,k^e,l,k)|0,c,j)|0;e=cd(c[j>>2]^h,c[j+4>>2]^g,h,g)|0;d=C;i=f;return (C=d,e)|0}function Od(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;e=a;f=c;c=Ld(e,f)|0;a=C;return (C=(_(b,f)|0)+(_(d,e)|0)+a|a&0,c|0|0)|0}function Pd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return Rd(a,b,c,d,0)|0}function Qd(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;g=i;i=i+16|0;f=g|0;Rd(a,b,d,e,f)|0;i=g;return (C=c[f+4>>2]|0,c[f>>2]|0)|0}function Rd(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;l=a;j=b;k=j;h=d;n=e;i=n;if(!k){g=(f|0)!=0;if(!i){if(g){c[f>>2]=(l>>>0)%(h>>>0);c[f+4>>2]=0}n=0;f=(l>>>0)/(h>>>0)>>>0;return (C=n,f)|0}else{if(!g){n=0;f=0;return (C=n,f)|0}c[f>>2]=a|0;c[f+4>>2]=b&0;n=0;f=0;return (C=n,f)|0}}g=(i|0)==0;do if(h){if(!g){g=(aa(i|0)|0)-(aa(k|0)|0)|0;if(g>>>0<=31){m=g+1|0;i=31-g|0;b=g-31>>31;h=m;a=l>>>(m>>>0)&b|k<>>(m>>>0)&b;g=0;i=l<>2]=a|0;c[f+4>>2]=j|b&0;n=0;f=0;return (C=n,f)|0}g=h-1|0;if(g&h){i=(aa(h|0)|0)+33-(aa(k|0)|0)|0;p=64-i|0;m=32-i|0;j=m>>31;o=i-32|0;b=o>>31;h=i;a=m-1>>31&k>>>(o>>>0)|(k<>>(i>>>0))&b;b=b&k>>>(i>>>0);g=l<>>(o>>>0))&j|l<>31;break}if(f){c[f>>2]=g&l;c[f+4>>2]=0}if((h|0)==1){o=j|b&0;p=a|0|0;return (C=o,p)|0}else{p=Kd(h|0)|0;o=k>>>(p>>>0)|0;p=k<<32-p|l>>>(p>>>0)|0;return (C=o,p)|0}}else{if(g){if(f){c[f>>2]=(k>>>0)%(h>>>0);c[f+4>>2]=0}o=0;p=(k>>>0)/(h>>>0)>>>0;return (C=o,p)|0}if(!l){if(f){c[f>>2]=0;c[f+4>>2]=(k>>>0)%(i>>>0)}o=0;p=(k>>>0)/(i>>>0)>>>0;return (C=o,p)|0}g=i-1|0;if(!(g&i)){if(f){c[f>>2]=a|0;c[f+4>>2]=g&k|b&0}o=0;p=k>>>((Kd(i|0)|0)>>>0);return (C=o,p)|0}g=(aa(i|0)|0)-(aa(k|0)|0)|0;if(g>>>0<=30){b=g+1|0;i=31-g|0;h=b;a=k<>>(b>>>0);b=k>>>(b>>>0);g=0;i=l<>2]=a|0;c[f+4>>2]=j|b&0;o=0;p=0;return (C=o,p)|0}while(0);if(!h){k=i;j=0;i=0}else{m=d|0|0;l=n|e&0;k=Dd(m|0,l|0,-1,-1)|0;d=C;j=i;i=0;do{e=j;j=g>>>31|j<<1;g=i|g<<1;e=a<<1|e>>>31|0;n=a>>>31|b<<1|0;cd(k,d,e,n)|0;p=c;o=p>>31|((p|0)<0?-1:0)<<1;i=o&1;a=cd(e,n,o&m,(((p|0)<0?-1:0)>>31|((p|0)<0?-1:0)<<1)&l)|0;b=c;h=h-1|0}while((h|0)!=0);k=j;j=0}h=0;if(f){c[f>>2]=a;c[f+4>>2]=b}o=(g|0)>>>31|(k|h)<<1|(h<<1|g>>>31)&0|j;p=(g<<1|0>>>31)&-2|i;return (C=o,p)|0}function Sd(a){a=a|0;return Da[a&31]()|0}function Td(){return ea(0)|0}function Ud(){return ea(1)|0}function Vd(){return ea(2)|0}function Wd(){return ea(3)|0}function Xd(){return ea(4)|0}function Yd(){return ea(5)|0}function Zd(){return ea(6)|0}function _d(){return ea(7)|0}function $d(a,b){a=a|0;b=b|0;return Ea[a&31](b|0)|0}function ae(a){a=a|0;return ga(0,a|0)|0}function be(a){a=a|0;return ga(1,a|0)|0}function ce(a){a=a|0;return ga(2,a|0)|0}function de(a){a=a|0;return ga(3,a|0)|0}function ee(a){a=a|0;return ga(4,a|0)|0}function fe(a){a=a|0;return ga(5,a|0)|0}function ge(a){a=a|0;return ga(6,a|0)|0}function he(a){a=a|0;return ga(7,a|0)|0}function ie(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return Fa[a&31](b|0,c|0,d|0)|0}function je(a,b,c){a=a|0;b=b|0;c=c|0;return ia(0,a|0,b|0,c|0)|0}function ke(a,b,c){a=a|0;b=b|0;c=c|0;return ia(1,a|0,b|0,c|0)|0}function le(a,b,c){a=a|0;b=b|0;c=c|0;return ia(2,a|0,b|0,c|0)|0}function me(a,b,c){a=a|0;b=b|0;c=c|0;return ia(3,a|0,b|0,c|0)|0}function ne(a,b,c){a=a|0;b=b|0;c=c|0;return ia(4,a|0,b|0,c|0)|0}function oe(a,b,c){a=a|0;b=b|0;c=c|0;return ia(5,a|0,b|0,c|0)|0}function pe(a,b,c){a=a|0;b=b|0;c=c|0;return ia(6,a|0,b|0,c|0)|0}function qe(a,b,c){a=a|0;b=b|0;c=c|0;return ia(7,a|0,b|0,c|0)|0}function re(a,b){a=a|0;b=b|0;Ga[a&31](b|0)}function se(a){a=a|0;ka(0,a|0)}function te(a){a=a|0;ka(1,a|0)}function ue(a){a=a|0;ka(2,a|0)}function ve(a){a=a|0;ka(3,a|0)}function we(a){a=a|0;ka(4,a|0)}function xe(a){a=a|0;ka(5,a|0)}function ye(a){a=a|0;ka(6,a|0)}function ze(a){a=a|0;ka(7,a|0)}function Ae(){ba(0);return 0}function Be(a){a=a|0;ba(1);return 0}function Ce(a,b,c){a=a|0;b=b|0;c=c|0;ba(2);return 0}function De(a){a=a|0;ba(3)} // EMSCRIPTEN_END_FUNCS var Da=[Ae,Ae,Td,Ae,Ud,Ae,Vd,Ae,Wd,Ae,Xd,Ae,Yd,Ae,Zd,Ae,_d,Ae,Ae,Ae,Ae,Ae,Ae,Ae,Ae,Ae,Ae,Ae,Ae,Ae,Ae,Ae];var Ea=[Be,Be,ae,Be,be,Be,ce,Be,de,Be,ee,Be,fe,Be,ge,Be,he,Be,pd,Be,Be,Be,Be,Be,Be,Be,Be,Be,Be,Be,Be,Be];var Fa=[Ce,Ce,je,Ce,ke,Ce,le,Ce,me,Ce,ne,Ce,oe,Ce,pe,Ce,qe,Ce,sd,qd,rd,Ce,Ce,Ce,Ce,Ce,Ce,Ce,Ce,Ce,Ce,Ce];var Ga=[De,De,se,De,te,De,ue,De,ve,De,we,De,xe,De,ye,De,ze,De,wd,De,De,De,De,De,De,De,De,De,De,De,De,De];return{_sodium_library_version_minor:jd,_crypto_onetimeauth_bytes:Jb,_sodium_version_string:hd,_sodium_hex2bin:gd,_crypto_pwhash_scryptsalsa208sha256_memlimit_sensitive:dc,_bitshift64Lshr:Gd,_crypto_pwhash_scryptsalsa208sha256:ec,_crypto_box_noncebytes:Za,_crypto_box_beforenm:bb,_crypto_scalarmult_base:mc,_crypto_auth_bytes:Qa,_crypto_sign_open:Fc,_memcpy:Id,_crypto_box_seed_keypair:$a,_crypto_pwhash_scryptsalsa208sha256_memlimit_interactive:bc,_crypto_box_open_easy_afternm:ib,_crypto_sign_ed25519_sk_to_curve25519:Uc,_sodium_memzero:ed,_crypto_box_seal:kb,_free:zd,_crypto_shorthash:xc,_crypto_auth_keybytes:Ra,_crypto_pwhash_scryptsalsa208sha256_saltbytes:Zb,_crypto_sign_seedbytes:zc,_crypto_box_detached_afternm:cb,_crypto_auth:Sa,_randombytes_random:_c,_crypto_sign_keypair:Dc,_crypto_shorthash_keybytes:wc,_crypto_generichash_statebytes:vb,_crypto_pwhash_scryptsalsa208sha256_str_verify:gc,_crypto_generichash_init:xb,_crypto_generichash_keybytes_max:tb,_crypto_sign_ed25519_pk_to_curve25519:Tc,_crypto_box_beforenmbytes:Ya,_crypto_generichash:wb,_sodium_library_version_major:id,_randombytes_stir:$c,_randombytes_close:cd,_crypto_onetimeauth_keybytes:Kb,_crypto_onetimeauth:Lb,_crypto_shorthash_bytes:vc,_crypto_box_secretkeybytes:Xa,_crypto_onetimeauth_update:Ob,_crypto_pwhash_scryptsalsa208sha256_ll:Wb,_crypto_box_detached:db,_randombytes_buf:bd,_crypto_pwhash_scryptsalsa208sha256_str:fc,_bitshift64Ashr:Ed,_crypto_box_open_detached:hb,_crypto_scalarmult_bytes:kc,_crypto_auth_verify:Ta,_crypto_box_seal_open:lb,_crypto_secretbox_detached:rc,_crypto_secretbox_easy:sc,_crypto_pwhash_scryptsalsa208sha256_strbytes:_b,_memset:Fd,_crypto_box_open_detached_afternm:gb,_crypto_box_sealbytes:mb,_i64Subtract:Cd,_crypto_pwhash_scryptsalsa208sha256_strprefix:$b,_crypto_box_seedbytes:Va,_crypto_hash:Cb,_crypto_box_easy_afternm:eb,_crypto_box_macbytes:_a,_crypto_box_publickeybytes:Wa,_sodium_bin2hex:fd,_crypto_sign_secretkeybytes:Bc,_crypto_scalarmult_scalarbytes:lc,_crypto_onetimeauth_statebytes:Ib,_crypto_generichash_keybytes_min:sb,_malloc:yd,_memmove:Jd,_crypto_sign:Ec,_crypto_secretbox_noncebytes:pc,_randombytes_set_implementation:Zc,_crypto_box_keypair:ab,_crypto_generichash_keybytes:ub,_crypto_generichash_bytes_min:pb,_sodium_init:dd,_crypto_secretbox_macbytes:qc,_crypto_secretbox_keybytes:oc,_bitshift64Shl:Hd,_crypto_hash_bytes:Bb,_fflush:td,_crypto_generichash_bytes:rb,_crypto_generichash_bytes_max:qb,_crypto_secretbox_open_detached:tc,_crypto_sign_verify_detached:Hc,_crypto_onetimeauth_verify:Mb,_crypto_box_open_easy:jb,_crypto_pwhash_scryptsalsa208sha256_opslimit_sensitive:cc,_crypto_sign_publickeybytes:Ac,_i64Add:Dd,_crypto_sign_bytes:yc,_crypto_generichash_update:yb,_crypto_scalarmult:nc,_crypto_sign_detached:Gc,_crypto_box_easy:fb,___errno_location:od,_crypto_onetimeauth_final:Pb,_crypto_secretbox_open_easy:uc,_crypto_generichash_final:zb,_randombytes_uniform:ad,_crypto_sign_seed_keypair:Cc,_crypto_pwhash_scryptsalsa208sha256_opslimit_interactive:ac,_crypto_onetimeauth_init:Nb,runPostSets:Bd,stackAlloc:Ha,stackSave:Ia,stackRestore:Ja,establishStackSpace:Ka,setThrew:La,setTempRet0:Oa,getTempRet0:Pa,dynCall_i:Sd,dynCall_ii:$d,dynCall_iiii:ie,dynCall_vi:re}}) // EMSCRIPTEN_END_ASM (Module.asmGlobalArg,Module.asmLibraryArg,buffer);var _sodium_library_version_minor=Module["_sodium_library_version_minor"]=asm["_sodium_library_version_minor"];var _crypto_onetimeauth_bytes=Module["_crypto_onetimeauth_bytes"]=asm["_crypto_onetimeauth_bytes"];var _crypto_pwhash_scryptsalsa208sha256_memlimit_sensitive=Module["_crypto_pwhash_scryptsalsa208sha256_memlimit_sensitive"]=asm["_crypto_pwhash_scryptsalsa208sha256_memlimit_sensitive"];var _bitshift64Lshr=Module["_bitshift64Lshr"]=asm["_bitshift64Lshr"];var _crypto_pwhash_scryptsalsa208sha256=Module["_crypto_pwhash_scryptsalsa208sha256"]=asm["_crypto_pwhash_scryptsalsa208sha256"];var _crypto_box_noncebytes=Module["_crypto_box_noncebytes"]=asm["_crypto_box_noncebytes"];var _crypto_box_beforenm=Module["_crypto_box_beforenm"]=asm["_crypto_box_beforenm"];var _crypto_scalarmult_base=Module["_crypto_scalarmult_base"]=asm["_crypto_scalarmult_base"];var _crypto_auth_bytes=Module["_crypto_auth_bytes"]=asm["_crypto_auth_bytes"];var _crypto_sign_open=Module["_crypto_sign_open"]=asm["_crypto_sign_open"];var _memcpy=Module["_memcpy"]=asm["_memcpy"];var _crypto_box_seed_keypair=Module["_crypto_box_seed_keypair"]=asm["_crypto_box_seed_keypair"];var _crypto_pwhash_scryptsalsa208sha256_memlimit_interactive=Module["_crypto_pwhash_scryptsalsa208sha256_memlimit_interactive"]=asm["_crypto_pwhash_scryptsalsa208sha256_memlimit_interactive"];var _crypto_box_open_easy_afternm=Module["_crypto_box_open_easy_afternm"]=asm["_crypto_box_open_easy_afternm"];var _crypto_sign_ed25519_sk_to_curve25519=Module["_crypto_sign_ed25519_sk_to_curve25519"]=asm["_crypto_sign_ed25519_sk_to_curve25519"];var _sodium_memzero=Module["_sodium_memzero"]=asm["_sodium_memzero"];var _crypto_box_seal=Module["_crypto_box_seal"]=asm["_crypto_box_seal"];var _free=Module["_free"]=asm["_free"];var runPostSets=Module["runPostSets"]=asm["runPostSets"];var _crypto_shorthash=Module["_crypto_shorthash"]=asm["_crypto_shorthash"];var _crypto_auth_keybytes=Module["_crypto_auth_keybytes"]=asm["_crypto_auth_keybytes"];var _crypto_pwhash_scryptsalsa208sha256_saltbytes=Module["_crypto_pwhash_scryptsalsa208sha256_saltbytes"]=asm["_crypto_pwhash_scryptsalsa208sha256_saltbytes"];var _crypto_sign_seedbytes=Module["_crypto_sign_seedbytes"]=asm["_crypto_sign_seedbytes"];var _crypto_box_detached_afternm=Module["_crypto_box_detached_afternm"]=asm["_crypto_box_detached_afternm"];var _crypto_auth=Module["_crypto_auth"]=asm["_crypto_auth"];var _randombytes_random=Module["_randombytes_random"]=asm["_randombytes_random"];var _crypto_sign_keypair=Module["_crypto_sign_keypair"]=asm["_crypto_sign_keypair"];var _crypto_generichash_keybytes_min=Module["_crypto_generichash_keybytes_min"]=asm["_crypto_generichash_keybytes_min"];var _crypto_generichash_statebytes=Module["_crypto_generichash_statebytes"]=asm["_crypto_generichash_statebytes"];var _crypto_pwhash_scryptsalsa208sha256_str_verify=Module["_crypto_pwhash_scryptsalsa208sha256_str_verify"]=asm["_crypto_pwhash_scryptsalsa208sha256_str_verify"];var _sodium_version_string=Module["_sodium_version_string"]=asm["_sodium_version_string"];var _crypto_generichash_keybytes_max=Module["_crypto_generichash_keybytes_max"]=asm["_crypto_generichash_keybytes_max"];var _crypto_sign_ed25519_pk_to_curve25519=Module["_crypto_sign_ed25519_pk_to_curve25519"]=asm["_crypto_sign_ed25519_pk_to_curve25519"];var _crypto_sign_publickeybytes=Module["_crypto_sign_publickeybytes"]=asm["_crypto_sign_publickeybytes"];var _crypto_box_beforenmbytes=Module["_crypto_box_beforenmbytes"]=asm["_crypto_box_beforenmbytes"];var _crypto_generichash=Module["_crypto_generichash"]=asm["_crypto_generichash"];var _sodium_library_version_major=Module["_sodium_library_version_major"]=asm["_sodium_library_version_major"];var _randombytes_stir=Module["_randombytes_stir"]=asm["_randombytes_stir"];var _crypto_shorthash_keybytes=Module["_crypto_shorthash_keybytes"]=asm["_crypto_shorthash_keybytes"];var _randombytes_close=Module["_randombytes_close"]=asm["_randombytes_close"];var _crypto_onetimeauth_keybytes=Module["_crypto_onetimeauth_keybytes"]=asm["_crypto_onetimeauth_keybytes"];var _crypto_onetimeauth=Module["_crypto_onetimeauth"]=asm["_crypto_onetimeauth"];var _crypto_shorthash_bytes=Module["_crypto_shorthash_bytes"]=asm["_crypto_shorthash_bytes"];var _crypto_box_secretkeybytes=Module["_crypto_box_secretkeybytes"]=asm["_crypto_box_secretkeybytes"];var _crypto_onetimeauth_update=Module["_crypto_onetimeauth_update"]=asm["_crypto_onetimeauth_update"];var _crypto_pwhash_scryptsalsa208sha256_ll=Module["_crypto_pwhash_scryptsalsa208sha256_ll"]=asm["_crypto_pwhash_scryptsalsa208sha256_ll"];var _crypto_box_detached=Module["_crypto_box_detached"]=asm["_crypto_box_detached"];var _randombytes_buf=Module["_randombytes_buf"]=asm["_randombytes_buf"];var _crypto_pwhash_scryptsalsa208sha256_strbytes=Module["_crypto_pwhash_scryptsalsa208sha256_strbytes"]=asm["_crypto_pwhash_scryptsalsa208sha256_strbytes"];var _bitshift64Ashr=Module["_bitshift64Ashr"]=asm["_bitshift64Ashr"];var _crypto_box_open_detached=Module["_crypto_box_open_detached"]=asm["_crypto_box_open_detached"];var _crypto_scalarmult_bytes=Module["_crypto_scalarmult_bytes"]=asm["_crypto_scalarmult_bytes"];var _crypto_auth_verify=Module["_crypto_auth_verify"]=asm["_crypto_auth_verify"];var _crypto_sign_detached=Module["_crypto_sign_detached"]=asm["_crypto_sign_detached"];var _crypto_secretbox_detached=Module["_crypto_secretbox_detached"]=asm["_crypto_secretbox_detached"];var _crypto_secretbox_easy=Module["_crypto_secretbox_easy"]=asm["_crypto_secretbox_easy"];var _crypto_pwhash_scryptsalsa208sha256_str=Module["_crypto_pwhash_scryptsalsa208sha256_str"]=asm["_crypto_pwhash_scryptsalsa208sha256_str"];var _memset=Module["_memset"]=asm["_memset"];var _crypto_box_open_detached_afternm=Module["_crypto_box_open_detached_afternm"]=asm["_crypto_box_open_detached_afternm"];var _crypto_box_sealbytes=Module["_crypto_box_sealbytes"]=asm["_crypto_box_sealbytes"];var _i64Subtract=Module["_i64Subtract"]=asm["_i64Subtract"];var _crypto_pwhash_scryptsalsa208sha256_strprefix=Module["_crypto_pwhash_scryptsalsa208sha256_strprefix"]=asm["_crypto_pwhash_scryptsalsa208sha256_strprefix"];var _crypto_box_seedbytes=Module["_crypto_box_seedbytes"]=asm["_crypto_box_seedbytes"];var _crypto_hash=Module["_crypto_hash"]=asm["_crypto_hash"];var _crypto_box_easy_afternm=Module["_crypto_box_easy_afternm"]=asm["_crypto_box_easy_afternm"];var _crypto_box_macbytes=Module["_crypto_box_macbytes"]=asm["_crypto_box_macbytes"];var _crypto_box_publickeybytes=Module["_crypto_box_publickeybytes"]=asm["_crypto_box_publickeybytes"];var _sodium_bin2hex=Module["_sodium_bin2hex"]=asm["_sodium_bin2hex"];var _crypto_sign_secretkeybytes=Module["_crypto_sign_secretkeybytes"]=asm["_crypto_sign_secretkeybytes"];var _crypto_scalarmult_scalarbytes=Module["_crypto_scalarmult_scalarbytes"]=asm["_crypto_scalarmult_scalarbytes"];var _crypto_onetimeauth_statebytes=Module["_crypto_onetimeauth_statebytes"]=asm["_crypto_onetimeauth_statebytes"];var _crypto_generichash_bytes_min=Module["_crypto_generichash_bytes_min"]=asm["_crypto_generichash_bytes_min"];var _malloc=Module["_malloc"]=asm["_malloc"];var _crypto_secretbox_open_easy=Module["_crypto_secretbox_open_easy"]=asm["_crypto_secretbox_open_easy"];var _crypto_sign=Module["_crypto_sign"]=asm["_crypto_sign"];var _crypto_secretbox_noncebytes=Module["_crypto_secretbox_noncebytes"]=asm["_crypto_secretbox_noncebytes"];var _randombytes_set_implementation=Module["_randombytes_set_implementation"]=asm["_randombytes_set_implementation"];var _crypto_box_keypair=Module["_crypto_box_keypair"]=asm["_crypto_box_keypair"];var _crypto_generichash_keybytes=Module["_crypto_generichash_keybytes"]=asm["_crypto_generichash_keybytes"];var _sodium_hex2bin=Module["_sodium_hex2bin"]=asm["_sodium_hex2bin"];var _sodium_init=Module["_sodium_init"]=asm["_sodium_init"];var _crypto_secretbox_macbytes=Module["_crypto_secretbox_macbytes"]=asm["_crypto_secretbox_macbytes"];var _crypto_secretbox_keybytes=Module["_crypto_secretbox_keybytes"]=asm["_crypto_secretbox_keybytes"];var _bitshift64Shl=Module["_bitshift64Shl"]=asm["_bitshift64Shl"];var _crypto_hash_bytes=Module["_crypto_hash_bytes"]=asm["_crypto_hash_bytes"];var _fflush=Module["_fflush"]=asm["_fflush"];var _crypto_generichash_bytes=Module["_crypto_generichash_bytes"]=asm["_crypto_generichash_bytes"];var _crypto_generichash_bytes_max=Module["_crypto_generichash_bytes_max"]=asm["_crypto_generichash_bytes_max"];var _crypto_secretbox_open_detached=Module["_crypto_secretbox_open_detached"]=asm["_crypto_secretbox_open_detached"];var _crypto_sign_verify_detached=Module["_crypto_sign_verify_detached"]=asm["_crypto_sign_verify_detached"];var _crypto_onetimeauth_verify=Module["_crypto_onetimeauth_verify"]=asm["_crypto_onetimeauth_verify"];var _crypto_box_open_easy=Module["_crypto_box_open_easy"]=asm["_crypto_box_open_easy"];var _crypto_pwhash_scryptsalsa208sha256_opslimit_sensitive=Module["_crypto_pwhash_scryptsalsa208sha256_opslimit_sensitive"]=asm["_crypto_pwhash_scryptsalsa208sha256_opslimit_sensitive"];var _crypto_generichash_init=Module["_crypto_generichash_init"]=asm["_crypto_generichash_init"];var _i64Add=Module["_i64Add"]=asm["_i64Add"];var _crypto_sign_bytes=Module["_crypto_sign_bytes"]=asm["_crypto_sign_bytes"];var _crypto_generichash_update=Module["_crypto_generichash_update"]=asm["_crypto_generichash_update"];var _crypto_scalarmult=Module["_crypto_scalarmult"]=asm["_crypto_scalarmult"];var _crypto_box_seal_open=Module["_crypto_box_seal_open"]=asm["_crypto_box_seal_open"];var _crypto_box_easy=Module["_crypto_box_easy"]=asm["_crypto_box_easy"];var ___errno_location=Module["___errno_location"]=asm["___errno_location"];var _crypto_onetimeauth_final=Module["_crypto_onetimeauth_final"]=asm["_crypto_onetimeauth_final"];var _memmove=Module["_memmove"]=asm["_memmove"];var _crypto_generichash_final=Module["_crypto_generichash_final"]=asm["_crypto_generichash_final"];var _randombytes_uniform=Module["_randombytes_uniform"]=asm["_randombytes_uniform"];var _crypto_sign_seed_keypair=Module["_crypto_sign_seed_keypair"]=asm["_crypto_sign_seed_keypair"];var _crypto_pwhash_scryptsalsa208sha256_opslimit_interactive=Module["_crypto_pwhash_scryptsalsa208sha256_opslimit_interactive"]=asm["_crypto_pwhash_scryptsalsa208sha256_opslimit_interactive"];var _crypto_onetimeauth_init=Module["_crypto_onetimeauth_init"]=asm["_crypto_onetimeauth_init"];var dynCall_i=Module["dynCall_i"]=asm["dynCall_i"];var dynCall_ii=Module["dynCall_ii"]=asm["dynCall_ii"];var dynCall_iiii=Module["dynCall_iiii"]=asm["dynCall_iiii"];var dynCall_vi=Module["dynCall_vi"]=asm["dynCall_vi"];Runtime.stackAlloc=asm["stackAlloc"];Runtime.stackSave=asm["stackSave"];Runtime.stackRestore=asm["stackRestore"];Runtime.establishStackSpace=asm["establishStackSpace"];Runtime.setTempRet0=asm["setTempRet0"];Runtime.getTempRet0=asm["getTempRet0"];function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}ExitStatus.prototype=new Error;ExitStatus.prototype.constructor=ExitStatus;var initialStackTop;var preloadStartTime=null;var calledMain=false;dependenciesFulfilled=function runCaller(){if(!Module["calledRun"])run();if(!Module["calledRun"])dependenciesFulfilled=runCaller};Module["callMain"]=Module.callMain=function callMain(args){assert(runDependencies==0,"cannot call main when async dependencies remain! (listen on __ATMAIN__)");assert(__ATPRERUN__.length==0,"cannot call main when preRun functions remain to be called");args=args||[];ensureInitRuntime();var argc=args.length+1;function pad(){for(var i=0;i<4-1;i++){argv.push(0)}}var argv="[allocate(intArrayFromString(Module["thisProgram"]),"i8",ALLOC_NORMAL)];pad();for(var" i="0;i<argc-1;i=i+1){argv.push(allocate(intArrayFromString(args[i]),"i8",ALLOC_NORMAL));pad()}argv.push(0);argv=allocate(argv,"i32",ALLOC_NORMAL);try{var" ret="Module["_main"](argc,argv,0);exit(ret,true)}catch(e){if(e" instanceof="" exitstatus){return}else="" if(e="="SimulateInfiniteLoop"){Module["noExitRuntime"]=true;return}else{if(e&&typeof" e="=="object"&&e.stack)Module.printErr("exception" thrown:="" "+[e,e.stack]);throw="" e}}finally{calledmain="true}};function" run(args){args="args||Module["arguments"];if(preloadStartTime===null)preloadStartTime=Date.now();if(runDependencies">0){return}preRun();if(runDependencies>0)return;if(Module["calledRun"])return;function doRun(){if(Module["calledRun"])return;Module["calledRun"]=true;if(ABORT)return;ensureInitRuntime();preMain();if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();if(Module["_main"]&&shouldRunNow)Module["callMain"](args);postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout((function(){setTimeout((function(){Module["setStatus"]("")}),1);doRun()}),1)}else{doRun()}}Module["run"]=Module.run=run;function exit(status,implicit){if(implicit&&Module["noExitRuntime"]){return}if(Module["noExitRuntime"]){}else{ABORT=true;EXITSTATUS=status;STACKTOP=initialStackTop;exitRuntime();if(Module["onExit"])Module["onExit"](status)}if(ENVIRONMENT_IS_NODE){process["stdout"]["once"]("drain",(function(){process["exit"](status)}));console.log(" ");setTimeout((function(){process["exit"](status)}),500)}else if(ENVIRONMENT_IS_SHELL&&typeof quit==="function"){quit(status)}throw new ExitStatus(status)}Module["exit"]=Module.exit=exit;var abortDecorators=[];function abort(what){if(what!==undefined){Module.print(what);Module.printErr(what);what=JSON.stringify(what)}else{what=""}ABORT=true;EXITSTATUS=1;var extra="\nIf this abort() is unexpected, build with -s ASSERTIONS=1 which can give more information.";var output="abort("+what+") at "+stackTrace()+extra;if(abortDecorators){abortDecorators.forEach((function(decorator){output=decorator(output,what)}))}throw output}Module["abort"]=Module.abort=abort;if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}var shouldRunNow=true;if(Module["noInitialRun"]){shouldRunNow=false}run() return Module; }); }).call(this,require('_process'),require("buffer").Buffer,"/node_modules/libsodium/dist/modules") },{"_process":104,"buffer":45,"crypto":54,"fs":1,"path":101}],233:[function(require,module,exports){ var raf = require("raf") var TypedError = require("error/typed") var InvalidUpdateInRender = TypedError({ type: "main-loop.invalid.update.in-render", message: "main-loop: Unexpected update occurred in loop.\n" + "We are currently rendering a view, " + "you can't change state right now.\n" + "The diff is: {stringDiff}.\n" + "SUGGESTED FIX: find the state mutation in your view " + "or rendering function and remove it.\n" + "The view should not have any side effects.\n", diff: null, stringDiff: null }) module.exports = main function main(initialState, view, opts) { opts = opts || {} var currentState = initialState var create = opts.create var diff = opts.diff var patch = opts.patch var redrawScheduled = false var tree = opts.initialTree || view(currentState) var target = opts.target || create(tree, opts) var inRenderingTransaction = false currentState = null var loop = { state: initialState, target: target, update: update } return loop function update(state) { if (inRenderingTransaction) { throw InvalidUpdateInRender({ diff: state._diff, stringDiff: JSON.stringify(state._diff) }) } if (currentState === null && !redrawScheduled) { redrawScheduled = true raf(redraw) } currentState = state loop.state = state } function redraw() { redrawScheduled = false if (currentState === null) { return } inRenderingTransaction = true var newTree = view(currentState) if (opts.createOnly) { inRenderingTransaction = false create(newTree, opts) } else { var patches = diff(tree, newTree, opts) inRenderingTransaction = false target = patch(target, patches, opts) } tree = newTree currentState = null } } },{"error/typed":169,"raf":253}],234:[function(require,module,exports){ var levelup = require('levelup'); var memdown = require('memdown'); module.exports = MemDB; function MemDB (opts, fn) { if (typeof opts == 'function') { fn = opts; opts = {}; } if (typeof opts == 'string') opts = {}; opts = opts || {}; opts.db = function (l) { return new memdown(l) }; return levelup('', opts, fn); } },{"levelup":227,"memdown":235}],235:[function(require,module,exports){ (function (process,global,Buffer){ var inherits = require('inherits') , AbstractLevelDOWN = require('abstract-leveldown').AbstractLevelDOWN , AbstractIterator = require('abstract-leveldown').AbstractIterator , ltgt = require('ltgt') , setImmediate = global.setImmediate || process.nextTick , createRBT = require('functional-red-black-tree') , globalStore = {} function toKey (key) { return typeof key == 'string' ? '$' + key : JSON.stringify(key) } function gt(value) { return ltgt.compare(value, this._end) > 0 } function gte(value) { return ltgt.compare(value, this._end) >= 0 } function lt(value) { return ltgt.compare(value, this._end) < 0 } function lte(value) { return ltgt.compare(value, this._end) <= 0="" }="" function="" memiterator="" (db,="" options)="" {="" abstractiterator.call(this,="" db)="" this._limit="options.limit" if="" (this._limit="==" -1)="" var="" tree="db._store[db._location];" this.keyasbuffer="options.keyAsBuffer" !="=" false="" this.valueasbuffer="options.valueAsBuffer" this._reverse="options.reverse" this._options="options" this._done="0" (!this._reverse)="" this._incr="next" ;="" this._start="ltgt.lowerBound(options);" this._end="ltgt.upperBound(options)" (typeof="" 'undefined')="" this._tree="tree.begin;" else="" (ltgt.lowerboundinclusive(options))="" (this._end)="" (ltgt.upperboundinclusive(options))="" this._test="lte" inherits(memiterator,="" abstractiterator)="" memiterator.prototype._next="function" (callback)="" key="" ,="" value="" (this._done++="">= this._limit) return setImmediate(callback) if (!this._tree.valid) return setImmediate(callback) key = this._tree.key value = this._tree.value if (!this._test(key)) return setImmediate(callback) if (this.keyAsBuffer) key = new Buffer(key) if (this.valueAsBuffer) value = new Buffer(value) this._tree[this._incr]() setImmediate(function callNext() { callback(null, key, value) }) } MemIterator.prototype._test = function () {return true} function MemDOWN (location) { if (!(this instanceof MemDOWN)) return new MemDOWN(location) AbstractLevelDOWN.call(this, typeof location == 'string' ? location : '') this._location = this.location ? toKey(this.location) : '_tree' this._store = this.location ? globalStore: this this._store[this._location] = this._store[this._location] || createRBT(ltgt.compare) } MemDOWN.clearGlobalStore = function (strict) { if (strict) { Object.keys(globalStore).forEach(function (key) { delete globalStore[key]; }) } else { globalStore = {} } } inherits(MemDOWN, AbstractLevelDOWN) MemDOWN.prototype._open = function (options, callback) { var self = this setImmediate(function callNext() { callback(null, self) }) } MemDOWN.prototype._put = function (key, value, options, callback) { if (typeof value === 'undefined' || value === null) value = '' var iter = this._store[this._location].find(key) if (iter.valid) { this._store[this._location] = iter.update(value) } else { this._store[this._location] = this._store[this._location].insert(key, value) } setImmediate(callback) } MemDOWN.prototype._get = function (key, options, callback) { var value = this._store[this._location].get(key) if (value === undefined) { // 'NotFound' error, consistent with LevelDOWN API var err = new Error('NotFound') return setImmediate(function callNext() { callback(err) }) } if (options.asBuffer !== false && !this._isBuffer(value)) value = new Buffer(String(value)) setImmediate(function callNext () { callback(null, value) }) } MemDOWN.prototype._del = function (key, options, callback) { this._store[this._location] = this._store[this._location].remove(key) setImmediate(callback) } MemDOWN.prototype._batch = function (array, options, callback) { var err , i = -1 , key , value , iter , len = array.length , tree = this._store[this._location] while (++i < len) { if (!array[i]) continue; key = this._isBuffer(array[i].key) ? array[i].key : String(array[i].key) err = this._checkKey(key, 'key') if (err) return setImmediate(function errorCall() { callback(err) }) iter = tree.find(key) if (array[i].type === 'put') { value = this._isBuffer(array[i].value) ? array[i].value : String(array[i].value) err = this._checkKey(value, 'value') if (err) return setImmediate(function errorCall() { callback(err) }) tree = iter.valid ? iter.update(value) : tree.insert(key, value) } else { tree = iter.remove() } } this._store[this._location] = tree; setImmediate(callback) } MemDOWN.prototype._iterator = function (options) { return new MemIterator(this, options) } MemDOWN.prototype._isBuffer = function (obj) { return Buffer.isBuffer(obj) } MemDOWN.destroy = function (name, callback) { var key = toKey(name) if (key in globalStore) delete globalStore[key] setImmediate(callback) } module.exports = MemDOWN }).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {},require("buffer").Buffer) },{"_process":104,"abstract-leveldown":142,"buffer":45,"functional-red-black-tree":181,"inherits":204,"ltgt":236}],236:[function(require,module,exports){ (function (Buffer){ exports.compare = function (a, b) { if(Buffer.isBuffer(a)) { var l = Math.min(a.length, b.length) for(var i = 0; i < l; i++) { var cmp = a[i] - b[i] if(cmp) return cmp } return a.length - b.length } return a < b ? -1 : a > b ? 1 : 0 } function has(obj, key) { return Object.hasOwnProperty.call(obj, key) } // to be compatible with the current abstract-leveldown tests // nullish or empty strings. // I could use !!val but I want to permit numbers and booleans, // if possible. function isDef (val) { return val != null && val !== '' } var lowerBound = exports.lowerBound = function (range) { return ( isDef(range.gt) ? range.gt : isDef(range.gte) ? range.gte : isDef(range.min) ? range.min : isDef(range.start) && !range.reverse ? range.start : isDef(range.end) && range.reverse ? range.end : undefined ) } exports.lowerBoundInclusive = function (range) { return isDef(range.gt) ? false : true } exports.upperBoundInclusive = function (range) { return isDef(range.lt) ? false : true } var lowerBoundExclusive = exports.lowerBoundExclusive = function (range) { return isDef(range.gt) ? true : false } var upperBoundExclusive = exports.upperBoundExclusive = function (range) { return isDef(range.lt) ? true : false } var upperBound = exports.upperBound = function (range) { return ( isDef(range.lt) ? range.lt : isDef(range.lte) ? range.lte : isDef(range.max) ? range.max : isDef(range.start) && range.reverse ? range.start : isDef(range.end) && !range.reverse ? range.end : undefined ) } exports.contains = function (range, key, compare) { compare = compare || exports.compare var lb = lowerBound(range) if(isDef(lb)) { var cmp = compare(key, lb) if(cmp < 0 || (cmp === 0 && lowerBoundExclusive(range))) return false } var ub = upperBound(range) if(isDef(ub)) { var cmp = compare(key, ub) if(cmp > 0 || (cmp === 0) && upperBoundExclusive(range)) return false } return true } exports.filter = function (range, compare) { return function (key) { return exports.contains(range, key, compare) } } }).call(this,{"isBuffer":require("../../../../../../../../.nvm-fish/v5.4.1/lib/node_modules/browserify/node_modules/is-buffer/index.js")}) },{"../../../../../../../../.nvm-fish/v5.4.1/lib/node_modules/browserify/node_modules/is-buffer/index.js":93}],237:[function(require,module,exports){ /** * Helpers. */ var s = 1000; var m = s * 60; var h = m * 60; var d = h * 24; var y = d * 365.25; /** * Parse or format the given `val`. * * Options: * * - `long` verbose formatting [false] * * @param {String|Number} val * @param {Object} options * @return {String|Number} * @api public */ module.exports = function(val, options){ options = options || {}; if ('string' == typeof val) return parse(val); return options.long ? long(val) : short(val); }; /** * Parse the given `str` and return milliseconds. * * @param {String} str * @return {Number} * @api private */ function parse(str) { str = '' + str; if (str.length > 10000) return; var match = /^((?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec(str); if (!match) return; var n = parseFloat(match[1]); var type = (match[2] || 'ms').toLowerCase(); switch (type) { case 'years': case 'year': case 'yrs': case 'yr': case 'y': return n * y; case 'days': case 'day': case 'd': return n * d; case 'hours': case 'hour': case 'hrs': case 'hr': case 'h': return n * h; case 'minutes': case 'minute': case 'mins': case 'min': case 'm': return n * m; case 'seconds': case 'second': case 'secs': case 'sec': case 's': return n * s; case 'milliseconds': case 'millisecond': case 'msecs': case 'msec': case 'ms': return n; } } /** * Short format for `ms`. * * @param {Number} ms * @return {String} * @api private */ function short(ms) { if (ms >= d) return Math.round(ms / d) + 'd'; if (ms >= h) return Math.round(ms / h) + 'h'; if (ms >= m) return Math.round(ms / m) + 'm'; if (ms >= s) return Math.round(ms / s) + 's'; return ms + 'ms'; } /** * Long format for `ms`. * * @param {Number} ms * @return {String} * @api private */ function long(ms) { return plural(ms, d, 'day') || plural(ms, h, 'hour') || plural(ms, m, 'minute') || plural(ms, s, 'second') || ms + ' ms'; } /** * Pluralization helper. */ function plural(ms, n, name) { if (ms < n) return; if (ms < n * 1.5) return Math.floor(ms / n) + ' ' + name; return Math.ceil(ms / n) + ' ' + name + 's'; } },{}],238:[function(require,module,exports){ (function (process){ var mutexify = function() { var queue = [] var used = null var call = function () { used(release) } var acquire = function (fn) { if (used) return queue.push(fn) used = fn process.nextTick(call) return 0 } var release = function (fn, err, value) { used = null if (queue.length) acquire(queue.shift()) if (fn) fn(err, value) } return acquire } module.exports = mutexify }).call(this,require('_process')) },{"_process":104}],239:[function(require,module,exports){ (function (process,Buffer){ var req = require('request') module.exports = Nets function Nets (opts, cb) { if (typeof opts === 'string') opts = { uri: opts } // in node, if encoding === null then response will be a Buffer. we want this to be the default if (!opts.hasOwnProperty('encoding')) opts.encoding = null // in browser, we should by default convert the arraybuffer into a Buffer if (process.browser && !opts.hasOwnProperty('json') && opts.encoding === null) { opts.responseType = 'arraybuffer' var originalCb = cb cb = bufferify } function bufferify (err, resp, body) { if (body) body = new Buffer(new Uint8Array(body)) originalCb(err, resp, body) } return req(opts, cb) } }).call(this,require('_process'),require("buffer").Buffer) },{"_process":104,"buffer":45,"request":328}],240:[function(require,module,exports){ var wrappy = require('wrappy') module.exports = wrappy(once) once.proto = once(function () { Object.defineProperty(Function.prototype, 'once', { value: function () { return once(this) }, configurable: true }) }) function once (fn) { var f = function () { if (f.called) return f.value f.called = true return f.value = fn.apply(this, arguments) } f.called = false return f } },{"wrappy":326}],241:[function(require,module,exports){ var trim = require('trim') , forEach = require('for-each') , isArray = function(arg) { return Object.prototype.toString.call(arg) === '[object Array]'; } module.exports = function (headers) { if (!headers) return {} var result = {} forEach( trim(headers).split('\n') , function (row) { var index = row.indexOf(':') , key = trim(row.slice(0, index)).toLowerCase() , value = trim(row.slice(index + 1)) if (typeof(result[key]) === 'undefined') { result[key] = value } else if (isArray(result[key])) { result[key].push(value) } else { result[key] = [ result[key], value ] } } ) return result } },{"for-each":172,"trim":286}],242:[function(require,module,exports){ (function (process){ // Generated by CoffeeScript 1.6.3 (function() { var getNanoSeconds, hrtime, loadTime; if ((typeof performance !== "undefined" && performance !== null) && performance.now) { module.exports = function() { return performance.now(); }; } else if ((typeof process !== "undefined" && process !== null) && process.hrtime) { module.exports = function() { return (getNanoSeconds() - loadTime) / 1e6; }; hrtime = process.hrtime; getNanoSeconds = function() { var hr; hr = hrtime(); return hr[0] * 1e9 + hr[1]; }; loadTime = getNanoSeconds(); } else if (Date.now) { module.exports = function() { return Date.now() - loadTime; }; loadTime = Date.now(); } else { module.exports = function() { return new Date().getTime() - loadTime; }; loadTime = new Date().getTime(); } }).call(this); /* */ }).call(this,require('_process')) },{"_process":104}],243:[function(require,module,exports){ (function (process){ 'use strict'; if (!process.version || process.version.indexOf('v0.') === 0 || process.version.indexOf('v1.') === 0 && process.version.indexOf('v1.8.') !== 0) { module.exports = nextTick; } else { module.exports = process.nextTick; } function nextTick(fn) { var args = new Array(arguments.length - 1); var i = 0; while (i < args.length) { args[i++] = arguments[i]; } process.nextTick(function afterTick() { fn.apply(null, args); }); } }).call(this,require('_process')) },{"_process":104}],244:[function(require,module,exports){ var parse = require('./parse') var stringify = require('./stringify') module.exports = parse module.exports.parse = parse module.exports.stringify = stringify },{"./parse":245,"./stringify":246}],245:[function(require,module,exports){ var tokenize = require('./tokenize') var MAX_RANGE = 0x1FFFFFFF var onfieldoptions = function (tokens) { var opts = {} while (tokens.length) { switch (tokens[0]) { case '[': case ',': tokens.shift() var name = tokens.shift() if (name === '(') { // handling [(A) = B] name = tokens.shift() tokens.shift() // remove the end of bracket } if (tokens[0] !== '=') throw new Error('Unexpected token in field options: ' + tokens[0]) tokens.shift() if (tokens[0] === ']') throw new Error('Unexpected ] in field option') opts[name] = tokens.shift() break case ']': tokens.shift() return opts default: throw new Error('Unexpected token in field options: ' + tokens[0]) } } throw new Error('No closing tag for field options') } var onfield = function (tokens) { var field = { name: null, type: null, tag: 0, map: null, oneof: null, required: false, repeated: false, options: {} } while (tokens.length) { switch (tokens[0]) { case '=': tokens.shift() field.tag = Number(tokens.shift()) break case 'map': field.type = 'map' field.map = {from: null, to: null} tokens.shift() if (tokens[0] !== '<') throw="" new="" error('unexpected="" token="" in="" map="" type:="" '="" +="" tokens[0])="" tokens.shift()="" field.map.from="tokens.shift()" if="" (tokens[0]="" !="=" ',')="" field.map.to="tokens.shift()">') throw new Error('Unexpected token in map type: ' + tokens[0]) tokens.shift() field.name = tokens.shift() break case 'repeated': case 'required': case 'optional': var t = tokens.shift() field.required = t === 'required' field.repeated = t === 'repeated' field.type = tokens.shift() field.name = tokens.shift() break case '[': field.options = onfieldoptions(tokens) break case ';': tokens.shift() return field default: throw new Error('Unexpected token in message field: ' + tokens[0]) } } throw new Error('No ; found for message field') } var onmessagebody = function (tokens) { var body = { enums: [], messages: [], fields: [], extensions: null } while (tokens.length) { switch (tokens[0]) { case 'map': case 'repeated': case 'optional': case 'required': body.fields.push(onfield(tokens)) break case 'enum': body.enums.push(onenum(tokens)) break case 'message': body.messages.push(onmessage(tokens)) break case 'extensions': body.extensions = onextensions(tokens) break case 'oneof': tokens.shift() var name = tokens.shift() if (tokens[0] !== '{') throw new Error('Unexpected token in oneof: ' + tokens[0]) tokens.shift() while (tokens[0] !== '}') { tokens.unshift('optional') var field = onfield(tokens) field.oneof = name body.fields.push(field) } tokens.shift() break case ';': tokens.shift() break default: // proto3 does not require the use of optional/required, assumed as optional // "singular: a well-formed message can have zero or one of this field (but not more than one)." // https://developers.google.com/protocol-buffers/docs/proto3#specifying-field-rules tokens.unshift('optional') body.fields.push(onfield(tokens)) } } return body } var onextend = function (tokens) { var out = { name: tokens[1], message: onmessage(tokens) } return out } var onextensions = function (tokens) { tokens.shift() var from = Number(tokens.shift()) if (isNaN(from)) throw new Error('Invalid from in extensions definition') if (tokens.shift() !== 'to') throw new Error("Expected keyword 'to' in extensions definition") var to = tokens.shift() if (to === 'max') to = MAX_RANGE to = Number(to) if (isNaN(to)) throw new Error('Invalid to in extensions definition') if (tokens.shift() !== ';') throw new Error('Missing ; in extensions definition') return {from: from, to: to} } var onmessage = function (tokens) { tokens.shift() var lvl = 1 var body = [] var msg = { name: tokens.shift(), enums: [], messages: [], fields: [] } if (tokens[0] !== '{') throw new Error('Expected { but found ' + tokens[0]) tokens.shift() while (tokens.length) { if (tokens[0] === '{') lvl++ else if (tokens[0] === '}') lvl-- if (!lvl) { tokens.shift() body = onmessagebody(body) msg.enums = body.enums msg.messages = body.messages msg.fields = body.fields msg.extensions = body.extensions return msg } body.push(tokens.shift()) } if (lvl) throw new Error('No closing tag for message') } var onpackagename = function (tokens) { tokens.shift() var name = tokens.shift() if (tokens[0] !== ';') throw new Error('Expected ; but found ' + tokens[0]) tokens.shift() return name } var onsyntaxversion = function (tokens) { tokens.shift() if (tokens[0] !== '=') throw new Error('Expected = but found ' + tokens[0]) tokens.shift() var version = tokens.shift() switch (version) { case '"proto2"': version = 2 break case '"proto3"': version = 3 break default: throw new Error('Expected protobuf syntax version but found ' + version) } if (tokens[0] !== ';') throw new Error('Expected ; but found ' + tokens[0]) tokens.shift() return version } var onenumvalue = function (tokens) { if (tokens.length < 4) throw new Error('Invalid enum value: ' + tokens.slice(0, 3).join(' ')) if (tokens[1] !== '=') throw new Error('Expected = but found ' + tokens[1]) if (tokens[3] !== ';') throw new Error('Expected ; but found ' + tokens[1]) var name = tokens.shift() tokens.shift() var value = Number(tokens.shift()) tokens.shift() return { name: name, value: value } } var onenum = function (tokens) { tokens.shift() var e = { name: tokens.shift(), values: {} } if (tokens[0] !== '{') throw new Error('Expected { but found ' + tokens[0]) tokens.shift() while (tokens.length) { if (tokens[0] === '}') { tokens.shift() // there goes optional semicolon after the enclosing "}" if (tokens[0] === ';') tokens.shift() return e } if (tokens[0] === 'option') { // just skip "option allow_alias = true;" while (tokens.shift() !== ';') { // do nothing } } var val = onenumvalue(tokens) e.values[val.name] = val.value } throw new Error('No closing tag for enum') } var onoption = function (tokens) { var name = null var value = null var parse = function (value) { if (value === 'true') return true if (value === 'false') return false return value.replace(/^"+|"+$/gm, '') } while (tokens.length) { if (tokens[0] === ';') { tokens.shift() return {name: name, value: value} } switch (tokens[0]) { case 'option': tokens.shift() var hasBracket = tokens[0] === '(' if (hasBracket) tokens.shift() name = tokens.shift() if (hasBracket) { if (tokens[0] !== ')') throw new Error('Expected ) but found ' + tokens[0]) tokens.shift() } break case '=': tokens.shift() if (name === null) throw new Error('Expected key for option with value: ' + tokens[0]) value = parse(tokens.shift()) if (name === 'optimize_for' && !/^(SPEED|CODE_SIZE|LITE_RUNTIME)$/.test(value)) { throw new Error('Unexpected value for option optimize_for: ' + value) } else if (value === '{') { // option foo = {bar: baz} value = onoptionMap(tokens) } break default: throw new Error('Unexpected token in option: ' + tokens[0]) } } } var onoptionMap = function (tokens) { var parse = function (value) { if (value === 'true') return true if (value === 'false') return false return value.replace(/^"+|"+$/gm, '') } var map = {} while (tokens.length) { if (tokens[0] === '}') { tokens.shift() return map } var hasBracket = tokens[0] === '(' if (hasBracket) tokens.shift() var key = tokens.shift() if (hasBracket) { if (tokens[0] !== ')') throw new Error('Expected ) but found ' + tokens[0]) tokens.shift() } var value = null switch (tokens[0]) { case ':': if (map[key] !== undefined) throw new Error('Duplicate option map key ' + key) tokens.shift() value = parse(tokens.shift()) if (value === '{') { // option foo = {bar: baz} value = onoptionMap(tokens) } map[key] = value break case '{': tokens.shift() value = onoptionMap(tokens) if (map[key] === undefined) map[key] = [] if (!Array.isArray(map[key])) throw new Error('Duplicate option map key ' + key) map[key].push(value) break default: throw new Error('Unexpected token in option map: ' + tokens[0]) } } throw new Error('No closing tag for option map') } var onimport = function (tokens) { tokens.shift() var file = tokens.shift().replace(/^"+|"+$/gm, '') if (tokens[0] !== ';') throw new Error('Unexpected token: ' + tokens[0] + '. Expected ";"') tokens.shift() return file } var onservice = function (tokens) { tokens.shift() var service = { name: tokens.shift(), methods: [], options: {} } if (tokens[0] !== '{') throw new Error('Expected { but found ' + tokens[0]) tokens.shift() while (tokens.length) { if (tokens[0] === '}') { tokens.shift() // there goes optional semicolon after the enclosing "}" if (tokens[0] === ';') tokens.shift() return service } switch (tokens[0]) { case 'option': var opt = onoption(tokens) if (service.options[opt.name] !== undefined) throw new Error('Duplicate option ' + opt.name) service.options[opt.name] = opt.value break case 'rpc': service.methods.push(onrpc(tokens)) break default: throw new Error('Unexpected token in service: ' + tokens[0]) } } throw new Error('No closing tag for service') } var onrpc = function (tokens) { tokens.shift() var rpc = { name: tokens.shift(), input_type: null, output_type: null, client_streaming: false, server_streaming: false, options: {} } if (tokens[0] !== '(') throw new Error('Expected ( but found ' + tokens[0]) tokens.shift() if (tokens[0] === 'stream') { tokens.shift() rpc.client_streaming = true } rpc.input_type = tokens.shift() if (tokens[0] !== ')') throw new Error('Expected ) but found ' + tokens[0]) tokens.shift() if (tokens[0] !== 'returns') throw new Error('Expected returns but found ' + tokens[0]) tokens.shift() if (tokens[0] !== '(') throw new Error('Expected ( but found ' + tokens[0]) tokens.shift() if (tokens[0] === 'stream') { tokens.shift() rpc.server_streaming = true } rpc.output_type = tokens.shift() if (tokens[0] !== ')') throw new Error('Expected ) but found ' + tokens[0]) tokens.shift() if (tokens[0] === ';') { tokens.shift() return rpc } if (tokens[0] !== '{') throw new Error('Expected { but found ' + tokens[0]) tokens.shift() while (tokens.length) { if (tokens[0] === '}') { tokens.shift() // there goes optional semicolon after the enclosing "}" if (tokens[0] === ';') tokens.shift() return rpc } if (tokens[0] === 'option') { var opt = onoption(tokens) if (rpc.options[opt.name] !== undefined) throw new Error('Duplicate option ' + opt.name) rpc.options[opt.name] = opt.value } else { throw new Error('Unexpected token in rpc options: ' + tokens[0]) } } throw new Error('No closing tag for rpc') } var parse = function (buf) { var tokens = tokenize(buf.toString()) // check for isolated strings in tokens by looking for opening quote for (var i = 0; i < tokens.length; i++) { if (/^(\"|\')([^\'\"]*)$/.test(tokens[i])) { var j if (tokens[i].length === 1) { j = i + 1 } else { j = i } // look ahead for the closing quote and collapse all // in-between tokens into a single token for (j; j < tokens.length; j++) { if (/^([^\'\"]*)(\"|\')$/.test(tokens[j])) { tokens = tokens.slice(0, i).concat(tokens.slice(i, j + 1).join('')).concat(tokens.slice(j + 1)) break } } } } var schema = { syntax: 3, package: null, imports: [], enums: [], messages: [], options: {}, extends: [] } var firstline = true while (tokens.length) { switch (tokens[0]) { case 'package': schema.package = onpackagename(tokens) break case 'syntax': if (!firstline) throw new Error('Protobuf syntax version should be first thing in file') schema.syntax = onsyntaxversion(tokens) break case 'message': schema.messages.push(onmessage(tokens)) break case 'enum': schema.enums.push(onenum(tokens)) break case 'option': var opt = onoption(tokens) if (schema.options[opt.name]) throw new Error('Duplicate option ' + opt.name) schema.options[opt.name] = opt.value break case 'import': schema.imports.push(onimport(tokens)) break case 'extend': schema.extends.push(onextend(tokens)) break case 'service': if (!schema.services) schema.services = [] schema.services.push(onservice(tokens)) break default: throw new Error('Unexpected token: ' + tokens[0]) } firstline = false } // now iterate over messages and propagate extends schema.extends.forEach(function (ext) { schema.messages.forEach(function (msg) { if (msg.name === ext.name) { ext.message.fields.forEach(function (field) { if (!msg.extensions || field.tag < msg.extensions.from || field.tag > msg.extensions.to) { throw new Error(msg.name + ' does not declare ' + field.tag + ' as an extension number') } msg.fields.push(field) }) } }) }) return schema } module.exports = parse },{"./tokenize":247}],246:[function(require,module,exports){ var onfield = function (f, result) { var prefix = f.repeated ? 'repeated' : f.required ? 'required' : 'optional' if (f.type === 'map') prefix = 'map<' +="" f.map.from="" ','="" f.map.to="" '="">' if (f.oneof) prefix = '' var opts = Object.keys(f.options || {}).map(function (key) { return key + ' = ' + f.options[key] }).join(',') if (opts) opts = ' [' + opts + ']' result.push((prefix ? prefix + ' ' : '') + (f.map === 'map' ? '' : f.type + ' ') + f.name + ' = ' + f.tag + opts + ';') return result } var onmessage = function (m, result) { result.push('message ' + m.name + ' {') if (!m.enums) m.enums = [] m.enums.forEach(function (e) { result.push(onenum(e, [])) }) if (!m.messages) m.messages = [] m.messages.forEach(function (m) { result.push(onmessage(m, [])) }) var oneofs = {} if (!m.fields) m.fields = [] m.fields.forEach(function (f) { if (f.oneof) { if (!oneofs[f.oneof]) oneofs[f.oneof] = [] oneofs[f.oneof].push(onfield(f, [])) } else { result.push(onfield(f, [])) } }) Object.keys(oneofs).forEach(function (n) { oneofs[n].unshift('oneof ' + n + ' {') oneofs[n].push('}') result.push(oneofs[n]) }) result.push('}', '') return result } var onenum = function (e, result) { result.push('enum ' + e.name + ' {') var vals = Object.keys(e.values).map(function (key) { return key + ' = ' + e.values[key] + ';' }) result.push(vals) result.push('}', '') return result } var onoption = function (o, result) { var keys = Object.keys(o) keys.forEach(function (option) { var v = o[option] if (~option.indexOf('.')) option = '(' + option + ')' var type = typeof v if (type === 'object') { v = onoptionMap(v, []) if (v.length) result.push('option ' + option + ' = {', v, '};') } else { if (type === 'string' && option !== 'optimize_for') v = '"' + v + '"' result.push('option ' + option + ' = ' + v + ';') } }) if (keys.length > 0) { result.push('') } return result } var onoptionMap = function (o, result) { var keys = Object.keys(o) keys.forEach(function (k) { var v = o[k] var type = typeof v if (type === 'object') { if (Array.isArray(v)) { v.forEach(function (v) { v = onoptionMap(v, []) if (v.length) result.push(k + ' {', v, '}') }) } else { v = onoptionMap(v, []) if (v.length) result.push(k + ' {', v, '}') } } else { if (type === 'string') v = '"' + v + '"' result.push(k + ': ' + v) } }) return result } var onservices = function (s, result) { result.push('service ' + s.name + ' {') if (!s.options) s.options = {} onoption(s.options, result) if (!s.methods) s.methods = [] s.methods.forEach(function (m) { result.push(onrpc(m, [])) }) result.push('}', '') return result } var onrpc = function (rpc, result) { var def = 'rpc ' + rpc.name + '(' if (rpc.client_streaming) def += 'stream ' def += rpc.input_type + ') returns (' if (rpc.server_streaming) def += 'stream ' def += rpc.output_type + ')' if (!rpc.options) rpc.options = {} var options = onoption(rpc.options, []) if (options.length > 1) { result.push(def + ' {', options.slice(0, -1), '}') } else { result.push(def + ';') } return result } var indent = function (lvl) { return function (line) { if (Array.isArray(line)) return line.map(indent(lvl + ' ')).join('\n') return lvl + line } } module.exports = function (schema) { var result = [] result.push('syntax = "proto' + schema.syntax + '";', '') if (schema.package) result.push('package ' + schema.package + ';', '') if (!schema.options) schema.options = {} onoption(schema.options, result) if (!schema.enums) schema.enums = [] schema.enums.forEach(function (e) { onenum(e, result) }) if (!schema.messages) schema.messages = [] schema.messages.forEach(function (m) { onmessage(m, result) }) if (schema.services) { schema.services.forEach(function (s) { onservices(s, result) }) } return result.map(indent('')).join('\n') } },{}],247:[function(require,module,exports){ module.exports = function (sch) { var noComments = function (line) { var i = line.indexOf('//') return i > -1 ? line.slice(0, i) : line } var noMultilineComments = function () { var inside = false return function (token) { if (token === '/*') { inside = true return false } if (token === '*/') { inside = false return false } return !inside } } var trim = function (line) { return line.trim() } return sch .replace(/([;,{}\(\)=\:\[\]<>]|\/\*|\*\/)/g, ' $1 ') .split(/\n/) .map(trim) .filter(Boolean) .map(noComments) .map(trim) .filter(Boolean) .join('\n') .split(/\s+|\n+/gm) .filter(noMultilineComments()) } },{}],248:[function(require,module,exports){ (function (Buffer){ /* eslint-disable no-spaced-func */ /* eslint-disable no-unexpected-multiline */ var encodings = require('./encodings') var varint = require('varint') var genobj = require('generate-object-property') var genfun = require('generate-function') var skip = function (type, buffer, offset) { switch (type) { case 0: varint.decode(buffer, offset) return offset + varint.decode.bytes case 1: return offset + 8 case 2: var len = varint.decode(buffer, offset) return offset + varint.decode.bytes + len case 3: case 4: throw new Error('Groups are not supported') case 5: return offset + 4 } throw new Error('Unknown wire type: ' + type) } var defined = function (val) { return val !== null && val !== undefined && (typeof val !== 'number' || !isNaN(val)) } var isString = function (def) { try { return !!def && typeof JSON.parse(def) === 'string' } catch (err) { return false } } var defaultValue = function (f, def) { if (f.map) return '{}' if (f.repeated) return '[]' switch (f.type) { case 'string': return isString(def) ? def : '""' case 'bool': if (def === 'true') return 'true' return 'false' case 'float': case 'double': case 'sfixed32': case 'fixed32': case 'varint': case 'enum': case 'uint64': case 'uint32': case 'int64': case 'int32': case 'sint64': case 'sint32': return '' + Number(def || 0) default: return 'null' } } module.exports = function (schema, extraEncodings) { var messages = {} var enums = {} var cache = {} var visit = function (schema, prefix) { if (schema.enums) { schema.enums.forEach(function (e) { e.id = prefix + (prefix ? '.' : '') + e.name enums[e.id] = e visit(e, e.id) }) } if (schema.messages) { schema.messages.forEach(function (m) { m.id = prefix + (prefix ? '.' : '') + m.name messages[m.id] = m m.fields.forEach(function (f) { if (!f.map) return var name = 'Map_' + f.map.from + '_' + f.map.to var map = { name: name, enums: [], messages: [], fields: [{ name: 'key', type: f.map.from, tag: 1, repeated: false, required: true }, { name: 'value', type: f.map.to, tag: 2, repeated: false, required: false }], extensions: null, id: prefix + (prefix ? '.' : '') + name } if (!messages[map.id]) { messages[map.id] = map schema.messages.push(map) } f.type = name f.repeated = true }) visit(m, m.id) }) } } visit(schema, '') var compileEnum = function (e) { var conditions = Object.keys(e.values) .map(function (k) { return 'val !== ' + parseInt(e.values[k], 10) }) .join(' && ') if (!conditions) conditions = 'true' var encode = genfun() ('function encode (val, buf, offset) {') ('if (%s) throw new Error("Invalid enum value: "+val)', conditions) ('varint.encode(val, buf, offset)') ('encode.bytes = varint.encode.bytes') ('return buf') ('}') .toFunction({ varint: varint }) var decode = genfun() ('function decode (buf, offset) {') ('var val = varint.decode(buf, offset)') ('if (%s) throw new Error("Invalid enum value: "+val)', conditions) ('decode.bytes = varint.decode.bytes') ('return val') ('}') .toFunction({ varint: varint }) return encodings.make(0, encode, decode, varint.encodingLength) } var compileMessage = function (m, exports) { m.messages.forEach(function (nested) { exports[nested.name] = resolve(nested.name, m.id) }) m.enums.forEach(function (val) { exports[val.name] = val.values }) exports.type = 2 exports.message = true exports.name = m.name var oneofs = {} m.fields.forEach(function (f) { if (!f.oneof) return if (!oneofs[f.oneof]) oneofs[f.oneof] = [] oneofs[f.oneof].push(f.name) }) var enc = m.fields.map(function (f) { return resolve(f.type, m.id) }) var forEach = function (fn) { for (var i = 0; i < enc.length; i++) fn(enc[i], m.fields[i], genobj('obj', m.fields[i].name), i) } // compile encodingLength var encodingLength = genfun() ('function encodingLength (obj) {') ('var length = 0') Object.keys(oneofs).forEach(function (name) { var msg = JSON.stringify('only one of the properties defined in oneof ' + name + ' can be set') var cnt = oneofs[name] .map(function (prop) { return '+defined(' + genobj('obj', prop) + ')' }) .join(' + ') encodingLength('if ((%s) > 1) throw new Error(%s)', cnt, msg) }) forEach(function (e, f, val, i) { var packed = f.repeated && f.options && f.options.packed var hl = varint.encodingLength(f.tag << 3 | e.type) if (f.required) encodingLength('if (!defined(%s)) throw new Error(%s)', val, JSON.stringify(f.name + ' is required')) else encodingLength('if (defined(%s)) {', val) if (f.map) { encodingLength() ('var tmp = Object.keys(%s)', val) ('for (var i = 0; i < tmp.length; i++) {') ('tmp[i] = {key: tmp[i], value: %s[tmp[i]]}', val) ('}') val = 'tmp' } if (packed) { encodingLength() ('var packedLen = 0') ('for (var i = 0; i < %s.length; i++) {', val) ('if (!defined(%s)) continue', val + '[i]') ('var len = enc[%d].encodingLength(%s)', i, val + '[i]') ('packedLen += len') if (e.message) encodingLength('packedLen += varint.encodingLength(len)') encodingLength('}') ('if (packedLen) {') ('length += %d + packedLen + varint.encodingLength(packedLen)', hl) ('}') } else { if (f.repeated) { encodingLength('for (var i = 0; i < %s.length; i++) {', val) val += '[i]' encodingLength('if (!defined(%s)) continue', val) } encodingLength('var len = enc[%d].encodingLength(%s)', i, val) if (e.message) encodingLength('length += varint.encodingLength(len)') encodingLength('length += %d + len', hl) if (f.repeated) encodingLength('}') } if (!f.required) encodingLength('}') }) encodingLength() ('return length') ('}') encodingLength = encodingLength.toFunction({ defined: defined, varint: varint, enc: enc }) // compile encode var encode = genfun() ('function encode (obj, buf, offset) {') ('if (!offset) offset = 0') ('if (!buf) buf = new Buffer(encodingLength(obj))') ('var oldOffset = offset') Object.keys(oneofs).forEach(function (name) { var msg = JSON.stringify('only one of the properties defined in oneof ' + name + ' can be set') var cnt = oneofs[name] .map(function (prop) { return '+defined(' + genobj('obj', prop) + ')' }) .join(' + ') encode('if ((%s) > 1) throw new Error(%s)', cnt, msg) }) forEach(function (e, f, val, i) { if (f.required) encode('if (!defined(%s)) throw new Error(%s)', val, JSON.stringify(f.name + ' is required')) else encode('if (defined(%s)) {', val) var packed = f.repeated && f.options && f.options.packed var p = varint.encode(f.tag << 3 | 2) var h = varint.encode(f.tag << 3 | e.type) var j if (f.map) { encode() ('var tmp = Object.keys(%s)', val) ('for (var i = 0; i < tmp.length; i++) {') ('tmp[i] = {key: tmp[i], value: %s[tmp[i]]}', val) ('}') val = 'tmp' } if (packed) { encode() ('var packedLen = 0') ('for (var i = 0; i < %s.length; i++) {', val) ('if (!defined(%s)) continue', val + '[i]') ('packedLen += enc[%d].encodingLength(%s)', i, val + '[i]') ('}') encode('if (packedLen) {') for (j = 0; j < h.length; j++) encode('buf[offset++] = %d', p[j]) encode('varint.encode(packedLen, buf, offset)') encode('offset += varint.encode.bytes') encode('}') } if (f.repeated) { encode('for (var i = 0; i < %s.length; i++) {', val) val += '[i]' encode('if (!defined(%s)) continue', val) } if (!packed) for (j = 0; j < h.length; j++) encode('buf[offset++] = %d', h[j]) if (e.message) { encode('varint.encode(enc[%d].encodingLength(%s), buf, offset)', i, val) encode('offset += varint.encode.bytes') } encode('enc[%d].encode(%s, buf, offset)', i, val) encode('offset += enc[%d].encode.bytes', i) if (f.repeated) encode('}') if (!f.required) encode('}') }) encode() ('encode.bytes = offset - oldOffset') ('return buf') ('}') encode = encode.toFunction({ encodingLength: encodingLength, defined: defined, varint: varint, enc: enc, Buffer: Buffer }) // compile decode var invalid = m.fields .map(function (f, i) { return f.required && '!found' + i }) .filter(function (f) { return f }) .join(' || ') var decode = genfun() var objectKeys = [] forEach(function (e, f) { var def = f.options && f.options.default var resolved = resolve(f.type, m.id, false) var vals = resolved && resolved.values if (vals) { // is enum if (f.repeated) { objectKeys.push(genobj.property(f.name) + ': []') } else { def = (def && def in vals) ? vals[def] : vals[Object.keys(vals)[0]] objectKeys.push(genobj.property(f.name) + ': ' + parseInt(def || 0, 10)) } return } if (!f.oneof) { objectKeys.push(genobj.property(f.name) + ': ' + defaultValue(f, def)) } }) decode() ('function decode (buf, offset, end) {') ('if (!offset) offset = 0') ('if (!end) end = buf.length') ('if (!(end <= 1="" buf.length="" &&="" offset="" <="buf.length))" throw="" new="" error("decoded="" message="" is="" not="" valid")')="" ('var="" oldoffset="offset')" obj="{')" objectkeys.foreach(function="" (prop,="" i)="" {="" decode(prop="" +="" (i="==" objectkeys.length="" -="" ?="" ''="" :="" ','))="" })="" decode('}')="" foreach(function="" (e,="" f,="" val,="" if="" (f.required)="" decode('var="" found%d="false'," decode('while="" (true)="" {')="" ('if="" (end="" (invalid="" 'if="" (%s)="" valid")',="" invalid)="" ('decode.bytes="offset" oldoffset')="" ('return="" obj')="" ('}')="" prefix="varint.decode(buf," offset)')="" ('offset="" tag="prefix">> 3') ('switch (tag) {') forEach(function (e, f, val, i) { var packed = f.repeated && f.options && f.options.packed decode('case %d:', f.tag) if (f.oneof) { m.fields.forEach(function (otherField) { if (otherField.oneof === f.oneof && f.name !== otherField.name) { decode('delete %s', genobj('obj', otherField.name)) } }) } if (packed) { decode() ('var packedEnd = varint.decode(buf, offset)') ('offset += varint.decode.bytes') ('packedEnd += offset') ('while (offset < packedEnd) {') } if (e.message) { decode('var len = varint.decode(buf, offset)') decode('offset += varint.decode.bytes') if (f.map) { decode('var tmp = enc[%d].decode(buf, offset, offset + len)', i) decode('%s[tmp.key] = tmp.value', val) } else if (f.repeated) { decode('%s.push(enc[%d].decode(buf, offset, offset + len))', val, i) } else { decode('%s = enc[%d].decode(buf, offset, offset + len)', val, i) } } else { if (f.repeated) { decode('%s.push(enc[%d].decode(buf, offset))', val, i) } else { decode('%s = enc[%d].decode(buf, offset)', val, i) } } decode('offset += enc[%d].decode.bytes', i) if (packed) decode('}') if (f.required) decode('found%d = true', i) decode('break') }) decode() ('default:') ('offset = skip(prefix & 7, buf, offset)') ('}') ('}') ('}') decode = decode.toFunction({ varint: varint, skip: skip, enc: enc }) // end of compilation - return all the things encode.bytes = decode.bytes = 0 exports.buffer = true exports.encode = encode exports.decode = decode exports.encodingLength = encodingLength return exports } var resolve = function (name, from, compile) { if (extraEncodings && extraEncodings[name]) return extraEncodings[name] if (encodings[name]) return encodings[name] var m = (from ? from + '.' + name : name).split('.') .map(function (part, i, list) { return list.slice(0, i).concat(name).join('.') }) .reverse() .reduce(function (result, id) { return result || messages[id] || enums[id] }, null) if (compile === false) return m if (!m) throw new Error('Could not resolve ' + name) if (m.values) return compileEnum(m) return cache[m.id] || compileMessage(m, cache[m.id] = {}) } return (schema.enums || []).concat((schema.messages || []).map(function (message) { return resolve(message.id) })) } }).call(this,require("buffer").Buffer) },{"./encodings":249,"buffer":45,"generate-function":182,"generate-object-property":183,"varint":290}],249:[function(require,module,exports){ (function (Buffer){ var varint = require('varint') var svarint = require('signed-varint') var encoder = function (type, encode, decode, encodingLength) { encode.bytes = decode.bytes = 0 return { type: type, encode: encode, decode: decode, encodingLength: encodingLength } } exports.make = encoder exports.bytes = (function (tag) { var bufferLength = function (val) { return Buffer.isBuffer(val) ? val.length : Buffer.byteLength(val) } var encodingLength = function (val) { var len = bufferLength(val) return varint.encodingLength(len) + len } var encode = function (val, buffer, offset) { var oldOffset = offset var len = bufferLength(val) varint.encode(len, buffer, offset) offset += varint.encode.bytes if (Buffer.isBuffer(val)) val.copy(buffer, offset) else buffer.write(val, offset, len) offset += len encode.bytes = offset - oldOffset return buffer } var decode = function (buffer, offset) { var oldOffset = offset var len = varint.decode(buffer, offset) offset += varint.decode.bytes var val = buffer.slice(offset, offset + len) offset += val.length decode.bytes = offset - oldOffset return val } return encoder(2, encode, decode, encodingLength) })() exports.string = (function () { var encodingLength = function (val) { var len = Buffer.byteLength(val) return varint.encodingLength(len) + len } var encode = function (val, buffer, offset) { var oldOffset = offset var len = Buffer.byteLength(val) varint.encode(len, buffer, offset, 'utf-8') offset += varint.encode.bytes buffer.write(val, offset, len) offset += len encode.bytes = offset - oldOffset return buffer } var decode = function (buffer, offset) { var oldOffset = offset var len = varint.decode(buffer, offset) offset += varint.decode.bytes var val = buffer.toString('utf-8', offset, offset + len) offset += len decode.bytes = offset - oldOffset return val } return encoder(2, encode, decode, encodingLength) })() exports.bool = (function () { var encodingLength = function (val) { return 1 } var encode = function (val, buffer, offset) { buffer[offset] = val ? 1 : 0 encode.bytes = 1 return buffer } var decode = function (buffer, offset) { var bool = buffer[offset] > 0 decode.bytes = 1 return bool } return encoder(0, encode, decode, encodingLength) })() exports.int32 = (function () { var decode = function (buffer, offset) { var val = varint.decode(buffer, offset) decode.bytes = varint.decode.bytes return val > 2147483647 ? val - 4294967296 : val } var encode = function (val, buffer, offset) { varint.encode(val < 0 ? val + 4294967296 : val, buffer, offset) encode.bytes = varint.encode.bytes return buffer } var encodingLength = function (val) { return varint.encodingLength(val < 0 ? val + 4294967296 : val) } return encoder(0, varint.encode, decode, encodingLength) })() exports.int64 = (function () { var decode = function (buffer, offset) { var val = varint.decode(buffer, offset) if (val >= Math.pow(2, 63)) { var limit = 9 while (buffer[offset + limit - 1] === 0xff) limit-- limit = limit || 9 var subset = new Buffer(limit) buffer.copy(subset, 0, offset, offset + limit) subset[limit - 1] = subset[limit - 1] & 0x7f val = -1 * varint.decode(subset, 0) decode.bytes = 10 } else { decode.bytes = varint.decode.bytes } return val } var encode = function (val, buffer, offset) { if (val < 0) { var last = offset + 9 varint.encode(val * -1, buffer, offset) offset += varint.encode.bytes - 1 buffer[offset] = buffer[offset] | 0x80 while (offset < last - 1) { offset++ buffer[offset] = 0xff } buffer[last] = 0x01 encode.bytes = 10 } else { varint.encode(val, buffer, offset) encode.bytes = varint.encode.bytes } return buffer } var encodingLength = function (val) { return val < 0 ? 10 : varint.encodingLength(val) } return encoder(0, encode, decode, encodingLength) })() exports.sint32 = exports.sint64 = (function () { return encoder(0, svarint.encode, svarint.decode, svarint.encodingLength) })() exports.uint32 = exports.uint64 = exports.enum = exports.varint = (function () { return encoder(0, varint.encode, varint.decode, varint.encodingLength) })() // we cannot represent these in javascript so we just use buffers exports.fixed64 = exports.sfixed64 = (function () { var encodingLength = function (val) { return 8 } var encode = function (val, buffer, offset) { val.copy(buffer, offset) encode.bytes = 8 return buffer } var decode = function (buffer, offset) { var val = buffer.slice(offset, offset + 8) decode.bytes = 8 return val } return encoder(1, encode, decode, encodingLength) })() exports.double = (function () { var encodingLength = function (val) { return 8 } var encode = function (val, buffer, offset) { buffer.writeDoubleLE(val, offset) encode.bytes = 8 return buffer } var decode = function (buffer, offset) { var val = buffer.readDoubleLE(offset) decode.bytes = 8 return val } return encoder(1, encode, decode, encodingLength) })() exports.fixed32 = (function () { var encodingLength = function (val) { return 4 } var encode = function (val, buffer, offset) { buffer.writeUInt32LE(val, offset) encode.bytes = 4 return buffer } var decode = function (buffer, offset) { var val = buffer.readUInt32LE(offset) decode.bytes = 4 return val } return encoder(5, encode, decode, encodingLength) })() exports.sfixed32 = (function () { var encodingLength = function (val) { return 4 } var encode = function (val, buffer, offset) { buffer.writeInt32LE(val, offset) encode.bytes = 4 return buffer } var decode = function (buffer, offset) { var val = buffer.readInt32LE(offset) decode.bytes = 4 return val } return encoder(5, encode, decode, encodingLength) })() exports.float = (function () { var encodingLength = function (val) { return 4 } var encode = function (val, buffer, offset) { buffer.writeFloatLE(val, offset) encode.bytes = 4 return buffer } var decode = function (buffer, offset) { var val = buffer.readFloatLE(offset) decode.bytes = 4 return val } return encoder(5, encode, decode, encodingLength) })() }).call(this,require("buffer").Buffer) },{"buffer":45,"signed-varint":263,"varint":290}],250:[function(require,module,exports){ (function (Buffer){ var schema = require('protocol-buffers-schema') var compile = require('./compile') module.exports = function (proto, opts) { if (!opts) opts = {} if (!proto) throw new Error('Pass in a .proto string or a protobuf-schema parsed object') var sch = (typeof proto === 'object' && !Buffer.isBuffer(proto)) ? proto : schema.parse(proto) // to not make toString,toJSON enumarable we make a fire-and-forget prototype var Messages = function () { var self = this compile(sch, opts.encodings || {}).forEach(function (m) { self[m.name] = m.values || m }) } Messages.prototype.toString = function () { return schema.stringify(sch) } Messages.prototype.toJSON = function () { return sch } return new Messages() } }).call(this,{"isBuffer":require("../../../../../../.nvm-fish/v5.4.1/lib/node_modules/browserify/node_modules/is-buffer/index.js")}) },{"../../../../../../.nvm-fish/v5.4.1/lib/node_modules/browserify/node_modules/is-buffer/index.js":93,"./compile":248,"protocol-buffers-schema":244}],251:[function(require,module,exports){ arguments[4][168][0].apply(exports,arguments) },{"dup":168}],252:[function(require,module,exports){ var once = require('once') var eos = require('end-of-stream') var fs = require('fs') // we only need fs to get the ReadStream and WriteStream prototypes var noop = function () {} var isFn = function (fn) { return typeof fn === 'function' } var isFS = function (stream) { return (stream instanceof (fs.ReadStream || noop) || stream instanceof (fs.WriteStream || noop)) && isFn(stream.close) } var isRequest = function (stream) { return stream.setHeader && isFn(stream.abort) } var destroyer = function (stream, reading, writing, callback) { callback = once(callback) var closed = false stream.on('close', function () { closed = true }) eos(stream, {readable: reading, writable: writing}, function (err) { if (err) return callback(err) closed = true callback() }) var destroyed = false return function (err) { if (closed) return if (destroyed) return destroyed = true if (isFS(stream)) return stream.close() // use close for fs streams to avoid fd leaks if (isRequest(stream)) return stream.abort() // request.destroy just do .end - .abort is what we want if (isFn(stream.destroy)) return stream.destroy() callback(err || new Error('stream was destroyed')) } } var call = function (fn) { fn() } var pipe = function (from, to) { return from.pipe(to) } var pump = function () { var streams = Array.prototype.slice.call(arguments) var callback = isFn(streams[streams.length - 1] || noop) && streams.pop() || noop if (Array.isArray(streams[0])) streams = streams[0] if (streams.length < 2) throw new Error('pump requires two streams per minimum') var error var destroys = streams.map(function (stream, i) { var reading = i < streams.length - 1 var writing = i > 0 return destroyer(stream, reading, writing, function (err) { if (!error) error = err if (err) destroys.forEach(call) if (reading) return destroys.forEach(call) callback(error) }) }) return streams.reduce(pipe) } module.exports = pump },{"end-of-stream":165,"fs":1,"once":240}],253:[function(require,module,exports){ var now = require('performance-now') , global = typeof window === 'undefined' ? {} : window , vendors = ['moz', 'webkit'] , suffix = 'AnimationFrame' , raf = global['request' + suffix] , caf = global['cancel' + suffix] || global['cancelRequest' + suffix] , isNative = true for(var i = 0; i < vendors.length && !raf; i++) { raf = global[vendors[i] + 'Request' + suffix] caf = global[vendors[i] + 'Cancel' + suffix] || global[vendors[i] + 'CancelRequest' + suffix] } // Some versions of FF have rAF but not cAF if(!raf || !caf) { isNative = false var last = 0 , id = 0 , queue = [] , frameDuration = 1000 / 60 raf = function(callback) { if(queue.length === 0) { var _now = now() , next = Math.max(0, frameDuration - (_now - last)) last = next + _now setTimeout(function() { var cp = queue.slice(0) // Clear queue here to prevent // callbacks from appending listeners // to the current frame's queue queue.length = 0 for(var i = 0; i < cp.length; i++) { if(!cp[i].cancelled) { try{ cp[i].callback(last) } catch(e) { setTimeout(function() { throw e }, 0) } } } }, Math.round(next)) } queue.push({ handle: ++id, callback: callback, cancelled: false }) return id } caf = function(handle) { for(var i = 0; i < queue.length; i++) { if(queue[i].handle === handle) { queue[i].cancelled = true } } } } module.exports = function(fn) { // Wrap in a new function to prevent // `cancel` potentially being assigned // to the native rAF function if(!isNative) { return raf.call(global, fn) } return raf.call(global, function() { try{ fn.apply(this, arguments) } catch(e) { setTimeout(function() { throw e }, 0) } }) } module.exports.cancel = function() { caf.apply(global, arguments) } },{"performance-now":242}],254:[function(require,module,exports){ (function (process){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a // copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to permit // persons to whom the Software is furnished to do so, subject to the // following conditions: // // The above copyright notice and this permission notice shall be included // in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE // USE OR OTHER DEALINGS IN THE SOFTWARE. // a duplex stream is just a stream that is both readable and writable. // Since JS doesn't have multiple prototypal inheritance, this class // prototypally inherits from Readable, and then parasitically from // Writable. module.exports = Duplex; /**/ var objectKeys = Object.keys || function (obj) { var keys = []; for (var key in obj) keys.push(key); return keys; } /**/ /**/ var util = require('core-util-is'); util.inherits = require('inherits'); /**/ var Readable = require('./_stream_readable'); var Writable = require('./_stream_writable'); util.inherits(Duplex, Readable); forEach(objectKeys(Writable.prototype), function(method) { if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method]; }); function Duplex(options) { if (!(this instanceof Duplex)) return new Duplex(options); Readable.call(this, options); Writable.call(this, options); if (options && options.readable === false) this.readable = false; if (options && options.writable === false) this.writable = false; this.allowHalfOpen = true; if (options && options.allowHalfOpen === false) this.allowHalfOpen = false; this.once('end', onend); } // the no-half-open enforcer function onend() { // if we allow half-open state, or if the writable side ended, // then we're ok. if (this.allowHalfOpen || this._writableState.ended) return; // no more data can be written. // But allow more writes to happen in this tick. process.nextTick(this.end.bind(this)); } function forEach (xs, f) { for (var i = 0, l = xs.length; i < l; i++) { f(xs[i], i); } } }).call(this,require('_process')) },{"./_stream_readable":256,"./_stream_writable":258,"_process":104,"core-util-is":150,"inherits":204}],255:[function(require,module,exports){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a // copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to permit // persons to whom the Software is furnished to do so, subject to the // following conditions: // // The above copyright notice and this permission notice shall be included // in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE // USE OR OTHER DEALINGS IN THE SOFTWARE. // a passthrough stream. // basically just the most minimal sort of Transform stream. // Every written chunk gets output as-is. module.exports = PassThrough; var Transform = require('./_stream_transform'); /**/ var util = require('core-util-is'); util.inherits = require('inherits'); /**/ util.inherits(PassThrough, Transform); function PassThrough(options) { if (!(this instanceof PassThrough)) return new PassThrough(options); Transform.call(this, options); } PassThrough.prototype._transform = function(chunk, encoding, cb) { cb(null, chunk); }; },{"./_stream_transform":257,"core-util-is":150,"inherits":204}],256:[function(require,module,exports){ (function (process){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a // copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to permit // persons to whom the Software is furnished to do so, subject to the // following conditions: // // The above copyright notice and this permission notice shall be included // in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE // USE OR OTHER DEALINGS IN THE SOFTWARE. module.exports = Readable; /**/ var isArray = require('isarray'); /**/ /**/ var Buffer = require('buffer').Buffer; /**/ Readable.ReadableState = ReadableState; var EE = require('events').EventEmitter; /**/ if (!EE.listenerCount) EE.listenerCount = function(emitter, type) { return emitter.listeners(type).length; }; /**/ var Stream = require('stream'); /**/ var util = require('core-util-is'); util.inherits = require('inherits'); /**/ var StringDecoder; /**/ var debug = require('util'); if (debug && debug.debuglog) { debug = debug.debuglog('stream'); } else { debug = function () {}; } /**/ util.inherits(Readable, Stream); function ReadableState(options, stream) { var Duplex = require('./_stream_duplex'); options = options || {}; // the point at which it stops calling _read() to fill the buffer // Note: 0 is a valid value, means "don't call _read preemptively ever" var hwm = options.highWaterMark; var defaultHwm = options.objectMode ? 16 : 16 * 1024; this.highWaterMark = (hwm || hwm === 0) ? hwm : defaultHwm; // cast to ints. this.highWaterMark = ~~this.highWaterMark; this.buffer = []; this.length = 0; this.pipes = null; this.pipesCount = 0; this.flowing = null; this.ended = false; this.endEmitted = false; this.reading = false; // a flag to be able to tell if the onwrite cb is called immediately, // or on a later tick. We set this to true at first, because any // actions that shouldn't happen until "later" should generally also // not happen before the first write call. this.sync = true; // whenever we return null, then we set a flag to say // that we're awaiting a 'readable' event emission. this.needReadable = false; this.emittedReadable = false; this.readableListening = false; // object stream flag. Used to make read(n) ignore n and to // make all the buffer merging and length checks go away this.objectMode = !!options.objectMode; if (stream instanceof Duplex) this.objectMode = this.objectMode || !!options.readableObjectMode; // Crypto is kind of old and crusty. Historically, its default string // encoding is 'binary' so we have to make this configurable. // Everything else in the universe uses 'utf8', though. this.defaultEncoding = options.defaultEncoding || 'utf8'; // when piping, we only care about 'readable' events that happen // after read()ing all the bytes and not getting any pushback. this.ranOut = false; // the number of writers that are awaiting a drain event in .pipe()s this.awaitDrain = 0; // if true, a maybeReadMore has been scheduled this.readingMore = false; this.decoder = null; this.encoding = null; if (options.encoding) { if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder; this.decoder = new StringDecoder(options.encoding); this.encoding = options.encoding; } } function Readable(options) { var Duplex = require('./_stream_duplex'); if (!(this instanceof Readable)) return new Readable(options); this._readableState = new ReadableState(options, this); // legacy this.readable = true; Stream.call(this); } // Manually shove something into the read() buffer. // This returns true if the highWaterMark has not been hit yet, // similar to how Writable.write() returns true if you should // write() some more. Readable.prototype.push = function(chunk, encoding) { var state = this._readableState; if (util.isString(chunk) && !state.objectMode) { encoding = encoding || state.defaultEncoding; if (encoding !== state.encoding) { chunk = new Buffer(chunk, encoding); encoding = ''; } } return readableAddChunk(this, state, chunk, encoding, false); }; // Unshift should *always* be something directly out of read() Readable.prototype.unshift = function(chunk) { var state = this._readableState; return readableAddChunk(this, state, chunk, '', true); }; function readableAddChunk(stream, state, chunk, encoding, addToFront) { var er = chunkInvalid(state, chunk); if (er) { stream.emit('error', er); } else if (util.isNullOrUndefined(chunk)) { state.reading = false; if (!state.ended) onEofChunk(stream, state); } else if (state.objectMode || chunk && chunk.length > 0) { if (state.ended && !addToFront) { var e = new Error('stream.push() after EOF'); stream.emit('error', e); } else if (state.endEmitted && addToFront) { var e = new Error('stream.unshift() after end event'); stream.emit('error', e); } else { if (state.decoder && !addToFront && !encoding) chunk = state.decoder.write(chunk); if (!addToFront) state.reading = false; // if we want the data now, just emit it. if (state.flowing && state.length === 0 && !state.sync) { stream.emit('data', chunk); stream.read(0); } else { // update the buffer info. state.length += state.objectMode ? 1 : chunk.length; if (addToFront) state.buffer.unshift(chunk); else state.buffer.push(chunk); if (state.needReadable) emitReadable(stream); } maybeReadMore(stream, state); } } else if (!addToFront) { state.reading = false; } return needMoreData(state); } // if it's past the high water mark, we can push in some more. // Also, if we have no data yet, we can stand some // more bytes. This is to work around cases where hwm=0, // such as the repl. Also, if the push() triggered a // readable event, and the user called read(largeNumber) such that // needReadable was set, then we ought to push more, so that another // 'readable' event will be triggered. function needMoreData(state) { return !state.ended && (state.needReadable || state.length < state.highWaterMark || state.length === 0); } // backwards compatibility. Readable.prototype.setEncoding = function(enc) { if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder; this._readableState.decoder = new StringDecoder(enc); this._readableState.encoding = enc; return this; }; // Don't raise the hwm > 128MB var MAX_HWM = 0x800000; function roundUpToNextPowerOf2(n) { if (n >= MAX_HWM) { n = MAX_HWM; } else { // Get the next highest power of 2 n--; for (var p = 1; p < 32; p <<= 1)="" n="" |="n">> p; n++; } return n; } function howMuchToRead(n, state) { if (state.length === 0 && state.ended) return 0; if (state.objectMode) return n === 0 ? 0 : 1; if (isNaN(n) || util.isNull(n)) { // only flow one buffer at a time if (state.flowing && state.buffer.length) return state.buffer[0].length; else return state.length; } if (n <= 0)="" return="" 0;="" if="" we're="" asking="" for="" more="" than="" the="" target="" buffer="" level,="" then="" raise="" water="" mark.="" bump="" up="" to="" next="" highest="" power="" of="" 2,="" prevent="" increasing="" it="" excessively="" in="" tiny="" amounts.="" (n=""> state.highWaterMark) state.highWaterMark = roundUpToNextPowerOf2(n); // don't have that much. return null, unless we've ended. if (n > state.length) { if (!state.ended) { state.needReadable = true; return 0; } else return state.length; } return n; } // you can override either this method, or the async _read(n) below. Readable.prototype.read = function(n) { debug('read', n); var state = this._readableState; var nOrig = n; if (!util.isNumber(n) || n > 0) state.emittedReadable = false; // if we're doing read(0) to trigger a readable event, but we // already have a bunch of data in the buffer, then just trigger // the 'readable' event and move on. if (n === 0 && state.needReadable && (state.length >= state.highWaterMark || state.ended)) { debug('read: emitReadable', state.length, state.ended); if (state.length === 0 && state.ended) endReadable(this); else emitReadable(this); return null; } n = howMuchToRead(n, state); // if we've ended, and we're now clear, then finish it up. if (n === 0 && state.ended) { if (state.length === 0) endReadable(this); return null; } // All the actual chunk generation logic needs to be // *below* the call to _read. The reason is that in certain // synthetic stream cases, such as passthrough streams, _read // may be a completely synchronous operation which may change // the state of the read buffer, providing enough data when // before there was *not* enough. // // So, the steps are: // 1. Figure out what the state of things will be after we do // a read from the buffer. // // 2. If that resulting state will trigger a _read, then call _read. // Note that this may be asynchronous, or synchronous. Yes, it is // deeply ugly to write APIs this way, but that still doesn't mean // that the Readable class should behave improperly, as streams are // designed to be sync/async agnostic. // Take note if the _read call is sync or async (ie, if the read call // has returned yet), so that we know whether or not it's safe to emit // 'readable' etc. // // 3. Actually pull the requested chunks out of the buffer and return. // if we need a readable event, then we need to do some reading. var doRead = state.needReadable; debug('need readable', doRead); // if we currently have less than the highWaterMark, then also read some if (state.length === 0 || state.length - n < state.highWaterMark) { doRead = true; debug('length less than watermark', doRead); } // however, if we've ended, then there's no point, and if we're already // reading, then it's unnecessary. if (state.ended || state.reading) { doRead = false; debug('reading or ended', doRead); } if (doRead) { debug('do read'); state.reading = true; state.sync = true; // if the length is currently zero, then we *need* a readable event. if (state.length === 0) state.needReadable = true; // call internal read method this._read(state.highWaterMark); state.sync = false; } // If _read pushed data synchronously, then `reading` will be false, // and we need to re-evaluate how much data we can return to the user. if (doRead && !state.reading) n = howMuchToRead(nOrig, state); var ret; if (n > 0) ret = fromList(n, state); else ret = null; if (util.isNull(ret)) { state.needReadable = true; n = 0; } state.length -= n; // If we have nothing in the buffer, then we want to know // as soon as we *do* get something into the buffer. if (state.length === 0 && !state.ended) state.needReadable = true; // If we tried to read() past the EOF, then emit end on the next tick. if (nOrig !== n && state.ended && state.length === 0) endReadable(this); if (!util.isNull(ret)) this.emit('data', ret); return ret; }; function chunkInvalid(state, chunk) { var er = null; if (!util.isBuffer(chunk) && !util.isString(chunk) && !util.isNullOrUndefined(chunk) && !state.objectMode) { er = new TypeError('Invalid non-string/buffer chunk'); } return er; } function onEofChunk(stream, state) { if (state.decoder && !state.ended) { var chunk = state.decoder.end(); if (chunk && chunk.length) { state.buffer.push(chunk); state.length += state.objectMode ? 1 : chunk.length; } } state.ended = true; // emit 'readable' now to make sure it gets picked up. emitReadable(stream); } // Don't emit readable right away in sync mode, because this can trigger // another read() call => stack overflow. This way, it might trigger // a nextTick recursion warning, but that's not so bad. function emitReadable(stream) { var state = stream._readableState; state.needReadable = false; if (!state.emittedReadable) { debug('emitReadable', state.flowing); state.emittedReadable = true; if (state.sync) process.nextTick(function() { emitReadable_(stream); }); else emitReadable_(stream); } } function emitReadable_(stream) { debug('emit readable'); stream.emit('readable'); flow(stream); } // at this point, the user has presumably seen the 'readable' event, // and called read() to consume some data. that may have triggered // in turn another _read(n) call, in which case reading = true if // it's in progress. // However, if we're not ended, or reading, and the length < hwm, // then go ahead and try to read some more preemptively. function maybeReadMore(stream, state) { if (!state.readingMore) { state.readingMore = true; process.nextTick(function() { maybeReadMore_(stream, state); }); } } function maybeReadMore_(stream, state) { var len = state.length; while (!state.reading && !state.flowing && !state.ended && state.length < state.highWaterMark) { debug('maybeReadMore read 0'); stream.read(0); if (len === state.length) // didn't get any data, stop spinning. break; else len = state.length; } state.readingMore = false; } // abstract method. to be overridden in specific implementation classes. // call cb(er, data) where data is <= 0="" n="" in="" length.="" for="" virtual="" (non-string,="" non-buffer)="" streams,="" "length"="" is="" somewhat="" arbitrary,="" and="" perhaps="" not="" very="" meaningful.="" readable.prototype._read="function(n)" {="" this.emit('error',="" new="" error('not="" implemented'));="" };="" readable.prototype.pipe="function(dest," pipeopts)="" var="" src="this;" state="this._readableState;" switch="" (state.pipescount)="" case="" 0:="" state.pipes="dest;" break;="" 1:="" dest];="" default:="" state.pipes.push(dest);="" }="" state.pipescount="" +="1;" debug('pipe="" count="%d" opts="%j'," state.pipescount,="" pipeopts);="" doend="(!pipeOpts" ||="" pipeopts.end="" !="=" false)="" &&="" dest="" process.stdout="" process.stderr;="" endfn="doEnd" ?="" onend="" :="" cleanup;="" if="" (state.endemitted)="" process.nexttick(endfn);="" else="" src.once('end',="" endfn);="" dest.on('unpipe',="" onunpipe);="" function="" onunpipe(readable)="" debug('onunpipe');="" (readable="==" src)="" cleanup();="" onend()="" debug('onend');="" dest.end();="" when="" the="" drains,="" it="" reduces="" awaitdrain="" counter="" on="" source.="" this="" would="" be="" more="" elegant="" with="" a="" .once()="" handler="" flow(),="" but="" adding="" removing="" repeatedly="" too="" slow.="" ondrain="pipeOnDrain(src);" dest.on('drain',="" ondrain);="" cleanup()="" debug('cleanup');="" cleanup="" event="" handlers="" once="" pipe="" broken="" dest.removelistener('close',="" onclose);="" dest.removelistener('finish',="" onfinish);="" dest.removelistener('drain',="" dest.removelistener('error',="" onerror);="" dest.removelistener('unpipe',="" src.removelistener('end',="" onend);="" cleanup);="" src.removelistener('data',="" ondata);="" reader="" waiting="" drain="" from="" specific="" writer,="" then="" cause="" to="" never="" start="" flowing="" again.="" so,="" awaiting="" drain,="" we="" just="" call="" now.="" don't="" know,="" assume="" that="" are="" one.="" (state.awaitdrain="" (!dest._writablestate="" dest._writablestate.needdrain))="" ondrain();="" src.on('data',="" ondata(chunk)="" debug('ondata');="" ret="dest.write(chunk);" (false="==" ret)="" debug('false="" write="" response,="" pause',="" src._readablestate.awaitdrain);="" src._readablestate.awaitdrain++;="" src.pause();="" has="" an="" error,="" stop="" piping="" into="" it.="" however,="" suppress="" throwing="" behavior="" this.="" onerror(er)="" debug('onerror',="" er);="" unpipe();="" (ee.listenercount(dest,="" 'error')="==" 0)="" dest.emit('error',="" brutally="" ugly="" hack="" make="" sure="" our="" error="" attached="" before="" any="" userland="" ones.="" do="" (!dest._events="" !dest._events.error)="" dest.on('error',="" (isarray(dest._events.error))="" dest._events.error.unshift(onerror);="" dest._events.error="[onerror," dest._events.error];="" both="" close="" finish="" should="" trigger="" unpipe,="" only="" once.="" onclose()="" dest.once('close',="" onfinish()="" debug('onfinish');="" dest.once('finish',="" unpipe()="" debug('unpipe');="" src.unpipe(dest);="" tell="" it's="" being="" piped="" dest.emit('pipe',="" src);="" flow="" hasn't="" been="" started="" already.="" (!state.flowing)="" resume');="" src.resume();="" return="" dest;="" pipeondrain(src)="" function()="" debug('pipeondrain',="" state.awaitdrain);="" (state.awaitdrain)="" state.awaitdrain--;="" ee.listenercount(src,="" 'data'))="" state.flowing="true;" flow(src);="" readable.prototype.unpipe="function(dest)" we're="" anywhere,="" nothing.="" (state.pipescount="==" this;="" one="" destination.="" most="" common="" case.="" 1)="" passed="" one,="" right="" (dest="" state.pipes)="" (!dest)="" got="" match.="" (dest)="" dest.emit('unpipe',="" this);="" slow="" multiple destinations.="" remove="" all.="" dests="state.pipes;" len="state.pipesCount;" (var="" i="0;" <="" len;="" i++)="" dests[i].emit('unpipe',="" try="" find="" dest);="" (i="==" -1)="" state.pipes.splice(i,="" 1);="" -="1;" set="" up="" data="" events="" they="" asked="" ensure="" readable="" listeners="" eventually="" get="" something="" readable.prototype.on="function(ev," fn)="" res="Stream.prototype.on.call(this," ev,="" fn);="" listening="" data,="" explicitly="" paused,="" resume="" of="" next="" tick.="" (ev="==" 'data'="" false="" this._readablestate.flowing)="" this.resume();="" 'readable'="" this.readable)="" (!state.readablelistening)="" state.readablelistening="true;" state.emittedreadable="false;" state.needreadable="true;" (!state.reading)="" self="this;" process.nexttick(function()="" debug('readable="" nexttick="" read="" 0');="" self.read(0);="" });="" (state.length)="" emitreadable(this,="" state);="" res;="" readable.prototype.addlistener="Readable.prototype.on;" pause()="" resume()="" remnants="" legacy="" stream="" api="" user="" uses="" them,="" old="" mode.="" readable.prototype.resume="function()" debug('resume');="" debug('resume="" this.read(0);="" resume(this,="" resume(stream,="" state)="" (!state.resumescheduled)="" state.resumescheduled="true;" resume_(stream,="" stream.emit('resume');="" flow(stream);="" (state.flowing="" !state.reading)="" stream.read(0);="" readable.prototype.pause="function()" debug('call="" pause="" this._readablestate.flowing);="" debug('pause');="" this._readablestate.flowing="false;" this.emit('pause');="" flow(stream)="" debug('flow',="" state.flowing);="" (state.flowing)="" chunk="stream.read();" while="" (null="" wrap="" old-style="" as="" async *not*="" part="" interface.="" unfortunate="" mess="" history.="" readable.prototype.wrap="function(stream)" paused="false;" stream.on('end',="" debug('wrapped="" end');="" (state.decoder="" !state.ended)="" (chunk="" chunk.length)="" self.push(chunk);="" self.push(null);="" stream.on('data',="" function(chunk)="" data');="" (state.decoder)="" (!chunk="" !state.objectmode="" !chunk.length)="" return;="" (!ret)="" stream.pause();="" proxy="" all="" other="" methods.="" important="" wrapping="" filters="" duplexes.="" stream)="" (util.isfunction(stream[i])="" util.isundefined(this[i]))="" this[i]="function(method)" stream[method].apply(stream,="" arguments);="" }}(i);="" certain="" events.="" 'close',="" 'destroy',="" 'pause',="" 'resume'];="" foreach(events,="" function(ev)="" stream.on(ev,="" self.emit.bind(self,="" ev));="" consume="" some="" bytes,="" simply="" unpause="" underlying="" stream.="" self._read="function(n)" _read',="" n);="" (paused)="" stream.resume();="" self;="" exposed="" testing="" purposes="" only.="" readable._fromlist="fromList;" pluck="" off="" bytes="" array="" buffers.="" length="" combined="" lengths="" buffers="" list.="" fromlist(n,="" list="state.buffer;" stringmode="!!state.decoder;" objectmode="!!state.objectMode;" ret;="" nothing="" list,="" definitely="" empty.="" (list.length="==" null;="" (length="==" (objectmode)="" (!n="">= length) { // read it all, truncate the array. if (stringMode) ret = list.join(''); else ret = Buffer.concat(list, length); list.length = 0; } else { // read just some of it. if (n < list[0].length) { // just take a part of the first list item. // slice is the same for buffers and strings. var buf = list[0]; ret = buf.slice(0, n); list[0] = buf.slice(n); } else if (n === list[0].length) { // first list is a perfect match ret = list.shift(); } else { // complex case. // we have enough to cover it, but it spans past the first buffer. if (stringMode) ret = ''; else ret = new Buffer(n); var c = 0; for (var i = 0, l = list.length; i < l && c < n; i++) { var buf = list[0]; var cpy = Math.min(n - c, buf.length); if (stringMode) ret += buf.slice(0, cpy); else buf.copy(ret, c, 0, cpy); if (cpy < buf.length) list[0] = buf.slice(cpy); else list.shift(); c += cpy; } } } return ret; } function endReadable(stream) { var state = stream._readableState; // If we get here before consuming all the bytes, then that is a // bug in node. Should never happen. if (state.length > 0) throw new Error('endReadable called on non-empty stream'); if (!state.endEmitted) { state.ended = true; process.nextTick(function() { // Check that we didn't get one last unshift. if (!state.endEmitted && state.length === 0) { state.endEmitted = true; stream.readable = false; stream.emit('end'); } }); } } function forEach (xs, f) { for (var i = 0, l = xs.length; i < l; i++) { f(xs[i], i); } } function indexOf (xs, x) { for (var i = 0, l = xs.length; i < l; i++) { if (xs[i] === x) return i; } return -1; } }).call(this,require('_process')) },{"./_stream_duplex":254,"_process":104,"buffer":45,"core-util-is":150,"events":82,"inherits":204,"isarray":209,"stream":131,"string_decoder/":272,"util":19}],257:[function(require,module,exports){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a // copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to permit // persons to whom the Software is furnished to do so, subject to the // following conditions: // // The above copyright notice and this permission notice shall be included // in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE // USE OR OTHER DEALINGS IN THE SOFTWARE. // a transform stream is a readable/writable stream where you do // something with the data. Sometimes it's called a "filter", // but that's not a great name for it, since that implies a thing where // some bits pass through, and others are simply ignored. (That would // be a valid example of a transform, of course.) // // While the output is causally related to the input, it's not a // necessarily symmetric or synchronous transformation. For example, // a zlib stream might take multiple plain-text writes(), and then // emit a single compressed chunk some time in the future. // // Here's how this works: // // The Transform stream has all the aspects of the readable and writable // stream classes. When you write(chunk), that calls _write(chunk,cb) // internally, and returns false if there's a lot of pending writes // buffered up. When you call read(), that calls _read(n) until // there's enough pending readable data buffered up. // // In a transform stream, the written data is placed in a buffer. When // _read(n) is called, it transforms the queued up data, calling the // buffered _write cb's as it consumes chunks. If consuming a single // written chunk would result in multiple output chunks, then the first // outputted bit calls the readcb, and subsequent chunks just go into // the read buffer, and will cause it to emit 'readable' if necessary. // // This way, back-pressure is actually determined by the reading side, // since _read has to be called to start processing a new chunk. However, // a pathological inflate type of transform can cause excessive buffering // here. For example, imagine a stream where every byte of input is // interpreted as an integer from 0-255, and then results in that many // bytes of output. Writing the 4 bytes {ff,ff,ff,ff} would result in // 1kb of data being output. In this case, you could write a very small // amount of input, and end up with a very large amount of output. In // such a pathological inflating mechanism, there'd be no way to tell // the system to stop doing the transform. A single 4MB write could // cause the system to run out of memory. // // However, even in such a pathological case, only a single written chunk // would be consumed, and then the rest would wait (un-transformed) until // the results of the previous transformed chunk were consumed. module.exports = Transform; var Duplex = require('./_stream_duplex'); /**/ var util = require('core-util-is'); util.inherits = require('inherits'); /**/ util.inherits(Transform, Duplex); function TransformState(options, stream) { this.afterTransform = function(er, data) { return afterTransform(stream, er, data); }; this.needTransform = false; this.transforming = false; this.writecb = null; this.writechunk = null; } function afterTransform(stream, er, data) { var ts = stream._transformState; ts.transforming = false; var cb = ts.writecb; if (!cb) return stream.emit('error', new Error('no writecb in Transform class')); ts.writechunk = null; ts.writecb = null; if (!util.isNullOrUndefined(data)) stream.push(data); if (cb) cb(er); var rs = stream._readableState; rs.reading = false; if (rs.needReadable || rs.length < rs.highWaterMark) { stream._read(rs.highWaterMark); } } function Transform(options) { if (!(this instanceof Transform)) return new Transform(options); Duplex.call(this, options); this._transformState = new TransformState(options, this); // when the writable side finishes, then flush out anything remaining. var stream = this; // start out asking for a readable event once data is transformed. this._readableState.needReadable = true; // we have implemented the _read method, and done the other things // that Readable wants before the first _read call, so unset the // sync guard flag. this._readableState.sync = false; this.once('prefinish', function() { if (util.isFunction(this._flush)) this._flush(function(er) { done(stream, er); }); else done(stream); }); } Transform.prototype.push = function(chunk, encoding) { this._transformState.needTransform = false; return Duplex.prototype.push.call(this, chunk, encoding); }; // This is the part where you do stuff! // override this function in implementation classes. // 'chunk' is an input chunk. // // Call `push(newChunk)` to pass along transformed output // to the readable side. You may call 'push' zero or more times. // // Call `cb(err)` when you are done with this chunk. If you pass // an error, then that'll put the hurt on the whole operation. If you // never call cb(), then you'll never get another chunk. Transform.prototype._transform = function(chunk, encoding, cb) { throw new Error('not implemented'); }; Transform.prototype._write = function(chunk, encoding, cb) { var ts = this._transformState; ts.writecb = cb; ts.writechunk = chunk; ts.writeencoding = encoding; if (!ts.transforming) { var rs = this._readableState; if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark); } }; // Doesn't matter what the args are here. // _transform does all the work. // That we got here means that the readable side wants more data. Transform.prototype._read = function(n) { var ts = this._transformState; if (!util.isNull(ts.writechunk) && ts.writecb && !ts.transforming) { ts.transforming = true; this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform); } else { // mark that we need a transform, so that any data that comes in // will get processed, now that we've asked for it. ts.needTransform = true; } }; function done(stream, er) { if (er) return stream.emit('error', er); // if there's nothing in the write buffer, then that means // that nothing more will ever be provided var ws = stream._writableState; var ts = stream._transformState; if (ws.length) throw new Error('calling transform done when ws.length != 0'); if (ts.transforming) throw new Error('calling transform done when still transforming'); return stream.push(null); } },{"./_stream_duplex":254,"core-util-is":150,"inherits":204}],258:[function(require,module,exports){ (function (process){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a // copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to permit // persons to whom the Software is furnished to do so, subject to the // following conditions: // // The above copyright notice and this permission notice shall be included // in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE // USE OR OTHER DEALINGS IN THE SOFTWARE. // A bit simpler than readable streams. // Implement an async ._write(chunk, cb), and it'll handle all // the drain event emission and buffering. module.exports = Writable; /**/ var Buffer = require('buffer').Buffer; /**/ Writable.WritableState = WritableState; /**/ var util = require('core-util-is'); util.inherits = require('inherits'); /**/ var Stream = require('stream'); util.inherits(Writable, Stream); function WriteReq(chunk, encoding, cb) { this.chunk = chunk; this.encoding = encoding; this.callback = cb; } function WritableState(options, stream) { var Duplex = require('./_stream_duplex'); options = options || {}; // the point at which write() starts returning false // Note: 0 is a valid value, means that we always return false if // the entire buffer is not flushed immediately on write() var hwm = options.highWaterMark; var defaultHwm = options.objectMode ? 16 : 16 * 1024; this.highWaterMark = (hwm || hwm === 0) ? hwm : defaultHwm; // object stream flag to indicate whether or not this stream // contains buffers or objects. this.objectMode = !!options.objectMode; if (stream instanceof Duplex) this.objectMode = this.objectMode || !!options.writableObjectMode; // cast to ints. this.highWaterMark = ~~this.highWaterMark; this.needDrain = false; // at the start of calling end() this.ending = false; // when end() has been called, and returned this.ended = false; // when 'finish' is emitted this.finished = false; // should we decode strings into buffers before passing to _write? // this is here so that some node-core streams can optimize string // handling at a lower level. var noDecode = options.decodeStrings === false; this.decodeStrings = !noDecode; // Crypto is kind of old and crusty. Historically, its default string // encoding is 'binary' so we have to make this configurable. // Everything else in the universe uses 'utf8', though. this.defaultEncoding = options.defaultEncoding || 'utf8'; // not an actual buffer we keep track of, but a measurement // of how much we're waiting to get pushed to some underlying // socket or file. this.length = 0; // a flag to see when we're in the middle of a write. this.writing = false; // when true all writes will be buffered until .uncork() call this.corked = 0; // a flag to be able to tell if the onwrite cb is called immediately, // or on a later tick. We set this to true at first, because any // actions that shouldn't happen until "later" should generally also // not happen before the first write call. this.sync = true; // a flag to know if we're processing previously buffered items, which // may call the _write() callback in the same tick, so that we don't // end up in an overlapped onwrite situation. this.bufferProcessing = false; // the callback that's passed to _write(chunk,cb) this.onwrite = function(er) { onwrite(stream, er); }; // the callback that the user supplies to write(chunk,encoding,cb) this.writecb = null; // the amount that is being written when _write is called. this.writelen = 0; this.buffer = []; // number of pending user-supplied write callbacks // this must be 0 before 'finish' can be emitted this.pendingcb = 0; // emit prefinish if the only thing we're waiting for is _write cbs // This is relevant for synchronous Transform streams this.prefinished = false; // True if the error was already emitted and should not be thrown again this.errorEmitted = false; } function Writable(options) { var Duplex = require('./_stream_duplex'); // Writable ctor is applied to Duplexes, though they're not // instanceof Writable, they're instanceof Readable. if (!(this instanceof Writable) && !(this instanceof Duplex)) return new Writable(options); this._writableState = new WritableState(options, this); // legacy. this.writable = true; Stream.call(this); } // Otherwise people can pipe Writable streams, which is just wrong. Writable.prototype.pipe = function() { this.emit('error', new Error('Cannot pipe. Not readable.')); }; function writeAfterEnd(stream, state, cb) { var er = new Error('write after end'); // TODO: defer error events consistently everywhere, not just the cb stream.emit('error', er); process.nextTick(function() { cb(er); }); } // If we get something that is not a buffer, string, null, or undefined, // and we're not in objectMode, then that's an error. // Otherwise stream chunks are all considered to be of length=1, and the // watermarks determine how many objects to keep in the buffer, rather than // how many bytes or characters. function validChunk(stream, state, chunk, cb) { var valid = true; if (!util.isBuffer(chunk) && !util.isString(chunk) && !util.isNullOrUndefined(chunk) && !state.objectMode) { var er = new TypeError('Invalid non-string/buffer chunk'); stream.emit('error', er); process.nextTick(function() { cb(er); }); valid = false; } return valid; } Writable.prototype.write = function(chunk, encoding, cb) { var state = this._writableState; var ret = false; if (util.isFunction(encoding)) { cb = encoding; encoding = null; } if (util.isBuffer(chunk)) encoding = 'buffer'; else if (!encoding) encoding = state.defaultEncoding; if (!util.isFunction(cb)) cb = function() {}; if (state.ended) writeAfterEnd(this, state, cb); else if (validChunk(this, state, chunk, cb)) { state.pendingcb++; ret = writeOrBuffer(this, state, chunk, encoding, cb); } return ret; }; Writable.prototype.cork = function() { var state = this._writableState; state.corked++; }; Writable.prototype.uncork = function() { var state = this._writableState; if (state.corked) { state.corked--; if (!state.writing && !state.corked && !state.finished && !state.bufferProcessing && state.buffer.length) clearBuffer(this, state); } }; function decodeChunk(state, chunk, encoding) { if (!state.objectMode && state.decodeStrings !== false && util.isString(chunk)) { chunk = new Buffer(chunk, encoding); } return chunk; } // if we're already writing something, then just put this // in the queue, and wait our turn. Otherwise, call _write // If we return false, then we need a drain event, so set that flag. function writeOrBuffer(stream, state, chunk, encoding, cb) { chunk = decodeChunk(state, chunk, encoding); if (util.isBuffer(chunk)) encoding = 'buffer'; var len = state.objectMode ? 1 : chunk.length; state.length += len; var ret = state.length < state.highWaterMark; // we must ensure that previous needDrain will not be reset to false. if (!ret) state.needDrain = true; if (state.writing || state.corked) state.buffer.push(new WriteReq(chunk, encoding, cb)); else doWrite(stream, state, false, len, chunk, encoding, cb); return ret; } function doWrite(stream, state, writev, len, chunk, encoding, cb) { state.writelen = len; state.writecb = cb; state.writing = true; state.sync = true; if (writev) stream._writev(chunk, state.onwrite); else stream._write(chunk, encoding, state.onwrite); state.sync = false; } function onwriteError(stream, state, sync, er, cb) { if (sync) process.nextTick(function() { state.pendingcb--; cb(er); }); else { state.pendingcb--; cb(er); } stream._writableState.errorEmitted = true; stream.emit('error', er); } function onwriteStateUpdate(state) { state.writing = false; state.writecb = null; state.length -= state.writelen; state.writelen = 0; } function onwrite(stream, er) { var state = stream._writableState; var sync = state.sync; var cb = state.writecb; onwriteStateUpdate(state); if (er) onwriteError(stream, state, sync, er, cb); else { // Check if we're actually ready to finish, but don't emit yet var finished = needFinish(stream, state); if (!finished && !state.corked && !state.bufferProcessing && state.buffer.length) { clearBuffer(stream, state); } if (sync) { process.nextTick(function() { afterWrite(stream, state, finished, cb); }); } else { afterWrite(stream, state, finished, cb); } } } function afterWrite(stream, state, finished, cb) { if (!finished) onwriteDrain(stream, state); state.pendingcb--; cb(); finishMaybe(stream, state); } // Must force callback to be called on nextTick, so that we don't // emit 'drain' before the write() consumer gets the 'false' return // value, and has a chance to attach a 'drain' listener. function onwriteDrain(stream, state) { if (state.length === 0 && state.needDrain) { state.needDrain = false; stream.emit('drain'); } } // if there's something in the buffer waiting, then process it function clearBuffer(stream, state) { state.bufferProcessing = true; if (stream._writev && state.buffer.length > 1) { // Fast case, write everything using _writev() var cbs = []; for (var c = 0; c < state.buffer.length; c++) cbs.push(state.buffer[c].callback); // count the one we are adding, as well. // TODO(isaacs) clean this up state.pendingcb++; doWrite(stream, state, true, state.length, state.buffer, '', function(err) { for (var i = 0; i < cbs.length; i++) { state.pendingcb--; cbs[i](err); } }); // Clear buffer state.buffer = []; } else { // Slow case, write chunks one-by-one for (var c = 0; c < state.buffer.length; c++) { var entry = state.buffer[c]; var chunk = entry.chunk; var encoding = entry.encoding; var cb = entry.callback; var len = state.objectMode ? 1 : chunk.length; doWrite(stream, state, false, len, chunk, encoding, cb); // if we didn't call the onwrite immediately, then // it means that we need to wait until it does. // also, that means that the chunk and cb are currently // being processed, so move the buffer counter past them. if (state.writing) { c++; break; } } if (c < state.buffer.length) state.buffer = state.buffer.slice(c); else state.buffer.length = 0; } state.bufferProcessing = false; } Writable.prototype._write = function(chunk, encoding, cb) { cb(new Error('not implemented')); }; Writable.prototype._writev = null; Writable.prototype.end = function(chunk, encoding, cb) { var state = this._writableState; if (util.isFunction(chunk)) { cb = chunk; chunk = null; encoding = null; } else if (util.isFunction(encoding)) { cb = encoding; encoding = null; } if (!util.isNullOrUndefined(chunk)) this.write(chunk, encoding); // .end() fully uncorks if (state.corked) { state.corked = 1; this.uncork(); } // ignore unnecessary end() calls. if (!state.ending && !state.finished) endWritable(this, state, cb); }; function needFinish(stream, state) { return (state.ending && state.length === 0 && !state.finished && !state.writing); } function prefinish(stream, state) { if (!state.prefinished) { state.prefinished = true; stream.emit('prefinish'); } } function finishMaybe(stream, state) { var need = needFinish(stream, state); if (need) { if (state.pendingcb === 0) { prefinish(stream, state); state.finished = true; stream.emit('finish'); } else prefinish(stream, state); } return need; } function endWritable(stream, state, cb) { state.ending = true; finishMaybe(stream, state); if (cb) { if (state.finished) process.nextTick(cb); else stream.once('finish', cb); } state.ended = true; } }).call(this,require('_process')) },{"./_stream_duplex":254,"_process":104,"buffer":45,"core-util-is":150,"inherits":204,"stream":131}],259:[function(require,module,exports){ exports = module.exports = require('./lib/_stream_readable.js'); exports.Stream = require('stream'); exports.Readable = exports; exports.Writable = require('./lib/_stream_writable.js'); exports.Duplex = require('./lib/_stream_duplex.js'); exports.Transform = require('./lib/_stream_transform.js'); exports.PassThrough = require('./lib/_stream_passthrough.js'); },{"./lib/_stream_duplex.js":254,"./lib/_stream_passthrough.js":255,"./lib/_stream_readable.js":256,"./lib/_stream_transform.js":257,"./lib/_stream_writable.js":258,"stream":131}],260:[function(require,module,exports){ (function (Buffer){ // prototype class for hash functions function Hash (blockSize, finalSize) { this._block = new Buffer(blockSize) this._finalSize = finalSize this._blockSize = blockSize this._len = 0 this._s = 0 } Hash.prototype.update = function (data, enc) { if (typeof data === 'string') { enc = enc || 'utf8' data = new Buffer(data, enc) } var l = this._len += data.length var s = this._s || 0 var f = 0 var buffer = this._block while (s < l) { var t = Math.min(data.length, f + this._blockSize - (s % this._blockSize)) var ch = (t - f) for (var i = 0; i < ch; i++) { buffer[(s % this._blockSize) + i] = data[i + f] } s += ch f += ch if ((s % this._blockSize) === 0) { this._update(buffer) } } this._s = s return this } Hash.prototype.digest = function (enc) { // Suppose the length of the message M, in bits, is l var l = this._len * 8 // Append the bit 1 to the end of the message this._block[this._len % this._blockSize] = 0x80 // and then k zero bits, where k is the smallest non-negative solution to the equation (l + 1 + k) === finalSize mod blockSize this._block.fill(0, this._len % this._blockSize + 1) if (l % (this._blockSize * 8) >= this._finalSize * 8) { this._update(this._block) this._block.fill(0) } // to this append the block which is equal to the number l written in binary // TODO: handle case where l is > Math.pow(2, 29) this._block.writeInt32BE(l, this._blockSize - 4) var hash = this._update(this._block) || this._hash() return enc ? hash.toString(enc) : hash } Hash.prototype._update = function () { throw new Error('_update must be implemented by subclass') } module.exports = Hash }).call(this,require("buffer").Buffer) },{"buffer":45}],261:[function(require,module,exports){ (function (Buffer){ /** * A JavaScript implementation of the Secure Hash Algorithm, SHA-256, as defined * in FIPS 180-2 * Version 2.2-beta Copyright Angel Marin, Paul Johnston 2000 - 2009. * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet * */ var inherits = require('inherits') var Hash = require('./hash') var K = [ 0x428A2F98, 0x71374491, 0xB5C0FBCF, 0xE9B5DBA5, 0x3956C25B, 0x59F111F1, 0x923F82A4, 0xAB1C5ED5, 0xD807AA98, 0x12835B01, 0x243185BE, 0x550C7DC3, 0x72BE5D74, 0x80DEB1FE, 0x9BDC06A7, 0xC19BF174, 0xE49B69C1, 0xEFBE4786, 0x0FC19DC6, 0x240CA1CC, 0x2DE92C6F, 0x4A7484AA, 0x5CB0A9DC, 0x76F988DA, 0x983E5152, 0xA831C66D, 0xB00327C8, 0xBF597FC7, 0xC6E00BF3, 0xD5A79147, 0x06CA6351, 0x14292967, 0x27B70A85, 0x2E1B2138, 0x4D2C6DFC, 0x53380D13, 0x650A7354, 0x766A0ABB, 0x81C2C92E, 0x92722C85, 0xA2BFE8A1, 0xA81A664B, 0xC24B8B70, 0xC76C51A3, 0xD192E819, 0xD6990624, 0xF40E3585, 0x106AA070, 0x19A4C116, 0x1E376C08, 0x2748774C, 0x34B0BCB5, 0x391C0CB3, 0x4ED8AA4A, 0x5B9CCA4F, 0x682E6FF3, 0x748F82EE, 0x78A5636F, 0x84C87814, 0x8CC70208, 0x90BEFFFA, 0xA4506CEB, 0xBEF9A3F7, 0xC67178F2 ] var W = new Array(64) function Sha256 () { this.init() this._w = W // new Array(64) Hash.call(this, 64, 56) } inherits(Sha256, Hash) Sha256.prototype.init = function () { this._a = 0x6a09e667 | 0 this._b = 0xbb67ae85 | 0 this._c = 0x3c6ef372 | 0 this._d = 0xa54ff53a | 0 this._e = 0x510e527f | 0 this._f = 0x9b05688c | 0 this._g = 0x1f83d9ab | 0 this._h = 0x5be0cd19 | 0 return this } function Ch (x, y, z) { return z ^ (x & (y ^ z)) } function Maj (x, y, z) { return (x & y) | (z & (x | y)) } function Sigma0 (x) { return (x >>> 2 | x << 30) ^ (x >>> 13 | x << 19) ^ (x >>> 22 | x << 10) } function Sigma1 (x) { return (x >>> 6 | x << 26) ^ (x >>> 11 | x << 21) ^ (x >>> 25 | x << 7) } function Gamma0 (x) { return (x >>> 7 | x << 25) ^ (x >>> 18 | x << 14) ^ (x >>> 3) } function Gamma1 (x) { return (x >>> 17 | x << 15) ^ (x >>> 19 | x << 13) ^ (x >>> 10) } Sha256.prototype._update = function (M) { var W = this._w var a = this._a | 0 var b = this._b | 0 var c = this._c | 0 var d = this._d | 0 var e = this._e | 0 var f = this._f | 0 var g = this._g | 0 var h = this._h | 0 var j = 0 function calcW () { return Gamma1(W[j - 2]) + W[j - 7] + Gamma0(W[j - 15]) + W[j - 16] } function loop (w) { W[j] = w var T1 = h + Sigma1(e) + Ch(e, f, g) + K[j] + w var T2 = Sigma0(a) + Maj(a, b, c) h = g g = f f = e e = d + T1 d = c c = b b = a a = T1 + T2 j++ } while (j < 16) loop(M.readInt32BE(j * 4)) while (j < 64) loop(calcW()) this._a = (a + this._a) | 0 this._b = (b + this._b) | 0 this._c = (c + this._c) | 0 this._d = (d + this._d) | 0 this._e = (e + this._e) | 0 this._f = (f + this._f) | 0 this._g = (g + this._g) | 0 this._h = (h + this._h) | 0 } Sha256.prototype._hash = function () { var H = new Buffer(32) H.writeInt32BE(this._a, 0) H.writeInt32BE(this._b, 4) H.writeInt32BE(this._c, 8) H.writeInt32BE(this._d, 12) H.writeInt32BE(this._e, 16) H.writeInt32BE(this._f, 20) H.writeInt32BE(this._g, 24) H.writeInt32BE(this._h, 28) return H } module.exports = Sha256 }).call(this,require("buffer").Buffer) },{"./hash":260,"buffer":45,"inherits":204}],262:[function(require,module,exports){ var ess = require('event-source-stream') var nets = require('nets') var pump = require('pump') var through = require('through2') var noop = function () {} module.exports = function (app, urls) { if (!app) throw new Error('app name required') if (!urls || !urls.length) throw new Error('signalhub url(s) required') var that = {} if (!Array.isArray(urls)) urls = [urls] urls = urls.map(function (url) { url = url.replace(/\/$/, '') return url.indexOf('://') === -1 ? 'http://' + url : url }) that.subscribe = function (channel) { var endpoint if (Array.isArray(channel)) { endpoint = channel.join(',') } else { endpoint = channel } var all = through.obj() var streams = urls.map(function (url) { return ess(url + '/v1/' + app + '/' + endpoint, {json: true}) }) if (streams.length === 1) return streams[0] var all = through.obj() all.setMaxListeners(0) streams.forEach(function (stream) { stream.on('open', function () { all.emit('open') }) pump(stream, all) }) return all } var broadcast = function (url, channel, message, cb) { nets({ method: 'POST', json: message, url: url + '/v1/' + app + '/' + channel }, function (err, res) { if (err) return cb(err) if (res.statusCode !== 200) return cb(new Error('Bad status: ' + res.statusCode)) cb() }) } that.broadcast = function (channel, message, cb) { if (!cb) cb = noop var pending = urls.length var errors = 0 urls.forEach(function (url) { broadcast(url, channel, message, function (err) { if (err) errors++ if (--pending) return if (errors === urls.length) return cb(err) cb() }) }) } return that } },{"event-source-stream":171,"nets":239,"pump":252,"through2":285}],263:[function(require,module,exports){ var varint = require('varint') exports.encode = function encode (v, b, o) { v = v >= 0 ? v*2 : v*-2 - 1 var r = varint.encode(v, b, o) encode.bytes = varint.encode.bytes return r } exports.decode = function decode (b, o) { var v = varint.decode(b, o) decode.bytes = varint.decode.bytes return v & 1 ? (v+1) / -2 : v / 2 } exports.encodingLength = function (v) { return varint.encodingLength(v >= 0 ? v*2 : v*-2 - 1) } },{"varint":266}],264:[function(require,module,exports){ module.exports = read var MSB = 0x80 , REST = 0x7F function read(buf, offset) { var res = 0 , offset = offset || 0 , shift = 0 , counter = offset , b , l = buf.length do { if(counter >= l) { read.bytesRead = 0 return undefined } b = buf[counter++] res += shift < 28 ? (b & REST) << shift : (b & REST) * Math.pow(2, shift) shift += 7 } while (b >= MSB) read.bytes = counter - offset return res } },{}],265:[function(require,module,exports){ module.exports = encode var MSB = 0x80 , REST = 0x7F , MSBALL = ~REST , INT = Math.pow(2, 31) function encode(num, out, offset) { out = out || [] offset = offset || 0 var oldOffset = offset while(num >= INT) { out[offset++] = (num & 0xFF) | MSB num /= 128 } while(num & MSBALL) { out[offset++] = (num & 0xFF) | MSB num >>>= 7 } out[offset] = num | 0 encode.bytes = offset - oldOffset + 1 return out } },{}],266:[function(require,module,exports){ module.exports = { encode: require('./encode.js') , decode: require('./decode.js') , encodingLength: require('./length.js') } },{"./decode.js":264,"./encode.js":265,"./length.js":267}],267:[function(require,module,exports){ var N1 = Math.pow(2, 7) var N2 = Math.pow(2, 14) var N3 = Math.pow(2, 21) var N4 = Math.pow(2, 28) var N5 = Math.pow(2, 35) var N6 = Math.pow(2, 42) var N7 = Math.pow(2, 49) module.exports = function (value) { return ( value < N1 ? 1 : value < N2 ? 2 : value < N3 ? 3 : value < N4 ? 4 : value < N5 ? 5 : value < N6 ? 6 : value < N7 ? 7 : 8 ) } },{}],268:[function(require,module,exports){ (function (Buffer){ /* global Blob */ module.exports = Peer var debug = require('debug')('simple-peer') var getBrowserRTC = require('get-browser-rtc') var hat = require('hat') var inherits = require('inherits') var isTypedArray = require('is-typedarray') var once = require('once') var stream = require('stream') inherits(Peer, stream.Duplex) /** * WebRTC peer connection. Same API as node core `net.Socket`, plus a few extra methods. * Duplex stream. * @param {Object} opts */ function Peer (opts) { var self = this if (!(self instanceof Peer)) return new Peer(opts) self._debug('new peer %o', opts) if (!opts) opts = {} opts.allowHalfOpen = false if (opts.highWaterMark == null) opts.highWaterMark = 1024 * 1024 stream.Duplex.call(self, opts) self.initiator = opts.initiator || false self.channelConfig = opts.channelConfig || Peer.channelConfig self.channelName = opts.initiator ? (opts.channelName || hat(160)) : null self.config = opts.config || Peer.config self.constraints = opts.constraints || Peer.constraints self.offerConstraints = opts.offerConstraints self.answerConstraints = opts.answerConstraints self.reconnectTimer = opts.reconnectTimer || false self.sdpTransform = opts.sdpTransform || function (sdp) { return sdp } self.stream = opts.stream || false self.trickle = opts.trickle !== undefined ? opts.trickle : true self.destroyed = false self.connected = false // so Peer object always has same shape (V8 optimization) self.remoteAddress = undefined self.remoteFamily = undefined self.remotePort = undefined self.localAddress = undefined self.localPort = undefined self._isWrtc = !!opts.wrtc // HACK: to fix `wrtc` bug. See issue: #60 self._wrtc = opts.wrtc || getBrowserRTC() if (!self._wrtc) { if (typeof window === 'undefined') { throw new Error('No WebRTC support: Specify `opts.wrtc` option in this environment') } else { throw new Error('No WebRTC support: Not a supported browser') } } self._maxBufferedAmount = opts.highWaterMark self._pcReady = false self._channelReady = false self._iceComplete = false // ice candidate trickle done (got null candidate) self._channel = null self._pendingCandidates = [] self._chunk = null self._cb = null self._interval = null self._reconnectTimeout = null self._pc = new (self._wrtc.RTCPeerConnection)(self.config, self.constraints) self._pc.oniceconnectionstatechange = self._onIceConnectionStateChange.bind(self) self._pc.onsignalingstatechange = self._onSignalingStateChange.bind(self) self._pc.onicecandidate = self._onIceCandidate.bind(self) if (self.stream) self._pc.addStream(self.stream) self._pc.onaddstream = self._onAddStream.bind(self) if (self.initiator) { self._setupData({ channel: self._pc.createDataChannel(self.channelName, self.channelConfig) }) self._pc.onnegotiationneeded = once(self._createOffer.bind(self)) // Only Chrome triggers "negotiationneeded"; this is a workaround for other // implementations if (typeof window === 'undefined' || !window.webkitRTCPeerConnection) { self._pc.onnegotiationneeded() } } else { self._pc.ondatachannel = self._setupData.bind(self) } self.on('finish', function () { if (self.connected) { // When local peer is finished writing, close connection to remote peer. // Half open connections are currently not supported. // Wait a bit before destroying so the datachannel flushes. // TODO: is there a more reliable way to accomplish this? setTimeout(function () { self._destroy() }, 100) } else { // If data channel is not connected when local peer is finished writing, wait until // data is flushed to network at "connect" event. // TODO: is there a more reliable way to accomplish this? self.once('connect', function () { setTimeout(function () { self._destroy() }, 100) }) } }) } Peer.WEBRTC_SUPPORT = !!getBrowserRTC() /** * Expose config, constraints, and data channel config for overriding all Peer * instances. Otherwise, just set opts.config, opts.constraints, or opts.channelConfig * when constructing a Peer. */ Peer.config = { iceServers: [ { url: 'stun:23.21.150.121', // deprecated, replaced by `urls` urls: 'stun:23.21.150.121' } ] } Peer.constraints = {} Peer.channelConfig = {} Object.defineProperty(Peer.prototype, 'bufferSize', { get: function () { var self = this return (self._channel && self._channel.bufferedAmount) || 0 } }) Peer.prototype.address = function () { var self = this return { port: self.localPort, family: 'IPv4', address: self.localAddress } } Peer.prototype.signal = function (data) { var self = this if (self.destroyed) throw new Error('cannot signal after peer is destroyed') if (typeof data === 'string') { try { data = JSON.parse(data) } catch (err) { data = {} } } self._debug('signal()') function addIceCandidate (candidate) { try { self._pc.addIceCandidate( new self._wrtc.RTCIceCandidate(candidate), noop, self._onError.bind(self) ) } catch (err) { self._destroy(new Error('error adding candidate: ' + err.message)) } } if (data.sdp) { self._pc.setRemoteDescription(new (self._wrtc.RTCSessionDescription)(data), function () { if (self.destroyed) return if (self._pc.remoteDescription.type === 'offer') self._createAnswer() self._pendingCandidates.forEach(addIceCandidate) self._pendingCandidates = [] }, self._onError.bind(self)) } if (data.candidate) { if (self._pc.remoteDescription) addIceCandidate(data.candidate) else self._pendingCandidates.push(data.candidate) } if (!data.sdp && !data.candidate) { self._destroy(new Error('signal() called with invalid signal data')) } } /** * Send text/binary data to the remote peer. * @param {TypedArrayView|ArrayBuffer|Buffer|string|Blob|Object} chunk */ Peer.prototype.send = function (chunk) { var self = this if (!isTypedArray.strict(chunk) && !(chunk instanceof ArrayBuffer) && !Buffer.isBuffer(chunk) && typeof chunk !== 'string' && (typeof Blob === 'undefined' || !(chunk instanceof Blob))) { chunk = JSON.stringify(chunk) } // HACK: `wrtc` module doesn't accept node.js buffer. See issue: #60 if (Buffer.isBuffer(chunk) && self._isWrtc) { chunk = new Uint8Array(chunk) } var len = chunk.length || chunk.byteLength || chunk.size self._channel.send(chunk) self._debug('write: %d bytes', len) } Peer.prototype.destroy = function (onclose) { var self = this self._destroy(null, onclose) } Peer.prototype._destroy = function (err, onclose) { var self = this if (self.destroyed) return if (onclose) self.once('close', onclose) self._debug('destroy (error: %s)', err && err.message) self.readable = self.writable = false if (!self._readableState.ended) self.push(null) if (!self._writableState.finished) self.end() self.destroyed = true self.connected = false self._pcReady = false self._channelReady = false self._chunk = null self._cb = null clearInterval(self._interval) clearTimeout(self._reconnectTimeout) if (self._pc) { try { self._pc.close() } catch (err) {} self._pc.oniceconnectionstatechange = null self._pc.onsignalingstatechange = null self._pc.onicecandidate = null } if (self._channel) { try { self._channel.close() } catch (err) {} self._channel.onmessage = null self._channel.onopen = null self._channel.onclose = null } self._pc = null self._channel = null if (err) self.emit('error', err) self.emit('close') } Peer.prototype._setupData = function (event) { var self = this self._channel = event.channel self.channelName = self._channel.label self._channel.binaryType = 'arraybuffer' self._channel.onmessage = self._onChannelMessage.bind(self) self._channel.onopen = self._onChannelOpen.bind(self) self._channel.onclose = self._onChannelClose.bind(self) } Peer.prototype._read = function () {} Peer.prototype._write = function (chunk, encoding, cb) { var self = this if (self.destroyed) return cb(new Error('cannot write after peer is destroyed')) if (self.connected) { try { self.send(chunk) } catch (err) { return self._onError(err) } if (self._channel.bufferedAmount > self._maxBufferedAmount) { self._debug('start backpressure: bufferedAmount %d', self._channel.bufferedAmount) self._cb = cb } else { cb(null) } } else { self._debug('write before connect') self._chunk = chunk self._cb = cb } } Peer.prototype._createOffer = function () { var self = this if (self.destroyed) return self._pc.createOffer(function (offer) { if (self.destroyed) return offer.sdp = self.sdpTransform(offer.sdp) self._pc.setLocalDescription(offer, noop, self._onError.bind(self)) var sendOffer = function () { var signal = self._pc.localDescription || offer self._debug('signal') self.emit('signal', { type: signal.type, sdp: signal.sdp }) } if (self.trickle || self._iceComplete) sendOffer() else self.once('_iceComplete', sendOffer) // wait for candidates }, self._onError.bind(self), self.offerConstraints) } Peer.prototype._createAnswer = function () { var self = this if (self.destroyed) return self._pc.createAnswer(function (answer) { if (self.destroyed) return answer.sdp = self.sdpTransform(answer.sdp) self._pc.setLocalDescription(answer, noop, self._onError.bind(self)) var sendAnswer = function () { var signal = self._pc.localDescription || answer self._debug('signal') self.emit('signal', { type: signal.type, sdp: signal.sdp }) } if (self.trickle || self._iceComplete) sendAnswer() else self.once('_iceComplete', sendAnswer) }, self._onError.bind(self), self.answerConstraints) } Peer.prototype._onIceConnectionStateChange = function () { var self = this if (self.destroyed) return var iceGatheringState = self._pc.iceGatheringState var iceConnectionState = self._pc.iceConnectionState self._debug('iceConnectionStateChange %s %s', iceGatheringState, iceConnectionState) self.emit('iceConnectionStateChange', iceGatheringState, iceConnectionState) if (iceConnectionState === 'connected' || iceConnectionState === 'completed') { clearTimeout(self._reconnectTimeout) self._pcReady = true self._maybeReady() } if (iceConnectionState === 'disconnected') { if (self.reconnectTimer) { // If user has set `opt.reconnectTimer`, allow time for ICE to attempt a reconnect clearTimeout(self._reconnectTimeout) self._reconnectTimeout = setTimeout(function () { self._destroy() }, self.reconnectTimer) } else { self._destroy() } } if (iceConnectionState === 'failed') { self._destroy() } if (iceConnectionState === 'closed') { self._destroy() } } Peer.prototype._maybeReady = function () { var self = this self._debug('maybeReady pc %s channel %s', self._pcReady, self._channelReady) if (self.connected || self._connecting || !self._pcReady || !self._channelReady) return self._connecting = true if (!self._pc.getStats) { onStats([]) } else if (typeof window !== 'undefined' && !!window.mozRTCPeerConnection) { self._pc.getStats(null, function (res) { var items = [] res.forEach(function (item) { items.push(item) }) onStats(items) }, self._onError.bind(self)) } else { self._pc.getStats(function (res) { var items = [] res.result().forEach(function (result) { var item = {} result.names().forEach(function (name) { item[name] = result.stat(name) }) item.id = result.id item.type = result.type item.timestamp = result.timestamp items.push(item) }) onStats(items) }) } function onStats (items) { items.forEach(function (item) { if (item.type === 'remotecandidate' && item.candidateType === 'host') { self.remoteAddress = item.ipAddress self.remotePort = Number(item.portNumber) self.remoteFamily = 'IPv4' self._debug( 'connect remote: %s:%s (%s)', self.remoteAddress, self.remotePort, self.remoteFamily ) } else if (item.type === 'localcandidate' && item.candidateType === 'host') { self.localAddress = item.ipAddress self.localPort = Number(item.portNumber) self._debug('connect local: %s:%s', self.localAddress, self.localPort) } }) self._connecting = false self.connected = true if (self._chunk) { try { self.send(self._chunk) } catch (err) { return self._onError(err) } self._chunk = null self._debug('sent chunk from "write before connect"') var cb = self._cb self._cb = null cb(null) } self._interval = setInterval(function () { if (!self._cb || !self._channel || self._channel.bufferedAmount > self._maxBufferedAmount) return self._debug('ending backpressure: bufferedAmount %d', self._channel.bufferedAmount) var cb = self._cb self._cb = null cb(null) }, 150) if (self._interval.unref) self._interval.unref() self._debug('connect') self.emit('connect') } } Peer.prototype._onSignalingStateChange = function () { var self = this if (self.destroyed) return self._debug('signalingStateChange %s', self._pc.signalingState) self.emit('signalingStateChange', self._pc.signalingState) } Peer.prototype._onIceCandidate = function (event) { var self = this if (self.destroyed) return if (event.candidate && self.trickle) { self.emit('signal', { candidate: { candidate: event.candidate.candidate, sdpMLineIndex: event.candidate.sdpMLineIndex, sdpMid: event.candidate.sdpMid } }) } else if (!event.candidate) { self._iceComplete = true self.emit('_iceComplete') } } Peer.prototype._onChannelMessage = function (event) { var self = this if (self.destroyed) return var data = event.data self._debug('read: %d bytes', data.byteLength || data.length) if (data instanceof ArrayBuffer) { data = new Buffer(data) self.push(data) } else { try { data = JSON.parse(data) } catch (err) {} self.emit('data', data) } } Peer.prototype._onChannelOpen = function () { var self = this if (self.connected || self.destroyed) return self._debug('on channel open') self._channelReady = true self._maybeReady() } Peer.prototype._onChannelClose = function () { var self = this if (self.destroyed) return self._debug('on channel close') self._destroy() } Peer.prototype._onAddStream = function (event) { var self = this if (self.destroyed) return self._debug('on add stream') self.emit('stream', event.stream) } Peer.prototype._onError = function (err) { var self = this if (self.destroyed) return self._debug('error %s', err.message || err) self._destroy(err) } Peer.prototype._debug = function () { var self = this var args = [].slice.call(arguments) var id = self.channelName && self.channelName.substring(0, 7) args[0] = '[' + id + '] ' + args[0] debug.apply(null, args) } function noop () {} }).call(this,require("buffer").Buffer) },{"buffer":45,"debug":152,"get-browser-rtc":184,"hat":187,"inherits":204,"is-typedarray":208,"once":240,"stream":131}],269:[function(require,module,exports){ (function (Buffer){ var sodium = require('libsodium-wrappers') function I(b) { return Buffer.isBuffer(b) ? new Uint8Array(b) : b } function B(b) { return (b instanceof Uint8Array) ? new Buffer(b) : b } function bufferize(fn) { if('function' !== typeof fn) throw new Error('not a function') return function () { var args = [].map.call(arguments, I) var r = B(fn.apply(this, args)) return r } } function keys (k) { return { publicKey: B(k.publicKey), secretKey: B(k.secretKey || k.privateKey) } } exports.crypto_sign_seed_keypair = function (seed) { return keys(sodium.crypto_sign_seed_keypair(I(seed))) } exports.crypto_sign_keypair = function () { return keys(sodium.crypto_sign_keypair()) } exports.crypto_box_keypair = function () { return keys(sodium.crypto_box_keypair()) } ;[ 'sign_verify_detached', 'sign_detached', 'sign', 'sign_open', 'sign_ed25519_pk_to_curve25519', 'sign_ed25519_sk_to_curve25519', 'scalarmult', 'secretbox_easy', 'secretbox_open_easy', 'box_easy', 'box_open_easy', 'auth', 'auth_verify', 'hash' ].forEach(function (name) { if(name === 'auth_verify') { //this is inconsistent with sign_verify!! var fn = bufferize(sodium.crypto_auth_verify) exports['crypto_'+name] = function (msg, tok, key) { return fn(msg, tok, key) ? 0 : 1 } } else exports['crypto_'+name] = bufferize(sodium['crypto_'+name]) }) var Sha256 = require('sha.js/sha256') exports.crypto_hash_sha256 = function (msg) { return new Sha256().update(msg).digest() } function nullIfThrew (fn) { return function () { try { return fn.apply(this, [].slice.call(arguments)) } catch (err) { return null } } } exports.crypto_secretbox_open_easy = nullIfThrew(exports.crypto_secretbox_open_easy) exports.crypto_box_open_easy = nullIfThrew(exports.crypto_box_open_easy) }).call(this,require("buffer").Buffer) },{"buffer":45,"libsodium-wrappers":231,"sha.js/sha256":261}],270:[function(require,module,exports){ var once = require('once') module.exports = function(stream, cb) { if (!cb) return stream var list = [] cb = once(cb) stream.on('data', function(data) { list.push(data) }) stream.on('end', function() { cb(null, list) }) stream.on('close', function() { cb(new Error('Premature close')) }) stream.on('error', cb) return stream } },{"once":240}],271:[function(require,module,exports){ var nargs = /\{([0-9a-zA-Z]+)\}/g var slice = Array.prototype.slice module.exports = template function template(string) { var args if (arguments.length === 2 && typeof arguments[1] === "object") { args = arguments[1] } else { args = slice.call(arguments, 1) } if (!args || !args.hasOwnProperty) { args = {} } return string.replace(nargs, function replaceArg(match, i, index) { var result if (string[index - 1] === "{" && string[index + match.length] === "}") { return i } else { result = args.hasOwnProperty(i) ? args[i] : null if (result === null || result === undefined) { return "" } return result } }) } },{}],272:[function(require,module,exports){ arguments[4][132][0].apply(exports,arguments) },{"buffer":45,"dup":132}],273:[function(require,module,exports){ (function (Buffer){ var swarm = require('webrtc-swarm') var signalhub = require('signalhub') var hsodium = require('hyperlog-sodium') var hyperlog = require('hyperlog') var defined = require('defined') var through = require('through2') var pump = require('pump') module.exports = function (opts) { if (typeof opts === 'string') opts = { id: opts } if (!opts) opts = {} var keys = opts.keys || {} var kopts = { publicKey: normkey(defined( opts.publicKey, opts.public, opts.pub, opts.identity, opts.id, keys.publicKey, keys.public, keys.pub, keys.identity, keys.id )), secretKey: normkey(defined( opts.secretKey, opts.secret, opts.private, opts.priv, keys.secretKey, keys.secret, keys.private, keys.priv )) } var topic = kopts.publicKey.toString('hex') var log = hyperlog(opts.db, hsodium(opts.sodium, kopts, opts)) var hub = signalhub('swarmlog.' + topic, opts.hubs) var sw = swarm(hub, opts) var peerStream = opts.peerStream || function (peer) { return peer } sw.on('peer', function (peer, id) { var stream = peerStream(peer) pump(stream, toBuffer(), log.replicate({ live: true }), stream) }) return log } function normkey (id) { if (/\.ed25519$/.test(id)) { var b64 = id.replace(/\.ed25519$/,'').replace(/^@/,'') return Buffer(b64,'base64') } else if (Buffer.isBuffer(id)) { return id } else if (id) return Buffer(id, 'hex') } function toBuffer () { return through.obj(function (buf, enc, next) { next(null, Buffer.isBuffer(buf) ? buf : Buffer(buf)) }) } }).call(this,require("buffer").Buffer) },{"buffer":45,"defined":156,"hyperlog":189,"hyperlog-sodium":188,"pump":252,"signalhub":262,"through2":279,"webrtc-swarm":319}],274:[function(require,module,exports){ arguments[4][113][0].apply(exports,arguments) },{"./_stream_readable":275,"./_stream_writable":277,"core-util-is":150,"dup":113,"inherits":204,"process-nextick-args":243}],275:[function(require,module,exports){ (function (process){ 'use strict'; module.exports = Readable; /**/ var processNextTick = require('process-nextick-args'); /**/ /**/ var isArray = require('isarray'); /**/ /**/ var Buffer = require('buffer').Buffer; /**/ Readable.ReadableState = ReadableState; var EE = require('events'); /**/ var EElistenerCount = function(emitter, type) { return emitter.listeners(type).length; }; /**/ /**/ var Stream; (function (){try{ Stream = require('st' + 'ream'); }catch(_){}finally{ if (!Stream) Stream = require('events').EventEmitter; }}()) /**/ var Buffer = require('buffer').Buffer; /**/ var util = require('core-util-is'); util.inherits = require('inherits'); /**/ /**/ var debugUtil = require('util'); var debug; if (debugUtil && debugUtil.debuglog) { debug = debugUtil.debuglog('stream'); } else { debug = function () {}; } /**/ var StringDecoder; util.inherits(Readable, Stream); var Duplex; function ReadableState(options, stream) { Duplex = Duplex || require('./_stream_duplex'); options = options || {}; // object stream flag. Used to make read(n) ignore n and to // make all the buffer merging and length checks go away this.objectMode = !!options.objectMode; if (stream instanceof Duplex) this.objectMode = this.objectMode || !!options.readableObjectMode; // the point at which it stops calling _read() to fill the buffer // Note: 0 is a valid value, means "don't call _read preemptively ever" var hwm = options.highWaterMark; var defaultHwm = this.objectMode ? 16 : 16 * 1024; this.highWaterMark = (hwm || hwm === 0) ? hwm : defaultHwm; // cast to ints. this.highWaterMark = ~~this.highWaterMark; this.buffer = []; this.length = 0; this.pipes = null; this.pipesCount = 0; this.flowing = null; this.ended = false; this.endEmitted = false; this.reading = false; // a flag to be able to tell if the onwrite cb is called immediately, // or on a later tick. We set this to true at first, because any // actions that shouldn't happen until "later" should generally also // not happen before the first write call. this.sync = true; // whenever we return null, then we set a flag to say // that we're awaiting a 'readable' event emission. this.needReadable = false; this.emittedReadable = false; this.readableListening = false; // Crypto is kind of old and crusty. Historically, its default string // encoding is 'binary' so we have to make this configurable. // Everything else in the universe uses 'utf8', though. this.defaultEncoding = options.defaultEncoding || 'utf8'; // when piping, we only care about 'readable' events that happen // after read()ing all the bytes and not getting any pushback. this.ranOut = false; // the number of writers that are awaiting a drain event in .pipe()s this.awaitDrain = 0; // if true, a maybeReadMore has been scheduled this.readingMore = false; this.decoder = null; this.encoding = null; if (options.encoding) { if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder; this.decoder = new StringDecoder(options.encoding); this.encoding = options.encoding; } } var Duplex; function Readable(options) { Duplex = Duplex || require('./_stream_duplex'); if (!(this instanceof Readable)) return new Readable(options); this._readableState = new ReadableState(options, this); // legacy this.readable = true; if (options && typeof options.read === 'function') this._read = options.read; Stream.call(this); } // Manually shove something into the read() buffer. // This returns true if the highWaterMark has not been hit yet, // similar to how Writable.write() returns true if you should // write() some more. Readable.prototype.push = function(chunk, encoding) { var state = this._readableState; if (!state.objectMode && typeof chunk === 'string') { encoding = encoding || state.defaultEncoding; if (encoding !== state.encoding) { chunk = new Buffer(chunk, encoding); encoding = ''; } } return readableAddChunk(this, state, chunk, encoding, false); }; // Unshift should *always* be something directly out of read() Readable.prototype.unshift = function(chunk) { var state = this._readableState; return readableAddChunk(this, state, chunk, '', true); }; Readable.prototype.isPaused = function() { return this._readableState.flowing === false; }; function readableAddChunk(stream, state, chunk, encoding, addToFront) { var er = chunkInvalid(state, chunk); if (er) { stream.emit('error', er); } else if (chunk === null) { state.reading = false; onEofChunk(stream, state); } else if (state.objectMode || chunk && chunk.length > 0) { if (state.ended && !addToFront) { var e = new Error('stream.push() after EOF'); stream.emit('error', e); } else if (state.endEmitted && addToFront) { var e = new Error('stream.unshift() after end event'); stream.emit('error', e); } else { if (state.decoder && !addToFront && !encoding) chunk = state.decoder.write(chunk); if (!addToFront) state.reading = false; // if we want the data now, just emit it. if (state.flowing && state.length === 0 && !state.sync) { stream.emit('data', chunk); stream.read(0); } else { // update the buffer info. state.length += state.objectMode ? 1 : chunk.length; if (addToFront) state.buffer.unshift(chunk); else state.buffer.push(chunk); if (state.needReadable) emitReadable(stream); } maybeReadMore(stream, state); } } else if (!addToFront) { state.reading = false; } return needMoreData(state); } // if it's past the high water mark, we can push in some more. // Also, if we have no data yet, we can stand some // more bytes. This is to work around cases where hwm=0, // such as the repl. Also, if the push() triggered a // readable event, and the user called read(largeNumber) such that // needReadable was set, then we ought to push more, so that another // 'readable' event will be triggered. function needMoreData(state) { return !state.ended && (state.needReadable || state.length < state.highWaterMark || state.length === 0); } // backwards compatibility. Readable.prototype.setEncoding = function(enc) { if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder; this._readableState.decoder = new StringDecoder(enc); this._readableState.encoding = enc; return this; }; // Don't raise the hwm > 8MB var MAX_HWM = 0x800000; function computeNewHighWaterMark(n) { if (n >= MAX_HWM) { n = MAX_HWM; } else { // Get the next highest power of 2 n--; n |= n >>> 1; n |= n >>> 2; n |= n >>> 4; n |= n >>> 8; n |= n >>> 16; n++; } return n; } function howMuchToRead(n, state) { if (state.length === 0 && state.ended) return 0; if (state.objectMode) return n === 0 ? 0 : 1; if (n === null || isNaN(n)) { // only flow one buffer at a time if (state.flowing && state.buffer.length) return state.buffer[0].length; else return state.length; } if (n <= 0)="" return="" 0;="" if="" we're="" asking="" for="" more="" than="" the="" target="" buffer="" level,="" then="" raise="" water="" mark.="" bump="" up="" to="" next="" highest="" power="" of="" 2,="" prevent="" increasing="" it="" excessively="" in="" tiny="" amounts.="" (n=""> state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n); // don't have that much. return null, unless we've ended. if (n > state.length) { if (!state.ended) { state.needReadable = true; return 0; } else { return state.length; } } return n; } // you can override either this method, or the async _read(n) below. Readable.prototype.read = function(n) { debug('read', n); var state = this._readableState; var nOrig = n; if (typeof n !== 'number' || n > 0) state.emittedReadable = false; // if we're doing read(0) to trigger a readable event, but we // already have a bunch of data in the buffer, then just trigger // the 'readable' event and move on. if (n === 0 && state.needReadable && (state.length >= state.highWaterMark || state.ended)) { debug('read: emitReadable', state.length, state.ended); if (state.length === 0 && state.ended) endReadable(this); else emitReadable(this); return null; } n = howMuchToRead(n, state); // if we've ended, and we're now clear, then finish it up. if (n === 0 && state.ended) { if (state.length === 0) endReadable(this); return null; } // All the actual chunk generation logic needs to be // *below* the call to _read. The reason is that in certain // synthetic stream cases, such as passthrough streams, _read // may be a completely synchronous operation which may change // the state of the read buffer, providing enough data when // before there was *not* enough. // // So, the steps are: // 1. Figure out what the state of things will be after we do // a read from the buffer. // // 2. If that resulting state will trigger a _read, then call _read. // Note that this may be asynchronous, or synchronous. Yes, it is // deeply ugly to write APIs this way, but that still doesn't mean // that the Readable class should behave improperly, as streams are // designed to be sync/async agnostic. // Take note if the _read call is sync or async (ie, if the read call // has returned yet), so that we know whether or not it's safe to emit // 'readable' etc. // // 3. Actually pull the requested chunks out of the buffer and return. // if we need a readable event, then we need to do some reading. var doRead = state.needReadable; debug('need readable', doRead); // if we currently have less than the highWaterMark, then also read some if (state.length === 0 || state.length - n < state.highWaterMark) { doRead = true; debug('length less than watermark', doRead); } // however, if we've ended, then there's no point, and if we're already // reading, then it's unnecessary. if (state.ended || state.reading) { doRead = false; debug('reading or ended', doRead); } if (doRead) { debug('do read'); state.reading = true; state.sync = true; // if the length is currently zero, then we *need* a readable event. if (state.length === 0) state.needReadable = true; // call internal read method this._read(state.highWaterMark); state.sync = false; } // If _read pushed data synchronously, then `reading` will be false, // and we need to re-evaluate how much data we can return to the user. if (doRead && !state.reading) n = howMuchToRead(nOrig, state); var ret; if (n > 0) ret = fromList(n, state); else ret = null; if (ret === null) { state.needReadable = true; n = 0; } state.length -= n; // If we have nothing in the buffer, then we want to know // as soon as we *do* get something into the buffer. if (state.length === 0 && !state.ended) state.needReadable = true; // If we tried to read() past the EOF, then emit end on the next tick. if (nOrig !== n && state.ended && state.length === 0) endReadable(this); if (ret !== null) this.emit('data', ret); return ret; }; function chunkInvalid(state, chunk) { var er = null; if (!(Buffer.isBuffer(chunk)) && typeof chunk !== 'string' && chunk !== null && chunk !== undefined && !state.objectMode) { er = new TypeError('Invalid non-string/buffer chunk'); } return er; } function onEofChunk(stream, state) { if (state.ended) return; if (state.decoder) { var chunk = state.decoder.end(); if (chunk && chunk.length) { state.buffer.push(chunk); state.length += state.objectMode ? 1 : chunk.length; } } state.ended = true; // emit 'readable' now to make sure it gets picked up. emitReadable(stream); } // Don't emit readable right away in sync mode, because this can trigger // another read() call => stack overflow. This way, it might trigger // a nextTick recursion warning, but that's not so bad. function emitReadable(stream) { var state = stream._readableState; state.needReadable = false; if (!state.emittedReadable) { debug('emitReadable', state.flowing); state.emittedReadable = true; if (state.sync) processNextTick(emitReadable_, stream); else emitReadable_(stream); } } function emitReadable_(stream) { debug('emit readable'); stream.emit('readable'); flow(stream); } // at this point, the user has presumably seen the 'readable' event, // and called read() to consume some data. that may have triggered // in turn another _read(n) call, in which case reading = true if // it's in progress. // However, if we're not ended, or reading, and the length < hwm, // then go ahead and try to read some more preemptively. function maybeReadMore(stream, state) { if (!state.readingMore) { state.readingMore = true; processNextTick(maybeReadMore_, stream, state); } } function maybeReadMore_(stream, state) { var len = state.length; while (!state.reading && !state.flowing && !state.ended && state.length < state.highWaterMark) { debug('maybeReadMore read 0'); stream.read(0); if (len === state.length) // didn't get any data, stop spinning. break; else len = state.length; } state.readingMore = false; } // abstract method. to be overridden in specific implementation classes. // call cb(er, data) where data is <= 0="" 1="" n="" in="" length.="" for="" virtual="" (non-string,="" non-buffer)="" streams,="" "length"="" is="" somewhat="" arbitrary,="" and="" perhaps="" not="" very="" meaningful.="" readable.prototype._read="function(n)" {="" this.emit('error',="" new="" error('not="" implemented'));="" };="" readable.prototype.pipe="function(dest," pipeopts)="" var="" src="this;" state="this._readableState;" switch="" (state.pipescount)="" case="" 0:="" state.pipes="dest;" break;="" 1:="" dest];="" default:="" state.pipes.push(dest);="" }="" state.pipescount="" +="1;" debug('pipe="" count="%d" opts="%j'," state.pipescount,="" pipeopts);="" doend="(!pipeOpts" ||="" pipeopts.end="" !="=" false)="" &&="" dest="" process.stdout="" process.stderr;="" endfn="doEnd" ?="" onend="" :="" cleanup;="" if="" (state.endemitted)="" processnexttick(endfn);="" else="" src.once('end',="" endfn);="" dest.on('unpipe',="" onunpipe);="" function="" onunpipe(readable)="" debug('onunpipe');="" (readable="==" src)="" cleanup();="" onend()="" debug('onend');="" dest.end();="" when="" the="" drains,="" it="" reduces="" awaitdrain="" counter="" on="" source.="" this="" would="" be="" more="" elegant="" with="" a="" .once()="" handler="" flow(),="" but="" adding="" removing="" repeatedly="" too="" slow.="" ondrain="pipeOnDrain(src);" dest.on('drain',="" ondrain);="" cleanedup="false;" cleanup()="" debug('cleanup');="" cleanup="" event="" handlers="" once="" pipe="" broken="" dest.removelistener('close',="" onclose);="" dest.removelistener('finish',="" onfinish);="" dest.removelistener('drain',="" dest.removelistener('error',="" onerror);="" dest.removelistener('unpipe',="" src.removelistener('end',="" onend);="" cleanup);="" src.removelistener('data',="" ondata);="" reader="" waiting="" drain="" from="" specific="" writer,="" then="" cause="" to="" never="" start="" flowing="" again.="" so,="" awaiting="" drain,="" we="" just="" call="" now.="" don't="" know,="" assume="" that="" are="" one.="" (state.awaitdrain="" (!dest._writablestate="" dest._writablestate.needdrain))="" ondrain();="" src.on('data',="" ondata(chunk)="" debug('ondata');="" ret="dest.write(chunk);" (false="==" ret)="" user="" unpiped="" during="" `dest.write()`,="" possible="" get="" stuck="" permanently="" paused="" write="" also="" returned="" false.="" (state.pipescount="==" state.pipes[0]="==" src.listenercount('data')="==" !cleanedup)="" debug('false="" response,="" pause',="" src._readablestate.awaitdrain);="" src._readablestate.awaitdrain++;="" src.pause();="" has="" an="" error,="" stop="" piping="" into="" it.="" however,="" suppress="" throwing="" behavior="" this.="" onerror(er)="" debug('onerror',="" er);="" unpipe();="" (eelistenercount(dest,="" 'error')="==" 0)="" dest.emit('error',="" brutally="" ugly="" hack="" make="" sure="" our="" error="" attached="" before="" any="" userland="" ones.="" do="" (!dest._events="" !dest._events.error)="" dest.on('error',="" (isarray(dest._events.error))="" dest._events.error.unshift(onerror);="" dest._events.error="[onerror," dest._events.error];="" both="" close="" finish="" should="" trigger="" unpipe,="" only="" once.="" onclose()="" dest.once('close',="" onfinish()="" debug('onfinish');="" dest.once('finish',="" unpipe()="" debug('unpipe');="" src.unpipe(dest);="" tell="" it's="" being="" piped="" dest.emit('pipe',="" src);="" flow="" hasn't="" been="" started="" already.="" (!state.flowing)="" resume');="" src.resume();="" return="" dest;="" pipeondrain(src)="" function()="" debug('pipeondrain',="" state.awaitdrain);="" (state.awaitdrain)="" state.awaitdrain--;="" eelistenercount(src,="" 'data'))="" state.flowing="true;" flow(src);="" readable.prototype.unpipe="function(dest)" we're="" anywhere,="" nothing.="" this;="" one="" destination.="" most="" common="" case.="" 1)="" passed="" one,="" right="" (dest="" state.pipes)="" (!dest)="" got="" match.="" (dest)="" dest.emit('unpipe',="" this);="" slow="" multiple destinations.="" remove="" all.="" dests="state.pipes;" len="state.pipesCount;" (var="" i="0;" <="" len;="" i++)="" dests[i].emit('unpipe',="" try="" find="" dest);="" (i="==" -1)="" state.pipes.splice(i,="" 1);="" -="1;" set="" up="" data="" events="" they="" asked="" ensure="" readable="" listeners="" eventually="" something="" readable.prototype.on="function(ev," fn)="" res="Stream.prototype.on.call(this," ev,="" fn);="" listening="" data,="" explicitly="" paused,="" resume="" of="" next="" tick.="" (ev="==" 'data'="" false="" this._readablestate.flowing)="" this.resume();="" 'readable'="" this.readable)="" (!state.readablelistening)="" state.readablelistening="true;" state.emittedreadable="false;" state.needreadable="true;" (!state.reading)="" processnexttick(nreadingnexttick,="" (state.length)="" emitreadable(this,="" state);="" res;="" readable.prototype.addlistener="Readable.prototype.on;" nreadingnexttick(self)="" debug('readable="" nexttick="" read="" 0');="" self.read(0);="" pause()="" resume()="" remnants="" legacy="" stream="" api="" uses="" them,="" old="" mode.="" readable.prototype.resume="function()" debug('resume');="" resume(this,="" resume(stream,="" state)="" (!state.resumescheduled)="" state.resumescheduled="true;" processnexttick(resume_,="" stream,="" resume_(stream,="" debug('resume="" stream.read(0);="" stream.emit('resume');="" flow(stream);="" (state.flowing="" !state.reading)="" readable.prototype.pause="function()" debug('call="" pause="" this._readablestate.flowing);="" debug('pause');="" this._readablestate.flowing="false;" this.emit('pause');="" flow(stream)="" debug('flow',="" state.flowing);="" (state.flowing)="" chunk="stream.read();" while="" (null="" wrap="" old-style="" as="" async *not*="" part="" interface.="" unfortunate="" mess="" history.="" readable.prototype.wrap="function(stream)" self="this;" stream.on('end',="" debug('wrapped="" end');="" (state.decoder="" !state.ended)="" (chunk="" chunk.length)="" self.push(chunk);="" self.push(null);="" });="" stream.on('data',="" function(chunk)="" data');="" (state.decoder)="" skip="" over="" falsy="" values="" objectmode="" (state.objectmode="" null="" undefined))="" return;="" (!state.objectmode="" (!chunk="" !chunk.length))="" (!ret)="" stream.pause();="" proxy="" all="" other="" methods.="" important="" wrapping="" filters="" duplexes.="" stream)="" (this[i]="==" undefined="" typeof="" stream[i]="==" 'function')="" this[i]="function(method)" stream[method].apply(stream,="" arguments);="" }(i);="" certain="" events.="" 'close',="" 'destroy',="" 'pause',="" 'resume'];="" foreach(events,="" function(ev)="" stream.on(ev,="" self.emit.bind(self,="" ev));="" consume="" some="" bytes,="" simply="" unpause="" underlying="" stream.="" self._read="function(n)" _read',="" n);="" (paused)="" stream.resume();="" self;="" exposed="" testing="" purposes="" only.="" readable._fromlist="fromList;" pluck="" off="" bytes="" array="" buffers.="" length="" combined="" lengths="" buffers="" list.="" fromlist(n,="" list="state.buffer;" stringmode="!!state.decoder;" ret;="" nothing="" list,="" definitely="" empty.="" (list.length="==" null;="" (length="==" (objectmode)="" (!n="">= length) { // read it all, truncate the array. if (stringMode) ret = list.join(''); else if (list.length === 1) ret = list[0]; else ret = Buffer.concat(list, length); list.length = 0; } else { // read just some of it. if (n < list[0].length) { // just take a part of the first list item. // slice is the same for buffers and strings. var buf = list[0]; ret = buf.slice(0, n); list[0] = buf.slice(n); } else if (n === list[0].length) { // first list is a perfect match ret = list.shift(); } else { // complex case. // we have enough to cover it, but it spans past the first buffer. if (stringMode) ret = ''; else ret = new Buffer(n); var c = 0; for (var i = 0, l = list.length; i < l && c < n; i++) { var buf = list[0]; var cpy = Math.min(n - c, buf.length); if (stringMode) ret += buf.slice(0, cpy); else buf.copy(ret, c, 0, cpy); if (cpy < buf.length) list[0] = buf.slice(cpy); else list.shift(); c += cpy; } } } return ret; } function endReadable(stream) { var state = stream._readableState; // If we get here before consuming all the bytes, then that is a // bug in node. Should never happen. if (state.length > 0) throw new Error('endReadable called on non-empty stream'); if (!state.endEmitted) { state.ended = true; processNextTick(endReadableNT, state, stream); } } function endReadableNT(state, stream) { // Check that we didn't get one last unshift. if (!state.endEmitted && state.length === 0) { state.endEmitted = true; stream.readable = false; stream.emit('end'); } } function forEach (xs, f) { for (var i = 0, l = xs.length; i < l; i++) { f(xs[i], i); } } function indexOf (xs, x) { for (var i = 0, l = xs.length; i < l; i++) { if (xs[i] === x) return i; } return -1; } }).call(this,require('_process')) },{"./_stream_duplex":274,"_process":104,"buffer":45,"core-util-is":150,"events":82,"inherits":204,"isarray":209,"process-nextick-args":243,"string_decoder/":272,"util":19}],276:[function(require,module,exports){ arguments[4][116][0].apply(exports,arguments) },{"./_stream_duplex":274,"core-util-is":150,"dup":116,"inherits":204}],277:[function(require,module,exports){ arguments[4][117][0].apply(exports,arguments) },{"./_stream_duplex":274,"buffer":45,"core-util-is":150,"dup":117,"events":82,"inherits":204,"process-nextick-args":243,"util-deprecate":287}],278:[function(require,module,exports){ arguments[4][120][0].apply(exports,arguments) },{"./lib/_stream_transform.js":276,"dup":120}],279:[function(require,module,exports){ (function (process){ var Transform = require('readable-stream/transform') , inherits = require('util').inherits , xtend = require('xtend') function DestroyableTransform(opts) { Transform.call(this, opts) this._destroyed = false } inherits(DestroyableTransform, Transform) DestroyableTransform.prototype.destroy = function(err) { if (this._destroyed) return this._destroyed = true var self = this process.nextTick(function() { if (err) self.emit('error', err) self.emit('close') }) } // a noop _transform function function noop (chunk, enc, callback) { callback(null, chunk) } // create a new export function, used by both the main export and // the .ctor export, contains common logic for dealing with arguments function through2 (construct) { return function (options, transform, flush) { if (typeof options == 'function') { flush = transform transform = options options = {} } if (typeof transform != 'function') transform = noop if (typeof flush != 'function') flush = null return construct(options, transform, flush) } } // main export, just make me a transform stream! module.exports = through2(function (options, transform, flush) { var t2 = new DestroyableTransform(options) t2._transform = transform if (flush) t2._flush = flush return t2 }) // make me a reusable prototype that I can `new`, or implicitly `new` // with a constructor call module.exports.ctor = through2(function (options, transform, flush) { function Through2 (override) { if (!(this instanceof Through2)) return new Through2(override) this.options = xtend(options, override) DestroyableTransform.call(this, this.options) } inherits(Through2, DestroyableTransform) Through2.prototype._transform = transform if (flush) Through2.prototype._flush = flush return Through2 }) module.exports.obj = through2(function (options, transform, flush) { var t2 = new DestroyableTransform(xtend({ objectMode: true, highWaterMark: 16 }, options)) t2._transform = transform if (flush) t2._flush = flush return t2 }) }).call(this,require('_process')) },{"_process":104,"readable-stream/transform":278,"util":135,"xtend":330}],280:[function(require,module,exports){ (function (process){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a // copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to permit // persons to whom the Software is furnished to do so, subject to the // following conditions: // // The above copyright notice and this permission notice shall be included // in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE // USE OR OTHER DEALINGS IN THE SOFTWARE. // a duplex stream is just a stream that is both readable and writable. // Since JS doesn't have multiple prototypal inheritance, this class // prototypally inherits from Readable, and then parasitically from // Writable. module.exports = Duplex; /**/ var objectKeys = Object.keys || function (obj) { var keys = []; for (var key in obj) keys.push(key); return keys; } /**/ /**/ var util = require('core-util-is'); util.inherits = require('inherits'); /**/ var Readable = require('./_stream_readable'); var Writable = require('./_stream_writable'); util.inherits(Duplex, Readable); forEach(objectKeys(Writable.prototype), function(method) { if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method]; }); function Duplex(options) { if (!(this instanceof Duplex)) return new Duplex(options); Readable.call(this, options); Writable.call(this, options); if (options && options.readable === false) this.readable = false; if (options && options.writable === false) this.writable = false; this.allowHalfOpen = true; if (options && options.allowHalfOpen === false) this.allowHalfOpen = false; this.once('end', onend); } // the no-half-open enforcer function onend() { // if we allow half-open state, or if the writable side ended, // then we're ok. if (this.allowHalfOpen || this._writableState.ended) return; // no more data can be written. // But allow more writes to happen in this tick. process.nextTick(this.end.bind(this)); } function forEach (xs, f) { for (var i = 0, l = xs.length; i < l; i++) { f(xs[i], i); } } }).call(this,require('_process')) },{"./_stream_readable":281,"./_stream_writable":283,"_process":104,"core-util-is":150,"inherits":204}],281:[function(require,module,exports){ (function (process){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a // copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to permit // persons to whom the Software is furnished to do so, subject to the // following conditions: // // The above copyright notice and this permission notice shall be included // in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE // USE OR OTHER DEALINGS IN THE SOFTWARE. module.exports = Readable; /**/ var isArray = require('isarray'); /**/ /**/ var Buffer = require('buffer').Buffer; /**/ Readable.ReadableState = ReadableState; var EE = require('events').EventEmitter; /**/ if (!EE.listenerCount) EE.listenerCount = function(emitter, type) { return emitter.listeners(type).length; }; /**/ var Stream = require('stream'); /**/ var util = require('core-util-is'); util.inherits = require('inherits'); /**/ var StringDecoder; util.inherits(Readable, Stream); function ReadableState(options, stream) { options = options || {}; // the point at which it stops calling _read() to fill the buffer // Note: 0 is a valid value, means "don't call _read preemptively ever" var hwm = options.highWaterMark; this.highWaterMark = (hwm || hwm === 0) ? hwm : 16 * 1024; // cast to ints. this.highWaterMark = ~~this.highWaterMark; this.buffer = []; this.length = 0; this.pipes = null; this.pipesCount = 0; this.flowing = false; this.ended = false; this.endEmitted = false; this.reading = false; // In streams that never have any data, and do push(null) right away, // the consumer can miss the 'end' event if they do some I/O before // consuming the stream. So, we don't emit('end') until some reading // happens. this.calledRead = false; // a flag to be able to tell if the onwrite cb is called immediately, // or on a later tick. We set this to true at first, becuase any // actions that shouldn't happen until "later" should generally also // not happen before the first write call. this.sync = true; // whenever we return null, then we set a flag to say // that we're awaiting a 'readable' event emission. this.needReadable = false; this.emittedReadable = false; this.readableListening = false; // object stream flag. Used to make read(n) ignore n and to // make all the buffer merging and length checks go away this.objectMode = !!options.objectMode; // Crypto is kind of old and crusty. Historically, its default string // encoding is 'binary' so we have to make this configurable. // Everything else in the universe uses 'utf8', though. this.defaultEncoding = options.defaultEncoding || 'utf8'; // when piping, we only care about 'readable' events that happen // after read()ing all the bytes and not getting any pushback. this.ranOut = false; // the number of writers that are awaiting a drain event in .pipe()s this.awaitDrain = 0; // if true, a maybeReadMore has been scheduled this.readingMore = false; this.decoder = null; this.encoding = null; if (options.encoding) { if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder; this.decoder = new StringDecoder(options.encoding); this.encoding = options.encoding; } } function Readable(options) { if (!(this instanceof Readable)) return new Readable(options); this._readableState = new ReadableState(options, this); // legacy this.readable = true; Stream.call(this); } // Manually shove something into the read() buffer. // This returns true if the highWaterMark has not been hit yet, // similar to how Writable.write() returns true if you should // write() some more. Readable.prototype.push = function(chunk, encoding) { var state = this._readableState; if (typeof chunk === 'string' && !state.objectMode) { encoding = encoding || state.defaultEncoding; if (encoding !== state.encoding) { chunk = new Buffer(chunk, encoding); encoding = ''; } } return readableAddChunk(this, state, chunk, encoding, false); }; // Unshift should *always* be something directly out of read() Readable.prototype.unshift = function(chunk) { var state = this._readableState; return readableAddChunk(this, state, chunk, '', true); }; function readableAddChunk(stream, state, chunk, encoding, addToFront) { var er = chunkInvalid(state, chunk); if (er) { stream.emit('error', er); } else if (chunk === null || chunk === undefined) { state.reading = false; if (!state.ended) onEofChunk(stream, state); } else if (state.objectMode || chunk && chunk.length > 0) { if (state.ended && !addToFront) { var e = new Error('stream.push() after EOF'); stream.emit('error', e); } else if (state.endEmitted && addToFront) { var e = new Error('stream.unshift() after end event'); stream.emit('error', e); } else { if (state.decoder && !addToFront && !encoding) chunk = state.decoder.write(chunk); // update the buffer info. state.length += state.objectMode ? 1 : chunk.length; if (addToFront) { state.buffer.unshift(chunk); } else { state.reading = false; state.buffer.push(chunk); } if (state.needReadable) emitReadable(stream); maybeReadMore(stream, state); } } else if (!addToFront) { state.reading = false; } return needMoreData(state); } // if it's past the high water mark, we can push in some more. // Also, if we have no data yet, we can stand some // more bytes. This is to work around cases where hwm=0, // such as the repl. Also, if the push() triggered a // readable event, and the user called read(largeNumber) such that // needReadable was set, then we ought to push more, so that another // 'readable' event will be triggered. function needMoreData(state) { return !state.ended && (state.needReadable || state.length < state.highWaterMark || state.length === 0); } // backwards compatibility. Readable.prototype.setEncoding = function(enc) { if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder; this._readableState.decoder = new StringDecoder(enc); this._readableState.encoding = enc; }; // Don't raise the hwm > 128MB var MAX_HWM = 0x800000; function roundUpToNextPowerOf2(n) { if (n >= MAX_HWM) { n = MAX_HWM; } else { // Get the next highest power of 2 n--; for (var p = 1; p < 32; p <<= 1)="" n="" |="n">> p; n++; } return n; } function howMuchToRead(n, state) { if (state.length === 0 && state.ended) return 0; if (state.objectMode) return n === 0 ? 0 : 1; if (n === null || isNaN(n)) { // only flow one buffer at a time if (state.flowing && state.buffer.length) return state.buffer[0].length; else return state.length; } if (n <= 0)="" return="" 0;="" if="" we're="" asking="" for="" more="" than="" the="" target="" buffer="" level,="" then="" raise="" water="" mark.="" bump="" up="" to="" next="" highest="" power="" of="" 2,="" prevent="" increasing="" it="" excessively="" in="" tiny="" amounts.="" (n=""> state.highWaterMark) state.highWaterMark = roundUpToNextPowerOf2(n); // don't have that much. return null, unless we've ended. if (n > state.length) { if (!state.ended) { state.needReadable = true; return 0; } else return state.length; } return n; } // you can override either this method, or the async _read(n) below. Readable.prototype.read = function(n) { var state = this._readableState; state.calledRead = true; var nOrig = n; var ret; if (typeof n !== 'number' || n > 0) state.emittedReadable = false; // if we're doing read(0) to trigger a readable event, but we // already have a bunch of data in the buffer, then just trigger // the 'readable' event and move on. if (n === 0 && state.needReadable && (state.length >= state.highWaterMark || state.ended)) { emitReadable(this); return null; } n = howMuchToRead(n, state); // if we've ended, and we're now clear, then finish it up. if (n === 0 && state.ended) { ret = null; // In cases where the decoder did not receive enough data // to produce a full chunk, then immediately received an // EOF, state.buffer will contain [, ]. // howMuchToRead will see this and coerce the amount to // read to zero (because it's looking at the length of the // first in state.buffer), and we'll end up here. // // This can only happen via state.decoder -- no other venue // exists for pushing a zero-length chunk into state.buffer // and triggering this behavior. In this case, we return our // remaining data and end the stream, if appropriate. if (state.length > 0 && state.decoder) { ret = fromList(n, state); state.length -= ret.length; } if (state.length === 0) endReadable(this); return ret; } // All the actual chunk generation logic needs to be // *below* the call to _read. The reason is that in certain // synthetic stream cases, such as passthrough streams, _read // may be a completely synchronous operation which may change // the state of the read buffer, providing enough data when // before there was *not* enough. // // So, the steps are: // 1. Figure out what the state of things will be after we do // a read from the buffer. // // 2. If that resulting state will trigger a _read, then call _read. // Note that this may be asynchronous, or synchronous. Yes, it is // deeply ugly to write APIs this way, but that still doesn't mean // that the Readable class should behave improperly, as streams are // designed to be sync/async agnostic. // Take note if the _read call is sync or async (ie, if the read call // has returned yet), so that we know whether or not it's safe to emit // 'readable' etc. // // 3. Actually pull the requested chunks out of the buffer and return. // if we need a readable event, then we need to do some reading. var doRead = state.needReadable; // if we currently have less than the highWaterMark, then also read some if (state.length - n <= state.highwatermark)="" doread="true;" however,="" if="" we've="" ended,="" then="" there's="" no="" point,="" and="" we're="" already="" reading,="" it's="" unnecessary.="" (state.ended="" ||="" state.reading)="" (doread)="" {="" state.reading="true;" state.sync="true;" the="" length="" is="" currently="" zero,="" we="" *need*="" a="" readable="" event.="" (state.length="==" 0)="" state.needreadable="true;" call="" internal="" read="" method="" this._read(state.highwatermark);="" }="" _read="" called="" its="" callback="" synchronously,="" `reading`="" will="" be="" false,="" need="" to="" re-evaluate="" how="" much="" data="" can="" return="" user.="" (doread="" &&="" !state.reading)="" n="howMuchToRead(nOrig," state);="" (n=""> 0) ret = fromList(n, state); else ret = null; if (ret === null) { state.needReadable = true; n = 0; } state.length -= n; // If we have nothing in the buffer, then we want to know // as soon as we *do* get something into the buffer. if (state.length === 0 && !state.ended) state.needReadable = true; // If we happened to read() exactly the remaining amount in the // buffer, and the EOF has been seen at this point, then make sure // that we emit 'end' on the very next tick. if (state.ended && !state.endEmitted && state.length === 0) endReadable(this); return ret; }; function chunkInvalid(state, chunk) { var er = null; if (!Buffer.isBuffer(chunk) && 'string' !== typeof chunk && chunk !== null && chunk !== undefined && !state.objectMode) { er = new TypeError('Invalid non-string/buffer chunk'); } return er; } function onEofChunk(stream, state) { if (state.decoder && !state.ended) { var chunk = state.decoder.end(); if (chunk && chunk.length) { state.buffer.push(chunk); state.length += state.objectMode ? 1 : chunk.length; } } state.ended = true; // if we've ended and we have some data left, then emit // 'readable' now to make sure it gets picked up. if (state.length > 0) emitReadable(stream); else endReadable(stream); } // Don't emit readable right away in sync mode, because this can trigger // another read() call => stack overflow. This way, it might trigger // a nextTick recursion warning, but that's not so bad. function emitReadable(stream) { var state = stream._readableState; state.needReadable = false; if (state.emittedReadable) return; state.emittedReadable = true; if (state.sync) process.nextTick(function() { emitReadable_(stream); }); else emitReadable_(stream); } function emitReadable_(stream) { stream.emit('readable'); } // at this point, the user has presumably seen the 'readable' event, // and called read() to consume some data. that may have triggered // in turn another _read(n) call, in which case reading = true if // it's in progress. // However, if we're not ended, or reading, and the length < hwm, // then go ahead and try to read some more preemptively. function maybeReadMore(stream, state) { if (!state.readingMore) { state.readingMore = true; process.nextTick(function() { maybeReadMore_(stream, state); }); } } function maybeReadMore_(stream, state) { var len = state.length; while (!state.reading && !state.flowing && !state.ended && state.length < state.highWaterMark) { stream.read(0); if (len === state.length) // didn't get any data, stop spinning. break; else len = state.length; } state.readingMore = false; } // abstract method. to be overridden in specific implementation classes. // call cb(er, data) where data is <= n="" in="" length.="" for="" virtual="" (non-string,="" non-buffer)="" streams,="" "length"="" is="" somewhat="" arbitrary,="" and="" perhaps="" not="" very="" meaningful.="" readable.prototype._read="function(n)" {="" this.emit('error',="" new="" error('not="" implemented'));="" };="" readable.prototype.pipe="function(dest," pipeopts)="" var="" src="this;" state="this._readableState;" switch="" (state.pipescount)="" case="" 0:="" state.pipes="dest;" break;="" 1:="" dest];="" default:="" state.pipes.push(dest);="" }="" state.pipescount="" +="1;" doend="(!pipeOpts" ||="" pipeopts.end="" !="=" false)="" &&="" dest="" process.stdout="" process.stderr;="" endfn="doEnd" ?="" onend="" :="" cleanup;="" if="" (state.endemitted)="" process.nexttick(endfn);="" else="" src.once('end',="" endfn);="" dest.on('unpipe',="" onunpipe);="" function="" onunpipe(readable)="" (readable="" src)="" return;="" cleanup();="" onend()="" dest.end();="" when="" the="" drains,="" it="" reduces="" awaitdrain="" counter="" on="" source.="" this="" would="" be="" more="" elegant="" with="" a="" .once()="" handler="" flow(),="" but="" adding="" removing="" repeatedly="" too="" slow.="" ondrain="pipeOnDrain(src);" dest.on('drain',="" ondrain);="" cleanup()="" cleanup="" event="" handlers="" once="" pipe="" broken="" dest.removelistener('close',="" onclose);="" dest.removelistener('finish',="" onfinish);="" dest.removelistener('drain',="" dest.removelistener('error',="" onerror);="" dest.removelistener('unpipe',="" src.removelistener('end',="" onend);="" cleanup);="" reader="" waiting="" drain="" from="" specific="" writer,="" then="" cause="" to="" never="" start="" flowing="" again.="" so,="" awaiting="" drain,="" we="" just="" call="" now.="" don't="" know,="" assume="" that="" are="" one.="" (!dest._writablestate="" dest._writablestate.needdrain)="" ondrain();="" has="" an="" error,="" stop="" piping="" into="" it.="" however,="" suppress="" throwing="" behavior="" this.="" onerror(er)="" unpipe();="" (ee.listenercount(dest,="" 'error')="==" 0)="" dest.emit('error',="" er);="" brutally="" ugly="" hack="" make="" sure="" our="" error="" attached="" before="" any="" userland="" ones.="" do="" (!dest._events="" !dest._events.error)="" dest.on('error',="" (isarray(dest._events.error))="" dest._events.error.unshift(onerror);="" dest._events.error="[onerror," dest._events.error];="" both="" close="" finish="" should="" trigger="" unpipe,="" only="" once.="" onclose()="" dest.once('close',="" onfinish()="" dest.once('finish',="" unpipe()="" src.unpipe(dest);="" tell="" it's="" being="" piped="" dest.emit('pipe',="" src);="" flow="" hasn't="" been="" started="" already.="" (!state.flowing)="" waits="" readable="" events="" after="" all="" data="" gets="" sucked="" out="" flow.="" easier="" follow="" this.on('readable',="" pipeonreadable);="" state.flowing="true;" process.nexttick(function()="" flow(src);="" });="" return="" dest;="" pipeondrain(src)="" function()="" state.awaitdrain--;="" (state.awaitdrain="==" flow(src)="" chunk;="" state.awaitdrain="0;" write(dest,="" i,="" list)="" written="dest.write(chunk);" (false="==" written)="" state.awaitdrain++;="" while="" (state.pipescount="" null="" (chunk="src.read()))" 1)="" write(state.pipes,="" 0,="" null);="" foreach(state.pipes,="" write);="" src.emit('data',="" chunk);="" anyone="" needs="" have="" wait="" that.=""> 0) return; } // if every destination was unpiped, either before entering this // function, or in the while loop, then stop flowing. // // NB: This is a pretty rare edge case. if (state.pipesCount === 0) { state.flowing = false; // if there were data event listeners added, then switch to old mode. if (EE.listenerCount(src, 'data') > 0) emitDataEvents(src); return; } // at this point, no one needed a drain, so we just ran out of data // on the next readable event, start it over again. state.ranOut = true; } function pipeOnReadable() { if (this._readableState.ranOut) { this._readableState.ranOut = false; flow(this); } } Readable.prototype.unpipe = function(dest) { var state = this._readableState; // if we're not piping anywhere, then do nothing. if (state.pipesCount === 0) return this; // just one destination. most common case. if (state.pipesCount === 1) { // passed in one, but it's not the right one. if (dest && dest !== state.pipes) return this; if (!dest) dest = state.pipes; // got a match. state.pipes = null; state.pipesCount = 0; this.removeListener('readable', pipeOnReadable); state.flowing = false; if (dest) dest.emit('unpipe', this); return this; } // slow case. multiple pipe destinations. if (!dest) { // remove all. var dests = state.pipes; var len = state.pipesCount; state.pipes = null; state.pipesCount = 0; this.removeListener('readable', pipeOnReadable); state.flowing = false; for (var i = 0; i < len; i++) dests[i].emit('unpipe', this); return this; } // try to find the right one. var i = indexOf(state.pipes, dest); if (i === -1) return this; state.pipes.splice(i, 1); state.pipesCount -= 1; if (state.pipesCount === 1) state.pipes = state.pipes[0]; dest.emit('unpipe', this); return this; }; // set up data events if they are asked for // Ensure readable listeners eventually get something Readable.prototype.on = function(ev, fn) { var res = Stream.prototype.on.call(this, ev, fn); if (ev === 'data' && !this._readableState.flowing) emitDataEvents(this); if (ev === 'readable' && this.readable) { var state = this._readableState; if (!state.readableListening) { state.readableListening = true; state.emittedReadable = false; state.needReadable = true; if (!state.reading) { this.read(0); } else if (state.length) { emitReadable(this, state); } } } return res; }; Readable.prototype.addListener = Readable.prototype.on; // pause() and resume() are remnants of the legacy readable stream API // If the user uses them, then switch into old mode. Readable.prototype.resume = function() { emitDataEvents(this); this.read(0); this.emit('resume'); }; Readable.prototype.pause = function() { emitDataEvents(this, true); this.emit('pause'); }; function emitDataEvents(stream, startPaused) { var state = stream._readableState; if (state.flowing) { // https://github.com/isaacs/readable-stream/issues/16 throw new Error('Cannot switch to old mode now.'); } var paused = startPaused || false; var readable = false; // convert to an old-style stream. stream.readable = true; stream.pipe = Stream.prototype.pipe; stream.on = stream.addListener = Stream.prototype.on; stream.on('readable', function() { readable = true; var c; while (!paused && (null !== (c = stream.read()))) stream.emit('data', c); if (c === null) { readable = false; stream._readableState.needReadable = true; } }); stream.pause = function() { paused = true; this.emit('pause'); }; stream.resume = function() { paused = false; if (readable) process.nextTick(function() { stream.emit('readable'); }); else this.read(0); this.emit('resume'); }; // now make it start, just in case it hadn't already. stream.emit('readable'); } // wrap an old-style stream as the async data source. // This is *not* part of the readable stream interface. // It is an ugly unfortunate mess of history. Readable.prototype.wrap = function(stream) { var state = this._readableState; var paused = false; var self = this; stream.on('end', function() { if (state.decoder && !state.ended) { var chunk = state.decoder.end(); if (chunk && chunk.length) self.push(chunk); } self.push(null); }); stream.on('data', function(chunk) { if (state.decoder) chunk = state.decoder.write(chunk); // don't skip over falsy values in objectMode //if (state.objectMode && util.isNullOrUndefined(chunk)) if (state.objectMode && (chunk === null || chunk === undefined)) return; else if (!state.objectMode && (!chunk || !chunk.length)) return; var ret = self.push(chunk); if (!ret) { paused = true; stream.pause(); } }); // proxy all the other methods. // important when wrapping filters and duplexes. for (var i in stream) { if (typeof stream[i] === 'function' && typeof this[i] === 'undefined') { this[i] = function(method) { return function() { return stream[method].apply(stream, arguments); }}(i); } } // proxy certain important events. var events = ['error', 'close', 'destroy', 'pause', 'resume']; forEach(events, function(ev) { stream.on(ev, self.emit.bind(self, ev)); }); // when we try to consume some more bytes, simply unpause the // underlying stream. self._read = function(n) { if (paused) { paused = false; stream.resume(); } }; return self; }; // exposed for testing purposes only. Readable._fromList = fromList; // Pluck off n bytes from an array of buffers. // Length is the combined lengths of all the buffers in the list. function fromList(n, state) { var list = state.buffer; var length = state.length; var stringMode = !!state.decoder; var objectMode = !!state.objectMode; var ret; // nothing in the list, definitely empty. if (list.length === 0) return null; if (length === 0) ret = null; else if (objectMode) ret = list.shift(); else if (!n || n >= length) { // read it all, truncate the array. if (stringMode) ret = list.join(''); else ret = Buffer.concat(list, length); list.length = 0; } else { // read just some of it. if (n < list[0].length) { // just take a part of the first list item. // slice is the same for buffers and strings. var buf = list[0]; ret = buf.slice(0, n); list[0] = buf.slice(n); } else if (n === list[0].length) { // first list is a perfect match ret = list.shift(); } else { // complex case. // we have enough to cover it, but it spans past the first buffer. if (stringMode) ret = ''; else ret = new Buffer(n); var c = 0; for (var i = 0, l = list.length; i < l && c < n; i++) { var buf = list[0]; var cpy = Math.min(n - c, buf.length); if (stringMode) ret += buf.slice(0, cpy); else buf.copy(ret, c, 0, cpy); if (cpy < buf.length) list[0] = buf.slice(cpy); else list.shift(); c += cpy; } } } return ret; } function endReadable(stream) { var state = stream._readableState; // If we get here before consuming all the bytes, then that is a // bug in node. Should never happen. if (state.length > 0) throw new Error('endReadable called on non-empty stream'); if (!state.endEmitted && state.calledRead) { state.ended = true; process.nextTick(function() { // Check that we didn't get one last unshift. if (!state.endEmitted && state.length === 0) { state.endEmitted = true; stream.readable = false; stream.emit('end'); } }); } } function forEach (xs, f) { for (var i = 0, l = xs.length; i < l; i++) { f(xs[i], i); } } function indexOf (xs, x) { for (var i = 0, l = xs.length; i < l; i++) { if (xs[i] === x) return i; } return -1; } }).call(this,require('_process')) },{"_process":104,"buffer":45,"core-util-is":150,"events":82,"inherits":204,"isarray":209,"stream":131,"string_decoder/":272}],282:[function(require,module,exports){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a // copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to permit // persons to whom the Software is furnished to do so, subject to the // following conditions: // // The above copyright notice and this permission notice shall be included // in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE // USE OR OTHER DEALINGS IN THE SOFTWARE. // a transform stream is a readable/writable stream where you do // something with the data. Sometimes it's called a "filter", // but that's not a great name for it, since that implies a thing where // some bits pass through, and others are simply ignored. (That would // be a valid example of a transform, of course.) // // While the output is causally related to the input, it's not a // necessarily symmetric or synchronous transformation. For example, // a zlib stream might take multiple plain-text writes(), and then // emit a single compressed chunk some time in the future. // // Here's how this works: // // The Transform stream has all the aspects of the readable and writable // stream classes. When you write(chunk), that calls _write(chunk,cb) // internally, and returns false if there's a lot of pending writes // buffered up. When you call read(), that calls _read(n) until // there's enough pending readable data buffered up. // // In a transform stream, the written data is placed in a buffer. When // _read(n) is called, it transforms the queued up data, calling the // buffered _write cb's as it consumes chunks. If consuming a single // written chunk would result in multiple output chunks, then the first // outputted bit calls the readcb, and subsequent chunks just go into // the read buffer, and will cause it to emit 'readable' if necessary. // // This way, back-pressure is actually determined by the reading side, // since _read has to be called to start processing a new chunk. However, // a pathological inflate type of transform can cause excessive buffering // here. For example, imagine a stream where every byte of input is // interpreted as an integer from 0-255, and then results in that many // bytes of output. Writing the 4 bytes {ff,ff,ff,ff} would result in // 1kb of data being output. In this case, you could write a very small // amount of input, and end up with a very large amount of output. In // such a pathological inflating mechanism, there'd be no way to tell // the system to stop doing the transform. A single 4MB write could // cause the system to run out of memory. // // However, even in such a pathological case, only a single written chunk // would be consumed, and then the rest would wait (un-transformed) until // the results of the previous transformed chunk were consumed. module.exports = Transform; var Duplex = require('./_stream_duplex'); /**/ var util = require('core-util-is'); util.inherits = require('inherits'); /**/ util.inherits(Transform, Duplex); function TransformState(options, stream) { this.afterTransform = function(er, data) { return afterTransform(stream, er, data); }; this.needTransform = false; this.transforming = false; this.writecb = null; this.writechunk = null; } function afterTransform(stream, er, data) { var ts = stream._transformState; ts.transforming = false; var cb = ts.writecb; if (!cb) return stream.emit('error', new Error('no writecb in Transform class')); ts.writechunk = null; ts.writecb = null; if (data !== null && data !== undefined) stream.push(data); if (cb) cb(er); var rs = stream._readableState; rs.reading = false; if (rs.needReadable || rs.length < rs.highWaterMark) { stream._read(rs.highWaterMark); } } function Transform(options) { if (!(this instanceof Transform)) return new Transform(options); Duplex.call(this, options); var ts = this._transformState = new TransformState(options, this); // when the writable side finishes, then flush out anything remaining. var stream = this; // start out asking for a readable event once data is transformed. this._readableState.needReadable = true; // we have implemented the _read method, and done the other things // that Readable wants before the first _read call, so unset the // sync guard flag. this._readableState.sync = false; this.once('finish', function() { if ('function' === typeof this._flush) this._flush(function(er) { done(stream, er); }); else done(stream); }); } Transform.prototype.push = function(chunk, encoding) { this._transformState.needTransform = false; return Duplex.prototype.push.call(this, chunk, encoding); }; // This is the part where you do stuff! // override this function in implementation classes. // 'chunk' is an input chunk. // // Call `push(newChunk)` to pass along transformed output // to the readable side. You may call 'push' zero or more times. // // Call `cb(err)` when you are done with this chunk. If you pass // an error, then that'll put the hurt on the whole operation. If you // never call cb(), then you'll never get another chunk. Transform.prototype._transform = function(chunk, encoding, cb) { throw new Error('not implemented'); }; Transform.prototype._write = function(chunk, encoding, cb) { var ts = this._transformState; ts.writecb = cb; ts.writechunk = chunk; ts.writeencoding = encoding; if (!ts.transforming) { var rs = this._readableState; if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark); } }; // Doesn't matter what the args are here. // _transform does all the work. // That we got here means that the readable side wants more data. Transform.prototype._read = function(n) { var ts = this._transformState; if (ts.writechunk !== null && ts.writecb && !ts.transforming) { ts.transforming = true; this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform); } else { // mark that we need a transform, so that any data that comes in // will get processed, now that we've asked for it. ts.needTransform = true; } }; function done(stream, er) { if (er) return stream.emit('error', er); // if there's nothing in the write buffer, then that means // that nothing more will ever be provided var ws = stream._writableState; var rs = stream._readableState; var ts = stream._transformState; if (ws.length) throw new Error('calling transform done when ws.length != 0'); if (ts.transforming) throw new Error('calling transform done when still transforming'); return stream.push(null); } },{"./_stream_duplex":280,"core-util-is":150,"inherits":204}],283:[function(require,module,exports){ (function (process){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a // copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to permit // persons to whom the Software is furnished to do so, subject to the // following conditions: // // The above copyright notice and this permission notice shall be included // in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE // USE OR OTHER DEALINGS IN THE SOFTWARE. // A bit simpler than readable streams. // Implement an async ._write(chunk, cb), and it'll handle all // the drain event emission and buffering. module.exports = Writable; /**/ var Buffer = require('buffer').Buffer; /**/ Writable.WritableState = WritableState; /**/ var util = require('core-util-is'); util.inherits = require('inherits'); /**/ var Stream = require('stream'); util.inherits(Writable, Stream); function WriteReq(chunk, encoding, cb) { this.chunk = chunk; this.encoding = encoding; this.callback = cb; } function WritableState(options, stream) { options = options || {}; // the point at which write() starts returning false // Note: 0 is a valid value, means that we always return false if // the entire buffer is not flushed immediately on write() var hwm = options.highWaterMark; this.highWaterMark = (hwm || hwm === 0) ? hwm : 16 * 1024; // object stream flag to indicate whether or not this stream // contains buffers or objects. this.objectMode = !!options.objectMode; // cast to ints. this.highWaterMark = ~~this.highWaterMark; this.needDrain = false; // at the start of calling end() this.ending = false; // when end() has been called, and returned this.ended = false; // when 'finish' is emitted this.finished = false; // should we decode strings into buffers before passing to _write? // this is here so that some node-core streams can optimize string // handling at a lower level. var noDecode = options.decodeStrings === false; this.decodeStrings = !noDecode; // Crypto is kind of old and crusty. Historically, its default string // encoding is 'binary' so we have to make this configurable. // Everything else in the universe uses 'utf8', though. this.defaultEncoding = options.defaultEncoding || 'utf8'; // not an actual buffer we keep track of, but a measurement // of how much we're waiting to get pushed to some underlying // socket or file. this.length = 0; // a flag to see when we're in the middle of a write. this.writing = false; // a flag to be able to tell if the onwrite cb is called immediately, // or on a later tick. We set this to true at first, becuase any // actions that shouldn't happen until "later" should generally also // not happen before the first write call. this.sync = true; // a flag to know if we're processing previously buffered items, which // may call the _write() callback in the same tick, so that we don't // end up in an overlapped onwrite situation. this.bufferProcessing = false; // the callback that's passed to _write(chunk,cb) this.onwrite = function(er) { onwrite(stream, er); }; // the callback that the user supplies to write(chunk,encoding,cb) this.writecb = null; // the amount that is being written when _write is called. this.writelen = 0; this.buffer = []; // True if the error was already emitted and should not be thrown again this.errorEmitted = false; } function Writable(options) { var Duplex = require('./_stream_duplex'); // Writable ctor is applied to Duplexes, though they're not // instanceof Writable, they're instanceof Readable. if (!(this instanceof Writable) && !(this instanceof Duplex)) return new Writable(options); this._writableState = new WritableState(options, this); // legacy. this.writable = true; Stream.call(this); } // Otherwise people can pipe Writable streams, which is just wrong. Writable.prototype.pipe = function() { this.emit('error', new Error('Cannot pipe. Not readable.')); }; function writeAfterEnd(stream, state, cb) { var er = new Error('write after end'); // TODO: defer error events consistently everywhere, not just the cb stream.emit('error', er); process.nextTick(function() { cb(er); }); } // If we get something that is not a buffer, string, null, or undefined, // and we're not in objectMode, then that's an error. // Otherwise stream chunks are all considered to be of length=1, and the // watermarks determine how many objects to keep in the buffer, rather than // how many bytes or characters. function validChunk(stream, state, chunk, cb) { var valid = true; if (!Buffer.isBuffer(chunk) && 'string' !== typeof chunk && chunk !== null && chunk !== undefined && !state.objectMode) { var er = new TypeError('Invalid non-string/buffer chunk'); stream.emit('error', er); process.nextTick(function() { cb(er); }); valid = false; } return valid; } Writable.prototype.write = function(chunk, encoding, cb) { var state = this._writableState; var ret = false; if (typeof encoding === 'function') { cb = encoding; encoding = null; } if (Buffer.isBuffer(chunk)) encoding = 'buffer'; else if (!encoding) encoding = state.defaultEncoding; if (typeof cb !== 'function') cb = function() {}; if (state.ended) writeAfterEnd(this, state, cb); else if (validChunk(this, state, chunk, cb)) ret = writeOrBuffer(this, state, chunk, encoding, cb); return ret; }; function decodeChunk(state, chunk, encoding) { if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') { chunk = new Buffer(chunk, encoding); } return chunk; } // if we're already writing something, then just put this // in the queue, and wait our turn. Otherwise, call _write // If we return false, then we need a drain event, so set that flag. function writeOrBuffer(stream, state, chunk, encoding, cb) { chunk = decodeChunk(state, chunk, encoding); if (Buffer.isBuffer(chunk)) encoding = 'buffer'; var len = state.objectMode ? 1 : chunk.length; state.length += len; var ret = state.length < state.highWaterMark; // we must ensure that previous needDrain will not be reset to false. if (!ret) state.needDrain = true; if (state.writing) state.buffer.push(new WriteReq(chunk, encoding, cb)); else doWrite(stream, state, len, chunk, encoding, cb); return ret; } function doWrite(stream, state, len, chunk, encoding, cb) { state.writelen = len; state.writecb = cb; state.writing = true; state.sync = true; stream._write(chunk, encoding, state.onwrite); state.sync = false; } function onwriteError(stream, state, sync, er, cb) { if (sync) process.nextTick(function() { cb(er); }); else cb(er); stream._writableState.errorEmitted = true; stream.emit('error', er); } function onwriteStateUpdate(state) { state.writing = false; state.writecb = null; state.length -= state.writelen; state.writelen = 0; } function onwrite(stream, er) { var state = stream._writableState; var sync = state.sync; var cb = state.writecb; onwriteStateUpdate(state); if (er) onwriteError(stream, state, sync, er, cb); else { // Check if we're actually ready to finish, but don't emit yet var finished = needFinish(stream, state); if (!finished && !state.bufferProcessing && state.buffer.length) clearBuffer(stream, state); if (sync) { process.nextTick(function() { afterWrite(stream, state, finished, cb); }); } else { afterWrite(stream, state, finished, cb); } } } function afterWrite(stream, state, finished, cb) { if (!finished) onwriteDrain(stream, state); cb(); if (finished) finishMaybe(stream, state); } // Must force callback to be called on nextTick, so that we don't // emit 'drain' before the write() consumer gets the 'false' return // value, and has a chance to attach a 'drain' listener. function onwriteDrain(stream, state) { if (state.length === 0 && state.needDrain) { state.needDrain = false; stream.emit('drain'); } } // if there's something in the buffer waiting, then process it function clearBuffer(stream, state) { state.bufferProcessing = true; for (var c = 0; c < state.buffer.length; c++) { var entry = state.buffer[c]; var chunk = entry.chunk; var encoding = entry.encoding; var cb = entry.callback; var len = state.objectMode ? 1 : chunk.length; doWrite(stream, state, len, chunk, encoding, cb); // if we didn't call the onwrite immediately, then // it means that we need to wait until it does. // also, that means that the chunk and cb are currently // being processed, so move the buffer counter past them. if (state.writing) { c++; break; } } state.bufferProcessing = false; if (c < state.buffer.length) state.buffer = state.buffer.slice(c); else state.buffer.length = 0; } Writable.prototype._write = function(chunk, encoding, cb) { cb(new Error('not implemented')); }; Writable.prototype.end = function(chunk, encoding, cb) { var state = this._writableState; if (typeof chunk === 'function') { cb = chunk; chunk = null; encoding = null; } else if (typeof encoding === 'function') { cb = encoding; encoding = null; } if (typeof chunk !== 'undefined' && chunk !== null) this.write(chunk, encoding); // ignore unnecessary end() calls. if (!state.ending && !state.finished) endWritable(this, state, cb); }; function needFinish(stream, state) { return (state.ending && state.length === 0 && !state.finished && !state.writing); } function finishMaybe(stream, state) { var need = needFinish(stream, state); if (need) { state.finished = true; stream.emit('finish'); } return need; } function endWritable(stream, state, cb) { state.ending = true; finishMaybe(stream, state); if (cb) { if (state.finished) process.nextTick(cb); else stream.once('finish', cb); } state.ended = true; } }).call(this,require('_process')) },{"./_stream_duplex":280,"_process":104,"buffer":45,"core-util-is":150,"inherits":204,"stream":131}],284:[function(require,module,exports){ arguments[4][120][0].apply(exports,arguments) },{"./lib/_stream_transform.js":282,"dup":120}],285:[function(require,module,exports){ (function (process){ var Transform = require('readable-stream/transform') , inherits = require('util').inherits , xtend = require('xtend') function DestroyableTransform(opts) { Transform.call(this, opts) this._destroyed = false } inherits(DestroyableTransform, Transform) DestroyableTransform.prototype.destroy = function(err) { if (this._destroyed) return this._destroyed = true var self = this process.nextTick(function() { if (err) self.emit('error', err) self.emit('close') }) } // a noop _transform function function noop (chunk, enc, callback) { callback(null, chunk) } // create a new export function, used by both the main export and // the .ctor export, contains common logic for dealing with arguments function through2 (construct) { return function (options, transform, flush) { if (typeof options == 'function') { flush = transform transform = options options = {} } if (typeof transform != 'function') transform = noop if (typeof flush != 'function') flush = null return construct(options, transform, flush) } } // main export, just make me a transform stream! module.exports = through2(function (options, transform, flush) { var t2 = new DestroyableTransform(options) t2._transform = transform if (flush) t2._flush = flush return t2 }) // make me a reusable prototype that I can `new`, or implicitly `new` // with a constructor call module.exports.ctor = through2(function (options, transform, flush) { function Through2 (override) { if (!(this instanceof Through2)) return new Through2(override) this.options = xtend(options, override) DestroyableTransform.call(this, this.options) } inherits(Through2, DestroyableTransform) Through2.prototype._transform = transform if (flush) Through2.prototype._flush = flush return Through2 }) module.exports.obj = through2(function (options, transform, flush) { var t2 = new DestroyableTransform(xtend({ objectMode: true, highWaterMark: 16 }, options)) t2._transform = transform if (flush) t2._flush = flush return t2 }) }).call(this,require('_process')) },{"_process":104,"readable-stream/transform":284,"util":135,"xtend":330}],286:[function(require,module,exports){ exports = module.exports = trim; function trim(str){ return str.replace(/^\s*|\s*$/g, ''); } exports.left = function(str){ return str.replace(/^\s*/, ''); }; exports.right = function(str){ return str.replace(/\s*$/, ''); }; },{}],287:[function(require,module,exports){ (function (global){ /** * Module exports. */ module.exports = deprecate; /** * Mark that a method should not be used. * Returns a modified function which warns once by default. * * If `localStorage.noDeprecation = true` is set, then it is a no-op. * * If `localStorage.throwDeprecation = true` is set, then deprecated functions * will throw an Error when invoked. * * If `localStorage.traceDeprecation = true` is set, then deprecated functions * will invoke `console.trace()` instead of `console.error()`. * * @param {Function} fn - the function to deprecate * @param {String} msg - the string to print to the console when `fn` is invoked * @returns {Function} a new "deprecated" version of `fn` * @api public */ function deprecate (fn, msg) { if (config('noDeprecation')) { return fn; } var warned = false; function deprecated() { if (!warned) { if (config('throwDeprecation')) { throw new Error(msg); } else if (config('traceDeprecation')) { console.trace(msg); } else { console.warn(msg); } warned = true; } return fn.apply(this, arguments); } return deprecated; } /** * Checks `localStorage` for boolean values for the given `name`. * * @param {String} name * @returns {Boolean} * @api private */ function config (name) { // accessing global.localStorage can trigger a DOMException in sandboxed iframes try { if (!global.localStorage) return false; } catch (_) { return false; } var val = global.localStorage[name]; if (null == val) return false; return String(val).toLowerCase() === 'true'; } }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) },{}],288:[function(require,module,exports){ arguments[4][264][0].apply(exports,arguments) },{"dup":264}],289:[function(require,module,exports){ arguments[4][265][0].apply(exports,arguments) },{"dup":265}],290:[function(require,module,exports){ arguments[4][266][0].apply(exports,arguments) },{"./decode.js":288,"./encode.js":289,"./length.js":291,"dup":266}],291:[function(require,module,exports){ var N1 = Math.pow(2, 7) var N2 = Math.pow(2, 14) var N3 = Math.pow(2, 21) var N4 = Math.pow(2, 28) var N5 = Math.pow(2, 35) var N6 = Math.pow(2, 42) var N7 = Math.pow(2, 49) var N8 = Math.pow(2, 56) var N9 = Math.pow(2, 63) module.exports = function (value) { return ( value < N1 ? 1 : value < N2 ? 2 : value < N3 ? 3 : value < N4 ? 4 : value < N5 ? 5 : value < N6 ? 6 : value < N7 ? 7 : value < N8 ? 8 : value < N9 ? 9 : 10 ) } },{}],292:[function(require,module,exports){ var createElement = require("./vdom/create-element.js") module.exports = createElement },{"./vdom/create-element.js":298}],293:[function(require,module,exports){ var diff = require("./vtree/diff.js") module.exports = diff },{"./vtree/diff.js":318}],294:[function(require,module,exports){ var h = require("./virtual-hyperscript/index.js") module.exports = h },{"./virtual-hyperscript/index.js":305}],295:[function(require,module,exports){ var diff = require("./diff.js") var patch = require("./patch.js") var h = require("./h.js") var create = require("./create-element.js") var VNode = require('./vnode/vnode.js') var VText = require('./vnode/vtext.js') module.exports = { diff: diff, patch: patch, h: h, create: create, VNode: VNode, VText: VText } },{"./create-element.js":292,"./diff.js":293,"./h.js":294,"./patch.js":296,"./vnode/vnode.js":314,"./vnode/vtext.js":316}],296:[function(require,module,exports){ var patch = require("./vdom/patch.js") module.exports = patch },{"./vdom/patch.js":301}],297:[function(require,module,exports){ var isObject = require("is-object") var isHook = require("../vnode/is-vhook.js") module.exports = applyProperties function applyProperties(node, props, previous) { for (var propName in props) { var propValue = props[propName] if (propValue === undefined) { removeProperty(node, propName, propValue, previous); } else if (isHook(propValue)) { removeProperty(node, propName, propValue, previous) if (propValue.hook) { propValue.hook(node, propName, previous ? previous[propName] : undefined) } } else { if (isObject(propValue)) { patchObject(node, props, previous, propName, propValue); } else { node[propName] = propValue } } } } function removeProperty(node, propName, propValue, previous) { if (previous) { var previousValue = previous[propName] if (!isHook(previousValue)) { if (propName === "attributes") { for (var attrName in previousValue) { node.removeAttribute(attrName) } } else if (propName === "style") { for (var i in previousValue) { node.style[i] = "" } } else if (typeof previousValue === "string") { node[propName] = "" } else { node[propName] = null } } else if (previousValue.unhook) { previousValue.unhook(node, propName, propValue) } } } function patchObject(node, props, previous, propName, propValue) { var previousValue = previous ? previous[propName] : undefined // Set attributes if (propName === "attributes") { for (var attrName in propValue) { var attrValue = propValue[attrName] if (attrValue === undefined) { node.removeAttribute(attrName) } else { node.setAttribute(attrName, attrValue) } } return } if(previousValue && isObject(previousValue) && getPrototype(previousValue) !== getPrototype(propValue)) { node[propName] = propValue return } if (!isObject(node[propName])) { node[propName] = {} } var replacer = propName === "style" ? "" : undefined for (var k in propValue) { var value = propValue[k] node[propName][k] = (value === undefined) ? replacer : value } } function getPrototype(value) { if (Object.getPrototypeOf) { return Object.getPrototypeOf(value) } else if (value.__proto__) { return value.__proto__ } else if (value.constructor) { return value.constructor.prototype } } },{"../vnode/is-vhook.js":309,"is-object":206}],298:[function(require,module,exports){ var document = require("global/document") var applyProperties = require("./apply-properties") var isVNode = require("../vnode/is-vnode.js") var isVText = require("../vnode/is-vtext.js") var isWidget = require("../vnode/is-widget.js") var handleThunk = require("../vnode/handle-thunk.js") module.exports = createElement function createElement(vnode, opts) { var doc = opts ? opts.document || document : document var warn = opts ? opts.warn : null vnode = handleThunk(vnode).a if (isWidget(vnode)) { return vnode.init() } else if (isVText(vnode)) { return doc.createTextNode(vnode.text) } else if (!isVNode(vnode)) { if (warn) { warn("Item is not a valid virtual dom node", vnode) } return null } var node = (vnode.namespace === null) ? doc.createElement(vnode.tagName) : doc.createElementNS(vnode.namespace, vnode.tagName) var props = vnode.properties applyProperties(node, props) var children = vnode.children for (var i = 0; i < children.length; i++) { var childNode = createElement(children[i], opts) if (childNode) { node.appendChild(childNode) } } return node } },{"../vnode/handle-thunk.js":307,"../vnode/is-vnode.js":310,"../vnode/is-vtext.js":311,"../vnode/is-widget.js":312,"./apply-properties":297,"global/document":185}],299:[function(require,module,exports){ // Maps a virtual DOM tree onto a real DOM tree in an efficient manner. // We don't want to read all of the DOM nodes in the tree so we use // the in-order tree indexing to eliminate recursion down certain branches. // We only recurse into a DOM node if we know that it contains a child of // interest. var noChild = {} module.exports = domIndex function domIndex(rootNode, tree, indices, nodes) { if (!indices || indices.length === 0) { return {} } else { indices.sort(ascending) return recurse(rootNode, tree, indices, nodes, 0) } } function recurse(rootNode, tree, indices, nodes, rootIndex) { nodes = nodes || {} if (rootNode) { if (indexInRange(indices, rootIndex, rootIndex)) { nodes[rootIndex] = rootNode } var vChildren = tree.children if (vChildren) { var childNodes = rootNode.childNodes for (var i = 0; i < tree.children.length; i++) { rootIndex += 1 var vChild = vChildren[i] || noChild var nextIndex = rootIndex + (vChild.count || 0) // skip recursion down the tree if there are no nodes down here if (indexInRange(indices, rootIndex, nextIndex)) { recurse(childNodes[i], vChild, indices, nodes, rootIndex) } rootIndex = nextIndex } } } return nodes } // Binary search for an index in the interval [left, right] function indexInRange(indices, left, right) { if (indices.length === 0) { return false } var minIndex = 0 var maxIndex = indices.length - 1 var currentIndex var currentItem while (minIndex <= maxindex)="" {="" currentindex="((maxIndex" +="" minindex)="" 2)="">> 0 currentItem = indices[currentIndex] if (minIndex === maxIndex) { return currentItem >= left && currentItem <= 1="" right="" }="" else="" if="" (currentitem="" <="" left)="" {="" minindex="currentIndex" +=""> right) { maxIndex = currentIndex - 1 } else { return true } } return false; } function ascending(a, b) { return a > b ? 1 : -1 } },{}],300:[function(require,module,exports){ var applyProperties = require("./apply-properties") var isWidget = require("../vnode/is-widget.js") var VPatch = require("../vnode/vpatch.js") var updateWidget = require("./update-widget") module.exports = applyPatch function applyPatch(vpatch, domNode, renderOptions) { var type = vpatch.type var vNode = vpatch.vNode var patch = vpatch.patch switch (type) { case VPatch.REMOVE: return removeNode(domNode, vNode) case VPatch.INSERT: return insertNode(domNode, patch, renderOptions) case VPatch.VTEXT: return stringPatch(domNode, vNode, patch, renderOptions) case VPatch.WIDGET: return widgetPatch(domNode, vNode, patch, renderOptions) case VPatch.VNODE: return vNodePatch(domNode, vNode, patch, renderOptions) case VPatch.ORDER: reorderChildren(domNode, patch) return domNode case VPatch.PROPS: applyProperties(domNode, patch, vNode.properties) return domNode case VPatch.THUNK: return replaceRoot(domNode, renderOptions.patch(domNode, patch, renderOptions)) default: return domNode } } function removeNode(domNode, vNode) { var parentNode = domNode.parentNode if (parentNode) { parentNode.removeChild(domNode) } destroyWidget(domNode, vNode); return null } function insertNode(parentNode, vNode, renderOptions) { var newNode = renderOptions.render(vNode, renderOptions) if (parentNode) { parentNode.appendChild(newNode) } return parentNode } function stringPatch(domNode, leftVNode, vText, renderOptions) { var newNode if (domNode.nodeType === 3) { domNode.replaceData(0, domNode.length, vText.text) newNode = domNode } else { var parentNode = domNode.parentNode newNode = renderOptions.render(vText, renderOptions) if (parentNode && newNode !== domNode) { parentNode.replaceChild(newNode, domNode) } } return newNode } function widgetPatch(domNode, leftVNode, widget, renderOptions) { var updating = updateWidget(leftVNode, widget) var newNode if (updating) { newNode = widget.update(leftVNode, domNode) || domNode } else { newNode = renderOptions.render(widget, renderOptions) } var parentNode = domNode.parentNode if (parentNode && newNode !== domNode) { parentNode.replaceChild(newNode, domNode) } if (!updating) { destroyWidget(domNode, leftVNode) } return newNode } function vNodePatch(domNode, leftVNode, vNode, renderOptions) { var parentNode = domNode.parentNode var newNode = renderOptions.render(vNode, renderOptions) if (parentNode && newNode !== domNode) { parentNode.replaceChild(newNode, domNode) } return newNode } function destroyWidget(domNode, w) { if (typeof w.destroy === "function" && isWidget(w)) { w.destroy(domNode) } } function reorderChildren(domNode, moves) { var childNodes = domNode.childNodes var keyMap = {} var node var remove var insert for (var i = 0; i < moves.removes.length; i++) { remove = moves.removes[i] node = childNodes[remove.from] if (remove.key) { keyMap[remove.key] = node } domNode.removeChild(node) } var length = childNodes.length for (var j = 0; j < moves.inserts.length; j++) { insert = moves.inserts[j] node = keyMap[insert.key] // this is the weirdest bug i've ever seen in webkit domNode.insertBefore(node, insert.to >= length++ ? null : childNodes[insert.to]) } } function replaceRoot(oldRoot, newRoot) { if (oldRoot && newRoot && oldRoot !== newRoot && oldRoot.parentNode) { oldRoot.parentNode.replaceChild(newRoot, oldRoot) } return newRoot; } },{"../vnode/is-widget.js":312,"../vnode/vpatch.js":315,"./apply-properties":297,"./update-widget":302}],301:[function(require,module,exports){ var document = require("global/document") var isArray = require("x-is-array") var render = require("./create-element") var domIndex = require("./dom-index") var patchOp = require("./patch-op") module.exports = patch function patch(rootNode, patches, renderOptions) { renderOptions = renderOptions || {} renderOptions.patch = renderOptions.patch && renderOptions.patch !== patch ? renderOptions.patch : patchRecursive renderOptions.render = renderOptions.render || render return renderOptions.patch(rootNode, patches, renderOptions) } function patchRecursive(rootNode, patches, renderOptions) { var indices = patchIndices(patches) if (indices.length === 0) { return rootNode } var index = domIndex(rootNode, patches.a, indices) var ownerDocument = rootNode.ownerDocument if (!renderOptions.document && ownerDocument !== document) { renderOptions.document = ownerDocument } for (var i = 0; i < indices.length; i++) { var nodeIndex = indices[i] rootNode = applyPatch(rootNode, index[nodeIndex], patches[nodeIndex], renderOptions) } return rootNode } function applyPatch(rootNode, domNode, patchList, renderOptions) { if (!domNode) { return rootNode } var newNode if (isArray(patchList)) { for (var i = 0; i < patchList.length; i++) { newNode = patchOp(patchList[i], domNode, renderOptions) if (domNode === rootNode) { rootNode = newNode } } } else { newNode = patchOp(patchList, domNode, renderOptions) if (domNode === rootNode) { rootNode = newNode } } return rootNode } function patchIndices(patches) { var indices = [] for (var key in patches) { if (key !== "a") { indices.push(Number(key)) } } return indices } },{"./create-element":298,"./dom-index":299,"./patch-op":300,"global/document":185,"x-is-array":327}],302:[function(require,module,exports){ var isWidget = require("../vnode/is-widget.js") module.exports = updateWidget function updateWidget(a, b) { if (isWidget(a) && isWidget(b)) { if ("name" in a && "name" in b) { return a.id === b.id } else { return a.init === b.init } } return false } },{"../vnode/is-widget.js":312}],303:[function(require,module,exports){ 'use strict'; var EvStore = require('ev-store'); module.exports = EvHook; function EvHook(value) { if (!(this instanceof EvHook)) { return new EvHook(value); } this.value = value; } EvHook.prototype.hook = function (node, propertyName) { var es = EvStore(node); var propName = propertyName.substr(3); es[propName] = this.value; }; EvHook.prototype.unhook = function(node, propertyName) { var es = EvStore(node); var propName = propertyName.substr(3); es[propName] = undefined; }; },{"ev-store":170}],304:[function(require,module,exports){ 'use strict'; module.exports = SoftSetHook; function SoftSetHook(value) { if (!(this instanceof SoftSetHook)) { return new SoftSetHook(value); } this.value = value; } SoftSetHook.prototype.hook = function (node, propertyName) { if (node[propertyName] !== this.value) { node[propertyName] = this.value; } }; },{}],305:[function(require,module,exports){ 'use strict'; var isArray = require('x-is-array'); var VNode = require('../vnode/vnode.js'); var VText = require('../vnode/vtext.js'); var isVNode = require('../vnode/is-vnode'); var isVText = require('../vnode/is-vtext'); var isWidget = require('../vnode/is-widget'); var isHook = require('../vnode/is-vhook'); var isVThunk = require('../vnode/is-thunk'); var parseTag = require('./parse-tag.js'); var softSetHook = require('./hooks/soft-set-hook.js'); var evHook = require('./hooks/ev-hook.js'); module.exports = h; function h(tagName, properties, children) { var childNodes = []; var tag, props, key, namespace; if (!children && isChildren(properties)) { children = properties; props = {}; } props = props || properties || {}; tag = parseTag(tagName, props); // support keys if (props.hasOwnProperty('key')) { key = props.key; props.key = undefined; } // support namespace if (props.hasOwnProperty('namespace')) { namespace = props.namespace; props.namespace = undefined; } // fix cursor bug if (tag === 'INPUT' && !namespace && props.hasOwnProperty('value') && props.value !== undefined && !isHook(props.value) ) { props.value = softSetHook(props.value); } transformProperties(props); if (children !== undefined && children !== null) { addChild(children, childNodes, tag, props); } return new VNode(tag, props, childNodes, key, namespace); } function addChild(c, childNodes, tag, props) { if (typeof c === 'string') { childNodes.push(new VText(c)); } else if (typeof c === 'number') { childNodes.push(new VText(String(c))); } else if (isChild(c)) { childNodes.push(c); } else if (isArray(c)) { for (var i = 0; i < c.length; i++) { addChild(c[i], childNodes, tag, props); } } else if (c === null || c === undefined) { return; } else { throw UnexpectedVirtualElement({ foreignObject: c, parentVnode: { tagName: tag, properties: props } }); } } function transformProperties(props) { for (var propName in props) { if (props.hasOwnProperty(propName)) { var value = props[propName]; if (isHook(value)) { continue; } if (propName.substr(0, 3) === 'ev-') { // add ev-foo support props[propName] = evHook(value); } } } } function isChild(x) { return isVNode(x) || isVText(x) || isWidget(x) || isVThunk(x); } function isChildren(x) { return typeof x === 'string' || isArray(x) || isChild(x); } function UnexpectedVirtualElement(data) { var err = new Error(); err.type = 'virtual-hyperscript.unexpected.virtual-element'; err.message = 'Unexpected virtual child passed to h().\n' + 'Expected a VNode / Vthunk / VWidget / string but:\n' + 'got:\n' + errorString(data.foreignObject) + '.\n' + 'The parent vnode is:\n' + errorString(data.parentVnode) '\n' + 'Suggested fix: change your `h(..., [ ... ])` callsite.'; err.foreignObject = data.foreignObject; err.parentVnode = data.parentVnode; return err; } function errorString(obj) { try { return JSON.stringify(obj, null, ' '); } catch (e) { return String(obj); } } },{"../vnode/is-thunk":308,"../vnode/is-vhook":309,"../vnode/is-vnode":310,"../vnode/is-vtext":311,"../vnode/is-widget":312,"../vnode/vnode.js":314,"../vnode/vtext.js":316,"./hooks/ev-hook.js":303,"./hooks/soft-set-hook.js":304,"./parse-tag.js":306,"x-is-array":327}],306:[function(require,module,exports){ 'use strict'; var split = require('browser-split'); var classIdSplit = /([\.#]?[a-zA-Z0-9\u007F-\uFFFF_:-]+)/; var notClassId = /^\.|#/; module.exports = parseTag; function parseTag(tag, props) { if (!tag) { return 'DIV'; } var noId = !(props.hasOwnProperty('id')); var tagParts = split(tag, classIdSplit); var tagName = null; if (notClassId.test(tagParts[1])) { tagName = 'DIV'; } var classes, part, type, i; for (i = 0; i < tagParts.length; i++) { part = tagParts[i]; if (!part) { continue; } type = part.charAt(0); if (!tagName) { tagName = part; } else if (type === '.') { classes = classes || []; classes.push(part.substring(1, part.length)); } else if (type === '#' && noId) { props.id = part.substring(1, part.length); } } if (classes) { if (props.className) { classes.push(props.className); } props.className = classes.join(' '); } return props.namespace ? tagName : tagName.toUpperCase(); } },{"browser-split":146}],307:[function(require,module,exports){ var isVNode = require("./is-vnode") var isVText = require("./is-vtext") var isWidget = require("./is-widget") var isThunk = require("./is-thunk") module.exports = handleThunk function handleThunk(a, b) { var renderedA = a var renderedB = b if (isThunk(b)) { renderedB = renderThunk(b, a) } if (isThunk(a)) { renderedA = renderThunk(a, null) } return { a: renderedA, b: renderedB } } function renderThunk(thunk, previous) { var renderedThunk = thunk.vnode if (!renderedThunk) { renderedThunk = thunk.vnode = thunk.render(previous) } if (!(isVNode(renderedThunk) || isVText(renderedThunk) || isWidget(renderedThunk))) { throw new Error("thunk did not return a valid node"); } return renderedThunk } },{"./is-thunk":308,"./is-vnode":310,"./is-vtext":311,"./is-widget":312}],308:[function(require,module,exports){ module.exports = isThunk function isThunk(t) { return t && t.type === "Thunk" } },{}],309:[function(require,module,exports){ module.exports = isHook function isHook(hook) { return hook && (typeof hook.hook === "function" && !hook.hasOwnProperty("hook") || typeof hook.unhook === "function" && !hook.hasOwnProperty("unhook")) } },{}],310:[function(require,module,exports){ var version = require("./version") module.exports = isVirtualNode function isVirtualNode(x) { return x && x.type === "VirtualNode" && x.version === version } },{"./version":313}],311:[function(require,module,exports){ var version = require("./version") module.exports = isVirtualText function isVirtualText(x) { return x && x.type === "VirtualText" && x.version === version } },{"./version":313}],312:[function(require,module,exports){ module.exports = isWidget function isWidget(w) { return w && w.type === "Widget" } },{}],313:[function(require,module,exports){ module.exports = "2" },{}],314:[function(require,module,exports){ var version = require("./version") var isVNode = require("./is-vnode") var isWidget = require("./is-widget") var isThunk = require("./is-thunk") var isVHook = require("./is-vhook") module.exports = VirtualNode var noProperties = {} var noChildren = [] function VirtualNode(tagName, properties, children, key, namespace) { this.tagName = tagName this.properties = properties || noProperties this.children = children || noChildren this.key = key != null ? String(key) : undefined this.namespace = (typeof namespace === "string") ? namespace : null var count = (children && children.length) || 0 var descendants = 0 var hasWidgets = false var hasThunks = false var descendantHooks = false var hooks for (var propName in properties) { if (properties.hasOwnProperty(propName)) { var property = properties[propName] if (isVHook(property) && property.unhook) { if (!hooks) { hooks = {} } hooks[propName] = property } } } for (var i = 0; i < count; i++) { var child = children[i] if (isVNode(child)) { descendants += child.count || 0 if (!hasWidgets && child.hasWidgets) { hasWidgets = true } if (!hasThunks && child.hasThunks) { hasThunks = true } if (!descendantHooks && (child.hooks || child.descendantHooks)) { descendantHooks = true } } else if (!hasWidgets && isWidget(child)) { if (typeof child.destroy === "function") { hasWidgets = true } } else if (!hasThunks && isThunk(child)) { hasThunks = true; } } this.count = count + descendants this.hasWidgets = hasWidgets this.hasThunks = hasThunks this.hooks = hooks this.descendantHooks = descendantHooks } VirtualNode.prototype.version = version VirtualNode.prototype.type = "VirtualNode" },{"./is-thunk":308,"./is-vhook":309,"./is-vnode":310,"./is-widget":312,"./version":313}],315:[function(require,module,exports){ var version = require("./version") VirtualPatch.NONE = 0 VirtualPatch.VTEXT = 1 VirtualPatch.VNODE = 2 VirtualPatch.WIDGET = 3 VirtualPatch.PROPS = 4 VirtualPatch.ORDER = 5 VirtualPatch.INSERT = 6 VirtualPatch.REMOVE = 7 VirtualPatch.THUNK = 8 module.exports = VirtualPatch function VirtualPatch(type, vNode, patch) { this.type = Number(type) this.vNode = vNode this.patch = patch } VirtualPatch.prototype.version = version VirtualPatch.prototype.type = "VirtualPatch" },{"./version":313}],316:[function(require,module,exports){ var version = require("./version") module.exports = VirtualText function VirtualText(text) { this.text = String(text) } VirtualText.prototype.version = version VirtualText.prototype.type = "VirtualText" },{"./version":313}],317:[function(require,module,exports){ var isObject = require("is-object") var isHook = require("../vnode/is-vhook") module.exports = diffProps function diffProps(a, b) { var diff for (var aKey in a) { if (!(aKey in b)) { diff = diff || {} diff[aKey] = undefined } var aValue = a[aKey] var bValue = b[aKey] if (aValue === bValue) { continue } else if (isObject(aValue) && isObject(bValue)) { if (getPrototype(bValue) !== getPrototype(aValue)) { diff = diff || {} diff[aKey] = bValue } else if (isHook(bValue)) { diff = diff || {} diff[aKey] = bValue } else { var objectDiff = diffProps(aValue, bValue) if (objectDiff) { diff = diff || {} diff[aKey] = objectDiff } } } else { diff = diff || {} diff[aKey] = bValue } } for (var bKey in b) { if (!(bKey in a)) { diff = diff || {} diff[bKey] = b[bKey] } } return diff } function getPrototype(value) { if (Object.getPrototypeOf) { return Object.getPrototypeOf(value) } else if (value.__proto__) { return value.__proto__ } else if (value.constructor) { return value.constructor.prototype } } },{"../vnode/is-vhook":309,"is-object":206}],318:[function(require,module,exports){ var isArray = require("x-is-array") var VPatch = require("../vnode/vpatch") var isVNode = require("../vnode/is-vnode") var isVText = require("../vnode/is-vtext") var isWidget = require("../vnode/is-widget") var isThunk = require("../vnode/is-thunk") var handleThunk = require("../vnode/handle-thunk") var diffProps = require("./diff-props") module.exports = diff function diff(a, b) { var patch = { a: a } walk(a, b, patch, 0) return patch } function walk(a, b, patch, index) { if (a === b) { return } var apply = patch[index] var applyClear = false if (isThunk(a) || isThunk(b)) { thunks(a, b, patch, index) } else if (b == null) { // If a is a widget we will add a remove patch for it // Otherwise any child widgets/hooks must be destroyed. // This prevents adding two remove patches for a widget. if (!isWidget(a)) { clearState(a, patch, index) apply = patch[index] } apply = appendPatch(apply, new VPatch(VPatch.REMOVE, a, b)) } else if (isVNode(b)) { if (isVNode(a)) { if (a.tagName === b.tagName && a.namespace === b.namespace && a.key === b.key) { var propsPatch = diffProps(a.properties, b.properties) if (propsPatch) { apply = appendPatch(apply, new VPatch(VPatch.PROPS, a, propsPatch)) } apply = diffChildren(a, b, patch, apply, index) } else { apply = appendPatch(apply, new VPatch(VPatch.VNODE, a, b)) applyClear = true } } else { apply = appendPatch(apply, new VPatch(VPatch.VNODE, a, b)) applyClear = true } } else if (isVText(b)) { if (!isVText(a)) { apply = appendPatch(apply, new VPatch(VPatch.VTEXT, a, b)) applyClear = true } else if (a.text !== b.text) { apply = appendPatch(apply, new VPatch(VPatch.VTEXT, a, b)) } } else if (isWidget(b)) { if (!isWidget(a)) { applyClear = true } apply = appendPatch(apply, new VPatch(VPatch.WIDGET, a, b)) } if (apply) { patch[index] = apply } if (applyClear) { clearState(a, patch, index) } } function diffChildren(a, b, patch, apply, index) { var aChildren = a.children var orderedSet = reorder(aChildren, b.children) var bChildren = orderedSet.children var aLen = aChildren.length var bLen = bChildren.length var len = aLen > bLen ? aLen : bLen for (var i = 0; i < len; i++) { var leftNode = aChildren[i] var rightNode = bChildren[i] index += 1 if (!leftNode) { if (rightNode) { // Excess nodes in b need to be added apply = appendPatch(apply, new VPatch(VPatch.INSERT, null, rightNode)) } } else { walk(leftNode, rightNode, patch, index) } if (isVNode(leftNode) && leftNode.count) { index += leftNode.count } } if (orderedSet.moves) { // Reorder nodes last apply = appendPatch(apply, new VPatch( VPatch.ORDER, a, orderedSet.moves )) } return apply } function clearState(vNode, patch, index) { // TODO: Make this a single walk, not two unhook(vNode, patch, index) destroyWidgets(vNode, patch, index) } // Patch records for all destroyed widgets must be added because we need // a DOM node reference for the destroy function function destroyWidgets(vNode, patch, index) { if (isWidget(vNode)) { if (typeof vNode.destroy === "function") { patch[index] = appendPatch( patch[index], new VPatch(VPatch.REMOVE, vNode, null) ) } } else if (isVNode(vNode) && (vNode.hasWidgets || vNode.hasThunks)) { var children = vNode.children var len = children.length for (var i = 0; i < len; i++) { var child = children[i] index += 1 destroyWidgets(child, patch, index) if (isVNode(child) && child.count) { index += child.count } } } else if (isThunk(vNode)) { thunks(vNode, null, patch, index) } } // Create a sub-patch for thunks function thunks(a, b, patch, index) { var nodes = handleThunk(a, b) var thunkPatch = diff(nodes.a, nodes.b) if (hasPatches(thunkPatch)) { patch[index] = new VPatch(VPatch.THUNK, null, thunkPatch) } } function hasPatches(patch) { for (var index in patch) { if (index !== "a") { return true } } return false } // Execute hooks when two nodes are identical function unhook(vNode, patch, index) { if (isVNode(vNode)) { if (vNode.hooks) { patch[index] = appendPatch( patch[index], new VPatch( VPatch.PROPS, vNode, undefinedKeys(vNode.hooks) ) ) } if (vNode.descendantHooks || vNode.hasThunks) { var children = vNode.children var len = children.length for (var i = 0; i < len; i++) { var child = children[i] index += 1 unhook(child, patch, index) if (isVNode(child) && child.count) { index += child.count } } } } else if (isThunk(vNode)) { thunks(vNode, null, patch, index) } } function undefinedKeys(obj) { var result = {} for (var key in obj) { result[key] = undefined } return result } // List diff, naive left to right reordering function reorder(aChildren, bChildren) { // O(M) time, O(M) memory var bChildIndex = keyIndex(bChildren) var bKeys = bChildIndex.keys var bFree = bChildIndex.free if (bFree.length === bChildren.length) { return { children: bChildren, moves: null } } // O(N) time, O(N) memory var aChildIndex = keyIndex(aChildren) var aKeys = aChildIndex.keys var aFree = aChildIndex.free if (aFree.length === aChildren.length) { return { children: bChildren, moves: null } } // O(MAX(N, M)) memory var newChildren = [] var freeIndex = 0 var freeCount = bFree.length var deletedItems = 0 // Iterate through a and match a node in b // O(N) time, for (var i = 0 ; i < aChildren.length; i++) { var aItem = aChildren[i] var itemIndex if (aItem.key) { if (bKeys.hasOwnProperty(aItem.key)) { // Match up the old keys itemIndex = bKeys[aItem.key] newChildren.push(bChildren[itemIndex]) } else { // Remove old keyed items itemIndex = i - deletedItems++ newChildren.push(null) } } else { // Match the item in a with the next free item in b if (freeIndex < freeCount) { itemIndex = bFree[freeIndex++] newChildren.push(bChildren[itemIndex]) } else { // There are no free items in b to match with // the free items in a, so the extra free nodes // are deleted. itemIndex = i - deletedItems++ newChildren.push(null) } } } var lastFreeIndex = freeIndex >= bFree.length ? bChildren.length : bFree[freeIndex] // Iterate through b and append any new keys // O(M) time for (var j = 0; j < bChildren.length; j++) { var newItem = bChildren[j] if (newItem.key) { if (!aKeys.hasOwnProperty(newItem.key)) { // Add any new keyed items // We are adding new items to the end and then sorting them // in place. In future we should insert new items in place. newChildren.push(newItem) } } else if (j >= lastFreeIndex) { // Add any leftover non-keyed items newChildren.push(newItem) } } var simulate = newChildren.slice() var simulateIndex = 0 var removes = [] var inserts = [] var simulateItem for (var k = 0; k < bChildren.length;) { var wantedItem = bChildren[k] simulateItem = simulate[simulateIndex] // remove items while (simulateItem === null && simulate.length) { removes.push(remove(simulate, simulateIndex, null)) simulateItem = simulate[simulateIndex] } if (!simulateItem || simulateItem.key !== wantedItem.key) { // if we need a key in this position... if (wantedItem.key) { if (simulateItem && simulateItem.key) { // if an insert doesn't put this key in place, it needs to move if (bKeys[simulateItem.key] !== k + 1) { removes.push(remove(simulate, simulateIndex, simulateItem.key)) simulateItem = simulate[simulateIndex] // if the remove didn't put the wanted item in place, we need to insert it if (!simulateItem || simulateItem.key !== wantedItem.key) { inserts.push({key: wantedItem.key, to: k}) } // items are matching, so skip ahead else { simulateIndex++ } } else { inserts.push({key: wantedItem.key, to: k}) } } else { inserts.push({key: wantedItem.key, to: k}) } k++ } // a key in simulate has no matching wanted key, remove it else if (simulateItem && simulateItem.key) { removes.push(remove(simulate, simulateIndex, simulateItem.key)) } } else { simulateIndex++ k++ } } // remove all the remaining nodes from simulate while(simulateIndex < simulate.length) { simulateItem = simulate[simulateIndex] removes.push(remove(simulate, simulateIndex, simulateItem && simulateItem.key)) } // If the only moves we have are deletes then we can just // let the delete patch remove these items. if (removes.length === deletedItems && !inserts.length) { return { children: newChildren, moves: null } } return { children: newChildren, moves: { removes: removes, inserts: inserts } } } function remove(arr, index, key) { arr.splice(index, 1) return { from: index, key: key } } function keyIndex(children) { var keys = {} var free = [] var length = children.length for (var i = 0; i < length; i++) { var child = children[i] if (child.key) { keys[child.key] = i } else { free.push(i) } } return { keys: keys, // A hash of key name to index free: free // An array of unkeyed item indices } } function appendPatch(apply, patch) { if (apply) { if (isArray(apply)) { apply.push(patch) } else { apply = [apply, patch] } return apply } else { return patch } } },{"../vnode/handle-thunk":307,"../vnode/is-thunk":308,"../vnode/is-vnode":310,"../vnode/is-vtext":311,"../vnode/is-widget":312,"../vnode/vpatch":315,"./diff-props":317,"x-is-array":327}],319:[function(require,module,exports){ var SimplePeer = require('simple-peer') var events = require('events') var through = require('through2') var cuid = require('cuid') var once = require('once') var debug = require('debug')('webrtc-swarm') module.exports = function (hub, opts) { if (!opts) opts = {} var wrap = opts.wrap || function (data) { return data } var unwrap = opts.unwrap || function (data) { return data } var swarm = new events.EventEmitter() var remotes = {} var me = opts.uuid || cuid() debug('my uuid:', me) swarm.maxPeers = opts.maxPeers || Infinity swarm.peers = [] var setup = function (peer, id) { peer.on('connect', function () { debug('connected to peer', id) swarm.peers.push(peer) swarm.emit('peer', peer, id) swarm.emit('connect', peer, id) }) var onclose = once(function (err) { debug('disconnected from peer', id, err) if (remotes[id] === peer) delete remotes[id] var i = swarm.peers.indexOf(peer) if (i > -1) swarm.peers.splice(i, 1) swarm.emit('disconnect', peer, id) }) var signals = [] var sending = false var kick = function () { if (sending || !signals.length) return sending = true var data = {from: me, signal: signals.shift()} data = wrap(data, id) hub.broadcast(id, data, function () { sending = false kick() }) } peer.on('signal', function (sig) { signals.push(sig) kick() }) peer.on('error', onclose) peer.once('close', onclose) } hub.subscribe('all').pipe(through.obj(function (data, enc, cb) { data = unwrap(data, 'all') if (!data) return cb() debug('/all', data) if (data.from === me) { debug('skipping self', data.from) return cb() } if (data.type === 'connect') { if (swarm.peers.length >= swarm.maxPeers) { debug('skipping because maxPeers is met', data.from) return cb() } if (remotes[data.from]) { debug('skipping existing remote', data.from) return cb() } debug('connecting to new peer (as initiator)', data.from) var peer = new SimplePeer({ wrtc: opts.wrtc, initiator: true, config: opts.config }) setup(peer, data.from) remotes[data.from] = peer } cb() })) var connect = function () { if (swarm.peers.length >= swarm.maxPeers) return var data = {type: 'connect', from: me} data = wrap(data, 'all') hub.broadcast('all', data, function () { setTimeout(connect, Math.floor(Math.random() * 2000) + (swarm.peers.length ? 13000 : 3000)) }) } hub.subscribe(me).once('open', connect).pipe(through.obj(function (data, enc, cb) { data = unwrap(data, me) if (!data) return cb() var peer = remotes[data.from] if (!peer) { if (!data.signal || data.signal.type !== 'offer') { debug('skipping non-offer', data) return cb() } debug('connecting to new peer (as not initiator)', data.from) peer = remotes[data.from] = new SimplePeer({ wrtc: opts.wrtc, config: opts.config }) setup(peer, data.from) } debug('signalling', data.from, data.signal) peer.signal(data.signal) cb() })) return swarm } },{"cuid":151,"debug":152,"events":82,"once":240,"simple-peer":268,"through2":325}],320:[function(require,module,exports){ arguments[4][113][0].apply(exports,arguments) },{"./_stream_readable":321,"./_stream_writable":323,"core-util-is":150,"dup":113,"inherits":204,"process-nextick-args":243}],321:[function(require,module,exports){ (function (process){ 'use strict'; module.exports = Readable; /**/ var processNextTick = require('process-nextick-args'); /**/ /**/ var isArray = require('isarray'); /**/ /**/ var Buffer = require('buffer').Buffer; /**/ Readable.ReadableState = ReadableState; var EE = require('events'); /**/ var EElistenerCount = function(emitter, type) { return emitter.listeners(type).length; }; /**/ /**/ var Stream; (function (){try{ Stream = require('st' + 'ream'); }catch(_){}finally{ if (!Stream) Stream = require('events').EventEmitter; }}()) /**/ var Buffer = require('buffer').Buffer; /**/ var util = require('core-util-is'); util.inherits = require('inherits'); /**/ /**/ var debugUtil = require('util'); var debug; if (debugUtil && debugUtil.debuglog) { debug = debugUtil.debuglog('stream'); } else { debug = function () {}; } /**/ var StringDecoder; util.inherits(Readable, Stream); var Duplex; function ReadableState(options, stream) { Duplex = Duplex || require('./_stream_duplex'); options = options || {}; // object stream flag. Used to make read(n) ignore n and to // make all the buffer merging and length checks go away this.objectMode = !!options.objectMode; if (stream instanceof Duplex) this.objectMode = this.objectMode || !!options.readableObjectMode; // the point at which it stops calling _read() to fill the buffer // Note: 0 is a valid value, means "don't call _read preemptively ever" var hwm = options.highWaterMark; var defaultHwm = this.objectMode ? 16 : 16 * 1024; this.highWaterMark = (hwm || hwm === 0) ? hwm : defaultHwm; // cast to ints. this.highWaterMark = ~~this.highWaterMark; this.buffer = []; this.length = 0; this.pipes = null; this.pipesCount = 0; this.flowing = null; this.ended = false; this.endEmitted = false; this.reading = false; // a flag to be able to tell if the onwrite cb is called immediately, // or on a later tick. We set this to true at first, because any // actions that shouldn't happen until "later" should generally also // not happen before the first write call. this.sync = true; // whenever we return null, then we set a flag to say // that we're awaiting a 'readable' event emission. this.needReadable = false; this.emittedReadable = false; this.readableListening = false; // Crypto is kind of old and crusty. Historically, its default string // encoding is 'binary' so we have to make this configurable. // Everything else in the universe uses 'utf8', though. this.defaultEncoding = options.defaultEncoding || 'utf8'; // when piping, we only care about 'readable' events that happen // after read()ing all the bytes and not getting any pushback. this.ranOut = false; // the number of writers that are awaiting a drain event in .pipe()s this.awaitDrain = 0; // if true, a maybeReadMore has been scheduled this.readingMore = false; this.decoder = null; this.encoding = null; if (options.encoding) { if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder; this.decoder = new StringDecoder(options.encoding); this.encoding = options.encoding; } } var Duplex; function Readable(options) { Duplex = Duplex || require('./_stream_duplex'); if (!(this instanceof Readable)) return new Readable(options); this._readableState = new ReadableState(options, this); // legacy this.readable = true; if (options && typeof options.read === 'function') this._read = options.read; Stream.call(this); } // Manually shove something into the read() buffer. // This returns true if the highWaterMark has not been hit yet, // similar to how Writable.write() returns true if you should // write() some more. Readable.prototype.push = function(chunk, encoding) { var state = this._readableState; if (!state.objectMode && typeof chunk === 'string') { encoding = encoding || state.defaultEncoding; if (encoding !== state.encoding) { chunk = new Buffer(chunk, encoding); encoding = ''; } } return readableAddChunk(this, state, chunk, encoding, false); }; // Unshift should *always* be something directly out of read() Readable.prototype.unshift = function(chunk) { var state = this._readableState; return readableAddChunk(this, state, chunk, '', true); }; Readable.prototype.isPaused = function() { return this._readableState.flowing === false; }; function readableAddChunk(stream, state, chunk, encoding, addToFront) { var er = chunkInvalid(state, chunk); if (er) { stream.emit('error', er); } else if (chunk === null) { state.reading = false; onEofChunk(stream, state); } else if (state.objectMode || chunk && chunk.length > 0) { if (state.ended && !addToFront) { var e = new Error('stream.push() after EOF'); stream.emit('error', e); } else if (state.endEmitted && addToFront) { var e = new Error('stream.unshift() after end event'); stream.emit('error', e); } else { if (state.decoder && !addToFront && !encoding) chunk = state.decoder.write(chunk); if (!addToFront) state.reading = false; // if we want the data now, just emit it. if (state.flowing && state.length === 0 && !state.sync) { stream.emit('data', chunk); stream.read(0); } else { // update the buffer info. state.length += state.objectMode ? 1 : chunk.length; if (addToFront) state.buffer.unshift(chunk); else state.buffer.push(chunk); if (state.needReadable) emitReadable(stream); } maybeReadMore(stream, state); } } else if (!addToFront) { state.reading = false; } return needMoreData(state); } // if it's past the high water mark, we can push in some more. // Also, if we have no data yet, we can stand some // more bytes. This is to work around cases where hwm=0, // such as the repl. Also, if the push() triggered a // readable event, and the user called read(largeNumber) such that // needReadable was set, then we ought to push more, so that another // 'readable' event will be triggered. function needMoreData(state) { return !state.ended && (state.needReadable || state.length < state.highWaterMark || state.length === 0); } // backwards compatibility. Readable.prototype.setEncoding = function(enc) { if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder; this._readableState.decoder = new StringDecoder(enc); this._readableState.encoding = enc; return this; }; // Don't raise the hwm > 8MB var MAX_HWM = 0x800000; function computeNewHighWaterMark(n) { if (n >= MAX_HWM) { n = MAX_HWM; } else { // Get the next highest power of 2 n--; n |= n >>> 1; n |= n >>> 2; n |= n >>> 4; n |= n >>> 8; n |= n >>> 16; n++; } return n; } function howMuchToRead(n, state) { if (state.length === 0 && state.ended) return 0; if (state.objectMode) return n === 0 ? 0 : 1; if (n === null || isNaN(n)) { // only flow one buffer at a time if (state.flowing && state.buffer.length) return state.buffer[0].length; else return state.length; } if (n <= 0)="" return="" 0;="" if="" we're="" asking="" for="" more="" than="" the="" target="" buffer="" level,="" then="" raise="" water="" mark.="" bump="" up="" to="" next="" highest="" power="" of="" 2,="" prevent="" increasing="" it="" excessively="" in="" tiny="" amounts.="" (n=""> state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n); // don't have that much. return null, unless we've ended. if (n > state.length) { if (!state.ended) { state.needReadable = true; return 0; } else { return state.length; } } return n; } // you can override either this method, or the async _read(n) below. Readable.prototype.read = function(n) { debug('read', n); var state = this._readableState; var nOrig = n; if (typeof n !== 'number' || n > 0) state.emittedReadable = false; // if we're doing read(0) to trigger a readable event, but we // already have a bunch of data in the buffer, then just trigger // the 'readable' event and move on. if (n === 0 && state.needReadable && (state.length >= state.highWaterMark || state.ended)) { debug('read: emitReadable', state.length, state.ended); if (state.length === 0 && state.ended) endReadable(this); else emitReadable(this); return null; } n = howMuchToRead(n, state); // if we've ended, and we're now clear, then finish it up. if (n === 0 && state.ended) { if (state.length === 0) endReadable(this); return null; } // All the actual chunk generation logic needs to be // *below* the call to _read. The reason is that in certain // synthetic stream cases, such as passthrough streams, _read // may be a completely synchronous operation which may change // the state of the read buffer, providing enough data when // before there was *not* enough. // // So, the steps are: // 1. Figure out what the state of things will be after we do // a read from the buffer. // // 2. If that resulting state will trigger a _read, then call _read. // Note that this may be asynchronous, or synchronous. Yes, it is // deeply ugly to write APIs this way, but that still doesn't mean // that the Readable class should behave improperly, as streams are // designed to be sync/async agnostic. // Take note if the _read call is sync or async (ie, if the read call // has returned yet), so that we know whether or not it's safe to emit // 'readable' etc. // // 3. Actually pull the requested chunks out of the buffer and return. // if we need a readable event, then we need to do some reading. var doRead = state.needReadable; debug('need readable', doRead); // if we currently have less than the highWaterMark, then also read some if (state.length === 0 || state.length - n < state.highWaterMark) { doRead = true; debug('length less than watermark', doRead); } // however, if we've ended, then there's no point, and if we're already // reading, then it's unnecessary. if (state.ended || state.reading) { doRead = false; debug('reading or ended', doRead); } if (doRead) { debug('do read'); state.reading = true; state.sync = true; // if the length is currently zero, then we *need* a readable event. if (state.length === 0) state.needReadable = true; // call internal read method this._read(state.highWaterMark); state.sync = false; } // If _read pushed data synchronously, then `reading` will be false, // and we need to re-evaluate how much data we can return to the user. if (doRead && !state.reading) n = howMuchToRead(nOrig, state); var ret; if (n > 0) ret = fromList(n, state); else ret = null; if (ret === null) { state.needReadable = true; n = 0; } state.length -= n; // If we have nothing in the buffer, then we want to know // as soon as we *do* get something into the buffer. if (state.length === 0 && !state.ended) state.needReadable = true; // If we tried to read() past the EOF, then emit end on the next tick. if (nOrig !== n && state.ended && state.length === 0) endReadable(this); if (ret !== null) this.emit('data', ret); return ret; }; function chunkInvalid(state, chunk) { var er = null; if (!(Buffer.isBuffer(chunk)) && typeof chunk !== 'string' && chunk !== null && chunk !== undefined && !state.objectMode) { er = new TypeError('Invalid non-string/buffer chunk'); } return er; } function onEofChunk(stream, state) { if (state.ended) return; if (state.decoder) { var chunk = state.decoder.end(); if (chunk && chunk.length) { state.buffer.push(chunk); state.length += state.objectMode ? 1 : chunk.length; } } state.ended = true; // emit 'readable' now to make sure it gets picked up. emitReadable(stream); } // Don't emit readable right away in sync mode, because this can trigger // another read() call => stack overflow. This way, it might trigger // a nextTick recursion warning, but that's not so bad. function emitReadable(stream) { var state = stream._readableState; state.needReadable = false; if (!state.emittedReadable) { debug('emitReadable', state.flowing); state.emittedReadable = true; if (state.sync) processNextTick(emitReadable_, stream); else emitReadable_(stream); } } function emitReadable_(stream) { debug('emit readable'); stream.emit('readable'); flow(stream); } // at this point, the user has presumably seen the 'readable' event, // and called read() to consume some data. that may have triggered // in turn another _read(n) call, in which case reading = true if // it's in progress. // However, if we're not ended, or reading, and the length < hwm, // then go ahead and try to read some more preemptively. function maybeReadMore(stream, state) { if (!state.readingMore) { state.readingMore = true; processNextTick(maybeReadMore_, stream, state); } } function maybeReadMore_(stream, state) { var len = state.length; while (!state.reading && !state.flowing && !state.ended && state.length < state.highWaterMark) { debug('maybeReadMore read 0'); stream.read(0); if (len === state.length) // didn't get any data, stop spinning. break; else len = state.length; } state.readingMore = false; } // abstract method. to be overridden in specific implementation classes. // call cb(er, data) where data is <= 0="" 1="" n="" in="" length.="" for="" virtual="" (non-string,="" non-buffer)="" streams,="" "length"="" is="" somewhat="" arbitrary,="" and="" perhaps="" not="" very="" meaningful.="" readable.prototype._read="function(n)" {="" this.emit('error',="" new="" error('not="" implemented'));="" };="" readable.prototype.pipe="function(dest," pipeopts)="" var="" src="this;" state="this._readableState;" switch="" (state.pipescount)="" case="" 0:="" state.pipes="dest;" break;="" 1:="" dest];="" default:="" state.pipes.push(dest);="" }="" state.pipescount="" +="1;" debug('pipe="" count="%d" opts="%j'," state.pipescount,="" pipeopts);="" doend="(!pipeOpts" ||="" pipeopts.end="" !="=" false)="" &&="" dest="" process.stdout="" process.stderr;="" endfn="doEnd" ?="" onend="" :="" cleanup;="" if="" (state.endemitted)="" processnexttick(endfn);="" else="" src.once('end',="" endfn);="" dest.on('unpipe',="" onunpipe);="" function="" onunpipe(readable)="" debug('onunpipe');="" (readable="==" src)="" cleanup();="" onend()="" debug('onend');="" dest.end();="" when="" the="" drains,="" it="" reduces="" awaitdrain="" counter="" on="" source.="" this="" would="" be="" more="" elegant="" with="" a="" .once()="" handler="" flow(),="" but="" adding="" removing="" repeatedly="" too="" slow.="" ondrain="pipeOnDrain(src);" dest.on('drain',="" ondrain);="" cleanedup="false;" cleanup()="" debug('cleanup');="" cleanup="" event="" handlers="" once="" pipe="" broken="" dest.removelistener('close',="" onclose);="" dest.removelistener('finish',="" onfinish);="" dest.removelistener('drain',="" dest.removelistener('error',="" onerror);="" dest.removelistener('unpipe',="" src.removelistener('end',="" onend);="" cleanup);="" src.removelistener('data',="" ondata);="" reader="" waiting="" drain="" from="" specific="" writer,="" then="" cause="" to="" never="" start="" flowing="" again.="" so,="" awaiting="" drain,="" we="" just="" call="" now.="" don't="" know,="" assume="" that="" are="" one.="" (state.awaitdrain="" (!dest._writablestate="" dest._writablestate.needdrain))="" ondrain();="" src.on('data',="" ondata(chunk)="" debug('ondata');="" ret="dest.write(chunk);" (false="==" ret)="" user="" unpiped="" during="" `dest.write()`,="" possible="" get="" stuck="" permanently="" paused="" write="" also="" returned="" false.="" (state.pipescount="==" state.pipes[0]="==" src.listenercount('data')="==" !cleanedup)="" debug('false="" response,="" pause',="" src._readablestate.awaitdrain);="" src._readablestate.awaitdrain++;="" src.pause();="" has="" an="" error,="" stop="" piping="" into="" it.="" however,="" suppress="" throwing="" behavior="" this.="" onerror(er)="" debug('onerror',="" er);="" unpipe();="" (eelistenercount(dest,="" 'error')="==" 0)="" dest.emit('error',="" brutally="" ugly="" hack="" make="" sure="" our="" error="" attached="" before="" any="" userland="" ones.="" do="" (!dest._events="" !dest._events.error)="" dest.on('error',="" (isarray(dest._events.error))="" dest._events.error.unshift(onerror);="" dest._events.error="[onerror," dest._events.error];="" both="" close="" finish="" should="" trigger="" unpipe,="" only="" once.="" onclose()="" dest.once('close',="" onfinish()="" debug('onfinish');="" dest.once('finish',="" unpipe()="" debug('unpipe');="" src.unpipe(dest);="" tell="" it's="" being="" piped="" dest.emit('pipe',="" src);="" flow="" hasn't="" been="" started="" already.="" (!state.flowing)="" resume');="" src.resume();="" return="" dest;="" pipeondrain(src)="" function()="" debug('pipeondrain',="" state.awaitdrain);="" (state.awaitdrain)="" state.awaitdrain--;="" eelistenercount(src,="" 'data'))="" state.flowing="true;" flow(src);="" readable.prototype.unpipe="function(dest)" we're="" anywhere,="" nothing.="" this;="" one="" destination.="" most="" common="" case.="" 1)="" passed="" one,="" right="" (dest="" state.pipes)="" (!dest)="" got="" match.="" (dest)="" dest.emit('unpipe',="" this);="" slow="" multiple destinations.="" remove="" all.="" dests="state.pipes;" len="state.pipesCount;" (var="" i="0;" <="" len;="" i++)="" dests[i].emit('unpipe',="" try="" find="" dest);="" (i="==" -1)="" state.pipes.splice(i,="" 1);="" -="1;" set="" up="" data="" events="" they="" asked="" ensure="" readable="" listeners="" eventually="" something="" readable.prototype.on="function(ev," fn)="" res="Stream.prototype.on.call(this," ev,="" fn);="" listening="" data,="" explicitly="" paused,="" resume="" of="" next="" tick.="" (ev="==" 'data'="" false="" this._readablestate.flowing)="" this.resume();="" 'readable'="" this.readable)="" (!state.readablelistening)="" state.readablelistening="true;" state.emittedreadable="false;" state.needreadable="true;" (!state.reading)="" processnexttick(nreadingnexttick,="" (state.length)="" emitreadable(this,="" state);="" res;="" readable.prototype.addlistener="Readable.prototype.on;" nreadingnexttick(self)="" debug('readable="" nexttick="" read="" 0');="" self.read(0);="" pause()="" resume()="" remnants="" legacy="" stream="" api="" uses="" them,="" old="" mode.="" readable.prototype.resume="function()" debug('resume');="" resume(this,="" resume(stream,="" state)="" (!state.resumescheduled)="" state.resumescheduled="true;" processnexttick(resume_,="" stream,="" resume_(stream,="" debug('resume="" stream.read(0);="" stream.emit('resume');="" flow(stream);="" (state.flowing="" !state.reading)="" readable.prototype.pause="function()" debug('call="" pause="" this._readablestate.flowing);="" debug('pause');="" this._readablestate.flowing="false;" this.emit('pause');="" flow(stream)="" debug('flow',="" state.flowing);="" (state.flowing)="" chunk="stream.read();" while="" (null="" wrap="" old-style="" as="" async *not*="" part="" interface.="" unfortunate="" mess="" history.="" readable.prototype.wrap="function(stream)" self="this;" stream.on('end',="" debug('wrapped="" end');="" (state.decoder="" !state.ended)="" (chunk="" chunk.length)="" self.push(chunk);="" self.push(null);="" });="" stream.on('data',="" function(chunk)="" data');="" (state.decoder)="" skip="" over="" falsy="" values="" objectmode="" (state.objectmode="" null="" undefined))="" return;="" (!state.objectmode="" (!chunk="" !chunk.length))="" (!ret)="" stream.pause();="" proxy="" all="" other="" methods.="" important="" wrapping="" filters="" duplexes.="" stream)="" (this[i]="==" undefined="" typeof="" stream[i]="==" 'function')="" this[i]="function(method)" stream[method].apply(stream,="" arguments);="" }(i);="" certain="" events.="" 'close',="" 'destroy',="" 'pause',="" 'resume'];="" foreach(events,="" function(ev)="" stream.on(ev,="" self.emit.bind(self,="" ev));="" consume="" some="" bytes,="" simply="" unpause="" underlying="" stream.="" self._read="function(n)" _read',="" n);="" (paused)="" stream.resume();="" self;="" exposed="" testing="" purposes="" only.="" readable._fromlist="fromList;" pluck="" off="" bytes="" array="" buffers.="" length="" combined="" lengths="" buffers="" list.="" fromlist(n,="" list="state.buffer;" stringmode="!!state.decoder;" ret;="" nothing="" list,="" definitely="" empty.="" (list.length="==" null;="" (length="==" (objectmode)="" (!n="">= length) { // read it all, truncate the array. if (stringMode) ret = list.join(''); else if (list.length === 1) ret = list[0]; else ret = Buffer.concat(list, length); list.length = 0; } else { // read just some of it. if (n < list[0].length) { // just take a part of the first list item. // slice is the same for buffers and strings. var buf = list[0]; ret = buf.slice(0, n); list[0] = buf.slice(n); } else if (n === list[0].length) { // first list is a perfect match ret = list.shift(); } else { // complex case. // we have enough to cover it, but it spans past the first buffer. if (stringMode) ret = ''; else ret = new Buffer(n); var c = 0; for (var i = 0, l = list.length; i < l && c < n; i++) { var buf = list[0]; var cpy = Math.min(n - c, buf.length); if (stringMode) ret += buf.slice(0, cpy); else buf.copy(ret, c, 0, cpy); if (cpy < buf.length) list[0] = buf.slice(cpy); else list.shift(); c += cpy; } } } return ret; } function endReadable(stream) { var state = stream._readableState; // If we get here before consuming all the bytes, then that is a // bug in node. Should never happen. if (state.length > 0) throw new Error('endReadable called on non-empty stream'); if (!state.endEmitted) { state.ended = true; processNextTick(endReadableNT, state, stream); } } function endReadableNT(state, stream) { // Check that we didn't get one last unshift. if (!state.endEmitted && state.length === 0) { state.endEmitted = true; stream.readable = false; stream.emit('end'); } } function forEach (xs, f) { for (var i = 0, l = xs.length; i < l; i++) { f(xs[i], i); } } function indexOf (xs, x) { for (var i = 0, l = xs.length; i < l; i++) { if (xs[i] === x) return i; } return -1; } }).call(this,require('_process')) },{"./_stream_duplex":320,"_process":104,"buffer":45,"core-util-is":150,"events":82,"inherits":204,"isarray":209,"process-nextick-args":243,"string_decoder/":272,"util":19}],322:[function(require,module,exports){ arguments[4][116][0].apply(exports,arguments) },{"./_stream_duplex":320,"core-util-is":150,"dup":116,"inherits":204}],323:[function(require,module,exports){ arguments[4][117][0].apply(exports,arguments) },{"./_stream_duplex":320,"buffer":45,"core-util-is":150,"dup":117,"events":82,"inherits":204,"process-nextick-args":243,"util-deprecate":287}],324:[function(require,module,exports){ arguments[4][120][0].apply(exports,arguments) },{"./lib/_stream_transform.js":322,"dup":120}],325:[function(require,module,exports){ (function (process){ var Transform = require('readable-stream/transform') , inherits = require('util').inherits , xtend = require('xtend') function DestroyableTransform(opts) { Transform.call(this, opts) this._destroyed = false } inherits(DestroyableTransform, Transform) DestroyableTransform.prototype.destroy = function(err) { if (this._destroyed) return this._destroyed = true var self = this process.nextTick(function() { if (err) self.emit('error', err) self.emit('close') }) } // a noop _transform function function noop (chunk, enc, callback) { callback(null, chunk) } // create a new export function, used by both the main export and // the .ctor export, contains common logic for dealing with arguments function through2 (construct) { return function (options, transform, flush) { if (typeof options == 'function') { flush = transform transform = options options = {} } if (typeof transform != 'function') transform = noop if (typeof flush != 'function') flush = null return construct(options, transform, flush) } } // main export, just make me a transform stream! module.exports = through2(function (options, transform, flush) { var t2 = new DestroyableTransform(options) t2._transform = transform if (flush) t2._flush = flush return t2 }) // make me a reusable prototype that I can `new`, or implicitly `new` // with a constructor call module.exports.ctor = through2(function (options, transform, flush) { function Through2 (override) { if (!(this instanceof Through2)) return new Through2(override) this.options = xtend(options, override) DestroyableTransform.call(this, this.options) } inherits(Through2, DestroyableTransform) Through2.prototype._transform = transform if (flush) Through2.prototype._flush = flush return Through2 }) module.exports.obj = through2(function (options, transform, flush) { var t2 = new DestroyableTransform(xtend({ objectMode: true, highWaterMark: 16 }, options)) t2._transform = transform if (flush) t2._flush = flush return t2 }) }).call(this,require('_process')) },{"_process":104,"readable-stream/transform":324,"util":135,"xtend":330}],326:[function(require,module,exports){ // Returns a wrapper function that returns a wrapped callback // The wrapper function should do some stuff, and return a // presumably different callback function. // This makes sure that own properties are retained, so that // decorations and such are not lost along the way. module.exports = wrappy function wrappy (fn, cb) { if (fn && cb) return wrappy(fn)(cb) if (typeof fn !== 'function') throw new TypeError('need wrapper function') Object.keys(fn).forEach(function (k) { wrapper[k] = fn[k] }) return wrapper function wrapper() { var args = new Array(arguments.length) for (var i = 0; i < args.length; i++) { args[i] = arguments[i] } var ret = fn.apply(this, args) var cb = args[args.length-1] if (typeof ret === 'function' && ret !== cb) { Object.keys(cb).forEach(function (k) { ret[k] = cb[k] }) } return ret } } },{}],327:[function(require,module,exports){ var nativeIsArray = Array.isArray var toString = Object.prototype.toString module.exports = nativeIsArray || isArray function isArray(obj) { return toString.call(obj) === "[object Array]" } },{}],328:[function(require,module,exports){ "use strict"; var window = require("global/window") var once = require("once") var isFunction = require("is-function") var parseHeaders = require("parse-headers") var xtend = require("xtend") module.exports = createXHR createXHR.XMLHttpRequest = window.XMLHttpRequest || noop createXHR.XDomainRequest = "withCredentials" in (new createXHR.XMLHttpRequest()) ? createXHR.XMLHttpRequest : window.XDomainRequest forEachArray(["get", "put", "post", "patch", "head", "delete"], function(method) { createXHR[method === "delete" ? "del" : method] = function(uri, options, callback) { options = initParams(uri, options, callback) options.method = method.toUpperCase() return _createXHR(options) } }) function forEachArray(array, iterator) { for (var i = 0; i < array.length; i++) { iterator(array[i]) } } function isEmpty(obj){ for(var i in obj){ if(obj.hasOwnProperty(i)) return false } return true } function initParams(uri, options, callback) { var params = uri if (isFunction(options)) { callback = options if (typeof uri === "string") { params = {uri:uri} } } else { params = xtend(options, {uri: uri}) } params.callback = callback return params } function createXHR(uri, options, callback) { options = initParams(uri, options, callback) return _createXHR(options) } function _createXHR(options) { var callback = options.callback if(typeof callback === "undefined"){ throw new Error("callback argument missing") } callback = once(callback) function readystatechange() { if (xhr.readyState === 4) { loadFunc() } } function getBody() { // Chrome with requestType=blob throws errors arround when even testing access to responseText var body = undefined if (xhr.response) { body = xhr.response } else if (xhr.responseType === "text" || !xhr.responseType) { body = xhr.responseText || xhr.responseXML } if (isJson) { try { body = JSON.parse(body) } catch (e) {} } return body } var failureResponse = { body: undefined, headers: {}, statusCode: 0, method: method, url: uri, rawRequest: xhr } function errorFunc(evt) { clearTimeout(timeoutTimer) if(!(evt instanceof Error)){ evt = new Error("" + (evt || "Unknown XMLHttpRequest Error") ) } evt.statusCode = 0 callback(evt, failureResponse) } // will load the data & process the response in a special response object function loadFunc() { if (aborted) return var status clearTimeout(timeoutTimer) if(options.useXDR && xhr.status===undefined) { //IE8 CORS GET successful response doesn't have a status field, but body is fine status = 200 } else { status = (xhr.status === 1223 ? 204 : xhr.status) } var response = failureResponse var err = null if (status !== 0){ response = { body: getBody(), statusCode: status, method: method, headers: {}, url: uri, rawRequest: xhr } if(xhr.getAllResponseHeaders){ //remember xhr can in fact be XDR for CORS in IE response.headers = parseHeaders(xhr.getAllResponseHeaders()) } } else { err = new Error("Internal XMLHttpRequest Error") } callback(err, response, response.body) } var xhr = options.xhr || null if (!xhr) { if (options.cors || options.useXDR) { xhr = new createXHR.XDomainRequest() }else{ xhr = new createXHR.XMLHttpRequest() } } var key var aborted var uri = xhr.url = options.uri || options.url var method = xhr.method = options.method || "GET" var body = options.body || options.data || null var headers = xhr.headers = options.headers || {} var sync = !!options.sync var isJson = false var timeoutTimer if ("json" in options) { isJson = true headers["accept"] || headers["Accept"] || (headers["Accept"] = "application/json") //Don't override existing accept header declared by user if (method !== "GET" && method !== "HEAD") { headers["content-type"] || headers["Content-Type"] || (headers["Content-Type"] = "application/json") //Don't override existing accept header declared by user body = JSON.stringify(options.json) } } xhr.onreadystatechange = readystatechange xhr.onload = loadFunc xhr.onerror = errorFunc // IE9 must have onprogress be set to a unique function. xhr.onprogress = function () { // IE must die } xhr.ontimeout = errorFunc xhr.open(method, uri, !sync, options.username, options.password) //has to be after open if(!sync) { xhr.withCredentials = !!options.withCredentials } // Cannot set timeout with sync request // not setting timeout on the xhr object, because of old webkits etc. not handling that correctly // both npm's request and jquery 1.x use this kind of timeout, so this is being consistent if (!sync && options.timeout > 0 ) { timeoutTimer = setTimeout(function(){ aborted=true//IE9 may still call readystatechange xhr.abort("timeout") var e = new Error("XMLHttpRequest timeout") e.code = "ETIMEDOUT" errorFunc(e) }, options.timeout ) } if (xhr.setRequestHeader) { for(key in headers){ if(headers.hasOwnProperty(key)){ xhr.setRequestHeader(key, headers[key]) } } } else if (options.headers && !isEmpty(options.headers)) { throw new Error("Headers cannot be set on an XDomainRequest object") } if ("responseType" in options) { xhr.responseType = options.responseType } if ("beforeSend" in options && typeof options.beforeSend === "function" ) { options.beforeSend(xhr) } xhr.send(body) return xhr } function noop() {} },{"global/window":186,"is-function":205,"once":329,"parse-headers":241,"xtend":330}],329:[function(require,module,exports){ module.exports = once once.proto = once(function () { Object.defineProperty(Function.prototype, 'once', { value: function () { return once(this) }, configurable: true }) }) function once (fn) { var called = false return function () { if (called) return called = true return fn.apply(this, arguments) } } },{}],330:[function(require,module,exports){ module.exports = extend var hasOwnProperty = Object.prototype.hasOwnProperty; function extend() { var target = {} for (var i = 0; i < arguments.length; i++) { var source = arguments[i] for (var key in source) { if (hasOwnProperty.call(source, key)) { target[key] = source[key] } } } return target } },{}],331:[function(require,module,exports){ module.exports = extend var hasOwnProperty = Object.prototype.hasOwnProperty; function extend(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] for (var key in source) { if (hasOwnProperty.call(source, key)) { target[key] = source[key] } } } return target } },{}]},{},[137]) //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy5udm0tZmlzaC92NS40LjEvbGliL25vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCIuLi8uLi8uLi8uLi8ubnZtLWZpc2gvdjUuNC4xL2xpYi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS9saWIvX2VtcHR5LmpzIiwiLi4vLi4vLi4vLi4vLm52bS1maXNoL3Y1LjQuMS9saWIvbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL2FzbjEuanMvbGliL2FzbjEuanMiLCIuLi8uLi8uLi8uLi8ubnZtLWZpc2gvdjUuNC4xL2xpYi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvYXNuMS5qcy9saWIvYXNuMS9hcGkuanMiLCIuLi8uLi8uLi8uLi8ubnZtLWZpc2gvdjUuNC4xL2xpYi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvYXNuMS5qcy9saWIvYXNuMS9iYXNlL2J1ZmZlci5qcyIsIi4uLy4uLy4uLy4uLy5udm0tZmlzaC92NS40LjEvbGliL25vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9hc24xLmpzL2xpYi9hc24xL2Jhc2UvaW5kZXguanMiLCIuLi8uLi8uLi8uLi8ubnZtLWZpc2gvdjUuNC4xL2xpYi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvYXNuMS5qcy9saWIvYXNuMS9iYXNlL25vZGUuanMiLCIuLi8uLi8uLi8uLi8ubnZtLWZpc2gvdjUuNC4xL2xpYi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvYXNuMS5qcy9saWIvYXNuMS9iYXNlL3JlcG9ydGVyLmpzIiwiLi4vLi4vLi4vLi4vLm52bS1maXNoL3Y1LjQuMS9saWIvbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL2FzbjEuanMvbGliL2FzbjEvY29uc3RhbnRzL2Rlci5qcyIsIi4uLy4uLy4uLy4uLy5udm0tZmlzaC92NS40LjEvbGliL25vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9hc24xLmpzL2xpYi9hc24xL2NvbnN0YW50cy9pbmRleC5qcyIsIi4uLy4uLy4uLy4uLy5udm0tZmlzaC92NS40LjEvbGliL25vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9hc24xLmpzL2xpYi9hc24xL2RlY29kZXJzL2Rlci5qcyIsIi4uLy4uLy4uLy4uLy5udm0tZmlzaC92NS40LjEvbGliL25vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9hc24xLmpzL2xpYi9hc24xL2RlY29kZXJzL2luZGV4LmpzIiwiLi4vLi4vLi4vLi4vLm52bS1maXNoL3Y1LjQuMS9saWIvbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL2FzbjEuanMvbGliL2FzbjEvZGVjb2RlcnMvcGVtLmpzIiwiLi4vLi4vLi4vLi4vLm52bS1maXNoL3Y1LjQuMS9saWIvbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL2FzbjEuanMvbGliL2FzbjEvZW5jb2RlcnMvZGVyLmpzIiwiLi4vLi4vLi4vLi4vLm52bS1maXNoL3Y1LjQuMS9saWIvbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL2FzbjEuanMvbGliL2FzbjEvZW5jb2RlcnMvaW5kZXguanMiLCIuLi8uLi8uLi8uLi8ubnZtLWZpc2gvdjUuNC4xL2xpYi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvYXNuMS5qcy9saWIvYXNuMS9lbmNvZGVycy9wZW0uanMiLCIuLi8uLi8uLi8uLi8ubnZtLWZpc2gvdjUuNC4xL2xpYi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvYmFzZTY0LWpzL2xpYi9iNjQuanMiLCIuLi8uLi8uLi8uLi8ubnZtLWZpc2gvdjUuNC4xL2xpYi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvYm4uanMvbGliL2JuLmpzIiwiLi4vLi4vLi4vLi4vLm52bS1maXNoL3Y1LjQuMS9saWIvbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL2Jyb3JhbmQvaW5kZXguanMiLCIuLi8uLi8uLi8uLi8ubnZtLWZpc2gvdjUuNC4xL2xpYi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS1hZXMvYWVzLmpzIiwiLi4vLi4vLi4vLi4vLm52bS1maXNoL3Y1LjQuMS9saWIvbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnktYWVzL2F1dGhDaXBoZXIuanMiLCIuLi8uLi8uLi8uLi8ubnZtLWZpc2gvdjUuNC4xL2xpYi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS1hZXMvYnJvd3Nlci5qcyIsIi4uLy4uLy4uLy4uLy5udm0tZmlzaC92NS40LjEvbGliL25vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9icm93c2VyaWZ5LWFlcy9kZWNyeXB0ZXIuanMiLCIuLi8uLi8uLi8uLi8ubnZtLWZpc2gvdjUuNC4xL2xpYi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS1hZXMvZW5jcnlwdGVyLmpzIiwiLi4vLi4vLi4vLi4vLm52bS1maXNoL3Y1LjQuMS9saWIvbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnktYWVzL2doYXNoLmpzIiwiLi4vLi4vLi4vLi4vLm52bS1maXNoL3Y1LjQuMS9saWIvbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnktYWVzL21vZGVzLmpzIiwiLi4vLi4vLi4vLi4vLm52bS1maXNoL3Y1LjQuMS9saWIvbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnktYWVzL21vZGVzL2NiYy5qcyIsIi4uLy4uLy4uLy4uLy5udm0tZmlzaC92NS40LjEvbGliL25vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9icm93c2VyaWZ5LWFlcy9tb2Rlcy9jZmIuanMiLCIuLi8uLi8uLi8uLi8ubnZtLWZpc2gvdjUuNC4xL2xpYi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS1hZXMvbW9kZXMvY2ZiMS5qcyIsIi4uLy4uLy4uLy4uLy5udm0tZmlzaC92NS40LjEvbGliL25vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9icm93c2VyaWZ5LWFlcy9tb2Rlcy9jZmI4LmpzIiwiLi4vLi4vLi4vLi4vLm52bS1maXNoL3Y1LjQuMS9saWIvbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnktYWVzL21vZGVzL2N0ci5qcyIsIi4uLy4uLy4uLy4uLy5udm0tZmlzaC92NS40LjEvbGliL25vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9icm93c2VyaWZ5LWFlcy9tb2Rlcy9lY2IuanMiLCIuLi8uLi8uLi8uLi8ubnZtLWZpc2gvdjUuNC4xL2xpYi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS1hZXMvbW9kZXMvb2ZiLmpzIiwiLi4vLi4vLi4vLi4vLm52bS1maXNoL3Y1LjQuMS9saWIvbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnktYWVzL3N0cmVhbUNpcGhlci5qcyIsIi4uLy4uLy4uLy4uLy5udm0tZmlzaC92NS40LjEvbGliL25vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9icm93c2VyaWZ5LWNpcGhlci9icm93c2VyLmpzIiwiLi4vLi4vLi4vLi4vLm52bS1maXNoL3Y1LjQuMS9saWIvbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnktZGVzL2luZGV4LmpzIiwiLi4vLi4vLi4vLi4vLm52bS1maXNoL3Y1LjQuMS9saWIvbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnktZGVzL21vZGVzLmpzIiwiLi4vLi4vLi4vLi4vLm52bS1maXNoL3Y1LjQuMS9saWIvbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnktcnNhL2luZGV4LmpzIiwiLi4vLi4vLi4vLi4vLm52bS1maXNoL3Y1LjQuMS9saWIvbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnktc2lnbi9hbGdvcy5qcyIsIi4uLy4uLy4uLy4uLy5udm0tZmlzaC92NS40LjEvbGliL25vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9icm93c2VyaWZ5LXNpZ24vYnJvd3Nlci5qcyIsIi4uLy4uLy4uLy4uLy5udm0tZmlzaC92NS40LjEvbGliL25vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9icm93c2VyaWZ5LXNpZ24vY3VydmVzLmpzIiwiLi4vLi4vLi4vLi4vLm52bS1maXNoL3Y1LjQuMS9saWIvbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnktc2lnbi9zaWduLmpzIiwiLi4vLi4vLi4vLi4vLm52bS1maXNoL3Y1LjQuMS9saWIvbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnktc2lnbi92ZXJpZnkuanMiLCIuLi8uLi8uLi8uLi8ubnZtLWZpc2gvdjUuNC4xL2xpYi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvYnVmZmVyLXhvci9pbmRleC5qcyIsIi4uLy4uLy4uLy4uLy5udm0tZmlzaC92NS40LjEvbGliL25vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9idWZmZXIvaW5kZXguanMiLCIuLi8uLi8uLi8uLi8ubnZtLWZpc2gvdjUuNC4xL2xpYi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvYnVmZmVyL25vZGVfbW9kdWxlcy9pc2FycmF5L2luZGV4LmpzIiwiLi4vLi4vLi4vLi4vLm52bS1maXNoL3Y1LjQuMS9saWIvbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL2NpcGhlci1iYXNlL2luZGV4LmpzIiwiLi4vLi4vLi4vLi4vLm52bS1maXNoL3Y1LjQuMS9saWIvbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL2NvcmUtdXRpbC1pcy9saWIvdXRpbC5qcyIsIi4uLy4uLy4uLy4uLy5udm0tZmlzaC92NS40LjEvbGliL25vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9jcmVhdGUtZWNkaC9icm93c2VyLmpzIiwiLi4vLi4vLi4vLi4vLm52bS1maXNoL3Y1LjQuMS9saWIvbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL2NyZWF0ZS1oYXNoL2Jyb3dzZXIuanMiLCIuLi8uLi8uLi8uLi8ubnZtLWZpc2gvdjUuNC4xL2xpYi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvY3JlYXRlLWhhc2gvaGVscGVycy5qcyIsIi4uLy4uLy4uLy4uLy5udm0tZmlzaC92NS40LjEvbGliL25vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9jcmVhdGUtaGFzaC9tZDUuanMiLCIuLi8uLi8uLi8uLi8ubnZtLWZpc2gvdjUuNC4xL2xpYi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvY3JlYXRlLWhtYWMvYnJvd3Nlci5qcyIsIi4uLy4uLy4uLy4uLy5udm0tZmlzaC92NS40LjEvbGliL25vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9jcnlwdG8tYnJvd3NlcmlmeS9pbmRleC5qcyIsIi4uLy4uLy4uLy4uLy5udm0tZmlzaC92NS40LjEvbGliL25vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9kZXMuanMvbGliL2Rlcy5qcyIsIi4uLy4uLy4uLy4uLy5udm0tZmlzaC92NS40LjEvbGliL25vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9kZXMuanMvbGliL2Rlcy9jYmMuanMiLCIuLi8uLi8uLi8uLi8ubnZtLWZpc2gvdjUuNC4xL2xpYi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvZGVzLmpzL2xpYi9kZXMvY2lwaGVyLmpzIiwiLi4vLi4vLi4vLi4vLm52bS1maXNoL3Y1LjQuMS9saWIvbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL2Rlcy5qcy9saWIvZGVzL2Rlcy5qcyIsIi4uLy4uLy4uLy4uLy5udm0tZmlzaC92NS40LjEvbGliL25vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9kZXMuanMvbGliL2Rlcy9lZGUuanMiLCIuLi8uLi8uLi8uLi8ubnZtLWZpc2gvdjUuNC4xL2xpYi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvZGVzLmpzL2xpYi9kZXMvdXRpbHMuanMiLCIuLi8uLi8uLi8uLi8ubnZtLWZpc2gvdjUuNC4xL2xpYi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvZGlmZmllLWhlbGxtYW4vYnJvd3Nlci5qcyIsIi4uLy4uLy4uLy4uLy5udm0tZmlzaC92NS40LjEvbGliL25vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9kaWZmaWUtaGVsbG1hbi9saWIvZGguanMiLCIuLi8uLi8uLi8uLi8ubnZtLWZpc2gvdjUuNC4xL2xpYi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvZGlmZmllLWhlbGxtYW4vbGliL2dlbmVyYXRlUHJpbWUuanMiLCIuLi8uLi8uLi8uLi8ubnZtLWZpc2gvdjUuNC4xL2xpYi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvZGlmZmllLWhlbGxtYW4vbGliL3ByaW1lcy5qc29uIiwiLi4vLi4vLi4vLi4vLm52bS1maXNoL3Y1LjQuMS9saWIvbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL2VsbGlwdGljL2xpYi9lbGxpcHRpYy5qcyIsIi4uLy4uLy4uLy4uLy5udm0tZmlzaC92NS40LjEvbGliL25vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9lbGxpcHRpYy9saWIvZWxsaXB0aWMvY3VydmUvYmFzZS5qcyIsIi4uLy4uLy4uLy4uLy5udm0tZmlzaC92NS40LjEvbGliL25vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9lbGxpcHRpYy9saWIvZWxsaXB0aWMvY3VydmUvZWR3YXJkcy5qcyIsIi4uLy4uLy4uLy4uLy5udm0tZmlzaC92NS40LjEvbGliL25vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9lbGxpcHRpYy9saWIvZWxsaXB0aWMvY3VydmUvaW5kZXguanMiLCIuLi8uLi8uLi8uLi8ubnZtLWZpc2gvdjUuNC4xL2xpYi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvZWxsaXB0aWMvbGliL2VsbGlwdGljL2N1cnZlL21vbnQuanMiLCIuLi8uLi8uLi8uLi8ubnZtLWZpc2gvdjUuNC4xL2xpYi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvZWxsaXB0aWMvbGliL2VsbGlwdGljL2N1cnZlL3Nob3J0LmpzIiwiLi4vLi4vLi4vLi4vLm52bS1maXNoL3Y1LjQuMS9saWIvbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL2VsbGlwdGljL2xpYi9lbGxpcHRpYy9jdXJ2ZXMuanMiLCIuLi8uLi8uLi8uLi8ubnZtLWZpc2gvdjUuNC4xL2xpYi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvZWxsaXB0aWMvbGliL2VsbGlwdGljL2VjL2luZGV4LmpzIiwiLi4vLi4vLi4vLi4vLm52bS1maXNoL3Y1LjQuMS9saWIvbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL2VsbGlwdGljL2xpYi9lbGxpcHRpYy9lYy9rZXkuanMiLCIuLi8uLi8uLi8uLi8ubnZtLWZpc2gvdjUuNC4xL2xpYi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvZWxsaXB0aWMvbGliL2VsbGlwdGljL2VjL3NpZ25hdHVyZS5qcyIsIi4uLy4uLy4uLy4uLy5udm0tZmlzaC92NS40LjEvbGliL25vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9lbGxpcHRpYy9saWIvZWxsaXB0aWMvZWRkc2EvaW5kZXguanMiLCIuLi8uLi8uLi8uLi8ubnZtLWZpc2gvdjUuNC4xL2xpYi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvZWxsaXB0aWMvbGliL2VsbGlwdGljL2VkZHNhL2tleS5qcyIsIi4uLy4uLy4uLy4uLy5udm0tZmlzaC92NS40LjEvbGliL25vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9lbGxpcHRpYy9saWIvZWxsaXB0aWMvZWRkc2Evc2lnbmF0dXJlLmpzIiwiLi4vLi4vLi4vLi4vLm52bS1maXNoL3Y1LjQuMS9saWIvbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL2VsbGlwdGljL2xpYi9lbGxpcHRpYy9obWFjLWRyYmcuanMiLCIuLi8uLi8uLi8uLi8ubnZtLWZpc2gvdjUuNC4xL2xpYi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvZWxsaXB0aWMvbGliL2VsbGlwdGljL3ByZWNvbXB1dGVkL3NlY3AyNTZrMS5qcyIsIi4uLy4uLy4uLy4uLy5udm0tZmlzaC92NS40LjEvbGliL25vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9lbGxpcHRpYy9saWIvZWxsaXB0aWMvdXRpbHMuanMiLCIuLi8uLi8uLi8uLi8ubnZtLWZpc2gvdjUuNC4xL2xpYi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvZWxsaXB0aWMvcGFja2FnZS5qc29uIiwiLi4vLi4vLi4vLi4vLm52bS1maXNoL3Y1LjQuMS9saWIvbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL2V2ZW50cy9ldmVudHMuanMiLCIuLi8uLi8uLi8uLi8ubnZtLWZpc2gvdjUuNC4xL2xpYi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvZXZwX2J5dGVzdG9rZXkvaW5kZXguanMiLCIuLi8uLi8uLi8uLi8ubnZtLWZpc2gvdjUuNC4xL2xpYi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvaGFzaC5qcy9saWIvaGFzaC5qcyIsIi4uLy4uLy4uLy4uLy5udm0tZmlzaC92NS40LjEvbGliL25vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9oYXNoLmpzL2xpYi9oYXNoL2NvbW1vbi5qcyIsIi4uLy4uLy4uLy4uLy5udm0tZmlzaC92NS40LjEvbGliL25vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9oYXNoLmpzL2xpYi9oYXNoL2htYWMuanMiLCIuLi8uLi8uLi8uLi8ubnZtLWZpc2gvdjUuNC4xL2xpYi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvaGFzaC5qcy9saWIvaGFzaC9yaXBlbWQuanMiLCIuLi8uLi8uLi8uLi8ubnZtLWZpc2gvdjUuNC4xL2xpYi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvaGFzaC5qcy9saWIvaGFzaC9zaGEuanMiLCIuLi8uLi8uLi8uLi8ubnZtLWZpc2gvdjUuNC4xL2xpYi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvaGFzaC5qcy9saWIvaGFzaC91dGlscy5qcyIsIi4uLy4uLy4uLy4uLy5udm0tZmlzaC92NS40LjEvbGliL25vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9pZWVlNzU0L2luZGV4LmpzIiwiLi4vLi4vLi4vLi4vLm52bS1maXNoL3Y1LjQuMS9saWIvbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL2luZGV4b2YvaW5kZXguanMiLCIuLi8uLi8uLi8uLi8ubnZtLWZpc2gvdjUuNC4xL2xpYi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvaW5oZXJpdHMvaW5oZXJpdHNfYnJvd3Nlci5qcyIsIi4uLy4uLy4uLy4uLy5udm0tZmlzaC92NS40LjEvbGliL25vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9pcy1idWZmZXIvaW5kZXguanMiLCIuLi8uLi8uLi8uLi8ubnZtLWZpc2gvdjUuNC4xL2xpYi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvaXNhcnJheS9pbmRleC5qcyIsIi4uLy4uLy4uLy4uLy5udm0tZmlzaC92NS40LjEvbGliL25vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9taWxsZXItcmFiaW4vbGliL21yLmpzIiwiLi4vLi4vLi4vLi4vLm52bS1maXNoL3Y1LjQuMS9saWIvbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL21pbmltYWxpc3RpYy1hc3NlcnQvaW5kZXguanMiLCIuLi8uLi8uLi8uLi8ubnZtLWZpc2gvdjUuNC4xL2xpYi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvcGFyc2UtYXNuMS9hZXNpZC5qc29uIiwiLi4vLi4vLi4vLi4vLm52bS1maXNoL3Y1LjQuMS9saWIvbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL3BhcnNlLWFzbjEvYXNuMS5qcyIsIi4uLy4uLy4uLy4uLy5udm0tZmlzaC92NS40LjEvbGliL25vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9wYXJzZS1hc24xL2ZpeFByb2MuanMiLCIuLi8uLi8uLi8uLi8ubnZtLWZpc2gvdjUuNC4xL2xpYi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvcGFyc2UtYXNuMS9pbmRleC5qcyIsIi4uLy4uLy4uLy4uLy5udm0tZmlzaC92NS40LjEvbGliL25vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9wYXRoLWJyb3dzZXJpZnkvaW5kZXguanMiLCIuLi8uLi8uLi8uLi8ubnZtLWZpc2gvdjUuNC4xL2xpYi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvcGJrZGYyL2Jyb3dzZXIuanMiLCIuLi8uLi8uLi8uLi8ubnZtLWZpc2gvdjUuNC4xL2xpYi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvcHJvY2Vzcy1uZXh0aWNrLWFyZ3MvaW5kZXguanMiLCIuLi8uLi8uLi8uLi8ubnZtLWZpc2gvdjUuNC4xL2xpYi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvcHJvY2Vzcy9icm93c2VyLmpzIiwiLi4vLi4vLi4vLi4vLm52bS1maXNoL3Y1LjQuMS9saWIvbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL3B1YmxpYy1lbmNyeXB0L2Jyb3dzZXIuanMiLCIuLi8uLi8uLi8uLi8ubnZtLWZpc2gvdjUuNC4xL2xpYi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvcHVibGljLWVuY3J5cHQvbWdmLmpzIiwiLi4vLi4vLi4vLi4vLm52bS1maXNoL3Y1LjQuMS9saWIvbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL3B1YmxpYy1lbmNyeXB0L3ByaXZhdGVEZWNyeXB0LmpzIiwiLi4vLi4vLi4vLi4vLm52bS1maXNoL3Y1LjQuMS9saWIvbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL3B1YmxpYy1lbmNyeXB0L3B1YmxpY0VuY3J5cHQuanMiLCIuLi8uLi8uLi8uLi8ubnZtLWZpc2gvdjUuNC4xL2xpYi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvcHVibGljLWVuY3J5cHQvd2l0aFB1YmxpYy5qcyIsIi4uLy4uLy4uLy4uLy5udm0tZmlzaC92NS40LjEvbGliL25vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9wdWJsaWMtZW5jcnlwdC94b3IuanMiLCIuLi8uLi8uLi8uLi8ubnZtLWZpc2gvdjUuNC4xL2xpYi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvcmFuZG9tYnl0ZXMvYnJvd3Nlci5qcyIsIi4uLy4uLy4uLy4uLy5udm0tZmlzaC92NS40LjEvbGliL25vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vZHVwbGV4LmpzIiwiLi4vLi4vLi4vLi4vLm52bS1maXNoL3Y1LjQuMS9saWIvbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvX3N0cmVhbV9kdXBsZXguanMiLCIuLi8uLi8uLi8uLi8ubnZtLWZpc2gvdjUuNC4xL2xpYi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9fc3RyZWFtX3Bhc3N0aHJvdWdoLmpzIiwiLi4vLi4vLi4vLi4vLm52bS1maXNoL3Y1LjQuMS9saWIvbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvX3N0cmVhbV9yZWFkYWJsZS5qcyIsIi4uLy4uLy4uLy4uLy5udm0tZmlzaC92NS40LjEvbGliL25vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL19zdHJlYW1fdHJhbnNmb3JtLmpzIiwiLi4vLi4vLi4vLi4vLm52bS1maXNoL3Y1LjQuMS9saWIvbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvX3N0cmVhbV93cml0YWJsZS5qcyIsIi4uLy4uLy4uLy4uLy5udm0tZmlzaC92NS40LjEvbGliL25vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vcGFzc3Rocm91Z2guanMiLCIuLi8uLi8uLi8uLi8ubnZtLWZpc2gvdjUuNC4xL2xpYi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL3JlYWRhYmxlLmpzIiwiLi4vLi4vLi4vLi4vLm52bS1maXNoL3Y1LjQuMS9saWIvbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS90cmFuc2Zvcm0uanMiLCIuLi8uLi8uLi8uLi8ubnZtLWZpc2gvdjUuNC4xL2xpYi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL3dyaXRhYmxlLmpzIiwiLi4vLi4vLi4vLi4vLm52bS1maXNoL3Y1LjQuMS9saWIvbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL3JpcGVtZDE2MC9saWIvcmlwZW1kMTYwLmpzIiwiLi4vLi4vLi4vLi4vLm52bS1maXNoL3Y1LjQuMS9saWIvbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL3NoYS5qcy9oYXNoLmpzIiwiLi4vLi4vLi4vLi4vLm52bS1maXNoL3Y1LjQuMS9saWIvbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL3NoYS5qcy9pbmRleC5qcyIsIi4uLy4uLy4uLy4uLy5udm0tZmlzaC92NS40LjEvbGliL25vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9zaGEuanMvc2hhLmpzIiwiLi4vLi4vLi4vLi4vLm52bS1maXNoL3Y1LjQuMS9saWIvbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL3NoYS5qcy9zaGExLmpzIiwiLi4vLi4vLi4vLi4vLm52bS1maXNoL3Y1LjQuMS9saWIvbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL3NoYS5qcy9zaGEyMjQuanMiLCIuLi8uLi8uLi8uLi8ubnZtLWZpc2gvdjUuNC4xL2xpYi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvc2hhLmpzL3NoYTI1Ni5qcyIsIi4uLy4uLy4uLy4uLy5udm0tZmlzaC92NS40LjEvbGliL25vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9zaGEuanMvc2hhMzg0LmpzIiwiLi4vLi4vLi4vLi4vLm52bS1maXNoL3Y1LjQuMS9saWIvbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL3NoYS5qcy9zaGE1MTIuanMiLCIuLi8uLi8uLi8uLi8ubnZtLWZpc2gvdjUuNC4xL2xpYi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvc3RyZWFtLWJyb3dzZXJpZnkvaW5kZXguanMiLCIuLi8uLi8uLi8uLi8ubnZtLWZpc2gvdjUuNC4xL2xpYi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvc3RyaW5nX2RlY29kZXIvaW5kZXguanMiLCIuLi8uLi8uLi8uLi8ubnZtLWZpc2gvdjUuNC4xL2xpYi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvdXRpbC1kZXByZWNhdGUvYnJvd3Nlci5qcyIsIi4uLy4uLy4uLy4uLy5udm0tZmlzaC92NS40LjEvbGliL25vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy91dGlsL3N1cHBvcnQvaXNCdWZmZXJCcm93c2VyLmpzIiwiLi4vLi4vLi4vLi4vLm52bS1maXNoL3Y1LjQuMS9saWIvbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL3V0aWwvdXRpbC5qcyIsIi4uLy4uLy4uLy4uLy5udm0tZmlzaC92NS40LjEvbGliL25vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy92bS1icm93c2VyaWZ5L2luZGV4LmpzIiwiaW5kZXguanMiLCJrZXlzLmpzb24iLCJub2RlX21vZHVsZXMvYWJzdHJhY3QtbGV2ZWxkb3duL2Fic3RyYWN0LWNoYWluZWQtYmF0Y2guanMiLCJub2RlX21vZHVsZXMvYWJzdHJhY3QtbGV2ZWxkb3duL2Fic3RyYWN0LWl0ZXJhdG9yLmpzIiwibm9kZV9tb2R1bGVzL2Fic3RyYWN0LWxldmVsZG93bi9hYnN0cmFjdC1sZXZlbGRvd24uanMiLCJub2RlX21vZHVsZXMvYWJzdHJhY3QtbGV2ZWxkb3duL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2Fic3RyYWN0LWxldmVsZG93bi9pcy1sZXZlbGRvd24uanMiLCJub2RlX21vZHVsZXMvYWZ0ZXItYWxsL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2JpdGZpZWxkL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2Jyb3dzZXItc3BsaXQvaW5kZXguanMiLCJub2RlX21vZHVsZXMvYnVmZmVyLWVxdWFscy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9jYW1lbGl6ZS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9jaGxvcmlkZS9icm93c2VyLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtdXRpbC1pcy9saWIvdXRpbC5qcyIsIm5vZGVfbW9kdWxlcy9jdWlkL2Rpc3QvYnJvd3Nlci1jdWlkLmpzIiwibm9kZV9tb2R1bGVzL2RlYnVnL2Jyb3dzZXIuanMiLCJub2RlX21vZHVsZXMvZGVidWcvZGVidWcuanMiLCJub2RlX21vZHVsZXMvZGVmZXJyZWQtbGV2ZWxkb3duL2RlZmVycmVkLWl0ZXJhdG9yLmpzIiwibm9kZV9tb2R1bGVzL2RlZmVycmVkLWxldmVsZG93bi9kZWZlcnJlZC1sZXZlbGRvd24uanMiLCJub2RlX21vZHVsZXMvZGVmaW5lZC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9kdXBsZXhpZnkvaW5kZXguanMiLCJub2RlX21vZHVsZXMvZHVwbGV4aWZ5L25vZGVfbW9kdWxlcy9lbmQtb2Ytc3RyZWFtL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2R1cGxleGlmeS9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9fc3RyZWFtX3JlYWRhYmxlLmpzIiwibm9kZV9tb2R1bGVzL2VuZC1vZi1zdHJlYW0vaW5kZXguanMiLCJub2RlX21vZHVsZXMvZXJybm8vY3VzdG9tLmpzIiwibm9kZV9tb2R1bGVzL2Vycm5vL2Vycm5vLmpzIiwibm9kZV9tb2R1bGVzL2Vycm5vL25vZGVfbW9kdWxlcy9wcnIvcHJyLmpzIiwibm9kZV9tb2R1bGVzL2Vycm9yL3R5cGVkLmpzIiwibm9kZV9tb2R1bGVzL2V2LXN0b3JlL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2V2ZW50LXNvdXJjZS1zdHJlYW0vYnJvd3Nlci5qcyIsIm5vZGVfbW9kdWxlcy9mb3ItZWFjaC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9mcmFtZWQtaGFzaC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9mcm9tMi9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9mcm9tMi9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9fc3RyZWFtX3JlYWRhYmxlLmpzIiwibm9kZV9tb2R1bGVzL2Z1bmN0aW9uYWwtcmVkLWJsYWNrLXRyZWUvcmJ0cmVlLmpzIiwibm9kZV9tb2R1bGVzL2dlbmVyYXRlLWZ1bmN0aW9uL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2dlbmVyYXRlLW9iamVjdC1wcm9wZXJ0eS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9nZXQtYnJvd3Nlci1ydGMvaW5kZXguanMiLCJub2RlX21vZHVsZXMvZ2xvYmFsL2RvY3VtZW50LmpzIiwibm9kZV9tb2R1bGVzL2dsb2JhbC93aW5kb3cuanMiLCJub2RlX21vZHVsZXMvaGF0L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2h5cGVybG9nLXNvZGl1bS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9oeXBlcmxvZy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9oeXBlcmxvZy9saWIvZW5jb2RlLmpzIiwibm9kZV9tb2R1bGVzL2h5cGVybG9nL2xpYi9oYXNoLmpzIiwibm9kZV9tb2R1bGVzL2h5cGVybG9nL2xpYi9tZXNzYWdlcy5qcyIsIm5vZGVfbW9kdWxlcy9oeXBlcmxvZy9saWIvcHJvdG9jb2wuanMiLCJub2RlX21vZHVsZXMvaHlwZXJsb2cvbGliL3JlcGxpY2F0ZS5qcyIsIm5vZGVfbW9kdWxlcy9oeXBlcmxvZy9saWIvc29ydGVkLXF1ZXVlLmpzIiwibm9kZV9tb2R1bGVzL2h5cGVybG9nL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL19zdHJlYW1fcmVhZGFibGUuanMiLCJub2RlX21vZHVsZXMvaHlwZXJsb2cvbm9kZV9tb2R1bGVzL3Rocm91Z2gyL3Rocm91Z2gyLmpzIiwibm9kZV9tb2R1bGVzL2luZGl2aWR1YWwvaW5kZXguanMiLCJub2RlX21vZHVsZXMvaW5kaXZpZHVhbC9vbmUtdmVyc2lvbi5qcyIsIm5vZGVfbW9kdWxlcy9pcy1mdW5jdGlvbi9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9pcy1vYmplY3QvaW5kZXguanMiLCJub2RlX21vZHVsZXMvaXMtcHJvcGVydHkvaXMtcHJvcGVydHkuanMiLCJub2RlX21vZHVsZXMvaXMtdHlwZWRhcnJheS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9sZW5ndGgtcHJlZml4ZWQtc3RyZWFtL2RlY29kZS5qcyIsIm5vZGVfbW9kdWxlcy9sZW5ndGgtcHJlZml4ZWQtc3RyZWFtL2VuY29kZS5qcyIsIm5vZGVfbW9kdWxlcy9sZW5ndGgtcHJlZml4ZWQtc3RyZWFtL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2xlbmd0aC1wcmVmaXhlZC1zdHJlYW0vbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvX3N0cmVhbV9yZWFkYWJsZS5qcyIsIm5vZGVfbW9kdWxlcy9sZXZlbC1jb2RlYy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9sZXZlbC1jb2RlYy9saWIvZW5jb2RpbmdzLmpzIiwibm9kZV9tb2R1bGVzL2xldmVsLWVudW1lcmF0ZS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9sZXZlbC1lcnJvcnMvZXJyb3JzLmpzIiwibm9kZV9tb2R1bGVzL2xldmVsLWl0ZXJhdG9yLXN0cmVhbS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9sZXZlbC1sb2dzL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2xldmVsLWxvZ3Mvbm9kZV9tb2R1bGVzL2Zyb20yL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2xldmVsdXAvbGliL2JhdGNoLmpzIiwibm9kZV9tb2R1bGVzL2xldmVsdXAvbGliL2xldmVsdXAuanMiLCJub2RlX21vZHVsZXMvbGV2ZWx1cC9saWIvdXRpbC5qcyIsIm5vZGVfbW9kdWxlcy9sZXZlbHVwL3BhY2thZ2UuanNvbiIsIm5vZGVfbW9kdWxlcy9sZXhpY29ncmFwaGljLWludGVnZXIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvbGlic29kaXVtLXdyYXBwZXJzL2Rpc3QvbW9kdWxlcy9saWJzb2RpdW0td3JhcHBlcnMuanMiLCJub2RlX21vZHVsZXMvbGlic29kaXVtL2Rpc3QvbW9kdWxlcy9saWJzb2RpdW0uanMiLCJub2RlX21vZHVsZXMvbWFpbi1sb29wL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL21lbWRiL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL21lbWRvd24vbWVtZG93bi5qcyIsIm5vZGVfbW9kdWxlcy9tZW1kb3duL25vZGVfbW9kdWxlcy9sdGd0L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL21zL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL211dGV4aWZ5L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL25ldHMvaW5kZXguanMiLCJub2RlX21vZHVsZXMvb25jZS9vbmNlLmpzIiwibm9kZV9tb2R1bGVzL3BhcnNlLWhlYWRlcnMvcGFyc2UtaGVhZGVycy5qcyIsIm5vZGVfbW9kdWxlcy9wZXJmb3JtYW5jZS1ub3cvbGliL3BlcmZvcm1hbmNlLW5vdy5qcyIsIm5vZGVfbW9kdWxlcy9wcm9jZXNzLW5leHRpY2stYXJncy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9wcm90b2NvbC1idWZmZXJzLXNjaGVtYS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9wcm90b2NvbC1idWZmZXJzLXNjaGVtYS9wYXJzZS5qcyIsIm5vZGVfbW9kdWxlcy9wcm90b2NvbC1idWZmZXJzLXNjaGVtYS9zdHJpbmdpZnkuanMiLCJub2RlX21vZHVsZXMvcHJvdG9jb2wtYnVmZmVycy1zY2hlbWEvdG9rZW5pemUuanMiLCJub2RlX21vZHVsZXMvcHJvdG9jb2wtYnVmZmVycy9jb21waWxlLmpzIiwibm9kZV9tb2R1bGVzL3Byb3RvY29sLWJ1ZmZlcnMvZW5jb2RpbmdzLmpzIiwibm9kZV9tb2R1bGVzL3Byb3RvY29sLWJ1ZmZlcnMvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcHVtcC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9yYWYvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9fc3RyZWFtX2R1cGxleC5qcyIsIm5vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL19zdHJlYW1fcGFzc3Rocm91Z2guanMiLCJub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9fc3RyZWFtX3JlYWRhYmxlLmpzIiwibm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvX3N0cmVhbV90cmFuc2Zvcm0uanMiLCJub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9fc3RyZWFtX3dyaXRhYmxlLmpzIiwibm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9yZWFkYWJsZS5qcyIsIm5vZGVfbW9kdWxlcy9zaGEuanMvaGFzaC5qcyIsIm5vZGVfbW9kdWxlcy9zaGEuanMvc2hhMjU2LmpzIiwibm9kZV9tb2R1bGVzL3NpZ25hbGh1Yi9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9zaWduZWQtdmFyaW50L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3NpZ25lZC12YXJpbnQvbm9kZV9tb2R1bGVzL3ZhcmludC9kZWNvZGUuanMiLCJub2RlX21vZHVsZXMvc2lnbmVkLXZhcmludC9ub2RlX21vZHVsZXMvdmFyaW50L2VuY29kZS5qcyIsIm5vZGVfbW9kdWxlcy9zaWduZWQtdmFyaW50L25vZGVfbW9kdWxlcy92YXJpbnQvaW5kZXguanMiLCJub2RlX21vZHVsZXMvc2lnbmVkLXZhcmludC9ub2RlX21vZHVsZXMvdmFyaW50L2xlbmd0aC5qcyIsIm5vZGVfbW9kdWxlcy9zaW1wbGUtcGVlci9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9zb2RpdW0tYnJvd3NlcmlmeS9icm93c2VyLmpzIiwibm9kZV9tb2R1bGVzL3N0cmVhbS1jb2xsZWN0b3IvaW5kZXguanMiLCJub2RlX21vZHVsZXMvc3RyaW5nLXRlbXBsYXRlL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3N3YXJtbG9nL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3N3YXJtbG9nL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL19zdHJlYW1fcmVhZGFibGUuanMiLCJub2RlX21vZHVsZXMvc3dhcm1sb2cvbm9kZV9tb2R1bGVzL3Rocm91Z2gyL3Rocm91Z2gyLmpzIiwibm9kZV9tb2R1bGVzL3Rocm91Z2gyL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL19zdHJlYW1fZHVwbGV4LmpzIiwibm9kZV9tb2R1bGVzL3Rocm91Z2gyL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL19zdHJlYW1fcmVhZGFibGUuanMiLCJub2RlX21vZHVsZXMvdGhyb3VnaDIvbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvX3N0cmVhbV90cmFuc2Zvcm0uanMiLCJub2RlX21vZHVsZXMvdGhyb3VnaDIvbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvX3N0cmVhbV93cml0YWJsZS5qcyIsIm5vZGVfbW9kdWxlcy90aHJvdWdoMi90aHJvdWdoMi5qcyIsIm5vZGVfbW9kdWxlcy90cmltL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3V0aWwtZGVwcmVjYXRlL2Jyb3dzZXIuanMiLCJub2RlX21vZHVsZXMvdmFyaW50L2xlbmd0aC5qcyIsIm5vZGVfbW9kdWxlcy92aXJ0dWFsLWRvbS9jcmVhdGUtZWxlbWVudC5qcyIsIm5vZGVfbW9kdWxlcy92aXJ0dWFsLWRvbS9kaWZmLmpzIiwibm9kZV9tb2R1bGVzL3ZpcnR1YWwtZG9tL2guanMiLCJub2RlX21vZHVsZXMvdmlydHVhbC1kb20vaW5kZXguanMiLCJub2RlX21vZHVsZXMvdmlydHVhbC1kb20vcGF0Y2guanMiLCJub2RlX21vZHVsZXMvdmlydHVhbC1kb20vdmRvbS9hcHBseS1wcm9wZXJ0aWVzLmpzIiwibm9kZV9tb2R1bGVzL3ZpcnR1YWwtZG9tL3Zkb20vY3JlYXRlLWVsZW1lbnQuanMiLCJub2RlX21vZHVsZXMvdmlydHVhbC1kb20vdmRvbS9kb20taW5kZXguanMiLCJub2RlX21vZHVsZXMvdmlydHVhbC1kb20vdmRvbS9wYXRjaC1vcC5qcyIsIm5vZGVfbW9kdWxlcy92aXJ0dWFsLWRvbS92ZG9tL3BhdGNoLmpzIiwibm9kZV9tb2R1bGVzL3ZpcnR1YWwtZG9tL3Zkb20vdXBkYXRlLXdpZGdldC5qcyIsIm5vZGVfbW9kdWxlcy92aXJ0dWFsLWRvbS92aXJ0dWFsLWh5cGVyc2NyaXB0L2hvb2tzL2V2LWhvb2suanMiLCJub2RlX21vZHVsZXMvdmlydHVhbC1kb20vdmlydHVhbC1oeXBlcnNjcmlwdC9ob29rcy9zb2Z0LXNldC1ob29rLmpzIiwibm9kZV9tb2R1bGVzL3ZpcnR1YWwtZG9tL3ZpcnR1YWwtaHlwZXJzY3JpcHQvaW5kZXguanMiLCJub2RlX21vZHVsZXMvdmlydHVhbC1kb20vdmlydHVhbC1oeXBlcnNjcmlwdC9wYXJzZS10YWcuanMiLCJub2RlX21vZHVsZXMvdmlydHVhbC1kb20vdm5vZGUvaGFuZGxlLXRodW5rLmpzIiwibm9kZV9tb2R1bGVzL3ZpcnR1YWwtZG9tL3Zub2RlL2lzLXRodW5rLmpzIiwibm9kZV9tb2R1bGVzL3ZpcnR1YWwtZG9tL3Zub2RlL2lzLXZob29rLmpzIiwibm9kZV9tb2R1bGVzL3ZpcnR1YWwtZG9tL3Zub2RlL2lzLXZub2RlLmpzIiwibm9kZV9tb2R1bGVzL3ZpcnR1YWwtZG9tL3Zub2RlL2lzLXZ0ZXh0LmpzIiwibm9kZV9tb2R1bGVzL3ZpcnR1YWwtZG9tL3Zub2RlL2lzLXdpZGdldC5qcyIsIm5vZGVfbW9kdWxlcy92aXJ0dWFsLWRvbS92bm9kZS92ZXJzaW9uLmpzIiwibm9kZV9tb2R1bGVzL3ZpcnR1YWwtZG9tL3Zub2RlL3Zub2RlLmpzIiwibm9kZV9tb2R1bGVzL3ZpcnR1YWwtZG9tL3Zub2RlL3ZwYXRjaC5qcyIsIm5vZGVfbW9kdWxlcy92aXJ0dWFsLWRvbS92bm9kZS92dGV4dC5qcyIsIm5vZGVfbW9kdWxlcy92aXJ0dWFsLWRvbS92dHJlZS9kaWZmLXByb3BzLmpzIiwibm9kZV9tb2R1bGVzL3ZpcnR1YWwtZG9tL3Z0cmVlL2RpZmYuanMiLCJub2RlX21vZHVsZXMvd2VicnRjLXN3YXJtL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3dlYnJ0Yy1zd2FybS9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9fc3RyZWFtX3JlYWRhYmxlLmpzIiwibm9kZV9tb2R1bGVzL3dlYnJ0Yy1zd2FybS9ub2RlX21vZHVsZXMvdGhyb3VnaDIvdGhyb3VnaDIuanMiLCJub2RlX21vZHVsZXMvd3JhcHB5L3dyYXBweS5qcyIsIm5vZGVfbW9kdWxlcy94LWlzLWFycmF5L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3hoci9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy94aHIvbm9kZV9tb2R1bGVzL29uY2Uvb25jZS5qcyIsIm5vZGVfbW9kdWxlcy94dGVuZC9pbW11dGFibGUuanMiLCJub2RlX21vZHVsZXMveHRlbmQvbXV0YWJsZS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQ0FBOztBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0bkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25VQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxU0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdEhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDajFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUN6REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDakxBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUNqR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNYQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDeklBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUMxSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDbEdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ2pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQy9CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQ2xDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUNmQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDL0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDekJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ3pFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDM0NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUN4QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUN4Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDeEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUN2R0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUN6TEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUN2R0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUNWQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUM5NkNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDMUZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUMzR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQzFIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQ3BEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ2pDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQzNKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUNwRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0lBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDaFFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQzFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUNwS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL1ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxWkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNzRCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5TkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2SUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0SEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNXdCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0tBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25HQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUMxU0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDcEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM0ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcGpCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDalFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNUQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQkE7QUFDQTtBQUNBO0FBQ0E7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ3JIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUM5QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQ3JHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDaE9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUNoRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDcEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM0ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNUQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUNmQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDM0dBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDOUZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDVEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDbkNBO0FBQ0E7O0FDREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQzNCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQy84QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2poQkE7QUFDQTs7QUNEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNaQTtBQUNBOztBQ0RBO0FBQ0E7OztBQ0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQ2xOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ3JFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDZkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUNwR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDaEdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDcERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQzdJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDeERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQzFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9IQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQzdOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDbkVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQzFrQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbENBO0FBQ0E7OztBQ0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDL0VBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDakRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ2hSQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDZEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUN4Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQzdEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUMxR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDMUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzREE7QUFDQTtBQUNBOzs7QUNGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUMzR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4S0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNsQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDeERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ2xPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7QUN2RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7QUMvOEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDelRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUM5Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDbEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7O0FDckdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7O0FDLzhCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbitCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDZkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDZkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUNUQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQzlEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ3pEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDN1VBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUNwQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUNUQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUN4SkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0TkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUM5Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDLzhCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUNoR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ25CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDdEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUN6Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDakZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDOUJBO0FBQ0E7QUFDQTs7Ozs7OztBQ0ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7O0FDLzhCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUMxR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQzVFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDN0dBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDN0ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDbkZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDL1lBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4TEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ3hIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQ3pwRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ2xDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9FQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNoQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDaFBBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQy9GQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQzdIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUN4QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUN4QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUM5QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDcENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ3BCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqbUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNyQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDOWZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUNsU0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FDNUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0VBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDaEZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ3pGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUM5Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUN2N0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDak5BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDN2RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQ3JFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQzdJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDckJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQ25oQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDaEZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQ2xDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7O0FDakRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQy84QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDaEdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUN6RkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ3Q5QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ2xOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7QUNsWUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUNoR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNkQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7O0FDbkVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekJBO0FBQ0E7QUFDQTtBQUNBOztBQ0hBO0FBQ0E7QUFDQTtBQUNBOztBQ0hBO0FBQ0E7QUFDQTtBQUNBOztBQ0hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2ZBO0FBQ0E7QUFDQTtBQUNBOztBQ0hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNMQTtBQUNBOztBQ0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM2FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQ2pJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUMvOEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDaEdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM05BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIGUodCxuLHIpe2Z1bmN0aW9uIHMobyx1KXtpZighbltvXSl7aWYoIXRbb10pe3ZhciBhPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7aWYoIXUmJmEpcmV0dXJuIGEobywhMCk7aWYoaSlyZXR1cm4gaShvLCEwKTt2YXIgZj1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK28rXCInXCIpO3Rocm93IGYuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIixmfXZhciBsPW5bb109e2V4cG9ydHM6e319O3Rbb11bMF0uY2FsbChsLmV4cG9ydHMsZnVuY3Rpb24oZSl7dmFyIG49dFtvXVsxXVtlXTtyZXR1cm4gcyhuP246ZSl9LGwsbC5leHBvcnRzLGUsdCxuLHIpfXJldHVybiBuW29dLmV4cG9ydHN9dmFyIGk9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rKylzKHJbb10pO3JldHVybiBzfSkiLCIiLCJ2YXIgYXNuMSA9IGV4cG9ydHM7XG5cbmFzbjEuYmlnbnVtID0gcmVxdWlyZSgnYm4uanMnKTtcblxuYXNuMS5kZWZpbmUgPSByZXF1aXJlKCcuL2FzbjEvYXBpJykuZGVmaW5lO1xuYXNuMS5iYXNlID0gcmVxdWlyZSgnLi9hc24xL2Jhc2UnKTtcbmFzbjEuY29uc3RhbnRzID0gcmVxdWlyZSgnLi9hc24xL2NvbnN0YW50cycpO1xuYXNuMS5kZWNvZGVycyA9IHJlcXVpcmUoJy4vYXNuMS9kZWNvZGVycycpO1xuYXNuMS5lbmNvZGVycyA9IHJlcXVpcmUoJy4vYXNuMS9lbmNvZGVycycpO1xuIiwidmFyIGFzbjEgPSByZXF1aXJlKCcuLi9hc24xJyk7XG52YXIgaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xuXG52YXIgYXBpID0gZXhwb3J0cztcblxuYXBpLmRlZmluZSA9IGZ1bmN0aW9uIGRlZmluZShuYW1lLCBib2R5KSB7XG4gIHJldHVybiBuZXcgRW50aXR5KG5hbWUsIGJvZHkpO1xufTtcblxuZnVuY3Rpb24gRW50aXR5KG5hbWUsIGJvZHkpIHtcbiAgdGhpcy5uYW1lID0gbmFtZTtcbiAgdGhpcy5ib2R5ID0gYm9keTtcblxuICB0aGlzLmRlY29kZXJzID0ge307XG4gIHRoaXMuZW5jb2RlcnMgPSB7fTtcbn07XG5cbkVudGl0eS5wcm90b3R5cGUuX2NyZWF0ZU5hbWVkID0gZnVuY3Rpb24gY3JlYXRlTmFtZWQoYmFzZSkge1xuICB2YXIgbmFtZWQ7XG4gIHRyeSB7XG4gICAgbmFtZWQgPSByZXF1aXJlKCd2bScpLnJ1bkluVGhpc0NvbnRleHQoXG4gICAgICAnKGZ1bmN0aW9uICcgKyB0aGlzLm5hbWUgKyAnKGVudGl0eSkge1xcbicgK1xuICAgICAgJyAgdGhpcy5faW5pdE5hbWVkKGVudGl0eSk7XFxuJyArXG4gICAgICAnfSknXG4gICAgKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIG5hbWVkID0gZnVuY3Rpb24gKGVudGl0eSkge1xuICAgICAgdGhpcy5faW5pdE5hbWVkKGVudGl0eSk7XG4gICAgfTtcbiAgfVxuICBpbmhlcml0cyhuYW1lZCwgYmFzZSk7XG4gIG5hbWVkLnByb3RvdHlwZS5faW5pdE5hbWVkID0gZnVuY3Rpb24gaW5pdG5hbWVkKGVudGl0eSkge1xuICAgIGJhc2UuY2FsbCh0aGlzLCBlbnRpdHkpO1xuICB9O1xuXG4gIHJldHVybiBuZXcgbmFtZWQodGhpcyk7XG59O1xuXG5FbnRpdHkucHJvdG90eXBlLl9nZXREZWNvZGVyID0gZnVuY3Rpb24gX2dldERlY29kZXIoZW5jKSB7XG4gIC8vIExhemlseSBjcmVhdGUgZGVjb2RlclxuICBpZiAoIXRoaXMuZGVjb2RlcnMuaGFzT3duUHJvcGVydHkoZW5jKSlcbiAgICB0aGlzLmRlY29kZXJzW2VuY10gPSB0aGlzLl9jcmVhdGVOYW1lZChhc24xLmRlY29kZXJzW2VuY10pO1xuICByZXR1cm4gdGhpcy5kZWNvZGVyc1tlbmNdO1xufTtcblxuRW50aXR5LnByb3RvdHlwZS5kZWNvZGUgPSBmdW5jdGlvbiBkZWNvZGUoZGF0YSwgZW5jLCBvcHRpb25zKSB7XG4gIHJldHVybiB0aGlzLl9nZXREZWNvZGVyKGVuYykuZGVjb2RlKGRhdGEsIG9wdGlvbnMpO1xufTtcblxuRW50aXR5LnByb3RvdHlwZS5fZ2V0RW5jb2RlciA9IGZ1bmN0aW9uIF9nZXRFbmNvZGVyKGVuYykge1xuICAvLyBMYXppbHkgY3JlYXRlIGVuY29kZXJcbiAgaWYgKCF0aGlzLmVuY29kZXJzLmhhc093blByb3BlcnR5KGVuYykpXG4gICAgdGhpcy5lbmNvZGVyc1tlbmNdID0gdGhpcy5fY3JlYXRlTmFtZWQoYXNuMS5lbmNvZGVyc1tlbmNdKTtcbiAgcmV0dXJuIHRoaXMuZW5jb2RlcnNbZW5jXTtcbn07XG5cbkVudGl0eS5wcm90b3R5cGUuZW5jb2RlID0gZnVuY3Rpb24gZW5jb2RlKGRhdGEsIGVuYywgLyogaW50ZXJuYWwgKi8gcmVwb3J0ZXIpIHtcbiAgcmV0dXJuIHRoaXMuX2dldEVuY29kZXIoZW5jKS5lbmNvZGUoZGF0YSwgcmVwb3J0ZXIpO1xufTtcbiIsInZhciBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG52YXIgUmVwb3J0ZXIgPSByZXF1aXJlKCcuLi9iYXNlJykuUmVwb3J0ZXI7XG52YXIgQnVmZmVyID0gcmVxdWlyZSgnYnVmZmVyJykuQnVmZmVyO1xuXG5mdW5jdGlvbiBEZWNvZGVyQnVmZmVyKGJhc2UsIG9wdGlvbnMpIHtcbiAgUmVwb3J0ZXIuY2FsbCh0aGlzLCBvcHRpb25zKTtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYmFzZSkpIHtcbiAgICB0aGlzLmVycm9yKCdJbnB1dCBub3QgQnVmZmVyJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdGhpcy5iYXNlID0gYmFzZTtcbiAgdGhpcy5vZmZzZXQgPSAwO1xuICB0aGlzLmxlbmd0aCA9IGJhc2UubGVuZ3RoO1xufVxuaW5oZXJpdHMoRGVjb2RlckJ1ZmZlciwgUmVwb3J0ZXIpO1xuZXhwb3J0cy5EZWNvZGVyQnVmZmVyID0gRGVjb2RlckJ1ZmZlcjtcblxuRGVjb2RlckJ1ZmZlci5wcm90b3R5cGUuc2F2ZSA9IGZ1bmN0aW9uIHNhdmUoKSB7XG4gIHJldHVybiB7IG9mZnNldDogdGhpcy5vZmZzZXQsIHJlcG9ydGVyOiBSZXBvcnRlci5wcm90b3R5cGUuc2F2ZS5jYWxsKHRoaXMpIH07XG59O1xuXG5EZWNvZGVyQnVmZmVyLnByb3RvdHlwZS5yZXN0b3JlID0gZnVuY3Rpb24gcmVzdG9yZShzYXZlKSB7XG4gIC8vIFJldHVybiBza2lwcGVkIGRhdGFcbiAgdmFyIHJlcyA9IG5ldyBEZWNvZGVyQnVmZmVyKHRoaXMuYmFzZSk7XG4gIHJlcy5vZmZzZXQgPSBzYXZlLm9mZnNldDtcbiAgcmVzLmxlbmd0aCA9IHRoaXMub2Zmc2V0O1xuXG4gIHRoaXMub2Zmc2V0ID0gc2F2ZS5vZmZzZXQ7XG4gIFJlcG9ydGVyLnByb3RvdHlwZS5yZXN0b3JlLmNhbGwodGhpcywgc2F2ZS5yZXBvcnRlcik7XG5cbiAgcmV0dXJuIHJlcztcbn07XG5cbkRlY29kZXJCdWZmZXIucHJvdG90eXBlLmlzRW1wdHkgPSBmdW5jdGlvbiBpc0VtcHR5KCkge1xuICByZXR1cm4gdGhpcy5vZmZzZXQgPT09IHRoaXMubGVuZ3RoO1xufTtcblxuRGVjb2RlckJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQ4ID0gZnVuY3Rpb24gcmVhZFVJbnQ4KGZhaWwpIHtcbiAgaWYgKHRoaXMub2Zmc2V0ICsgMSA8PSB0aGlzLmxlbmd0aClcbiAgICByZXR1cm4gdGhpcy5iYXNlLnJlYWRVSW50OCh0aGlzLm9mZnNldCsrLCB0cnVlKTtcbiAgZWxzZVxuICAgIHJldHVybiB0aGlzLmVycm9yKGZhaWwgfHwgJ0RlY29kZXJCdWZmZXIgb3ZlcnJ1bicpO1xufVxuXG5EZWNvZGVyQnVmZmVyLnByb3RvdHlwZS5za2lwID0gZnVuY3Rpb24gc2tpcChieXRlcywgZmFpbCkge1xuICBpZiAoISh0aGlzLm9mZnNldCArIGJ5dGVzIDw9IHRoaXMubGVuZ3RoKSlcbiAgICByZXR1cm4gdGhpcy5lcnJvcihmYWlsIHx8ICdEZWNvZGVyQnVmZmVyIG92ZXJydW4nKTtcblxuICB2YXIgcmVzID0gbmV3IERlY29kZXJCdWZmZXIodGhpcy5iYXNlKTtcblxuICAvLyBTaGFyZSByZXBvcnRlciBzdGF0ZVxuICByZXMuX3JlcG9ydGVyU3RhdGUgPSB0aGlzLl9yZXBvcnRlclN0YXRlO1xuXG4gIHJlcy5vZmZzZXQgPSB0aGlzLm9mZnNldDtcbiAgcmVzLmxlbmd0aCA9IHRoaXMub2Zmc2V0ICsgYnl0ZXM7XG4gIHRoaXMub2Zmc2V0ICs9IGJ5dGVzO1xuICByZXR1cm4gcmVzO1xufVxuXG5EZWNvZGVyQnVmZmVyLnByb3RvdHlwZS5yYXcgPSBmdW5jdGlvbiByYXcoc2F2ZSkge1xuICByZXR1cm4gdGhpcy5iYXNlLnNsaWNlKHNhdmUgPyBzYXZlLm9mZnNldCA6IHRoaXMub2Zmc2V0LCB0aGlzLmxlbmd0aCk7XG59XG5cbmZ1bmN0aW9uIEVuY29kZXJCdWZmZXIodmFsdWUsIHJlcG9ydGVyKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIHRoaXMubGVuZ3RoID0gMDtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWUubWFwKGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICAgIGlmICghKGl0ZW0gaW5zdGFuY2VvZiBFbmNvZGVyQnVmZmVyKSlcbiAgICAgICAgaXRlbSA9IG5ldyBFbmNvZGVyQnVmZmVyKGl0ZW0sIHJlcG9ydGVyKTtcbiAgICAgIHRoaXMubGVuZ3RoICs9IGl0ZW0ubGVuZ3RoO1xuICAgICAgcmV0dXJuIGl0ZW07XG4gICAgfSwgdGhpcyk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIGlmICghKDAgPD0gdmFsdWUgJiYgdmFsdWUgPD0gMHhmZikpXG4gICAgICByZXR1cm4gcmVwb3J0ZXIuZXJyb3IoJ25vbi1ieXRlIEVuY29kZXJCdWZmZXIgdmFsdWUnKTtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy5sZW5ndGggPSAxO1xuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy5sZW5ndGggPSBCdWZmZXIuYnl0ZUxlbmd0aCh2YWx1ZSk7XG4gIH0gZWxzZSBpZiAoQnVmZmVyLmlzQnVmZmVyKHZhbHVlKSkge1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLmxlbmd0aCA9IHZhbHVlLmxlbmd0aDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gcmVwb3J0ZXIuZXJyb3IoJ1Vuc3VwcG9ydGVkIHR5cGU6ICcgKyB0eXBlb2YgdmFsdWUpO1xuICB9XG59XG5leHBvcnRzLkVuY29kZXJCdWZmZXIgPSBFbmNvZGVyQnVmZmVyO1xuXG5FbmNvZGVyQnVmZmVyLnByb3RvdHlwZS5qb2luID0gZnVuY3Rpb24gam9pbihvdXQsIG9mZnNldCkge1xuICBpZiAoIW91dClcbiAgICBvdXQgPSBuZXcgQnVmZmVyKHRoaXMubGVuZ3RoKTtcbiAgaWYgKCFvZmZzZXQpXG4gICAgb2Zmc2V0ID0gMDtcblxuICBpZiAodGhpcy5sZW5ndGggPT09IDApXG4gICAgcmV0dXJuIG91dDtcblxuICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLnZhbHVlKSkge1xuICAgIHRoaXMudmFsdWUuZm9yRWFjaChmdW5jdGlvbihpdGVtKSB7XG4gICAgICBpdGVtLmpvaW4ob3V0LCBvZmZzZXQpO1xuICAgICAgb2Zmc2V0ICs9IGl0ZW0ubGVuZ3RoO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIGlmICh0eXBlb2YgdGhpcy52YWx1ZSA9PT0gJ251bWJlcicpXG4gICAgICBvdXRbb2Zmc2V0XSA9IHRoaXMudmFsdWU7XG4gICAgZWxzZSBpZiAodHlwZW9mIHRoaXMudmFsdWUgPT09ICdzdHJpbmcnKVxuICAgICAgb3V0LndyaXRlKHRoaXMudmFsdWUsIG9mZnNldCk7XG4gICAgZWxzZSBpZiAoQnVmZmVyLmlzQnVmZmVyKHRoaXMudmFsdWUpKVxuICAgICAgdGhpcy52YWx1ZS5jb3B5KG91dCwgb2Zmc2V0KTtcbiAgICBvZmZzZXQgKz0gdGhpcy5sZW5ndGg7XG4gIH1cblxuICByZXR1cm4gb3V0O1xufTtcbiIsInZhciBiYXNlID0gZXhwb3J0cztcblxuYmFzZS5SZXBvcnRlciA9IHJlcXVpcmUoJy4vcmVwb3J0ZXInKS5SZXBvcnRlcjtcbmJhc2UuRGVjb2RlckJ1ZmZlciA9IHJlcXVpcmUoJy4vYnVmZmVyJykuRGVjb2RlckJ1ZmZlcjtcbmJhc2UuRW5jb2RlckJ1ZmZlciA9IHJlcXVpcmUoJy4vYnVmZmVyJykuRW5jb2RlckJ1ZmZlcjtcbmJhc2UuTm9kZSA9IHJlcXVpcmUoJy4vbm9kZScpO1xuIiwidmFyIFJlcG9ydGVyID0gcmVxdWlyZSgnLi4vYmFzZScpLlJlcG9ydGVyO1xudmFyIEVuY29kZXJCdWZmZXIgPSByZXF1aXJlKCcuLi9iYXNlJykuRW5jb2RlckJ1ZmZlcjtcbnZhciBEZWNvZGVyQnVmZmVyID0gcmVxdWlyZSgnLi4vYmFzZScpLkRlY29kZXJCdWZmZXI7XG52YXIgYXNzZXJ0ID0gcmVxdWlyZSgnbWluaW1hbGlzdGljLWFzc2VydCcpO1xuXG4vLyBTdXBwb3J0ZWQgdGFnc1xudmFyIHRhZ3MgPSBbXG4gICdzZXEnLCAnc2Vxb2YnLCAnc2V0JywgJ3NldG9mJywgJ29jdHN0cicsICdiaXRzdHInLCAnb2JqaWQnLCAnYm9vbCcsXG4gICdnZW50aW1lJywgJ3V0Y3RpbWUnLCAnbnVsbF8nLCAnZW51bScsICdpbnQnLCAnaWE1c3RyJywgJ3V0ZjhzdHInLCAnYm1wc3RyJyxcbiAgJ251bXN0cicsICdwcmludHN0cidcbl07XG5cbi8vIFB1YmxpYyBtZXRob2RzIGxpc3RcbnZhciBtZXRob2RzID0gW1xuICAna2V5JywgJ29iaicsICd1c2UnLCAnb3B0aW9uYWwnLCAnZXhwbGljaXQnLCAnaW1wbGljaXQnLCAnZGVmJywgJ2Nob2ljZScsXG4gICdhbnknLCAnY29udGFpbnMnXG5dLmNvbmNhdCh0YWdzKTtcblxuLy8gT3ZlcnJpZGVkIG1ldGhvZHMgbGlzdFxudmFyIG92ZXJyaWRlZCA9IFtcbiAgJ19wZWVrVGFnJywgJ19kZWNvZGVUYWcnLCAnX3VzZScsXG4gICdfZGVjb2RlU3RyJywgJ19kZWNvZGVPYmppZCcsICdfZGVjb2RlVGltZScsXG4gICdfZGVjb2RlTnVsbCcsICdfZGVjb2RlSW50JywgJ19kZWNvZGVCb29sJywgJ19kZWNvZGVMaXN0JyxcblxuICAnX2VuY29kZUNvbXBvc2l0ZScsICdfZW5jb2RlU3RyJywgJ19lbmNvZGVPYmppZCcsICdfZW5jb2RlVGltZScsXG4gICdfZW5jb2RlTnVsbCcsICdfZW5jb2RlSW50JywgJ19lbmNvZGVCb29sJ1xuXTtcblxuZnVuY3Rpb24gTm9kZShlbmMsIHBhcmVudCkge1xuICB2YXIgc3RhdGUgPSB7fTtcbiAgdGhpcy5fYmFzZVN0YXRlID0gc3RhdGU7XG5cbiAgc3RhdGUuZW5jID0gZW5jO1xuXG4gIHN0YXRlLnBhcmVudCA9IHBhcmVudCB8fCBudWxsO1xuICBzdGF0ZS5jaGlsZHJlbiA9IG51bGw7XG5cbiAgLy8gU3RhdGVcbiAgc3RhdGUudGFnID0gbnVsbDtcbiAgc3RhdGUuYXJncyA9IG51bGw7XG4gIHN0YXRlLnJldmVyc2VBcmdzID0gbnVsbDtcbiAgc3RhdGUuY2hvaWNlID0gbnVsbDtcbiAgc3RhdGUub3B0aW9uYWwgPSBmYWxzZTtcbiAgc3RhdGUuYW55ID0gZmFsc2U7XG4gIHN0YXRlLm9iaiA9IGZhbHNlO1xuICBzdGF0ZS51c2UgPSBudWxsO1xuICBzdGF0ZS51c2VEZWNvZGVyID0gbnVsbDtcbiAgc3RhdGUua2V5ID0gbnVsbDtcbiAgc3RhdGVbJ2RlZmF1bHQnXSA9IG51bGw7XG4gIHN0YXRlLmV4cGxpY2l0ID0gbnVsbDtcbiAgc3RhdGUuaW1wbGljaXQgPSBudWxsO1xuICBzdGF0ZS5jb250YWlucyA9IG51bGw7XG5cbiAgLy8gU2hvdWxkIGNyZWF0ZSBuZXcgaW5zdGFuY2Ugb24gZWFjaCBtZXRob2RcbiAgaWYgKCFzdGF0ZS5wYXJlbnQpIHtcbiAgICBzdGF0ZS5jaGlsZHJlbiA9IFtdO1xuICAgIHRoaXMuX3dyYXAoKTtcbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSBOb2RlO1xuXG52YXIgc3RhdGVQcm9wcyA9IFtcbiAgJ2VuYycsICdwYXJlbnQnLCAnY2hpbGRyZW4nLCAndGFnJywgJ2FyZ3MnLCAncmV2ZXJzZUFyZ3MnLCAnY2hvaWNlJyxcbiAgJ29wdGlvbmFsJywgJ2FueScsICdvYmonLCAndXNlJywgJ2FsdGVyZWRVc2UnLCAna2V5JywgJ2RlZmF1bHQnLCAnZXhwbGljaXQnLFxuICAnaW1wbGljaXQnXG5dO1xuXG5Ob2RlLnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uIGNsb25lKCkge1xuICB2YXIgc3RhdGUgPSB0aGlzLl9iYXNlU3RhdGU7XG4gIHZhciBjc3RhdGUgPSB7fTtcbiAgc3RhdGVQcm9wcy5mb3JFYWNoKGZ1bmN0aW9uKHByb3ApIHtcbiAgICBjc3RhdGVbcHJvcF0gPSBzdGF0ZVtwcm9wXTtcbiAgfSk7XG4gIHZhciByZXMgPSBuZXcgdGhpcy5jb25zdHJ1Y3Rvcihjc3RhdGUucGFyZW50KTtcbiAgcmVzLl9iYXNlU3RhdGUgPSBjc3RhdGU7XG4gIHJldHVybiByZXM7XG59O1xuXG5Ob2RlLnByb3RvdHlwZS5fd3JhcCA9IGZ1bmN0aW9uIHdyYXAoKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX2Jhc2VTdGF0ZTtcbiAgbWV0aG9kcy5mb3JFYWNoKGZ1bmN0aW9uKG1ldGhvZCkge1xuICAgIHRoaXNbbWV0aG9kXSA9IGZ1bmN0aW9uIF93cmFwcGVkTWV0aG9kKCkge1xuICAgICAgdmFyIGNsb25lID0gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcyk7XG4gICAgICBzdGF0ZS5jaGlsZHJlbi5wdXNoKGNsb25lKTtcbiAgICAgIHJldHVybiBjbG9uZVttZXRob2RdLmFwcGx5KGNsb25lLCBhcmd1bWVudHMpO1xuICAgIH07XG4gIH0sIHRoaXMpO1xufTtcblxuTm9kZS5wcm90b3R5cGUuX2luaXQgPSBmdW5jdGlvbiBpbml0KGJvZHkpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fYmFzZVN0YXRlO1xuXG4gIGFzc2VydChzdGF0ZS5wYXJlbnQgPT09IG51bGwpO1xuICBib2R5LmNhbGwodGhpcyk7XG5cbiAgLy8gRmlsdGVyIGNoaWxkcmVuXG4gIHN0YXRlLmNoaWxkcmVuID0gc3RhdGUuY2hpbGRyZW4uZmlsdGVyKGZ1bmN0aW9uKGNoaWxkKSB7XG4gICAgcmV0dXJuIGNoaWxkLl9iYXNlU3RhdGUucGFyZW50ID09PSB0aGlzO1xuICB9LCB0aGlzKTtcbiAgYXNzZXJ0LmVxdWFsKHN0YXRlLmNoaWxkcmVuLmxlbmd0aCwgMSwgJ1Jvb3Qgbm9kZSBjYW4gaGF2ZSBvbmx5IG9uZSBjaGlsZCcpO1xufTtcblxuTm9kZS5wcm90b3R5cGUuX3VzZUFyZ3MgPSBmdW5jdGlvbiB1c2VBcmdzKGFyZ3MpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fYmFzZVN0YXRlO1xuXG4gIC8vIEZpbHRlciBjaGlsZHJlbiBhbmQgYXJnc1xuICB2YXIgY2hpbGRyZW4gPSBhcmdzLmZpbHRlcihmdW5jdGlvbihhcmcpIHtcbiAgICByZXR1cm4gYXJnIGluc3RhbmNlb2YgdGhpcy5jb25zdHJ1Y3RvcjtcbiAgfSwgdGhpcyk7XG4gIGFyZ3MgPSBhcmdzLmZpbHRlcihmdW5jdGlvbihhcmcpIHtcbiAgICByZXR1cm4gIShhcmcgaW5zdGFuY2VvZiB0aGlzLmNvbnN0cnVjdG9yKTtcbiAgfSwgdGhpcyk7XG5cbiAgaWYgKGNoaWxkcmVuLmxlbmd0aCAhPT0gMCkge1xuICAgIGFzc2VydChzdGF0ZS5jaGlsZHJlbiA9PT0gbnVsbCk7XG4gICAgc3RhdGUuY2hpbGRyZW4gPSBjaGlsZHJlbjtcblxuICAgIC8vIFJlcGxhY2UgcGFyZW50IHRvIG1haW50YWluIGJhY2t3YXJkIGxpbmtcbiAgICBjaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uKGNoaWxkKSB7XG4gICAgICBjaGlsZC5fYmFzZVN0YXRlLnBhcmVudCA9IHRoaXM7XG4gICAgfSwgdGhpcyk7XG4gIH1cbiAgaWYgKGFyZ3MubGVuZ3RoICE9PSAwKSB7XG4gICAgYXNzZXJ0KHN0YXRlLmFyZ3MgPT09IG51bGwpO1xuICAgIHN0YXRlLmFyZ3MgPSBhcmdzO1xuICAgIHN0YXRlLnJldmVyc2VBcmdzID0gYXJncy5tYXAoZnVuY3Rpb24oYXJnKSB7XG4gICAgICBpZiAodHlwZW9mIGFyZyAhPT0gJ29iamVjdCcgfHwgYXJnLmNvbnN0cnVjdG9yICE9PSBPYmplY3QpXG4gICAgICAgIHJldHVybiBhcmc7XG5cbiAgICAgIHZhciByZXMgPSB7fTtcbiAgICAgIE9iamVjdC5rZXlzKGFyZykuZm9yRWFjaChmdW5jdGlvbihrZXkpIHtcbiAgICAgICAgaWYgKGtleSA9PSAoa2V5IHwgMCkpXG4gICAgICAgICAga2V5IHw9IDA7XG4gICAgICAgIHZhciB2YWx1ZSA9IGFyZ1trZXldO1xuICAgICAgICByZXNbdmFsdWVdID0ga2V5O1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH0pO1xuICB9XG59O1xuXG4vL1xuLy8gT3ZlcnJpZGVkIG1ldGhvZHNcbi8vXG5cbm92ZXJyaWRlZC5mb3JFYWNoKGZ1bmN0aW9uKG1ldGhvZCkge1xuICBOb2RlLnByb3RvdHlwZVttZXRob2RdID0gZnVuY3Rpb24gX292ZXJyaWRlZCgpIHtcbiAgICB2YXIgc3RhdGUgPSB0aGlzLl9iYXNlU3RhdGU7XG4gICAgdGhyb3cgbmV3IEVycm9yKG1ldGhvZCArICcgbm90IGltcGxlbWVudGVkIGZvciBlbmNvZGluZzogJyArIHN0YXRlLmVuYyk7XG4gIH07XG59KTtcblxuLy9cbi8vIFB1YmxpYyBtZXRob2RzXG4vL1xuXG50YWdzLmZvckVhY2goZnVuY3Rpb24odGFnKSB7XG4gIE5vZGUucHJvdG90eXBlW3RhZ10gPSBmdW5jdGlvbiBfdGFnTWV0aG9kKCkge1xuICAgIHZhciBzdGF0ZSA9IHRoaXMuX2Jhc2VTdGF0ZTtcbiAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7XG5cbiAgICBhc3NlcnQoc3RhdGUudGFnID09PSBudWxsKTtcbiAgICBzdGF0ZS50YWcgPSB0YWc7XG5cbiAgICB0aGlzLl91c2VBcmdzKGFyZ3MpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG59KTtcblxuTm9kZS5wcm90b3R5cGUudXNlID0gZnVuY3Rpb24gdXNlKGl0ZW0pIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fYmFzZVN0YXRlO1xuXG4gIGFzc2VydChzdGF0ZS51c2UgPT09IG51bGwpO1xuICBzdGF0ZS51c2UgPSBpdGVtO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuTm9kZS5wcm90b3R5cGUub3B0aW9uYWwgPSBmdW5jdGlvbiBvcHRpb25hbCgpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fYmFzZVN0YXRlO1xuXG4gIHN0YXRlLm9wdGlvbmFsID0gdHJ1ZTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbk5vZGUucHJvdG90eXBlLmRlZiA9IGZ1bmN0aW9uIGRlZih2YWwpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fYmFzZVN0YXRlO1xuXG4gIGFzc2VydChzdGF0ZVsnZGVmYXVsdCddID09PSBudWxsKTtcbiAgc3RhdGVbJ2RlZmF1bHQnXSA9IHZhbDtcbiAgc3RhdGUub3B0aW9uYWwgPSB0cnVlO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuTm9kZS5wcm90b3R5cGUuZXhwbGljaXQgPSBmdW5jdGlvbiBleHBsaWNpdChudW0pIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fYmFzZVN0YXRlO1xuXG4gIGFzc2VydChzdGF0ZS5leHBsaWNpdCA9PT0gbnVsbCAmJiBzdGF0ZS5pbXBsaWNpdCA9PT0gbnVsbCk7XG4gIHN0YXRlLmV4cGxpY2l0ID0gbnVtO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuTm9kZS5wcm90b3R5cGUuaW1wbGljaXQgPSBmdW5jdGlvbiBpbXBsaWNpdChudW0pIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fYmFzZVN0YXRlO1xuXG4gIGFzc2VydChzdGF0ZS5leHBsaWNpdCA9PT0gbnVsbCAmJiBzdGF0ZS5pbXBsaWNpdCA9PT0gbnVsbCk7XG4gIHN0YXRlLmltcGxpY2l0ID0gbnVtO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuTm9kZS5wcm90b3R5cGUub2JqID0gZnVuY3Rpb24gb2JqKCkge1xuICB2YXIgc3RhdGUgPSB0aGlzLl9iYXNlU3RhdGU7XG4gIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtcblxuICBzdGF0ZS5vYmogPSB0cnVlO1xuXG4gIGlmIChhcmdzLmxlbmd0aCAhPT0gMClcbiAgICB0aGlzLl91c2VBcmdzKGFyZ3MpO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuTm9kZS5wcm90b3R5cGUua2V5ID0gZnVuY3Rpb24ga2V5KG5ld0tleSkge1xuICB2YXIgc3RhdGUgPSB0aGlzLl9iYXNlU3RhdGU7XG5cbiAgYXNzZXJ0KHN0YXRlLmtleSA9PT0gbnVsbCk7XG4gIHN0YXRlLmtleSA9IG5ld0tleTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbk5vZGUucHJvdG90eXBlLmFueSA9IGZ1bmN0aW9uIGFueSgpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fYmFzZVN0YXRlO1xuXG4gIHN0YXRlLmFueSA9IHRydWU7XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5Ob2RlLnByb3RvdHlwZS5jaG9pY2UgPSBmdW5jdGlvbiBjaG9pY2Uob2JqKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX2Jhc2VTdGF0ZTtcblxuICBhc3NlcnQoc3RhdGUuY2hvaWNlID09PSBudWxsKTtcbiAgc3RhdGUuY2hvaWNlID0gb2JqO1xuICB0aGlzLl91c2VBcmdzKE9iamVjdC5rZXlzKG9iaikubWFwKGZ1bmN0aW9uKGtleSkge1xuICAgIHJldHVybiBvYmpba2V5XTtcbiAgfSkpO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuTm9kZS5wcm90b3R5cGUuY29udGFpbnMgPSBmdW5jdGlvbiBjb250YWlucyhpdGVtKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX2Jhc2VTdGF0ZTtcblxuICBhc3NlcnQoc3RhdGUudXNlID09PSBudWxsKTtcbiAgc3RhdGUuY29udGFpbnMgPSBpdGVtO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLy9cbi8vIERlY29kaW5nXG4vL1xuXG5Ob2RlLnByb3RvdHlwZS5fZGVjb2RlID0gZnVuY3Rpb24gZGVjb2RlKGlucHV0KSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX2Jhc2VTdGF0ZTtcblxuICAvLyBEZWNvZGUgcm9vdCBub2RlXG4gIGlmIChzdGF0ZS5wYXJlbnQgPT09IG51bGwpXG4gICAgcmV0dXJuIGlucHV0LndyYXBSZXN1bHQoc3RhdGUuY2hpbGRyZW5bMF0uX2RlY29kZShpbnB1dCkpO1xuXG4gIHZhciByZXN1bHQgPSBzdGF0ZVsnZGVmYXVsdCddO1xuICB2YXIgcHJlc2VudCA9IHRydWU7XG5cbiAgdmFyIHByZXZLZXk7XG4gIGlmIChzdGF0ZS5rZXkgIT09IG51bGwpXG4gICAgcHJldktleSA9IGlucHV0LmVudGVyS2V5KHN0YXRlLmtleSk7XG5cbiAgLy8gQ2hlY2sgaWYgdGFnIGlzIHRoZXJlXG4gIGlmIChzdGF0ZS5vcHRpb25hbCkge1xuICAgIHZhciB0YWcgPSBudWxsO1xuICAgIGlmIChzdGF0ZS5leHBsaWNpdCAhPT0gbnVsbClcbiAgICAgIHRhZyA9IHN0YXRlLmV4cGxpY2l0O1xuICAgIGVsc2UgaWYgKHN0YXRlLmltcGxpY2l0ICE9PSBudWxsKVxuICAgICAgdGFnID0gc3RhdGUuaW1wbGljaXQ7XG4gICAgZWxzZSBpZiAoc3RhdGUudGFnICE9PSBudWxsKVxuICAgICAgdGFnID0gc3RhdGUudGFnO1xuXG4gICAgaWYgKHRhZyA9PT0gbnVsbCAmJiAhc3RhdGUuYW55KSB7XG4gICAgICAvLyBUcmlhbCBhbmQgRXJyb3JcbiAgICAgIHZhciBzYXZlID0gaW5wdXQuc2F2ZSgpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKHN0YXRlLmNob2ljZSA9PT0gbnVsbClcbiAgICAgICAgICB0aGlzLl9kZWNvZGVHZW5lcmljKHN0YXRlLnRhZywgaW5wdXQpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgdGhpcy5fZGVjb2RlQ2hvaWNlKGlucHV0KTtcbiAgICAgICAgcHJlc2VudCA9IHRydWU7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHByZXNlbnQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlucHV0LnJlc3RvcmUoc2F2ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByZXNlbnQgPSB0aGlzLl9wZWVrVGFnKGlucHV0LCB0YWcsIHN0YXRlLmFueSk7XG5cbiAgICAgIGlmIChpbnB1dC5pc0Vycm9yKHByZXNlbnQpKVxuICAgICAgICByZXR1cm4gcHJlc2VudDtcbiAgICB9XG4gIH1cblxuICAvLyBQdXNoIG9iamVjdCBvbiBzdGFja1xuICB2YXIgcHJldk9iajtcbiAgaWYgKHN0YXRlLm9iaiAmJiBwcmVzZW50KVxuICAgIHByZXZPYmogPSBpbnB1dC5lbnRlck9iamVjdCgpO1xuXG4gIGlmIChwcmVzZW50KSB7XG4gICAgLy8gVW53cmFwIGV4cGxpY2l0IHZhbHVlc1xuICAgIGlmIChzdGF0ZS5leHBsaWNpdCAhPT0gbnVsbCkge1xuICAgICAgdmFyIGV4cGxpY2l0ID0gdGhpcy5fZGVjb2RlVGFnKGlucHV0LCBzdGF0ZS5leHBsaWNpdCk7XG4gICAgICBpZiAoaW5wdXQuaXNFcnJvcihleHBsaWNpdCkpXG4gICAgICAgIHJldHVybiBleHBsaWNpdDtcbiAgICAgIGlucHV0ID0gZXhwbGljaXQ7XG4gICAgfVxuXG4gICAgLy8gVW53cmFwIGltcGxpY2l0IGFuZCBub3JtYWwgdmFsdWVzXG4gICAgaWYgKHN0YXRlLnVzZSA9PT0gbnVsbCAmJiBzdGF0ZS5jaG9pY2UgPT09IG51bGwpIHtcbiAgICAgIGlmIChzdGF0ZS5hbnkpXG4gICAgICAgIHZhciBzYXZlID0gaW5wdXQuc2F2ZSgpO1xuICAgICAgdmFyIGJvZHkgPSB0aGlzLl9kZWNvZGVUYWcoXG4gICAgICAgIGlucHV0LFxuICAgICAgICBzdGF0ZS5pbXBsaWNpdCAhPT0gbnVsbCA/IHN0YXRlLmltcGxpY2l0IDogc3RhdGUudGFnLFxuICAgICAgICBzdGF0ZS5hbnlcbiAgICAgICk7XG4gICAgICBpZiAoaW5wdXQuaXNFcnJvcihib2R5KSlcbiAgICAgICAgcmV0dXJuIGJvZHk7XG5cbiAgICAgIGlmIChzdGF0ZS5hbnkpXG4gICAgICAgIHJlc3VsdCA9IGlucHV0LnJhdyhzYXZlKTtcbiAgICAgIGVsc2VcbiAgICAgICAgaW5wdXQgPSBib2R5O1xuICAgIH1cblxuICAgIC8vIFNlbGVjdCBwcm9wZXIgbWV0aG9kIGZvciB0YWdcbiAgICBpZiAoc3RhdGUuYW55KVxuICAgICAgcmVzdWx0ID0gcmVzdWx0O1xuICAgIGVsc2UgaWYgKHN0YXRlLmNob2ljZSA9PT0gbnVsbClcbiAgICAgIHJlc3VsdCA9IHRoaXMuX2RlY29kZUdlbmVyaWMoc3RhdGUudGFnLCBpbnB1dCk7XG4gICAgZWxzZVxuICAgICAgcmVzdWx0ID0gdGhpcy5fZGVjb2RlQ2hvaWNlKGlucHV0KTtcblxuICAgIGlmIChpbnB1dC5pc0Vycm9yKHJlc3VsdCkpXG4gICAgICByZXR1cm4gcmVzdWx0O1xuXG4gICAgLy8gRGVjb2RlIGNoaWxkcmVuXG4gICAgaWYgKCFzdGF0ZS5hbnkgJiYgc3RhdGUuY2hvaWNlID09PSBudWxsICYmIHN0YXRlLmNoaWxkcmVuICE9PSBudWxsKSB7XG4gICAgICB2YXIgZmFpbCA9IHN0YXRlLmNoaWxkcmVuLnNvbWUoZnVuY3Rpb24gZGVjb2RlQ2hpbGRyZW4oY2hpbGQpIHtcbiAgICAgICAgLy8gTk9URTogV2UgYXJlIGlnbm9yaW5nIGVycm9ycyBoZXJlLCB0byBsZXQgcGFyc2VyIGNvbnRpbnVlIHdpdGggb3RoZXJcbiAgICAgICAgLy8gcGFydHMgb2YgZW5jb2RlZCBkYXRhXG4gICAgICAgIGNoaWxkLl9kZWNvZGUoaW5wdXQpO1xuICAgICAgfSk7XG4gICAgICBpZiAoZmFpbClcbiAgICAgICAgcmV0dXJuIGVycjtcbiAgICB9XG5cbiAgICAvLyBEZWNvZGUgY29udGFpbmVkL2VuY29kZWQgYnkgc2NoZW1hLCBvbmx5IGluIGJpdCBvciBvY3RldCBzdHJpbmdzXG4gICAgaWYgKHN0YXRlLmNvbnRhaW5zICYmIChzdGF0ZS50YWcgPT09ICdvY3RzdHInIHx8IHN0YXRlLnRhZyA9PT0gJ2JpdHN0cicpKSB7XG4gICAgICB2YXIgZGF0YSA9IG5ldyBEZWNvZGVyQnVmZmVyKHJlc3VsdCk7XG4gICAgICByZXN1bHQgPSB0aGlzLl9nZXRVc2Uoc3RhdGUuY29udGFpbnMsIGlucHV0Ll9yZXBvcnRlclN0YXRlLm9iaikuX2RlY29kZShkYXRhKTtcbiAgICB9XG4gIH1cblxuICAvLyBQb3Agb2JqZWN0XG4gIGlmIChzdGF0ZS5vYmogJiYgcHJlc2VudClcbiAgICByZXN1bHQgPSBpbnB1dC5sZWF2ZU9iamVjdChwcmV2T2JqKTtcblxuICAvLyBTZXQga2V5XG4gIGlmIChzdGF0ZS5rZXkgIT09IG51bGwgJiYgKHJlc3VsdCAhPT0gbnVsbCB8fCBwcmVzZW50ID09PSB0cnVlKSlcbiAgICBpbnB1dC5sZWF2ZUtleShwcmV2S2V5LCBzdGF0ZS5rZXksIHJlc3VsdCk7XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbk5vZGUucHJvdG90eXBlLl9kZWNvZGVHZW5lcmljID0gZnVuY3Rpb24gZGVjb2RlR2VuZXJpYyh0YWcsIGlucHV0KSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX2Jhc2VTdGF0ZTtcblxuICBpZiAodGFnID09PSAnc2VxJyB8fCB0YWcgPT09ICdzZXQnKVxuICAgIHJldHVybiBudWxsO1xuICBpZiAodGFnID09PSAnc2Vxb2YnIHx8IHRhZyA9PT0gJ3NldG9mJylcbiAgICByZXR1cm4gdGhpcy5fZGVjb2RlTGlzdChpbnB1dCwgdGFnLCBzdGF0ZS5hcmdzWzBdKTtcbiAgZWxzZSBpZiAodGFnID09PSAnb2N0c3RyJyB8fCB0YWcgPT09ICdiaXRzdHInKVxuICAgIHJldHVybiB0aGlzLl9kZWNvZGVTdHIoaW5wdXQsIHRhZyk7XG4gIGVsc2UgaWYgKHRhZyA9PT0gJ2lhNXN0cicgfHwgdGFnID09PSAndXRmOHN0cicgfHwgdGFnID09PSAnYm1wc3RyJylcbiAgICByZXR1cm4gdGhpcy5fZGVjb2RlU3RyKGlucHV0LCB0YWcpO1xuICBlbHNlIGlmICh0YWcgPT09ICdudW1zdHInIHx8IHRhZyA9PT0gJ3ByaW50c3RyJylcbiAgICByZXR1cm4gdGhpcy5fZGVjb2RlU3RyKGlucHV0LCB0YWcpO1xuICBlbHNlIGlmICh0YWcgPT09ICdvYmppZCcgJiYgc3RhdGUuYXJncylcbiAgICByZXR1cm4gdGhpcy5fZGVjb2RlT2JqaWQoaW5wdXQsIHN0YXRlLmFyZ3NbMF0sIHN0YXRlLmFyZ3NbMV0pO1xuICBlbHNlIGlmICh0YWcgPT09ICdvYmppZCcpXG4gICAgcmV0dXJuIHRoaXMuX2RlY29kZU9iamlkKGlucHV0LCBudWxsLCBudWxsKTtcbiAgZWxzZSBpZiAodGFnID09PSAnZ2VudGltZScgfHwgdGFnID09PSAndXRjdGltZScpXG4gICAgcmV0dXJuIHRoaXMuX2RlY29kZVRpbWUoaW5wdXQsIHRhZyk7XG4gIGVsc2UgaWYgKHRhZyA9PT0gJ251bGxfJylcbiAgICByZXR1cm4gdGhpcy5fZGVjb2RlTnVsbChpbnB1dCk7XG4gIGVsc2UgaWYgKHRhZyA9PT0gJ2Jvb2wnKVxuICAgIHJldHVybiB0aGlzLl9kZWNvZGVCb29sKGlucHV0KTtcbiAgZWxzZSBpZiAodGFnID09PSAnaW50JyB8fCB0YWcgPT09ICdlbnVtJylcbiAgICByZXR1cm4gdGhpcy5fZGVjb2RlSW50KGlucHV0LCBzdGF0ZS5hcmdzICYmIHN0YXRlLmFyZ3NbMF0pO1xuICBlbHNlIGlmIChzdGF0ZS51c2UgIT09IG51bGwpXG4gICAgcmV0dXJuIHRoaXMuX2dldFVzZShzdGF0ZS51c2UsIGlucHV0Ll9yZXBvcnRlclN0YXRlLm9iaikuX2RlY29kZShpbnB1dCk7XG4gIGVsc2VcbiAgICByZXR1cm4gaW5wdXQuZXJyb3IoJ3Vua25vd24gdGFnOiAnICsgdGFnKTtcblxuICByZXR1cm4gbnVsbDtcbn07XG5cbk5vZGUucHJvdG90eXBlLl9nZXRVc2UgPSBmdW5jdGlvbiBfZ2V0VXNlKGVudGl0eSwgb2JqKSB7XG5cbiAgdmFyIHN0YXRlID0gdGhpcy5fYmFzZVN0YXRlO1xuICAvLyBDcmVhdGUgYWx0ZXJlZCB1c2UgZGVjb2RlciBpZiBpbXBsaWNpdCBpcyBzZXRcbiAgc3RhdGUudXNlRGVjb2RlciA9IHRoaXMuX3VzZShlbnRpdHksIG9iaik7XG4gIGFzc2VydChzdGF0ZS51c2VEZWNvZGVyLl9iYXNlU3RhdGUucGFyZW50ID09PSBudWxsKTtcbiAgc3RhdGUudXNlRGVjb2RlciA9IHN0YXRlLnVzZURlY29kZXIuX2Jhc2VTdGF0ZS5jaGlsZHJlblswXTtcbiAgaWYgKHN0YXRlLmltcGxpY2l0ICE9PSBzdGF0ZS51c2VEZWNvZGVyLl9iYXNlU3RhdGUuaW1wbGljaXQpIHtcbiAgICBzdGF0ZS51c2VEZWNvZGVyID0gc3RhdGUudXNlRGVjb2Rlci5jbG9uZSgpO1xuICAgIHN0YXRlLnVzZURlY29kZXIuX2Jhc2VTdGF0ZS5pbXBsaWNpdCA9IHN0YXRlLmltcGxpY2l0O1xuICB9XG4gIHJldHVybiBzdGF0ZS51c2VEZWNvZGVyO1xufTtcblxuTm9kZS5wcm90b3R5cGUuX2RlY29kZUNob2ljZSA9IGZ1bmN0aW9uIGRlY29kZUNob2ljZShpbnB1dCkge1xuICB2YXIgc3RhdGUgPSB0aGlzLl9iYXNlU3RhdGU7XG4gIHZhciByZXN1bHQgPSBudWxsO1xuICB2YXIgbWF0Y2ggPSBmYWxzZTtcblxuICBPYmplY3Qua2V5cyhzdGF0ZS5jaG9pY2UpLnNvbWUoZnVuY3Rpb24oa2V5KSB7XG4gICAgdmFyIHNhdmUgPSBpbnB1dC5zYXZlKCk7XG4gICAgdmFyIG5vZGUgPSBzdGF0ZS5jaG9pY2Vba2V5XTtcbiAgICB0cnkge1xuICAgICAgdmFyIHZhbHVlID0gbm9kZS5fZGVjb2RlKGlucHV0KTtcbiAgICAgIGlmIChpbnB1dC5pc0Vycm9yKHZhbHVlKSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgICByZXN1bHQgPSB7IHR5cGU6IGtleSwgdmFsdWU6IHZhbHVlIH07XG4gICAgICBtYXRjaCA9IHRydWU7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaW5wdXQucmVzdG9yZShzYXZlKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sIHRoaXMpO1xuXG4gIGlmICghbWF0Y2gpXG4gICAgcmV0dXJuIGlucHV0LmVycm9yKCdDaG9pY2Ugbm90IG1hdGNoZWQnKTtcblxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLy9cbi8vIEVuY29kaW5nXG4vL1xuXG5Ob2RlLnByb3RvdHlwZS5fY3JlYXRlRW5jb2RlckJ1ZmZlciA9IGZ1bmN0aW9uIGNyZWF0ZUVuY29kZXJCdWZmZXIoZGF0YSkge1xuICByZXR1cm4gbmV3IEVuY29kZXJCdWZmZXIoZGF0YSwgdGhpcy5yZXBvcnRlcik7XG59O1xuXG5Ob2RlLnByb3RvdHlwZS5fZW5jb2RlID0gZnVuY3Rpb24gZW5jb2RlKGRhdGEsIHJlcG9ydGVyLCBwYXJlbnQpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fYmFzZVN0YXRlO1xuICBpZiAoc3RhdGVbJ2RlZmF1bHQnXSAhPT0gbnVsbCAmJiBzdGF0ZVsnZGVmYXVsdCddID09PSBkYXRhKVxuICAgIHJldHVybjtcblxuICB2YXIgcmVzdWx0ID0gdGhpcy5fZW5jb2RlVmFsdWUoZGF0YSwgcmVwb3J0ZXIsIHBhcmVudCk7XG4gIGlmIChyZXN1bHQgPT09IHVuZGVmaW5lZClcbiAgICByZXR1cm47XG5cbiAgaWYgKHRoaXMuX3NraXBEZWZhdWx0KHJlc3VsdCwgcmVwb3J0ZXIsIHBhcmVudCkpXG4gICAgcmV0dXJuO1xuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5Ob2RlLnByb3RvdHlwZS5fZW5jb2RlVmFsdWUgPSBmdW5jdGlvbiBlbmNvZGUoZGF0YSwgcmVwb3J0ZXIsIHBhcmVudCkge1xuICB2YXIgc3RhdGUgPSB0aGlzLl9iYXNlU3RhdGU7XG5cbiAgLy8gRGVjb2RlIHJvb3Qgbm9kZVxuICBpZiAoc3RhdGUucGFyZW50ID09PSBudWxsKVxuICAgIHJldHVybiBzdGF0ZS5jaGlsZHJlblswXS5fZW5jb2RlKGRhdGEsIHJlcG9ydGVyIHx8IG5ldyBSZXBvcnRlcigpKTtcblxuICB2YXIgcmVzdWx0ID0gbnVsbDtcbiAgdmFyIHByZXNlbnQgPSB0cnVlO1xuXG4gIC8vIFNldCByZXBvcnRlciB0byBzaGFyZSBpdCB3aXRoIGEgY2hpbGQgY2xhc3NcbiAgdGhpcy5yZXBvcnRlciA9IHJlcG9ydGVyO1xuXG4gIC8vIENoZWNrIGlmIGRhdGEgaXMgdGhlcmVcbiAgaWYgKHN0YXRlLm9wdGlvbmFsICYmIGRhdGEgPT09IHVuZGVmaW5lZCkge1xuICAgIGlmIChzdGF0ZVsnZGVmYXVsdCddICE9PSBudWxsKVxuICAgICAgZGF0YSA9IHN0YXRlWydkZWZhdWx0J11cbiAgICBlbHNlXG4gICAgICByZXR1cm47XG4gIH1cblxuICAvLyBGb3IgZXJyb3IgcmVwb3J0aW5nXG4gIHZhciBwcmV2S2V5O1xuXG4gIC8vIEVuY29kZSBjaGlsZHJlbiBmaXJzdFxuICB2YXIgY29udGVudCA9IG51bGw7XG4gIHZhciBwcmltaXRpdmUgPSBmYWxzZTtcbiAgaWYgKHN0YXRlLmFueSkge1xuICAgIC8vIEFueXRoaW5nIHRoYXQgd2FzIGdpdmVuIGlzIHRyYW5zbGF0ZWQgdG8gYnVmZmVyXG4gICAgcmVzdWx0ID0gdGhpcy5fY3JlYXRlRW5jb2RlckJ1ZmZlcihkYXRhKTtcbiAgfSBlbHNlIGlmIChzdGF0ZS5jaG9pY2UpIHtcbiAgICByZXN1bHQgPSB0aGlzLl9lbmNvZGVDaG9pY2UoZGF0YSwgcmVwb3J0ZXIpO1xuICB9IGVsc2UgaWYgKHN0YXRlLmNvbnRhaW5zKSB7XG4gICAgY29udGVudCA9IHRoaXMuX2dldFVzZShzdGF0ZS5jb250YWlucywgcGFyZW50KS5fZW5jb2RlKGRhdGEsIHJlcG9ydGVyKTtcbiAgICBwcmltaXRpdmUgPSB0cnVlO1xuICB9IGVsc2UgaWYgKHN0YXRlLmNoaWxkcmVuKSB7XG4gICAgY29udGVudCA9IHN0YXRlLmNoaWxkcmVuLm1hcChmdW5jdGlvbihjaGlsZCkge1xuICAgICAgaWYgKGNoaWxkLl9iYXNlU3RhdGUudGFnID09PSAnbnVsbF8nKVxuICAgICAgICByZXR1cm4gY2hpbGQuX2VuY29kZShudWxsLCByZXBvcnRlciwgZGF0YSk7XG5cbiAgICAgIGlmIChjaGlsZC5fYmFzZVN0YXRlLmtleSA9PT0gbnVsbClcbiAgICAgICAgcmV0dXJuIHJlcG9ydGVyLmVycm9yKCdDaGlsZCBzaG91bGQgaGF2ZSBhIGtleScpO1xuICAgICAgdmFyIHByZXZLZXkgPSByZXBvcnRlci5lbnRlcktleShjaGlsZC5fYmFzZVN0YXRlLmtleSk7XG5cbiAgICAgIGlmICh0eXBlb2YgZGF0YSAhPT0gJ29iamVjdCcpXG4gICAgICAgIHJldHVybiByZXBvcnRlci5lcnJvcignQ2hpbGQgZXhwZWN0ZWQsIGJ1dCBpbnB1dCBpcyBub3Qgb2JqZWN0Jyk7XG5cbiAgICAgIHZhciByZXMgPSBjaGlsZC5fZW5jb2RlKGRhdGFbY2hpbGQuX2Jhc2VTdGF0ZS5rZXldLCByZXBvcnRlciwgZGF0YSk7XG4gICAgICByZXBvcnRlci5sZWF2ZUtleShwcmV2S2V5KTtcblxuICAgICAgcmV0dXJuIHJlcztcbiAgICB9LCB0aGlzKS5maWx0ZXIoZnVuY3Rpb24oY2hpbGQpIHtcbiAgICAgIHJldHVybiBjaGlsZDtcbiAgICB9KTtcbiAgICBjb250ZW50ID0gdGhpcy5fY3JlYXRlRW5jb2RlckJ1ZmZlcihjb250ZW50KTtcbiAgfSBlbHNlIHtcbiAgICBpZiAoc3RhdGUudGFnID09PSAnc2Vxb2YnIHx8IHN0YXRlLnRhZyA9PT0gJ3NldG9mJykge1xuICAgICAgLy8gVE9ETyhpbmR1dG55KTogdGhpcyBzaG91bGQgYmUgdGhyb3duIG9uIERTTCBsZXZlbFxuICAgICAgaWYgKCEoc3RhdGUuYXJncyAmJiBzdGF0ZS5hcmdzLmxlbmd0aCA9PT0gMSkpXG4gICAgICAgIHJldHVybiByZXBvcnRlci5lcnJvcignVG9vIG1hbnkgYXJncyBmb3IgOiAnICsgc3RhdGUudGFnKTtcblxuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGRhdGEpKVxuICAgICAgICByZXR1cm4gcmVwb3J0ZXIuZXJyb3IoJ3NlcW9mL3NldG9mLCBidXQgZGF0YSBpcyBub3QgQXJyYXknKTtcblxuICAgICAgdmFyIGNoaWxkID0gdGhpcy5jbG9uZSgpO1xuICAgICAgY2hpbGQuX2Jhc2VTdGF0ZS5pbXBsaWNpdCA9IG51bGw7XG4gICAgICBjb250ZW50ID0gdGhpcy5fY3JlYXRlRW5jb2RlckJ1ZmZlcihkYXRhLm1hcChmdW5jdGlvbihpdGVtKSB7XG4gICAgICAgIHZhciBzdGF0ZSA9IHRoaXMuX2Jhc2VTdGF0ZTtcblxuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0VXNlKHN0YXRlLmFyZ3NbMF0sIGRhdGEpLl9lbmNvZGUoaXRlbSwgcmVwb3J0ZXIpO1xuICAgICAgfSwgY2hpbGQpKTtcbiAgICB9IGVsc2UgaWYgKHN0YXRlLnVzZSAhPT0gbnVsbCkge1xuICAgICAgcmVzdWx0ID0gdGhpcy5fZ2V0VXNlKHN0YXRlLnVzZSwgcGFyZW50KS5fZW5jb2RlKGRhdGEsIHJlcG9ydGVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29udGVudCA9IHRoaXMuX2VuY29kZVByaW1pdGl2ZShzdGF0ZS50YWcsIGRhdGEpO1xuICAgICAgcHJpbWl0aXZlID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICAvLyBFbmNvZGUgZGF0YSBpdHNlbGZcbiAgdmFyIHJlc3VsdDtcbiAgaWYgKCFzdGF0ZS5hbnkgJiYgc3RhdGUuY2hvaWNlID09PSBudWxsKSB7XG4gICAgdmFyIHRhZyA9IHN0YXRlLmltcGxpY2l0ICE9PSBudWxsID8gc3RhdGUuaW1wbGljaXQgOiBzdGF0ZS50YWc7XG4gICAgdmFyIGNscyA9IHN0YXRlLmltcGxpY2l0ID09PSBudWxsID8gJ3VuaXZlcnNhbCcgOiAnY29udGV4dCc7XG5cbiAgICBpZiAodGFnID09PSBudWxsKSB7XG4gICAgICBpZiAoc3RhdGUudXNlID09PSBudWxsKVxuICAgICAgICByZXBvcnRlci5lcnJvcignVGFnIGNvdWxkIGJlIG9tbWl0ZWQgb25seSBmb3IgLnVzZSgpJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChzdGF0ZS51c2UgPT09IG51bGwpXG4gICAgICAgIHJlc3VsdCA9IHRoaXMuX2VuY29kZUNvbXBvc2l0ZSh0YWcsIHByaW1pdGl2ZSwgY2xzLCBjb250ZW50KTtcbiAgICB9XG4gIH1cblxuICAvLyBXcmFwIGluIGV4cGxpY2l0XG4gIGlmIChzdGF0ZS5leHBsaWNpdCAhPT0gbnVsbClcbiAgICByZXN1bHQgPSB0aGlzLl9lbmNvZGVDb21wb3NpdGUoc3RhdGUuZXhwbGljaXQsIGZhbHNlLCAnY29udGV4dCcsIHJlc3VsdCk7XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbk5vZGUucHJvdG90eXBlLl9lbmNvZGVDaG9pY2UgPSBmdW5jdGlvbiBlbmNvZGVDaG9pY2UoZGF0YSwgcmVwb3J0ZXIpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fYmFzZVN0YXRlO1xuXG4gIHZhciBub2RlID0gc3RhdGUuY2hvaWNlW2RhdGEudHlwZV07XG4gIGlmICghbm9kZSkge1xuICAgIGFzc2VydChcbiAgICAgICAgZmFsc2UsXG4gICAgICAgIGRhdGEudHlwZSArICcgbm90IGZvdW5kIGluICcgK1xuICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoT2JqZWN0LmtleXMoc3RhdGUuY2hvaWNlKSkpO1xuICB9XG4gIHJldHVybiBub2RlLl9lbmNvZGUoZGF0YS52YWx1ZSwgcmVwb3J0ZXIpO1xufTtcblxuTm9kZS5wcm90b3R5cGUuX2VuY29kZVByaW1pdGl2ZSA9IGZ1bmN0aW9uIGVuY29kZVByaW1pdGl2ZSh0YWcsIGRhdGEpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fYmFzZVN0YXRlO1xuXG4gIGlmICh0YWcgPT09ICdvY3RzdHInIHx8IHRhZyA9PT0gJ2JpdHN0cicgfHwgdGFnID09PSAnaWE1c3RyJylcbiAgICByZXR1cm4gdGhpcy5fZW5jb2RlU3RyKGRhdGEsIHRhZyk7XG4gIGVsc2UgaWYgKHRhZyA9PT0gJ3V0ZjhzdHInIHx8IHRhZyA9PT0gJ2JtcHN0cicpXG4gICAgcmV0dXJuIHRoaXMuX2VuY29kZVN0cihkYXRhLCB0YWcpO1xuICBlbHNlIGlmICh0YWcgPT09ICdudW1zdHInIHx8IHRhZyA9PT0gJ3ByaW50c3RyJylcbiAgICByZXR1cm4gdGhpcy5fZW5jb2RlU3RyKGRhdGEsIHRhZyk7XG4gIGVsc2UgaWYgKHRhZyA9PT0gJ29iamlkJyAmJiBzdGF0ZS5hcmdzKVxuICAgIHJldHVybiB0aGlzLl9lbmNvZGVPYmppZChkYXRhLCBzdGF0ZS5yZXZlcnNlQXJnc1swXSwgc3RhdGUuYXJnc1sxXSk7XG4gIGVsc2UgaWYgKHRhZyA9PT0gJ29iamlkJylcbiAgICByZXR1cm4gdGhpcy5fZW5jb2RlT2JqaWQoZGF0YSwgbnVsbCwgbnVsbCk7XG4gIGVsc2UgaWYgKHRhZyA9PT0gJ2dlbnRpbWUnIHx8IHRhZyA9PT0gJ3V0Y3RpbWUnKVxuICAgIHJldHVybiB0aGlzLl9lbmNvZGVUaW1lKGRhdGEsIHRhZyk7XG4gIGVsc2UgaWYgKHRhZyA9PT0gJ251bGxfJylcbiAgICByZXR1cm4gdGhpcy5fZW5jb2RlTnVsbCgpO1xuICBlbHNlIGlmICh0YWcgPT09ICdpbnQnIHx8IHRhZyA9PT0gJ2VudW0nKVxuICAgIHJldHVybiB0aGlzLl9lbmNvZGVJbnQoZGF0YSwgc3RhdGUuYXJncyAmJiBzdGF0ZS5yZXZlcnNlQXJnc1swXSk7XG4gIGVsc2UgaWYgKHRhZyA9PT0gJ2Jvb2wnKVxuICAgIHJldHVybiB0aGlzLl9lbmNvZGVCb29sKGRhdGEpO1xuICBlbHNlXG4gICAgdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCB0YWc6ICcgKyB0YWcpO1xufTtcblxuTm9kZS5wcm90b3R5cGUuX2lzTnVtc3RyID0gZnVuY3Rpb24gaXNOdW1zdHIoc3RyKSB7XG4gIHJldHVybiAvXlswLTkgXSokLy50ZXN0KHN0cik7XG59O1xuXG5Ob2RlLnByb3RvdHlwZS5faXNQcmludHN0ciA9IGZ1bmN0aW9uIGlzUHJpbnRzdHIoc3RyKSB7XG4gIHJldHVybiAvXltBLVphLXowLTkgJ1xcKFxcKVxcKyxcXC1cXC5cXC86PVxcP10qJC8udGVzdChzdHIpO1xufTtcbiIsInZhciBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG5cbmZ1bmN0aW9uIFJlcG9ydGVyKG9wdGlvbnMpIHtcbiAgdGhpcy5fcmVwb3J0ZXJTdGF0ZSA9IHtcbiAgICBvYmo6IG51bGwsXG4gICAgcGF0aDogW10sXG4gICAgb3B0aW9uczogb3B0aW9ucyB8fCB7fSxcbiAgICBlcnJvcnM6IFtdXG4gIH07XG59XG5leHBvcnRzLlJlcG9ydGVyID0gUmVwb3J0ZXI7XG5cblJlcG9ydGVyLnByb3RvdHlwZS5pc0Vycm9yID0gZnVuY3Rpb24gaXNFcnJvcihvYmopIHtcbiAgcmV0dXJuIG9iaiBpbnN0YW5jZW9mIFJlcG9ydGVyRXJyb3I7XG59O1xuXG5SZXBvcnRlci5wcm90b3R5cGUuc2F2ZSA9IGZ1bmN0aW9uIHNhdmUoKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlcG9ydGVyU3RhdGU7XG5cbiAgcmV0dXJuIHsgb2JqOiBzdGF0ZS5vYmosIHBhdGhMZW46IHN0YXRlLnBhdGgubGVuZ3RoIH07XG59O1xuXG5SZXBvcnRlci5wcm90b3R5cGUucmVzdG9yZSA9IGZ1bmN0aW9uIHJlc3RvcmUoZGF0YSkge1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZXBvcnRlclN0YXRlO1xuXG4gIHN0YXRlLm9iaiA9IGRhdGEub2JqO1xuICBzdGF0ZS5wYXRoID0gc3RhdGUucGF0aC5zbGljZSgwLCBkYXRhLnBhdGhMZW4pO1xufTtcblxuUmVwb3J0ZXIucHJvdG90eXBlLmVudGVyS2V5ID0gZnVuY3Rpb24gZW50ZXJLZXkoa2V5KSB7XG4gIHJldHVybiB0aGlzLl9yZXBvcnRlclN0YXRlLnBhdGgucHVzaChrZXkpO1xufTtcblxuUmVwb3J0ZXIucHJvdG90eXBlLmxlYXZlS2V5ID0gZnVuY3Rpb24gbGVhdmVLZXkoaW5kZXgsIGtleSwgdmFsdWUpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVwb3J0ZXJTdGF0ZTtcblxuICBzdGF0ZS5wYXRoID0gc3RhdGUucGF0aC5zbGljZSgwLCBpbmRleCAtIDEpO1xuICBpZiAoc3RhdGUub2JqICE9PSBudWxsKVxuICAgIHN0YXRlLm9ialtrZXldID0gdmFsdWU7XG59O1xuXG5SZXBvcnRlci5wcm90b3R5cGUuZW50ZXJPYmplY3QgPSBmdW5jdGlvbiBlbnRlck9iamVjdCgpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVwb3J0ZXJTdGF0ZTtcblxuICB2YXIgcHJldiA9IHN0YXRlLm9iajtcbiAgc3RhdGUub2JqID0ge307XG4gIHJldHVybiBwcmV2O1xufTtcblxuUmVwb3J0ZXIucHJvdG90eXBlLmxlYXZlT2JqZWN0ID0gZnVuY3Rpb24gbGVhdmVPYmplY3QocHJldikge1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZXBvcnRlclN0YXRlO1xuXG4gIHZhciBub3cgPSBzdGF0ZS5vYmo7XG4gIHN0YXRlLm9iaiA9IHByZXY7XG4gIHJldHVybiBub3c7XG59O1xuXG5SZXBvcnRlci5wcm90b3R5cGUuZXJyb3IgPSBmdW5jdGlvbiBlcnJvcihtc2cpIHtcbiAgdmFyIGVycjtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVwb3J0ZXJTdGF0ZTtcblxuICB2YXIgaW5oZXJpdGVkID0gbXNnIGluc3RhbmNlb2YgUmVwb3J0ZXJFcnJvcjtcbiAgaWYgKGluaGVyaXRlZCkge1xuICAgIGVyciA9IG1zZztcbiAgfSBlbHNlIHtcbiAgICBlcnIgPSBuZXcgUmVwb3J0ZXJFcnJvcihzdGF0ZS5wYXRoLm1hcChmdW5jdGlvbihlbGVtKSB7XG4gICAgICByZXR1cm4gJ1snICsgSlNPTi5zdHJpbmdpZnkoZWxlbSkgKyAnXSc7XG4gICAgfSkuam9pbignJyksIG1zZy5tZXNzYWdlIHx8IG1zZywgbXNnLnN0YWNrKTtcbiAgfVxuXG4gIGlmICghc3RhdGUub3B0aW9ucy5wYXJ0aWFsKVxuICAgIHRocm93IGVycjtcblxuICBpZiAoIWluaGVyaXRlZClcbiAgICBzdGF0ZS5lcnJvcnMucHVzaChlcnIpO1xuXG4gIHJldHVybiBlcnI7XG59O1xuXG5SZXBvcnRlci5wcm90b3R5cGUud3JhcFJlc3VsdCA9IGZ1bmN0aW9uIHdyYXBSZXN1bHQocmVzdWx0KSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlcG9ydGVyU3RhdGU7XG4gIGlmICghc3RhdGUub3B0aW9ucy5wYXJ0aWFsKVxuICAgIHJldHVybiByZXN1bHQ7XG5cbiAgcmV0dXJuIHtcbiAgICByZXN1bHQ6IHRoaXMuaXNFcnJvcihyZXN1bHQpID8gbnVsbCA6IHJlc3VsdCxcbiAgICBlcnJvcnM6IHN0YXRlLmVycm9yc1xuICB9O1xufTtcblxuZnVuY3Rpb24gUmVwb3J0ZXJFcnJvcihwYXRoLCBtc2cpIHtcbiAgdGhpcy5wYXRoID0gcGF0aDtcbiAgdGhpcy5yZXRocm93KG1zZyk7XG59O1xuaW5oZXJpdHMoUmVwb3J0ZXJFcnJvciwgRXJyb3IpO1xuXG5SZXBvcnRlckVycm9yLnByb3RvdHlwZS5yZXRocm93ID0gZnVuY3Rpb24gcmV0aHJvdyhtc2cpIHtcbiAgdGhpcy5tZXNzYWdlID0gbXNnICsgJyBhdDogJyArICh0aGlzLnBhdGggfHwgJyhzaGFsbG93KScpO1xuICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBSZXBvcnRlckVycm9yKTtcblxuICByZXR1cm4gdGhpcztcbn07XG4iLCJ2YXIgY29uc3RhbnRzID0gcmVxdWlyZSgnLi4vY29uc3RhbnRzJyk7XG5cbmV4cG9ydHMudGFnQ2xhc3MgPSB7XG4gIDA6ICd1bml2ZXJzYWwnLFxuICAxOiAnYXBwbGljYXRpb24nLFxuICAyOiAnY29udGV4dCcsXG4gIDM6ICdwcml2YXRlJ1xufTtcbmV4cG9ydHMudGFnQ2xhc3NCeU5hbWUgPSBjb25zdGFudHMuX3JldmVyc2UoZXhwb3J0cy50YWdDbGFzcyk7XG5cbmV4cG9ydHMudGFnID0ge1xuICAweDAwOiAnZW5kJyxcbiAgMHgwMTogJ2Jvb2wnLFxuICAweDAyOiAnaW50JyxcbiAgMHgwMzogJ2JpdHN0cicsXG4gIDB4MDQ6ICdvY3RzdHInLFxuICAweDA1OiAnbnVsbF8nLFxuICAweDA2OiAnb2JqaWQnLFxuICAweDA3OiAnb2JqRGVzYycsXG4gIDB4MDg6ICdleHRlcm5hbCcsXG4gIDB4MDk6ICdyZWFsJyxcbiAgMHgwYTogJ2VudW0nLFxuICAweDBiOiAnZW1iZWQnLFxuICAweDBjOiAndXRmOHN0cicsXG4gIDB4MGQ6ICdyZWxhdGl2ZU9pZCcsXG4gIDB4MTA6ICdzZXEnLFxuICAweDExOiAnc2V0JyxcbiAgMHgxMjogJ251bXN0cicsXG4gIDB4MTM6ICdwcmludHN0cicsXG4gIDB4MTQ6ICd0NjFzdHInLFxuICAweDE1OiAndmlkZW9zdHInLFxuICAweDE2OiAnaWE1c3RyJyxcbiAgMHgxNzogJ3V0Y3RpbWUnLFxuICAweDE4OiAnZ2VudGltZScsXG4gIDB4MTk6ICdncmFwaHN0cicsXG4gIDB4MWE6ICdpc282NDZzdHInLFxuICAweDFiOiAnZ2Vuc3RyJyxcbiAgMHgxYzogJ3VuaXN0cicsXG4gIDB4MWQ6ICdjaGFyc3RyJyxcbiAgMHgxZTogJ2JtcHN0cidcbn07XG5leHBvcnRzLnRhZ0J5TmFtZSA9IGNvbnN0YW50cy5fcmV2ZXJzZShleHBvcnRzLnRhZyk7XG4iLCJ2YXIgY29uc3RhbnRzID0gZXhwb3J0cztcblxuLy8gSGVscGVyXG5jb25zdGFudHMuX3JldmVyc2UgPSBmdW5jdGlvbiByZXZlcnNlKG1hcCkge1xuICB2YXIgcmVzID0ge307XG5cbiAgT2JqZWN0LmtleXMobWFwKS5mb3JFYWNoKGZ1bmN0aW9uKGtleSkge1xuICAgIC8vIENvbnZlcnQga2V5IHRvIGludGVnZXIgaWYgaXQgaXMgc3RyaW5naWZpZWRcbiAgICBpZiAoKGtleSB8IDApID09IGtleSlcbiAgICAgIGtleSA9IGtleSB8IDA7XG5cbiAgICB2YXIgdmFsdWUgPSBtYXBba2V5XTtcbiAgICByZXNbdmFsdWVdID0ga2V5O1xuICB9KTtcblxuICByZXR1cm4gcmVzO1xufTtcblxuY29uc3RhbnRzLmRlciA9IHJlcXVpcmUoJy4vZGVyJyk7XG4iLCJ2YXIgaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xuXG52YXIgYXNuMSA9IHJlcXVpcmUoJy4uLy4uL2FzbjEnKTtcbnZhciBiYXNlID0gYXNuMS5iYXNlO1xudmFyIGJpZ251bSA9IGFzbjEuYmlnbnVtO1xuXG4vLyBJbXBvcnQgREVSIGNvbnN0YW50c1xudmFyIGRlciA9IGFzbjEuY29uc3RhbnRzLmRlcjtcblxuZnVuY3Rpb24gREVSRGVjb2RlcihlbnRpdHkpIHtcbiAgdGhpcy5lbmMgPSAnZGVyJztcbiAgdGhpcy5uYW1lID0gZW50aXR5Lm5hbWU7XG4gIHRoaXMuZW50aXR5ID0gZW50aXR5O1xuXG4gIC8vIENvbnN0cnVjdCBiYXNlIHRyZWVcbiAgdGhpcy50cmVlID0gbmV3IERFUk5vZGUoKTtcbiAgdGhpcy50cmVlLl9pbml0KGVudGl0eS5ib2R5KTtcbn07XG5tb2R1bGUuZXhwb3J0cyA9IERFUkRlY29kZXI7XG5cbkRFUkRlY29kZXIucHJvdG90eXBlLmRlY29kZSA9IGZ1bmN0aW9uIGRlY29kZShkYXRhLCBvcHRpb25zKSB7XG4gIGlmICghKGRhdGEgaW5zdGFuY2VvZiBiYXNlLkRlY29kZXJCdWZmZXIpKVxuICAgIGRhdGEgPSBuZXcgYmFzZS5EZWNvZGVyQnVmZmVyKGRhdGEsIG9wdGlvbnMpO1xuXG4gIHJldHVybiB0aGlzLnRyZWUuX2RlY29kZShkYXRhLCBvcHRpb25zKTtcbn07XG5cbi8vIFRyZWUgbWV0aG9kc1xuXG5mdW5jdGlvbiBERVJOb2RlKHBhcmVudCkge1xuICBiYXNlLk5vZGUuY2FsbCh0aGlzLCAnZGVyJywgcGFyZW50KTtcbn1cbmluaGVyaXRzKERFUk5vZGUsIGJhc2UuTm9kZSk7XG5cbkRFUk5vZGUucHJvdG90eXBlLl9wZWVrVGFnID0gZnVuY3Rpb24gcGVla1RhZyhidWZmZXIsIHRhZywgYW55KSB7XG4gIGlmIChidWZmZXIuaXNFbXB0eSgpKVxuICAgIHJldHVybiBmYWxzZTtcblxuICB2YXIgc3RhdGUgPSBidWZmZXIuc2F2ZSgpO1xuICB2YXIgZGVjb2RlZFRhZyA9IGRlckRlY29kZVRhZyhidWZmZXIsICdGYWlsZWQgdG8gcGVlayB0YWc6IFwiJyArIHRhZyArICdcIicpO1xuICBpZiAoYnVmZmVyLmlzRXJyb3IoZGVjb2RlZFRhZykpXG4gICAgcmV0dXJuIGRlY29kZWRUYWc7XG5cbiAgYnVmZmVyLnJlc3RvcmUoc3RhdGUpO1xuXG4gIHJldHVybiBkZWNvZGVkVGFnLnRhZyA9PT0gdGFnIHx8IGRlY29kZWRUYWcudGFnU3RyID09PSB0YWcgfHwgYW55O1xufTtcblxuREVSTm9kZS5wcm90b3R5cGUuX2RlY29kZVRhZyA9IGZ1bmN0aW9uIGRlY29kZVRhZyhidWZmZXIsIHRhZywgYW55KSB7XG4gIHZhciBkZWNvZGVkVGFnID0gZGVyRGVjb2RlVGFnKGJ1ZmZlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0ZhaWxlZCB0byBkZWNvZGUgdGFnIG9mIFwiJyArIHRhZyArICdcIicpO1xuICBpZiAoYnVmZmVyLmlzRXJyb3IoZGVjb2RlZFRhZykpXG4gICAgcmV0dXJuIGRlY29kZWRUYWc7XG5cbiAgdmFyIGxlbiA9IGRlckRlY29kZUxlbihidWZmZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlZFRhZy5wcmltaXRpdmUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgJ0ZhaWxlZCB0byBnZXQgbGVuZ3RoIG9mIFwiJyArIHRhZyArICdcIicpO1xuXG4gIC8vIEZhaWx1cmVcbiAgaWYgKGJ1ZmZlci5pc0Vycm9yKGxlbikpXG4gICAgcmV0dXJuIGxlbjtcblxuICBpZiAoIWFueSAmJlxuICAgICAgZGVjb2RlZFRhZy50YWcgIT09IHRhZyAmJlxuICAgICAgZGVjb2RlZFRhZy50YWdTdHIgIT09IHRhZyAmJlxuICAgICAgZGVjb2RlZFRhZy50YWdTdHIgKyAnb2YnICE9PSB0YWcpIHtcbiAgICByZXR1cm4gYnVmZmVyLmVycm9yKCdGYWlsZWQgdG8gbWF0Y2ggdGFnOiBcIicgKyB0YWcgKyAnXCInKTtcbiAgfVxuXG4gIGlmIChkZWNvZGVkVGFnLnByaW1pdGl2ZSB8fCBsZW4gIT09IG51bGwpXG4gICAgcmV0dXJuIGJ1ZmZlci5za2lwKGxlbiwgJ0ZhaWxlZCB0byBtYXRjaCBib2R5IG9mOiBcIicgKyB0YWcgKyAnXCInKTtcblxuICAvLyBJbmRlZmluaXRlIGxlbmd0aC4uLiBmaW5kIEVORCB0YWdcbiAgdmFyIHN0YXRlID0gYnVmZmVyLnNhdmUoKTtcbiAgdmFyIHJlcyA9IHRoaXMuX3NraXBVbnRpbEVuZChcbiAgICAgIGJ1ZmZlcixcbiAgICAgICdGYWlsZWQgdG8gc2tpcCBpbmRlZmluaXRlIGxlbmd0aCBib2R5OiBcIicgKyB0aGlzLnRhZyArICdcIicpO1xuICBpZiAoYnVmZmVyLmlzRXJyb3IocmVzKSlcbiAgICByZXR1cm4gcmVzO1xuXG4gIGxlbiA9IGJ1ZmZlci5vZmZzZXQgLSBzdGF0ZS5vZmZzZXQ7XG4gIGJ1ZmZlci5yZXN0b3JlKHN0YXRlKTtcbiAgcmV0dXJuIGJ1ZmZlci5za2lwKGxlbiwgJ0ZhaWxlZCB0byBtYXRjaCBib2R5IG9mOiBcIicgKyB0YWcgKyAnXCInKTtcbn07XG5cbkRFUk5vZGUucHJvdG90eXBlLl9za2lwVW50aWxFbmQgPSBmdW5jdGlvbiBza2lwVW50aWxFbmQoYnVmZmVyLCBmYWlsKSB7XG4gIHdoaWxlICh0cnVlKSB7XG4gICAgdmFyIHRhZyA9IGRlckRlY29kZVRhZyhidWZmZXIsIGZhaWwpO1xuICAgIGlmIChidWZmZXIuaXNFcnJvcih0YWcpKVxuICAgICAgcmV0dXJuIHRhZztcbiAgICB2YXIgbGVuID0gZGVyRGVjb2RlTGVuKGJ1ZmZlciwgdGFnLnByaW1pdGl2ZSwgZmFpbCk7XG4gICAgaWYgKGJ1ZmZlci5pc0Vycm9yKGxlbikpXG4gICAgICByZXR1cm4gbGVuO1xuXG4gICAgdmFyIHJlcztcbiAgICBpZiAodGFnLnByaW1pdGl2ZSB8fCBsZW4gIT09IG51bGwpXG4gICAgICByZXMgPSBidWZmZXIuc2tpcChsZW4pXG4gICAgZWxzZVxuICAgICAgcmVzID0gdGhpcy5fc2tpcFVudGlsRW5kKGJ1ZmZlciwgZmFpbCk7XG5cbiAgICAvLyBGYWlsdXJlXG4gICAgaWYgKGJ1ZmZlci5pc0Vycm9yKHJlcykpXG4gICAgICByZXR1cm4gcmVzO1xuXG4gICAgaWYgKHRhZy50YWdTdHIgPT09ICdlbmQnKVxuICAgICAgYnJlYWs7XG4gIH1cbn07XG5cbkRFUk5vZGUucHJvdG90eXBlLl9kZWNvZGVMaXN0ID0gZnVuY3Rpb24gZGVjb2RlTGlzdChidWZmZXIsIHRhZywgZGVjb2Rlcikge1xuICB2YXIgcmVzdWx0ID0gW107XG4gIHdoaWxlICghYnVmZmVyLmlzRW1wdHkoKSkge1xuICAgIHZhciBwb3NzaWJsZUVuZCA9IHRoaXMuX3BlZWtUYWcoYnVmZmVyLCAnZW5kJyk7XG4gICAgaWYgKGJ1ZmZlci5pc0Vycm9yKHBvc3NpYmxlRW5kKSlcbiAgICAgIHJldHVybiBwb3NzaWJsZUVuZDtcblxuICAgIHZhciByZXMgPSBkZWNvZGVyLmRlY29kZShidWZmZXIsICdkZXInKTtcbiAgICBpZiAoYnVmZmVyLmlzRXJyb3IocmVzKSAmJiBwb3NzaWJsZUVuZClcbiAgICAgIGJyZWFrO1xuICAgIHJlc3VsdC5wdXNoKHJlcyk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbkRFUk5vZGUucHJvdG90eXBlLl9kZWNvZGVTdHIgPSBmdW5jdGlvbiBkZWNvZGVTdHIoYnVmZmVyLCB0YWcpIHtcbiAgaWYgKHRhZyA9PT0gJ29jdHN0cicpIHtcbiAgICByZXR1cm4gYnVmZmVyLnJhdygpO1xuICB9IGVsc2UgaWYgKHRhZyA9PT0gJ2JpdHN0cicpIHtcbiAgICB2YXIgdW51c2VkID0gYnVmZmVyLnJlYWRVSW50OCgpO1xuICAgIGlmIChidWZmZXIuaXNFcnJvcih1bnVzZWQpKVxuICAgICAgcmV0dXJuIHVudXNlZDtcblxuICAgIHJldHVybiB7IHVudXNlZDogdW51c2VkLCBkYXRhOiBidWZmZXIucmF3KCkgfTtcbiAgfSBlbHNlIGlmICh0YWcgPT09ICdpYTVzdHInIHx8IHRhZyA9PT0gJ3V0ZjhzdHInKSB7XG4gICAgcmV0dXJuIGJ1ZmZlci5yYXcoKS50b1N0cmluZygpO1xuICB9IGVsc2UgaWYodGFnID09PSAnbnVtc3RyJykge1xuICAgIHZhciBudW1zdHIgPSBidWZmZXIucmF3KCkudG9TdHJpbmcoJ2FzY2lpJyk7XG4gICAgaWYgKCF0aGlzLl9pc051bXN0cihudW1zdHIpKSB7XG4gICAgICByZXR1cm4gYnVmZmVyLmVycm9yKCdEZWNvZGluZyBvZiBzdHJpbmcgdHlwZTogJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICdudW1zdHIgdW5zdXBwb3J0ZWQgY2hhcmFjdGVycycpO1xuICAgIH1cblxuICAgIHJldHVybiBudW1zdHI7XG4gIH0gZWxzZSBpZiAodGFnID09PSAncHJpbnRzdHInKSB7XG4gICAgdmFyIHByaW50c3RyID0gYnVmZmVyLnJhdygpLnRvU3RyaW5nKCdhc2NpaScpO1xuICAgIGlmICghdGhpcy5faXNQcmludHN0cihwcmludHN0cikpIHtcbiAgICAgIHJldHVybiBidWZmZXIuZXJyb3IoJ0RlY29kaW5nIG9mIHN0cmluZyB0eXBlOiAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ByaW50c3RyIHVuc3VwcG9ydGVkIGNoYXJhY3RlcnMnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcHJpbnRzdHI7XG4gIH0gZWxzZSBpZih0YWcgPT09ICdibXBzdHInKSB7XG4gICAgdmFyIHJhdyA9IGJ1ZmZlci5yYXcoKTtcbiAgICBpZiAocmF3Lmxlbmd0aCAlIDIgPT09IDEpXG4gICAgICByZXR1cm4gYnVmZmVyLmVycm9yKCdEZWNvZGluZyBvZiBzdHJpbmcgdHlwZTogYm1wc3RyIGxlbmd0aCBtaXNtYXRjaCcpO1xuXG4gICAgdmFyIHN0ciA9ICcnO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmF3Lmxlbmd0aCAvIDI7IGkrKykge1xuICAgICAgc3RyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUocmF3LnJlYWRVSW50MTZCRShpICogMikpO1xuICAgIH1cbiAgICByZXR1cm4gc3RyO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBidWZmZXIuZXJyb3IoJ0RlY29kaW5nIG9mIHN0cmluZyB0eXBlOiAnICsgdGFnICsgJyB1bnN1cHBvcnRlZCcpO1xuICB9XG59O1xuXG5ERVJOb2RlLnByb3RvdHlwZS5fZGVjb2RlT2JqaWQgPSBmdW5jdGlvbiBkZWNvZGVPYmppZChidWZmZXIsIHZhbHVlcywgcmVsYXRpdmUpIHtcbiAgdmFyIHJlc3VsdDtcbiAgdmFyIGlkZW50aWZpZXJzID0gW107XG4gIHZhciBpZGVudCA9IDA7XG4gIHdoaWxlICghYnVmZmVyLmlzRW1wdHkoKSkge1xuICAgIHZhciBzdWJpZGVudCA9IGJ1ZmZlci5yZWFkVUludDgoKTtcbiAgICBpZGVudCA8PD0gNztcbiAgICBpZGVudCB8PSBzdWJpZGVudCAmIDB4N2Y7XG4gICAgaWYgKChzdWJpZGVudCAmIDB4ODApID09PSAwKSB7XG4gICAgICBpZGVudGlmaWVycy5wdXNoKGlkZW50KTtcbiAgICAgIGlkZW50ID0gMDtcbiAgICB9XG4gIH1cbiAgaWYgKHN1YmlkZW50ICYgMHg4MClcbiAgICBpZGVudGlmaWVycy5wdXNoKGlkZW50KTtcblxuICB2YXIgZmlyc3QgPSAoaWRlbnRpZmllcnNbMF0gLyA0MCkgfCAwO1xuICB2YXIgc2Vjb25kID0gaWRlbnRpZmllcnNbMF0gJSA0MDtcblxuICBpZiAocmVsYXRpdmUpXG4gICAgcmVzdWx0ID0gaWRlbnRpZmllcnM7XG4gIGVsc2VcbiAgICByZXN1bHQgPSBbZmlyc3QsIHNlY29uZF0uY29uY2F0KGlkZW50aWZpZXJzLnNsaWNlKDEpKTtcblxuICBpZiAodmFsdWVzKSB7XG4gICAgdmFyIHRtcCA9IHZhbHVlc1tyZXN1bHQuam9pbignICcpXTtcbiAgICBpZiAodG1wID09PSB1bmRlZmluZWQpXG4gICAgICB0bXAgPSB2YWx1ZXNbcmVzdWx0LmpvaW4oJy4nKV07XG4gICAgaWYgKHRtcCAhPT0gdW5kZWZpbmVkKVxuICAgICAgcmVzdWx0ID0gdG1wO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbkRFUk5vZGUucHJvdG90eXBlLl9kZWNvZGVUaW1lID0gZnVuY3Rpb24gZGVjb2RlVGltZShidWZmZXIsIHRhZykge1xuICB2YXIgc3RyID0gYnVmZmVyLnJhdygpLnRvU3RyaW5nKCk7XG4gIGlmICh0YWcgPT09ICdnZW50aW1lJykge1xuICAgIHZhciB5ZWFyID0gc3RyLnNsaWNlKDAsIDQpIHwgMDtcbiAgICB2YXIgbW9uID0gc3RyLnNsaWNlKDQsIDYpIHwgMDtcbiAgICB2YXIgZGF5ID0gc3RyLnNsaWNlKDYsIDgpIHwgMDtcbiAgICB2YXIgaG91ciA9IHN0ci5zbGljZSg4LCAxMCkgfCAwO1xuICAgIHZhciBtaW4gPSBzdHIuc2xpY2UoMTAsIDEyKSB8IDA7XG4gICAgdmFyIHNlYyA9IHN0ci5zbGljZSgxMiwgMTQpIHwgMDtcbiAgfSBlbHNlIGlmICh0YWcgPT09ICd1dGN0aW1lJykge1xuICAgIHZhciB5ZWFyID0gc3RyLnNsaWNlKDAsIDIpIHwgMDtcbiAgICB2YXIgbW9uID0gc3RyLnNsaWNlKDIsIDQpIHwgMDtcbiAgICB2YXIgZGF5ID0gc3RyLnNsaWNlKDQsIDYpIHwgMDtcbiAgICB2YXIgaG91ciA9IHN0ci5zbGljZSg2LCA4KSB8IDA7XG4gICAgdmFyIG1pbiA9IHN0ci5zbGljZSg4LCAxMCkgfCAwO1xuICAgIHZhciBzZWMgPSBzdHIuc2xpY2UoMTAsIDEyKSB8IDA7XG4gICAgaWYgKHllYXIgPCA3MClcbiAgICAgIHllYXIgPSAyMDAwICsgeWVhcjtcbiAgICBlbHNlXG4gICAgICB5ZWFyID0gMTkwMCArIHllYXI7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGJ1ZmZlci5lcnJvcignRGVjb2RpbmcgJyArIHRhZyArICcgdGltZSBpcyBub3Qgc3VwcG9ydGVkIHlldCcpO1xuICB9XG5cbiAgcmV0dXJuIERhdGUuVVRDKHllYXIsIG1vbiAtIDEsIGRheSwgaG91ciwgbWluLCBzZWMsIDApO1xufTtcblxuREVSTm9kZS5wcm90b3R5cGUuX2RlY29kZU51bGwgPSBmdW5jdGlvbiBkZWNvZGVOdWxsKGJ1ZmZlcikge1xuICByZXR1cm4gbnVsbDtcbn07XG5cbkRFUk5vZGUucHJvdG90eXBlLl9kZWNvZGVCb29sID0gZnVuY3Rpb24gZGVjb2RlQm9vbChidWZmZXIpIHtcbiAgdmFyIHJlcyA9IGJ1ZmZlci5yZWFkVUludDgoKTtcbiAgaWYgKGJ1ZmZlci5pc0Vycm9yKHJlcykpXG4gICAgcmV0dXJuIHJlcztcbiAgZWxzZVxuICAgIHJldHVybiByZXMgIT09IDA7XG59O1xuXG5ERVJOb2RlLnByb3RvdHlwZS5fZGVjb2RlSW50ID0gZnVuY3Rpb24gZGVjb2RlSW50KGJ1ZmZlciwgdmFsdWVzKSB7XG4gIC8vIEJpZ2ludCwgcmV0dXJuIGFzIGl0IGlzIChhc3N1bWUgYmlnIGVuZGlhbilcbiAgdmFyIHJhdyA9IGJ1ZmZlci5yYXcoKTtcbiAgdmFyIHJlcyA9IG5ldyBiaWdudW0ocmF3KTtcblxuICBpZiAodmFsdWVzKVxuICAgIHJlcyA9IHZhbHVlc1tyZXMudG9TdHJpbmcoMTApXSB8fCByZXM7XG5cbiAgcmV0dXJuIHJlcztcbn07XG5cbkRFUk5vZGUucHJvdG90eXBlLl91c2UgPSBmdW5jdGlvbiB1c2UoZW50aXR5LCBvYmopIHtcbiAgaWYgKHR5cGVvZiBlbnRpdHkgPT09ICdmdW5jdGlvbicpXG4gICAgZW50aXR5ID0gZW50aXR5KG9iaik7XG4gIHJldHVybiBlbnRpdHkuX2dldERlY29kZXIoJ2RlcicpLnRyZWU7XG59O1xuXG4vLyBVdGlsaXR5IG1ldGhvZHNcblxuZnVuY3Rpb24gZGVyRGVjb2RlVGFnKGJ1ZiwgZmFpbCkge1xuICB2YXIgdGFnID0gYnVmLnJlYWRVSW50OChmYWlsKTtcbiAgaWYgKGJ1Zi5pc0Vycm9yKHRhZykpXG4gICAgcmV0dXJuIHRhZztcblxuICB2YXIgY2xzID0gZGVyLnRhZ0NsYXNzW3RhZyA+PiA2XTtcbiAgdmFyIHByaW1pdGl2ZSA9ICh0YWcgJiAweDIwKSA9PT0gMDtcblxuICAvLyBNdWx0aS1vY3RldCB0YWcgLSBsb2FkXG4gIGlmICgodGFnICYgMHgxZikgPT09IDB4MWYpIHtcbiAgICB2YXIgb2N0ID0gdGFnO1xuICAgIHRhZyA9IDA7XG4gICAgd2hpbGUgKChvY3QgJiAweDgwKSA9PT0gMHg4MCkge1xuICAgICAgb2N0ID0gYnVmLnJlYWRVSW50OChmYWlsKTtcbiAgICAgIGlmIChidWYuaXNFcnJvcihvY3QpKVxuICAgICAgICByZXR1cm4gb2N0O1xuXG4gICAgICB0YWcgPDw9IDc7XG4gICAgICB0YWcgfD0gb2N0ICYgMHg3ZjtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdGFnICY9IDB4MWY7XG4gIH1cbiAgdmFyIHRhZ1N0ciA9IGRlci50YWdbdGFnXTtcblxuICByZXR1cm4ge1xuICAgIGNsczogY2xzLFxuICAgIHByaW1pdGl2ZTogcHJpbWl0aXZlLFxuICAgIHRhZzogdGFnLFxuICAgIHRhZ1N0cjogdGFnU3RyXG4gIH07XG59XG5cbmZ1bmN0aW9uIGRlckRlY29kZUxlbihidWYsIHByaW1pdGl2ZSwgZmFpbCkge1xuICB2YXIgbGVuID0gYnVmLnJlYWRVSW50OChmYWlsKTtcbiAgaWYgKGJ1Zi5pc0Vycm9yKGxlbikpXG4gICAgcmV0dXJuIGxlbjtcblxuICAvLyBJbmRlZmluaXRlIGZvcm1cbiAgaWYgKCFwcmltaXRpdmUgJiYgbGVuID09PSAweDgwKVxuICAgIHJldHVybiBudWxsO1xuXG4gIC8vIERlZmluaXRlIGZvcm1cbiAgaWYgKChsZW4gJiAweDgwKSA9PT0gMCkge1xuICAgIC8vIFNob3J0IGZvcm1cbiAgICByZXR1cm4gbGVuO1xuICB9XG5cbiAgLy8gTG9uZyBmb3JtXG4gIHZhciBudW0gPSBsZW4gJiAweDdmO1xuICBpZiAobnVtID49IDQpXG4gICAgcmV0dXJuIGJ1Zi5lcnJvcignbGVuZ3RoIG9jdGVjdCBpcyB0b28gbG9uZycpO1xuXG4gIGxlbiA9IDA7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtOyBpKyspIHtcbiAgICBsZW4gPDw9IDg7XG4gICAgdmFyIGogPSBidWYucmVhZFVJbnQ4KGZhaWwpO1xuICAgIGlmIChidWYuaXNFcnJvcihqKSlcbiAgICAgIHJldHVybiBqO1xuICAgIGxlbiB8PSBqO1xuICB9XG5cbiAgcmV0dXJuIGxlbjtcbn1cbiIsInZhciBkZWNvZGVycyA9IGV4cG9ydHM7XG5cbmRlY29kZXJzLmRlciA9IHJlcXVpcmUoJy4vZGVyJyk7XG5kZWNvZGVycy5wZW0gPSByZXF1aXJlKCcuL3BlbScpO1xuIiwidmFyIGluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcbnZhciBCdWZmZXIgPSByZXF1aXJlKCdidWZmZXInKS5CdWZmZXI7XG5cbnZhciBhc24xID0gcmVxdWlyZSgnLi4vLi4vYXNuMScpO1xudmFyIERFUkRlY29kZXIgPSByZXF1aXJlKCcuL2RlcicpO1xuXG5mdW5jdGlvbiBQRU1EZWNvZGVyKGVudGl0eSkge1xuICBERVJEZWNvZGVyLmNhbGwodGhpcywgZW50aXR5KTtcbiAgdGhpcy5lbmMgPSAncGVtJztcbn07XG5pbmhlcml0cyhQRU1EZWNvZGVyLCBERVJEZWNvZGVyKTtcbm1vZHVsZS5leHBvcnRzID0gUEVNRGVjb2RlcjtcblxuUEVNRGVjb2Rlci5wcm90b3R5cGUuZGVjb2RlID0gZnVuY3Rpb24gZGVjb2RlKGRhdGEsIG9wdGlvbnMpIHtcbiAgdmFyIGxpbmVzID0gZGF0YS50b1N0cmluZygpLnNwbGl0KC9bXFxyXFxuXSsvZyk7XG5cbiAgdmFyIGxhYmVsID0gb3B0aW9ucy5sYWJlbC50b1VwcGVyQ2FzZSgpO1xuXG4gIHZhciByZSA9IC9eLS0tLS0oQkVHSU58RU5EKSAoW14tXSspLS0tLS0kLztcbiAgdmFyIHN0YXJ0ID0gLTE7XG4gIHZhciBlbmQgPSAtMTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBtYXRjaCA9IGxpbmVzW2ldLm1hdGNoKHJlKTtcbiAgICBpZiAobWF0Y2ggPT09IG51bGwpXG4gICAgICBjb250aW51ZTtcblxuICAgIGlmIChtYXRjaFsyXSAhPT0gbGFiZWwpXG4gICAgICBjb250aW51ZTtcblxuICAgIGlmIChzdGFydCA9PT0gLTEpIHtcbiAgICAgIGlmIChtYXRjaFsxXSAhPT0gJ0JFR0lOJylcbiAgICAgICAgYnJlYWs7XG4gICAgICBzdGFydCA9IGk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChtYXRjaFsxXSAhPT0gJ0VORCcpXG4gICAgICAgIGJyZWFrO1xuICAgICAgZW5kID0gaTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICBpZiAoc3RhcnQgPT09IC0xIHx8IGVuZCA9PT0gLTEpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdQRU0gc2VjdGlvbiBub3QgZm91bmQgZm9yOiAnICsgbGFiZWwpO1xuXG4gIHZhciBiYXNlNjQgPSBsaW5lcy5zbGljZShzdGFydCArIDEsIGVuZCkuam9pbignJyk7XG4gIC8vIFJlbW92ZSBleGNlc3NpdmUgc3ltYm9sc1xuICBiYXNlNjQucmVwbGFjZSgvW15hLXowLTlcXCtcXC89XSsvZ2ksICcnKTtcblxuICB2YXIgaW5wdXQgPSBuZXcgQnVmZmVyKGJhc2U2NCwgJ2Jhc2U2NCcpO1xuICByZXR1cm4gREVSRGVjb2Rlci5wcm90b3R5cGUuZGVjb2RlLmNhbGwodGhpcywgaW5wdXQsIG9wdGlvbnMpO1xufTtcbiIsInZhciBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG52YXIgQnVmZmVyID0gcmVxdWlyZSgnYnVmZmVyJykuQnVmZmVyO1xuXG52YXIgYXNuMSA9IHJlcXVpcmUoJy4uLy4uL2FzbjEnKTtcbnZhciBiYXNlID0gYXNuMS5iYXNlO1xudmFyIGJpZ251bSA9IGFzbjEuYmlnbnVtO1xuXG4vLyBJbXBvcnQgREVSIGNvbnN0YW50c1xudmFyIGRlciA9IGFzbjEuY29uc3RhbnRzLmRlcjtcblxuZnVuY3Rpb24gREVSRW5jb2RlcihlbnRpdHkpIHtcbiAgdGhpcy5lbmMgPSAnZGVyJztcbiAgdGhpcy5uYW1lID0gZW50aXR5Lm5hbWU7XG4gIHRoaXMuZW50aXR5ID0gZW50aXR5O1xuXG4gIC8vIENvbnN0cnVjdCBiYXNlIHRyZWVcbiAgdGhpcy50cmVlID0gbmV3IERFUk5vZGUoKTtcbiAgdGhpcy50cmVlLl9pbml0KGVudGl0eS5ib2R5KTtcbn07XG5tb2R1bGUuZXhwb3J0cyA9IERFUkVuY29kZXI7XG5cbkRFUkVuY29kZXIucHJvdG90eXBlLmVuY29kZSA9IGZ1bmN0aW9uIGVuY29kZShkYXRhLCByZXBvcnRlcikge1xuICByZXR1cm4gdGhpcy50cmVlLl9lbmNvZGUoZGF0YSwgcmVwb3J0ZXIpLmpvaW4oKTtcbn07XG5cbi8vIFRyZWUgbWV0aG9kc1xuXG5mdW5jdGlvbiBERVJOb2RlKHBhcmVudCkge1xuICBiYXNlLk5vZGUuY2FsbCh0aGlzLCAnZGVyJywgcGFyZW50KTtcbn1cbmluaGVyaXRzKERFUk5vZGUsIGJhc2UuTm9kZSk7XG5cbkRFUk5vZGUucHJvdG90eXBlLl9lbmNvZGVDb21wb3NpdGUgPSBmdW5jdGlvbiBlbmNvZGVDb21wb3NpdGUodGFnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmltaXRpdmUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNscyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudCkge1xuICB2YXIgZW5jb2RlZFRhZyA9IGVuY29kZVRhZyh0YWcsIHByaW1pdGl2ZSwgY2xzLCB0aGlzLnJlcG9ydGVyKTtcblxuICAvLyBTaG9ydCBmb3JtXG4gIGlmIChjb250ZW50Lmxlbmd0aCA8IDB4ODApIHtcbiAgICB2YXIgaGVhZGVyID0gbmV3IEJ1ZmZlcigyKTtcbiAgICBoZWFkZXJbMF0gPSBlbmNvZGVkVGFnO1xuICAgIGhlYWRlclsxXSA9IGNvbnRlbnQubGVuZ3RoO1xuICAgIHJldHVybiB0aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKFsgaGVhZGVyLCBjb250ZW50IF0pO1xuICB9XG5cbiAgLy8gTG9uZyBmb3JtXG4gIC8vIENvdW50IG9jdGV0cyByZXF1aXJlZCB0byBzdG9yZSBsZW5ndGhcbiAgdmFyIGxlbk9jdGV0cyA9IDE7XG4gIGZvciAodmFyIGkgPSBjb250ZW50Lmxlbmd0aDsgaSA+PSAweDEwMDsgaSA+Pj0gOClcbiAgICBsZW5PY3RldHMrKztcblxuICB2YXIgaGVhZGVyID0gbmV3IEJ1ZmZlcigxICsgMSArIGxlbk9jdGV0cyk7XG4gIGhlYWRlclswXSA9IGVuY29kZWRUYWc7XG4gIGhlYWRlclsxXSA9IDB4ODAgfCBsZW5PY3RldHM7XG5cbiAgZm9yICh2YXIgaSA9IDEgKyBsZW5PY3RldHMsIGogPSBjb250ZW50Lmxlbmd0aDsgaiA+IDA7IGktLSwgaiA+Pj0gOClcbiAgICBoZWFkZXJbaV0gPSBqICYgMHhmZjtcblxuICByZXR1cm4gdGhpcy5fY3JlYXRlRW5jb2RlckJ1ZmZlcihbIGhlYWRlciwgY29udGVudCBdKTtcbn07XG5cbkRFUk5vZGUucHJvdG90eXBlLl9lbmNvZGVTdHIgPSBmdW5jdGlvbiBlbmNvZGVTdHIoc3RyLCB0YWcpIHtcbiAgaWYgKHRhZyA9PT0gJ29jdHN0cicpIHtcbiAgICByZXR1cm4gdGhpcy5fY3JlYXRlRW5jb2RlckJ1ZmZlcihzdHIpO1xuICB9IGVsc2UgaWYgKHRhZyA9PT0gJ2JpdHN0cicpIHtcbiAgICByZXR1cm4gdGhpcy5fY3JlYXRlRW5jb2RlckJ1ZmZlcihbIHN0ci51bnVzZWQgfCAwLCBzdHIuZGF0YSBdKTtcbiAgfSBlbHNlIGlmICh0YWcgPT09ICdpYTVzdHInIHx8IHRhZyA9PT0gJ3V0ZjhzdHInKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NyZWF0ZUVuY29kZXJCdWZmZXIoc3RyKTtcbiAgfSBlbHNlIGlmICh0YWcgPT09ICdibXBzdHInKSB7XG4gICAgdmFyIGJ1ZiA9IG5ldyBCdWZmZXIoc3RyLmxlbmd0aCAqIDIpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7XG4gICAgICBidWYud3JpdGVVSW50MTZCRShzdHIuY2hhckNvZGVBdChpKSwgaSAqIDIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fY3JlYXRlRW5jb2RlckJ1ZmZlcihidWYpO1xuICB9IGVsc2UgaWYgKHRhZyA9PT0gJ251bXN0cicpIHtcbiAgICBpZiAoIXRoaXMuX2lzTnVtc3RyKHN0cikpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlcG9ydGVyLmVycm9yKCdFbmNvZGluZyBvZiBzdHJpbmcgdHlwZTogbnVtc3RyIHN1cHBvcnRzICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ29ubHkgZGlnaXRzIGFuZCBzcGFjZScpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKHN0cik7XG4gIH0gZWxzZSBpZiAodGFnID09PSAncHJpbnRzdHInKSB7XG4gICAgaWYgKCF0aGlzLl9pc1ByaW50c3RyKHN0cikpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlcG9ydGVyLmVycm9yKCdFbmNvZGluZyBvZiBzdHJpbmcgdHlwZTogcHJpbnRzdHIgc3VwcG9ydHMgJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnb25seSBsYXRpbiB1cHBlciBhbmQgbG93ZXIgY2FzZSBsZXR0ZXJzLCAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkaWdpdHMsIHNwYWNlLCBhcG9zdHJvcGhlLCBsZWZ0IGFuZCByaWd0aCAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwYXJlbnRoZXNpcywgcGx1cyBzaWduLCBjb21tYSwgaHlwaGVuLCAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkb3QsIHNsYXNoLCBjb2xvbiwgZXF1YWwgc2lnbiwgJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncXVlc3Rpb24gbWFyaycpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKHN0cik7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHRoaXMucmVwb3J0ZXIuZXJyb3IoJ0VuY29kaW5nIG9mIHN0cmluZyB0eXBlOiAnICsgdGFnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIHVuc3VwcG9ydGVkJyk7XG4gIH1cbn07XG5cbkRFUk5vZGUucHJvdG90eXBlLl9lbmNvZGVPYmppZCA9IGZ1bmN0aW9uIGVuY29kZU9iamlkKGlkLCB2YWx1ZXMsIHJlbGF0aXZlKSB7XG4gIGlmICh0eXBlb2YgaWQgPT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKCF2YWx1ZXMpXG4gICAgICByZXR1cm4gdGhpcy5yZXBvcnRlci5lcnJvcignc3RyaW5nIG9iamlkIGdpdmVuLCBidXQgbm8gdmFsdWVzIG1hcCBmb3VuZCcpO1xuICAgIGlmICghdmFsdWVzLmhhc093blByb3BlcnR5KGlkKSlcbiAgICAgIHJldHVybiB0aGlzLnJlcG9ydGVyLmVycm9yKCdvYmppZCBub3QgZm91bmQgaW4gdmFsdWVzIG1hcCcpO1xuICAgIGlkID0gdmFsdWVzW2lkXS5zcGxpdCgvW1xcc1xcLl0rL2cpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaWQubGVuZ3RoOyBpKyspXG4gICAgICBpZFtpXSB8PSAwO1xuICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoaWQpKSB7XG4gICAgaWQgPSBpZC5zbGljZSgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaWQubGVuZ3RoOyBpKyspXG4gICAgICBpZFtpXSB8PSAwO1xuICB9XG5cbiAgaWYgKCFBcnJheS5pc0FycmF5KGlkKSkge1xuICAgIHJldHVybiB0aGlzLnJlcG9ydGVyLmVycm9yKCdvYmppZCgpIHNob3VsZCBiZSBlaXRoZXIgYXJyYXkgb3Igc3RyaW5nLCAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZ290OiAnICsgSlNPTi5zdHJpbmdpZnkoaWQpKTtcbiAgfVxuXG4gIGlmICghcmVsYXRpdmUpIHtcbiAgICBpZiAoaWRbMV0gPj0gNDApXG4gICAgICByZXR1cm4gdGhpcy5yZXBvcnRlci5lcnJvcignU2Vjb25kIG9iamlkIGlkZW50aWZpZXIgT09CJyk7XG4gICAgaWQuc3BsaWNlKDAsIDIsIGlkWzBdICogNDAgKyBpZFsxXSk7XG4gIH1cblxuICAvLyBDb3VudCBudW1iZXIgb2Ygb2N0ZXRzXG4gIHZhciBzaXplID0gMDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBpZC5sZW5ndGg7IGkrKykge1xuICAgIHZhciBpZGVudCA9IGlkW2ldO1xuICAgIGZvciAoc2l6ZSsrOyBpZGVudCA+PSAweDgwOyBpZGVudCA+Pj0gNylcbiAgICAgIHNpemUrKztcbiAgfVxuXG4gIHZhciBvYmppZCA9IG5ldyBCdWZmZXIoc2l6ZSk7XG4gIHZhciBvZmZzZXQgPSBvYmppZC5sZW5ndGggLSAxO1xuICBmb3IgKHZhciBpID0gaWQubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICB2YXIgaWRlbnQgPSBpZFtpXTtcbiAgICBvYmppZFtvZmZzZXQtLV0gPSBpZGVudCAmIDB4N2Y7XG4gICAgd2hpbGUgKChpZGVudCA+Pj0gNykgPiAwKVxuICAgICAgb2JqaWRbb2Zmc2V0LS1dID0gMHg4MCB8IChpZGVudCAmIDB4N2YpO1xuICB9XG5cbiAgcmV0dXJuIHRoaXMuX2NyZWF0ZUVuY29kZXJCdWZmZXIob2JqaWQpO1xufTtcblxuZnVuY3Rpb24gdHdvKG51bSkge1xuICBpZiAobnVtIDwgMTApXG4gICAgcmV0dXJuICcwJyArIG51bTtcbiAgZWxzZVxuICAgIHJldHVybiBudW07XG59XG5cbkRFUk5vZGUucHJvdG90eXBlLl9lbmNvZGVUaW1lID0gZnVuY3Rpb24gZW5jb2RlVGltZSh0aW1lLCB0YWcpIHtcbiAgdmFyIHN0cjtcbiAgdmFyIGRhdGUgPSBuZXcgRGF0ZSh0aW1lKTtcblxuICBpZiAodGFnID09PSAnZ2VudGltZScpIHtcbiAgICBzdHIgPSBbXG4gICAgICB0d28oZGF0ZS5nZXRGdWxsWWVhcigpKSxcbiAgICAgIHR3byhkYXRlLmdldFVUQ01vbnRoKCkgKyAxKSxcbiAgICAgIHR3byhkYXRlLmdldFVUQ0RhdGUoKSksXG4gICAgICB0d28oZGF0ZS5nZXRVVENIb3VycygpKSxcbiAgICAgIHR3byhkYXRlLmdldFVUQ01pbnV0ZXMoKSksXG4gICAgICB0d28oZGF0ZS5nZXRVVENTZWNvbmRzKCkpLFxuICAgICAgJ1onXG4gICAgXS5qb2luKCcnKTtcbiAgfSBlbHNlIGlmICh0YWcgPT09ICd1dGN0aW1lJykge1xuICAgIHN0ciA9IFtcbiAgICAgIHR3byhkYXRlLmdldEZ1bGxZZWFyKCkgJSAxMDApLFxuICAgICAgdHdvKGRhdGUuZ2V0VVRDTW9udGgoKSArIDEpLFxuICAgICAgdHdvKGRhdGUuZ2V0VVRDRGF0ZSgpKSxcbiAgICAgIHR3byhkYXRlLmdldFVUQ0hvdXJzKCkpLFxuICAgICAgdHdvKGRhdGUuZ2V0VVRDTWludXRlcygpKSxcbiAgICAgIHR3byhkYXRlLmdldFVUQ1NlY29uZHMoKSksXG4gICAgICAnWidcbiAgICBdLmpvaW4oJycpO1xuICB9IGVsc2Uge1xuICAgIHRoaXMucmVwb3J0ZXIuZXJyb3IoJ0VuY29kaW5nICcgKyB0YWcgKyAnIHRpbWUgaXMgbm90IHN1cHBvcnRlZCB5ZXQnKTtcbiAgfVxuXG4gIHJldHVybiB0aGlzLl9lbmNvZGVTdHIoc3RyLCAnb2N0c3RyJyk7XG59O1xuXG5ERVJOb2RlLnByb3RvdHlwZS5fZW5jb2RlTnVsbCA9IGZ1bmN0aW9uIGVuY29kZU51bGwoKSB7XG4gIHJldHVybiB0aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKCcnKTtcbn07XG5cbkRFUk5vZGUucHJvdG90eXBlLl9lbmNvZGVJbnQgPSBmdW5jdGlvbiBlbmNvZGVJbnQobnVtLCB2YWx1ZXMpIHtcbiAgaWYgKHR5cGVvZiBudW0gPT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKCF2YWx1ZXMpXG4gICAgICByZXR1cm4gdGhpcy5yZXBvcnRlci5lcnJvcignU3RyaW5nIGludCBvciBlbnVtIGdpdmVuLCBidXQgbm8gdmFsdWVzIG1hcCcpO1xuICAgIGlmICghdmFsdWVzLmhhc093blByb3BlcnR5KG51bSkpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlcG9ydGVyLmVycm9yKCdWYWx1ZXMgbWFwIGRvZXNuXFwndCBjb250YWluOiAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KG51bSkpO1xuICAgIH1cbiAgICBudW0gPSB2YWx1ZXNbbnVtXTtcbiAgfVxuXG4gIC8vIEJpZ251bSwgYXNzdW1lIGJpZyBlbmRpYW5cbiAgaWYgKHR5cGVvZiBudW0gIT09ICdudW1iZXInICYmICFCdWZmZXIuaXNCdWZmZXIobnVtKSkge1xuICAgIHZhciBudW1BcnJheSA9IG51bS50b0FycmF5KCk7XG4gICAgaWYgKCFudW0uc2lnbiAmJiBudW1BcnJheVswXSAmIDB4ODApIHtcbiAgICAgIG51bUFycmF5LnVuc2hpZnQoMCk7XG4gICAgfVxuICAgIG51bSA9IG5ldyBCdWZmZXIobnVtQXJyYXkpO1xuICB9XG5cbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihudW0pKSB7XG4gICAgdmFyIHNpemUgPSBudW0ubGVuZ3RoO1xuICAgIGlmIChudW0ubGVuZ3RoID09PSAwKVxuICAgICAgc2l6ZSsrO1xuXG4gICAgdmFyIG91dCA9IG5ldyBCdWZmZXIoc2l6ZSk7XG4gICAgbnVtLmNvcHkob3V0KTtcbiAgICBpZiAobnVtLmxlbmd0aCA9PT0gMClcbiAgICAgIG91dFswXSA9IDBcbiAgICByZXR1cm4gdGhpcy5fY3JlYXRlRW5jb2RlckJ1ZmZlcihvdXQpO1xuICB9XG5cbiAgaWYgKG51bSA8IDB4ODApXG4gICAgcmV0dXJuIHRoaXMuX2NyZWF0ZUVuY29kZXJCdWZmZXIobnVtKTtcblxuICBpZiAobnVtIDwgMHgxMDApXG4gICAgcmV0dXJuIHRoaXMuX2NyZWF0ZUVuY29kZXJCdWZmZXIoWzAsIG51bV0pO1xuXG4gIHZhciBzaXplID0gMTtcbiAgZm9yICh2YXIgaSA9IG51bTsgaSA+PSAweDEwMDsgaSA+Pj0gOClcbiAgICBzaXplKys7XG5cbiAgdmFyIG91dCA9IG5ldyBBcnJheShzaXplKTtcbiAgZm9yICh2YXIgaSA9IG91dC5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIG91dFtpXSA9IG51bSAmIDB4ZmY7XG4gICAgbnVtID4+PSA4O1xuICB9XG4gIGlmKG91dFswXSAmIDB4ODApIHtcbiAgICBvdXQudW5zaGlmdCgwKTtcbiAgfVxuXG4gIHJldHVybiB0aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKG5ldyBCdWZmZXIob3V0KSk7XG59O1xuXG5ERVJOb2RlLnByb3RvdHlwZS5fZW5jb2RlQm9vbCA9IGZ1bmN0aW9uIGVuY29kZUJvb2wodmFsdWUpIHtcbiAgcmV0dXJuIHRoaXMuX2NyZWF0ZUVuY29kZXJCdWZmZXIodmFsdWUgPyAweGZmIDogMCk7XG59O1xuXG5ERVJOb2RlLnByb3RvdHlwZS5fdXNlID0gZnVuY3Rpb24gdXNlKGVudGl0eSwgb2JqKSB7XG4gIGlmICh0eXBlb2YgZW50aXR5ID09PSAnZnVuY3Rpb24nKVxuICAgIGVudGl0eSA9IGVudGl0eShvYmopO1xuICByZXR1cm4gZW50aXR5Ll9nZXRFbmNvZGVyKCdkZXInKS50cmVlO1xufTtcblxuREVSTm9kZS5wcm90b3R5cGUuX3NraXBEZWZhdWx0ID0gZnVuY3Rpb24gc2tpcERlZmF1bHQoZGF0YUJ1ZmZlciwgcmVwb3J0ZXIsIHBhcmVudCkge1xuICB2YXIgc3RhdGUgPSB0aGlzLl9iYXNlU3RhdGU7XG4gIHZhciBpO1xuICBpZiAoc3RhdGVbJ2RlZmF1bHQnXSA9PT0gbnVsbClcbiAgICByZXR1cm4gZmFsc2U7XG5cbiAgdmFyIGRhdGEgPSBkYXRhQnVmZmVyLmpvaW4oKTtcbiAgaWYgKHN0YXRlLmRlZmF1bHRCdWZmZXIgPT09IHVuZGVmaW5lZClcbiAgICBzdGF0ZS5kZWZhdWx0QnVmZmVyID0gdGhpcy5fZW5jb2RlVmFsdWUoc3RhdGVbJ2RlZmF1bHQnXSwgcmVwb3J0ZXIsIHBhcmVudCkuam9pbigpO1xuXG4gIGlmIChkYXRhLmxlbmd0aCAhPT0gc3RhdGUuZGVmYXVsdEJ1ZmZlci5sZW5ndGgpXG4gICAgcmV0dXJuIGZhbHNlO1xuXG4gIGZvciAoaT0wOyBpIDwgZGF0YS5sZW5ndGg7IGkrKylcbiAgICBpZiAoZGF0YVtpXSAhPT0gc3RhdGUuZGVmYXVsdEJ1ZmZlcltpXSlcbiAgICAgIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8vIFV0aWxpdHkgbWV0aG9kc1xuXG5mdW5jdGlvbiBlbmNvZGVUYWcodGFnLCBwcmltaXRpdmUsIGNscywgcmVwb3J0ZXIpIHtcbiAgdmFyIHJlcztcblxuICBpZiAodGFnID09PSAnc2Vxb2YnKVxuICAgIHRhZyA9ICdzZXEnO1xuICBlbHNlIGlmICh0YWcgPT09ICdzZXRvZicpXG4gICAgdGFnID0gJ3NldCc7XG5cbiAgaWYgKGRlci50YWdCeU5hbWUuaGFzT3duUHJvcGVydHkodGFnKSlcbiAgICByZXMgPSBkZXIudGFnQnlOYW1lW3RhZ107XG4gIGVsc2UgaWYgKHR5cGVvZiB0YWcgPT09ICdudW1iZXInICYmICh0YWcgfCAwKSA9PT0gdGFnKVxuICAgIHJlcyA9IHRhZztcbiAgZWxzZVxuICAgIHJldHVybiByZXBvcnRlci5lcnJvcignVW5rbm93biB0YWc6ICcgKyB0YWcpO1xuXG4gIGlmIChyZXMgPj0gMHgxZilcbiAgICByZXR1cm4gcmVwb3J0ZXIuZXJyb3IoJ011bHRpLW9jdGV0IHRhZyBlbmNvZGluZyB1bnN1cHBvcnRlZCcpO1xuXG4gIGlmICghcHJpbWl0aXZlKVxuICAgIHJlcyB8PSAweDIwO1xuXG4gIHJlcyB8PSAoZGVyLnRhZ0NsYXNzQnlOYW1lW2NscyB8fCAndW5pdmVyc2FsJ10gPDwgNik7XG5cbiAgcmV0dXJuIHJlcztcbn1cbiIsInZhciBlbmNvZGVycyA9IGV4cG9ydHM7XG5cbmVuY29kZXJzLmRlciA9IHJlcXVpcmUoJy4vZGVyJyk7XG5lbmNvZGVycy5wZW0gPSByZXF1aXJlKCcuL3BlbScpO1xuIiwidmFyIGluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcbnZhciBCdWZmZXIgPSByZXF1aXJlKCdidWZmZXInKS5CdWZmZXI7XG5cbnZhciBhc24xID0gcmVxdWlyZSgnLi4vLi4vYXNuMScpO1xudmFyIERFUkVuY29kZXIgPSByZXF1aXJlKCcuL2RlcicpO1xuXG5mdW5jdGlvbiBQRU1FbmNvZGVyKGVudGl0eSkge1xuICBERVJFbmNvZGVyLmNhbGwodGhpcywgZW50aXR5KTtcbiAgdGhpcy5lbmMgPSAncGVtJztcbn07XG5pbmhlcml0cyhQRU1FbmNvZGVyLCBERVJFbmNvZGVyKTtcbm1vZHVsZS5leHBvcnRzID0gUEVNRW5jb2RlcjtcblxuUEVNRW5jb2Rlci5wcm90b3R5cGUuZW5jb2RlID0gZnVuY3Rpb24gZW5jb2RlKGRhdGEsIG9wdGlvbnMpIHtcbiAgdmFyIGJ1ZiA9IERFUkVuY29kZXIucHJvdG90eXBlLmVuY29kZS5jYWxsKHRoaXMsIGRhdGEpO1xuXG4gIHZhciBwID0gYnVmLnRvU3RyaW5nKCdiYXNlNjQnKTtcbiAgdmFyIG91dCA9IFsgJy0tLS0tQkVHSU4gJyArIG9wdGlvbnMubGFiZWwgKyAnLS0tLS0nIF07XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcC5sZW5ndGg7IGkgKz0gNjQpXG4gICAgb3V0LnB1c2gocC5zbGljZShpLCBpICsgNjQpKTtcbiAgb3V0LnB1c2goJy0tLS0tRU5EICcgKyBvcHRpb25zLmxhYmVsICsgJy0tLS0tJyk7XG4gIHJldHVybiBvdXQuam9pbignXFxuJyk7XG59O1xuIiwiOyhmdW5jdGlvbiAoZXhwb3J0cykge1xuICAndXNlIHN0cmljdCdcblxuICB2YXIgbG9va3VwID0gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8nXG5cbiAgdmFyIEFyciA9ICh0eXBlb2YgVWludDhBcnJheSAhPT0gJ3VuZGVmaW5lZCcpXG4gICAgPyBVaW50OEFycmF5XG4gICAgOiBBcnJheVxuXG4gIHZhciBQTFVTID0gJysnLmNoYXJDb2RlQXQoMClcbiAgdmFyIFNMQVNIID0gJy8nLmNoYXJDb2RlQXQoMClcbiAgdmFyIE5VTUJFUiA9ICcwJy5jaGFyQ29kZUF0KDApXG4gIHZhciBMT1dFUiA9ICdhJy5jaGFyQ29kZUF0KDApXG4gIHZhciBVUFBFUiA9ICdBJy5jaGFyQ29kZUF0KDApXG4gIHZhciBQTFVTX1VSTF9TQUZFID0gJy0nLmNoYXJDb2RlQXQoMClcbiAgdmFyIFNMQVNIX1VSTF9TQUZFID0gJ18nLmNoYXJDb2RlQXQoMClcblxuICBmdW5jdGlvbiBkZWNvZGUgKGVsdCkge1xuICAgIHZhciBjb2RlID0gZWx0LmNoYXJDb2RlQXQoMClcbiAgICBpZiAoY29kZSA9PT0gUExVUyB8fCBjb2RlID09PSBQTFVTX1VSTF9TQUZFKSByZXR1cm4gNjIgLy8gJysnXG4gICAgaWYgKGNvZGUgPT09IFNMQVNIIHx8IGNvZGUgPT09IFNMQVNIX1VSTF9TQUZFKSByZXR1cm4gNjMgLy8gJy8nXG4gICAgaWYgKGNvZGUgPCBOVU1CRVIpIHJldHVybiAtMSAvLyBubyBtYXRjaFxuICAgIGlmIChjb2RlIDwgTlVNQkVSICsgMTApIHJldHVybiBjb2RlIC0gTlVNQkVSICsgMjYgKyAyNlxuICAgIGlmIChjb2RlIDwgVVBQRVIgKyAyNikgcmV0dXJuIGNvZGUgLSBVUFBFUlxuICAgIGlmIChjb2RlIDwgTE9XRVIgKyAyNikgcmV0dXJuIGNvZGUgLSBMT1dFUiArIDI2XG4gIH1cblxuICBmdW5jdGlvbiBiNjRUb0J5dGVBcnJheSAoYjY0KSB7XG4gICAgdmFyIGksIGosIGwsIHRtcCwgcGxhY2VIb2xkZXJzLCBhcnJcblxuICAgIGlmIChiNjQubGVuZ3RoICUgNCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBzdHJpbmcuIExlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCcpXG4gICAgfVxuXG4gICAgLy8gdGhlIG51bWJlciBvZiBlcXVhbCBzaWducyAocGxhY2UgaG9sZGVycylcbiAgICAvLyBpZiB0aGVyZSBhcmUgdHdvIHBsYWNlaG9sZGVycywgdGhhbiB0aGUgdHdvIGNoYXJhY3RlcnMgYmVmb3JlIGl0XG4gICAgLy8gcmVwcmVzZW50IG9uZSBieXRlXG4gICAgLy8gaWYgdGhlcmUgaXMgb25seSBvbmUsIHRoZW4gdGhlIHRocmVlIGNoYXJhY3RlcnMgYmVmb3JlIGl0IHJlcHJlc2VudCAyIGJ5dGVzXG4gICAgLy8gdGhpcyBpcyBqdXN0IGEgY2hlYXAgaGFjayB0byBub3QgZG8gaW5kZXhPZiB0d2ljZVxuICAgIHZhciBsZW4gPSBiNjQubGVuZ3RoXG4gICAgcGxhY2VIb2xkZXJzID0gYjY0LmNoYXJBdChsZW4gLSAyKSA9PT0gJz0nID8gMiA6IGI2NC5jaGFyQXQobGVuIC0gMSkgPT09ICc9JyA/IDEgOiAwXG5cbiAgICAvLyBiYXNlNjQgaXMgNC8zICsgdXAgdG8gdHdvIGNoYXJhY3RlcnMgb2YgdGhlIG9yaWdpbmFsIGRhdGFcbiAgICBhcnIgPSBuZXcgQXJyKGI2NC5sZW5ndGggKiAzIC8gNCAtIHBsYWNlSG9sZGVycylcblxuICAgIC8vIGlmIHRoZXJlIGFyZSBwbGFjZWhvbGRlcnMsIG9ubHkgZ2V0IHVwIHRvIHRoZSBsYXN0IGNvbXBsZXRlIDQgY2hhcnNcbiAgICBsID0gcGxhY2VIb2xkZXJzID4gMCA/IGI2NC5sZW5ndGggLSA0IDogYjY0Lmxlbmd0aFxuXG4gICAgdmFyIEwgPSAwXG5cbiAgICBmdW5jdGlvbiBwdXNoICh2KSB7XG4gICAgICBhcnJbTCsrXSA9IHZcbiAgICB9XG5cbiAgICBmb3IgKGkgPSAwLCBqID0gMDsgaSA8IGw7IGkgKz0gNCwgaiArPSAzKSB7XG4gICAgICB0bXAgPSAoZGVjb2RlKGI2NC5jaGFyQXQoaSkpIDw8IDE4KSB8IChkZWNvZGUoYjY0LmNoYXJBdChpICsgMSkpIDw8IDEyKSB8IChkZWNvZGUoYjY0LmNoYXJBdChpICsgMikpIDw8IDYpIHwgZGVjb2RlKGI2NC5jaGFyQXQoaSArIDMpKVxuICAgICAgcHVzaCgodG1wICYgMHhGRjAwMDApID4+IDE2KVxuICAgICAgcHVzaCgodG1wICYgMHhGRjAwKSA+PiA4KVxuICAgICAgcHVzaCh0bXAgJiAweEZGKVxuICAgIH1cblxuICAgIGlmIChwbGFjZUhvbGRlcnMgPT09IDIpIHtcbiAgICAgIHRtcCA9IChkZWNvZGUoYjY0LmNoYXJBdChpKSkgPDwgMikgfCAoZGVjb2RlKGI2NC5jaGFyQXQoaSArIDEpKSA+PiA0KVxuICAgICAgcHVzaCh0bXAgJiAweEZGKVxuICAgIH0gZWxzZSBpZiAocGxhY2VIb2xkZXJzID09PSAxKSB7XG4gICAgICB0bXAgPSAoZGVjb2RlKGI2NC5jaGFyQXQoaSkpIDw8IDEwKSB8IChkZWNvZGUoYjY0LmNoYXJBdChpICsgMSkpIDw8IDQpIHwgKGRlY29kZShiNjQuY2hhckF0KGkgKyAyKSkgPj4gMilcbiAgICAgIHB1c2goKHRtcCA+PiA4KSAmIDB4RkYpXG4gICAgICBwdXNoKHRtcCAmIDB4RkYpXG4gICAgfVxuXG4gICAgcmV0dXJuIGFyclxuICB9XG5cbiAgZnVuY3Rpb24gdWludDhUb0Jhc2U2NCAodWludDgpIHtcbiAgICB2YXIgaVxuICAgIHZhciBleHRyYUJ5dGVzID0gdWludDgubGVuZ3RoICUgMyAvLyBpZiB3ZSBoYXZlIDEgYnl0ZSBsZWZ0LCBwYWQgMiBieXRlc1xuICAgIHZhciBvdXRwdXQgPSAnJ1xuICAgIHZhciB0ZW1wLCBsZW5ndGhcblxuICAgIGZ1bmN0aW9uIGVuY29kZSAobnVtKSB7XG4gICAgICByZXR1cm4gbG9va3VwLmNoYXJBdChudW0pXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdHJpcGxldFRvQmFzZTY0IChudW0pIHtcbiAgICAgIHJldHVybiBlbmNvZGUobnVtID4+IDE4ICYgMHgzRikgKyBlbmNvZGUobnVtID4+IDEyICYgMHgzRikgKyBlbmNvZGUobnVtID4+IDYgJiAweDNGKSArIGVuY29kZShudW0gJiAweDNGKVxuICAgIH1cblxuICAgIC8vIGdvIHRocm91Z2ggdGhlIGFycmF5IGV2ZXJ5IHRocmVlIGJ5dGVzLCB3ZSdsbCBkZWFsIHdpdGggdHJhaWxpbmcgc3R1ZmYgbGF0ZXJcbiAgICBmb3IgKGkgPSAwLCBsZW5ndGggPSB1aW50OC5sZW5ndGggLSBleHRyYUJ5dGVzOyBpIDwgbGVuZ3RoOyBpICs9IDMpIHtcbiAgICAgIHRlbXAgPSAodWludDhbaV0gPDwgMTYpICsgKHVpbnQ4W2kgKyAxXSA8PCA4KSArICh1aW50OFtpICsgMl0pXG4gICAgICBvdXRwdXQgKz0gdHJpcGxldFRvQmFzZTY0KHRlbXApXG4gICAgfVxuXG4gICAgLy8gcGFkIHRoZSBlbmQgd2l0aCB6ZXJvcywgYnV0IG1ha2Ugc3VyZSB0byBub3QgZm9yZ2V0IHRoZSBleHRyYSBieXRlc1xuICAgIHN3aXRjaCAoZXh0cmFCeXRlcykge1xuICAgICAgY2FzZSAxOlxuICAgICAgICB0ZW1wID0gdWludDhbdWludDgubGVuZ3RoIC0gMV1cbiAgICAgICAgb3V0cHV0ICs9IGVuY29kZSh0ZW1wID4+IDIpXG4gICAgICAgIG91dHB1dCArPSBlbmNvZGUoKHRlbXAgPDwgNCkgJiAweDNGKVxuICAgICAgICBvdXRwdXQgKz0gJz09J1xuICAgICAgICBicmVha1xuICAgICAgY2FzZSAyOlxuICAgICAgICB0ZW1wID0gKHVpbnQ4W3VpbnQ4Lmxlbmd0aCAtIDJdIDw8IDgpICsgKHVpbnQ4W3VpbnQ4Lmxlbmd0aCAtIDFdKVxuICAgICAgICBvdXRwdXQgKz0gZW5jb2RlKHRlbXAgPj4gMTApXG4gICAgICAgIG91dHB1dCArPSBlbmNvZGUoKHRlbXAgPj4gNCkgJiAweDNGKVxuICAgICAgICBvdXRwdXQgKz0gZW5jb2RlKCh0ZW1wIDw8IDIpICYgMHgzRilcbiAgICAgICAgb3V0cHV0ICs9ICc9J1xuICAgICAgICBicmVha1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWtcbiAgICB9XG5cbiAgICByZXR1cm4gb3V0cHV0XG4gIH1cblxuICBleHBvcnRzLnRvQnl0ZUFycmF5ID0gYjY0VG9CeXRlQXJyYXlcbiAgZXhwb3J0cy5mcm9tQnl0ZUFycmF5ID0gdWludDhUb0Jhc2U2NFxufSh0eXBlb2YgZXhwb3J0cyA9PT0gJ3VuZGVmaW5lZCcgPyAodGhpcy5iYXNlNjRqcyA9IHt9KSA6IGV4cG9ydHMpKVxuIiwiKGZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIC8vIFV0aWxzXG4gIGZ1bmN0aW9uIGFzc2VydCAodmFsLCBtc2cpIHtcbiAgICBpZiAoIXZhbCkgdGhyb3cgbmV3IEVycm9yKG1zZyB8fCAnQXNzZXJ0aW9uIGZhaWxlZCcpO1xuICB9XG5cbiAgLy8gQ291bGQgdXNlIGBpbmhlcml0c2AgbW9kdWxlLCBidXQgZG9uJ3Qgd2FudCB0byBtb3ZlIGZyb20gc2luZ2xlIGZpbGVcbiAgLy8gYXJjaGl0ZWN0dXJlIHlldC5cbiAgZnVuY3Rpb24gaW5oZXJpdHMgKGN0b3IsIHN1cGVyQ3Rvcikge1xuICAgIGN0b3Iuc3VwZXJfID0gc3VwZXJDdG9yO1xuICAgIHZhciBUZW1wQ3RvciA9IGZ1bmN0aW9uICgpIHt9O1xuICAgIFRlbXBDdG9yLnByb3RvdHlwZSA9IHN1cGVyQ3Rvci5wcm90b3R5cGU7XG4gICAgY3Rvci5wcm90b3R5cGUgPSBuZXcgVGVtcEN0b3IoKTtcbiAgICBjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGN0b3I7XG4gIH1cblxuICAvLyBCTlxuXG4gIGZ1bmN0aW9uIEJOIChudW1iZXIsIGJhc2UsIGVuZGlhbikge1xuICAgIC8vIE1heSBiZSBgbmV3IEJOKGJuKWAgP1xuICAgIGlmIChudW1iZXIgIT09IG51bGwgJiZcbiAgICAgIHR5cGVvZiBudW1iZXIgPT09ICdvYmplY3QnICYmXG4gICAgICBBcnJheS5pc0FycmF5KG51bWJlci53b3JkcykpIHtcbiAgICAgIHJldHVybiBudW1iZXI7XG4gICAgfVxuXG4gICAgdGhpcy5uZWdhdGl2ZSA9IDA7XG4gICAgdGhpcy53b3JkcyA9IG51bGw7XG4gICAgdGhpcy5sZW5ndGggPSAwO1xuXG4gICAgLy8gUmVkdWN0aW9uIGNvbnRleHRcbiAgICB0aGlzLnJlZCA9IG51bGw7XG5cbiAgICBpZiAobnVtYmVyICE9PSBudWxsKSB7XG4gICAgICBpZiAoYmFzZSA9PT0gJ2xlJyB8fCBiYXNlID09PSAnYmUnKSB7XG4gICAgICAgIGVuZGlhbiA9IGJhc2U7XG4gICAgICAgIGJhc2UgPSAxMDtcbiAgICAgIH1cblxuICAgICAgdGhpcy5faW5pdChudW1iZXIgfHwgMCwgYmFzZSB8fCAxMCwgZW5kaWFuIHx8ICdiZScpO1xuICAgIH1cbiAgfVxuICBpZiAodHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IEJOO1xuICB9IGVsc2Uge1xuICAgIGV4cG9ydHMuQk4gPSBCTjtcbiAgfVxuXG4gIEJOLkJOID0gQk47XG4gIEJOLndvcmRTaXplID0gMjY7XG5cbiAgdmFyIEJ1ZmZlcjtcbiAgdHJ5IHtcbiAgICBCdWZmZXIgPSByZXF1aXJlKCdidWYnICsgJ2ZlcicpLkJ1ZmZlcjtcbiAgfSBjYXRjaCAoZSkge1xuICB9XG5cbiAgQk4ubWF4ID0gZnVuY3Rpb24gbWF4IChsZWZ0LCByaWdodCkge1xuICAgIGlmIChsZWZ0LmNtcChyaWdodCkgPiAwKSByZXR1cm4gbGVmdDtcbiAgICByZXR1cm4gcmlnaHQ7XG4gIH07XG5cbiAgQk4ubWluID0gZnVuY3Rpb24gbWluIChsZWZ0LCByaWdodCkge1xuICAgIGlmIChsZWZ0LmNtcChyaWdodCkgPCAwKSByZXR1cm4gbGVmdDtcbiAgICByZXR1cm4gcmlnaHQ7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLl9pbml0ID0gZnVuY3Rpb24gaW5pdCAobnVtYmVyLCBiYXNlLCBlbmRpYW4pIHtcbiAgICBpZiAodHlwZW9mIG51bWJlciA9PT0gJ251bWJlcicpIHtcbiAgICAgIHJldHVybiB0aGlzLl9pbml0TnVtYmVyKG51bWJlciwgYmFzZSwgZW5kaWFuKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG51bWJlciA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHJldHVybiB0aGlzLl9pbml0QXJyYXkobnVtYmVyLCBiYXNlLCBlbmRpYW4pO1xuICAgIH1cblxuICAgIGlmIChiYXNlID09PSAnaGV4Jykge1xuICAgICAgYmFzZSA9IDE2O1xuICAgIH1cbiAgICBhc3NlcnQoYmFzZSA9PT0gKGJhc2UgfCAwKSAmJiBiYXNlID49IDIgJiYgYmFzZSA8PSAzNik7XG5cbiAgICBudW1iZXIgPSBudW1iZXIudG9TdHJpbmcoKS5yZXBsYWNlKC9cXHMrL2csICcnKTtcbiAgICB2YXIgc3RhcnQgPSAwO1xuICAgIGlmIChudW1iZXJbMF0gPT09ICctJykge1xuICAgICAgc3RhcnQrKztcbiAgICB9XG5cbiAgICBpZiAoYmFzZSA9PT0gMTYpIHtcbiAgICAgIHRoaXMuX3BhcnNlSGV4KG51bWJlciwgc3RhcnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9wYXJzZUJhc2UobnVtYmVyLCBiYXNlLCBzdGFydCk7XG4gICAgfVxuXG4gICAgaWYgKG51bWJlclswXSA9PT0gJy0nKSB7XG4gICAgICB0aGlzLm5lZ2F0aXZlID0gMTtcbiAgICB9XG5cbiAgICB0aGlzLnN0cmlwKCk7XG5cbiAgICBpZiAoZW5kaWFuICE9PSAnbGUnKSByZXR1cm47XG5cbiAgICB0aGlzLl9pbml0QXJyYXkodGhpcy50b0FycmF5KCksIGJhc2UsIGVuZGlhbik7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLl9pbml0TnVtYmVyID0gZnVuY3Rpb24gX2luaXROdW1iZXIgKG51bWJlciwgYmFzZSwgZW5kaWFuKSB7XG4gICAgaWYgKG51bWJlciA8IDApIHtcbiAgICAgIHRoaXMubmVnYXRpdmUgPSAxO1xuICAgICAgbnVtYmVyID0gLW51bWJlcjtcbiAgICB9XG4gICAgaWYgKG51bWJlciA8IDB4NDAwMDAwMCkge1xuICAgICAgdGhpcy53b3JkcyA9IFsgbnVtYmVyICYgMHgzZmZmZmZmIF07XG4gICAgICB0aGlzLmxlbmd0aCA9IDE7XG4gICAgfSBlbHNlIGlmIChudW1iZXIgPCAweDEwMDAwMDAwMDAwMDAwKSB7XG4gICAgICB0aGlzLndvcmRzID0gW1xuICAgICAgICBudW1iZXIgJiAweDNmZmZmZmYsXG4gICAgICAgIChudW1iZXIgLyAweDQwMDAwMDApICYgMHgzZmZmZmZmXG4gICAgICBdO1xuICAgICAgdGhpcy5sZW5ndGggPSAyO1xuICAgIH0gZWxzZSB7XG4gICAgICBhc3NlcnQobnVtYmVyIDwgMHgyMDAwMDAwMDAwMDAwMCk7IC8vIDIgXiA1MyAodW5zYWZlKVxuICAgICAgdGhpcy53b3JkcyA9IFtcbiAgICAgICAgbnVtYmVyICYgMHgzZmZmZmZmLFxuICAgICAgICAobnVtYmVyIC8gMHg0MDAwMDAwKSAmIDB4M2ZmZmZmZixcbiAgICAgICAgMVxuICAgICAgXTtcbiAgICAgIHRoaXMubGVuZ3RoID0gMztcbiAgICB9XG5cbiAgICBpZiAoZW5kaWFuICE9PSAnbGUnKSByZXR1cm47XG5cbiAgICAvLyBSZXZlcnNlIHRoZSBieXRlc1xuICAgIHRoaXMuX2luaXRBcnJheSh0aGlzLnRvQXJyYXkoKSwgYmFzZSwgZW5kaWFuKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuX2luaXRBcnJheSA9IGZ1bmN0aW9uIF9pbml0QXJyYXkgKG51bWJlciwgYmFzZSwgZW5kaWFuKSB7XG4gICAgLy8gUGVyaGFwcyBhIFVpbnQ4QXJyYXlcbiAgICBhc3NlcnQodHlwZW9mIG51bWJlci5sZW5ndGggPT09ICdudW1iZXInKTtcbiAgICBpZiAobnVtYmVyLmxlbmd0aCA8PSAwKSB7XG4gICAgICB0aGlzLndvcmRzID0gWyAwIF07XG4gICAgICB0aGlzLmxlbmd0aCA9IDE7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICB0aGlzLmxlbmd0aCA9IE1hdGguY2VpbChudW1iZXIubGVuZ3RoIC8gMyk7XG4gICAgdGhpcy53b3JkcyA9IG5ldyBBcnJheSh0aGlzLmxlbmd0aCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLndvcmRzW2ldID0gMDtcbiAgICB9XG5cbiAgICB2YXIgaiwgdztcbiAgICB2YXIgb2ZmID0gMDtcbiAgICBpZiAoZW5kaWFuID09PSAnYmUnKSB7XG4gICAgICBmb3IgKGkgPSBudW1iZXIubGVuZ3RoIC0gMSwgaiA9IDA7IGkgPj0gMDsgaSAtPSAzKSB7XG4gICAgICAgIHcgPSBudW1iZXJbaV0gfCAobnVtYmVyW2kgLSAxXSA8PCA4KSB8IChudW1iZXJbaSAtIDJdIDw8IDE2KTtcbiAgICAgICAgdGhpcy53b3Jkc1tqXSB8PSAodyA8PCBvZmYpICYgMHgzZmZmZmZmO1xuICAgICAgICB0aGlzLndvcmRzW2ogKyAxXSA9ICh3ID4+PiAoMjYgLSBvZmYpKSAmIDB4M2ZmZmZmZjtcbiAgICAgICAgb2ZmICs9IDI0O1xuICAgICAgICBpZiAob2ZmID49IDI2KSB7XG4gICAgICAgICAgb2ZmIC09IDI2O1xuICAgICAgICAgIGorKztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZW5kaWFuID09PSAnbGUnKSB7XG4gICAgICBmb3IgKGkgPSAwLCBqID0gMDsgaSA8IG51bWJlci5sZW5ndGg7IGkgKz0gMykge1xuICAgICAgICB3ID0gbnVtYmVyW2ldIHwgKG51bWJlcltpICsgMV0gPDwgOCkgfCAobnVtYmVyW2kgKyAyXSA8PCAxNik7XG4gICAgICAgIHRoaXMud29yZHNbal0gfD0gKHcgPDwgb2ZmKSAmIDB4M2ZmZmZmZjtcbiAgICAgICAgdGhpcy53b3Jkc1tqICsgMV0gPSAodyA+Pj4gKDI2IC0gb2ZmKSkgJiAweDNmZmZmZmY7XG4gICAgICAgIG9mZiArPSAyNDtcbiAgICAgICAgaWYgKG9mZiA+PSAyNikge1xuICAgICAgICAgIG9mZiAtPSAyNjtcbiAgICAgICAgICBqKys7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc3RyaXAoKTtcbiAgfTtcblxuICBmdW5jdGlvbiBwYXJzZUhleCAoc3RyLCBzdGFydCwgZW5kKSB7XG4gICAgdmFyIHIgPSAwO1xuICAgIHZhciBsZW4gPSBNYXRoLm1pbihzdHIubGVuZ3RoLCBlbmQpO1xuICAgIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICB2YXIgYyA9IHN0ci5jaGFyQ29kZUF0KGkpIC0gNDg7XG5cbiAgICAgIHIgPDw9IDQ7XG5cbiAgICAgIC8vICdhJyAtICdmJ1xuICAgICAgaWYgKGMgPj0gNDkgJiYgYyA8PSA1NCkge1xuICAgICAgICByIHw9IGMgLSA0OSArIDB4YTtcblxuICAgICAgLy8gJ0EnIC0gJ0YnXG4gICAgICB9IGVsc2UgaWYgKGMgPj0gMTcgJiYgYyA8PSAyMikge1xuICAgICAgICByIHw9IGMgLSAxNyArIDB4YTtcblxuICAgICAgLy8gJzAnIC0gJzknXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByIHw9IGMgJiAweGY7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByO1xuICB9XG5cbiAgQk4ucHJvdG90eXBlLl9wYXJzZUhleCA9IGZ1bmN0aW9uIF9wYXJzZUhleCAobnVtYmVyLCBzdGFydCkge1xuICAgIC8vIENyZWF0ZSBwb3NzaWJseSBiaWdnZXIgYXJyYXkgdG8gZW5zdXJlIHRoYXQgaXQgZml0cyB0aGUgbnVtYmVyXG4gICAgdGhpcy5sZW5ndGggPSBNYXRoLmNlaWwoKG51bWJlci5sZW5ndGggLSBzdGFydCkgLyA2KTtcbiAgICB0aGlzLndvcmRzID0gbmV3IEFycmF5KHRoaXMubGVuZ3RoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMud29yZHNbaV0gPSAwO1xuICAgIH1cblxuICAgIHZhciBqLCB3O1xuICAgIC8vIFNjYW4gMjQtYml0IGNodW5rcyBhbmQgYWRkIHRoZW0gdG8gdGhlIG51bWJlclxuICAgIHZhciBvZmYgPSAwO1xuICAgIGZvciAoaSA9IG51bWJlci5sZW5ndGggLSA2LCBqID0gMDsgaSA+PSBzdGFydDsgaSAtPSA2KSB7XG4gICAgICB3ID0gcGFyc2VIZXgobnVtYmVyLCBpLCBpICsgNik7XG4gICAgICB0aGlzLndvcmRzW2pdIHw9ICh3IDw8IG9mZikgJiAweDNmZmZmZmY7XG4gICAgICB0aGlzLndvcmRzW2ogKyAxXSB8PSB3ID4+PiAoMjYgLSBvZmYpICYgMHgzZmZmZmY7XG4gICAgICBvZmYgKz0gMjQ7XG4gICAgICBpZiAob2ZmID49IDI2KSB7XG4gICAgICAgIG9mZiAtPSAyNjtcbiAgICAgICAgaisrO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaSArIDYgIT09IHN0YXJ0KSB7XG4gICAgICB3ID0gcGFyc2VIZXgobnVtYmVyLCBzdGFydCwgaSArIDYpO1xuICAgICAgdGhpcy53b3Jkc1tqXSB8PSAodyA8PCBvZmYpICYgMHgzZmZmZmZmO1xuICAgICAgdGhpcy53b3Jkc1tqICsgMV0gfD0gdyA+Pj4gKDI2IC0gb2ZmKSAmIDB4M2ZmZmZmO1xuICAgIH1cbiAgICB0aGlzLnN0cmlwKCk7XG4gIH07XG5cbiAgZnVuY3Rpb24gcGFyc2VCYXNlIChzdHIsIHN0YXJ0LCBlbmQsIG11bCkge1xuICAgIHZhciByID0gMDtcbiAgICB2YXIgbGVuID0gTWF0aC5taW4oc3RyLmxlbmd0aCwgZW5kKTtcbiAgICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBsZW47IGkrKykge1xuICAgICAgdmFyIGMgPSBzdHIuY2hhckNvZGVBdChpKSAtIDQ4O1xuXG4gICAgICByICo9IG11bDtcblxuICAgICAgLy8gJ2EnXG4gICAgICBpZiAoYyA+PSA0OSkge1xuICAgICAgICByICs9IGMgLSA0OSArIDB4YTtcblxuICAgICAgLy8gJ0EnXG4gICAgICB9IGVsc2UgaWYgKGMgPj0gMTcpIHtcbiAgICAgICAgciArPSBjIC0gMTcgKyAweGE7XG5cbiAgICAgIC8vICcwJyAtICc5J1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgciArPSBjO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcjtcbiAgfVxuXG4gIEJOLnByb3RvdHlwZS5fcGFyc2VCYXNlID0gZnVuY3Rpb24gX3BhcnNlQmFzZSAobnVtYmVyLCBiYXNlLCBzdGFydCkge1xuICAgIC8vIEluaXRpYWxpemUgYXMgemVyb1xuICAgIHRoaXMud29yZHMgPSBbIDAgXTtcbiAgICB0aGlzLmxlbmd0aCA9IDE7XG5cbiAgICAvLyBGaW5kIGxlbmd0aCBvZiBsaW1iIGluIGJhc2VcbiAgICBmb3IgKHZhciBsaW1iTGVuID0gMCwgbGltYlBvdyA9IDE7IGxpbWJQb3cgPD0gMHgzZmZmZmZmOyBsaW1iUG93ICo9IGJhc2UpIHtcbiAgICAgIGxpbWJMZW4rKztcbiAgICB9XG4gICAgbGltYkxlbi0tO1xuICAgIGxpbWJQb3cgPSAobGltYlBvdyAvIGJhc2UpIHwgMDtcblxuICAgIHZhciB0b3RhbCA9IG51bWJlci5sZW5ndGggLSBzdGFydDtcbiAgICB2YXIgbW9kID0gdG90YWwgJSBsaW1iTGVuO1xuICAgIHZhciBlbmQgPSBNYXRoLm1pbih0b3RhbCwgdG90YWwgLSBtb2QpICsgc3RhcnQ7XG5cbiAgICB2YXIgd29yZCA9IDA7XG4gICAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpICs9IGxpbWJMZW4pIHtcbiAgICAgIHdvcmQgPSBwYXJzZUJhc2UobnVtYmVyLCBpLCBpICsgbGltYkxlbiwgYmFzZSk7XG5cbiAgICAgIHRoaXMuaW11bG4obGltYlBvdyk7XG4gICAgICBpZiAodGhpcy53b3Jkc1swXSArIHdvcmQgPCAweDQwMDAwMDApIHtcbiAgICAgICAgdGhpcy53b3Jkc1swXSArPSB3b3JkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5faWFkZG4od29yZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG1vZCAhPT0gMCkge1xuICAgICAgdmFyIHBvdyA9IDE7XG4gICAgICB3b3JkID0gcGFyc2VCYXNlKG51bWJlciwgaSwgbnVtYmVyLmxlbmd0aCwgYmFzZSk7XG5cbiAgICAgIGZvciAoaSA9IDA7IGkgPCBtb2Q7IGkrKykge1xuICAgICAgICBwb3cgKj0gYmFzZTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5pbXVsbihwb3cpO1xuICAgICAgaWYgKHRoaXMud29yZHNbMF0gKyB3b3JkIDwgMHg0MDAwMDAwKSB7XG4gICAgICAgIHRoaXMud29yZHNbMF0gKz0gd29yZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2lhZGRuKHdvcmQpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBCTi5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uIGNvcHkgKGRlc3QpIHtcbiAgICBkZXN0LndvcmRzID0gbmV3IEFycmF5KHRoaXMubGVuZ3RoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGRlc3Qud29yZHNbaV0gPSB0aGlzLndvcmRzW2ldO1xuICAgIH1cbiAgICBkZXN0Lmxlbmd0aCA9IHRoaXMubGVuZ3RoO1xuICAgIGRlc3QubmVnYXRpdmUgPSB0aGlzLm5lZ2F0aXZlO1xuICAgIGRlc3QucmVkID0gdGhpcy5yZWQ7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gY2xvbmUgKCkge1xuICAgIHZhciByID0gbmV3IEJOKG51bGwpO1xuICAgIHRoaXMuY29weShyKTtcbiAgICByZXR1cm4gcjtcbiAgfTtcblxuICAvLyBSZW1vdmUgbGVhZGluZyBgMGAgZnJvbSBgdGhpc2BcbiAgQk4ucHJvdG90eXBlLnN0cmlwID0gZnVuY3Rpb24gc3RyaXAgKCkge1xuICAgIHdoaWxlICh0aGlzLmxlbmd0aCA+IDEgJiYgdGhpcy53b3Jkc1t0aGlzLmxlbmd0aCAtIDFdID09PSAwKSB7XG4gICAgICB0aGlzLmxlbmd0aC0tO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fbm9ybVNpZ24oKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuX25vcm1TaWduID0gZnVuY3Rpb24gX25vcm1TaWduICgpIHtcbiAgICAvLyAtMCA9IDBcbiAgICBpZiAodGhpcy5sZW5ndGggPT09IDEgJiYgdGhpcy53b3Jkc1swXSA9PT0gMCkge1xuICAgICAgdGhpcy5uZWdhdGl2ZSA9IDA7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5pbnNwZWN0ID0gZnVuY3Rpb24gaW5zcGVjdCAoKSB7XG4gICAgcmV0dXJuICh0aGlzLnJlZCA/ICc8Qk4tUjogJyA6ICc8Qk46ICcpICsgdGhpcy50b1N0cmluZygxNikgKyAnPic7XG4gIH07XG5cbiAgLypcblxuICB2YXIgemVyb3MgPSBbXTtcbiAgdmFyIGdyb3VwU2l6ZXMgPSBbXTtcbiAgdmFyIGdyb3VwQmFzZXMgPSBbXTtcblxuICB2YXIgcyA9ICcnO1xuICB2YXIgaSA9IC0xO1xuICB3aGlsZSAoKytpIDwgQk4ud29yZFNpemUpIHtcbiAgICB6ZXJvc1tpXSA9IHM7XG4gICAgcyArPSAnMCc7XG4gIH1cbiAgZ3JvdXBTaXplc1swXSA9IDA7XG4gIGdyb3VwU2l6ZXNbMV0gPSAwO1xuICBncm91cEJhc2VzWzBdID0gMDtcbiAgZ3JvdXBCYXNlc1sxXSA9IDA7XG4gIHZhciBiYXNlID0gMiAtIDE7XG4gIHdoaWxlICgrK2Jhc2UgPCAzNiArIDEpIHtcbiAgICB2YXIgZ3JvdXBTaXplID0gMDtcbiAgICB2YXIgZ3JvdXBCYXNlID0gMTtcbiAgICB3aGlsZSAoZ3JvdXBCYXNlIDwgKDEgPDwgQk4ud29yZFNpemUpIC8gYmFzZSkge1xuICAgICAgZ3JvdXBCYXNlICo9IGJhc2U7XG4gICAgICBncm91cFNpemUgKz0gMTtcbiAgICB9XG4gICAgZ3JvdXBTaXplc1tiYXNlXSA9IGdyb3VwU2l6ZTtcbiAgICBncm91cEJhc2VzW2Jhc2VdID0gZ3JvdXBCYXNlO1xuICB9XG5cbiAgKi9cblxuICB2YXIgemVyb3MgPSBbXG4gICAgJycsXG4gICAgJzAnLFxuICAgICcwMCcsXG4gICAgJzAwMCcsXG4gICAgJzAwMDAnLFxuICAgICcwMDAwMCcsXG4gICAgJzAwMDAwMCcsXG4gICAgJzAwMDAwMDAnLFxuICAgICcwMDAwMDAwMCcsXG4gICAgJzAwMDAwMDAwMCcsXG4gICAgJzAwMDAwMDAwMDAnLFxuICAgICcwMDAwMDAwMDAwMCcsXG4gICAgJzAwMDAwMDAwMDAwMCcsXG4gICAgJzAwMDAwMDAwMDAwMDAnLFxuICAgICcwMDAwMDAwMDAwMDAwMCcsXG4gICAgJzAwMDAwMDAwMDAwMDAwMCcsXG4gICAgJzAwMDAwMDAwMDAwMDAwMDAnLFxuICAgICcwMDAwMDAwMDAwMDAwMDAwMCcsXG4gICAgJzAwMDAwMDAwMDAwMDAwMDAwMCcsXG4gICAgJzAwMDAwMDAwMDAwMDAwMDAwMDAnLFxuICAgICcwMDAwMDAwMDAwMDAwMDAwMDAwMCcsXG4gICAgJzAwMDAwMDAwMDAwMDAwMDAwMDAwMCcsXG4gICAgJzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnLFxuICAgICcwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCcsXG4gICAgJzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCcsXG4gICAgJzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnXG4gIF07XG5cbiAgdmFyIGdyb3VwU2l6ZXMgPSBbXG4gICAgMCwgMCxcbiAgICAyNSwgMTYsIDEyLCAxMSwgMTAsIDksIDgsXG4gICAgOCwgNywgNywgNywgNywgNiwgNixcbiAgICA2LCA2LCA2LCA2LCA2LCA1LCA1LFxuICAgIDUsIDUsIDUsIDUsIDUsIDUsIDUsXG4gICAgNSwgNSwgNSwgNSwgNSwgNSwgNVxuICBdO1xuXG4gIHZhciBncm91cEJhc2VzID0gW1xuICAgIDAsIDAsXG4gICAgMzM1NTQ0MzIsIDQzMDQ2NzIxLCAxNjc3NzIxNiwgNDg4MjgxMjUsIDYwNDY2MTc2LCA0MDM1MzYwNywgMTY3NzcyMTYsXG4gICAgNDMwNDY3MjEsIDEwMDAwMDAwLCAxOTQ4NzE3MSwgMzU4MzE4MDgsIDYyNzQ4NTE3LCA3NTI5NTM2LCAxMTM5MDYyNSxcbiAgICAxNjc3NzIxNiwgMjQxMzc1NjksIDM0MDEyMjI0LCA0NzA0NTg4MSwgNjQwMDAwMDAsIDQwODQxMDEsIDUxNTM2MzIsXG4gICAgNjQzNjM0MywgNzk2MjYyNCwgOTc2NTYyNSwgMTE4ODEzNzYsIDE0MzQ4OTA3LCAxNzIxMDM2OCwgMjA1MTExNDksXG4gICAgMjQzMDAwMDAsIDI4NjI5MTUxLCAzMzU1NDQzMiwgMzkxMzUzOTMsIDQ1NDM1NDI0LCA1MjUyMTg3NSwgNjA0NjYxNzZcbiAgXTtcblxuICBCTi5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZyAoYmFzZSwgcGFkZGluZykge1xuICAgIGJhc2UgPSBiYXNlIHx8IDEwO1xuICAgIHBhZGRpbmcgPSBwYWRkaW5nIHwgMCB8fCAxO1xuXG4gICAgdmFyIG91dDtcbiAgICBpZiAoYmFzZSA9PT0gMTYgfHwgYmFzZSA9PT0gJ2hleCcpIHtcbiAgICAgIG91dCA9ICcnO1xuICAgICAgdmFyIG9mZiA9IDA7XG4gICAgICB2YXIgY2FycnkgPSAwO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciB3ID0gdGhpcy53b3Jkc1tpXTtcbiAgICAgICAgdmFyIHdvcmQgPSAoKCh3IDw8IG9mZikgfCBjYXJyeSkgJiAweGZmZmZmZikudG9TdHJpbmcoMTYpO1xuICAgICAgICBjYXJyeSA9ICh3ID4+PiAoMjQgLSBvZmYpKSAmIDB4ZmZmZmZmO1xuICAgICAgICBpZiAoY2FycnkgIT09IDAgfHwgaSAhPT0gdGhpcy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgb3V0ID0gemVyb3NbNiAtIHdvcmQubGVuZ3RoXSArIHdvcmQgKyBvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb3V0ID0gd29yZCArIG91dDtcbiAgICAgICAgfVxuICAgICAgICBvZmYgKz0gMjtcbiAgICAgICAgaWYgKG9mZiA+PSAyNikge1xuICAgICAgICAgIG9mZiAtPSAyNjtcbiAgICAgICAgICBpLS07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChjYXJyeSAhPT0gMCkge1xuICAgICAgICBvdXQgPSBjYXJyeS50b1N0cmluZygxNikgKyBvdXQ7XG4gICAgICB9XG4gICAgICB3aGlsZSAob3V0Lmxlbmd0aCAlIHBhZGRpbmcgIT09IDApIHtcbiAgICAgICAgb3V0ID0gJzAnICsgb3V0O1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMubmVnYXRpdmUgIT09IDApIHtcbiAgICAgICAgb3V0ID0gJy0nICsgb3V0O1xuICAgICAgfVxuICAgICAgcmV0dXJuIG91dDtcbiAgICB9XG5cbiAgICBpZiAoYmFzZSA9PT0gKGJhc2UgfCAwKSAmJiBiYXNlID49IDIgJiYgYmFzZSA8PSAzNikge1xuICAgICAgLy8gdmFyIGdyb3VwU2l6ZSA9IE1hdGguZmxvb3IoQk4ud29yZFNpemUgKiBNYXRoLkxOMiAvIE1hdGgubG9nKGJhc2UpKTtcbiAgICAgIHZhciBncm91cFNpemUgPSBncm91cFNpemVzW2Jhc2VdO1xuICAgICAgLy8gdmFyIGdyb3VwQmFzZSA9IE1hdGgucG93KGJhc2UsIGdyb3VwU2l6ZSk7XG4gICAgICB2YXIgZ3JvdXBCYXNlID0gZ3JvdXBCYXNlc1tiYXNlXTtcbiAgICAgIG91dCA9ICcnO1xuICAgICAgdmFyIGMgPSB0aGlzLmNsb25lKCk7XG4gICAgICBjLm5lZ2F0aXZlID0gMDtcbiAgICAgIHdoaWxlICghYy5pc1plcm8oKSkge1xuICAgICAgICB2YXIgciA9IGMubW9kbihncm91cEJhc2UpLnRvU3RyaW5nKGJhc2UpO1xuICAgICAgICBjID0gYy5pZGl2bihncm91cEJhc2UpO1xuXG4gICAgICAgIGlmICghYy5pc1plcm8oKSkge1xuICAgICAgICAgIG91dCA9IHplcm9zW2dyb3VwU2l6ZSAtIHIubGVuZ3RoXSArIHIgKyBvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb3V0ID0gciArIG91dDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMuaXNaZXJvKCkpIHtcbiAgICAgICAgb3V0ID0gJzAnICsgb3V0O1xuICAgICAgfVxuICAgICAgd2hpbGUgKG91dC5sZW5ndGggJSBwYWRkaW5nICE9PSAwKSB7XG4gICAgICAgIG91dCA9ICcwJyArIG91dDtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLm5lZ2F0aXZlICE9PSAwKSB7XG4gICAgICAgIG91dCA9ICctJyArIG91dDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvdXQ7XG4gICAgfVxuXG4gICAgYXNzZXJ0KGZhbHNlLCAnQmFzZSBzaG91bGQgYmUgYmV0d2VlbiAyIGFuZCAzNicpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS50b051bWJlciA9IGZ1bmN0aW9uIHRvTnVtYmVyICgpIHtcbiAgICB2YXIgbGVuZ3RoID0gdGhpcy5iaXRMZW5ndGgoKTtcbiAgICB2YXIgcmV0O1xuICAgIGlmIChsZW5ndGggPD0gMjYpIHtcbiAgICAgIHJldCA9IHRoaXMud29yZHNbMF07XG4gICAgfSBlbHNlIGlmIChsZW5ndGggPD0gNTIpIHtcbiAgICAgIHJldCA9ICh0aGlzLndvcmRzWzFdICogMHg0MDAwMDAwKSArIHRoaXMud29yZHNbMF07XG4gICAgfSBlbHNlIGlmIChsZW5ndGggPT09IDUzKSB7XG4gICAgICAvLyBOT1RFOiBhdCB0aGlzIHN0YWdlIGl0IGlzIGtub3duIHRoYXQgdGhlIHRvcCBiaXQgaXMgc2V0XG4gICAgICByZXQgPSAweDEwMDAwMDAwMDAwMDAwICsgKHRoaXMud29yZHNbMV0gKiAweDQwMDAwMDApICsgdGhpcy53b3Jkc1swXTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXNzZXJ0KGZhbHNlLCAnTnVtYmVyIGNhbiBvbmx5IHNhZmVseSBzdG9yZSB1cCB0byA1MyBiaXRzJyk7XG4gICAgfVxuICAgIHJldHVybiAodGhpcy5uZWdhdGl2ZSAhPT0gMCkgPyAtcmV0IDogcmV0O1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiB0b0pTT04gKCkge1xuICAgIHJldHVybiB0aGlzLnRvU3RyaW5nKDE2KTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUudG9CdWZmZXIgPSBmdW5jdGlvbiB0b0J1ZmZlciAoZW5kaWFuLCBsZW5ndGgpIHtcbiAgICBhc3NlcnQodHlwZW9mIEJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcpO1xuICAgIHJldHVybiB0aGlzLnRvQXJyYXlMaWtlKEJ1ZmZlciwgZW5kaWFuLCBsZW5ndGgpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS50b0FycmF5ID0gZnVuY3Rpb24gdG9BcnJheSAoZW5kaWFuLCBsZW5ndGgpIHtcbiAgICByZXR1cm4gdGhpcy50b0FycmF5TGlrZShBcnJheSwgZW5kaWFuLCBsZW5ndGgpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS50b0FycmF5TGlrZSA9IGZ1bmN0aW9uIHRvQXJyYXlMaWtlIChBcnJheVR5cGUsIGVuZGlhbiwgbGVuZ3RoKSB7XG4gICAgdmFyIGJ5dGVMZW5ndGggPSB0aGlzLmJ5dGVMZW5ndGgoKTtcbiAgICB2YXIgcmVxTGVuZ3RoID0gbGVuZ3RoIHx8IE1hdGgubWF4KDEsIGJ5dGVMZW5ndGgpO1xuICAgIGFzc2VydChieXRlTGVuZ3RoIDw9IHJlcUxlbmd0aCwgJ2J5dGUgYXJyYXkgbG9uZ2VyIHRoYW4gZGVzaXJlZCBsZW5ndGgnKTtcbiAgICBhc3NlcnQocmVxTGVuZ3RoID4gMCwgJ1JlcXVlc3RlZCBhcnJheSBsZW5ndGggPD0gMCcpO1xuXG4gICAgdGhpcy5zdHJpcCgpO1xuICAgIHZhciBsaXR0bGVFbmRpYW4gPSBlbmRpYW4gPT09ICdsZSc7XG4gICAgdmFyIHJlcyA9IG5ldyBBcnJheVR5cGUocmVxTGVuZ3RoKTtcblxuICAgIHZhciBiLCBpO1xuICAgIHZhciBxID0gdGhpcy5jbG9uZSgpO1xuICAgIGlmICghbGl0dGxlRW5kaWFuKSB7XG4gICAgICAvLyBBc3N1bWUgYmlnLWVuZGlhblxuICAgICAgZm9yIChpID0gMDsgaSA8IHJlcUxlbmd0aCAtIGJ5dGVMZW5ndGg7IGkrKykge1xuICAgICAgICByZXNbaV0gPSAwO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGkgPSAwOyAhcS5pc1plcm8oKTsgaSsrKSB7XG4gICAgICAgIGIgPSBxLmFuZGxuKDB4ZmYpO1xuICAgICAgICBxLml1c2hybig4KTtcblxuICAgICAgICByZXNbcmVxTGVuZ3RoIC0gaSAtIDFdID0gYjtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChpID0gMDsgIXEuaXNaZXJvKCk7IGkrKykge1xuICAgICAgICBiID0gcS5hbmRsbigweGZmKTtcbiAgICAgICAgcS5pdXNocm4oOCk7XG5cbiAgICAgICAgcmVzW2ldID0gYjtcbiAgICAgIH1cblxuICAgICAgZm9yICg7IGkgPCByZXFMZW5ndGg7IGkrKykge1xuICAgICAgICByZXNbaV0gPSAwO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXM7XG4gIH07XG5cbiAgaWYgKE1hdGguY2x6MzIpIHtcbiAgICBCTi5wcm90b3R5cGUuX2NvdW50Qml0cyA9IGZ1bmN0aW9uIF9jb3VudEJpdHMgKHcpIHtcbiAgICAgIHJldHVybiAzMiAtIE1hdGguY2x6MzIodyk7XG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICBCTi5wcm90b3R5cGUuX2NvdW50Qml0cyA9IGZ1bmN0aW9uIF9jb3VudEJpdHMgKHcpIHtcbiAgICAgIHZhciB0ID0gdztcbiAgICAgIHZhciByID0gMDtcbiAgICAgIGlmICh0ID49IDB4MTAwMCkge1xuICAgICAgICByICs9IDEzO1xuICAgICAgICB0ID4+Pj0gMTM7XG4gICAgICB9XG4gICAgICBpZiAodCA+PSAweDQwKSB7XG4gICAgICAgIHIgKz0gNztcbiAgICAgICAgdCA+Pj49IDc7XG4gICAgICB9XG4gICAgICBpZiAodCA+PSAweDgpIHtcbiAgICAgICAgciArPSA0O1xuICAgICAgICB0ID4+Pj0gNDtcbiAgICAgIH1cbiAgICAgIGlmICh0ID49IDB4MDIpIHtcbiAgICAgICAgciArPSAyO1xuICAgICAgICB0ID4+Pj0gMjtcbiAgICAgIH1cbiAgICAgIHJldHVybiByICsgdDtcbiAgICB9O1xuICB9XG5cbiAgQk4ucHJvdG90eXBlLl96ZXJvQml0cyA9IGZ1bmN0aW9uIF96ZXJvQml0cyAodykge1xuICAgIC8vIFNob3J0LWN1dFxuICAgIGlmICh3ID09PSAwKSByZXR1cm4gMjY7XG5cbiAgICB2YXIgdCA9IHc7XG4gICAgdmFyIHIgPSAwO1xuICAgIGlmICgodCAmIDB4MWZmZikgPT09IDApIHtcbiAgICAgIHIgKz0gMTM7XG4gICAgICB0ID4+Pj0gMTM7XG4gICAgfVxuICAgIGlmICgodCAmIDB4N2YpID09PSAwKSB7XG4gICAgICByICs9IDc7XG4gICAgICB0ID4+Pj0gNztcbiAgICB9XG4gICAgaWYgKCh0ICYgMHhmKSA9PT0gMCkge1xuICAgICAgciArPSA0O1xuICAgICAgdCA+Pj49IDQ7XG4gICAgfVxuICAgIGlmICgodCAmIDB4MykgPT09IDApIHtcbiAgICAgIHIgKz0gMjtcbiAgICAgIHQgPj4+PSAyO1xuICAgIH1cbiAgICBpZiAoKHQgJiAweDEpID09PSAwKSB7XG4gICAgICByKys7XG4gICAgfVxuICAgIHJldHVybiByO1xuICB9O1xuXG4gIC8vIFJldHVybiBudW1iZXIgb2YgdXNlZCBiaXRzIGluIGEgQk5cbiAgQk4ucHJvdG90eXBlLmJpdExlbmd0aCA9IGZ1bmN0aW9uIGJpdExlbmd0aCAoKSB7XG4gICAgdmFyIHcgPSB0aGlzLndvcmRzW3RoaXMubGVuZ3RoIC0gMV07XG4gICAgdmFyIGhpID0gdGhpcy5fY291bnRCaXRzKHcpO1xuICAgIHJldHVybiAodGhpcy5sZW5ndGggLSAxKSAqIDI2ICsgaGk7XG4gIH07XG5cbiAgZnVuY3Rpb24gdG9CaXRBcnJheSAobnVtKSB7XG4gICAgdmFyIHcgPSBuZXcgQXJyYXkobnVtLmJpdExlbmd0aCgpKTtcblxuICAgIGZvciAodmFyIGJpdCA9IDA7IGJpdCA8IHcubGVuZ3RoOyBiaXQrKykge1xuICAgICAgdmFyIG9mZiA9IChiaXQgLyAyNikgfCAwO1xuICAgICAgdmFyIHdiaXQgPSBiaXQgJSAyNjtcblxuICAgICAgd1tiaXRdID0gKG51bS53b3Jkc1tvZmZdICYgKDEgPDwgd2JpdCkpID4+PiB3Yml0O1xuICAgIH1cblxuICAgIHJldHVybiB3O1xuICB9XG5cbiAgLy8gTnVtYmVyIG9mIHRyYWlsaW5nIHplcm8gYml0c1xuICBCTi5wcm90b3R5cGUuemVyb0JpdHMgPSBmdW5jdGlvbiB6ZXJvQml0cyAoKSB7XG4gICAgaWYgKHRoaXMuaXNaZXJvKCkpIHJldHVybiAwO1xuXG4gICAgdmFyIHIgPSAwO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGIgPSB0aGlzLl96ZXJvQml0cyh0aGlzLndvcmRzW2ldKTtcbiAgICAgIHIgKz0gYjtcbiAgICAgIGlmIChiICE9PSAyNikgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiByO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5ieXRlTGVuZ3RoID0gZnVuY3Rpb24gYnl0ZUxlbmd0aCAoKSB7XG4gICAgcmV0dXJuIE1hdGguY2VpbCh0aGlzLmJpdExlbmd0aCgpIC8gOCk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnRvVHdvcyA9IGZ1bmN0aW9uIHRvVHdvcyAod2lkdGgpIHtcbiAgICBpZiAodGhpcy5uZWdhdGl2ZSAhPT0gMCkge1xuICAgICAgcmV0dXJuIHRoaXMuYWJzKCkuaW5vdG4od2lkdGgpLmlhZGRuKDEpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jbG9uZSgpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5mcm9tVHdvcyA9IGZ1bmN0aW9uIGZyb21Ud29zICh3aWR0aCkge1xuICAgIGlmICh0aGlzLnRlc3RuKHdpZHRoIC0gMSkpIHtcbiAgICAgIHJldHVybiB0aGlzLm5vdG4od2lkdGgpLmlhZGRuKDEpLmluZWcoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY2xvbmUoKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuaXNOZWcgPSBmdW5jdGlvbiBpc05lZyAoKSB7XG4gICAgcmV0dXJuIHRoaXMubmVnYXRpdmUgIT09IDA7XG4gIH07XG5cbiAgLy8gUmV0dXJuIG5lZ2F0aXZlIGNsb25lIG9mIGB0aGlzYFxuICBCTi5wcm90b3R5cGUubmVnID0gZnVuY3Rpb24gbmVnICgpIHtcbiAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmluZWcoKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuaW5lZyA9IGZ1bmN0aW9uIGluZWcgKCkge1xuICAgIGlmICghdGhpcy5pc1plcm8oKSkge1xuICAgICAgdGhpcy5uZWdhdGl2ZSBePSAxO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8vIE9yIGBudW1gIHdpdGggYHRoaXNgIGluLXBsYWNlXG4gIEJOLnByb3RvdHlwZS5pdW9yID0gZnVuY3Rpb24gaXVvciAobnVtKSB7XG4gICAgd2hpbGUgKHRoaXMubGVuZ3RoIDwgbnVtLmxlbmd0aCkge1xuICAgICAgdGhpcy53b3Jkc1t0aGlzLmxlbmd0aCsrXSA9IDA7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW0ubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMud29yZHNbaV0gPSB0aGlzLndvcmRzW2ldIHwgbnVtLndvcmRzW2ldO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnN0cmlwKCk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmlvciA9IGZ1bmN0aW9uIGlvciAobnVtKSB7XG4gICAgYXNzZXJ0KCh0aGlzLm5lZ2F0aXZlIHwgbnVtLm5lZ2F0aXZlKSA9PT0gMCk7XG4gICAgcmV0dXJuIHRoaXMuaXVvcihudW0pO1xuICB9O1xuXG4gIC8vIE9yIGBudW1gIHdpdGggYHRoaXNgXG4gIEJOLnByb3RvdHlwZS5vciA9IGZ1bmN0aW9uIG9yIChudW0pIHtcbiAgICBpZiAodGhpcy5sZW5ndGggPiBudW0ubGVuZ3RoKSByZXR1cm4gdGhpcy5jbG9uZSgpLmlvcihudW0pO1xuICAgIHJldHVybiBudW0uY2xvbmUoKS5pb3IodGhpcyk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnVvciA9IGZ1bmN0aW9uIHVvciAobnVtKSB7XG4gICAgaWYgKHRoaXMubGVuZ3RoID4gbnVtLmxlbmd0aCkgcmV0dXJuIHRoaXMuY2xvbmUoKS5pdW9yKG51bSk7XG4gICAgcmV0dXJuIG51bS5jbG9uZSgpLml1b3IodGhpcyk7XG4gIH07XG5cbiAgLy8gQW5kIGBudW1gIHdpdGggYHRoaXNgIGluLXBsYWNlXG4gIEJOLnByb3RvdHlwZS5pdWFuZCA9IGZ1bmN0aW9uIGl1YW5kIChudW0pIHtcbiAgICAvLyBiID0gbWluLWxlbmd0aChudW0sIHRoaXMpXG4gICAgdmFyIGI7XG4gICAgaWYgKHRoaXMubGVuZ3RoID4gbnVtLmxlbmd0aCkge1xuICAgICAgYiA9IG51bTtcbiAgICB9IGVsc2Uge1xuICAgICAgYiA9IHRoaXM7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBiLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLndvcmRzW2ldID0gdGhpcy53b3Jkc1tpXSAmIG51bS53b3Jkc1tpXTtcbiAgICB9XG5cbiAgICB0aGlzLmxlbmd0aCA9IGIubGVuZ3RoO1xuXG4gICAgcmV0dXJuIHRoaXMuc3RyaXAoKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuaWFuZCA9IGZ1bmN0aW9uIGlhbmQgKG51bSkge1xuICAgIGFzc2VydCgodGhpcy5uZWdhdGl2ZSB8IG51bS5uZWdhdGl2ZSkgPT09IDApO1xuICAgIHJldHVybiB0aGlzLml1YW5kKG51bSk7XG4gIH07XG5cbiAgLy8gQW5kIGBudW1gIHdpdGggYHRoaXNgXG4gIEJOLnByb3RvdHlwZS5hbmQgPSBmdW5jdGlvbiBhbmQgKG51bSkge1xuICAgIGlmICh0aGlzLmxlbmd0aCA+IG51bS5sZW5ndGgpIHJldHVybiB0aGlzLmNsb25lKCkuaWFuZChudW0pO1xuICAgIHJldHVybiBudW0uY2xvbmUoKS5pYW5kKHRoaXMpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS51YW5kID0gZnVuY3Rpb24gdWFuZCAobnVtKSB7XG4gICAgaWYgKHRoaXMubGVuZ3RoID4gbnVtLmxlbmd0aCkgcmV0dXJuIHRoaXMuY2xvbmUoKS5pdWFuZChudW0pO1xuICAgIHJldHVybiBudW0uY2xvbmUoKS5pdWFuZCh0aGlzKTtcbiAgfTtcblxuICAvLyBYb3IgYG51bWAgd2l0aCBgdGhpc2AgaW4tcGxhY2VcbiAgQk4ucHJvdG90eXBlLml1eG9yID0gZnVuY3Rpb24gaXV4b3IgKG51bSkge1xuICAgIC8vIGEubGVuZ3RoID4gYi5sZW5ndGhcbiAgICB2YXIgYTtcbiAgICB2YXIgYjtcbiAgICBpZiAodGhpcy5sZW5ndGggPiBudW0ubGVuZ3RoKSB7XG4gICAgICBhID0gdGhpcztcbiAgICAgIGIgPSBudW07XG4gICAgfSBlbHNlIHtcbiAgICAgIGEgPSBudW07XG4gICAgICBiID0gdGhpcztcbiAgICB9XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGIubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMud29yZHNbaV0gPSBhLndvcmRzW2ldIF4gYi53b3Jkc1tpXTtcbiAgICB9XG5cbiAgICBpZiAodGhpcyAhPT0gYSkge1xuICAgICAgZm9yICg7IGkgPCBhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRoaXMud29yZHNbaV0gPSBhLndvcmRzW2ldO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMubGVuZ3RoID0gYS5sZW5ndGg7XG5cbiAgICByZXR1cm4gdGhpcy5zdHJpcCgpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5peG9yID0gZnVuY3Rpb24gaXhvciAobnVtKSB7XG4gICAgYXNzZXJ0KCh0aGlzLm5lZ2F0aXZlIHwgbnVtLm5lZ2F0aXZlKSA9PT0gMCk7XG4gICAgcmV0dXJuIHRoaXMuaXV4b3IobnVtKTtcbiAgfTtcblxuICAvLyBYb3IgYG51bWAgd2l0aCBgdGhpc2BcbiAgQk4ucHJvdG90eXBlLnhvciA9IGZ1bmN0aW9uIHhvciAobnVtKSB7XG4gICAgaWYgKHRoaXMubGVuZ3RoID4gbnVtLmxlbmd0aCkgcmV0dXJuIHRoaXMuY2xvbmUoKS5peG9yKG51bSk7XG4gICAgcmV0dXJuIG51bS5jbG9uZSgpLml4b3IodGhpcyk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnV4b3IgPSBmdW5jdGlvbiB1eG9yIChudW0pIHtcbiAgICBpZiAodGhpcy5sZW5ndGggPiBudW0ubGVuZ3RoKSByZXR1cm4gdGhpcy5jbG9uZSgpLml1eG9yKG51bSk7XG4gICAgcmV0dXJuIG51bS5jbG9uZSgpLml1eG9yKHRoaXMpO1xuICB9O1xuXG4gIC8vIE5vdCBgYHRoaXNgYCB3aXRoIGBgd2lkdGhgYCBiaXR3aWR0aFxuICBCTi5wcm90b3R5cGUuaW5vdG4gPSBmdW5jdGlvbiBpbm90biAod2lkdGgpIHtcbiAgICBhc3NlcnQodHlwZW9mIHdpZHRoID09PSAnbnVtYmVyJyAmJiB3aWR0aCA+PSAwKTtcblxuICAgIHZhciBieXRlc05lZWRlZCA9IE1hdGguY2VpbCh3aWR0aCAvIDI2KSB8IDA7XG4gICAgdmFyIGJpdHNMZWZ0ID0gd2lkdGggJSAyNjtcblxuICAgIC8vIEV4dGVuZCB0aGUgYnVmZmVyIHdpdGggbGVhZGluZyB6ZXJvZXNcbiAgICB3aGlsZSAodGhpcy5sZW5ndGggPCBieXRlc05lZWRlZCkge1xuICAgICAgdGhpcy53b3Jkc1t0aGlzLmxlbmd0aCsrXSA9IDA7XG4gICAgfVxuXG4gICAgaWYgKGJpdHNMZWZ0ID4gMCkge1xuICAgICAgYnl0ZXNOZWVkZWQtLTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgY29tcGxldGUgd29yZHNcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJ5dGVzTmVlZGVkOyBpKyspIHtcbiAgICAgIHRoaXMud29yZHNbaV0gPSB+dGhpcy53b3Jkc1tpXSAmIDB4M2ZmZmZmZjtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgdGhlIHJlc2lkdWVcbiAgICBpZiAoYml0c0xlZnQgPiAwKSB7XG4gICAgICB0aGlzLndvcmRzW2ldID0gfnRoaXMud29yZHNbaV0gJiAoMHgzZmZmZmZmID4+ICgyNiAtIGJpdHNMZWZ0KSk7XG4gICAgfVxuXG4gICAgLy8gQW5kIHJlbW92ZSBsZWFkaW5nIHplcm9lc1xuICAgIHJldHVybiB0aGlzLnN0cmlwKCk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLm5vdG4gPSBmdW5jdGlvbiBub3RuICh3aWR0aCkge1xuICAgIHJldHVybiB0aGlzLmNsb25lKCkuaW5vdG4od2lkdGgpO1xuICB9O1xuXG4gIC8vIFNldCBgYml0YCBvZiBgdGhpc2BcbiAgQk4ucHJvdG90eXBlLnNldG4gPSBmdW5jdGlvbiBzZXRuIChiaXQsIHZhbCkge1xuICAgIGFzc2VydCh0eXBlb2YgYml0ID09PSAnbnVtYmVyJyAmJiBiaXQgPj0gMCk7XG5cbiAgICB2YXIgb2ZmID0gKGJpdCAvIDI2KSB8IDA7XG4gICAgdmFyIHdiaXQgPSBiaXQgJSAyNjtcblxuICAgIHdoaWxlICh0aGlzLmxlbmd0aCA8PSBvZmYpIHtcbiAgICAgIHRoaXMud29yZHNbdGhpcy5sZW5ndGgrK10gPSAwO1xuICAgIH1cblxuICAgIGlmICh2YWwpIHtcbiAgICAgIHRoaXMud29yZHNbb2ZmXSA9IHRoaXMud29yZHNbb2ZmXSB8ICgxIDw8IHdiaXQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLndvcmRzW29mZl0gPSB0aGlzLndvcmRzW29mZl0gJiB+KDEgPDwgd2JpdCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc3RyaXAoKTtcbiAgfTtcblxuICAvLyBBZGQgYG51bWAgdG8gYHRoaXNgIGluLXBsYWNlXG4gIEJOLnByb3RvdHlwZS5pYWRkID0gZnVuY3Rpb24gaWFkZCAobnVtKSB7XG4gICAgdmFyIHI7XG5cbiAgICAvLyBuZWdhdGl2ZSArIHBvc2l0aXZlXG4gICAgaWYgKHRoaXMubmVnYXRpdmUgIT09IDAgJiYgbnVtLm5lZ2F0aXZlID09PSAwKSB7XG4gICAgICB0aGlzLm5lZ2F0aXZlID0gMDtcbiAgICAgIHIgPSB0aGlzLmlzdWIobnVtKTtcbiAgICAgIHRoaXMubmVnYXRpdmUgXj0gMTtcbiAgICAgIHJldHVybiB0aGlzLl9ub3JtU2lnbigpO1xuXG4gICAgLy8gcG9zaXRpdmUgKyBuZWdhdGl2ZVxuICAgIH0gZWxzZSBpZiAodGhpcy5uZWdhdGl2ZSA9PT0gMCAmJiBudW0ubmVnYXRpdmUgIT09IDApIHtcbiAgICAgIG51bS5uZWdhdGl2ZSA9IDA7XG4gICAgICByID0gdGhpcy5pc3ViKG51bSk7XG4gICAgICBudW0ubmVnYXRpdmUgPSAxO1xuICAgICAgcmV0dXJuIHIuX25vcm1TaWduKCk7XG4gICAgfVxuXG4gICAgLy8gYS5sZW5ndGggPiBiLmxlbmd0aFxuICAgIHZhciBhLCBiO1xuICAgIGlmICh0aGlzLmxlbmd0aCA+IG51bS5sZW5ndGgpIHtcbiAgICAgIGEgPSB0aGlzO1xuICAgICAgYiA9IG51bTtcbiAgICB9IGVsc2Uge1xuICAgICAgYSA9IG51bTtcbiAgICAgIGIgPSB0aGlzO1xuICAgIH1cblxuICAgIHZhciBjYXJyeSA9IDA7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBiLmxlbmd0aDsgaSsrKSB7XG4gICAgICByID0gKGEud29yZHNbaV0gfCAwKSArIChiLndvcmRzW2ldIHwgMCkgKyBjYXJyeTtcbiAgICAgIHRoaXMud29yZHNbaV0gPSByICYgMHgzZmZmZmZmO1xuICAgICAgY2FycnkgPSByID4+PiAyNjtcbiAgICB9XG4gICAgZm9yICg7IGNhcnJ5ICE9PSAwICYmIGkgPCBhLmxlbmd0aDsgaSsrKSB7XG4gICAgICByID0gKGEud29yZHNbaV0gfCAwKSArIGNhcnJ5O1xuICAgICAgdGhpcy53b3Jkc1tpXSA9IHIgJiAweDNmZmZmZmY7XG4gICAgICBjYXJyeSA9IHIgPj4+IDI2O1xuICAgIH1cblxuICAgIHRoaXMubGVuZ3RoID0gYS5sZW5ndGg7XG4gICAgaWYgKGNhcnJ5ICE9PSAwKSB7XG4gICAgICB0aGlzLndvcmRzW3RoaXMubGVuZ3RoXSA9IGNhcnJ5O1xuICAgICAgdGhpcy5sZW5ndGgrKztcbiAgICAvLyBDb3B5IHRoZSByZXN0IG9mIHRoZSB3b3Jkc1xuICAgIH0gZWxzZSBpZiAoYSAhPT0gdGhpcykge1xuICAgICAgZm9yICg7IGkgPCBhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRoaXMud29yZHNbaV0gPSBhLndvcmRzW2ldO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8vIEFkZCBgbnVtYCB0byBgdGhpc2BcbiAgQk4ucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIGFkZCAobnVtKSB7XG4gICAgdmFyIHJlcztcbiAgICBpZiAobnVtLm5lZ2F0aXZlICE9PSAwICYmIHRoaXMubmVnYXRpdmUgPT09IDApIHtcbiAgICAgIG51bS5uZWdhdGl2ZSA9IDA7XG4gICAgICByZXMgPSB0aGlzLnN1YihudW0pO1xuICAgICAgbnVtLm5lZ2F0aXZlIF49IDE7XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH0gZWxzZSBpZiAobnVtLm5lZ2F0aXZlID09PSAwICYmIHRoaXMubmVnYXRpdmUgIT09IDApIHtcbiAgICAgIHRoaXMubmVnYXRpdmUgPSAwO1xuICAgICAgcmVzID0gbnVtLnN1Yih0aGlzKTtcbiAgICAgIHRoaXMubmVnYXRpdmUgPSAxO1xuICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICBpZiAodGhpcy5sZW5ndGggPiBudW0ubGVuZ3RoKSByZXR1cm4gdGhpcy5jbG9uZSgpLmlhZGQobnVtKTtcblxuICAgIHJldHVybiBudW0uY2xvbmUoKS5pYWRkKHRoaXMpO1xuICB9O1xuXG4gIC8vIFN1YnRyYWN0IGBudW1gIGZyb20gYHRoaXNgIGluLXBsYWNlXG4gIEJOLnByb3RvdHlwZS5pc3ViID0gZnVuY3Rpb24gaXN1YiAobnVtKSB7XG4gICAgLy8gdGhpcyAtICgtbnVtKSA9IHRoaXMgKyBudW1cbiAgICBpZiAobnVtLm5lZ2F0aXZlICE9PSAwKSB7XG4gICAgICBudW0ubmVnYXRpdmUgPSAwO1xuICAgICAgdmFyIHIgPSB0aGlzLmlhZGQobnVtKTtcbiAgICAgIG51bS5uZWdhdGl2ZSA9IDE7XG4gICAgICByZXR1cm4gci5fbm9ybVNpZ24oKTtcblxuICAgIC8vIC10aGlzIC0gbnVtID0gLSh0aGlzICsgbnVtKVxuICAgIH0gZWxzZSBpZiAodGhpcy5uZWdhdGl2ZSAhPT0gMCkge1xuICAgICAgdGhpcy5uZWdhdGl2ZSA9IDA7XG4gICAgICB0aGlzLmlhZGQobnVtKTtcbiAgICAgIHRoaXMubmVnYXRpdmUgPSAxO1xuICAgICAgcmV0dXJuIHRoaXMuX25vcm1TaWduKCk7XG4gICAgfVxuXG4gICAgLy8gQXQgdGhpcyBwb2ludCBib3RoIG51bWJlcnMgYXJlIHBvc2l0aXZlXG4gICAgdmFyIGNtcCA9IHRoaXMuY21wKG51bSk7XG5cbiAgICAvLyBPcHRpbWl6YXRpb24gLSB6ZXJvaWZ5XG4gICAgaWYgKGNtcCA9PT0gMCkge1xuICAgICAgdGhpcy5uZWdhdGl2ZSA9IDA7XG4gICAgICB0aGlzLmxlbmd0aCA9IDE7XG4gICAgICB0aGlzLndvcmRzWzBdID0gMDtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8vIGEgPiBiXG4gICAgdmFyIGEsIGI7XG4gICAgaWYgKGNtcCA+IDApIHtcbiAgICAgIGEgPSB0aGlzO1xuICAgICAgYiA9IG51bTtcbiAgICB9IGVsc2Uge1xuICAgICAgYSA9IG51bTtcbiAgICAgIGIgPSB0aGlzO1xuICAgIH1cblxuICAgIHZhciBjYXJyeSA9IDA7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBiLmxlbmd0aDsgaSsrKSB7XG4gICAgICByID0gKGEud29yZHNbaV0gfCAwKSAtIChiLndvcmRzW2ldIHwgMCkgKyBjYXJyeTtcbiAgICAgIGNhcnJ5ID0gciA+PiAyNjtcbiAgICAgIHRoaXMud29yZHNbaV0gPSByICYgMHgzZmZmZmZmO1xuICAgIH1cbiAgICBmb3IgKDsgY2FycnkgIT09IDAgJiYgaSA8IGEubGVuZ3RoOyBpKyspIHtcbiAgICAgIHIgPSAoYS53b3Jkc1tpXSB8IDApICsgY2Fycnk7XG4gICAgICBjYXJyeSA9IHIgPj4gMjY7XG4gICAgICB0aGlzLndvcmRzW2ldID0gciAmIDB4M2ZmZmZmZjtcbiAgICB9XG5cbiAgICAvLyBDb3B5IHJlc3Qgb2YgdGhlIHdvcmRzXG4gICAgaWYgKGNhcnJ5ID09PSAwICYmIGkgPCBhLmxlbmd0aCAmJiBhICE9PSB0aGlzKSB7XG4gICAgICBmb3IgKDsgaSA8IGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdGhpcy53b3Jkc1tpXSA9IGEud29yZHNbaV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5sZW5ndGggPSBNYXRoLm1heCh0aGlzLmxlbmd0aCwgaSk7XG5cbiAgICBpZiAoYSAhPT0gdGhpcykge1xuICAgICAgdGhpcy5uZWdhdGl2ZSA9IDE7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc3RyaXAoKTtcbiAgfTtcblxuICAvLyBTdWJ0cmFjdCBgbnVtYCBmcm9tIGB0aGlzYFxuICBCTi5wcm90b3R5cGUuc3ViID0gZnVuY3Rpb24gc3ViIChudW0pIHtcbiAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmlzdWIobnVtKTtcbiAgfTtcblxuICBmdW5jdGlvbiBzbWFsbE11bFRvIChzZWxmLCBudW0sIG91dCkge1xuICAgIG91dC5uZWdhdGl2ZSA9IG51bS5uZWdhdGl2ZSBeIHNlbGYubmVnYXRpdmU7XG4gICAgdmFyIGxlbiA9IChzZWxmLmxlbmd0aCArIG51bS5sZW5ndGgpIHwgMDtcbiAgICBvdXQubGVuZ3RoID0gbGVuO1xuICAgIGxlbiA9IChsZW4gLSAxKSB8IDA7XG5cbiAgICAvLyBQZWVsIG9uZSBpdGVyYXRpb24gKGNvbXBpbGVyIGNhbid0IGRvIGl0LCBiZWNhdXNlIG9mIGNvZGUgY29tcGxleGl0eSlcbiAgICB2YXIgYSA9IHNlbGYud29yZHNbMF0gfCAwO1xuICAgIHZhciBiID0gbnVtLndvcmRzWzBdIHwgMDtcbiAgICB2YXIgciA9IGEgKiBiO1xuXG4gICAgdmFyIGxvID0gciAmIDB4M2ZmZmZmZjtcbiAgICB2YXIgY2FycnkgPSAociAvIDB4NDAwMDAwMCkgfCAwO1xuICAgIG91dC53b3Jkc1swXSA9IGxvO1xuXG4gICAgZm9yICh2YXIgayA9IDE7IGsgPCBsZW47IGsrKykge1xuICAgICAgLy8gU3VtIGFsbCB3b3JkcyB3aXRoIHRoZSBzYW1lIGBpICsgaiA9IGtgIGFuZCBhY2N1bXVsYXRlIGBuY2FycnlgLFxuICAgICAgLy8gbm90ZSB0aGF0IG5jYXJyeSBjb3VsZCBiZSA+PSAweDNmZmZmZmZcbiAgICAgIHZhciBuY2FycnkgPSBjYXJyeSA+Pj4gMjY7XG4gICAgICB2YXIgcndvcmQgPSBjYXJyeSAmIDB4M2ZmZmZmZjtcbiAgICAgIHZhciBtYXhKID0gTWF0aC5taW4oaywgbnVtLmxlbmd0aCAtIDEpO1xuICAgICAgZm9yICh2YXIgaiA9IE1hdGgubWF4KDAsIGsgLSBzZWxmLmxlbmd0aCArIDEpOyBqIDw9IG1heEo7IGorKykge1xuICAgICAgICB2YXIgaSA9IChrIC0gaikgfCAwO1xuICAgICAgICBhID0gc2VsZi53b3Jkc1tpXSB8IDA7XG4gICAgICAgIGIgPSBudW0ud29yZHNbal0gfCAwO1xuICAgICAgICByID0gYSAqIGIgKyByd29yZDtcbiAgICAgICAgbmNhcnJ5ICs9IChyIC8gMHg0MDAwMDAwKSB8IDA7XG4gICAgICAgIHJ3b3JkID0gciAmIDB4M2ZmZmZmZjtcbiAgICAgIH1cbiAgICAgIG91dC53b3Jkc1trXSA9IHJ3b3JkIHwgMDtcbiAgICAgIGNhcnJ5ID0gbmNhcnJ5IHwgMDtcbiAgICB9XG4gICAgaWYgKGNhcnJ5ICE9PSAwKSB7XG4gICAgICBvdXQud29yZHNba10gPSBjYXJyeSB8IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dC5sZW5ndGgtLTtcbiAgICB9XG5cbiAgICByZXR1cm4gb3V0LnN0cmlwKCk7XG4gIH1cblxuICAvLyBUT0RPKGluZHV0bnkpOiBpdCBtYXkgYmUgcmVhc29uYWJsZSB0byBvbWl0IGl0IGZvciB1c2VycyB3aG8gZG9uJ3QgbmVlZFxuICAvLyB0byB3b3JrIHdpdGggMjU2LWJpdCBudW1iZXJzLCBvdGhlcndpc2UgaXQgZ2l2ZXMgMjAlIGltcHJvdmVtZW50IGZvciAyNTYtYml0XG4gIC8vIG11bHRpcGxpY2F0aW9uIChsaWtlIGVsbGlwdGljIHNlY3AyNTZrMSkuXG4gIHZhciBjb21iMTBNdWxUbyA9IGZ1bmN0aW9uIGNvbWIxME11bFRvIChzZWxmLCBudW0sIG91dCkge1xuICAgIHZhciBhID0gc2VsZi53b3JkcztcbiAgICB2YXIgYiA9IG51bS53b3JkcztcbiAgICB2YXIgbyA9IG91dC53b3JkcztcbiAgICB2YXIgYyA9IDA7XG4gICAgdmFyIGxvO1xuICAgIHZhciBtaWQ7XG4gICAgdmFyIGhpO1xuICAgIHZhciBhMCA9IGFbMF0gfCAwO1xuICAgIHZhciBhbDAgPSBhMCAmIDB4MWZmZjtcbiAgICB2YXIgYWgwID0gYTAgPj4+IDEzO1xuICAgIHZhciBhMSA9IGFbMV0gfCAwO1xuICAgIHZhciBhbDEgPSBhMSAmIDB4MWZmZjtcbiAgICB2YXIgYWgxID0gYTEgPj4+IDEzO1xuICAgIHZhciBhMiA9IGFbMl0gfCAwO1xuICAgIHZhciBhbDIgPSBhMiAmIDB4MWZmZjtcbiAgICB2YXIgYWgyID0gYTIgPj4+IDEzO1xuICAgIHZhciBhMyA9IGFbM10gfCAwO1xuICAgIHZhciBhbDMgPSBhMyAmIDB4MWZmZjtcbiAgICB2YXIgYWgzID0gYTMgPj4+IDEzO1xuICAgIHZhciBhNCA9IGFbNF0gfCAwO1xuICAgIHZhciBhbDQgPSBhNCAmIDB4MWZmZjtcbiAgICB2YXIgYWg0ID0gYTQgPj4+IDEzO1xuICAgIHZhciBhNSA9IGFbNV0gfCAwO1xuICAgIHZhciBhbDUgPSBhNSAmIDB4MWZmZjtcbiAgICB2YXIgYWg1ID0gYTUgPj4+IDEzO1xuICAgIHZhciBhNiA9IGFbNl0gfCAwO1xuICAgIHZhciBhbDYgPSBhNiAmIDB4MWZmZjtcbiAgICB2YXIgYWg2ID0gYTYgPj4+IDEzO1xuICAgIHZhciBhNyA9IGFbN10gfCAwO1xuICAgIHZhciBhbDcgPSBhNyAmIDB4MWZmZjtcbiAgICB2YXIgYWg3ID0gYTcgPj4+IDEzO1xuICAgIHZhciBhOCA9IGFbOF0gfCAwO1xuICAgIHZhciBhbDggPSBhOCAmIDB4MWZmZjtcbiAgICB2YXIgYWg4ID0gYTggPj4+IDEzO1xuICAgIHZhciBhOSA9IGFbOV0gfCAwO1xuICAgIHZhciBhbDkgPSBhOSAmIDB4MWZmZjtcbiAgICB2YXIgYWg5ID0gYTkgPj4+IDEzO1xuICAgIHZhciBiMCA9IGJbMF0gfCAwO1xuICAgIHZhciBibDAgPSBiMCAmIDB4MWZmZjtcbiAgICB2YXIgYmgwID0gYjAgPj4+IDEzO1xuICAgIHZhciBiMSA9IGJbMV0gfCAwO1xuICAgIHZhciBibDEgPSBiMSAmIDB4MWZmZjtcbiAgICB2YXIgYmgxID0gYjEgPj4+IDEzO1xuICAgIHZhciBiMiA9IGJbMl0gfCAwO1xuICAgIHZhciBibDIgPSBiMiAmIDB4MWZmZjtcbiAgICB2YXIgYmgyID0gYjIgPj4+IDEzO1xuICAgIHZhciBiMyA9IGJbM10gfCAwO1xuICAgIHZhciBibDMgPSBiMyAmIDB4MWZmZjtcbiAgICB2YXIgYmgzID0gYjMgPj4+IDEzO1xuICAgIHZhciBiNCA9IGJbNF0gfCAwO1xuICAgIHZhciBibDQgPSBiNCAmIDB4MWZmZjtcbiAgICB2YXIgYmg0ID0gYjQgPj4+IDEzO1xuICAgIHZhciBiNSA9IGJbNV0gfCAwO1xuICAgIHZhciBibDUgPSBiNSAmIDB4MWZmZjtcbiAgICB2YXIgYmg1ID0gYjUgPj4+IDEzO1xuICAgIHZhciBiNiA9IGJbNl0gfCAwO1xuICAgIHZhciBibDYgPSBiNiAmIDB4MWZmZjtcbiAgICB2YXIgYmg2ID0gYjYgPj4+IDEzO1xuICAgIHZhciBiNyA9IGJbN10gfCAwO1xuICAgIHZhciBibDcgPSBiNyAmIDB4MWZmZjtcbiAgICB2YXIgYmg3ID0gYjcgPj4+IDEzO1xuICAgIHZhciBiOCA9IGJbOF0gfCAwO1xuICAgIHZhciBibDggPSBiOCAmIDB4MWZmZjtcbiAgICB2YXIgYmg4ID0gYjggPj4+IDEzO1xuICAgIHZhciBiOSA9IGJbOV0gfCAwO1xuICAgIHZhciBibDkgPSBiOSAmIDB4MWZmZjtcbiAgICB2YXIgYmg5ID0gYjkgPj4+IDEzO1xuXG4gICAgb3V0Lm5lZ2F0aXZlID0gc2VsZi5uZWdhdGl2ZSBeIG51bS5uZWdhdGl2ZTtcbiAgICBvdXQubGVuZ3RoID0gMTk7XG4gICAgLyogayA9IDAgKi9cbiAgICBsbyA9IE1hdGguaW11bChhbDAsIGJsMCk7XG4gICAgbWlkID0gTWF0aC5pbXVsKGFsMCwgYmgwKTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFoMCwgYmwwKTtcbiAgICBoaSA9IE1hdGguaW11bChhaDAsIGJoMCk7XG4gICAgdmFyIHcwID0gYyArIGxvICsgKChtaWQgJiAweDFmZmYpIDw8IDEzKTtcbiAgICBjID0gaGkgKyAobWlkID4+PiAxMykgKyAodzAgPj4+IDI2KTtcbiAgICB3MCAmPSAweDNmZmZmZmY7XG4gICAgLyogayA9IDEgKi9cbiAgICBsbyA9IE1hdGguaW11bChhbDEsIGJsMCk7XG4gICAgbWlkID0gTWF0aC5pbXVsKGFsMSwgYmgwKTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFoMSwgYmwwKTtcbiAgICBoaSA9IE1hdGguaW11bChhaDEsIGJoMCk7XG4gICAgbG8gKz0gTWF0aC5pbXVsKGFsMCwgYmwxKTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFsMCwgYmgxKTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFoMCwgYmwxKTtcbiAgICBoaSArPSBNYXRoLmltdWwoYWgwLCBiaDEpO1xuICAgIHZhciB3MSA9IGMgKyBsbyArICgobWlkICYgMHgxZmZmKSA8PCAxMyk7XG4gICAgYyA9IGhpICsgKG1pZCA+Pj4gMTMpICsgKHcxID4+PiAyNik7XG4gICAgdzEgJj0gMHgzZmZmZmZmO1xuICAgIC8qIGsgPSAyICovXG4gICAgbG8gPSBNYXRoLmltdWwoYWwyLCBibDApO1xuICAgIG1pZCA9IE1hdGguaW11bChhbDIsIGJoMCk7XG4gICAgbWlkICs9IE1hdGguaW11bChhaDIsIGJsMCk7XG4gICAgaGkgPSBNYXRoLmltdWwoYWgyLCBiaDApO1xuICAgIGxvICs9IE1hdGguaW11bChhbDEsIGJsMSk7XG4gICAgbWlkICs9IE1hdGguaW11bChhbDEsIGJoMSk7XG4gICAgbWlkICs9IE1hdGguaW11bChhaDEsIGJsMSk7XG4gICAgaGkgKz0gTWF0aC5pbXVsKGFoMSwgYmgxKTtcbiAgICBsbyArPSBNYXRoLmltdWwoYWwwLCBibDIpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWwwLCBiaDIpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWgwLCBibDIpO1xuICAgIGhpICs9IE1hdGguaW11bChhaDAsIGJoMik7XG4gICAgdmFyIHcyID0gYyArIGxvICsgKChtaWQgJiAweDFmZmYpIDw8IDEzKTtcbiAgICBjID0gaGkgKyAobWlkID4+PiAxMykgKyAodzIgPj4+IDI2KTtcbiAgICB3MiAmPSAweDNmZmZmZmY7XG4gICAgLyogayA9IDMgKi9cbiAgICBsbyA9IE1hdGguaW11bChhbDMsIGJsMCk7XG4gICAgbWlkID0gTWF0aC5pbXVsKGFsMywgYmgwKTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFoMywgYmwwKTtcbiAgICBoaSA9IE1hdGguaW11bChhaDMsIGJoMCk7XG4gICAgbG8gKz0gTWF0aC5pbXVsKGFsMiwgYmwxKTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFsMiwgYmgxKTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFoMiwgYmwxKTtcbiAgICBoaSArPSBNYXRoLmltdWwoYWgyLCBiaDEpO1xuICAgIGxvICs9IE1hdGguaW11bChhbDEsIGJsMik7XG4gICAgbWlkICs9IE1hdGguaW11bChhbDEsIGJoMik7XG4gICAgbWlkICs9IE1hdGguaW11bChhaDEsIGJsMik7XG4gICAgaGkgKz0gTWF0aC5pbXVsKGFoMSwgYmgyKTtcbiAgICBsbyArPSBNYXRoLmltdWwoYWwwLCBibDMpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWwwLCBiaDMpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWgwLCBibDMpO1xuICAgIGhpICs9IE1hdGguaW11bChhaDAsIGJoMyk7XG4gICAgdmFyIHczID0gYyArIGxvICsgKChtaWQgJiAweDFmZmYpIDw8IDEzKTtcbiAgICBjID0gaGkgKyAobWlkID4+PiAxMykgKyAodzMgPj4+IDI2KTtcbiAgICB3MyAmPSAweDNmZmZmZmY7XG4gICAgLyogayA9IDQgKi9cbiAgICBsbyA9IE1hdGguaW11bChhbDQsIGJsMCk7XG4gICAgbWlkID0gTWF0aC5pbXVsKGFsNCwgYmgwKTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFoNCwgYmwwKTtcbiAgICBoaSA9IE1hdGguaW11bChhaDQsIGJoMCk7XG4gICAgbG8gKz0gTWF0aC5pbXVsKGFsMywgYmwxKTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFsMywgYmgxKTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFoMywgYmwxKTtcbiAgICBoaSArPSBNYXRoLmltdWwoYWgzLCBiaDEpO1xuICAgIGxvICs9IE1hdGguaW11bChhbDIsIGJsMik7XG4gICAgbWlkICs9IE1hdGguaW11bChhbDIsIGJoMik7XG4gICAgbWlkICs9IE1hdGguaW11bChhaDIsIGJsMik7XG4gICAgaGkgKz0gTWF0aC5pbXVsKGFoMiwgYmgyKTtcbiAgICBsbyArPSBNYXRoLmltdWwoYWwxLCBibDMpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWwxLCBiaDMpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWgxLCBibDMpO1xuICAgIGhpICs9IE1hdGguaW11bChhaDEsIGJoMyk7XG4gICAgbG8gKz0gTWF0aC5pbXVsKGFsMCwgYmw0KTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFsMCwgYmg0KTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFoMCwgYmw0KTtcbiAgICBoaSArPSBNYXRoLmltdWwoYWgwLCBiaDQpO1xuICAgIHZhciB3NCA9IGMgKyBsbyArICgobWlkICYgMHgxZmZmKSA8PCAxMyk7XG4gICAgYyA9IGhpICsgKG1pZCA+Pj4gMTMpICsgKHc0ID4+PiAyNik7XG4gICAgdzQgJj0gMHgzZmZmZmZmO1xuICAgIC8qIGsgPSA1ICovXG4gICAgbG8gPSBNYXRoLmltdWwoYWw1LCBibDApO1xuICAgIG1pZCA9IE1hdGguaW11bChhbDUsIGJoMCk7XG4gICAgbWlkICs9IE1hdGguaW11bChhaDUsIGJsMCk7XG4gICAgaGkgPSBNYXRoLmltdWwoYWg1LCBiaDApO1xuICAgIGxvICs9IE1hdGguaW11bChhbDQsIGJsMSk7XG4gICAgbWlkICs9IE1hdGguaW11bChhbDQsIGJoMSk7XG4gICAgbWlkICs9IE1hdGguaW11bChhaDQsIGJsMSk7XG4gICAgaGkgKz0gTWF0aC5pbXVsKGFoNCwgYmgxKTtcbiAgICBsbyArPSBNYXRoLmltdWwoYWwzLCBibDIpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWwzLCBiaDIpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWgzLCBibDIpO1xuICAgIGhpICs9IE1hdGguaW11bChhaDMsIGJoMik7XG4gICAgbG8gKz0gTWF0aC5pbXVsKGFsMiwgYmwzKTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFsMiwgYmgzKTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFoMiwgYmwzKTtcbiAgICBoaSArPSBNYXRoLmltdWwoYWgyLCBiaDMpO1xuICAgIGxvICs9IE1hdGguaW11bChhbDEsIGJsNCk7XG4gICAgbWlkICs9IE1hdGguaW11bChhbDEsIGJoNCk7XG4gICAgbWlkICs9IE1hdGguaW11bChhaDEsIGJsNCk7XG4gICAgaGkgKz0gTWF0aC5pbXVsKGFoMSwgYmg0KTtcbiAgICBsbyArPSBNYXRoLmltdWwoYWwwLCBibDUpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWwwLCBiaDUpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWgwLCBibDUpO1xuICAgIGhpICs9IE1hdGguaW11bChhaDAsIGJoNSk7XG4gICAgdmFyIHc1ID0gYyArIGxvICsgKChtaWQgJiAweDFmZmYpIDw8IDEzKTtcbiAgICBjID0gaGkgKyAobWlkID4+PiAxMykgKyAodzUgPj4+IDI2KTtcbiAgICB3NSAmPSAweDNmZmZmZmY7XG4gICAgLyogayA9IDYgKi9cbiAgICBsbyA9IE1hdGguaW11bChhbDYsIGJsMCk7XG4gICAgbWlkID0gTWF0aC5pbXVsKGFsNiwgYmgwKTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFoNiwgYmwwKTtcbiAgICBoaSA9IE1hdGguaW11bChhaDYsIGJoMCk7XG4gICAgbG8gKz0gTWF0aC5pbXVsKGFsNSwgYmwxKTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFsNSwgYmgxKTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFoNSwgYmwxKTtcbiAgICBoaSArPSBNYXRoLmltdWwoYWg1LCBiaDEpO1xuICAgIGxvICs9IE1hdGguaW11bChhbDQsIGJsMik7XG4gICAgbWlkICs9IE1hdGguaW11bChhbDQsIGJoMik7XG4gICAgbWlkICs9IE1hdGguaW11bChhaDQsIGJsMik7XG4gICAgaGkgKz0gTWF0aC5pbXVsKGFoNCwgYmgyKTtcbiAgICBsbyArPSBNYXRoLmltdWwoYWwzLCBibDMpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWwzLCBiaDMpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWgzLCBibDMpO1xuICAgIGhpICs9IE1hdGguaW11bChhaDMsIGJoMyk7XG4gICAgbG8gKz0gTWF0aC5pbXVsKGFsMiwgYmw0KTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFsMiwgYmg0KTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFoMiwgYmw0KTtcbiAgICBoaSArPSBNYXRoLmltdWwoYWgyLCBiaDQpO1xuICAgIGxvICs9IE1hdGguaW11bChhbDEsIGJsNSk7XG4gICAgbWlkICs9IE1hdGguaW11bChhbDEsIGJoNSk7XG4gICAgbWlkICs9IE1hdGguaW11bChhaDEsIGJsNSk7XG4gICAgaGkgKz0gTWF0aC5pbXVsKGFoMSwgYmg1KTtcbiAgICBsbyArPSBNYXRoLmltdWwoYWwwLCBibDYpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWwwLCBiaDYpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWgwLCBibDYpO1xuICAgIGhpICs9IE1hdGguaW11bChhaDAsIGJoNik7XG4gICAgdmFyIHc2ID0gYyArIGxvICsgKChtaWQgJiAweDFmZmYpIDw8IDEzKTtcbiAgICBjID0gaGkgKyAobWlkID4+PiAxMykgKyAodzYgPj4+IDI2KTtcbiAgICB3NiAmPSAweDNmZmZmZmY7XG4gICAgLyogayA9IDcgKi9cbiAgICBsbyA9IE1hdGguaW11bChhbDcsIGJsMCk7XG4gICAgbWlkID0gTWF0aC5pbXVsKGFsNywgYmgwKTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFoNywgYmwwKTtcbiAgICBoaSA9IE1hdGguaW11bChhaDcsIGJoMCk7XG4gICAgbG8gKz0gTWF0aC5pbXVsKGFsNiwgYmwxKTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFsNiwgYmgxKTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFoNiwgYmwxKTtcbiAgICBoaSArPSBNYXRoLmltdWwoYWg2LCBiaDEpO1xuICAgIGxvICs9IE1hdGguaW11bChhbDUsIGJsMik7XG4gICAgbWlkICs9IE1hdGguaW11bChhbDUsIGJoMik7XG4gICAgbWlkICs9IE1hdGguaW11bChhaDUsIGJsMik7XG4gICAgaGkgKz0gTWF0aC5pbXVsKGFoNSwgYmgyKTtcbiAgICBsbyArPSBNYXRoLmltdWwoYWw0LCBibDMpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWw0LCBiaDMpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWg0LCBibDMpO1xuICAgIGhpICs9IE1hdGguaW11bChhaDQsIGJoMyk7XG4gICAgbG8gKz0gTWF0aC5pbXVsKGFsMywgYmw0KTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFsMywgYmg0KTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFoMywgYmw0KTtcbiAgICBoaSArPSBNYXRoLmltdWwoYWgzLCBiaDQpO1xuICAgIGxvICs9IE1hdGguaW11bChhbDIsIGJsNSk7XG4gICAgbWlkICs9IE1hdGguaW11bChhbDIsIGJoNSk7XG4gICAgbWlkICs9IE1hdGguaW11bChhaDIsIGJsNSk7XG4gICAgaGkgKz0gTWF0aC5pbXVsKGFoMiwgYmg1KTtcbiAgICBsbyArPSBNYXRoLmltdWwoYWwxLCBibDYpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWwxLCBiaDYpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWgxLCBibDYpO1xuICAgIGhpICs9IE1hdGguaW11bChhaDEsIGJoNik7XG4gICAgbG8gKz0gTWF0aC5pbXVsKGFsMCwgYmw3KTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFsMCwgYmg3KTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFoMCwgYmw3KTtcbiAgICBoaSArPSBNYXRoLmltdWwoYWgwLCBiaDcpO1xuICAgIHZhciB3NyA9IGMgKyBsbyArICgobWlkICYgMHgxZmZmKSA8PCAxMyk7XG4gICAgYyA9IGhpICsgKG1pZCA+Pj4gMTMpICsgKHc3ID4+PiAyNik7XG4gICAgdzcgJj0gMHgzZmZmZmZmO1xuICAgIC8qIGsgPSA4ICovXG4gICAgbG8gPSBNYXRoLmltdWwoYWw4LCBibDApO1xuICAgIG1pZCA9IE1hdGguaW11bChhbDgsIGJoMCk7XG4gICAgbWlkICs9IE1hdGguaW11bChhaDgsIGJsMCk7XG4gICAgaGkgPSBNYXRoLmltdWwoYWg4LCBiaDApO1xuICAgIGxvICs9IE1hdGguaW11bChhbDcsIGJsMSk7XG4gICAgbWlkICs9IE1hdGguaW11bChhbDcsIGJoMSk7XG4gICAgbWlkICs9IE1hdGguaW11bChhaDcsIGJsMSk7XG4gICAgaGkgKz0gTWF0aC5pbXVsKGFoNywgYmgxKTtcbiAgICBsbyArPSBNYXRoLmltdWwoYWw2LCBibDIpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWw2LCBiaDIpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWg2LCBibDIpO1xuICAgIGhpICs9IE1hdGguaW11bChhaDYsIGJoMik7XG4gICAgbG8gKz0gTWF0aC5pbXVsKGFsNSwgYmwzKTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFsNSwgYmgzKTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFoNSwgYmwzKTtcbiAgICBoaSArPSBNYXRoLmltdWwoYWg1LCBiaDMpO1xuICAgIGxvICs9IE1hdGguaW11bChhbDQsIGJsNCk7XG4gICAgbWlkICs9IE1hdGguaW11bChhbDQsIGJoNCk7XG4gICAgbWlkICs9IE1hdGguaW11bChhaDQsIGJsNCk7XG4gICAgaGkgKz0gTWF0aC5pbXVsKGFoNCwgYmg0KTtcbiAgICBsbyArPSBNYXRoLmltdWwoYWwzLCBibDUpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWwzLCBiaDUpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWgzLCBibDUpO1xuICAgIGhpICs9IE1hdGguaW11bChhaDMsIGJoNSk7XG4gICAgbG8gKz0gTWF0aC5pbXVsKGFsMiwgYmw2KTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFsMiwgYmg2KTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFoMiwgYmw2KTtcbiAgICBoaSArPSBNYXRoLmltdWwoYWgyLCBiaDYpO1xuICAgIGxvICs9IE1hdGguaW11bChhbDEsIGJsNyk7XG4gICAgbWlkICs9IE1hdGguaW11bChhbDEsIGJoNyk7XG4gICAgbWlkICs9IE1hdGguaW11bChhaDEsIGJsNyk7XG4gICAgaGkgKz0gTWF0aC5pbXVsKGFoMSwgYmg3KTtcbiAgICBsbyArPSBNYXRoLmltdWwoYWwwLCBibDgpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWwwLCBiaDgpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWgwLCBibDgpO1xuICAgIGhpICs9IE1hdGguaW11bChhaDAsIGJoOCk7XG4gICAgdmFyIHc4ID0gYyArIGxvICsgKChtaWQgJiAweDFmZmYpIDw8IDEzKTtcbiAgICBjID0gaGkgKyAobWlkID4+PiAxMykgKyAodzggPj4+IDI2KTtcbiAgICB3OCAmPSAweDNmZmZmZmY7XG4gICAgLyogayA9IDkgKi9cbiAgICBsbyA9IE1hdGguaW11bChhbDksIGJsMCk7XG4gICAgbWlkID0gTWF0aC5pbXVsKGFsOSwgYmgwKTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFoOSwgYmwwKTtcbiAgICBoaSA9IE1hdGguaW11bChhaDksIGJoMCk7XG4gICAgbG8gKz0gTWF0aC5pbXVsKGFsOCwgYmwxKTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFsOCwgYmgxKTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFoOCwgYmwxKTtcbiAgICBoaSArPSBNYXRoLmltdWwoYWg4LCBiaDEpO1xuICAgIGxvICs9IE1hdGguaW11bChhbDcsIGJsMik7XG4gICAgbWlkICs9IE1hdGguaW11bChhbDcsIGJoMik7XG4gICAgbWlkICs9IE1hdGguaW11bChhaDcsIGJsMik7XG4gICAgaGkgKz0gTWF0aC5pbXVsKGFoNywgYmgyKTtcbiAgICBsbyArPSBNYXRoLmltdWwoYWw2LCBibDMpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWw2LCBiaDMpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWg2LCBibDMpO1xuICAgIGhpICs9IE1hdGguaW11bChhaDYsIGJoMyk7XG4gICAgbG8gKz0gTWF0aC5pbXVsKGFsNSwgYmw0KTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFsNSwgYmg0KTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFoNSwgYmw0KTtcbiAgICBoaSArPSBNYXRoLmltdWwoYWg1LCBiaDQpO1xuICAgIGxvICs9IE1hdGguaW11bChhbDQsIGJsNSk7XG4gICAgbWlkICs9IE1hdGguaW11bChhbDQsIGJoNSk7XG4gICAgbWlkICs9IE1hdGguaW11bChhaDQsIGJsNSk7XG4gICAgaGkgKz0gTWF0aC5pbXVsKGFoNCwgYmg1KTtcbiAgICBsbyArPSBNYXRoLmltdWwoYWwzLCBibDYpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWwzLCBiaDYpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWgzLCBibDYpO1xuICAgIGhpICs9IE1hdGguaW11bChhaDMsIGJoNik7XG4gICAgbG8gKz0gTWF0aC5pbXVsKGFsMiwgYmw3KTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFsMiwgYmg3KTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFoMiwgYmw3KTtcbiAgICBoaSArPSBNYXRoLmltdWwoYWgyLCBiaDcpO1xuICAgIGxvICs9IE1hdGguaW11bChhbDEsIGJsOCk7XG4gICAgbWlkICs9IE1hdGguaW11bChhbDEsIGJoOCk7XG4gICAgbWlkICs9IE1hdGguaW11bChhaDEsIGJsOCk7XG4gICAgaGkgKz0gTWF0aC5pbXVsKGFoMSwgYmg4KTtcbiAgICBsbyArPSBNYXRoLmltdWwoYWwwLCBibDkpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWwwLCBiaDkpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWgwLCBibDkpO1xuICAgIGhpICs9IE1hdGguaW11bChhaDAsIGJoOSk7XG4gICAgdmFyIHc5ID0gYyArIGxvICsgKChtaWQgJiAweDFmZmYpIDw8IDEzKTtcbiAgICBjID0gaGkgKyAobWlkID4+PiAxMykgKyAodzkgPj4+IDI2KTtcbiAgICB3OSAmPSAweDNmZmZmZmY7XG4gICAgLyogayA9IDEwICovXG4gICAgbG8gPSBNYXRoLmltdWwoYWw5LCBibDEpO1xuICAgIG1pZCA9IE1hdGguaW11bChhbDksIGJoMSk7XG4gICAgbWlkICs9IE1hdGguaW11bChhaDksIGJsMSk7XG4gICAgaGkgPSBNYXRoLmltdWwoYWg5LCBiaDEpO1xuICAgIGxvICs9IE1hdGguaW11bChhbDgsIGJsMik7XG4gICAgbWlkICs9IE1hdGguaW11bChhbDgsIGJoMik7XG4gICAgbWlkICs9IE1hdGguaW11bChhaDgsIGJsMik7XG4gICAgaGkgKz0gTWF0aC5pbXVsKGFoOCwgYmgyKTtcbiAgICBsbyArPSBNYXRoLmltdWwoYWw3LCBibDMpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWw3LCBiaDMpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWg3LCBibDMpO1xuICAgIGhpICs9IE1hdGguaW11bChhaDcsIGJoMyk7XG4gICAgbG8gKz0gTWF0aC5pbXVsKGFsNiwgYmw0KTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFsNiwgYmg0KTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFoNiwgYmw0KTtcbiAgICBoaSArPSBNYXRoLmltdWwoYWg2LCBiaDQpO1xuICAgIGxvICs9IE1hdGguaW11bChhbDUsIGJsNSk7XG4gICAgbWlkICs9IE1hdGguaW11bChhbDUsIGJoNSk7XG4gICAgbWlkICs9IE1hdGguaW11bChhaDUsIGJsNSk7XG4gICAgaGkgKz0gTWF0aC5pbXVsKGFoNSwgYmg1KTtcbiAgICBsbyArPSBNYXRoLmltdWwoYWw0LCBibDYpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWw0LCBiaDYpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWg0LCBibDYpO1xuICAgIGhpICs9IE1hdGguaW11bChhaDQsIGJoNik7XG4gICAgbG8gKz0gTWF0aC5pbXVsKGFsMywgYmw3KTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFsMywgYmg3KTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFoMywgYmw3KTtcbiAgICBoaSArPSBNYXRoLmltdWwoYWgzLCBiaDcpO1xuICAgIGxvICs9IE1hdGguaW11bChhbDIsIGJsOCk7XG4gICAgbWlkICs9IE1hdGguaW11bChhbDIsIGJoOCk7XG4gICAgbWlkICs9IE1hdGguaW11bChhaDIsIGJsOCk7XG4gICAgaGkgKz0gTWF0aC5pbXVsKGFoMiwgYmg4KTtcbiAgICBsbyArPSBNYXRoLmltdWwoYWwxLCBibDkpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWwxLCBiaDkpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWgxLCBibDkpO1xuICAgIGhpICs9IE1hdGguaW11bChhaDEsIGJoOSk7XG4gICAgdmFyIHcxMCA9IGMgKyBsbyArICgobWlkICYgMHgxZmZmKSA8PCAxMyk7XG4gICAgYyA9IGhpICsgKG1pZCA+Pj4gMTMpICsgKHcxMCA+Pj4gMjYpO1xuICAgIHcxMCAmPSAweDNmZmZmZmY7XG4gICAgLyogayA9IDExICovXG4gICAgbG8gPSBNYXRoLmltdWwoYWw5LCBibDIpO1xuICAgIG1pZCA9IE1hdGguaW11bChhbDksIGJoMik7XG4gICAgbWlkICs9IE1hdGguaW11bChhaDksIGJsMik7XG4gICAgaGkgPSBNYXRoLmltdWwoYWg5LCBiaDIpO1xuICAgIGxvICs9IE1hdGguaW11bChhbDgsIGJsMyk7XG4gICAgbWlkICs9IE1hdGguaW11bChhbDgsIGJoMyk7XG4gICAgbWlkICs9IE1hdGguaW11bChhaDgsIGJsMyk7XG4gICAgaGkgKz0gTWF0aC5pbXVsKGFoOCwgYmgzKTtcbiAgICBsbyArPSBNYXRoLmltdWwoYWw3LCBibDQpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWw3LCBiaDQpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWg3LCBibDQpO1xuICAgIGhpICs9IE1hdGguaW11bChhaDcsIGJoNCk7XG4gICAgbG8gKz0gTWF0aC5pbXVsKGFsNiwgYmw1KTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFsNiwgYmg1KTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFoNiwgYmw1KTtcbiAgICBoaSArPSBNYXRoLmltdWwoYWg2LCBiaDUpO1xuICAgIGxvICs9IE1hdGguaW11bChhbDUsIGJsNik7XG4gICAgbWlkICs9IE1hdGguaW11bChhbDUsIGJoNik7XG4gICAgbWlkICs9IE1hdGguaW11bChhaDUsIGJsNik7XG4gICAgaGkgKz0gTWF0aC5pbXVsKGFoNSwgYmg2KTtcbiAgICBsbyArPSBNYXRoLmltdWwoYWw0LCBibDcpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWw0LCBiaDcpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWg0LCBibDcpO1xuICAgIGhpICs9IE1hdGguaW11bChhaDQsIGJoNyk7XG4gICAgbG8gKz0gTWF0aC5pbXVsKGFsMywgYmw4KTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFsMywgYmg4KTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFoMywgYmw4KTtcbiAgICBoaSArPSBNYXRoLmltdWwoYWgzLCBiaDgpO1xuICAgIGxvICs9IE1hdGguaW11bChhbDIsIGJsOSk7XG4gICAgbWlkICs9IE1hdGguaW11bChhbDIsIGJoOSk7XG4gICAgbWlkICs9IE1hdGguaW11bChhaDIsIGJsOSk7XG4gICAgaGkgKz0gTWF0aC5pbXVsKGFoMiwgYmg5KTtcbiAgICB2YXIgdzExID0gYyArIGxvICsgKChtaWQgJiAweDFmZmYpIDw8IDEzKTtcbiAgICBjID0gaGkgKyAobWlkID4+PiAxMykgKyAodzExID4+PiAyNik7XG4gICAgdzExICY9IDB4M2ZmZmZmZjtcbiAgICAvKiBrID0gMTIgKi9cbiAgICBsbyA9IE1hdGguaW11bChhbDksIGJsMyk7XG4gICAgbWlkID0gTWF0aC5pbXVsKGFsOSwgYmgzKTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFoOSwgYmwzKTtcbiAgICBoaSA9IE1hdGguaW11bChhaDksIGJoMyk7XG4gICAgbG8gKz0gTWF0aC5pbXVsKGFsOCwgYmw0KTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFsOCwgYmg0KTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFoOCwgYmw0KTtcbiAgICBoaSArPSBNYXRoLmltdWwoYWg4LCBiaDQpO1xuICAgIGxvICs9IE1hdGguaW11bChhbDcsIGJsNSk7XG4gICAgbWlkICs9IE1hdGguaW11bChhbDcsIGJoNSk7XG4gICAgbWlkICs9IE1hdGguaW11bChhaDcsIGJsNSk7XG4gICAgaGkgKz0gTWF0aC5pbXVsKGFoNywgYmg1KTtcbiAgICBsbyArPSBNYXRoLmltdWwoYWw2LCBibDYpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWw2LCBiaDYpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWg2LCBibDYpO1xuICAgIGhpICs9IE1hdGguaW11bChhaDYsIGJoNik7XG4gICAgbG8gKz0gTWF0aC5pbXVsKGFsNSwgYmw3KTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFsNSwgYmg3KTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFoNSwgYmw3KTtcbiAgICBoaSArPSBNYXRoLmltdWwoYWg1LCBiaDcpO1xuICAgIGxvICs9IE1hdGguaW11bChhbDQsIGJsOCk7XG4gICAgbWlkICs9IE1hdGguaW11bChhbDQsIGJoOCk7XG4gICAgbWlkICs9IE1hdGguaW11bChhaDQsIGJsOCk7XG4gICAgaGkgKz0gTWF0aC5pbXVsKGFoNCwgYmg4KTtcbiAgICBsbyArPSBNYXRoLmltdWwoYWwzLCBibDkpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWwzLCBiaDkpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWgzLCBibDkpO1xuICAgIGhpICs9IE1hdGguaW11bChhaDMsIGJoOSk7XG4gICAgdmFyIHcxMiA9IGMgKyBsbyArICgobWlkICYgMHgxZmZmKSA8PCAxMyk7XG4gICAgYyA9IGhpICsgKG1pZCA+Pj4gMTMpICsgKHcxMiA+Pj4gMjYpO1xuICAgIHcxMiAmPSAweDNmZmZmZmY7XG4gICAgLyogayA9IDEzICovXG4gICAgbG8gPSBNYXRoLmltdWwoYWw5LCBibDQpO1xuICAgIG1pZCA9IE1hdGguaW11bChhbDksIGJoNCk7XG4gICAgbWlkICs9IE1hdGguaW11bChhaDksIGJsNCk7XG4gICAgaGkgPSBNYXRoLmltdWwoYWg5LCBiaDQpO1xuICAgIGxvICs9IE1hdGguaW11bChhbDgsIGJsNSk7XG4gICAgbWlkICs9IE1hdGguaW11bChhbDgsIGJoNSk7XG4gICAgbWlkICs9IE1hdGguaW11bChhaDgsIGJsNSk7XG4gICAgaGkgKz0gTWF0aC5pbXVsKGFoOCwgYmg1KTtcbiAgICBsbyArPSBNYXRoLmltdWwoYWw3LCBibDYpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWw3LCBiaDYpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWg3LCBibDYpO1xuICAgIGhpICs9IE1hdGguaW11bChhaDcsIGJoNik7XG4gICAgbG8gKz0gTWF0aC5pbXVsKGFsNiwgYmw3KTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFsNiwgYmg3KTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFoNiwgYmw3KTtcbiAgICBoaSArPSBNYXRoLmltdWwoYWg2LCBiaDcpO1xuICAgIGxvICs9IE1hdGguaW11bChhbDUsIGJsOCk7XG4gICAgbWlkICs9IE1hdGguaW11bChhbDUsIGJoOCk7XG4gICAgbWlkICs9IE1hdGguaW11bChhaDUsIGJsOCk7XG4gICAgaGkgKz0gTWF0aC5pbXVsKGFoNSwgYmg4KTtcbiAgICBsbyArPSBNYXRoLmltdWwoYWw0LCBibDkpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWw0LCBiaDkpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWg0LCBibDkpO1xuICAgIGhpICs9IE1hdGguaW11bChhaDQsIGJoOSk7XG4gICAgdmFyIHcxMyA9IGMgKyBsbyArICgobWlkICYgMHgxZmZmKSA8PCAxMyk7XG4gICAgYyA9IGhpICsgKG1pZCA+Pj4gMTMpICsgKHcxMyA+Pj4gMjYpO1xuICAgIHcxMyAmPSAweDNmZmZmZmY7XG4gICAgLyogayA9IDE0ICovXG4gICAgbG8gPSBNYXRoLmltdWwoYWw5LCBibDUpO1xuICAgIG1pZCA9IE1hdGguaW11bChhbDksIGJoNSk7XG4gICAgbWlkICs9IE1hdGguaW11bChhaDksIGJsNSk7XG4gICAgaGkgPSBNYXRoLmltdWwoYWg5LCBiaDUpO1xuICAgIGxvICs9IE1hdGguaW11bChhbDgsIGJsNik7XG4gICAgbWlkICs9IE1hdGguaW11bChhbDgsIGJoNik7XG4gICAgbWlkICs9IE1hdGguaW11bChhaDgsIGJsNik7XG4gICAgaGkgKz0gTWF0aC5pbXVsKGFoOCwgYmg2KTtcbiAgICBsbyArPSBNYXRoLmltdWwoYWw3LCBibDcpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWw3LCBiaDcpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWg3LCBibDcpO1xuICAgIGhpICs9IE1hdGguaW11bChhaDcsIGJoNyk7XG4gICAgbG8gKz0gTWF0aC5pbXVsKGFsNiwgYmw4KTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFsNiwgYmg4KTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFoNiwgYmw4KTtcbiAgICBoaSArPSBNYXRoLmltdWwoYWg2LCBiaDgpO1xuICAgIGxvICs9IE1hdGguaW11bChhbDUsIGJsOSk7XG4gICAgbWlkICs9IE1hdGguaW11bChhbDUsIGJoOSk7XG4gICAgbWlkICs9IE1hdGguaW11bChhaDUsIGJsOSk7XG4gICAgaGkgKz0gTWF0aC5pbXVsKGFoNSwgYmg5KTtcbiAgICB2YXIgdzE0ID0gYyArIGxvICsgKChtaWQgJiAweDFmZmYpIDw8IDEzKTtcbiAgICBjID0gaGkgKyAobWlkID4+PiAxMykgKyAodzE0ID4+PiAyNik7XG4gICAgdzE0ICY9IDB4M2ZmZmZmZjtcbiAgICAvKiBrID0gMTUgKi9cbiAgICBsbyA9IE1hdGguaW11bChhbDksIGJsNik7XG4gICAgbWlkID0gTWF0aC5pbXVsKGFsOSwgYmg2KTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFoOSwgYmw2KTtcbiAgICBoaSA9IE1hdGguaW11bChhaDksIGJoNik7XG4gICAgbG8gKz0gTWF0aC5pbXVsKGFsOCwgYmw3KTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFsOCwgYmg3KTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFoOCwgYmw3KTtcbiAgICBoaSArPSBNYXRoLmltdWwoYWg4LCBiaDcpO1xuICAgIGxvICs9IE1hdGguaW11bChhbDcsIGJsOCk7XG4gICAgbWlkICs9IE1hdGguaW11bChhbDcsIGJoOCk7XG4gICAgbWlkICs9IE1hdGguaW11bChhaDcsIGJsOCk7XG4gICAgaGkgKz0gTWF0aC5pbXVsKGFoNywgYmg4KTtcbiAgICBsbyArPSBNYXRoLmltdWwoYWw2LCBibDkpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWw2LCBiaDkpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWg2LCBibDkpO1xuICAgIGhpICs9IE1hdGguaW11bChhaDYsIGJoOSk7XG4gICAgdmFyIHcxNSA9IGMgKyBsbyArICgobWlkICYgMHgxZmZmKSA8PCAxMyk7XG4gICAgYyA9IGhpICsgKG1pZCA+Pj4gMTMpICsgKHcxNSA+Pj4gMjYpO1xuICAgIHcxNSAmPSAweDNmZmZmZmY7XG4gICAgLyogayA9IDE2ICovXG4gICAgbG8gPSBNYXRoLmltdWwoYWw5LCBibDcpO1xuICAgIG1pZCA9IE1hdGguaW11bChhbDksIGJoNyk7XG4gICAgbWlkICs9IE1hdGguaW11bChhaDksIGJsNyk7XG4gICAgaGkgPSBNYXRoLmltdWwoYWg5LCBiaDcpO1xuICAgIGxvICs9IE1hdGguaW11bChhbDgsIGJsOCk7XG4gICAgbWlkICs9IE1hdGguaW11bChhbDgsIGJoOCk7XG4gICAgbWlkICs9IE1hdGguaW11bChhaDgsIGJsOCk7XG4gICAgaGkgKz0gTWF0aC5pbXVsKGFoOCwgYmg4KTtcbiAgICBsbyArPSBNYXRoLmltdWwoYWw3LCBibDkpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWw3LCBiaDkpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWg3LCBibDkpO1xuICAgIGhpICs9IE1hdGguaW11bChhaDcsIGJoOSk7XG4gICAgdmFyIHcxNiA9IGMgKyBsbyArICgobWlkICYgMHgxZmZmKSA8PCAxMyk7XG4gICAgYyA9IGhpICsgKG1pZCA+Pj4gMTMpICsgKHcxNiA+Pj4gMjYpO1xuICAgIHcxNiAmPSAweDNmZmZmZmY7XG4gICAgLyogayA9IDE3ICovXG4gICAgbG8gPSBNYXRoLmltdWwoYWw5LCBibDgpO1xuICAgIG1pZCA9IE1hdGguaW11bChhbDksIGJoOCk7XG4gICAgbWlkICs9IE1hdGguaW11bChhaDksIGJsOCk7XG4gICAgaGkgPSBNYXRoLmltdWwoYWg5LCBiaDgpO1xuICAgIGxvICs9IE1hdGguaW11bChhbDgsIGJsOSk7XG4gICAgbWlkICs9IE1hdGguaW11bChhbDgsIGJoOSk7XG4gICAgbWlkICs9IE1hdGguaW11bChhaDgsIGJsOSk7XG4gICAgaGkgKz0gTWF0aC5pbXVsKGFoOCwgYmg5KTtcbiAgICB2YXIgdzE3ID0gYyArIGxvICsgKChtaWQgJiAweDFmZmYpIDw8IDEzKTtcbiAgICBjID0gaGkgKyAobWlkID4+PiAxMykgKyAodzE3ID4+PiAyNik7XG4gICAgdzE3ICY9IDB4M2ZmZmZmZjtcbiAgICAvKiBrID0gMTggKi9cbiAgICBsbyA9IE1hdGguaW11bChhbDksIGJsOSk7XG4gICAgbWlkID0gTWF0aC5pbXVsKGFsOSwgYmg5KTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFoOSwgYmw5KTtcbiAgICBoaSA9IE1hdGguaW11bChhaDksIGJoOSk7XG4gICAgdmFyIHcxOCA9IGMgKyBsbyArICgobWlkICYgMHgxZmZmKSA8PCAxMyk7XG4gICAgYyA9IGhpICsgKG1pZCA+Pj4gMTMpICsgKHcxOCA+Pj4gMjYpO1xuICAgIHcxOCAmPSAweDNmZmZmZmY7XG4gICAgb1swXSA9IHcwO1xuICAgIG9bMV0gPSB3MTtcbiAgICBvWzJdID0gdzI7XG4gICAgb1szXSA9IHczO1xuICAgIG9bNF0gPSB3NDtcbiAgICBvWzVdID0gdzU7XG4gICAgb1s2XSA9IHc2O1xuICAgIG9bN10gPSB3NztcbiAgICBvWzhdID0gdzg7XG4gICAgb1s5XSA9IHc5O1xuICAgIG9bMTBdID0gdzEwO1xuICAgIG9bMTFdID0gdzExO1xuICAgIG9bMTJdID0gdzEyO1xuICAgIG9bMTNdID0gdzEzO1xuICAgIG9bMTRdID0gdzE0O1xuICAgIG9bMTVdID0gdzE1O1xuICAgIG9bMTZdID0gdzE2O1xuICAgIG9bMTddID0gdzE3O1xuICAgIG9bMThdID0gdzE4O1xuICAgIGlmIChjICE9PSAwKSB7XG4gICAgICBvWzE5XSA9IGM7XG4gICAgICBvdXQubGVuZ3RoKys7XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG4gIH07XG5cbiAgLy8gUG9seWZpbGwgY29tYlxuICBpZiAoIU1hdGguaW11bCkge1xuICAgIGNvbWIxME11bFRvID0gc21hbGxNdWxUbztcbiAgfVxuXG4gIGZ1bmN0aW9uIGJpZ011bFRvIChzZWxmLCBudW0sIG91dCkge1xuICAgIG91dC5uZWdhdGl2ZSA9IG51bS5uZWdhdGl2ZSBeIHNlbGYubmVnYXRpdmU7XG4gICAgb3V0Lmxlbmd0aCA9IHNlbGYubGVuZ3RoICsgbnVtLmxlbmd0aDtcblxuICAgIHZhciBjYXJyeSA9IDA7XG4gICAgdmFyIGhuY2FycnkgPSAwO1xuICAgIGZvciAodmFyIGsgPSAwOyBrIDwgb3V0Lmxlbmd0aCAtIDE7IGsrKykge1xuICAgICAgLy8gU3VtIGFsbCB3b3JkcyB3aXRoIHRoZSBzYW1lIGBpICsgaiA9IGtgIGFuZCBhY2N1bXVsYXRlIGBuY2FycnlgLFxuICAgICAgLy8gbm90ZSB0aGF0IG5jYXJyeSBjb3VsZCBiZSA+PSAweDNmZmZmZmZcbiAgICAgIHZhciBuY2FycnkgPSBobmNhcnJ5O1xuICAgICAgaG5jYXJyeSA9IDA7XG4gICAgICB2YXIgcndvcmQgPSBjYXJyeSAmIDB4M2ZmZmZmZjtcbiAgICAgIHZhciBtYXhKID0gTWF0aC5taW4oaywgbnVtLmxlbmd0aCAtIDEpO1xuICAgICAgZm9yICh2YXIgaiA9IE1hdGgubWF4KDAsIGsgLSBzZWxmLmxlbmd0aCArIDEpOyBqIDw9IG1heEo7IGorKykge1xuICAgICAgICB2YXIgaSA9IGsgLSBqO1xuICAgICAgICB2YXIgYSA9IHNlbGYud29yZHNbaV0gfCAwO1xuICAgICAgICB2YXIgYiA9IG51bS53b3Jkc1tqXSB8IDA7XG4gICAgICAgIHZhciByID0gYSAqIGI7XG5cbiAgICAgICAgdmFyIGxvID0gciAmIDB4M2ZmZmZmZjtcbiAgICAgICAgbmNhcnJ5ID0gKG5jYXJyeSArICgociAvIDB4NDAwMDAwMCkgfCAwKSkgfCAwO1xuICAgICAgICBsbyA9IChsbyArIHJ3b3JkKSB8IDA7XG4gICAgICAgIHJ3b3JkID0gbG8gJiAweDNmZmZmZmY7XG4gICAgICAgIG5jYXJyeSA9IChuY2FycnkgKyAobG8gPj4+IDI2KSkgfCAwO1xuXG4gICAgICAgIGhuY2FycnkgKz0gbmNhcnJ5ID4+PiAyNjtcbiAgICAgICAgbmNhcnJ5ICY9IDB4M2ZmZmZmZjtcbiAgICAgIH1cbiAgICAgIG91dC53b3Jkc1trXSA9IHJ3b3JkO1xuICAgICAgY2FycnkgPSBuY2Fycnk7XG4gICAgICBuY2FycnkgPSBobmNhcnJ5O1xuICAgIH1cbiAgICBpZiAoY2FycnkgIT09IDApIHtcbiAgICAgIG91dC53b3Jkc1trXSA9IGNhcnJ5O1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXQubGVuZ3RoLS07XG4gICAgfVxuXG4gICAgcmV0dXJuIG91dC5zdHJpcCgpO1xuICB9XG5cbiAgZnVuY3Rpb24ganVtYm9NdWxUbyAoc2VsZiwgbnVtLCBvdXQpIHtcbiAgICB2YXIgZmZ0bSA9IG5ldyBGRlRNKCk7XG4gICAgcmV0dXJuIGZmdG0ubXVscChzZWxmLCBudW0sIG91dCk7XG4gIH1cblxuICBCTi5wcm90b3R5cGUubXVsVG8gPSBmdW5jdGlvbiBtdWxUbyAobnVtLCBvdXQpIHtcbiAgICB2YXIgcmVzO1xuICAgIHZhciBsZW4gPSB0aGlzLmxlbmd0aCArIG51bS5sZW5ndGg7XG4gICAgaWYgKHRoaXMubGVuZ3RoID09PSAxMCAmJiBudW0ubGVuZ3RoID09PSAxMCkge1xuICAgICAgcmVzID0gY29tYjEwTXVsVG8odGhpcywgbnVtLCBvdXQpO1xuICAgIH0gZWxzZSBpZiAobGVuIDwgNjMpIHtcbiAgICAgIHJlcyA9IHNtYWxsTXVsVG8odGhpcywgbnVtLCBvdXQpO1xuICAgIH0gZWxzZSBpZiAobGVuIDwgMTAyNCkge1xuICAgICAgcmVzID0gYmlnTXVsVG8odGhpcywgbnVtLCBvdXQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXMgPSBqdW1ib011bFRvKHRoaXMsIG51bSwgb3V0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzO1xuICB9O1xuXG4gIC8vIENvb2xleS1UdWtleSBhbGdvcml0aG0gZm9yIEZGVFxuICAvLyBzbGlnaHRseSByZXZpc2l0ZWQgdG8gcmVseSBvbiBsb29waW5nIGluc3RlYWQgb2YgcmVjdXJzaW9uXG5cbiAgZnVuY3Rpb24gRkZUTSAoeCwgeSkge1xuICAgIHRoaXMueCA9IHg7XG4gICAgdGhpcy55ID0geTtcbiAgfVxuXG4gIEZGVE0ucHJvdG90eXBlLm1ha2VSQlQgPSBmdW5jdGlvbiBtYWtlUkJUIChOKSB7XG4gICAgdmFyIHQgPSBuZXcgQXJyYXkoTik7XG4gICAgdmFyIGwgPSBCTi5wcm90b3R5cGUuX2NvdW50Qml0cyhOKSAtIDE7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBOOyBpKyspIHtcbiAgICAgIHRbaV0gPSB0aGlzLnJldkJpbihpLCBsLCBOKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdDtcbiAgfTtcblxuICAvLyBSZXR1cm5zIGJpbmFyeS1yZXZlcnNlZCByZXByZXNlbnRhdGlvbiBvZiBgeGBcbiAgRkZUTS5wcm90b3R5cGUucmV2QmluID0gZnVuY3Rpb24gcmV2QmluICh4LCBsLCBOKSB7XG4gICAgaWYgKHggPT09IDAgfHwgeCA9PT0gTiAtIDEpIHJldHVybiB4O1xuXG4gICAgdmFyIHJiID0gMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGw7IGkrKykge1xuICAgICAgcmIgfD0gKHggJiAxKSA8PCAobCAtIGkgLSAxKTtcbiAgICAgIHggPj49IDE7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJiO1xuICB9O1xuXG4gIC8vIFBlcmZvcm1zIFwidHdlZWRsaW5nXCIgcGhhc2UsIHRoZXJlZm9yZSAnZW11bGF0aW5nJ1xuICAvLyBiZWhhdmlvdXIgb2YgdGhlIHJlY3Vyc2l2ZSBhbGdvcml0aG1cbiAgRkZUTS5wcm90b3R5cGUucGVybXV0ZSA9IGZ1bmN0aW9uIHBlcm11dGUgKHJidCwgcndzLCBpd3MsIHJ0d3MsIGl0d3MsIE4pIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IE47IGkrKykge1xuICAgICAgcnR3c1tpXSA9IHJ3c1tyYnRbaV1dO1xuICAgICAgaXR3c1tpXSA9IGl3c1tyYnRbaV1dO1xuICAgIH1cbiAgfTtcblxuICBGRlRNLnByb3RvdHlwZS50cmFuc2Zvcm0gPSBmdW5jdGlvbiB0cmFuc2Zvcm0gKHJ3cywgaXdzLCBydHdzLCBpdHdzLCBOLCByYnQpIHtcbiAgICB0aGlzLnBlcm11dGUocmJ0LCByd3MsIGl3cywgcnR3cywgaXR3cywgTik7XG5cbiAgICBmb3IgKHZhciBzID0gMTsgcyA8IE47IHMgPDw9IDEpIHtcbiAgICAgIHZhciBsID0gcyA8PCAxO1xuXG4gICAgICB2YXIgcnR3ZGYgPSBNYXRoLmNvcygyICogTWF0aC5QSSAvIGwpO1xuICAgICAgdmFyIGl0d2RmID0gTWF0aC5zaW4oMiAqIE1hdGguUEkgLyBsKTtcblxuICAgICAgZm9yICh2YXIgcCA9IDA7IHAgPCBOOyBwICs9IGwpIHtcbiAgICAgICAgdmFyIHJ0d2RmXyA9IHJ0d2RmO1xuICAgICAgICB2YXIgaXR3ZGZfID0gaXR3ZGY7XG5cbiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBzOyBqKyspIHtcbiAgICAgICAgICB2YXIgcmUgPSBydHdzW3AgKyBqXTtcbiAgICAgICAgICB2YXIgaWUgPSBpdHdzW3AgKyBqXTtcblxuICAgICAgICAgIHZhciBybyA9IHJ0d3NbcCArIGogKyBzXTtcbiAgICAgICAgICB2YXIgaW8gPSBpdHdzW3AgKyBqICsgc107XG5cbiAgICAgICAgICB2YXIgcnggPSBydHdkZl8gKiBybyAtIGl0d2RmXyAqIGlvO1xuXG4gICAgICAgICAgaW8gPSBydHdkZl8gKiBpbyArIGl0d2RmXyAqIHJvO1xuICAgICAgICAgIHJvID0gcng7XG5cbiAgICAgICAgICBydHdzW3AgKyBqXSA9IHJlICsgcm87XG4gICAgICAgICAgaXR3c1twICsgal0gPSBpZSArIGlvO1xuXG4gICAgICAgICAgcnR3c1twICsgaiArIHNdID0gcmUgLSBybztcbiAgICAgICAgICBpdHdzW3AgKyBqICsgc10gPSBpZSAtIGlvO1xuXG4gICAgICAgICAgLyoganNoaW50IG1heGRlcHRoIDogZmFsc2UgKi9cbiAgICAgICAgICBpZiAoaiAhPT0gbCkge1xuICAgICAgICAgICAgcnggPSBydHdkZiAqIHJ0d2RmXyAtIGl0d2RmICogaXR3ZGZfO1xuXG4gICAgICAgICAgICBpdHdkZl8gPSBydHdkZiAqIGl0d2RmXyArIGl0d2RmICogcnR3ZGZfO1xuICAgICAgICAgICAgcnR3ZGZfID0gcng7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIEZGVE0ucHJvdG90eXBlLmd1ZXNzTGVuMTNiID0gZnVuY3Rpb24gZ3Vlc3NMZW4xM2IgKG4sIG0pIHtcbiAgICB2YXIgTiA9IE1hdGgubWF4KG0sIG4pIHwgMTtcbiAgICB2YXIgb2RkID0gTiAmIDE7XG4gICAgdmFyIGkgPSAwO1xuICAgIGZvciAoTiA9IE4gLyAyIHwgMDsgTjsgTiA9IE4gPj4+IDEpIHtcbiAgICAgIGkrKztcbiAgICB9XG5cbiAgICByZXR1cm4gMSA8PCBpICsgMSArIG9kZDtcbiAgfTtcblxuICBGRlRNLnByb3RvdHlwZS5jb25qdWdhdGUgPSBmdW5jdGlvbiBjb25qdWdhdGUgKHJ3cywgaXdzLCBOKSB7XG4gICAgaWYgKE4gPD0gMSkgcmV0dXJuO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBOIC8gMjsgaSsrKSB7XG4gICAgICB2YXIgdCA9IHJ3c1tpXTtcblxuICAgICAgcndzW2ldID0gcndzW04gLSBpIC0gMV07XG4gICAgICByd3NbTiAtIGkgLSAxXSA9IHQ7XG5cbiAgICAgIHQgPSBpd3NbaV07XG5cbiAgICAgIGl3c1tpXSA9IC1pd3NbTiAtIGkgLSAxXTtcbiAgICAgIGl3c1tOIC0gaSAtIDFdID0gLXQ7XG4gICAgfVxuICB9O1xuXG4gIEZGVE0ucHJvdG90eXBlLm5vcm1hbGl6ZTEzYiA9IGZ1bmN0aW9uIG5vcm1hbGl6ZTEzYiAod3MsIE4pIHtcbiAgICB2YXIgY2FycnkgPSAwO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgTiAvIDI7IGkrKykge1xuICAgICAgdmFyIHcgPSBNYXRoLnJvdW5kKHdzWzIgKiBpICsgMV0gLyBOKSAqIDB4MjAwMCArXG4gICAgICAgIE1hdGgucm91bmQod3NbMiAqIGldIC8gTikgK1xuICAgICAgICBjYXJyeTtcblxuICAgICAgd3NbaV0gPSB3ICYgMHgzZmZmZmZmO1xuXG4gICAgICBpZiAodyA8IDB4NDAwMDAwMCkge1xuICAgICAgICBjYXJyeSA9IDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjYXJyeSA9IHcgLyAweDQwMDAwMDAgfCAwO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB3cztcbiAgfTtcblxuICBGRlRNLnByb3RvdHlwZS5jb252ZXJ0MTNiID0gZnVuY3Rpb24gY29udmVydDEzYiAod3MsIGxlbiwgcndzLCBOKSB7XG4gICAgdmFyIGNhcnJ5ID0gMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBjYXJyeSA9IGNhcnJ5ICsgKHdzW2ldIHwgMCk7XG5cbiAgICAgIHJ3c1syICogaV0gPSBjYXJyeSAmIDB4MWZmZjsgY2FycnkgPSBjYXJyeSA+Pj4gMTM7XG4gICAgICByd3NbMiAqIGkgKyAxXSA9IGNhcnJ5ICYgMHgxZmZmOyBjYXJyeSA9IGNhcnJ5ID4+PiAxMztcbiAgICB9XG5cbiAgICAvLyBQYWQgd2l0aCB6ZXJvZXNcbiAgICBmb3IgKGkgPSAyICogbGVuOyBpIDwgTjsgKytpKSB7XG4gICAgICByd3NbaV0gPSAwO1xuICAgIH1cblxuICAgIGFzc2VydChjYXJyeSA9PT0gMCk7XG4gICAgYXNzZXJ0KChjYXJyeSAmIH4weDFmZmYpID09PSAwKTtcbiAgfTtcblxuICBGRlRNLnByb3RvdHlwZS5zdHViID0gZnVuY3Rpb24gc3R1YiAoTikge1xuICAgIHZhciBwaCA9IG5ldyBBcnJheShOKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IE47IGkrKykge1xuICAgICAgcGhbaV0gPSAwO1xuICAgIH1cblxuICAgIHJldHVybiBwaDtcbiAgfTtcblxuICBGRlRNLnByb3RvdHlwZS5tdWxwID0gZnVuY3Rpb24gbXVscCAoeCwgeSwgb3V0KSB7XG4gICAgdmFyIE4gPSAyICogdGhpcy5ndWVzc0xlbjEzYih4Lmxlbmd0aCwgeS5sZW5ndGgpO1xuXG4gICAgdmFyIHJidCA9IHRoaXMubWFrZVJCVChOKTtcblxuICAgIHZhciBfID0gdGhpcy5zdHViKE4pO1xuXG4gICAgdmFyIHJ3cyA9IG5ldyBBcnJheShOKTtcbiAgICB2YXIgcndzdCA9IG5ldyBBcnJheShOKTtcbiAgICB2YXIgaXdzdCA9IG5ldyBBcnJheShOKTtcblxuICAgIHZhciBucndzID0gbmV3IEFycmF5KE4pO1xuICAgIHZhciBucndzdCA9IG5ldyBBcnJheShOKTtcbiAgICB2YXIgbml3c3QgPSBuZXcgQXJyYXkoTik7XG5cbiAgICB2YXIgcm13cyA9IG91dC53b3JkcztcbiAgICBybXdzLmxlbmd0aCA9IE47XG5cbiAgICB0aGlzLmNvbnZlcnQxM2IoeC53b3JkcywgeC5sZW5ndGgsIHJ3cywgTik7XG4gICAgdGhpcy5jb252ZXJ0MTNiKHkud29yZHMsIHkubGVuZ3RoLCBucndzLCBOKTtcblxuICAgIHRoaXMudHJhbnNmb3JtKHJ3cywgXywgcndzdCwgaXdzdCwgTiwgcmJ0KTtcbiAgICB0aGlzLnRyYW5zZm9ybShucndzLCBfLCBucndzdCwgbml3c3QsIE4sIHJidCk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IE47IGkrKykge1xuICAgICAgdmFyIHJ4ID0gcndzdFtpXSAqIG5yd3N0W2ldIC0gaXdzdFtpXSAqIG5pd3N0W2ldO1xuICAgICAgaXdzdFtpXSA9IHJ3c3RbaV0gKiBuaXdzdFtpXSArIGl3c3RbaV0gKiBucndzdFtpXTtcbiAgICAgIHJ3c3RbaV0gPSByeDtcbiAgICB9XG5cbiAgICB0aGlzLmNvbmp1Z2F0ZShyd3N0LCBpd3N0LCBOKTtcbiAgICB0aGlzLnRyYW5zZm9ybShyd3N0LCBpd3N0LCBybXdzLCBfLCBOLCByYnQpO1xuICAgIHRoaXMuY29uanVnYXRlKHJtd3MsIF8sIE4pO1xuICAgIHRoaXMubm9ybWFsaXplMTNiKHJtd3MsIE4pO1xuXG4gICAgb3V0Lm5lZ2F0aXZlID0geC5uZWdhdGl2ZSBeIHkubmVnYXRpdmU7XG4gICAgb3V0Lmxlbmd0aCA9IHgubGVuZ3RoICsgeS5sZW5ndGg7XG4gICAgcmV0dXJuIG91dC5zdHJpcCgpO1xuICB9O1xuXG4gIC8vIE11bHRpcGx5IGB0aGlzYCBieSBgbnVtYFxuICBCTi5wcm90b3R5cGUubXVsID0gZnVuY3Rpb24gbXVsIChudW0pIHtcbiAgICB2YXIgb3V0ID0gbmV3IEJOKG51bGwpO1xuICAgIG91dC53b3JkcyA9IG5ldyBBcnJheSh0aGlzLmxlbmd0aCArIG51bS5sZW5ndGgpO1xuICAgIHJldHVybiB0aGlzLm11bFRvKG51bSwgb3V0KTtcbiAgfTtcblxuICAvLyBNdWx0aXBseSBlbXBsb3lpbmcgRkZUXG4gIEJOLnByb3RvdHlwZS5tdWxmID0gZnVuY3Rpb24gbXVsZiAobnVtKSB7XG4gICAgdmFyIG91dCA9IG5ldyBCTihudWxsKTtcbiAgICBvdXQud29yZHMgPSBuZXcgQXJyYXkodGhpcy5sZW5ndGggKyBudW0ubGVuZ3RoKTtcbiAgICByZXR1cm4ganVtYm9NdWxUbyh0aGlzLCBudW0sIG91dCk7XG4gIH07XG5cbiAgLy8gSW4tcGxhY2UgTXVsdGlwbGljYXRpb25cbiAgQk4ucHJvdG90eXBlLmltdWwgPSBmdW5jdGlvbiBpbXVsIChudW0pIHtcbiAgICByZXR1cm4gdGhpcy5jbG9uZSgpLm11bFRvKG51bSwgdGhpcyk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmltdWxuID0gZnVuY3Rpb24gaW11bG4gKG51bSkge1xuICAgIGFzc2VydCh0eXBlb2YgbnVtID09PSAnbnVtYmVyJyk7XG4gICAgYXNzZXJ0KG51bSA8IDB4NDAwMDAwMCk7XG5cbiAgICAvLyBDYXJyeVxuICAgIHZhciBjYXJyeSA9IDA7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgdyA9ICh0aGlzLndvcmRzW2ldIHwgMCkgKiBudW07XG4gICAgICB2YXIgbG8gPSAodyAmIDB4M2ZmZmZmZikgKyAoY2FycnkgJiAweDNmZmZmZmYpO1xuICAgICAgY2FycnkgPj49IDI2O1xuICAgICAgY2FycnkgKz0gKHcgLyAweDQwMDAwMDApIHwgMDtcbiAgICAgIC8vIE5PVEU6IGxvIGlzIDI3Yml0IG1heGltdW1cbiAgICAgIGNhcnJ5ICs9IGxvID4+PiAyNjtcbiAgICAgIHRoaXMud29yZHNbaV0gPSBsbyAmIDB4M2ZmZmZmZjtcbiAgICB9XG5cbiAgICBpZiAoY2FycnkgIT09IDApIHtcbiAgICAgIHRoaXMud29yZHNbaV0gPSBjYXJyeTtcbiAgICAgIHRoaXMubGVuZ3RoKys7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLm11bG4gPSBmdW5jdGlvbiBtdWxuIChudW0pIHtcbiAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmltdWxuKG51bSk7XG4gIH07XG5cbiAgLy8gYHRoaXNgICogYHRoaXNgXG4gIEJOLnByb3RvdHlwZS5zcXIgPSBmdW5jdGlvbiBzcXIgKCkge1xuICAgIHJldHVybiB0aGlzLm11bCh0aGlzKTtcbiAgfTtcblxuICAvLyBgdGhpc2AgKiBgdGhpc2AgaW4tcGxhY2VcbiAgQk4ucHJvdG90eXBlLmlzcXIgPSBmdW5jdGlvbiBpc3FyICgpIHtcbiAgICByZXR1cm4gdGhpcy5pbXVsKHRoaXMuY2xvbmUoKSk7XG4gIH07XG5cbiAgLy8gTWF0aC5wb3coYHRoaXNgLCBgbnVtYClcbiAgQk4ucHJvdG90eXBlLnBvdyA9IGZ1bmN0aW9uIHBvdyAobnVtKSB7XG4gICAgdmFyIHcgPSB0b0JpdEFycmF5KG51bSk7XG4gICAgaWYgKHcubGVuZ3RoID09PSAwKSByZXR1cm4gbmV3IEJOKDEpO1xuXG4gICAgLy8gU2tpcCBsZWFkaW5nIHplcm9lc1xuICAgIHZhciByZXMgPSB0aGlzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdy5sZW5ndGg7IGkrKywgcmVzID0gcmVzLnNxcigpKSB7XG4gICAgICBpZiAod1tpXSAhPT0gMCkgYnJlYWs7XG4gICAgfVxuXG4gICAgaWYgKCsraSA8IHcubGVuZ3RoKSB7XG4gICAgICBmb3IgKHZhciBxID0gcmVzLnNxcigpOyBpIDwgdy5sZW5ndGg7IGkrKywgcSA9IHEuc3FyKCkpIHtcbiAgICAgICAgaWYgKHdbaV0gPT09IDApIGNvbnRpbnVlO1xuXG4gICAgICAgIHJlcyA9IHJlcy5tdWwocSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlcztcbiAgfTtcblxuICAvLyBTaGlmdC1sZWZ0IGluLXBsYWNlXG4gIEJOLnByb3RvdHlwZS5pdXNobG4gPSBmdW5jdGlvbiBpdXNobG4gKGJpdHMpIHtcbiAgICBhc3NlcnQodHlwZW9mIGJpdHMgPT09ICdudW1iZXInICYmIGJpdHMgPj0gMCk7XG4gICAgdmFyIHIgPSBiaXRzICUgMjY7XG4gICAgdmFyIHMgPSAoYml0cyAtIHIpIC8gMjY7XG4gICAgdmFyIGNhcnJ5TWFzayA9ICgweDNmZmZmZmYgPj4+ICgyNiAtIHIpKSA8PCAoMjYgLSByKTtcbiAgICB2YXIgaTtcblxuICAgIGlmIChyICE9PSAwKSB7XG4gICAgICB2YXIgY2FycnkgPSAwO1xuXG4gICAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgbmV3Q2FycnkgPSB0aGlzLndvcmRzW2ldICYgY2FycnlNYXNrO1xuICAgICAgICB2YXIgYyA9ICgodGhpcy53b3Jkc1tpXSB8IDApIC0gbmV3Q2FycnkpIDw8IHI7XG4gICAgICAgIHRoaXMud29yZHNbaV0gPSBjIHwgY2Fycnk7XG4gICAgICAgIGNhcnJ5ID0gbmV3Q2FycnkgPj4+ICgyNiAtIHIpO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2FycnkpIHtcbiAgICAgICAgdGhpcy53b3Jkc1tpXSA9IGNhcnJ5O1xuICAgICAgICB0aGlzLmxlbmd0aCsrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzICE9PSAwKSB7XG4gICAgICBmb3IgKGkgPSB0aGlzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIHRoaXMud29yZHNbaSArIHNdID0gdGhpcy53b3Jkc1tpXTtcbiAgICAgIH1cblxuICAgICAgZm9yIChpID0gMDsgaSA8IHM7IGkrKykge1xuICAgICAgICB0aGlzLndvcmRzW2ldID0gMDtcbiAgICAgIH1cblxuICAgICAgdGhpcy5sZW5ndGggKz0gcztcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zdHJpcCgpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5pc2hsbiA9IGZ1bmN0aW9uIGlzaGxuIChiaXRzKSB7XG4gICAgLy8gVE9ETyhpbmR1dG55KTogaW1wbGVtZW50IG1lXG4gICAgYXNzZXJ0KHRoaXMubmVnYXRpdmUgPT09IDApO1xuICAgIHJldHVybiB0aGlzLml1c2hsbihiaXRzKTtcbiAgfTtcblxuICAvLyBTaGlmdC1yaWdodCBpbi1wbGFjZVxuICAvLyBOT1RFOiBgaGludGAgaXMgYSBsb3dlc3QgYml0IGJlZm9yZSB0cmFpbGluZyB6ZXJvZXNcbiAgLy8gTk9URTogaWYgYGV4dGVuZGVkYCBpcyBwcmVzZW50IC0gaXQgd2lsbCBiZSBmaWxsZWQgd2l0aCBkZXN0cm95ZWQgYml0c1xuICBCTi5wcm90b3R5cGUuaXVzaHJuID0gZnVuY3Rpb24gaXVzaHJuIChiaXRzLCBoaW50LCBleHRlbmRlZCkge1xuICAgIGFzc2VydCh0eXBlb2YgYml0cyA9PT0gJ251bWJlcicgJiYgYml0cyA+PSAwKTtcbiAgICB2YXIgaDtcbiAgICBpZiAoaGludCkge1xuICAgICAgaCA9IChoaW50IC0gKGhpbnQgJSAyNikpIC8gMjY7XG4gICAgfSBlbHNlIHtcbiAgICAgIGggPSAwO1xuICAgIH1cblxuICAgIHZhciByID0gYml0cyAlIDI2O1xuICAgIHZhciBzID0gTWF0aC5taW4oKGJpdHMgLSByKSAvIDI2LCB0aGlzLmxlbmd0aCk7XG4gICAgdmFyIG1hc2sgPSAweDNmZmZmZmYgXiAoKDB4M2ZmZmZmZiA+Pj4gcikgPDwgcik7XG4gICAgdmFyIG1hc2tlZFdvcmRzID0gZXh0ZW5kZWQ7XG5cbiAgICBoIC09IHM7XG4gICAgaCA9IE1hdGgubWF4KDAsIGgpO1xuXG4gICAgLy8gRXh0ZW5kZWQgbW9kZSwgY29weSBtYXNrZWQgcGFydFxuICAgIGlmIChtYXNrZWRXb3Jkcykge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzOyBpKyspIHtcbiAgICAgICAgbWFza2VkV29yZHMud29yZHNbaV0gPSB0aGlzLndvcmRzW2ldO1xuICAgICAgfVxuICAgICAgbWFza2VkV29yZHMubGVuZ3RoID0gcztcbiAgICB9XG5cbiAgICBpZiAocyA9PT0gMCkge1xuICAgICAgLy8gTm8tb3AsIHdlIHNob3VsZCBub3QgbW92ZSBhbnl0aGluZyBhdCBhbGxcbiAgICB9IGVsc2UgaWYgKHRoaXMubGVuZ3RoID4gcykge1xuICAgICAgdGhpcy5sZW5ndGggLT0gcztcbiAgICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRoaXMud29yZHNbaV0gPSB0aGlzLndvcmRzW2kgKyBzXTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy53b3Jkc1swXSA9IDA7XG4gICAgICB0aGlzLmxlbmd0aCA9IDE7XG4gICAgfVxuXG4gICAgdmFyIGNhcnJ5ID0gMDtcbiAgICBmb3IgKGkgPSB0aGlzLmxlbmd0aCAtIDE7IGkgPj0gMCAmJiAoY2FycnkgIT09IDAgfHwgaSA+PSBoKTsgaS0tKSB7XG4gICAgICB2YXIgd29yZCA9IHRoaXMud29yZHNbaV0gfCAwO1xuICAgICAgdGhpcy53b3Jkc1tpXSA9IChjYXJyeSA8PCAoMjYgLSByKSkgfCAod29yZCA+Pj4gcik7XG4gICAgICBjYXJyeSA9IHdvcmQgJiBtYXNrO1xuICAgIH1cblxuICAgIC8vIFB1c2ggY2FycmllZCBiaXRzIGFzIGEgbWFza1xuICAgIGlmIChtYXNrZWRXb3JkcyAmJiBjYXJyeSAhPT0gMCkge1xuICAgICAgbWFza2VkV29yZHMud29yZHNbbWFza2VkV29yZHMubGVuZ3RoKytdID0gY2Fycnk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLndvcmRzWzBdID0gMDtcbiAgICAgIHRoaXMubGVuZ3RoID0gMTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zdHJpcCgpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5pc2hybiA9IGZ1bmN0aW9uIGlzaHJuIChiaXRzLCBoaW50LCBleHRlbmRlZCkge1xuICAgIC8vIFRPRE8oaW5kdXRueSk6IGltcGxlbWVudCBtZVxuICAgIGFzc2VydCh0aGlzLm5lZ2F0aXZlID09PSAwKTtcbiAgICByZXR1cm4gdGhpcy5pdXNocm4oYml0cywgaGludCwgZXh0ZW5kZWQpO1xuICB9O1xuXG4gIC8vIFNoaWZ0LWxlZnRcbiAgQk4ucHJvdG90eXBlLnNobG4gPSBmdW5jdGlvbiBzaGxuIChiaXRzKSB7XG4gICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5pc2hsbihiaXRzKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUudXNobG4gPSBmdW5jdGlvbiB1c2hsbiAoYml0cykge1xuICAgIHJldHVybiB0aGlzLmNsb25lKCkuaXVzaGxuKGJpdHMpO1xuICB9O1xuXG4gIC8vIFNoaWZ0LXJpZ2h0XG4gIEJOLnByb3RvdHlwZS5zaHJuID0gZnVuY3Rpb24gc2hybiAoYml0cykge1xuICAgIHJldHVybiB0aGlzLmNsb25lKCkuaXNocm4oYml0cyk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnVzaHJuID0gZnVuY3Rpb24gdXNocm4gKGJpdHMpIHtcbiAgICByZXR1cm4gdGhpcy5jbG9uZSgpLml1c2hybihiaXRzKTtcbiAgfTtcblxuICAvLyBUZXN0IGlmIG4gYml0IGlzIHNldFxuICBCTi5wcm90b3R5cGUudGVzdG4gPSBmdW5jdGlvbiB0ZXN0biAoYml0KSB7XG4gICAgYXNzZXJ0KHR5cGVvZiBiaXQgPT09ICdudW1iZXInICYmIGJpdCA+PSAwKTtcbiAgICB2YXIgciA9IGJpdCAlIDI2O1xuICAgIHZhciBzID0gKGJpdCAtIHIpIC8gMjY7XG4gICAgdmFyIHEgPSAxIDw8IHI7XG5cbiAgICAvLyBGYXN0IGNhc2U6IGJpdCBpcyBtdWNoIGhpZ2hlciB0aGFuIGFsbCBleGlzdGluZyB3b3Jkc1xuICAgIGlmICh0aGlzLmxlbmd0aCA8PSBzKSByZXR1cm4gZmFsc2U7XG5cbiAgICAvLyBDaGVjayBiaXQgYW5kIHJldHVyblxuICAgIHZhciB3ID0gdGhpcy53b3Jkc1tzXTtcblxuICAgIHJldHVybiAhISh3ICYgcSk7XG4gIH07XG5cbiAgLy8gUmV0dXJuIG9ubHkgbG93ZXJzIGJpdHMgb2YgbnVtYmVyIChpbi1wbGFjZSlcbiAgQk4ucHJvdG90eXBlLmltYXNrbiA9IGZ1bmN0aW9uIGltYXNrbiAoYml0cykge1xuICAgIGFzc2VydCh0eXBlb2YgYml0cyA9PT0gJ251bWJlcicgJiYgYml0cyA+PSAwKTtcbiAgICB2YXIgciA9IGJpdHMgJSAyNjtcbiAgICB2YXIgcyA9IChiaXRzIC0gcikgLyAyNjtcblxuICAgIGFzc2VydCh0aGlzLm5lZ2F0aXZlID09PSAwLCAnaW1hc2tuIHdvcmtzIG9ubHkgd2l0aCBwb3NpdGl2ZSBudW1iZXJzJyk7XG5cbiAgICBpZiAociAhPT0gMCkge1xuICAgICAgcysrO1xuICAgIH1cbiAgICB0aGlzLmxlbmd0aCA9IE1hdGgubWluKHMsIHRoaXMubGVuZ3RoKTtcblxuICAgIGlmIChyICE9PSAwKSB7XG4gICAgICB2YXIgbWFzayA9IDB4M2ZmZmZmZiBeICgoMHgzZmZmZmZmID4+PiByKSA8PCByKTtcbiAgICAgIHRoaXMud29yZHNbdGhpcy5sZW5ndGggLSAxXSAmPSBtYXNrO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnN0cmlwKCk7XG4gIH07XG5cbiAgLy8gUmV0dXJuIG9ubHkgbG93ZXJzIGJpdHMgb2YgbnVtYmVyXG4gIEJOLnByb3RvdHlwZS5tYXNrbiA9IGZ1bmN0aW9uIG1hc2tuIChiaXRzKSB7XG4gICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5pbWFza24oYml0cyk7XG4gIH07XG5cbiAgLy8gQWRkIHBsYWluIG51bWJlciBgbnVtYCB0byBgdGhpc2BcbiAgQk4ucHJvdG90eXBlLmlhZGRuID0gZnVuY3Rpb24gaWFkZG4gKG51bSkge1xuICAgIGFzc2VydCh0eXBlb2YgbnVtID09PSAnbnVtYmVyJyk7XG4gICAgYXNzZXJ0KG51bSA8IDB4NDAwMDAwMCk7XG4gICAgaWYgKG51bSA8IDApIHJldHVybiB0aGlzLmlzdWJuKC1udW0pO1xuXG4gICAgLy8gUG9zc2libGUgc2lnbiBjaGFuZ2VcbiAgICBpZiAodGhpcy5uZWdhdGl2ZSAhPT0gMCkge1xuICAgICAgaWYgKHRoaXMubGVuZ3RoID09PSAxICYmICh0aGlzLndvcmRzWzBdIHwgMCkgPCBudW0pIHtcbiAgICAgICAgdGhpcy53b3Jkc1swXSA9IG51bSAtICh0aGlzLndvcmRzWzBdIHwgMCk7XG4gICAgICAgIHRoaXMubmVnYXRpdmUgPSAwO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cblxuICAgICAgdGhpcy5uZWdhdGl2ZSA9IDA7XG4gICAgICB0aGlzLmlzdWJuKG51bSk7XG4gICAgICB0aGlzLm5lZ2F0aXZlID0gMTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8vIEFkZCB3aXRob3V0IGNoZWNrc1xuICAgIHJldHVybiB0aGlzLl9pYWRkbihudW0pO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5faWFkZG4gPSBmdW5jdGlvbiBfaWFkZG4gKG51bSkge1xuICAgIHRoaXMud29yZHNbMF0gKz0gbnVtO1xuXG4gICAgLy8gQ2FycnlcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoICYmIHRoaXMud29yZHNbaV0gPj0gMHg0MDAwMDAwOyBpKyspIHtcbiAgICAgIHRoaXMud29yZHNbaV0gLT0gMHg0MDAwMDAwO1xuICAgICAgaWYgKGkgPT09IHRoaXMubGVuZ3RoIC0gMSkge1xuICAgICAgICB0aGlzLndvcmRzW2kgKyAxXSA9IDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLndvcmRzW2kgKyAxXSsrO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmxlbmd0aCA9IE1hdGgubWF4KHRoaXMubGVuZ3RoLCBpICsgMSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvLyBTdWJ0cmFjdCBwbGFpbiBudW1iZXIgYG51bWAgZnJvbSBgdGhpc2BcbiAgQk4ucHJvdG90eXBlLmlzdWJuID0gZnVuY3Rpb24gaXN1Ym4gKG51bSkge1xuICAgIGFzc2VydCh0eXBlb2YgbnVtID09PSAnbnVtYmVyJyk7XG4gICAgYXNzZXJ0KG51bSA8IDB4NDAwMDAwMCk7XG4gICAgaWYgKG51bSA8IDApIHJldHVybiB0aGlzLmlhZGRuKC1udW0pO1xuXG4gICAgaWYgKHRoaXMubmVnYXRpdmUgIT09IDApIHtcbiAgICAgIHRoaXMubmVnYXRpdmUgPSAwO1xuICAgICAgdGhpcy5pYWRkbihudW0pO1xuICAgICAgdGhpcy5uZWdhdGl2ZSA9IDE7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICB0aGlzLndvcmRzWzBdIC09IG51bTtcblxuICAgIGlmICh0aGlzLmxlbmd0aCA9PT0gMSAmJiB0aGlzLndvcmRzWzBdIDwgMCkge1xuICAgICAgdGhpcy53b3Jkc1swXSA9IC10aGlzLndvcmRzWzBdO1xuICAgICAgdGhpcy5uZWdhdGl2ZSA9IDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIENhcnJ5XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoICYmIHRoaXMud29yZHNbaV0gPCAwOyBpKyspIHtcbiAgICAgICAgdGhpcy53b3Jkc1tpXSArPSAweDQwMDAwMDA7XG4gICAgICAgIHRoaXMud29yZHNbaSArIDFdIC09IDE7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc3RyaXAoKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuYWRkbiA9IGZ1bmN0aW9uIGFkZG4gKG51bSkge1xuICAgIHJldHVybiB0aGlzLmNsb25lKCkuaWFkZG4obnVtKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuc3VibiA9IGZ1bmN0aW9uIHN1Ym4gKG51bSkge1xuICAgIHJldHVybiB0aGlzLmNsb25lKCkuaXN1Ym4obnVtKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuaWFicyA9IGZ1bmN0aW9uIGlhYnMgKCkge1xuICAgIHRoaXMubmVnYXRpdmUgPSAwO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmFicyA9IGZ1bmN0aW9uIGFicyAoKSB7XG4gICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5pYWJzKCk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLl9pc2hsbnN1Ym11bCA9IGZ1bmN0aW9uIF9pc2hsbnN1Ym11bCAobnVtLCBtdWwsIHNoaWZ0KSB7XG4gICAgLy8gQmlnZ2VyIHN0b3JhZ2UgaXMgbmVlZGVkXG4gICAgdmFyIGxlbiA9IG51bS5sZW5ndGggKyBzaGlmdDtcbiAgICB2YXIgaTtcbiAgICBpZiAodGhpcy53b3Jkcy5sZW5ndGggPCBsZW4pIHtcbiAgICAgIHZhciB0ID0gbmV3IEFycmF5KGxlbik7XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB0W2ldID0gdGhpcy53b3Jkc1tpXTtcbiAgICAgIH1cbiAgICAgIHRoaXMud29yZHMgPSB0O1xuICAgIH0gZWxzZSB7XG4gICAgICBpID0gdGhpcy5sZW5ndGg7XG4gICAgfVxuXG4gICAgLy8gWmVyb2lmeSByZXN0XG4gICAgdGhpcy5sZW5ndGggPSBNYXRoLm1heCh0aGlzLmxlbmd0aCwgbGVuKTtcbiAgICBmb3IgKDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMud29yZHNbaV0gPSAwO1xuICAgIH1cblxuICAgIHZhciB3O1xuICAgIHZhciBjYXJyeSA9IDA7XG4gICAgZm9yIChpID0gMDsgaSA8IG51bS5sZW5ndGg7IGkrKykge1xuICAgICAgdyA9ICh0aGlzLndvcmRzW2kgKyBzaGlmdF0gfCAwKSArIGNhcnJ5O1xuICAgICAgdmFyIHJpZ2h0ID0gKG51bS53b3Jkc1tpXSB8IDApICogbXVsO1xuICAgICAgdyAtPSByaWdodCAmIDB4M2ZmZmZmZjtcbiAgICAgIGNhcnJ5ID0gKHcgPj4gMjYpIC0gKChyaWdodCAvIDB4NDAwMDAwMCkgfCAwKTtcbiAgICAgIHRoaXMud29yZHNbaSArIHNoaWZ0XSA9IHcgJiAweDNmZmZmZmY7XG4gICAgfVxuICAgIGZvciAoOyBpIDwgdGhpcy5sZW5ndGggLSBzaGlmdDsgaSsrKSB7XG4gICAgICB3ID0gKHRoaXMud29yZHNbaSArIHNoaWZ0XSB8IDApICsgY2Fycnk7XG4gICAgICBjYXJyeSA9IHcgPj4gMjY7XG4gICAgICB0aGlzLndvcmRzW2kgKyBzaGlmdF0gPSB3ICYgMHgzZmZmZmZmO1xuICAgIH1cblxuICAgIGlmIChjYXJyeSA9PT0gMCkgcmV0dXJuIHRoaXMuc3RyaXAoKTtcblxuICAgIC8vIFN1YnRyYWN0aW9uIG92ZXJmbG93XG4gICAgYXNzZXJ0KGNhcnJ5ID09PSAtMSk7XG4gICAgY2FycnkgPSAwO1xuICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB3ID0gLSh0aGlzLndvcmRzW2ldIHwgMCkgKyBjYXJyeTtcbiAgICAgIGNhcnJ5ID0gdyA+PiAyNjtcbiAgICAgIHRoaXMud29yZHNbaV0gPSB3ICYgMHgzZmZmZmZmO1xuICAgIH1cbiAgICB0aGlzLm5lZ2F0aXZlID0gMTtcblxuICAgIHJldHVybiB0aGlzLnN0cmlwKCk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLl93b3JkRGl2ID0gZnVuY3Rpb24gX3dvcmREaXYgKG51bSwgbW9kZSkge1xuICAgIHZhciBzaGlmdCA9IHRoaXMubGVuZ3RoIC0gbnVtLmxlbmd0aDtcblxuICAgIHZhciBhID0gdGhpcy5jbG9uZSgpO1xuICAgIHZhciBiID0gbnVtO1xuXG4gICAgLy8gTm9ybWFsaXplXG4gICAgdmFyIGJoaSA9IGIud29yZHNbYi5sZW5ndGggLSAxXSB8IDA7XG4gICAgdmFyIGJoaUJpdHMgPSB0aGlzLl9jb3VudEJpdHMoYmhpKTtcbiAgICBzaGlmdCA9IDI2IC0gYmhpQml0cztcbiAgICBpZiAoc2hpZnQgIT09IDApIHtcbiAgICAgIGIgPSBiLnVzaGxuKHNoaWZ0KTtcbiAgICAgIGEuaXVzaGxuKHNoaWZ0KTtcbiAgICAgIGJoaSA9IGIud29yZHNbYi5sZW5ndGggLSAxXSB8IDA7XG4gICAgfVxuXG4gICAgLy8gSW5pdGlhbGl6ZSBxdW90aWVudFxuICAgIHZhciBtID0gYS5sZW5ndGggLSBiLmxlbmd0aDtcbiAgICB2YXIgcTtcblxuICAgIGlmIChtb2RlICE9PSAnbW9kJykge1xuICAgICAgcSA9IG5ldyBCTihudWxsKTtcbiAgICAgIHEubGVuZ3RoID0gbSArIDE7XG4gICAgICBxLndvcmRzID0gbmV3IEFycmF5KHEubGVuZ3RoKTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcS5sZW5ndGg7IGkrKykge1xuICAgICAgICBxLndvcmRzW2ldID0gMDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgZGlmZiA9IGEuY2xvbmUoKS5faXNobG5zdWJtdWwoYiwgMSwgbSk7XG4gICAgaWYgKGRpZmYubmVnYXRpdmUgPT09IDApIHtcbiAgICAgIGEgPSBkaWZmO1xuICAgICAgaWYgKHEpIHtcbiAgICAgICAgcS53b3Jkc1ttXSA9IDE7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaiA9IG0gLSAxOyBqID49IDA7IGotLSkge1xuICAgICAgdmFyIHFqID0gKGEud29yZHNbYi5sZW5ndGggKyBqXSB8IDApICogMHg0MDAwMDAwICtcbiAgICAgICAgKGEud29yZHNbYi5sZW5ndGggKyBqIC0gMV0gfCAwKTtcblxuICAgICAgLy8gTk9URTogKHFqIC8gYmhpKSBpcyAoMHgzZmZmZmZmICogMHg0MDAwMDAwICsgMHgzZmZmZmZmKSAvIDB4MjAwMDAwMCBtYXhcbiAgICAgIC8vICgweDdmZmZmZmYpXG4gICAgICBxaiA9IE1hdGgubWluKChxaiAvIGJoaSkgfCAwLCAweDNmZmZmZmYpO1xuXG4gICAgICBhLl9pc2hsbnN1Ym11bChiLCBxaiwgaik7XG4gICAgICB3aGlsZSAoYS5uZWdhdGl2ZSAhPT0gMCkge1xuICAgICAgICBxai0tO1xuICAgICAgICBhLm5lZ2F0aXZlID0gMDtcbiAgICAgICAgYS5faXNobG5zdWJtdWwoYiwgMSwgaik7XG4gICAgICAgIGlmICghYS5pc1plcm8oKSkge1xuICAgICAgICAgIGEubmVnYXRpdmUgXj0gMTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHEpIHtcbiAgICAgICAgcS53b3Jkc1tqXSA9IHFqO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAocSkge1xuICAgICAgcS5zdHJpcCgpO1xuICAgIH1cbiAgICBhLnN0cmlwKCk7XG5cbiAgICAvLyBEZW5vcm1hbGl6ZVxuICAgIGlmIChtb2RlICE9PSAnZGl2JyAmJiBzaGlmdCAhPT0gMCkge1xuICAgICAgYS5pdXNocm4oc2hpZnQpO1xuICAgIH1cblxuICAgIHJldHVybiB7IGRpdjogcSB8fCBudWxsLCBtb2Q6IGEgfTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuZGl2bW9kID0gZnVuY3Rpb24gZGl2bW9kIChudW0sIG1vZGUsIHBvc2l0aXZlKSB7XG4gICAgYXNzZXJ0KCFudW0uaXNaZXJvKCkpO1xuXG4gICAgdmFyIGRpdiwgbW9kLCByZXM7XG4gICAgaWYgKHRoaXMubmVnYXRpdmUgIT09IDAgJiYgbnVtLm5lZ2F0aXZlID09PSAwKSB7XG4gICAgICByZXMgPSB0aGlzLm5lZygpLmRpdm1vZChudW0sIG1vZGUpO1xuXG4gICAgICBpZiAobW9kZSAhPT0gJ21vZCcpIHtcbiAgICAgICAgZGl2ID0gcmVzLmRpdi5uZWcoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG1vZGUgIT09ICdkaXYnKSB7XG4gICAgICAgIG1vZCA9IHJlcy5tb2QubmVnKCk7XG4gICAgICAgIGlmIChwb3NpdGl2ZSAmJiBtb2QubmVnYXRpdmUgIT09IDApIHtcbiAgICAgICAgICBtb2QuaWFkZChudW0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRpdjogZGl2LFxuICAgICAgICBtb2Q6IG1vZFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5uZWdhdGl2ZSA9PT0gMCAmJiBudW0ubmVnYXRpdmUgIT09IDApIHtcbiAgICAgIHJlcyA9IHRoaXMuZGl2bW9kKG51bS5uZWcoKSwgbW9kZSk7XG5cbiAgICAgIGlmIChtb2RlICE9PSAnbW9kJykge1xuICAgICAgICBkaXYgPSByZXMuZGl2Lm5lZygpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4geyBkaXY6IGRpdiwgbW9kOiByZXMubW9kIH07XG4gICAgfVxuXG4gICAgaWYgKCh0aGlzLm5lZ2F0aXZlICYgbnVtLm5lZ2F0aXZlKSAhPT0gMCkge1xuICAgICAgcmVzID0gdGhpcy5uZWcoKS5kaXZtb2QobnVtLm5lZygpLCBtb2RlKTtcblxuICAgICAgaWYgKG1vZGUgIT09ICdkaXYnKSB7XG4gICAgICAgIG1vZCA9IHJlcy5tb2QubmVnKCk7XG4gICAgICAgIGlmIChwb3NpdGl2ZSAmJiBtb2QubmVnYXRpdmUgIT09IDApIHtcbiAgICAgICAgICBtb2QuaXN1YihudW0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRpdjogcmVzLmRpdixcbiAgICAgICAgbW9kOiBtb2RcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gQm90aCBudW1iZXJzIGFyZSBwb3NpdGl2ZSBhdCB0aGlzIHBvaW50XG5cbiAgICAvLyBTdHJpcCBib3RoIG51bWJlcnMgdG8gYXBwcm94aW1hdGUgc2hpZnQgdmFsdWVcbiAgICBpZiAobnVtLmxlbmd0aCA+IHRoaXMubGVuZ3RoIHx8IHRoaXMuY21wKG51bSkgPCAwKSB7XG4gICAgICByZXR1cm4geyBkaXY6IG5ldyBCTigwKSwgbW9kOiB0aGlzIH07XG4gICAgfVxuXG4gICAgLy8gVmVyeSBzaG9ydCByZWR1Y3Rpb25cbiAgICBpZiAobnVtLmxlbmd0aCA9PT0gMSkge1xuICAgICAgaWYgKG1vZGUgPT09ICdkaXYnKSB7XG4gICAgICAgIHJldHVybiB7IGRpdjogdGhpcy5kaXZuKG51bS53b3Jkc1swXSksIG1vZDogbnVsbCB9O1xuICAgICAgfVxuXG4gICAgICBpZiAobW9kZSA9PT0gJ21vZCcpIHtcbiAgICAgICAgcmV0dXJuIHsgZGl2OiBudWxsLCBtb2Q6IG5ldyBCTih0aGlzLm1vZG4obnVtLndvcmRzWzBdKSkgfTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGl2OiB0aGlzLmRpdm4obnVtLndvcmRzWzBdKSxcbiAgICAgICAgbW9kOiBuZXcgQk4odGhpcy5tb2RuKG51bS53b3Jkc1swXSkpXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl93b3JkRGl2KG51bSwgbW9kZSk7XG4gIH07XG5cbiAgLy8gRmluZCBgdGhpc2AgLyBgbnVtYFxuICBCTi5wcm90b3R5cGUuZGl2ID0gZnVuY3Rpb24gZGl2IChudW0pIHtcbiAgICByZXR1cm4gdGhpcy5kaXZtb2QobnVtLCAnZGl2JywgZmFsc2UpLmRpdjtcbiAgfTtcblxuICAvLyBGaW5kIGB0aGlzYCAlIGBudW1gXG4gIEJOLnByb3RvdHlwZS5tb2QgPSBmdW5jdGlvbiBtb2QgKG51bSkge1xuICAgIHJldHVybiB0aGlzLmRpdm1vZChudW0sICdtb2QnLCBmYWxzZSkubW9kO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS51bW9kID0gZnVuY3Rpb24gdW1vZCAobnVtKSB7XG4gICAgcmV0dXJuIHRoaXMuZGl2bW9kKG51bSwgJ21vZCcsIHRydWUpLm1vZDtcbiAgfTtcblxuICAvLyBGaW5kIFJvdW5kKGB0aGlzYCAvIGBudW1gKVxuICBCTi5wcm90b3R5cGUuZGl2Um91bmQgPSBmdW5jdGlvbiBkaXZSb3VuZCAobnVtKSB7XG4gICAgdmFyIGRtID0gdGhpcy5kaXZtb2QobnVtKTtcblxuICAgIC8vIEZhc3QgY2FzZSAtIGV4YWN0IGRpdmlzaW9uXG4gICAgaWYgKGRtLm1vZC5pc1plcm8oKSkgcmV0dXJuIGRtLmRpdjtcblxuICAgIHZhciBtb2QgPSBkbS5kaXYubmVnYXRpdmUgIT09IDAgPyBkbS5tb2QuaXN1YihudW0pIDogZG0ubW9kO1xuXG4gICAgdmFyIGhhbGYgPSBudW0udXNocm4oMSk7XG4gICAgdmFyIHIyID0gbnVtLmFuZGxuKDEpO1xuICAgIHZhciBjbXAgPSBtb2QuY21wKGhhbGYpO1xuXG4gICAgLy8gUm91bmQgZG93blxuICAgIGlmIChjbXAgPCAwIHx8IHIyID09PSAxICYmIGNtcCA9PT0gMCkgcmV0dXJuIGRtLmRpdjtcblxuICAgIC8vIFJvdW5kIHVwXG4gICAgcmV0dXJuIGRtLmRpdi5uZWdhdGl2ZSAhPT0gMCA/IGRtLmRpdi5pc3VibigxKSA6IGRtLmRpdi5pYWRkbigxKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUubW9kbiA9IGZ1bmN0aW9uIG1vZG4gKG51bSkge1xuICAgIGFzc2VydChudW0gPD0gMHgzZmZmZmZmKTtcbiAgICB2YXIgcCA9ICgxIDw8IDI2KSAlIG51bTtcblxuICAgIHZhciBhY2MgPSAwO1xuICAgIGZvciAodmFyIGkgPSB0aGlzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBhY2MgPSAocCAqIGFjYyArICh0aGlzLndvcmRzW2ldIHwgMCkpICUgbnVtO1xuICAgIH1cblxuICAgIHJldHVybiBhY2M7XG4gIH07XG5cbiAgLy8gSW4tcGxhY2UgZGl2aXNpb24gYnkgbnVtYmVyXG4gIEJOLnByb3RvdHlwZS5pZGl2biA9IGZ1bmN0aW9uIGlkaXZuIChudW0pIHtcbiAgICBhc3NlcnQobnVtIDw9IDB4M2ZmZmZmZik7XG5cbiAgICB2YXIgY2FycnkgPSAwO1xuICAgIGZvciAodmFyIGkgPSB0aGlzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB2YXIgdyA9ICh0aGlzLndvcmRzW2ldIHwgMCkgKyBjYXJyeSAqIDB4NDAwMDAwMDtcbiAgICAgIHRoaXMud29yZHNbaV0gPSAodyAvIG51bSkgfCAwO1xuICAgICAgY2FycnkgPSB3ICUgbnVtO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnN0cmlwKCk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmRpdm4gPSBmdW5jdGlvbiBkaXZuIChudW0pIHtcbiAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmlkaXZuKG51bSk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmVnY2QgPSBmdW5jdGlvbiBlZ2NkIChwKSB7XG4gICAgYXNzZXJ0KHAubmVnYXRpdmUgPT09IDApO1xuICAgIGFzc2VydCghcC5pc1plcm8oKSk7XG5cbiAgICB2YXIgeCA9IHRoaXM7XG4gICAgdmFyIHkgPSBwLmNsb25lKCk7XG5cbiAgICBpZiAoeC5uZWdhdGl2ZSAhPT0gMCkge1xuICAgICAgeCA9IHgudW1vZChwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgeCA9IHguY2xvbmUoKTtcbiAgICB9XG5cbiAgICAvLyBBICogeCArIEIgKiB5ID0geFxuICAgIHZhciBBID0gbmV3IEJOKDEpO1xuICAgIHZhciBCID0gbmV3IEJOKDApO1xuXG4gICAgLy8gQyAqIHggKyBEICogeSA9IHlcbiAgICB2YXIgQyA9IG5ldyBCTigwKTtcbiAgICB2YXIgRCA9IG5ldyBCTigxKTtcblxuICAgIHZhciBnID0gMDtcblxuICAgIHdoaWxlICh4LmlzRXZlbigpICYmIHkuaXNFdmVuKCkpIHtcbiAgICAgIHguaXVzaHJuKDEpO1xuICAgICAgeS5pdXNocm4oMSk7XG4gICAgICArK2c7XG4gICAgfVxuXG4gICAgdmFyIHlwID0geS5jbG9uZSgpO1xuICAgIHZhciB4cCA9IHguY2xvbmUoKTtcblxuICAgIHdoaWxlICgheC5pc1plcm8oKSkge1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGltID0gMTsgKHgud29yZHNbMF0gJiBpbSkgPT09IDAgJiYgaSA8IDI2OyArK2ksIGltIDw8PSAxKTtcbiAgICAgIGlmIChpID4gMCkge1xuICAgICAgICB4Lml1c2hybihpKTtcbiAgICAgICAgd2hpbGUgKGktLSA+IDApIHtcbiAgICAgICAgICBpZiAoQS5pc09kZCgpIHx8IEIuaXNPZGQoKSkge1xuICAgICAgICAgICAgQS5pYWRkKHlwKTtcbiAgICAgICAgICAgIEIuaXN1Yih4cCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgQS5pdXNocm4oMSk7XG4gICAgICAgICAgQi5pdXNocm4oMSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgaiA9IDAsIGptID0gMTsgKHkud29yZHNbMF0gJiBqbSkgPT09IDAgJiYgaiA8IDI2OyArK2osIGptIDw8PSAxKTtcbiAgICAgIGlmIChqID4gMCkge1xuICAgICAgICB5Lml1c2hybihqKTtcbiAgICAgICAgd2hpbGUgKGotLSA+IDApIHtcbiAgICAgICAgICBpZiAoQy5pc09kZCgpIHx8IEQuaXNPZGQoKSkge1xuICAgICAgICAgICAgQy5pYWRkKHlwKTtcbiAgICAgICAgICAgIEQuaXN1Yih4cCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgQy5pdXNocm4oMSk7XG4gICAgICAgICAgRC5pdXNocm4oMSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHguY21wKHkpID49IDApIHtcbiAgICAgICAgeC5pc3ViKHkpO1xuICAgICAgICBBLmlzdWIoQyk7XG4gICAgICAgIEIuaXN1YihEKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHkuaXN1Yih4KTtcbiAgICAgICAgQy5pc3ViKEEpO1xuICAgICAgICBELmlzdWIoQik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGE6IEMsXG4gICAgICBiOiBELFxuICAgICAgZ2NkOiB5Lml1c2hsbihnKVxuICAgIH07XG4gIH07XG5cbiAgLy8gVGhpcyBpcyByZWR1Y2VkIGluY2FybmF0aW9uIG9mIHRoZSBiaW5hcnkgRUVBXG4gIC8vIGFib3ZlLCBkZXNpZ25hdGVkIHRvIGludmVydCBtZW1iZXJzIG9mIHRoZVxuICAvLyBfcHJpbWVfIGZpZWxkcyBGKHApIGF0IGEgbWF4aW1hbCBzcGVlZFxuICBCTi5wcm90b3R5cGUuX2ludm1wID0gZnVuY3Rpb24gX2ludm1wIChwKSB7XG4gICAgYXNzZXJ0KHAubmVnYXRpdmUgPT09IDApO1xuICAgIGFzc2VydCghcC5pc1plcm8oKSk7XG5cbiAgICB2YXIgYSA9IHRoaXM7XG4gICAgdmFyIGIgPSBwLmNsb25lKCk7XG5cbiAgICBpZiAoYS5uZWdhdGl2ZSAhPT0gMCkge1xuICAgICAgYSA9IGEudW1vZChwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYSA9IGEuY2xvbmUoKTtcbiAgICB9XG5cbiAgICB2YXIgeDEgPSBuZXcgQk4oMSk7XG4gICAgdmFyIHgyID0gbmV3IEJOKDApO1xuXG4gICAgdmFyIGRlbHRhID0gYi5jbG9uZSgpO1xuXG4gICAgd2hpbGUgKGEuY21wbigxKSA+IDAgJiYgYi5jbXBuKDEpID4gMCkge1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGltID0gMTsgKGEud29yZHNbMF0gJiBpbSkgPT09IDAgJiYgaSA8IDI2OyArK2ksIGltIDw8PSAxKTtcbiAgICAgIGlmIChpID4gMCkge1xuICAgICAgICBhLml1c2hybihpKTtcbiAgICAgICAgd2hpbGUgKGktLSA+IDApIHtcbiAgICAgICAgICBpZiAoeDEuaXNPZGQoKSkge1xuICAgICAgICAgICAgeDEuaWFkZChkZWx0YSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgeDEuaXVzaHJuKDEpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIGogPSAwLCBqbSA9IDE7IChiLndvcmRzWzBdICYgam0pID09PSAwICYmIGogPCAyNjsgKytqLCBqbSA8PD0gMSk7XG4gICAgICBpZiAoaiA+IDApIHtcbiAgICAgICAgYi5pdXNocm4oaik7XG4gICAgICAgIHdoaWxlIChqLS0gPiAwKSB7XG4gICAgICAgICAgaWYgKHgyLmlzT2RkKCkpIHtcbiAgICAgICAgICAgIHgyLmlhZGQoZGVsdGEpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHgyLml1c2hybigxKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoYS5jbXAoYikgPj0gMCkge1xuICAgICAgICBhLmlzdWIoYik7XG4gICAgICAgIHgxLmlzdWIoeDIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYi5pc3ViKGEpO1xuICAgICAgICB4Mi5pc3ViKHgxKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgcmVzO1xuICAgIGlmIChhLmNtcG4oMSkgPT09IDApIHtcbiAgICAgIHJlcyA9IHgxO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXMgPSB4MjtcbiAgICB9XG5cbiAgICBpZiAocmVzLmNtcG4oMCkgPCAwKSB7XG4gICAgICByZXMuaWFkZChwKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5nY2QgPSBmdW5jdGlvbiBnY2QgKG51bSkge1xuICAgIGlmICh0aGlzLmlzWmVybygpKSByZXR1cm4gbnVtLmNsb25lKCk7XG4gICAgaWYgKG51bS5pc1plcm8oKSkgcmV0dXJuIHRoaXMuY2xvbmUoKTtcblxuICAgIHZhciBhID0gdGhpcy5jbG9uZSgpO1xuICAgIHZhciBiID0gbnVtLmNsb25lKCk7XG4gICAgYS5uZWdhdGl2ZSA9IDA7XG4gICAgYi5uZWdhdGl2ZSA9IDA7XG5cbiAgICAvLyBSZW1vdmUgY29tbW9uIGZhY3RvciBvZiB0d29cbiAgICBmb3IgKHZhciBzaGlmdCA9IDA7IGEuaXNFdmVuKCkgJiYgYi5pc0V2ZW4oKTsgc2hpZnQrKykge1xuICAgICAgYS5pdXNocm4oMSk7XG4gICAgICBiLml1c2hybigxKTtcbiAgICB9XG5cbiAgICBkbyB7XG4gICAgICB3aGlsZSAoYS5pc0V2ZW4oKSkge1xuICAgICAgICBhLml1c2hybigxKTtcbiAgICAgIH1cbiAgICAgIHdoaWxlIChiLmlzRXZlbigpKSB7XG4gICAgICAgIGIuaXVzaHJuKDEpO1xuICAgICAgfVxuXG4gICAgICB2YXIgciA9IGEuY21wKGIpO1xuICAgICAgaWYgKHIgPCAwKSB7XG4gICAgICAgIC8vIFN3YXAgYGFgIGFuZCBgYmAgdG8gbWFrZSBgYWAgYWx3YXlzIGJpZ2dlciB0aGFuIGBiYFxuICAgICAgICB2YXIgdCA9IGE7XG4gICAgICAgIGEgPSBiO1xuICAgICAgICBiID0gdDtcbiAgICAgIH0gZWxzZSBpZiAociA9PT0gMCB8fCBiLmNtcG4oMSkgPT09IDApIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGEuaXN1YihiKTtcbiAgICB9IHdoaWxlICh0cnVlKTtcblxuICAgIHJldHVybiBiLml1c2hsbihzaGlmdCk7XG4gIH07XG5cbiAgLy8gSW52ZXJ0IG51bWJlciBpbiB0aGUgZmllbGQgRihudW0pXG4gIEJOLnByb3RvdHlwZS5pbnZtID0gZnVuY3Rpb24gaW52bSAobnVtKSB7XG4gICAgcmV0dXJuIHRoaXMuZWdjZChudW0pLmEudW1vZChudW0pO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5pc0V2ZW4gPSBmdW5jdGlvbiBpc0V2ZW4gKCkge1xuICAgIHJldHVybiAodGhpcy53b3Jkc1swXSAmIDEpID09PSAwO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5pc09kZCA9IGZ1bmN0aW9uIGlzT2RkICgpIHtcbiAgICByZXR1cm4gKHRoaXMud29yZHNbMF0gJiAxKSA9PT0gMTtcbiAgfTtcblxuICAvLyBBbmQgZmlyc3Qgd29yZCBhbmQgbnVtXG4gIEJOLnByb3RvdHlwZS5hbmRsbiA9IGZ1bmN0aW9uIGFuZGxuIChudW0pIHtcbiAgICByZXR1cm4gdGhpcy53b3Jkc1swXSAmIG51bTtcbiAgfTtcblxuICAvLyBJbmNyZW1lbnQgYXQgdGhlIGJpdCBwb3NpdGlvbiBpbi1saW5lXG4gIEJOLnByb3RvdHlwZS5iaW5jbiA9IGZ1bmN0aW9uIGJpbmNuIChiaXQpIHtcbiAgICBhc3NlcnQodHlwZW9mIGJpdCA9PT0gJ251bWJlcicpO1xuICAgIHZhciByID0gYml0ICUgMjY7XG4gICAgdmFyIHMgPSAoYml0IC0gcikgLyAyNjtcbiAgICB2YXIgcSA9IDEgPDwgcjtcblxuICAgIC8vIEZhc3QgY2FzZTogYml0IGlzIG11Y2ggaGlnaGVyIHRoYW4gYWxsIGV4aXN0aW5nIHdvcmRzXG4gICAgaWYgKHRoaXMubGVuZ3RoIDw9IHMpIHtcbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLmxlbmd0aDsgaSA8IHMgKyAxOyBpKyspIHtcbiAgICAgICAgdGhpcy53b3Jkc1tpXSA9IDA7XG4gICAgICB9XG4gICAgICB0aGlzLndvcmRzW3NdIHw9IHE7XG4gICAgICB0aGlzLmxlbmd0aCA9IHMgKyAxO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLy8gQWRkIGJpdCBhbmQgcHJvcGFnYXRlLCBpZiBuZWVkZWRcbiAgICB2YXIgY2FycnkgPSBxO1xuICAgIGZvciAoaSA9IHM7IGNhcnJ5ICE9PSAwICYmIGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgdyA9IHRoaXMud29yZHNbaV0gfCAwO1xuICAgICAgdyArPSBjYXJyeTtcbiAgICAgIGNhcnJ5ID0gdyA+Pj4gMjY7XG4gICAgICB3ICY9IDB4M2ZmZmZmZjtcbiAgICAgIHRoaXMud29yZHNbaV0gPSB3O1xuICAgIH1cbiAgICBpZiAoY2FycnkgIT09IDApIHtcbiAgICAgIHRoaXMud29yZHNbaV0gPSBjYXJyeTtcbiAgICAgIHRoaXMubGVuZ3RoKys7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5pc1plcm8gPSBmdW5jdGlvbiBpc1plcm8gKCkge1xuICAgIHJldHVybiB0aGlzLmxlbmd0aCA9PT0gMSAmJiB0aGlzLndvcmRzWzBdID09PSAwO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5jbXBuID0gZnVuY3Rpb24gY21wbiAobnVtKSB7XG4gICAgdmFyIG5lZ2F0aXZlID0gbnVtIDwgMDtcblxuICAgIGlmICh0aGlzLm5lZ2F0aXZlICE9PSAwICYmICFuZWdhdGl2ZSkgcmV0dXJuIC0xO1xuICAgIGlmICh0aGlzLm5lZ2F0aXZlID09PSAwICYmIG5lZ2F0aXZlKSByZXR1cm4gMTtcblxuICAgIHRoaXMuc3RyaXAoKTtcblxuICAgIHZhciByZXM7XG4gICAgaWYgKHRoaXMubGVuZ3RoID4gMSkge1xuICAgICAgcmVzID0gMTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKG5lZ2F0aXZlKSB7XG4gICAgICAgIG51bSA9IC1udW07XG4gICAgICB9XG5cbiAgICAgIGFzc2VydChudW0gPD0gMHgzZmZmZmZmLCAnTnVtYmVyIGlzIHRvbyBiaWcnKTtcblxuICAgICAgdmFyIHcgPSB0aGlzLndvcmRzWzBdIHwgMDtcbiAgICAgIHJlcyA9IHcgPT09IG51bSA/IDAgOiB3IDwgbnVtID8gLTEgOiAxO1xuICAgIH1cbiAgICBpZiAodGhpcy5uZWdhdGl2ZSAhPT0gMCkge1xuICAgICAgcmVzID0gLXJlcztcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfTtcblxuICAvLyBDb21wYXJlIHR3byBudW1iZXJzIGFuZCByZXR1cm46XG4gIC8vIDEgLSBpZiBgdGhpc2AgPiBgbnVtYFxuICAvLyAwIC0gaWYgYHRoaXNgID09IGBudW1gXG4gIC8vIC0xIC0gaWYgYHRoaXNgIDwgYG51bWBcbiAgQk4ucHJvdG90eXBlLmNtcCA9IGZ1bmN0aW9uIGNtcCAobnVtKSB7XG4gICAgaWYgKHRoaXMubmVnYXRpdmUgIT09IDAgJiYgbnVtLm5lZ2F0aXZlID09PSAwKSByZXR1cm4gLTE7XG4gICAgaWYgKHRoaXMubmVnYXRpdmUgPT09IDAgJiYgbnVtLm5lZ2F0aXZlICE9PSAwKSByZXR1cm4gMTtcblxuICAgIHZhciByZXMgPSB0aGlzLnVjbXAobnVtKTtcbiAgICBpZiAodGhpcy5uZWdhdGl2ZSAhPT0gMCkgcmV0dXJuIC1yZXM7XG5cbiAgICByZXR1cm4gcmVzO1xuICB9O1xuXG4gIC8vIFVuc2lnbmVkIGNvbXBhcmlzb25cbiAgQk4ucHJvdG90eXBlLnVjbXAgPSBmdW5jdGlvbiB1Y21wIChudW0pIHtcbiAgICAvLyBBdCB0aGlzIHBvaW50IGJvdGggbnVtYmVycyBoYXZlIHRoZSBzYW1lIHNpZ25cbiAgICBpZiAodGhpcy5sZW5ndGggPiBudW0ubGVuZ3RoKSByZXR1cm4gMTtcbiAgICBpZiAodGhpcy5sZW5ndGggPCBudW0ubGVuZ3RoKSByZXR1cm4gLTE7XG5cbiAgICB2YXIgcmVzID0gMDtcbiAgICBmb3IgKHZhciBpID0gdGhpcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgdmFyIGEgPSB0aGlzLndvcmRzW2ldIHwgMDtcbiAgICAgIHZhciBiID0gbnVtLndvcmRzW2ldIHwgMDtcblxuICAgICAgaWYgKGEgPT09IGIpIGNvbnRpbnVlO1xuICAgICAgaWYgKGEgPCBiKSB7XG4gICAgICAgIHJlcyA9IC0xO1xuICAgICAgfSBlbHNlIGlmIChhID4gYikge1xuICAgICAgICByZXMgPSAxO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmd0biA9IGZ1bmN0aW9uIGd0biAobnVtKSB7XG4gICAgcmV0dXJuIHRoaXMuY21wbihudW0pID09PSAxO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5ndCA9IGZ1bmN0aW9uIGd0IChudW0pIHtcbiAgICByZXR1cm4gdGhpcy5jbXAobnVtKSA9PT0gMTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuZ3RlbiA9IGZ1bmN0aW9uIGd0ZW4gKG51bSkge1xuICAgIHJldHVybiB0aGlzLmNtcG4obnVtKSA+PSAwO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5ndGUgPSBmdW5jdGlvbiBndGUgKG51bSkge1xuICAgIHJldHVybiB0aGlzLmNtcChudW0pID49IDA7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmx0biA9IGZ1bmN0aW9uIGx0biAobnVtKSB7XG4gICAgcmV0dXJuIHRoaXMuY21wbihudW0pID09PSAtMTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUubHQgPSBmdW5jdGlvbiBsdCAobnVtKSB7XG4gICAgcmV0dXJuIHRoaXMuY21wKG51bSkgPT09IC0xO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5sdGVuID0gZnVuY3Rpb24gbHRlbiAobnVtKSB7XG4gICAgcmV0dXJuIHRoaXMuY21wbihudW0pIDw9IDA7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmx0ZSA9IGZ1bmN0aW9uIGx0ZSAobnVtKSB7XG4gICAgcmV0dXJuIHRoaXMuY21wKG51bSkgPD0gMDtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuZXFuID0gZnVuY3Rpb24gZXFuIChudW0pIHtcbiAgICByZXR1cm4gdGhpcy5jbXBuKG51bSkgPT09IDA7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmVxID0gZnVuY3Rpb24gZXEgKG51bSkge1xuICAgIHJldHVybiB0aGlzLmNtcChudW0pID09PSAwO1xuICB9O1xuXG4gIC8vXG4gIC8vIEEgcmVkdWNlIGNvbnRleHQsIGNvdWxkIGJlIHVzaW5nIG1vbnRnb21lcnkgb3Igc29tZXRoaW5nIGJldHRlciwgZGVwZW5kaW5nXG4gIC8vIG9uIHRoZSBgbWAgaXRzZWxmLlxuICAvL1xuICBCTi5yZWQgPSBmdW5jdGlvbiByZWQgKG51bSkge1xuICAgIHJldHVybiBuZXcgUmVkKG51bSk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnRvUmVkID0gZnVuY3Rpb24gdG9SZWQgKGN0eCkge1xuICAgIGFzc2VydCghdGhpcy5yZWQsICdBbHJlYWR5IGEgbnVtYmVyIGluIHJlZHVjdGlvbiBjb250ZXh0Jyk7XG4gICAgYXNzZXJ0KHRoaXMubmVnYXRpdmUgPT09IDAsICdyZWQgd29ya3Mgb25seSB3aXRoIHBvc2l0aXZlcycpO1xuICAgIHJldHVybiBjdHguY29udmVydFRvKHRoaXMpLl9mb3JjZVJlZChjdHgpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5mcm9tUmVkID0gZnVuY3Rpb24gZnJvbVJlZCAoKSB7XG4gICAgYXNzZXJ0KHRoaXMucmVkLCAnZnJvbVJlZCB3b3JrcyBvbmx5IHdpdGggbnVtYmVycyBpbiByZWR1Y3Rpb24gY29udGV4dCcpO1xuICAgIHJldHVybiB0aGlzLnJlZC5jb252ZXJ0RnJvbSh0aGlzKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuX2ZvcmNlUmVkID0gZnVuY3Rpb24gX2ZvcmNlUmVkIChjdHgpIHtcbiAgICB0aGlzLnJlZCA9IGN0eDtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuZm9yY2VSZWQgPSBmdW5jdGlvbiBmb3JjZVJlZCAoY3R4KSB7XG4gICAgYXNzZXJ0KCF0aGlzLnJlZCwgJ0FscmVhZHkgYSBudW1iZXIgaW4gcmVkdWN0aW9uIGNvbnRleHQnKTtcbiAgICByZXR1cm4gdGhpcy5fZm9yY2VSZWQoY3R4KTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUucmVkQWRkID0gZnVuY3Rpb24gcmVkQWRkIChudW0pIHtcbiAgICBhc3NlcnQodGhpcy5yZWQsICdyZWRBZGQgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzJyk7XG4gICAgcmV0dXJuIHRoaXMucmVkLmFkZCh0aGlzLCBudW0pO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5yZWRJQWRkID0gZnVuY3Rpb24gcmVkSUFkZCAobnVtKSB7XG4gICAgYXNzZXJ0KHRoaXMucmVkLCAncmVkSUFkZCB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMnKTtcbiAgICByZXR1cm4gdGhpcy5yZWQuaWFkZCh0aGlzLCBudW0pO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5yZWRTdWIgPSBmdW5jdGlvbiByZWRTdWIgKG51bSkge1xuICAgIGFzc2VydCh0aGlzLnJlZCwgJ3JlZFN1YiB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMnKTtcbiAgICByZXR1cm4gdGhpcy5yZWQuc3ViKHRoaXMsIG51bSk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnJlZElTdWIgPSBmdW5jdGlvbiByZWRJU3ViIChudW0pIHtcbiAgICBhc3NlcnQodGhpcy5yZWQsICdyZWRJU3ViIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycycpO1xuICAgIHJldHVybiB0aGlzLnJlZC5pc3ViKHRoaXMsIG51bSk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnJlZFNobCA9IGZ1bmN0aW9uIHJlZFNobCAobnVtKSB7XG4gICAgYXNzZXJ0KHRoaXMucmVkLCAncmVkU2hsIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycycpO1xuICAgIHJldHVybiB0aGlzLnJlZC51c2hsKHRoaXMsIG51bSk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnJlZE11bCA9IGZ1bmN0aW9uIHJlZE11bCAobnVtKSB7XG4gICAgYXNzZXJ0KHRoaXMucmVkLCAncmVkTXVsIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycycpO1xuICAgIHRoaXMucmVkLl92ZXJpZnkyKHRoaXMsIG51bSk7XG4gICAgcmV0dXJuIHRoaXMucmVkLm11bCh0aGlzLCBudW0pO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5yZWRJTXVsID0gZnVuY3Rpb24gcmVkSU11bCAobnVtKSB7XG4gICAgYXNzZXJ0KHRoaXMucmVkLCAncmVkTXVsIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycycpO1xuICAgIHRoaXMucmVkLl92ZXJpZnkyKHRoaXMsIG51bSk7XG4gICAgcmV0dXJuIHRoaXMucmVkLmltdWwodGhpcywgbnVtKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUucmVkU3FyID0gZnVuY3Rpb24gcmVkU3FyICgpIHtcbiAgICBhc3NlcnQodGhpcy5yZWQsICdyZWRTcXIgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzJyk7XG4gICAgdGhpcy5yZWQuX3ZlcmlmeTEodGhpcyk7XG4gICAgcmV0dXJuIHRoaXMucmVkLnNxcih0aGlzKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUucmVkSVNxciA9IGZ1bmN0aW9uIHJlZElTcXIgKCkge1xuICAgIGFzc2VydCh0aGlzLnJlZCwgJ3JlZElTcXIgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzJyk7XG4gICAgdGhpcy5yZWQuX3ZlcmlmeTEodGhpcyk7XG4gICAgcmV0dXJuIHRoaXMucmVkLmlzcXIodGhpcyk7XG4gIH07XG5cbiAgLy8gU3F1YXJlIHJvb3Qgb3ZlciBwXG4gIEJOLnByb3RvdHlwZS5yZWRTcXJ0ID0gZnVuY3Rpb24gcmVkU3FydCAoKSB7XG4gICAgYXNzZXJ0KHRoaXMucmVkLCAncmVkU3FydCB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMnKTtcbiAgICB0aGlzLnJlZC5fdmVyaWZ5MSh0aGlzKTtcbiAgICByZXR1cm4gdGhpcy5yZWQuc3FydCh0aGlzKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUucmVkSW52bSA9IGZ1bmN0aW9uIHJlZEludm0gKCkge1xuICAgIGFzc2VydCh0aGlzLnJlZCwgJ3JlZEludm0gd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzJyk7XG4gICAgdGhpcy5yZWQuX3ZlcmlmeTEodGhpcyk7XG4gICAgcmV0dXJuIHRoaXMucmVkLmludm0odGhpcyk7XG4gIH07XG5cbiAgLy8gUmV0dXJuIG5lZ2F0aXZlIGNsb25lIG9mIGB0aGlzYCAlIGByZWQgbW9kdWxvYFxuICBCTi5wcm90b3R5cGUucmVkTmVnID0gZnVuY3Rpb24gcmVkTmVnICgpIHtcbiAgICBhc3NlcnQodGhpcy5yZWQsICdyZWROZWcgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzJyk7XG4gICAgdGhpcy5yZWQuX3ZlcmlmeTEodGhpcyk7XG4gICAgcmV0dXJuIHRoaXMucmVkLm5lZyh0aGlzKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUucmVkUG93ID0gZnVuY3Rpb24gcmVkUG93IChudW0pIHtcbiAgICBhc3NlcnQodGhpcy5yZWQgJiYgIW51bS5yZWQsICdyZWRQb3cobm9ybWFsTnVtKScpO1xuICAgIHRoaXMucmVkLl92ZXJpZnkxKHRoaXMpO1xuICAgIHJldHVybiB0aGlzLnJlZC5wb3codGhpcywgbnVtKTtcbiAgfTtcblxuICAvLyBQcmltZSBudW1iZXJzIHdpdGggZWZmaWNpZW50IHJlZHVjdGlvblxuICB2YXIgcHJpbWVzID0ge1xuICAgIGsyNTY6IG51bGwsXG4gICAgcDIyNDogbnVsbCxcbiAgICBwMTkyOiBudWxsLFxuICAgIHAyNTUxOTogbnVsbFxuICB9O1xuXG4gIC8vIFBzZXVkby1NZXJzZW5uZSBwcmltZVxuICBmdW5jdGlvbiBNUHJpbWUgKG5hbWUsIHApIHtcbiAgICAvLyBQID0gMiBeIE4gLSBLXG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLnAgPSBuZXcgQk4ocCwgMTYpO1xuICAgIHRoaXMubiA9IHRoaXMucC5iaXRMZW5ndGgoKTtcbiAgICB0aGlzLmsgPSBuZXcgQk4oMSkuaXVzaGxuKHRoaXMubikuaXN1Yih0aGlzLnApO1xuXG4gICAgdGhpcy50bXAgPSB0aGlzLl90bXAoKTtcbiAgfVxuXG4gIE1QcmltZS5wcm90b3R5cGUuX3RtcCA9IGZ1bmN0aW9uIF90bXAgKCkge1xuICAgIHZhciB0bXAgPSBuZXcgQk4obnVsbCk7XG4gICAgdG1wLndvcmRzID0gbmV3IEFycmF5KE1hdGguY2VpbCh0aGlzLm4gLyAxMykpO1xuICAgIHJldHVybiB0bXA7XG4gIH07XG5cbiAgTVByaW1lLnByb3RvdHlwZS5pcmVkdWNlID0gZnVuY3Rpb24gaXJlZHVjZSAobnVtKSB7XG4gICAgLy8gQXNzdW1lcyB0aGF0IGBudW1gIGlzIGxlc3MgdGhhbiBgUF4yYFxuICAgIC8vIG51bSA9IEhJICogKDIgXiBOIC0gSykgKyBISSAqIEsgKyBMTyA9IEhJICogSyArIExPIChtb2QgUClcbiAgICB2YXIgciA9IG51bTtcbiAgICB2YXIgcmxlbjtcblxuICAgIGRvIHtcbiAgICAgIHRoaXMuc3BsaXQociwgdGhpcy50bXApO1xuICAgICAgciA9IHRoaXMuaW11bEsocik7XG4gICAgICByID0gci5pYWRkKHRoaXMudG1wKTtcbiAgICAgIHJsZW4gPSByLmJpdExlbmd0aCgpO1xuICAgIH0gd2hpbGUgKHJsZW4gPiB0aGlzLm4pO1xuXG4gICAgdmFyIGNtcCA9IHJsZW4gPCB0aGlzLm4gPyAtMSA6IHIudWNtcCh0aGlzLnApO1xuICAgIGlmIChjbXAgPT09IDApIHtcbiAgICAgIHIud29yZHNbMF0gPSAwO1xuICAgICAgci5sZW5ndGggPSAxO1xuICAgIH0gZWxzZSBpZiAoY21wID4gMCkge1xuICAgICAgci5pc3ViKHRoaXMucCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHIuc3RyaXAoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcjtcbiAgfTtcblxuICBNUHJpbWUucHJvdG90eXBlLnNwbGl0ID0gZnVuY3Rpb24gc3BsaXQgKGlucHV0LCBvdXQpIHtcbiAgICBpbnB1dC5pdXNocm4odGhpcy5uLCAwLCBvdXQpO1xuICB9O1xuXG4gIE1QcmltZS5wcm90b3R5cGUuaW11bEsgPSBmdW5jdGlvbiBpbXVsSyAobnVtKSB7XG4gICAgcmV0dXJuIG51bS5pbXVsKHRoaXMuayk7XG4gIH07XG5cbiAgZnVuY3Rpb24gSzI1NiAoKSB7XG4gICAgTVByaW1lLmNhbGwoXG4gICAgICB0aGlzLFxuICAgICAgJ2syNTYnLFxuICAgICAgJ2ZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZlIGZmZmZmYzJmJyk7XG4gIH1cbiAgaW5oZXJpdHMoSzI1NiwgTVByaW1lKTtcblxuICBLMjU2LnByb3RvdHlwZS5zcGxpdCA9IGZ1bmN0aW9uIHNwbGl0IChpbnB1dCwgb3V0cHV0KSB7XG4gICAgLy8gMjU2ID0gOSAqIDI2ICsgMjJcbiAgICB2YXIgbWFzayA9IDB4M2ZmZmZmO1xuXG4gICAgdmFyIG91dExlbiA9IE1hdGgubWluKGlucHV0Lmxlbmd0aCwgOSk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvdXRMZW47IGkrKykge1xuICAgICAgb3V0cHV0LndvcmRzW2ldID0gaW5wdXQud29yZHNbaV07XG4gICAgfVxuICAgIG91dHB1dC5sZW5ndGggPSBvdXRMZW47XG5cbiAgICBpZiAoaW5wdXQubGVuZ3RoIDw9IDkpIHtcbiAgICAgIGlucHV0LndvcmRzWzBdID0gMDtcbiAgICAgIGlucHV0Lmxlbmd0aCA9IDE7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gU2hpZnQgYnkgOSBsaW1ic1xuICAgIHZhciBwcmV2ID0gaW5wdXQud29yZHNbOV07XG4gICAgb3V0cHV0LndvcmRzW291dHB1dC5sZW5ndGgrK10gPSBwcmV2ICYgbWFzaztcblxuICAgIGZvciAoaSA9IDEwOyBpIDwgaW5wdXQubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBuZXh0ID0gaW5wdXQud29yZHNbaV0gfCAwO1xuICAgICAgaW5wdXQud29yZHNbaSAtIDEwXSA9ICgobmV4dCAmIG1hc2spIDw8IDQpIHwgKHByZXYgPj4+IDIyKTtcbiAgICAgIHByZXYgPSBuZXh0O1xuICAgIH1cbiAgICBwcmV2ID4+Pj0gMjI7XG4gICAgaW5wdXQud29yZHNbaSAtIDEwXSA9IHByZXY7XG4gICAgaWYgKHByZXYgPT09IDAgJiYgaW5wdXQubGVuZ3RoID4gMTApIHtcbiAgICAgIGlucHV0Lmxlbmd0aCAtPSAxMDtcbiAgICB9IGVsc2Uge1xuICAgICAgaW5wdXQubGVuZ3RoIC09IDk7XG4gICAgfVxuICB9O1xuXG4gIEsyNTYucHJvdG90eXBlLmltdWxLID0gZnVuY3Rpb24gaW11bEsgKG51bSkge1xuICAgIC8vIEsgPSAweDEwMDAwMDNkMSA9IFsgMHg0MCwgMHgzZDEgXVxuICAgIG51bS53b3Jkc1tudW0ubGVuZ3RoXSA9IDA7XG4gICAgbnVtLndvcmRzW251bS5sZW5ndGggKyAxXSA9IDA7XG4gICAgbnVtLmxlbmd0aCArPSAyO1xuXG4gICAgLy8gYm91bmRlZCBhdDogMHg0MCAqIDB4M2ZmZmZmZiArIDB4M2QwID0gMHgxMDAwMDAzOTBcbiAgICB2YXIgbG8gPSAwO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgdyA9IG51bS53b3Jkc1tpXSB8IDA7XG4gICAgICBsbyArPSB3ICogMHgzZDE7XG4gICAgICBudW0ud29yZHNbaV0gPSBsbyAmIDB4M2ZmZmZmZjtcbiAgICAgIGxvID0gdyAqIDB4NDAgKyAoKGxvIC8gMHg0MDAwMDAwKSB8IDApO1xuICAgIH1cblxuICAgIC8vIEZhc3QgbGVuZ3RoIHJlZHVjdGlvblxuICAgIGlmIChudW0ud29yZHNbbnVtLmxlbmd0aCAtIDFdID09PSAwKSB7XG4gICAgICBudW0ubGVuZ3RoLS07XG4gICAgICBpZiAobnVtLndvcmRzW251bS5sZW5ndGggLSAxXSA9PT0gMCkge1xuICAgICAgICBudW0ubGVuZ3RoLS07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudW07XG4gIH07XG5cbiAgZnVuY3Rpb24gUDIyNCAoKSB7XG4gICAgTVByaW1lLmNhbGwoXG4gICAgICB0aGlzLFxuICAgICAgJ3AyMjQnLFxuICAgICAgJ2ZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAxJyk7XG4gIH1cbiAgaW5oZXJpdHMoUDIyNCwgTVByaW1lKTtcblxuICBmdW5jdGlvbiBQMTkyICgpIHtcbiAgICBNUHJpbWUuY2FsbChcbiAgICAgIHRoaXMsXG4gICAgICAncDE5MicsXG4gICAgICAnZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmUgZmZmZmZmZmYgZmZmZmZmZmYnKTtcbiAgfVxuICBpbmhlcml0cyhQMTkyLCBNUHJpbWUpO1xuXG4gIGZ1bmN0aW9uIFAyNTUxOSAoKSB7XG4gICAgLy8gMiBeIDI1NSAtIDE5XG4gICAgTVByaW1lLmNhbGwoXG4gICAgICB0aGlzLFxuICAgICAgJzI1NTE5JyxcbiAgICAgICc3ZmZmZmZmZmZmZmZmZmZmIGZmZmZmZmZmZmZmZmZmZmYgZmZmZmZmZmZmZmZmZmZmZiBmZmZmZmZmZmZmZmZmZmVkJyk7XG4gIH1cbiAgaW5oZXJpdHMoUDI1NTE5LCBNUHJpbWUpO1xuXG4gIFAyNTUxOS5wcm90b3R5cGUuaW11bEsgPSBmdW5jdGlvbiBpbXVsSyAobnVtKSB7XG4gICAgLy8gSyA9IDB4MTNcbiAgICB2YXIgY2FycnkgPSAwO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgaGkgPSAobnVtLndvcmRzW2ldIHwgMCkgKiAweDEzICsgY2Fycnk7XG4gICAgICB2YXIgbG8gPSBoaSAmIDB4M2ZmZmZmZjtcbiAgICAgIGhpID4+Pj0gMjY7XG5cbiAgICAgIG51bS53b3Jkc1tpXSA9IGxvO1xuICAgICAgY2FycnkgPSBoaTtcbiAgICB9XG4gICAgaWYgKGNhcnJ5ICE9PSAwKSB7XG4gICAgICBudW0ud29yZHNbbnVtLmxlbmd0aCsrXSA9IGNhcnJ5O1xuICAgIH1cbiAgICByZXR1cm4gbnVtO1xuICB9O1xuXG4gIC8vIEV4cG9ydGVkIG1vc3RseSBmb3IgdGVzdGluZyBwdXJwb3NlcywgdXNlIHBsYWluIG5hbWUgaW5zdGVhZFxuICBCTi5fcHJpbWUgPSBmdW5jdGlvbiBwcmltZSAobmFtZSkge1xuICAgIC8vIENhY2hlZCB2ZXJzaW9uIG9mIHByaW1lXG4gICAgaWYgKHByaW1lc1tuYW1lXSkgcmV0dXJuIHByaW1lc1tuYW1lXTtcblxuICAgIHZhciBwcmltZTtcbiAgICBpZiAobmFtZSA9PT0gJ2syNTYnKSB7XG4gICAgICBwcmltZSA9IG5ldyBLMjU2KCk7XG4gICAgfSBlbHNlIGlmIChuYW1lID09PSAncDIyNCcpIHtcbiAgICAgIHByaW1lID0gbmV3IFAyMjQoKTtcbiAgICB9IGVsc2UgaWYgKG5hbWUgPT09ICdwMTkyJykge1xuICAgICAgcHJpbWUgPSBuZXcgUDE5MigpO1xuICAgIH0gZWxzZSBpZiAobmFtZSA9PT0gJ3AyNTUxOScpIHtcbiAgICAgIHByaW1lID0gbmV3IFAyNTUxOSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gcHJpbWUgJyArIG5hbWUpO1xuICAgIH1cbiAgICBwcmltZXNbbmFtZV0gPSBwcmltZTtcblxuICAgIHJldHVybiBwcmltZTtcbiAgfTtcblxuICAvL1xuICAvLyBCYXNlIHJlZHVjdGlvbiBlbmdpbmVcbiAgLy9cbiAgZnVuY3Rpb24gUmVkIChtKSB7XG4gICAgaWYgKHR5cGVvZiBtID09PSAnc3RyaW5nJykge1xuICAgICAgdmFyIHByaW1lID0gQk4uX3ByaW1lKG0pO1xuICAgICAgdGhpcy5tID0gcHJpbWUucDtcbiAgICAgIHRoaXMucHJpbWUgPSBwcmltZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5tID0gbTtcbiAgICAgIHRoaXMucHJpbWUgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIFJlZC5wcm90b3R5cGUuX3ZlcmlmeTEgPSBmdW5jdGlvbiBfdmVyaWZ5MSAoYSkge1xuICAgIGFzc2VydChhLm5lZ2F0aXZlID09PSAwLCAncmVkIHdvcmtzIG9ubHkgd2l0aCBwb3NpdGl2ZXMnKTtcbiAgICBhc3NlcnQoYS5yZWQsICdyZWQgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzJyk7XG4gIH07XG5cbiAgUmVkLnByb3RvdHlwZS5fdmVyaWZ5MiA9IGZ1bmN0aW9uIF92ZXJpZnkyIChhLCBiKSB7XG4gICAgYXNzZXJ0KChhLm5lZ2F0aXZlIHwgYi5uZWdhdGl2ZSkgPT09IDAsICdyZWQgd29ya3Mgb25seSB3aXRoIHBvc2l0aXZlcycpO1xuICAgIGFzc2VydChhLnJlZCAmJiBhLnJlZCA9PT0gYi5yZWQsXG4gICAgICAncmVkIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycycpO1xuICB9O1xuXG4gIFJlZC5wcm90b3R5cGUuaW1vZCA9IGZ1bmN0aW9uIGltb2QgKGEpIHtcbiAgICBpZiAodGhpcy5wcmltZSkgcmV0dXJuIHRoaXMucHJpbWUuaXJlZHVjZShhKS5fZm9yY2VSZWQodGhpcyk7XG4gICAgcmV0dXJuIGEudW1vZCh0aGlzLm0pLl9mb3JjZVJlZCh0aGlzKTtcbiAgfTtcblxuICBSZWQucHJvdG90eXBlLm5lZyA9IGZ1bmN0aW9uIG5lZyAoYSkge1xuICAgIGlmIChhLmlzWmVybygpKSB7XG4gICAgICByZXR1cm4gYS5jbG9uZSgpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLm0uc3ViKGEpLl9mb3JjZVJlZCh0aGlzKTtcbiAgfTtcblxuICBSZWQucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIGFkZCAoYSwgYikge1xuICAgIHRoaXMuX3ZlcmlmeTIoYSwgYik7XG5cbiAgICB2YXIgcmVzID0gYS5hZGQoYik7XG4gICAgaWYgKHJlcy5jbXAodGhpcy5tKSA+PSAwKSB7XG4gICAgICByZXMuaXN1Yih0aGlzLm0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzLl9mb3JjZVJlZCh0aGlzKTtcbiAgfTtcblxuICBSZWQucHJvdG90eXBlLmlhZGQgPSBmdW5jdGlvbiBpYWRkIChhLCBiKSB7XG4gICAgdGhpcy5fdmVyaWZ5MihhLCBiKTtcblxuICAgIHZhciByZXMgPSBhLmlhZGQoYik7XG4gICAgaWYgKHJlcy5jbXAodGhpcy5tKSA+PSAwKSB7XG4gICAgICByZXMuaXN1Yih0aGlzLm0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9O1xuXG4gIFJlZC5wcm90b3R5cGUuc3ViID0gZnVuY3Rpb24gc3ViIChhLCBiKSB7XG4gICAgdGhpcy5fdmVyaWZ5MihhLCBiKTtcblxuICAgIHZhciByZXMgPSBhLnN1YihiKTtcbiAgICBpZiAocmVzLmNtcG4oMCkgPCAwKSB7XG4gICAgICByZXMuaWFkZCh0aGlzLm0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzLl9mb3JjZVJlZCh0aGlzKTtcbiAgfTtcblxuICBSZWQucHJvdG90eXBlLmlzdWIgPSBmdW5jdGlvbiBpc3ViIChhLCBiKSB7XG4gICAgdGhpcy5fdmVyaWZ5MihhLCBiKTtcblxuICAgIHZhciByZXMgPSBhLmlzdWIoYik7XG4gICAgaWYgKHJlcy5jbXBuKDApIDwgMCkge1xuICAgICAgcmVzLmlhZGQodGhpcy5tKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfTtcblxuICBSZWQucHJvdG90eXBlLnNobCA9IGZ1bmN0aW9uIHNobCAoYSwgbnVtKSB7XG4gICAgdGhpcy5fdmVyaWZ5MShhKTtcbiAgICByZXR1cm4gdGhpcy5pbW9kKGEudXNobG4obnVtKSk7XG4gIH07XG5cbiAgUmVkLnByb3RvdHlwZS5pbXVsID0gZnVuY3Rpb24gaW11bCAoYSwgYikge1xuICAgIHRoaXMuX3ZlcmlmeTIoYSwgYik7XG4gICAgcmV0dXJuIHRoaXMuaW1vZChhLmltdWwoYikpO1xuICB9O1xuXG4gIFJlZC5wcm90b3R5cGUubXVsID0gZnVuY3Rpb24gbXVsIChhLCBiKSB7XG4gICAgdGhpcy5fdmVyaWZ5MihhLCBiKTtcbiAgICByZXR1cm4gdGhpcy5pbW9kKGEubXVsKGIpKTtcbiAgfTtcblxuICBSZWQucHJvdG90eXBlLmlzcXIgPSBmdW5jdGlvbiBpc3FyIChhKSB7XG4gICAgcmV0dXJuIHRoaXMuaW11bChhLCBhLmNsb25lKCkpO1xuICB9O1xuXG4gIFJlZC5wcm90b3R5cGUuc3FyID0gZnVuY3Rpb24gc3FyIChhKSB7XG4gICAgcmV0dXJuIHRoaXMubXVsKGEsIGEpO1xuICB9O1xuXG4gIFJlZC5wcm90b3R5cGUuc3FydCA9IGZ1bmN0aW9uIHNxcnQgKGEpIHtcbiAgICBpZiAoYS5pc1plcm8oKSkgcmV0dXJuIGEuY2xvbmUoKTtcblxuICAgIHZhciBtb2QzID0gdGhpcy5tLmFuZGxuKDMpO1xuICAgIGFzc2VydChtb2QzICUgMiA9PT0gMSk7XG5cbiAgICAvLyBGYXN0IGNhc2VcbiAgICBpZiAobW9kMyA9PT0gMykge1xuICAgICAgdmFyIHBvdyA9IHRoaXMubS5hZGQobmV3IEJOKDEpKS5pdXNocm4oMik7XG4gICAgICByZXR1cm4gdGhpcy5wb3coYSwgcG93KTtcbiAgICB9XG5cbiAgICAvLyBUb25lbGxpLVNoYW5rcyBhbGdvcml0aG0gKFRvdGFsbHkgdW5vcHRpbWl6ZWQgYW5kIHNsb3cpXG4gICAgLy9cbiAgICAvLyBGaW5kIFEgYW5kIFMsIHRoYXQgUSAqIDIgXiBTID0gKFAgLSAxKVxuICAgIHZhciBxID0gdGhpcy5tLnN1Ym4oMSk7XG4gICAgdmFyIHMgPSAwO1xuICAgIHdoaWxlICghcS5pc1plcm8oKSAmJiBxLmFuZGxuKDEpID09PSAwKSB7XG4gICAgICBzKys7XG4gICAgICBxLml1c2hybigxKTtcbiAgICB9XG4gICAgYXNzZXJ0KCFxLmlzWmVybygpKTtcblxuICAgIHZhciBvbmUgPSBuZXcgQk4oMSkudG9SZWQodGhpcyk7XG4gICAgdmFyIG5PbmUgPSBvbmUucmVkTmVnKCk7XG5cbiAgICAvLyBGaW5kIHF1YWRyYXRpYyBub24tcmVzaWR1ZVxuICAgIC8vIE5PVEU6IE1heCBpcyBzdWNoIGJlY2F1c2Ugb2YgZ2VuZXJhbGl6ZWQgUmllbWFubiBoeXBvdGhlc2lzLlxuICAgIHZhciBscG93ID0gdGhpcy5tLnN1Ym4oMSkuaXVzaHJuKDEpO1xuICAgIHZhciB6ID0gdGhpcy5tLmJpdExlbmd0aCgpO1xuICAgIHogPSBuZXcgQk4oMiAqIHogKiB6KS50b1JlZCh0aGlzKTtcblxuICAgIHdoaWxlICh0aGlzLnBvdyh6LCBscG93KS5jbXAobk9uZSkgIT09IDApIHtcbiAgICAgIHoucmVkSUFkZChuT25lKTtcbiAgICB9XG5cbiAgICB2YXIgYyA9IHRoaXMucG93KHosIHEpO1xuICAgIHZhciByID0gdGhpcy5wb3coYSwgcS5hZGRuKDEpLml1c2hybigxKSk7XG4gICAgdmFyIHQgPSB0aGlzLnBvdyhhLCBxKTtcbiAgICB2YXIgbSA9IHM7XG4gICAgd2hpbGUgKHQuY21wKG9uZSkgIT09IDApIHtcbiAgICAgIHZhciB0bXAgPSB0O1xuICAgICAgZm9yICh2YXIgaSA9IDA7IHRtcC5jbXAob25lKSAhPT0gMDsgaSsrKSB7XG4gICAgICAgIHRtcCA9IHRtcC5yZWRTcXIoKTtcbiAgICAgIH1cbiAgICAgIGFzc2VydChpIDwgbSk7XG4gICAgICB2YXIgYiA9IHRoaXMucG93KGMsIG5ldyBCTigxKS5pdXNobG4obSAtIGkgLSAxKSk7XG5cbiAgICAgIHIgPSByLnJlZE11bChiKTtcbiAgICAgIGMgPSBiLnJlZFNxcigpO1xuICAgICAgdCA9IHQucmVkTXVsKGMpO1xuICAgICAgbSA9IGk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHI7XG4gIH07XG5cbiAgUmVkLnByb3RvdHlwZS5pbnZtID0gZnVuY3Rpb24gaW52bSAoYSkge1xuICAgIHZhciBpbnYgPSBhLl9pbnZtcCh0aGlzLm0pO1xuICAgIGlmIChpbnYubmVnYXRpdmUgIT09IDApIHtcbiAgICAgIGludi5uZWdhdGl2ZSA9IDA7XG4gICAgICByZXR1cm4gdGhpcy5pbW9kKGludikucmVkTmVnKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLmltb2QoaW52KTtcbiAgICB9XG4gIH07XG5cbiAgUmVkLnByb3RvdHlwZS5wb3cgPSBmdW5jdGlvbiBwb3cgKGEsIG51bSkge1xuICAgIGlmIChudW0uaXNaZXJvKCkpIHJldHVybiBuZXcgQk4oMSk7XG4gICAgaWYgKG51bS5jbXBuKDEpID09PSAwKSByZXR1cm4gYS5jbG9uZSgpO1xuXG4gICAgdmFyIHdpbmRvd1NpemUgPSA0O1xuICAgIHZhciB3bmQgPSBuZXcgQXJyYXkoMSA8PCB3aW5kb3dTaXplKTtcbiAgICB3bmRbMF0gPSBuZXcgQk4oMSkudG9SZWQodGhpcyk7XG4gICAgd25kWzFdID0gYTtcbiAgICBmb3IgKHZhciBpID0gMjsgaSA8IHduZC5sZW5ndGg7IGkrKykge1xuICAgICAgd25kW2ldID0gdGhpcy5tdWwod25kW2kgLSAxXSwgYSk7XG4gICAgfVxuXG4gICAgdmFyIHJlcyA9IHduZFswXTtcbiAgICB2YXIgY3VycmVudCA9IDA7XG4gICAgdmFyIGN1cnJlbnRMZW4gPSAwO1xuICAgIHZhciBzdGFydCA9IG51bS5iaXRMZW5ndGgoKSAlIDI2O1xuICAgIGlmIChzdGFydCA9PT0gMCkge1xuICAgICAgc3RhcnQgPSAyNjtcbiAgICB9XG5cbiAgICBmb3IgKGkgPSBudW0ubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHZhciB3b3JkID0gbnVtLndvcmRzW2ldO1xuICAgICAgZm9yICh2YXIgaiA9IHN0YXJ0IC0gMTsgaiA+PSAwOyBqLS0pIHtcbiAgICAgICAgdmFyIGJpdCA9ICh3b3JkID4+IGopICYgMTtcbiAgICAgICAgaWYgKHJlcyAhPT0gd25kWzBdKSB7XG4gICAgICAgICAgcmVzID0gdGhpcy5zcXIocmVzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChiaXQgPT09IDAgJiYgY3VycmVudCA9PT0gMCkge1xuICAgICAgICAgIGN1cnJlbnRMZW4gPSAwO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY3VycmVudCA8PD0gMTtcbiAgICAgICAgY3VycmVudCB8PSBiaXQ7XG4gICAgICAgIGN1cnJlbnRMZW4rKztcbiAgICAgICAgaWYgKGN1cnJlbnRMZW4gIT09IHdpbmRvd1NpemUgJiYgKGkgIT09IDAgfHwgaiAhPT0gMCkpIGNvbnRpbnVlO1xuXG4gICAgICAgIHJlcyA9IHRoaXMubXVsKHJlcywgd25kW2N1cnJlbnRdKTtcbiAgICAgICAgY3VycmVudExlbiA9IDA7XG4gICAgICAgIGN1cnJlbnQgPSAwO1xuICAgICAgfVxuICAgICAgc3RhcnQgPSAyNjtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzO1xuICB9O1xuXG4gIFJlZC5wcm90b3R5cGUuY29udmVydFRvID0gZnVuY3Rpb24gY29udmVydFRvIChudW0pIHtcbiAgICB2YXIgciA9IG51bS51bW9kKHRoaXMubSk7XG5cbiAgICByZXR1cm4gciA9PT0gbnVtID8gci5jbG9uZSgpIDogcjtcbiAgfTtcblxuICBSZWQucHJvdG90eXBlLmNvbnZlcnRGcm9tID0gZnVuY3Rpb24gY29udmVydEZyb20gKG51bSkge1xuICAgIHZhciByZXMgPSBudW0uY2xvbmUoKTtcbiAgICByZXMucmVkID0gbnVsbDtcbiAgICByZXR1cm4gcmVzO1xuICB9O1xuXG4gIC8vXG4gIC8vIE1vbnRnb21lcnkgbWV0aG9kIGVuZ2luZVxuICAvL1xuXG4gIEJOLm1vbnQgPSBmdW5jdGlvbiBtb250IChudW0pIHtcbiAgICByZXR1cm4gbmV3IE1vbnQobnVtKTtcbiAgfTtcblxuICBmdW5jdGlvbiBNb250IChtKSB7XG4gICAgUmVkLmNhbGwodGhpcywgbSk7XG5cbiAgICB0aGlzLnNoaWZ0ID0gdGhpcy5tLmJpdExlbmd0aCgpO1xuICAgIGlmICh0aGlzLnNoaWZ0ICUgMjYgIT09IDApIHtcbiAgICAgIHRoaXMuc2hpZnQgKz0gMjYgLSAodGhpcy5zaGlmdCAlIDI2KTtcbiAgICB9XG5cbiAgICB0aGlzLnIgPSBuZXcgQk4oMSkuaXVzaGxuKHRoaXMuc2hpZnQpO1xuICAgIHRoaXMucjIgPSB0aGlzLmltb2QodGhpcy5yLnNxcigpKTtcbiAgICB0aGlzLnJpbnYgPSB0aGlzLnIuX2ludm1wKHRoaXMubSk7XG5cbiAgICB0aGlzLm1pbnYgPSB0aGlzLnJpbnYubXVsKHRoaXMucikuaXN1Ym4oMSkuZGl2KHRoaXMubSk7XG4gICAgdGhpcy5taW52ID0gdGhpcy5taW52LnVtb2QodGhpcy5yKTtcbiAgICB0aGlzLm1pbnYgPSB0aGlzLnIuc3ViKHRoaXMubWludik7XG4gIH1cbiAgaW5oZXJpdHMoTW9udCwgUmVkKTtcblxuICBNb250LnByb3RvdHlwZS5jb252ZXJ0VG8gPSBmdW5jdGlvbiBjb252ZXJ0VG8gKG51bSkge1xuICAgIHJldHVybiB0aGlzLmltb2QobnVtLnVzaGxuKHRoaXMuc2hpZnQpKTtcbiAgfTtcblxuICBNb250LnByb3RvdHlwZS5jb252ZXJ0RnJvbSA9IGZ1bmN0aW9uIGNvbnZlcnRGcm9tIChudW0pIHtcbiAgICB2YXIgciA9IHRoaXMuaW1vZChudW0ubXVsKHRoaXMucmludikpO1xuICAgIHIucmVkID0gbnVsbDtcbiAgICByZXR1cm4gcjtcbiAgfTtcblxuICBNb250LnByb3RvdHlwZS5pbXVsID0gZnVuY3Rpb24gaW11bCAoYSwgYikge1xuICAgIGlmIChhLmlzWmVybygpIHx8IGIuaXNaZXJvKCkpIHtcbiAgICAgIGEud29yZHNbMF0gPSAwO1xuICAgICAgYS5sZW5ndGggPSAxO1xuICAgICAgcmV0dXJuIGE7XG4gICAgfVxuXG4gICAgdmFyIHQgPSBhLmltdWwoYik7XG4gICAgdmFyIGMgPSB0Lm1hc2tuKHRoaXMuc2hpZnQpLm11bCh0aGlzLm1pbnYpLmltYXNrbih0aGlzLnNoaWZ0KS5tdWwodGhpcy5tKTtcbiAgICB2YXIgdSA9IHQuaXN1YihjKS5pdXNocm4odGhpcy5zaGlmdCk7XG4gICAgdmFyIHJlcyA9IHU7XG5cbiAgICBpZiAodS5jbXAodGhpcy5tKSA+PSAwKSB7XG4gICAgICByZXMgPSB1LmlzdWIodGhpcy5tKTtcbiAgICB9IGVsc2UgaWYgKHUuY21wbigwKSA8IDApIHtcbiAgICAgIHJlcyA9IHUuaWFkZCh0aGlzLm0pO1xuICAgIH1cblxuICAgIHJldHVybiByZXMuX2ZvcmNlUmVkKHRoaXMpO1xuICB9O1xuXG4gIE1vbnQucHJvdG90eXBlLm11bCA9IGZ1bmN0aW9uIG11bCAoYSwgYikge1xuICAgIGlmIChhLmlzWmVybygpIHx8IGIuaXNaZXJvKCkpIHJldHVybiBuZXcgQk4oMCkuX2ZvcmNlUmVkKHRoaXMpO1xuXG4gICAgdmFyIHQgPSBhLm11bChiKTtcbiAgICB2YXIgYyA9IHQubWFza24odGhpcy5zaGlmdCkubXVsKHRoaXMubWludikuaW1hc2tuKHRoaXMuc2hpZnQpLm11bCh0aGlzLm0pO1xuICAgIHZhciB1ID0gdC5pc3ViKGMpLml1c2hybih0aGlzLnNoaWZ0KTtcbiAgICB2YXIgcmVzID0gdTtcbiAgICBpZiAodS5jbXAodGhpcy5tKSA+PSAwKSB7XG4gICAgICByZXMgPSB1LmlzdWIodGhpcy5tKTtcbiAgICB9IGVsc2UgaWYgKHUuY21wbigwKSA8IDApIHtcbiAgICAgIHJlcyA9IHUuaWFkZCh0aGlzLm0pO1xuICAgIH1cblxuICAgIHJldHVybiByZXMuX2ZvcmNlUmVkKHRoaXMpO1xuICB9O1xuXG4gIE1vbnQucHJvdG90eXBlLmludm0gPSBmdW5jdGlvbiBpbnZtIChhKSB7XG4gICAgLy8gKEFSKV4tMSAqIFJeMiA9IChBXi0xICogUl4tMSkgKiBSXjIgPSBBXi0xICogUlxuICAgIHZhciByZXMgPSB0aGlzLmltb2QoYS5faW52bXAodGhpcy5tKS5tdWwodGhpcy5yMikpO1xuICAgIHJldHVybiByZXMuX2ZvcmNlUmVkKHRoaXMpO1xuICB9O1xufSkodHlwZW9mIG1vZHVsZSA9PT0gJ3VuZGVmaW5lZCcgfHwgbW9kdWxlLCB0aGlzKTtcbiIsInZhciByO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHJhbmQobGVuKSB7XG4gIGlmICghcilcbiAgICByID0gbmV3IFJhbmQobnVsbCk7XG5cbiAgcmV0dXJuIHIuZ2VuZXJhdGUobGVuKTtcbn07XG5cbmZ1bmN0aW9uIFJhbmQocmFuZCkge1xuICB0aGlzLnJhbmQgPSByYW5kO1xufVxubW9kdWxlLmV4cG9ydHMuUmFuZCA9IFJhbmQ7XG5cblJhbmQucHJvdG90eXBlLmdlbmVyYXRlID0gZnVuY3Rpb24gZ2VuZXJhdGUobGVuKSB7XG4gIHJldHVybiB0aGlzLl9yYW5kKGxlbik7XG59O1xuXG5pZiAodHlwZW9mIHdpbmRvdyA9PT0gJ29iamVjdCcpIHtcbiAgaWYgKHdpbmRvdy5jcnlwdG8gJiYgd2luZG93LmNyeXB0by5nZXRSYW5kb21WYWx1ZXMpIHtcbiAgICAvLyBNb2Rlcm4gYnJvd3NlcnNcbiAgICBSYW5kLnByb3RvdHlwZS5fcmFuZCA9IGZ1bmN0aW9uIF9yYW5kKG4pIHtcbiAgICAgIHZhciBhcnIgPSBuZXcgVWludDhBcnJheShuKTtcbiAgICAgIHdpbmRvdy5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGFycik7XG4gICAgICByZXR1cm4gYXJyO1xuICAgIH07XG4gIH0gZWxzZSBpZiAod2luZG93Lm1zQ3J5cHRvICYmIHdpbmRvdy5tc0NyeXB0by5nZXRSYW5kb21WYWx1ZXMpIHtcbiAgICAvLyBJRVxuICAgIFJhbmQucHJvdG90eXBlLl9yYW5kID0gZnVuY3Rpb24gX3JhbmQobikge1xuICAgICAgdmFyIGFyciA9IG5ldyBVaW50OEFycmF5KG4pO1xuICAgICAgd2luZG93Lm1zQ3J5cHRvLmdldFJhbmRvbVZhbHVlcyhhcnIpO1xuICAgICAgcmV0dXJuIGFycjtcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIC8vIE9sZCBqdW5rXG4gICAgUmFuZC5wcm90b3R5cGUuX3JhbmQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTm90IGltcGxlbWVudGVkIHlldCcpO1xuICAgIH07XG4gIH1cbn0gZWxzZSB7XG4gIC8vIE5vZGUuanMgb3IgV2ViIHdvcmtlclxuICB0cnkge1xuICAgIHZhciBjcnlwdG8gPSByZXF1aXJlKCdjcnknICsgJ3B0bycpO1xuXG4gICAgUmFuZC5wcm90b3R5cGUuX3JhbmQgPSBmdW5jdGlvbiBfcmFuZChuKSB7XG4gICAgICByZXR1cm4gY3J5cHRvLnJhbmRvbUJ5dGVzKG4pO1xuICAgIH07XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBFbXVsYXRlIGNyeXB0byBBUEkgdXNpbmcgcmFuZHlcbiAgICBSYW5kLnByb3RvdHlwZS5fcmFuZCA9IGZ1bmN0aW9uIF9yYW5kKG4pIHtcbiAgICAgIHZhciByZXMgPSBuZXcgVWludDhBcnJheShuKTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVzLmxlbmd0aDsgaSsrKVxuICAgICAgICByZXNbaV0gPSB0aGlzLnJhbmQuZ2V0Qnl0ZSgpO1xuICAgICAgcmV0dXJuIHJlcztcbiAgICB9O1xuICB9XG59XG4iLCIvLyBiYXNlZCBvbiB0aGUgYWVzIGltcGxpbWVudGF0aW9uIGluIHRyaXBsZSBzZWNcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9rZXliYXNlL3RyaXBsZXNlY1xuXG4vLyB3aGljaCBpcyBpbiB0dXJuIGJhc2VkIG9uIHRoZSBvbmUgZnJvbSBjcnlwdG8tanNcbi8vIGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvY3J5cHRvLWpzL1xuXG52YXIgdWludF9tYXggPSBNYXRoLnBvdygyLCAzMilcbmZ1bmN0aW9uIGZpeHVwX3VpbnQzMiAoeCkge1xuICB2YXIgcmV0LCB4X3Bvc1xuICByZXQgPSB4ID4gdWludF9tYXggfHwgeCA8IDAgPyAoeF9wb3MgPSBNYXRoLmFicyh4KSAlIHVpbnRfbWF4LCB4IDwgMCA/IHVpbnRfbWF4IC0geF9wb3MgOiB4X3BvcykgOiB4XG4gIHJldHVybiByZXRcbn1cbmZ1bmN0aW9uIHNjcnViX3ZlYyAodikge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHYubGVuZ3RoOyB2KyspIHtcbiAgICB2W2ldID0gMFxuICB9XG4gIHJldHVybiBmYWxzZVxufVxuXG5mdW5jdGlvbiBHbG9iYWwgKCkge1xuICB0aGlzLlNCT1ggPSBbXVxuICB0aGlzLklOVl9TQk9YID0gW11cbiAgdGhpcy5TVUJfTUlYID0gW1tdLCBbXSwgW10sIFtdXVxuICB0aGlzLklOVl9TVUJfTUlYID0gW1tdLCBbXSwgW10sIFtdXVxuICB0aGlzLmluaXQoKVxuICB0aGlzLlJDT04gPSBbMHgwMCwgMHgwMSwgMHgwMiwgMHgwNCwgMHgwOCwgMHgxMCwgMHgyMCwgMHg0MCwgMHg4MCwgMHgxYiwgMHgzNl1cbn1cblxuR2xvYmFsLnByb3RvdHlwZS5pbml0ID0gZnVuY3Rpb24gKCkge1xuICB2YXIgZCwgaSwgc3gsIHQsIHgsIHgyLCB4NCwgeDgsIHhpLCBfaVxuICBkID0gKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgX2ksIF9yZXN1bHRzXG4gICAgX3Jlc3VsdHMgPSBbXVxuICAgIGZvciAoaSA9IF9pID0gMDsgX2kgPCAyNTY7IGkgPSArK19pKSB7XG4gICAgICBpZiAoaSA8IDEyOCkge1xuICAgICAgICBfcmVzdWx0cy5wdXNoKGkgPDwgMSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIF9yZXN1bHRzLnB1c2goKGkgPDwgMSkgXiAweDExYilcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIF9yZXN1bHRzXG4gIH0pKClcbiAgeCA9IDBcbiAgeGkgPSAwXG4gIGZvciAoaSA9IF9pID0gMDsgX2kgPCAyNTY7IGkgPSArK19pKSB7XG4gICAgc3ggPSB4aSBeICh4aSA8PCAxKSBeICh4aSA8PCAyKSBeICh4aSA8PCAzKSBeICh4aSA8PCA0KVxuICAgIHN4ID0gKHN4ID4+PiA4KSBeIChzeCAmIDB4ZmYpIF4gMHg2M1xuICAgIHRoaXMuU0JPWFt4XSA9IHN4XG4gICAgdGhpcy5JTlZfU0JPWFtzeF0gPSB4XG4gICAgeDIgPSBkW3hdXG4gICAgeDQgPSBkW3gyXVxuICAgIHg4ID0gZFt4NF1cbiAgICB0ID0gKGRbc3hdICogMHgxMDEpIF4gKHN4ICogMHgxMDEwMTAwKVxuICAgIHRoaXMuU1VCX01JWFswXVt4XSA9ICh0IDw8IDI0KSB8ICh0ID4+PiA4KVxuICAgIHRoaXMuU1VCX01JWFsxXVt4XSA9ICh0IDw8IDE2KSB8ICh0ID4+PiAxNilcbiAgICB0aGlzLlNVQl9NSVhbMl1beF0gPSAodCA8PCA4KSB8ICh0ID4+PiAyNClcbiAgICB0aGlzLlNVQl9NSVhbM11beF0gPSB0XG4gICAgdCA9ICh4OCAqIDB4MTAxMDEwMSkgXiAoeDQgKiAweDEwMDAxKSBeICh4MiAqIDB4MTAxKSBeICh4ICogMHgxMDEwMTAwKVxuICAgIHRoaXMuSU5WX1NVQl9NSVhbMF1bc3hdID0gKHQgPDwgMjQpIHwgKHQgPj4+IDgpXG4gICAgdGhpcy5JTlZfU1VCX01JWFsxXVtzeF0gPSAodCA8PCAxNikgfCAodCA+Pj4gMTYpXG4gICAgdGhpcy5JTlZfU1VCX01JWFsyXVtzeF0gPSAodCA8PCA4KSB8ICh0ID4+PiAyNClcbiAgICB0aGlzLklOVl9TVUJfTUlYWzNdW3N4XSA9IHRcbiAgICBpZiAoeCA9PT0gMCkge1xuICAgICAgeCA9IHhpID0gMVxuICAgIH0gZWxzZSB7XG4gICAgICB4ID0geDIgXiBkW2RbZFt4OCBeIHgyXV1dXG4gICAgICB4aSBePSBkW2RbeGldXVxuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZVxufVxuXG52YXIgRyA9IG5ldyBHbG9iYWwoKVxuXG5BRVMuYmxvY2tTaXplID0gNCAqIDRcblxuQUVTLnByb3RvdHlwZS5ibG9ja1NpemUgPSBBRVMuYmxvY2tTaXplXG5cbkFFUy5rZXlTaXplID0gMjU2IC8gOFxuXG5BRVMucHJvdG90eXBlLmtleVNpemUgPSBBRVMua2V5U2l6ZVxuXG5mdW5jdGlvbiBidWZmZXJUb0FycmF5IChidWYpIHtcbiAgdmFyIGxlbiA9IGJ1Zi5sZW5ndGggLyA0XG4gIHZhciBvdXQgPSBuZXcgQXJyYXkobGVuKVxuICB2YXIgaSA9IC0xXG4gIHdoaWxlICgrK2kgPCBsZW4pIHtcbiAgICBvdXRbaV0gPSBidWYucmVhZFVJbnQzMkJFKGkgKiA0KVxuICB9XG4gIHJldHVybiBvdXRcbn1cbmZ1bmN0aW9uIEFFUyAoa2V5KSB7XG4gIHRoaXMuX2tleSA9IGJ1ZmZlclRvQXJyYXkoa2V5KVxuICB0aGlzLl9kb1Jlc2V0KClcbn1cblxuQUVTLnByb3RvdHlwZS5fZG9SZXNldCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGludktzUm93LCBrZXlTaXplLCBrZXlXb3Jkcywga3NSb3csIGtzUm93cywgdFxuICBrZXlXb3JkcyA9IHRoaXMuX2tleVxuICBrZXlTaXplID0ga2V5V29yZHMubGVuZ3RoXG4gIHRoaXMuX25Sb3VuZHMgPSBrZXlTaXplICsgNlxuICBrc1Jvd3MgPSAodGhpcy5fblJvdW5kcyArIDEpICogNFxuICB0aGlzLl9rZXlTY2hlZHVsZSA9IFtdXG4gIGZvciAoa3NSb3cgPSAwOyBrc1JvdyA8IGtzUm93czsga3NSb3crKykge1xuICAgIHRoaXMuX2tleVNjaGVkdWxlW2tzUm93XSA9IGtzUm93IDwga2V5U2l6ZSA/IGtleVdvcmRzW2tzUm93XSA6ICh0ID0gdGhpcy5fa2V5U2NoZWR1bGVba3NSb3cgLSAxXSwgKGtzUm93ICUga2V5U2l6ZSkgPT09IDAgPyAodCA9ICh0IDw8IDgpIHwgKHQgPj4+IDI0KSwgdCA9IChHLlNCT1hbdCA+Pj4gMjRdIDw8IDI0KSB8IChHLlNCT1hbKHQgPj4+IDE2KSAmIDB4ZmZdIDw8IDE2KSB8IChHLlNCT1hbKHQgPj4+IDgpICYgMHhmZl0gPDwgOCkgfCBHLlNCT1hbdCAmIDB4ZmZdLCB0IF49IEcuUkNPTlsoa3NSb3cgLyBrZXlTaXplKSB8IDBdIDw8IDI0KSA6IGtleVNpemUgPiA2ICYmIGtzUm93ICUga2V5U2l6ZSA9PT0gNCA/IHQgPSAoRy5TQk9YW3QgPj4+IDI0XSA8PCAyNCkgfCAoRy5TQk9YWyh0ID4+PiAxNikgJiAweGZmXSA8PCAxNikgfCAoRy5TQk9YWyh0ID4+PiA4KSAmIDB4ZmZdIDw8IDgpIHwgRy5TQk9YW3QgJiAweGZmXSA6IHZvaWQgMCwgdGhpcy5fa2V5U2NoZWR1bGVba3NSb3cgLSBrZXlTaXplXSBeIHQpXG4gIH1cbiAgdGhpcy5faW52S2V5U2NoZWR1bGUgPSBbXVxuICBmb3IgKGludktzUm93ID0gMDsgaW52S3NSb3cgPCBrc1Jvd3M7IGludktzUm93KyspIHtcbiAgICBrc1JvdyA9IGtzUm93cyAtIGludktzUm93XG4gICAgdCA9IHRoaXMuX2tleVNjaGVkdWxlW2tzUm93IC0gKGludktzUm93ICUgNCA/IDAgOiA0KV1cbiAgICB0aGlzLl9pbnZLZXlTY2hlZHVsZVtpbnZLc1Jvd10gPSBpbnZLc1JvdyA8IDQgfHwga3NSb3cgPD0gNCA/IHQgOiBHLklOVl9TVUJfTUlYWzBdW0cuU0JPWFt0ID4+PiAyNF1dIF4gRy5JTlZfU1VCX01JWFsxXVtHLlNCT1hbKHQgPj4+IDE2KSAmIDB4ZmZdXSBeIEcuSU5WX1NVQl9NSVhbMl1bRy5TQk9YWyh0ID4+PiA4KSAmIDB4ZmZdXSBeIEcuSU5WX1NVQl9NSVhbM11bRy5TQk9YW3QgJiAweGZmXV1cbiAgfVxuICByZXR1cm4gdHJ1ZVxufVxuXG5BRVMucHJvdG90eXBlLmVuY3J5cHRCbG9jayA9IGZ1bmN0aW9uIChNKSB7XG4gIE0gPSBidWZmZXJUb0FycmF5KG5ldyBCdWZmZXIoTSkpXG4gIHZhciBvdXQgPSB0aGlzLl9kb0NyeXB0QmxvY2soTSwgdGhpcy5fa2V5U2NoZWR1bGUsIEcuU1VCX01JWCwgRy5TQk9YKVxuICB2YXIgYnVmID0gbmV3IEJ1ZmZlcigxNilcbiAgYnVmLndyaXRlVUludDMyQkUob3V0WzBdLCAwKVxuICBidWYud3JpdGVVSW50MzJCRShvdXRbMV0sIDQpXG4gIGJ1Zi53cml0ZVVJbnQzMkJFKG91dFsyXSwgOClcbiAgYnVmLndyaXRlVUludDMyQkUob3V0WzNdLCAxMilcbiAgcmV0dXJuIGJ1ZlxufVxuXG5BRVMucHJvdG90eXBlLmRlY3J5cHRCbG9jayA9IGZ1bmN0aW9uIChNKSB7XG4gIE0gPSBidWZmZXJUb0FycmF5KG5ldyBCdWZmZXIoTSkpXG4gIHZhciB0ZW1wID0gW01bM10sIE1bMV1dXG4gIE1bMV0gPSB0ZW1wWzBdXG4gIE1bM10gPSB0ZW1wWzFdXG4gIHZhciBvdXQgPSB0aGlzLl9kb0NyeXB0QmxvY2soTSwgdGhpcy5faW52S2V5U2NoZWR1bGUsIEcuSU5WX1NVQl9NSVgsIEcuSU5WX1NCT1gpXG4gIHZhciBidWYgPSBuZXcgQnVmZmVyKDE2KVxuICBidWYud3JpdGVVSW50MzJCRShvdXRbMF0sIDApXG4gIGJ1Zi53cml0ZVVJbnQzMkJFKG91dFszXSwgNClcbiAgYnVmLndyaXRlVUludDMyQkUob3V0WzJdLCA4KVxuICBidWYud3JpdGVVSW50MzJCRShvdXRbMV0sIDEyKVxuICByZXR1cm4gYnVmXG59XG5cbkFFUy5wcm90b3R5cGUuc2NydWIgPSBmdW5jdGlvbiAoKSB7XG4gIHNjcnViX3ZlYyh0aGlzLl9rZXlTY2hlZHVsZSlcbiAgc2NydWJfdmVjKHRoaXMuX2ludktleVNjaGVkdWxlKVxuICBzY3J1Yl92ZWModGhpcy5fa2V5KVxufVxuXG5BRVMucHJvdG90eXBlLl9kb0NyeXB0QmxvY2sgPSBmdW5jdGlvbiAoTSwga2V5U2NoZWR1bGUsIFNVQl9NSVgsIFNCT1gpIHtcbiAgdmFyIGtzUm93LCBzMCwgczEsIHMyLCBzMywgdDAsIHQxLCB0MiwgdDNcblxuICBzMCA9IE1bMF0gXiBrZXlTY2hlZHVsZVswXVxuICBzMSA9IE1bMV0gXiBrZXlTY2hlZHVsZVsxXVxuICBzMiA9IE1bMl0gXiBrZXlTY2hlZHVsZVsyXVxuICBzMyA9IE1bM10gXiBrZXlTY2hlZHVsZVszXVxuICBrc1JvdyA9IDRcbiAgZm9yICh2YXIgcm91bmQgPSAxOyByb3VuZCA8IHRoaXMuX25Sb3VuZHM7IHJvdW5kKyspIHtcbiAgICB0MCA9IFNVQl9NSVhbMF1bczAgPj4+IDI0XSBeIFNVQl9NSVhbMV1bKHMxID4+PiAxNikgJiAweGZmXSBeIFNVQl9NSVhbMl1bKHMyID4+PiA4KSAmIDB4ZmZdIF4gU1VCX01JWFszXVtzMyAmIDB4ZmZdIF4ga2V5U2NoZWR1bGVba3NSb3crK11cbiAgICB0MSA9IFNVQl9NSVhbMF1bczEgPj4+IDI0XSBeIFNVQl9NSVhbMV1bKHMyID4+PiAxNikgJiAweGZmXSBeIFNVQl9NSVhbMl1bKHMzID4+PiA4KSAmIDB4ZmZdIF4gU1VCX01JWFszXVtzMCAmIDB4ZmZdIF4ga2V5U2NoZWR1bGVba3NSb3crK11cbiAgICB0MiA9IFNVQl9NSVhbMF1bczIgPj4+IDI0XSBeIFNVQl9NSVhbMV1bKHMzID4+PiAxNikgJiAweGZmXSBeIFNVQl9NSVhbMl1bKHMwID4+PiA4KSAmIDB4ZmZdIF4gU1VCX01JWFszXVtzMSAmIDB4ZmZdIF4ga2V5U2NoZWR1bGVba3NSb3crK11cbiAgICB0MyA9IFNVQl9NSVhbMF1bczMgPj4+IDI0XSBeIFNVQl9NSVhbMV1bKHMwID4+PiAxNikgJiAweGZmXSBeIFNVQl9NSVhbMl1bKHMxID4+PiA4KSAmIDB4ZmZdIF4gU1VCX01JWFszXVtzMiAmIDB4ZmZdIF4ga2V5U2NoZWR1bGVba3NSb3crK11cbiAgICBzMCA9IHQwXG4gICAgczEgPSB0MVxuICAgIHMyID0gdDJcbiAgICBzMyA9IHQzXG4gIH1cbiAgdDAgPSAoKFNCT1hbczAgPj4+IDI0XSA8PCAyNCkgfCAoU0JPWFsoczEgPj4+IDE2KSAmIDB4ZmZdIDw8IDE2KSB8IChTQk9YWyhzMiA+Pj4gOCkgJiAweGZmXSA8PCA4KSB8IFNCT1hbczMgJiAweGZmXSkgXiBrZXlTY2hlZHVsZVtrc1JvdysrXVxuICB0MSA9ICgoU0JPWFtzMSA+Pj4gMjRdIDw8IDI0KSB8IChTQk9YWyhzMiA+Pj4gMTYpICYgMHhmZl0gPDwgMTYpIHwgKFNCT1hbKHMzID4+PiA4KSAmIDB4ZmZdIDw8IDgpIHwgU0JPWFtzMCAmIDB4ZmZdKSBeIGtleVNjaGVkdWxlW2tzUm93KytdXG4gIHQyID0gKChTQk9YW3MyID4+PiAyNF0gPDwgMjQpIHwgKFNCT1hbKHMzID4+PiAxNikgJiAweGZmXSA8PCAxNikgfCAoU0JPWFsoczAgPj4+IDgpICYgMHhmZl0gPDwgOCkgfCBTQk9YW3MxICYgMHhmZl0pIF4ga2V5U2NoZWR1bGVba3NSb3crK11cbiAgdDMgPSAoKFNCT1hbczMgPj4+IDI0XSA8PCAyNCkgfCAoU0JPWFsoczAgPj4+IDE2KSAmIDB4ZmZdIDw8IDE2KSB8IChTQk9YWyhzMSA+Pj4gOCkgJiAweGZmXSA8PCA4KSB8IFNCT1hbczIgJiAweGZmXSkgXiBrZXlTY2hlZHVsZVtrc1JvdysrXVxuICByZXR1cm4gW1xuICAgIGZpeHVwX3VpbnQzMih0MCksXG4gICAgZml4dXBfdWludDMyKHQxKSxcbiAgICBmaXh1cF91aW50MzIodDIpLFxuICAgIGZpeHVwX3VpbnQzMih0MylcbiAgXVxufVxuXG5leHBvcnRzLkFFUyA9IEFFU1xuIiwidmFyIGFlcyA9IHJlcXVpcmUoJy4vYWVzJylcbnZhciBUcmFuc2Zvcm0gPSByZXF1aXJlKCdjaXBoZXItYmFzZScpXG52YXIgaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpXG52YXIgR0hBU0ggPSByZXF1aXJlKCcuL2doYXNoJylcbnZhciB4b3IgPSByZXF1aXJlKCdidWZmZXIteG9yJylcbmluaGVyaXRzKFN0cmVhbUNpcGhlciwgVHJhbnNmb3JtKVxubW9kdWxlLmV4cG9ydHMgPSBTdHJlYW1DaXBoZXJcblxuZnVuY3Rpb24gU3RyZWFtQ2lwaGVyIChtb2RlLCBrZXksIGl2LCBkZWNyeXB0KSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBTdHJlYW1DaXBoZXIpKSB7XG4gICAgcmV0dXJuIG5ldyBTdHJlYW1DaXBoZXIobW9kZSwga2V5LCBpdilcbiAgfVxuICBUcmFuc2Zvcm0uY2FsbCh0aGlzKVxuICB0aGlzLl9maW5JRCA9IEJ1ZmZlci5jb25jYXQoW2l2LCBuZXcgQnVmZmVyKFswLCAwLCAwLCAxXSldKVxuICBpdiA9IEJ1ZmZlci5jb25jYXQoW2l2LCBuZXcgQnVmZmVyKFswLCAwLCAwLCAyXSldKVxuICB0aGlzLl9jaXBoZXIgPSBuZXcgYWVzLkFFUyhrZXkpXG4gIHRoaXMuX3ByZXYgPSBuZXcgQnVmZmVyKGl2Lmxlbmd0aClcbiAgdGhpcy5fY2FjaGUgPSBuZXcgQnVmZmVyKCcnKVxuICB0aGlzLl9zZWNDYWNoZSA9IG5ldyBCdWZmZXIoJycpXG4gIHRoaXMuX2RlY3J5cHQgPSBkZWNyeXB0XG4gIHRoaXMuX2FsZW4gPSAwXG4gIHRoaXMuX2xlbiA9IDBcbiAgaXYuY29weSh0aGlzLl9wcmV2KVxuICB0aGlzLl9tb2RlID0gbW9kZVxuICB2YXIgaCA9IG5ldyBCdWZmZXIoNClcbiAgaC5maWxsKDApXG4gIHRoaXMuX2doYXNoID0gbmV3IEdIQVNIKHRoaXMuX2NpcGhlci5lbmNyeXB0QmxvY2soaCkpXG4gIHRoaXMuX2F1dGhUYWcgPSBudWxsXG4gIHRoaXMuX2NhbGxlZCA9IGZhbHNlXG59XG5TdHJlYW1DaXBoZXIucHJvdG90eXBlLl91cGRhdGUgPSBmdW5jdGlvbiAoY2h1bmspIHtcbiAgaWYgKCF0aGlzLl9jYWxsZWQgJiYgdGhpcy5fYWxlbikge1xuICAgIHZhciBydW1wID0gMTYgLSAodGhpcy5fYWxlbiAlIDE2KVxuICAgIGlmIChydW1wIDwgMTYpIHtcbiAgICAgIHJ1bXAgPSBuZXcgQnVmZmVyKHJ1bXApXG4gICAgICBydW1wLmZpbGwoMClcbiAgICAgIHRoaXMuX2doYXNoLnVwZGF0ZShydW1wKVxuICAgIH1cbiAgfVxuICB0aGlzLl9jYWxsZWQgPSB0cnVlXG4gIHZhciBvdXQgPSB0aGlzLl9tb2RlLmVuY3J5cHQodGhpcywgY2h1bmspXG4gIGlmICh0aGlzLl9kZWNyeXB0KSB7XG4gICAgdGhpcy5fZ2hhc2gudXBkYXRlKGNodW5rKVxuICB9IGVsc2Uge1xuICAgIHRoaXMuX2doYXNoLnVwZGF0ZShvdXQpXG4gIH1cbiAgdGhpcy5fbGVuICs9IGNodW5rLmxlbmd0aFxuICByZXR1cm4gb3V0XG59XG5TdHJlYW1DaXBoZXIucHJvdG90eXBlLl9maW5hbCA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMuX2RlY3J5cHQgJiYgIXRoaXMuX2F1dGhUYWcpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIHN0YXRlIG9yIHVuYWJsZSB0byBhdXRoZW50aWNhdGUgZGF0YScpXG4gIH1cbiAgdmFyIHRhZyA9IHhvcih0aGlzLl9naGFzaC5maW5hbCh0aGlzLl9hbGVuICogOCwgdGhpcy5fbGVuICogOCksIHRoaXMuX2NpcGhlci5lbmNyeXB0QmxvY2sodGhpcy5fZmluSUQpKVxuICBpZiAodGhpcy5fZGVjcnlwdCkge1xuICAgIGlmICh4b3JUZXN0KHRhZywgdGhpcy5fYXV0aFRhZykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgc3RhdGUgb3IgdW5hYmxlIHRvIGF1dGhlbnRpY2F0ZSBkYXRhJylcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5fYXV0aFRhZyA9IHRhZ1xuICB9XG4gIHRoaXMuX2NpcGhlci5zY3J1YigpXG59XG5TdHJlYW1DaXBoZXIucHJvdG90eXBlLmdldEF1dGhUYWcgPSBmdW5jdGlvbiBnZXRBdXRoVGFnICgpIHtcbiAgaWYgKCF0aGlzLl9kZWNyeXB0ICYmIEJ1ZmZlci5pc0J1ZmZlcih0aGlzLl9hdXRoVGFnKSkge1xuICAgIHJldHVybiB0aGlzLl9hdXRoVGFnXG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdBdHRlbXB0aW5nIHRvIGdldCBhdXRoIHRhZyBpbiB1bnN1cHBvcnRlZCBzdGF0ZScpXG4gIH1cbn1cblN0cmVhbUNpcGhlci5wcm90b3R5cGUuc2V0QXV0aFRhZyA9IGZ1bmN0aW9uIHNldEF1dGhUYWcgKHRhZykge1xuICBpZiAodGhpcy5fZGVjcnlwdCkge1xuICAgIHRoaXMuX2F1dGhUYWcgPSB0YWdcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0F0dGVtcHRpbmcgdG8gc2V0IGF1dGggdGFnIGluIHVuc3VwcG9ydGVkIHN0YXRlJylcbiAgfVxufVxuU3RyZWFtQ2lwaGVyLnByb3RvdHlwZS5zZXRBQUQgPSBmdW5jdGlvbiBzZXRBQUQgKGJ1Zikge1xuICBpZiAoIXRoaXMuX2NhbGxlZCkge1xuICAgIHRoaXMuX2doYXNoLnVwZGF0ZShidWYpXG4gICAgdGhpcy5fYWxlbiArPSBidWYubGVuZ3RoXG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdBdHRlbXB0aW5nIHRvIHNldCBBQUQgaW4gdW5zdXBwb3J0ZWQgc3RhdGUnKVxuICB9XG59XG5mdW5jdGlvbiB4b3JUZXN0IChhLCBiKSB7XG4gIHZhciBvdXQgPSAwXG4gIGlmIChhLmxlbmd0aCAhPT0gYi5sZW5ndGgpIHtcbiAgICBvdXQrK1xuICB9XG4gIHZhciBsZW4gPSBNYXRoLm1pbihhLmxlbmd0aCwgYi5sZW5ndGgpXG4gIHZhciBpID0gLTFcbiAgd2hpbGUgKCsraSA8IGxlbikge1xuICAgIG91dCArPSAoYVtpXSBeIGJbaV0pXG4gIH1cbiAgcmV0dXJuIG91dFxufVxuIiwidmFyIGNpcGhlcnMgPSByZXF1aXJlKCcuL2VuY3J5cHRlcicpXG5leHBvcnRzLmNyZWF0ZUNpcGhlciA9IGV4cG9ydHMuQ2lwaGVyID0gY2lwaGVycy5jcmVhdGVDaXBoZXJcbmV4cG9ydHMuY3JlYXRlQ2lwaGVyaXYgPSBleHBvcnRzLkNpcGhlcml2ID0gY2lwaGVycy5jcmVhdGVDaXBoZXJpdlxudmFyIGRlY2lwaGVycyA9IHJlcXVpcmUoJy4vZGVjcnlwdGVyJylcbmV4cG9ydHMuY3JlYXRlRGVjaXBoZXIgPSBleHBvcnRzLkRlY2lwaGVyID0gZGVjaXBoZXJzLmNyZWF0ZURlY2lwaGVyXG5leHBvcnRzLmNyZWF0ZURlY2lwaGVyaXYgPSBleHBvcnRzLkRlY2lwaGVyaXYgPSBkZWNpcGhlcnMuY3JlYXRlRGVjaXBoZXJpdlxudmFyIG1vZGVzID0gcmVxdWlyZSgnLi9tb2RlcycpXG5mdW5jdGlvbiBnZXRDaXBoZXJzICgpIHtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKG1vZGVzKVxufVxuZXhwb3J0cy5saXN0Q2lwaGVycyA9IGV4cG9ydHMuZ2V0Q2lwaGVycyA9IGdldENpcGhlcnNcbiIsInZhciBhZXMgPSByZXF1aXJlKCcuL2FlcycpXG52YXIgVHJhbnNmb3JtID0gcmVxdWlyZSgnY2lwaGVyLWJhc2UnKVxudmFyIGluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKVxudmFyIG1vZGVzID0gcmVxdWlyZSgnLi9tb2RlcycpXG52YXIgU3RyZWFtQ2lwaGVyID0gcmVxdWlyZSgnLi9zdHJlYW1DaXBoZXInKVxudmFyIEF1dGhDaXBoZXIgPSByZXF1aXJlKCcuL2F1dGhDaXBoZXInKVxudmFyIGVidGsgPSByZXF1aXJlKCdldnBfYnl0ZXN0b2tleScpXG5cbmluaGVyaXRzKERlY2lwaGVyLCBUcmFuc2Zvcm0pXG5mdW5jdGlvbiBEZWNpcGhlciAobW9kZSwga2V5LCBpdikge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgRGVjaXBoZXIpKSB7XG4gICAgcmV0dXJuIG5ldyBEZWNpcGhlcihtb2RlLCBrZXksIGl2KVxuICB9XG4gIFRyYW5zZm9ybS5jYWxsKHRoaXMpXG4gIHRoaXMuX2NhY2hlID0gbmV3IFNwbGl0dGVyKClcbiAgdGhpcy5fbGFzdCA9IHZvaWQgMFxuICB0aGlzLl9jaXBoZXIgPSBuZXcgYWVzLkFFUyhrZXkpXG4gIHRoaXMuX3ByZXYgPSBuZXcgQnVmZmVyKGl2Lmxlbmd0aClcbiAgaXYuY29weSh0aGlzLl9wcmV2KVxuICB0aGlzLl9tb2RlID0gbW9kZVxuICB0aGlzLl9hdXRvcGFkZGluZyA9IHRydWVcbn1cbkRlY2lwaGVyLnByb3RvdHlwZS5fdXBkYXRlID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgdGhpcy5fY2FjaGUuYWRkKGRhdGEpXG4gIHZhciBjaHVua1xuICB2YXIgdGhpbmdcbiAgdmFyIG91dCA9IFtdXG4gIHdoaWxlICgoY2h1bmsgPSB0aGlzLl9jYWNoZS5nZXQodGhpcy5fYXV0b3BhZGRpbmcpKSkge1xuICAgIHRoaW5nID0gdGhpcy5fbW9kZS5kZWNyeXB0KHRoaXMsIGNodW5rKVxuICAgIG91dC5wdXNoKHRoaW5nKVxuICB9XG4gIHJldHVybiBCdWZmZXIuY29uY2F0KG91dClcbn1cbkRlY2lwaGVyLnByb3RvdHlwZS5fZmluYWwgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBjaHVuayA9IHRoaXMuX2NhY2hlLmZsdXNoKClcbiAgaWYgKHRoaXMuX2F1dG9wYWRkaW5nKSB7XG4gICAgcmV0dXJuIHVucGFkKHRoaXMuX21vZGUuZGVjcnlwdCh0aGlzLCBjaHVuaykpXG4gIH0gZWxzZSBpZiAoY2h1bmspIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2RhdGEgbm90IG11bHRpcGxlIG9mIGJsb2NrIGxlbmd0aCcpXG4gIH1cbn1cbkRlY2lwaGVyLnByb3RvdHlwZS5zZXRBdXRvUGFkZGluZyA9IGZ1bmN0aW9uIChzZXRUbykge1xuICB0aGlzLl9hdXRvcGFkZGluZyA9ICEhc2V0VG9cbiAgcmV0dXJuIHRoaXNcbn1cbmZ1bmN0aW9uIFNwbGl0dGVyICgpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFNwbGl0dGVyKSkge1xuICAgIHJldHVybiBuZXcgU3BsaXR0ZXIoKVxuICB9XG4gIHRoaXMuY2FjaGUgPSBuZXcgQnVmZmVyKCcnKVxufVxuU3BsaXR0ZXIucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIChkYXRhKSB7XG4gIHRoaXMuY2FjaGUgPSBCdWZmZXIuY29uY2F0KFt0aGlzLmNhY2hlLCBkYXRhXSlcbn1cblxuU3BsaXR0ZXIucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIChhdXRvUGFkZGluZykge1xuICB2YXIgb3V0XG4gIGlmIChhdXRvUGFkZGluZykge1xuICAgIGlmICh0aGlzLmNhY2hlLmxlbmd0aCA+IDE2KSB7XG4gICAgICBvdXQgPSB0aGlzLmNhY2hlLnNsaWNlKDAsIDE2KVxuICAgICAgdGhpcy5jYWNoZSA9IHRoaXMuY2FjaGUuc2xpY2UoMTYpXG4gICAgICByZXR1cm4gb3V0XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmICh0aGlzLmNhY2hlLmxlbmd0aCA+PSAxNikge1xuICAgICAgb3V0ID0gdGhpcy5jYWNoZS5zbGljZSgwLCAxNilcbiAgICAgIHRoaXMuY2FjaGUgPSB0aGlzLmNhY2hlLnNsaWNlKDE2KVxuICAgICAgcmV0dXJuIG91dFxuICAgIH1cbiAgfVxuICByZXR1cm4gbnVsbFxufVxuU3BsaXR0ZXIucHJvdG90eXBlLmZsdXNoID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5jYWNoZS5sZW5ndGgpIHtcbiAgICByZXR1cm4gdGhpcy5jYWNoZVxuICB9XG59XG5mdW5jdGlvbiB1bnBhZCAobGFzdCkge1xuICB2YXIgcGFkZGVkID0gbGFzdFsxNV1cbiAgdmFyIGkgPSAtMVxuICB3aGlsZSAoKytpIDwgcGFkZGVkKSB7XG4gICAgaWYgKGxhc3RbKGkgKyAoMTYgLSBwYWRkZWQpKV0gIT09IHBhZGRlZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bmFibGUgdG8gZGVjcnlwdCBkYXRhJylcbiAgICB9XG4gIH1cbiAgaWYgKHBhZGRlZCA9PT0gMTYpIHtcbiAgICByZXR1cm5cbiAgfVxuICByZXR1cm4gbGFzdC5zbGljZSgwLCAxNiAtIHBhZGRlZClcbn1cblxudmFyIG1vZGVsaXN0ID0ge1xuICBFQ0I6IHJlcXVpcmUoJy4vbW9kZXMvZWNiJyksXG4gIENCQzogcmVxdWlyZSgnLi9tb2Rlcy9jYmMnKSxcbiAgQ0ZCOiByZXF1aXJlKCcuL21vZGVzL2NmYicpLFxuICBDRkI4OiByZXF1aXJlKCcuL21vZGVzL2NmYjgnKSxcbiAgQ0ZCMTogcmVxdWlyZSgnLi9tb2Rlcy9jZmIxJyksXG4gIE9GQjogcmVxdWlyZSgnLi9tb2Rlcy9vZmInKSxcbiAgQ1RSOiByZXF1aXJlKCcuL21vZGVzL2N0cicpLFxuICBHQ006IHJlcXVpcmUoJy4vbW9kZXMvY3RyJylcbn1cblxuZnVuY3Rpb24gY3JlYXRlRGVjaXBoZXJpdiAoc3VpdGUsIHBhc3N3b3JkLCBpdikge1xuICB2YXIgY29uZmlnID0gbW9kZXNbc3VpdGUudG9Mb3dlckNhc2UoKV1cbiAgaWYgKCFjb25maWcpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdpbnZhbGlkIHN1aXRlIHR5cGUnKVxuICB9XG4gIGlmICh0eXBlb2YgaXYgPT09ICdzdHJpbmcnKSB7XG4gICAgaXYgPSBuZXcgQnVmZmVyKGl2KVxuICB9XG4gIGlmICh0eXBlb2YgcGFzc3dvcmQgPT09ICdzdHJpbmcnKSB7XG4gICAgcGFzc3dvcmQgPSBuZXcgQnVmZmVyKHBhc3N3b3JkKVxuICB9XG4gIGlmIChwYXNzd29yZC5sZW5ndGggIT09IGNvbmZpZy5rZXkgLyA4KSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignaW52YWxpZCBrZXkgbGVuZ3RoICcgKyBwYXNzd29yZC5sZW5ndGgpXG4gIH1cbiAgaWYgKGl2Lmxlbmd0aCAhPT0gY29uZmlnLml2KSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignaW52YWxpZCBpdiBsZW5ndGggJyArIGl2Lmxlbmd0aClcbiAgfVxuICBpZiAoY29uZmlnLnR5cGUgPT09ICdzdHJlYW0nKSB7XG4gICAgcmV0dXJuIG5ldyBTdHJlYW1DaXBoZXIobW9kZWxpc3RbY29uZmlnLm1vZGVdLCBwYXNzd29yZCwgaXYsIHRydWUpXG4gIH0gZWxzZSBpZiAoY29uZmlnLnR5cGUgPT09ICdhdXRoJykge1xuICAgIHJldHVybiBuZXcgQXV0aENpcGhlcihtb2RlbGlzdFtjb25maWcubW9kZV0sIHBhc3N3b3JkLCBpdiwgdHJ1ZSlcbiAgfVxuICByZXR1cm4gbmV3IERlY2lwaGVyKG1vZGVsaXN0W2NvbmZpZy5tb2RlXSwgcGFzc3dvcmQsIGl2KVxufVxuXG5mdW5jdGlvbiBjcmVhdGVEZWNpcGhlciAoc3VpdGUsIHBhc3N3b3JkKSB7XG4gIHZhciBjb25maWcgPSBtb2Rlc1tzdWl0ZS50b0xvd2VyQ2FzZSgpXVxuICBpZiAoIWNvbmZpZykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2ludmFsaWQgc3VpdGUgdHlwZScpXG4gIH1cbiAgdmFyIGtleXMgPSBlYnRrKHBhc3N3b3JkLCBmYWxzZSwgY29uZmlnLmtleSwgY29uZmlnLml2KVxuICByZXR1cm4gY3JlYXRlRGVjaXBoZXJpdihzdWl0ZSwga2V5cy5rZXksIGtleXMuaXYpXG59XG5leHBvcnRzLmNyZWF0ZURlY2lwaGVyID0gY3JlYXRlRGVjaXBoZXJcbmV4cG9ydHMuY3JlYXRlRGVjaXBoZXJpdiA9IGNyZWF0ZURlY2lwaGVyaXZcbiIsInZhciBhZXMgPSByZXF1aXJlKCcuL2FlcycpXG52YXIgVHJhbnNmb3JtID0gcmVxdWlyZSgnY2lwaGVyLWJhc2UnKVxudmFyIGluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKVxudmFyIG1vZGVzID0gcmVxdWlyZSgnLi9tb2RlcycpXG52YXIgZWJ0ayA9IHJlcXVpcmUoJ2V2cF9ieXRlc3Rva2V5JylcbnZhciBTdHJlYW1DaXBoZXIgPSByZXF1aXJlKCcuL3N0cmVhbUNpcGhlcicpXG52YXIgQXV0aENpcGhlciA9IHJlcXVpcmUoJy4vYXV0aENpcGhlcicpXG5pbmhlcml0cyhDaXBoZXIsIFRyYW5zZm9ybSlcbmZ1bmN0aW9uIENpcGhlciAobW9kZSwga2V5LCBpdikge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgQ2lwaGVyKSkge1xuICAgIHJldHVybiBuZXcgQ2lwaGVyKG1vZGUsIGtleSwgaXYpXG4gIH1cbiAgVHJhbnNmb3JtLmNhbGwodGhpcylcbiAgdGhpcy5fY2FjaGUgPSBuZXcgU3BsaXR0ZXIoKVxuICB0aGlzLl9jaXBoZXIgPSBuZXcgYWVzLkFFUyhrZXkpXG4gIHRoaXMuX3ByZXYgPSBuZXcgQnVmZmVyKGl2Lmxlbmd0aClcbiAgaXYuY29weSh0aGlzLl9wcmV2KVxuICB0aGlzLl9tb2RlID0gbW9kZVxuICB0aGlzLl9hdXRvcGFkZGluZyA9IHRydWVcbn1cbkNpcGhlci5wcm90b3R5cGUuX3VwZGF0ZSA9IGZ1bmN0aW9uIChkYXRhKSB7XG4gIHRoaXMuX2NhY2hlLmFkZChkYXRhKVxuICB2YXIgY2h1bmtcbiAgdmFyIHRoaW5nXG4gIHZhciBvdXQgPSBbXVxuICB3aGlsZSAoKGNodW5rID0gdGhpcy5fY2FjaGUuZ2V0KCkpKSB7XG4gICAgdGhpbmcgPSB0aGlzLl9tb2RlLmVuY3J5cHQodGhpcywgY2h1bmspXG4gICAgb3V0LnB1c2godGhpbmcpXG4gIH1cbiAgcmV0dXJuIEJ1ZmZlci5jb25jYXQob3V0KVxufVxuQ2lwaGVyLnByb3RvdHlwZS5fZmluYWwgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBjaHVuayA9IHRoaXMuX2NhY2hlLmZsdXNoKClcbiAgaWYgKHRoaXMuX2F1dG9wYWRkaW5nKSB7XG4gICAgY2h1bmsgPSB0aGlzLl9tb2RlLmVuY3J5cHQodGhpcywgY2h1bmspXG4gICAgdGhpcy5fY2lwaGVyLnNjcnViKClcbiAgICByZXR1cm4gY2h1bmtcbiAgfSBlbHNlIGlmIChjaHVuay50b1N0cmluZygnaGV4JykgIT09ICcxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMCcpIHtcbiAgICB0aGlzLl9jaXBoZXIuc2NydWIoKVxuICAgIHRocm93IG5ldyBFcnJvcignZGF0YSBub3QgbXVsdGlwbGUgb2YgYmxvY2sgbGVuZ3RoJylcbiAgfVxufVxuQ2lwaGVyLnByb3RvdHlwZS5zZXRBdXRvUGFkZGluZyA9IGZ1bmN0aW9uIChzZXRUbykge1xuICB0aGlzLl9hdXRvcGFkZGluZyA9ICEhc2V0VG9cbiAgcmV0dXJuIHRoaXNcbn1cblxuZnVuY3Rpb24gU3BsaXR0ZXIgKCkge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgU3BsaXR0ZXIpKSB7XG4gICAgcmV0dXJuIG5ldyBTcGxpdHRlcigpXG4gIH1cbiAgdGhpcy5jYWNoZSA9IG5ldyBCdWZmZXIoJycpXG59XG5TcGxpdHRlci5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgdGhpcy5jYWNoZSA9IEJ1ZmZlci5jb25jYXQoW3RoaXMuY2FjaGUsIGRhdGFdKVxufVxuXG5TcGxpdHRlci5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5jYWNoZS5sZW5ndGggPiAxNSkge1xuICAgIHZhciBvdXQgPSB0aGlzLmNhY2hlLnNsaWNlKDAsIDE2KVxuICAgIHRoaXMuY2FjaGUgPSB0aGlzLmNhY2hlLnNsaWNlKDE2KVxuICAgIHJldHVybiBvdXRcbiAgfVxuICByZXR1cm4gbnVsbFxufVxuU3BsaXR0ZXIucHJvdG90eXBlLmZsdXNoID0gZnVuY3Rpb24gKCkge1xuICB2YXIgbGVuID0gMTYgLSB0aGlzLmNhY2hlLmxlbmd0aFxuICB2YXIgcGFkQnVmZiA9IG5ldyBCdWZmZXIobGVuKVxuXG4gIHZhciBpID0gLTFcbiAgd2hpbGUgKCsraSA8IGxlbikge1xuICAgIHBhZEJ1ZmYud3JpdGVVSW50OChsZW4sIGkpXG4gIH1cbiAgdmFyIG91dCA9IEJ1ZmZlci5jb25jYXQoW3RoaXMuY2FjaGUsIHBhZEJ1ZmZdKVxuICByZXR1cm4gb3V0XG59XG52YXIgbW9kZWxpc3QgPSB7XG4gIEVDQjogcmVxdWlyZSgnLi9tb2Rlcy9lY2InKSxcbiAgQ0JDOiByZXF1aXJlKCcuL21vZGVzL2NiYycpLFxuICBDRkI6IHJlcXVpcmUoJy4vbW9kZXMvY2ZiJyksXG4gIENGQjg6IHJlcXVpcmUoJy4vbW9kZXMvY2ZiOCcpLFxuICBDRkIxOiByZXF1aXJlKCcuL21vZGVzL2NmYjEnKSxcbiAgT0ZCOiByZXF1aXJlKCcuL21vZGVzL29mYicpLFxuICBDVFI6IHJlcXVpcmUoJy4vbW9kZXMvY3RyJyksXG4gIEdDTTogcmVxdWlyZSgnLi9tb2Rlcy9jdHInKVxufVxuXG5mdW5jdGlvbiBjcmVhdGVDaXBoZXJpdiAoc3VpdGUsIHBhc3N3b3JkLCBpdikge1xuICB2YXIgY29uZmlnID0gbW9kZXNbc3VpdGUudG9Mb3dlckNhc2UoKV1cbiAgaWYgKCFjb25maWcpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdpbnZhbGlkIHN1aXRlIHR5cGUnKVxuICB9XG4gIGlmICh0eXBlb2YgaXYgPT09ICdzdHJpbmcnKSB7XG4gICAgaXYgPSBuZXcgQnVmZmVyKGl2KVxuICB9XG4gIGlmICh0eXBlb2YgcGFzc3dvcmQgPT09ICdzdHJpbmcnKSB7XG4gICAgcGFzc3dvcmQgPSBuZXcgQnVmZmVyKHBhc3N3b3JkKVxuICB9XG4gIGlmIChwYXNzd29yZC5sZW5ndGggIT09IGNvbmZpZy5rZXkgLyA4KSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignaW52YWxpZCBrZXkgbGVuZ3RoICcgKyBwYXNzd29yZC5sZW5ndGgpXG4gIH1cbiAgaWYgKGl2Lmxlbmd0aCAhPT0gY29uZmlnLml2KSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignaW52YWxpZCBpdiBsZW5ndGggJyArIGl2Lmxlbmd0aClcbiAgfVxuICBpZiAoY29uZmlnLnR5cGUgPT09ICdzdHJlYW0nKSB7XG4gICAgcmV0dXJuIG5ldyBTdHJlYW1DaXBoZXIobW9kZWxpc3RbY29uZmlnLm1vZGVdLCBwYXNzd29yZCwgaXYpXG4gIH0gZWxzZSBpZiAoY29uZmlnLnR5cGUgPT09ICdhdXRoJykge1xuICAgIHJldHVybiBuZXcgQXV0aENpcGhlcihtb2RlbGlzdFtjb25maWcubW9kZV0sIHBhc3N3b3JkLCBpdilcbiAgfVxuICByZXR1cm4gbmV3IENpcGhlcihtb2RlbGlzdFtjb25maWcubW9kZV0sIHBhc3N3b3JkLCBpdilcbn1cbmZ1bmN0aW9uIGNyZWF0ZUNpcGhlciAoc3VpdGUsIHBhc3N3b3JkKSB7XG4gIHZhciBjb25maWcgPSBtb2Rlc1tzdWl0ZS50b0xvd2VyQ2FzZSgpXVxuICBpZiAoIWNvbmZpZykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2ludmFsaWQgc3VpdGUgdHlwZScpXG4gIH1cbiAgdmFyIGtleXMgPSBlYnRrKHBhc3N3b3JkLCBmYWxzZSwgY29uZmlnLmtleSwgY29uZmlnLml2KVxuICByZXR1cm4gY3JlYXRlQ2lwaGVyaXYoc3VpdGUsIGtleXMua2V5LCBrZXlzLml2KVxufVxuXG5leHBvcnRzLmNyZWF0ZUNpcGhlcml2ID0gY3JlYXRlQ2lwaGVyaXZcbmV4cG9ydHMuY3JlYXRlQ2lwaGVyID0gY3JlYXRlQ2lwaGVyXG4iLCJ2YXIgemVyb3MgPSBuZXcgQnVmZmVyKDE2KVxuemVyb3MuZmlsbCgwKVxubW9kdWxlLmV4cG9ydHMgPSBHSEFTSFxuZnVuY3Rpb24gR0hBU0ggKGtleSkge1xuICB0aGlzLmggPSBrZXlcbiAgdGhpcy5zdGF0ZSA9IG5ldyBCdWZmZXIoMTYpXG4gIHRoaXMuc3RhdGUuZmlsbCgwKVxuICB0aGlzLmNhY2hlID0gbmV3IEJ1ZmZlcignJylcbn1cbi8vIGZyb20gaHR0cDovL2JpdHdpc2VzaGlmdGxlZnQuZ2l0aHViLmlvL3NqY2wvZG9jL3N5bWJvbHMvc3JjL2NvcmVfZ2NtLmpzLmh0bWxcbi8vIGJ5IEp1aG8gVsOkaMOkLUhlcnR0dWFcbkdIQVNILnByb3RvdHlwZS5naGFzaCA9IGZ1bmN0aW9uIChibG9jaykge1xuICB2YXIgaSA9IC0xXG4gIHdoaWxlICgrK2kgPCBibG9jay5sZW5ndGgpIHtcbiAgICB0aGlzLnN0YXRlW2ldIF49IGJsb2NrW2ldXG4gIH1cbiAgdGhpcy5fbXVsdGlwbHkoKVxufVxuXG5HSEFTSC5wcm90b3R5cGUuX211bHRpcGx5ID0gZnVuY3Rpb24gKCkge1xuICB2YXIgVmkgPSB0b0FycmF5KHRoaXMuaClcbiAgdmFyIFppID0gWzAsIDAsIDAsIDBdXG4gIHZhciBqLCB4aSwgbHNiX1ZpXG4gIHZhciBpID0gLTFcbiAgd2hpbGUgKCsraSA8IDEyOCkge1xuICAgIHhpID0gKHRoaXMuc3RhdGVbfn4oaSAvIDgpXSAmICgxIDw8ICg3IC0gaSAlIDgpKSkgIT09IDBcbiAgICBpZiAoeGkpIHtcbiAgICAgIC8vIFpfaSsxID0gWl9pIF4gVl9pXG4gICAgICBaaSA9IHhvcihaaSwgVmkpXG4gICAgfVxuXG4gICAgLy8gU3RvcmUgdGhlIHZhbHVlIG9mIExTQihWX2kpXG4gICAgbHNiX1ZpID0gKFZpWzNdICYgMSkgIT09IDBcblxuICAgIC8vIFZfaSsxID0gVl9pID4+IDFcbiAgICBmb3IgKGogPSAzOyBqID4gMDsgai0tKSB7XG4gICAgICBWaVtqXSA9IChWaVtqXSA+Pj4gMSkgfCAoKFZpW2ogLSAxXSAmIDEpIDw8IDMxKVxuICAgIH1cbiAgICBWaVswXSA9IFZpWzBdID4+PiAxXG5cbiAgICAvLyBJZiBMU0IoVl9pKSBpcyAxLCBWX2krMSA9IChWX2kgPj4gMSkgXiBSXG4gICAgaWYgKGxzYl9WaSkge1xuICAgICAgVmlbMF0gPSBWaVswXSBeICgweGUxIDw8IDI0KVxuICAgIH1cbiAgfVxuICB0aGlzLnN0YXRlID0gZnJvbUFycmF5KFppKVxufVxuR0hBU0gucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uIChidWYpIHtcbiAgdGhpcy5jYWNoZSA9IEJ1ZmZlci5jb25jYXQoW3RoaXMuY2FjaGUsIGJ1Zl0pXG4gIHZhciBjaHVua1xuICB3aGlsZSAodGhpcy5jYWNoZS5sZW5ndGggPj0gMTYpIHtcbiAgICBjaHVuayA9IHRoaXMuY2FjaGUuc2xpY2UoMCwgMTYpXG4gICAgdGhpcy5jYWNoZSA9IHRoaXMuY2FjaGUuc2xpY2UoMTYpXG4gICAgdGhpcy5naGFzaChjaHVuaylcbiAgfVxufVxuR0hBU0gucHJvdG90eXBlLmZpbmFsID0gZnVuY3Rpb24gKGFibCwgYmwpIHtcbiAgaWYgKHRoaXMuY2FjaGUubGVuZ3RoKSB7XG4gICAgdGhpcy5naGFzaChCdWZmZXIuY29uY2F0KFt0aGlzLmNhY2hlLCB6ZXJvc10sIDE2KSlcbiAgfVxuICB0aGlzLmdoYXNoKGZyb21BcnJheShbXG4gICAgMCwgYWJsLFxuICAgIDAsIGJsXG4gIF0pKVxuICByZXR1cm4gdGhpcy5zdGF0ZVxufVxuXG5mdW5jdGlvbiB0b0FycmF5IChidWYpIHtcbiAgcmV0dXJuIFtcbiAgICBidWYucmVhZFVJbnQzMkJFKDApLFxuICAgIGJ1Zi5yZWFkVUludDMyQkUoNCksXG4gICAgYnVmLnJlYWRVSW50MzJCRSg4KSxcbiAgICBidWYucmVhZFVJbnQzMkJFKDEyKVxuICBdXG59XG5mdW5jdGlvbiBmcm9tQXJyYXkgKG91dCkge1xuICBvdXQgPSBvdXQubWFwKGZpeHVwX3VpbnQzMilcbiAgdmFyIGJ1ZiA9IG5ldyBCdWZmZXIoMTYpXG4gIGJ1Zi53cml0ZVVJbnQzMkJFKG91dFswXSwgMClcbiAgYnVmLndyaXRlVUludDMyQkUob3V0WzFdLCA0KVxuICBidWYud3JpdGVVSW50MzJCRShvdXRbMl0sIDgpXG4gIGJ1Zi53cml0ZVVJbnQzMkJFKG91dFszXSwgMTIpXG4gIHJldHVybiBidWZcbn1cbnZhciB1aW50X21heCA9IE1hdGgucG93KDIsIDMyKVxuZnVuY3Rpb24gZml4dXBfdWludDMyICh4KSB7XG4gIHZhciByZXQsIHhfcG9zXG4gIHJldCA9IHggPiB1aW50X21heCB8fCB4IDwgMCA/ICh4X3BvcyA9IE1hdGguYWJzKHgpICUgdWludF9tYXgsIHggPCAwID8gdWludF9tYXggLSB4X3BvcyA6IHhfcG9zKSA6IHhcbiAgcmV0dXJuIHJldFxufVxuZnVuY3Rpb24geG9yIChhLCBiKSB7XG4gIHJldHVybiBbXG4gICAgYVswXSBeIGJbMF0sXG4gICAgYVsxXSBeIGJbMV0sXG4gICAgYVsyXSBeIGJbMl0sXG4gICAgYVszXSBeIGJbM11cbiAgXVxufVxuIiwiZXhwb3J0c1snYWVzLTEyOC1lY2InXSA9IHtcbiAgY2lwaGVyOiAnQUVTJyxcbiAga2V5OiAxMjgsXG4gIGl2OiAwLFxuICBtb2RlOiAnRUNCJyxcbiAgdHlwZTogJ2Jsb2NrJ1xufVxuZXhwb3J0c1snYWVzLTE5Mi1lY2InXSA9IHtcbiAgY2lwaGVyOiAnQUVTJyxcbiAga2V5OiAxOTIsXG4gIGl2OiAwLFxuICBtb2RlOiAnRUNCJyxcbiAgdHlwZTogJ2Jsb2NrJ1xufVxuZXhwb3J0c1snYWVzLTI1Ni1lY2InXSA9IHtcbiAgY2lwaGVyOiAnQUVTJyxcbiAga2V5OiAyNTYsXG4gIGl2OiAwLFxuICBtb2RlOiAnRUNCJyxcbiAgdHlwZTogJ2Jsb2NrJ1xufVxuZXhwb3J0c1snYWVzLTEyOC1jYmMnXSA9IHtcbiAgY2lwaGVyOiAnQUVTJyxcbiAga2V5OiAxMjgsXG4gIGl2OiAxNixcbiAgbW9kZTogJ0NCQycsXG4gIHR5cGU6ICdibG9jaydcbn1cbmV4cG9ydHNbJ2Flcy0xOTItY2JjJ10gPSB7XG4gIGNpcGhlcjogJ0FFUycsXG4gIGtleTogMTkyLFxuICBpdjogMTYsXG4gIG1vZGU6ICdDQkMnLFxuICB0eXBlOiAnYmxvY2snXG59XG5leHBvcnRzWydhZXMtMjU2LWNiYyddID0ge1xuICBjaXBoZXI6ICdBRVMnLFxuICBrZXk6IDI1NixcbiAgaXY6IDE2LFxuICBtb2RlOiAnQ0JDJyxcbiAgdHlwZTogJ2Jsb2NrJ1xufVxuZXhwb3J0c1snYWVzMTI4J10gPSBleHBvcnRzWydhZXMtMTI4LWNiYyddXG5leHBvcnRzWydhZXMxOTInXSA9IGV4cG9ydHNbJ2Flcy0xOTItY2JjJ11cbmV4cG9ydHNbJ2FlczI1NiddID0gZXhwb3J0c1snYWVzLTI1Ni1jYmMnXVxuZXhwb3J0c1snYWVzLTEyOC1jZmInXSA9IHtcbiAgY2lwaGVyOiAnQUVTJyxcbiAga2V5OiAxMjgsXG4gIGl2OiAxNixcbiAgbW9kZTogJ0NGQicsXG4gIHR5cGU6ICdzdHJlYW0nXG59XG5leHBvcnRzWydhZXMtMTkyLWNmYiddID0ge1xuICBjaXBoZXI6ICdBRVMnLFxuICBrZXk6IDE5MixcbiAgaXY6IDE2LFxuICBtb2RlOiAnQ0ZCJyxcbiAgdHlwZTogJ3N0cmVhbSdcbn1cbmV4cG9ydHNbJ2Flcy0yNTYtY2ZiJ10gPSB7XG4gIGNpcGhlcjogJ0FFUycsXG4gIGtleTogMjU2LFxuICBpdjogMTYsXG4gIG1vZGU6ICdDRkInLFxuICB0eXBlOiAnc3RyZWFtJ1xufVxuZXhwb3J0c1snYWVzLTEyOC1jZmI4J10gPSB7XG4gIGNpcGhlcjogJ0FFUycsXG4gIGtleTogMTI4LFxuICBpdjogMTYsXG4gIG1vZGU6ICdDRkI4JyxcbiAgdHlwZTogJ3N0cmVhbSdcbn1cbmV4cG9ydHNbJ2Flcy0xOTItY2ZiOCddID0ge1xuICBjaXBoZXI6ICdBRVMnLFxuICBrZXk6IDE5MixcbiAgaXY6IDE2LFxuICBtb2RlOiAnQ0ZCOCcsXG4gIHR5cGU6ICdzdHJlYW0nXG59XG5leHBvcnRzWydhZXMtMjU2LWNmYjgnXSA9IHtcbiAgY2lwaGVyOiAnQUVTJyxcbiAga2V5OiAyNTYsXG4gIGl2OiAxNixcbiAgbW9kZTogJ0NGQjgnLFxuICB0eXBlOiAnc3RyZWFtJ1xufVxuZXhwb3J0c1snYWVzLTEyOC1jZmIxJ10gPSB7XG4gIGNpcGhlcjogJ0FFUycsXG4gIGtleTogMTI4LFxuICBpdjogMTYsXG4gIG1vZGU6ICdDRkIxJyxcbiAgdHlwZTogJ3N0cmVhbSdcbn1cbmV4cG9ydHNbJ2Flcy0xOTItY2ZiMSddID0ge1xuICBjaXBoZXI6ICdBRVMnLFxuICBrZXk6IDE5MixcbiAgaXY6IDE2LFxuICBtb2RlOiAnQ0ZCMScsXG4gIHR5cGU6ICdzdHJlYW0nXG59XG5leHBvcnRzWydhZXMtMjU2LWNmYjEnXSA9IHtcbiAgY2lwaGVyOiAnQUVTJyxcbiAga2V5OiAyNTYsXG4gIGl2OiAxNixcbiAgbW9kZTogJ0NGQjEnLFxuICB0eXBlOiAnc3RyZWFtJ1xufVxuZXhwb3J0c1snYWVzLTEyOC1vZmInXSA9IHtcbiAgY2lwaGVyOiAnQUVTJyxcbiAga2V5OiAxMjgsXG4gIGl2OiAxNixcbiAgbW9kZTogJ09GQicsXG4gIHR5cGU6ICdzdHJlYW0nXG59XG5leHBvcnRzWydhZXMtMTkyLW9mYiddID0ge1xuICBjaXBoZXI6ICdBRVMnLFxuICBrZXk6IDE5MixcbiAgaXY6IDE2LFxuICBtb2RlOiAnT0ZCJyxcbiAgdHlwZTogJ3N0cmVhbSdcbn1cbmV4cG9ydHNbJ2Flcy0yNTYtb2ZiJ10gPSB7XG4gIGNpcGhlcjogJ0FFUycsXG4gIGtleTogMjU2LFxuICBpdjogMTYsXG4gIG1vZGU6ICdPRkInLFxuICB0eXBlOiAnc3RyZWFtJ1xufVxuZXhwb3J0c1snYWVzLTEyOC1jdHInXSA9IHtcbiAgY2lwaGVyOiAnQUVTJyxcbiAga2V5OiAxMjgsXG4gIGl2OiAxNixcbiAgbW9kZTogJ0NUUicsXG4gIHR5cGU6ICdzdHJlYW0nXG59XG5leHBvcnRzWydhZXMtMTkyLWN0ciddID0ge1xuICBjaXBoZXI6ICdBRVMnLFxuICBrZXk6IDE5MixcbiAgaXY6IDE2LFxuICBtb2RlOiAnQ1RSJyxcbiAgdHlwZTogJ3N0cmVhbSdcbn1cbmV4cG9ydHNbJ2Flcy0yNTYtY3RyJ10gPSB7XG4gIGNpcGhlcjogJ0FFUycsXG4gIGtleTogMjU2LFxuICBpdjogMTYsXG4gIG1vZGU6ICdDVFInLFxuICB0eXBlOiAnc3RyZWFtJ1xufVxuZXhwb3J0c1snYWVzLTEyOC1nY20nXSA9IHtcbiAgY2lwaGVyOiAnQUVTJyxcbiAga2V5OiAxMjgsXG4gIGl2OiAxMixcbiAgbW9kZTogJ0dDTScsXG4gIHR5cGU6ICdhdXRoJ1xufVxuZXhwb3J0c1snYWVzLTE5Mi1nY20nXSA9IHtcbiAgY2lwaGVyOiAnQUVTJyxcbiAga2V5OiAxOTIsXG4gIGl2OiAxMixcbiAgbW9kZTogJ0dDTScsXG4gIHR5cGU6ICdhdXRoJ1xufVxuZXhwb3J0c1snYWVzLTI1Ni1nY20nXSA9IHtcbiAgY2lwaGVyOiAnQUVTJyxcbiAga2V5OiAyNTYsXG4gIGl2OiAxMixcbiAgbW9kZTogJ0dDTScsXG4gIHR5cGU6ICdhdXRoJ1xufVxuIiwidmFyIHhvciA9IHJlcXVpcmUoJ2J1ZmZlci14b3InKVxuXG5leHBvcnRzLmVuY3J5cHQgPSBmdW5jdGlvbiAoc2VsZiwgYmxvY2spIHtcbiAgdmFyIGRhdGEgPSB4b3IoYmxvY2ssIHNlbGYuX3ByZXYpXG5cbiAgc2VsZi5fcHJldiA9IHNlbGYuX2NpcGhlci5lbmNyeXB0QmxvY2soZGF0YSlcbiAgcmV0dXJuIHNlbGYuX3ByZXZcbn1cblxuZXhwb3J0cy5kZWNyeXB0ID0gZnVuY3Rpb24gKHNlbGYsIGJsb2NrKSB7XG4gIHZhciBwYWQgPSBzZWxmLl9wcmV2XG5cbiAgc2VsZi5fcHJldiA9IGJsb2NrXG4gIHZhciBvdXQgPSBzZWxmLl9jaXBoZXIuZGVjcnlwdEJsb2NrKGJsb2NrKVxuXG4gIHJldHVybiB4b3Iob3V0LCBwYWQpXG59XG4iLCJ2YXIgeG9yID0gcmVxdWlyZSgnYnVmZmVyLXhvcicpXG5cbmV4cG9ydHMuZW5jcnlwdCA9IGZ1bmN0aW9uIChzZWxmLCBkYXRhLCBkZWNyeXB0KSB7XG4gIHZhciBvdXQgPSBuZXcgQnVmZmVyKCcnKVxuICB2YXIgbGVuXG5cbiAgd2hpbGUgKGRhdGEubGVuZ3RoKSB7XG4gICAgaWYgKHNlbGYuX2NhY2hlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgc2VsZi5fY2FjaGUgPSBzZWxmLl9jaXBoZXIuZW5jcnlwdEJsb2NrKHNlbGYuX3ByZXYpXG4gICAgICBzZWxmLl9wcmV2ID0gbmV3IEJ1ZmZlcignJylcbiAgICB9XG5cbiAgICBpZiAoc2VsZi5fY2FjaGUubGVuZ3RoIDw9IGRhdGEubGVuZ3RoKSB7XG4gICAgICBsZW4gPSBzZWxmLl9jYWNoZS5sZW5ndGhcbiAgICAgIG91dCA9IEJ1ZmZlci5jb25jYXQoW291dCwgZW5jcnlwdFN0YXJ0KHNlbGYsIGRhdGEuc2xpY2UoMCwgbGVuKSwgZGVjcnlwdCldKVxuICAgICAgZGF0YSA9IGRhdGEuc2xpY2UobGVuKVxuICAgIH0gZWxzZSB7XG4gICAgICBvdXQgPSBCdWZmZXIuY29uY2F0KFtvdXQsIGVuY3J5cHRTdGFydChzZWxmLCBkYXRhLCBkZWNyeXB0KV0pXG4gICAgICBicmVha1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBvdXRcbn1cbmZ1bmN0aW9uIGVuY3J5cHRTdGFydCAoc2VsZiwgZGF0YSwgZGVjcnlwdCkge1xuICB2YXIgbGVuID0gZGF0YS5sZW5ndGhcbiAgdmFyIG91dCA9IHhvcihkYXRhLCBzZWxmLl9jYWNoZSlcbiAgc2VsZi5fY2FjaGUgPSBzZWxmLl9jYWNoZS5zbGljZShsZW4pXG4gIHNlbGYuX3ByZXYgPSBCdWZmZXIuY29uY2F0KFtzZWxmLl9wcmV2LCBkZWNyeXB0ID8gZGF0YSA6IG91dF0pXG4gIHJldHVybiBvdXRcbn1cbiIsImZ1bmN0aW9uIGVuY3J5cHRCeXRlIChzZWxmLCBieXRlUGFyYW0sIGRlY3J5cHQpIHtcbiAgdmFyIHBhZFxuICB2YXIgaSA9IC0xXG4gIHZhciBsZW4gPSA4XG4gIHZhciBvdXQgPSAwXG4gIHZhciBiaXQsIHZhbHVlXG4gIHdoaWxlICgrK2kgPCBsZW4pIHtcbiAgICBwYWQgPSBzZWxmLl9jaXBoZXIuZW5jcnlwdEJsb2NrKHNlbGYuX3ByZXYpXG4gICAgYml0ID0gKGJ5dGVQYXJhbSAmICgxIDw8ICg3IC0gaSkpKSA/IDB4ODAgOiAwXG4gICAgdmFsdWUgPSBwYWRbMF0gXiBiaXRcbiAgICBvdXQgKz0gKCh2YWx1ZSAmIDB4ODApID4+IChpICUgOCkpXG4gICAgc2VsZi5fcHJldiA9IHNoaWZ0SW4oc2VsZi5fcHJldiwgZGVjcnlwdCA/IGJpdCA6IHZhbHVlKVxuICB9XG4gIHJldHVybiBvdXRcbn1cbmV4cG9ydHMuZW5jcnlwdCA9IGZ1bmN0aW9uIChzZWxmLCBjaHVuaywgZGVjcnlwdCkge1xuICB2YXIgbGVuID0gY2h1bmsubGVuZ3RoXG4gIHZhciBvdXQgPSBuZXcgQnVmZmVyKGxlbilcbiAgdmFyIGkgPSAtMVxuICB3aGlsZSAoKytpIDwgbGVuKSB7XG4gICAgb3V0W2ldID0gZW5jcnlwdEJ5dGUoc2VsZiwgY2h1bmtbaV0sIGRlY3J5cHQpXG4gIH1cbiAgcmV0dXJuIG91dFxufVxuZnVuY3Rpb24gc2hpZnRJbiAoYnVmZmVyLCB2YWx1ZSkge1xuICB2YXIgbGVuID0gYnVmZmVyLmxlbmd0aFxuICB2YXIgaSA9IC0xXG4gIHZhciBvdXQgPSBuZXcgQnVmZmVyKGJ1ZmZlci5sZW5ndGgpXG4gIGJ1ZmZlciA9IEJ1ZmZlci5jb25jYXQoW2J1ZmZlciwgbmV3IEJ1ZmZlcihbdmFsdWVdKV0pXG4gIHdoaWxlICgrK2kgPCBsZW4pIHtcbiAgICBvdXRbaV0gPSBidWZmZXJbaV0gPDwgMSB8IGJ1ZmZlcltpICsgMV0gPj4gKDcpXG4gIH1cbiAgcmV0dXJuIG91dFxufVxuIiwiZnVuY3Rpb24gZW5jcnlwdEJ5dGUgKHNlbGYsIGJ5dGVQYXJhbSwgZGVjcnlwdCkge1xuICB2YXIgcGFkID0gc2VsZi5fY2lwaGVyLmVuY3J5cHRCbG9jayhzZWxmLl9wcmV2KVxuICB2YXIgb3V0ID0gcGFkWzBdIF4gYnl0ZVBhcmFtXG4gIHNlbGYuX3ByZXYgPSBCdWZmZXIuY29uY2F0KFtzZWxmLl9wcmV2LnNsaWNlKDEpLCBuZXcgQnVmZmVyKFtkZWNyeXB0ID8gYnl0ZVBhcmFtIDogb3V0XSldKVxuICByZXR1cm4gb3V0XG59XG5leHBvcnRzLmVuY3J5cHQgPSBmdW5jdGlvbiAoc2VsZiwgY2h1bmssIGRlY3J5cHQpIHtcbiAgdmFyIGxlbiA9IGNodW5rLmxlbmd0aFxuICB2YXIgb3V0ID0gbmV3IEJ1ZmZlcihsZW4pXG4gIHZhciBpID0gLTFcbiAgd2hpbGUgKCsraSA8IGxlbikge1xuICAgIG91dFtpXSA9IGVuY3J5cHRCeXRlKHNlbGYsIGNodW5rW2ldLCBkZWNyeXB0KVxuICB9XG4gIHJldHVybiBvdXRcbn1cbiIsInZhciB4b3IgPSByZXF1aXJlKCdidWZmZXIteG9yJylcblxuZnVuY3Rpb24gaW5jcjMyIChpdikge1xuICB2YXIgbGVuID0gaXYubGVuZ3RoXG4gIHZhciBpdGVtXG4gIHdoaWxlIChsZW4tLSkge1xuICAgIGl0ZW0gPSBpdi5yZWFkVUludDgobGVuKVxuICAgIGlmIChpdGVtID09PSAyNTUpIHtcbiAgICAgIGl2LndyaXRlVUludDgoMCwgbGVuKVxuICAgIH0gZWxzZSB7XG4gICAgICBpdGVtKytcbiAgICAgIGl2LndyaXRlVUludDgoaXRlbSwgbGVuKVxuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0QmxvY2sgKHNlbGYpIHtcbiAgdmFyIG91dCA9IHNlbGYuX2NpcGhlci5lbmNyeXB0QmxvY2soc2VsZi5fcHJldilcbiAgaW5jcjMyKHNlbGYuX3ByZXYpXG4gIHJldHVybiBvdXRcbn1cblxuZXhwb3J0cy5lbmNyeXB0ID0gZnVuY3Rpb24gKHNlbGYsIGNodW5rKSB7XG4gIHdoaWxlIChzZWxmLl9jYWNoZS5sZW5ndGggPCBjaHVuay5sZW5ndGgpIHtcbiAgICBzZWxmLl9jYWNoZSA9IEJ1ZmZlci5jb25jYXQoW3NlbGYuX2NhY2hlLCBnZXRCbG9jayhzZWxmKV0pXG4gIH1cbiAgdmFyIHBhZCA9IHNlbGYuX2NhY2hlLnNsaWNlKDAsIGNodW5rLmxlbmd0aClcbiAgc2VsZi5fY2FjaGUgPSBzZWxmLl9jYWNoZS5zbGljZShjaHVuay5sZW5ndGgpXG4gIHJldHVybiB4b3IoY2h1bmssIHBhZClcbn1cbiIsImV4cG9ydHMuZW5jcnlwdCA9IGZ1bmN0aW9uIChzZWxmLCBibG9jaykge1xuICByZXR1cm4gc2VsZi5fY2lwaGVyLmVuY3J5cHRCbG9jayhibG9jaylcbn1cbmV4cG9ydHMuZGVjcnlwdCA9IGZ1bmN0aW9uIChzZWxmLCBibG9jaykge1xuICByZXR1cm4gc2VsZi5fY2lwaGVyLmRlY3J5cHRCbG9jayhibG9jaylcbn1cbiIsInZhciB4b3IgPSByZXF1aXJlKCdidWZmZXIteG9yJylcblxuZnVuY3Rpb24gZ2V0QmxvY2sgKHNlbGYpIHtcbiAgc2VsZi5fcHJldiA9IHNlbGYuX2NpcGhlci5lbmNyeXB0QmxvY2soc2VsZi5fcHJldilcbiAgcmV0dXJuIHNlbGYuX3ByZXZcbn1cblxuZXhwb3J0cy5lbmNyeXB0ID0gZnVuY3Rpb24gKHNlbGYsIGNodW5rKSB7XG4gIHdoaWxlIChzZWxmLl9jYWNoZS5sZW5ndGggPCBjaHVuay5sZW5ndGgpIHtcbiAgICBzZWxmLl9jYWNoZSA9IEJ1ZmZlci5jb25jYXQoW3NlbGYuX2NhY2hlLCBnZXRCbG9jayhzZWxmKV0pXG4gIH1cblxuICB2YXIgcGFkID0gc2VsZi5fY2FjaGUuc2xpY2UoMCwgY2h1bmsubGVuZ3RoKVxuICBzZWxmLl9jYWNoZSA9IHNlbGYuX2NhY2hlLnNsaWNlKGNodW5rLmxlbmd0aClcbiAgcmV0dXJuIHhvcihjaHVuaywgcGFkKVxufVxuIiwidmFyIGFlcyA9IHJlcXVpcmUoJy4vYWVzJylcbnZhciBUcmFuc2Zvcm0gPSByZXF1aXJlKCdjaXBoZXItYmFzZScpXG52YXIgaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpXG5cbmluaGVyaXRzKFN0cmVhbUNpcGhlciwgVHJhbnNmb3JtKVxubW9kdWxlLmV4cG9ydHMgPSBTdHJlYW1DaXBoZXJcbmZ1bmN0aW9uIFN0cmVhbUNpcGhlciAobW9kZSwga2V5LCBpdiwgZGVjcnlwdCkge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgU3RyZWFtQ2lwaGVyKSkge1xuICAgIHJldHVybiBuZXcgU3RyZWFtQ2lwaGVyKG1vZGUsIGtleSwgaXYpXG4gIH1cbiAgVHJhbnNmb3JtLmNhbGwodGhpcylcbiAgdGhpcy5fY2lwaGVyID0gbmV3IGFlcy5BRVMoa2V5KVxuICB0aGlzLl9wcmV2ID0gbmV3IEJ1ZmZlcihpdi5sZW5ndGgpXG4gIHRoaXMuX2NhY2hlID0gbmV3IEJ1ZmZlcignJylcbiAgdGhpcy5fc2VjQ2FjaGUgPSBuZXcgQnVmZmVyKCcnKVxuICB0aGlzLl9kZWNyeXB0ID0gZGVjcnlwdFxuICBpdi5jb3B5KHRoaXMuX3ByZXYpXG4gIHRoaXMuX21vZGUgPSBtb2RlXG59XG5TdHJlYW1DaXBoZXIucHJvdG90eXBlLl91cGRhdGUgPSBmdW5jdGlvbiAoY2h1bmspIHtcbiAgcmV0dXJuIHRoaXMuX21vZGUuZW5jcnlwdCh0aGlzLCBjaHVuaywgdGhpcy5fZGVjcnlwdClcbn1cblN0cmVhbUNpcGhlci5wcm90b3R5cGUuX2ZpbmFsID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLl9jaXBoZXIuc2NydWIoKVxufVxuIiwidmFyIGVidGsgPSByZXF1aXJlKCdldnBfYnl0ZXN0b2tleScpXG52YXIgYWVzID0gcmVxdWlyZSgnYnJvd3NlcmlmeS1hZXMvYnJvd3NlcicpXG52YXIgREVTID0gcmVxdWlyZSgnYnJvd3NlcmlmeS1kZXMnKVxudmFyIGRlc01vZGVzID0gcmVxdWlyZSgnYnJvd3NlcmlmeS1kZXMvbW9kZXMnKVxudmFyIGFlc01vZGVzID0gcmVxdWlyZSgnYnJvd3NlcmlmeS1hZXMvbW9kZXMnKVxuZnVuY3Rpb24gY3JlYXRlQ2lwaGVyIChzdWl0ZSwgcGFzc3dvcmQpIHtcbiAgdmFyIGtleUxlbiwgaXZMZW5cbiAgc3VpdGUgPSBzdWl0ZS50b0xvd2VyQ2FzZSgpXG4gIGlmIChhZXNNb2Rlc1tzdWl0ZV0pIHtcbiAgICBrZXlMZW4gPSBhZXNNb2Rlc1tzdWl0ZV0ua2V5XG4gICAgaXZMZW4gPSBhZXNNb2Rlc1tzdWl0ZV0uaXZcbiAgfSBlbHNlIGlmIChkZXNNb2Rlc1tzdWl0ZV0pIHtcbiAgICBrZXlMZW4gPSBkZXNNb2Rlc1tzdWl0ZV0ua2V5ICogOFxuICAgIGl2TGVuID0gZGVzTW9kZXNbc3VpdGVdLml2XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignaW52YWxpZCBzdWl0ZSB0eXBlJylcbiAgfVxuICB2YXIga2V5cyA9IGVidGsocGFzc3dvcmQsIGZhbHNlLCBrZXlMZW4sIGl2TGVuKVxuICByZXR1cm4gY3JlYXRlQ2lwaGVyaXYoc3VpdGUsIGtleXMua2V5LCBrZXlzLml2KVxufVxuZnVuY3Rpb24gY3JlYXRlRGVjaXBoZXIgKHN1aXRlLCBwYXNzd29yZCkge1xuICB2YXIga2V5TGVuLCBpdkxlblxuICBzdWl0ZSA9IHN1aXRlLnRvTG93ZXJDYXNlKClcbiAgaWYgKGFlc01vZGVzW3N1aXRlXSkge1xuICAgIGtleUxlbiA9IGFlc01vZGVzW3N1aXRlXS5rZXlcbiAgICBpdkxlbiA9IGFlc01vZGVzW3N1aXRlXS5pdlxuICB9IGVsc2UgaWYgKGRlc01vZGVzW3N1aXRlXSkge1xuICAgIGtleUxlbiA9IGRlc01vZGVzW3N1aXRlXS5rZXkgKiA4XG4gICAgaXZMZW4gPSBkZXNNb2Rlc1tzdWl0ZV0uaXZcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdpbnZhbGlkIHN1aXRlIHR5cGUnKVxuICB9XG4gIHZhciBrZXlzID0gZWJ0ayhwYXNzd29yZCwgZmFsc2UsIGtleUxlbiwgaXZMZW4pXG4gIHJldHVybiBjcmVhdGVEZWNpcGhlcml2KHN1aXRlLCBrZXlzLmtleSwga2V5cy5pdilcbn1cblxuZnVuY3Rpb24gY3JlYXRlQ2lwaGVyaXYgKHN1aXRlLCBrZXksIGl2KSB7XG4gIHN1aXRlID0gc3VpdGUudG9Mb3dlckNhc2UoKVxuICBpZiAoYWVzTW9kZXNbc3VpdGVdKSB7XG4gICAgcmV0dXJuIGFlcy5jcmVhdGVDaXBoZXJpdihzdWl0ZSwga2V5LCBpdilcbiAgfSBlbHNlIGlmIChkZXNNb2Rlc1tzdWl0ZV0pIHtcbiAgICByZXR1cm4gbmV3IERFUyh7XG4gICAgICBrZXk6IGtleSxcbiAgICAgIGl2OiBpdixcbiAgICAgIG1vZGU6IHN1aXRlXG4gICAgfSlcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdpbnZhbGlkIHN1aXRlIHR5cGUnKVxuICB9XG59XG5mdW5jdGlvbiBjcmVhdGVEZWNpcGhlcml2IChzdWl0ZSwga2V5LCBpdikge1xuICBzdWl0ZSA9IHN1aXRlLnRvTG93ZXJDYXNlKClcbiAgaWYgKGFlc01vZGVzW3N1aXRlXSkge1xuICAgIHJldHVybiBhZXMuY3JlYXRlRGVjaXBoZXJpdihzdWl0ZSwga2V5LCBpdilcbiAgfSBlbHNlIGlmIChkZXNNb2Rlc1tzdWl0ZV0pIHtcbiAgICByZXR1cm4gbmV3IERFUyh7XG4gICAgICBrZXk6IGtleSxcbiAgICAgIGl2OiBpdixcbiAgICAgIG1vZGU6IHN1aXRlLFxuICAgICAgZGVjcnlwdDogdHJ1ZVxuICAgIH0pXG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignaW52YWxpZCBzdWl0ZSB0eXBlJylcbiAgfVxufVxuZXhwb3J0cy5jcmVhdGVDaXBoZXIgPSBleHBvcnRzLkNpcGhlciA9IGNyZWF0ZUNpcGhlclxuZXhwb3J0cy5jcmVhdGVDaXBoZXJpdiA9IGV4cG9ydHMuQ2lwaGVyaXYgPSBjcmVhdGVDaXBoZXJpdlxuZXhwb3J0cy5jcmVhdGVEZWNpcGhlciA9IGV4cG9ydHMuRGVjaXBoZXIgPSBjcmVhdGVEZWNpcGhlclxuZXhwb3J0cy5jcmVhdGVEZWNpcGhlcml2ID0gZXhwb3J0cy5EZWNpcGhlcml2ID0gY3JlYXRlRGVjaXBoZXJpdlxuZnVuY3Rpb24gZ2V0Q2lwaGVycyAoKSB7XG4gIHJldHVybiBPYmplY3Qua2V5cyhkZXNNb2RlcykuY29uY2F0KGFlcy5nZXRDaXBoZXJzKCkpXG59XG5leHBvcnRzLmxpc3RDaXBoZXJzID0gZXhwb3J0cy5nZXRDaXBoZXJzID0gZ2V0Q2lwaGVyc1xuIiwidmFyIENpcGhlckJhc2UgPSByZXF1aXJlKCdjaXBoZXItYmFzZScpXG52YXIgZGVzID0gcmVxdWlyZSgnZGVzLmpzJylcbnZhciBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJylcblxudmFyIG1vZGVzID0ge1xuICAnZGVzLWVkZTMtY2JjJzogZGVzLkNCQy5pbnN0YW50aWF0ZShkZXMuRURFKSxcbiAgJ2Rlcy1lZGUzJzogZGVzLkVERSxcbiAgJ2Rlcy1lZGUtY2JjJzogZGVzLkNCQy5pbnN0YW50aWF0ZShkZXMuRURFKSxcbiAgJ2Rlcy1lZGUnOiBkZXMuRURFLFxuICAnZGVzLWNiYyc6IGRlcy5DQkMuaW5zdGFudGlhdGUoZGVzLkRFUyksXG4gICdkZXMtZWNiJzogZGVzLkRFU1xufVxubW9kZXMuZGVzID0gbW9kZXNbJ2Rlcy1jYmMnXVxubW9kZXMuZGVzMyA9IG1vZGVzWydkZXMtZWRlMy1jYmMnXVxubW9kdWxlLmV4cG9ydHMgPSBERVNcbmluaGVyaXRzKERFUywgQ2lwaGVyQmFzZSlcbmZ1bmN0aW9uIERFUyAob3B0cykge1xuICBDaXBoZXJCYXNlLmNhbGwodGhpcylcbiAgdmFyIG1vZGVOYW1lID0gb3B0cy5tb2RlLnRvTG93ZXJDYXNlKClcbiAgdmFyIG1vZGUgPSBtb2Rlc1ttb2RlTmFtZV1cbiAgdmFyIHR5cGVcbiAgaWYgKG9wdHMuZGVjcnlwdCkge1xuICAgIHR5cGUgPSAnZGVjcnlwdCdcbiAgfSBlbHNlIHtcbiAgICB0eXBlID0gJ2VuY3J5cHQnXG4gIH1cbiAgdmFyIGtleSA9IG9wdHMua2V5XG4gIGlmIChtb2RlTmFtZSA9PT0gJ2Rlcy1lZGUnIHx8IG1vZGVOYW1lID09PSAnZGVzLWVkZS1jYmMnKSB7XG4gICAga2V5ID0gQnVmZmVyLmNvbmNhdChba2V5LCBrZXkuc2xpY2UoMCwgOCldKVxuICB9XG4gIHZhciBpdiA9IG9wdHMuaXZcbiAgdGhpcy5fZGVzID0gbW9kZS5jcmVhdGUoe1xuICAgIGtleToga2V5LFxuICAgIGl2OiBpdixcbiAgICB0eXBlOiB0eXBlXG4gIH0pXG59XG5ERVMucHJvdG90eXBlLl91cGRhdGUgPSBmdW5jdGlvbiAoZGF0YSkge1xuICByZXR1cm4gbmV3IEJ1ZmZlcih0aGlzLl9kZXMudXBkYXRlKGRhdGEpKVxufVxuREVTLnByb3RvdHlwZS5fZmluYWwgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBuZXcgQnVmZmVyKHRoaXMuX2Rlcy5maW5hbCgpKVxufVxuIiwiZXhwb3J0c1snZGVzLWVjYiddID0ge1xuICBrZXk6IDgsXG4gIGl2OiAwXG59XG5leHBvcnRzWydkZXMtY2JjJ10gPSBleHBvcnRzLmRlcyA9IHtcbiAga2V5OiA4LFxuICBpdjogOFxufVxuZXhwb3J0c1snZGVzLWVkZTMtY2JjJ10gPSBleHBvcnRzLmRlczMgPSB7XG4gIGtleTogMjQsXG4gIGl2OiA4XG59XG5leHBvcnRzWydkZXMtZWRlMyddID0ge1xuICBrZXk6IDI0LFxuICBpdjogMFxufVxuZXhwb3J0c1snZGVzLWVkZS1jYmMnXSA9IHtcbiAga2V5OiAxNixcbiAgaXY6IDhcbn1cbmV4cG9ydHNbJ2Rlcy1lZGUnXSA9IHtcbiAga2V5OiAxNixcbiAgaXY6IDBcbn1cbiIsInZhciBibiA9IHJlcXVpcmUoJ2JuLmpzJyk7XG52YXIgcmFuZG9tQnl0ZXMgPSByZXF1aXJlKCdyYW5kb21ieXRlcycpO1xubW9kdWxlLmV4cG9ydHMgPSBjcnQ7XG5mdW5jdGlvbiBibGluZChwcml2KSB7XG4gIHZhciByID0gZ2V0cihwcml2KTtcbiAgdmFyIGJsaW5kZXIgPSByLnRvUmVkKGJuLm1vbnQocHJpdi5tb2R1bHVzKSlcbiAgLnJlZFBvdyhuZXcgYm4ocHJpdi5wdWJsaWNFeHBvbmVudCkpLmZyb21SZWQoKTtcbiAgcmV0dXJuIHtcbiAgICBibGluZGVyOiBibGluZGVyLFxuICAgIHVuYmxpbmRlcjpyLmludm0ocHJpdi5tb2R1bHVzKVxuICB9O1xufVxuZnVuY3Rpb24gY3J0KG1zZywgcHJpdikge1xuICB2YXIgYmxpbmRzID0gYmxpbmQocHJpdik7XG4gIHZhciBsZW4gPSBwcml2Lm1vZHVsdXMuYnl0ZUxlbmd0aCgpO1xuICB2YXIgbW9kID0gYm4ubW9udChwcml2Lm1vZHVsdXMpO1xuICB2YXIgYmxpbmRlZCA9IG5ldyBibihtc2cpLm11bChibGluZHMuYmxpbmRlcikudW1vZChwcml2Lm1vZHVsdXMpO1xuICB2YXIgYzEgPSBibGluZGVkLnRvUmVkKGJuLm1vbnQocHJpdi5wcmltZTEpKTtcbiAgdmFyIGMyID0gYmxpbmRlZC50b1JlZChibi5tb250KHByaXYucHJpbWUyKSk7XG4gIHZhciBxaW52ID0gcHJpdi5jb2VmZmljaWVudDtcbiAgdmFyIHAgPSBwcml2LnByaW1lMTtcbiAgdmFyIHEgPSBwcml2LnByaW1lMjtcbiAgdmFyIG0xID0gYzEucmVkUG93KHByaXYuZXhwb25lbnQxKTtcbiAgdmFyIG0yID0gYzIucmVkUG93KHByaXYuZXhwb25lbnQyKTtcbiAgbTEgPSBtMS5mcm9tUmVkKCk7XG4gIG0yID0gbTIuZnJvbVJlZCgpO1xuICB2YXIgaCA9IG0xLmlzdWIobTIpLmltdWwocWludikudW1vZChwKTtcbiAgaC5pbXVsKHEpO1xuICBtMi5pYWRkKGgpO1xuICByZXR1cm4gbmV3IEJ1ZmZlcihtMi5pbXVsKGJsaW5kcy51bmJsaW5kZXIpLnVtb2QocHJpdi5tb2R1bHVzKS50b0FycmF5KGZhbHNlLCBsZW4pKTtcbn1cbmNydC5nZXRyID0gZ2V0cjtcbmZ1bmN0aW9uIGdldHIocHJpdikge1xuICB2YXIgbGVuID0gcHJpdi5tb2R1bHVzLmJ5dGVMZW5ndGgoKTtcbiAgdmFyIHIgPSBuZXcgYm4ocmFuZG9tQnl0ZXMobGVuKSk7XG4gIHdoaWxlIChyLmNtcChwcml2Lm1vZHVsdXMpID49ICAwIHx8ICFyLnVtb2QocHJpdi5wcmltZTEpIHx8ICFyLnVtb2QocHJpdi5wcmltZTIpKSB7XG4gICAgciA9IG5ldyBibihyYW5kb21CeXRlcyhsZW4pKTtcbiAgfVxuICByZXR1cm4gcjtcbn1cbiIsIid1c2Ugc3RyaWN0J1xuZXhwb3J0c1snUlNBLVNIQTIyNCddID0gZXhwb3J0cy5zaGEyMjRXaXRoUlNBRW5jcnlwdGlvbiA9IHtcbiAgc2lnbjogJ3JzYScsXG4gIGhhc2g6ICdzaGEyMjQnLFxuICBpZDogbmV3IEJ1ZmZlcignMzAyZDMwMGQwNjA5NjA4NjQ4MDE2NTAzMDQwMjA0MDUwMDA0MWMnLCAnaGV4Jylcbn1cbmV4cG9ydHNbJ1JTQS1TSEEyNTYnXSA9IGV4cG9ydHMuc2hhMjU2V2l0aFJTQUVuY3J5cHRpb24gPSB7XG4gIHNpZ246ICdyc2EnLFxuICBoYXNoOiAnc2hhMjU2JyxcbiAgaWQ6IG5ldyBCdWZmZXIoJzMwMzEzMDBkMDYwOTYwODY0ODAxNjUwMzA0MDIwMTA1MDAwNDIwJywgJ2hleCcpXG59XG5leHBvcnRzWydSU0EtU0hBMzg0J10gPSBleHBvcnRzLnNoYTM4NFdpdGhSU0FFbmNyeXB0aW9uID0ge1xuICBzaWduOiAncnNhJyxcbiAgaGFzaDogJ3NoYTM4NCcsXG4gIGlkOiBuZXcgQnVmZmVyKCczMDQxMzAwZDA2MDk2MDg2NDgwMTY1MDMwNDAyMDIwNTAwMDQzMCcsICdoZXgnKVxufVxuZXhwb3J0c1snUlNBLVNIQTUxMiddID0gZXhwb3J0cy5zaGE1MTJXaXRoUlNBRW5jcnlwdGlvbiA9IHtcbiAgc2lnbjogJ3JzYScsXG4gIGhhc2g6ICdzaGE1MTInLFxuICBpZDogbmV3IEJ1ZmZlcignMzA1MTMwMGQwNjA5NjA4NjQ4MDE2NTAzMDQwMjAzMDUwMDA0NDAnLCAnaGV4Jylcbn1cbmV4cG9ydHNbJ1JTQS1TSEExJ10gPSB7XG4gIHNpZ246ICdyc2EnLFxuICBoYXNoOiAnc2hhMScsXG4gIGlkOiBuZXcgQnVmZmVyKCczMDIxMzAwOTA2MDUyYjBlMDMwMjFhMDUwMDA0MTQnLCAnaGV4Jylcbn1cbmV4cG9ydHNbJ2VjZHNhLXdpdGgtU0hBMSddID0ge1xuICBzaWduOiAnZWNkc2EnLFxuICBoYXNoOiAnc2hhMScsXG4gIGlkOiBuZXcgQnVmZmVyKCcnLCAnaGV4Jylcbn1cblxuZXhwb3J0cy5EU0EgPSBleHBvcnRzWydEU0EtU0hBMSddID0gZXhwb3J0c1snRFNBLVNIQSddID0ge1xuICBzaWduOiAnZHNhJyxcbiAgaGFzaDogJ3NoYTEnLFxuICBpZDogbmV3IEJ1ZmZlcignJywgJ2hleCcpXG59XG5leHBvcnRzWydEU0EtU0hBMjI0J10gPSBleHBvcnRzWydEU0EtV0lUSC1TSEEyMjQnXSA9IHtcbiAgc2lnbjogJ2RzYScsXG4gIGhhc2g6ICdzaGEyMjQnLFxuICBpZDogbmV3IEJ1ZmZlcignJywgJ2hleCcpXG59XG5leHBvcnRzWydEU0EtU0hBMjU2J10gPSBleHBvcnRzWydEU0EtV0lUSC1TSEEyNTYnXSA9IHtcbiAgc2lnbjogJ2RzYScsXG4gIGhhc2g6ICdzaGEyNTYnLFxuICBpZDogbmV3IEJ1ZmZlcignJywgJ2hleCcpXG59XG5leHBvcnRzWydEU0EtU0hBMzg0J10gPSBleHBvcnRzWydEU0EtV0lUSC1TSEEzODQnXSA9IHtcbiAgc2lnbjogJ2RzYScsXG4gIGhhc2g6ICdzaGEzODQnLFxuICBpZDogbmV3IEJ1ZmZlcignJywgJ2hleCcpXG59XG5leHBvcnRzWydEU0EtU0hBNTEyJ10gPSBleHBvcnRzWydEU0EtV0lUSC1TSEE1MTInXSA9IHtcbiAgc2lnbjogJ2RzYScsXG4gIGhhc2g6ICdzaGE1MTInLFxuICBpZDogbmV3IEJ1ZmZlcignJywgJ2hleCcpXG59XG5leHBvcnRzWydEU0EtUklQRU1EMTYwJ10gPSB7XG4gIHNpZ246ICdkc2EnLFxuICBoYXNoOiAncm1kMTYwJyxcbiAgaWQ6IG5ldyBCdWZmZXIoJycsICdoZXgnKVxufVxuZXhwb3J0c1snUlNBLVJJUEVNRDE2MCddID0gZXhwb3J0cy5yaXBlbWQxNjBXaXRoUlNBID0ge1xuICBzaWduOiAncnNhJyxcbiAgaGFzaDogJ3JtZDE2MCcsXG4gIGlkOiBuZXcgQnVmZmVyKCczMDIxMzAwOTA2MDUyYjI0MDMwMjAxMDUwMDA0MTQnLCAnaGV4Jylcbn1cbmV4cG9ydHNbJ1JTQS1NRDUnXSA9IGV4cG9ydHMubWQ1V2l0aFJTQUVuY3J5cHRpb24gPSB7XG4gIHNpZ246ICdyc2EnLFxuICBoYXNoOiAnbWQ1JyxcbiAgaWQ6IG5ldyBCdWZmZXIoJzMwMjAzMDBjMDYwODJhODY0ODg2ZjcwZDAyMDUwNTAwMDQxMCcsICdoZXgnKVxufVxuIiwidmFyIF9hbGdvcyA9IHJlcXVpcmUoJy4vYWxnb3MnKVxudmFyIGNyZWF0ZUhhc2ggPSByZXF1aXJlKCdjcmVhdGUtaGFzaCcpXG52YXIgaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpXG52YXIgc2lnbiA9IHJlcXVpcmUoJy4vc2lnbicpXG52YXIgc3RyZWFtID0gcmVxdWlyZSgnc3RyZWFtJylcbnZhciB2ZXJpZnkgPSByZXF1aXJlKCcuL3ZlcmlmeScpXG5cbnZhciBhbGdvcyA9IHt9XG5PYmplY3Qua2V5cyhfYWxnb3MpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICBhbGdvc1trZXldID0gYWxnb3Nba2V5LnRvTG93ZXJDYXNlKCldID0gX2FsZ29zW2tleV1cbn0pXG5cbmZ1bmN0aW9uIFNpZ24gKGFsZ29yaXRobSkge1xuICBzdHJlYW0uV3JpdGFibGUuY2FsbCh0aGlzKVxuXG4gIHZhciBkYXRhID0gYWxnb3NbYWxnb3JpdGhtXVxuICBpZiAoIWRhdGEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gbWVzc2FnZSBkaWdlc3QnKVxuICB9XG5cbiAgdGhpcy5faGFzaFR5cGUgPSBkYXRhLmhhc2hcbiAgdGhpcy5faGFzaCA9IGNyZWF0ZUhhc2goZGF0YS5oYXNoKVxuICB0aGlzLl90YWcgPSBkYXRhLmlkXG4gIHRoaXMuX3NpZ25UeXBlID0gZGF0YS5zaWduXG59XG5pbmhlcml0cyhTaWduLCBzdHJlYW0uV3JpdGFibGUpXG5cblNpZ24ucHJvdG90eXBlLl93cml0ZSA9IGZ1bmN0aW9uIF93cml0ZSAoZGF0YSwgXywgZG9uZSkge1xuICB0aGlzLl9oYXNoLnVwZGF0ZShkYXRhKVxuICBkb25lKClcbn1cblxuU2lnbi5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gdXBkYXRlIChkYXRhLCBlbmMpIHtcbiAgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykge1xuICAgIGRhdGEgPSBuZXcgQnVmZmVyKGRhdGEsIGVuYylcbiAgfVxuXG4gIHRoaXMuX2hhc2gudXBkYXRlKGRhdGEpXG4gIHJldHVybiB0aGlzXG59XG5cblNpZ24ucHJvdG90eXBlLnNpZ24gPSBmdW5jdGlvbiBzaWduTWV0aG9kIChrZXksIGVuYykge1xuICB0aGlzLmVuZCgpXG4gIHZhciBoYXNoID0gdGhpcy5faGFzaC5kaWdlc3QoKVxuICB2YXIgc2lnID0gc2lnbihCdWZmZXIuY29uY2F0KFt0aGlzLl90YWcsIGhhc2hdKSwga2V5LCB0aGlzLl9oYXNoVHlwZSwgdGhpcy5fc2lnblR5cGUpXG5cbiAgcmV0dXJuIGVuYyA/IHNpZy50b1N0cmluZyhlbmMpIDogc2lnXG59XG5cbmZ1bmN0aW9uIFZlcmlmeSAoYWxnb3JpdGhtKSB7XG4gIHN0cmVhbS5Xcml0YWJsZS5jYWxsKHRoaXMpXG5cbiAgdmFyIGRhdGEgPSBhbGdvc1thbGdvcml0aG1dXG4gIGlmICghZGF0YSkge1xuICAgIHRocm93IG5ldyBFcnJvcignVW5rbm93biBtZXNzYWdlIGRpZ2VzdCcpXG4gIH1cblxuICB0aGlzLl9oYXNoID0gY3JlYXRlSGFzaChkYXRhLmhhc2gpXG4gIHRoaXMuX3RhZyA9IGRhdGEuaWRcbiAgdGhpcy5fc2lnblR5cGUgPSBkYXRhLnNpZ25cbn1cbmluaGVyaXRzKFZlcmlmeSwgc3RyZWFtLldyaXRhYmxlKVxuXG5WZXJpZnkucHJvdG90eXBlLl93cml0ZSA9IGZ1bmN0aW9uIF93cml0ZSAoZGF0YSwgXywgZG9uZSkge1xuICB0aGlzLl9oYXNoLnVwZGF0ZShkYXRhKVxuXG4gIGRvbmUoKVxufVxuXG5WZXJpZnkucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uIHVwZGF0ZSAoZGF0YSwgZW5jKSB7XG4gIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICBkYXRhID0gbmV3IEJ1ZmZlcihkYXRhLCBlbmMpXG4gIH1cblxuICB0aGlzLl9oYXNoLnVwZGF0ZShkYXRhKVxuICByZXR1cm4gdGhpc1xufVxuXG5WZXJpZnkucHJvdG90eXBlLnZlcmlmeSA9IGZ1bmN0aW9uIHZlcmlmeU1ldGhvZCAoa2V5LCBzaWcsIGVuYykge1xuICBpZiAodHlwZW9mIHNpZyA9PT0gJ3N0cmluZycpIHtcbiAgICBzaWcgPSBuZXcgQnVmZmVyKHNpZywgZW5jKVxuICB9XG5cbiAgdGhpcy5lbmQoKVxuICB2YXIgaGFzaCA9IHRoaXMuX2hhc2guZGlnZXN0KClcblxuICByZXR1cm4gdmVyaWZ5KHNpZywgQnVmZmVyLmNvbmNhdChbdGhpcy5fdGFnLCBoYXNoXSksIGtleSwgdGhpcy5fc2lnblR5cGUpXG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVNpZ24gKGFsZ29yaXRobSkge1xuICByZXR1cm4gbmV3IFNpZ24oYWxnb3JpdGhtKVxufVxuXG5mdW5jdGlvbiBjcmVhdGVWZXJpZnkgKGFsZ29yaXRobSkge1xuICByZXR1cm4gbmV3IFZlcmlmeShhbGdvcml0aG0pXG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBTaWduOiBjcmVhdGVTaWduLFxuICBWZXJpZnk6IGNyZWF0ZVZlcmlmeSxcbiAgY3JlYXRlU2lnbjogY3JlYXRlU2lnbixcbiAgY3JlYXRlVmVyaWZ5OiBjcmVhdGVWZXJpZnlcbn1cbiIsIid1c2Ugc3RyaWN0J1xuZXhwb3J0c1snMS4zLjEzMi4wLjEwJ10gPSAnc2VjcDI1NmsxJ1xuXG5leHBvcnRzWycxLjMuMTMyLjAuMzMnXSA9ICdwMjI0J1xuXG5leHBvcnRzWycxLjIuODQwLjEwMDQ1LjMuMS4xJ10gPSAncDE5MidcblxuZXhwb3J0c1snMS4yLjg0MC4xMDA0NS4zLjEuNyddID0gJ3AyNTYnXG5cbmV4cG9ydHNbJzEuMy4xMzIuMC4zNCddID0gJ3AzODQnXG5cbmV4cG9ydHNbJzEuMy4xMzIuMC4zNSddID0gJ3A1MjEnXG4iLCIvLyBtdWNoIG9mIHRoaXMgYmFzZWQgb24gaHR0cHM6Ly9naXRodWIuY29tL2luZHV0bnkvc2VsZi1zaWduZWQvYmxvYi9naC1wYWdlcy9saWIvcnNhLmpzXG52YXIgY3JlYXRlSG1hYyA9IHJlcXVpcmUoJ2NyZWF0ZS1obWFjJylcbnZhciBjcnQgPSByZXF1aXJlKCdicm93c2VyaWZ5LXJzYScpXG52YXIgY3VydmVzID0gcmVxdWlyZSgnLi9jdXJ2ZXMnKVxudmFyIGVsbGlwdGljID0gcmVxdWlyZSgnZWxsaXB0aWMnKVxudmFyIHBhcnNlS2V5cyA9IHJlcXVpcmUoJ3BhcnNlLWFzbjEnKVxuXG52YXIgQk4gPSByZXF1aXJlKCdibi5qcycpXG52YXIgRUMgPSBlbGxpcHRpYy5lY1xuXG5mdW5jdGlvbiBzaWduIChoYXNoLCBrZXksIGhhc2hUeXBlLCBzaWduVHlwZSkge1xuICB2YXIgcHJpdiA9IHBhcnNlS2V5cyhrZXkpXG4gIGlmIChwcml2LmN1cnZlKSB7XG4gICAgaWYgKHNpZ25UeXBlICE9PSAnZWNkc2EnKSB0aHJvdyBuZXcgRXJyb3IoJ3dyb25nIHByaXZhdGUga2V5IHR5cGUnKVxuXG4gICAgcmV0dXJuIGVjU2lnbihoYXNoLCBwcml2KVxuICB9IGVsc2UgaWYgKHByaXYudHlwZSA9PT0gJ2RzYScpIHtcbiAgICBpZiAoc2lnblR5cGUgIT09ICdkc2EnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3dyb25nIHByaXZhdGUga2V5IHR5cGUnKVxuICAgIH1cbiAgICByZXR1cm4gZHNhU2lnbihoYXNoLCBwcml2LCBoYXNoVHlwZSlcbiAgfSBlbHNlIHtcbiAgICBpZiAoc2lnblR5cGUgIT09ICdyc2EnKSB0aHJvdyBuZXcgRXJyb3IoJ3dyb25nIHByaXZhdGUga2V5IHR5cGUnKVxuICB9XG5cbiAgdmFyIGxlbiA9IHByaXYubW9kdWx1cy5ieXRlTGVuZ3RoKClcbiAgdmFyIHBhZCA9IFsgMCwgMSBdXG4gIHdoaWxlIChoYXNoLmxlbmd0aCArIHBhZC5sZW5ndGggKyAxIDwgbGVuKSB7XG4gICAgcGFkLnB1c2goMHhmZilcbiAgfVxuICBwYWQucHVzaCgweDAwKVxuICB2YXIgaSA9IC0xXG4gIHdoaWxlICgrK2kgPCBoYXNoLmxlbmd0aCkge1xuICAgIHBhZC5wdXNoKGhhc2hbaV0pXG4gIH1cblxuICB2YXIgb3V0ID0gY3J0KHBhZCwgcHJpdilcbiAgcmV0dXJuIG91dFxufVxuXG5mdW5jdGlvbiBlY1NpZ24gKGhhc2gsIHByaXYpIHtcbiAgdmFyIGN1cnZlSWQgPSBjdXJ2ZXNbcHJpdi5jdXJ2ZS5qb2luKCcuJyldXG4gIGlmICghY3VydmVJZCkgdGhyb3cgbmV3IEVycm9yKCd1bmtub3duIGN1cnZlICcgKyBwcml2LmN1cnZlLmpvaW4oJy4nKSlcblxuICB2YXIgY3VydmUgPSBuZXcgRUMoY3VydmVJZClcbiAgdmFyIGtleSA9IGN1cnZlLmdlbktleVBhaXIoKVxuXG4gIGtleS5faW1wb3J0UHJpdmF0ZShwcml2LnByaXZhdGVLZXkpXG4gIHZhciBvdXQgPSBrZXkuc2lnbihoYXNoKVxuXG4gIHJldHVybiBuZXcgQnVmZmVyKG91dC50b0RFUigpKVxufVxuXG5mdW5jdGlvbiBkc2FTaWduIChoYXNoLCBwcml2LCBhbGdvKSB7XG4gIHZhciB4ID0gcHJpdi5wYXJhbXMucHJpdl9rZXlcbiAgdmFyIHAgPSBwcml2LnBhcmFtcy5wXG4gIHZhciBxID0gcHJpdi5wYXJhbXMucVxuICB2YXIgZyA9IHByaXYucGFyYW1zLmdcbiAgdmFyIHIgPSBuZXcgQk4oMClcbiAgdmFyIGtcbiAgdmFyIEggPSBiaXRzMmludChoYXNoLCBxKS5tb2QocSlcbiAgdmFyIHMgPSBmYWxzZVxuICB2YXIga3YgPSBnZXRLZXkoeCwgcSwgaGFzaCwgYWxnbylcbiAgd2hpbGUgKHMgPT09IGZhbHNlKSB7XG4gICAgayA9IG1ha2VLZXkocSwga3YsIGFsZ28pXG4gICAgciA9IG1ha2VSKGcsIGssIHAsIHEpXG4gICAgcyA9IGsuaW52bShxKS5pbXVsKEguYWRkKHgubXVsKHIpKSkubW9kKHEpXG4gICAgaWYgKCFzLmNtcG4oMCkpIHtcbiAgICAgIHMgPSBmYWxzZVxuICAgICAgciA9IG5ldyBCTigwKVxuICAgIH1cbiAgfVxuICByZXR1cm4gdG9ERVIociwgcylcbn1cblxuZnVuY3Rpb24gdG9ERVIgKHIsIHMpIHtcbiAgciA9IHIudG9BcnJheSgpXG4gIHMgPSBzLnRvQXJyYXkoKVxuXG4gIC8vIFBhZCB2YWx1ZXNcbiAgaWYgKHJbMF0gJiAweDgwKSB7XG4gICAgciA9IFsgMCBdLmNvbmNhdChyKVxuICB9XG4gIC8vIFBhZCB2YWx1ZXNcbiAgaWYgKHNbMF0gJiAweDgwKSB7XG4gICAgcyA9IFswXS5jb25jYXQocylcbiAgfVxuXG4gIHZhciB0b3RhbCA9IHIubGVuZ3RoICsgcy5sZW5ndGggKyA0XG4gIHZhciByZXMgPSBbIDB4MzAsIHRvdGFsLCAweDAyLCByLmxlbmd0aCBdXG4gIHJlcyA9IHJlcy5jb25jYXQociwgWyAweDAyLCBzLmxlbmd0aCBdLCBzKVxuICByZXR1cm4gbmV3IEJ1ZmZlcihyZXMpXG59XG5cbmZ1bmN0aW9uIGdldEtleSAoeCwgcSwgaGFzaCwgYWxnbykge1xuICB4ID0gbmV3IEJ1ZmZlcih4LnRvQXJyYXkoKSlcbiAgaWYgKHgubGVuZ3RoIDwgcS5ieXRlTGVuZ3RoKCkpIHtcbiAgICB2YXIgemVyb3MgPSBuZXcgQnVmZmVyKHEuYnl0ZUxlbmd0aCgpIC0geC5sZW5ndGgpXG4gICAgemVyb3MuZmlsbCgwKVxuICAgIHggPSBCdWZmZXIuY29uY2F0KFt6ZXJvcywgeF0pXG4gIH1cbiAgdmFyIGhsZW4gPSBoYXNoLmxlbmd0aFxuICB2YXIgaGJpdHMgPSBiaXRzMm9jdGV0cyhoYXNoLCBxKVxuICB2YXIgdiA9IG5ldyBCdWZmZXIoaGxlbilcbiAgdi5maWxsKDEpXG4gIHZhciBrID0gbmV3IEJ1ZmZlcihobGVuKVxuICBrLmZpbGwoMClcbiAgayA9IGNyZWF0ZUhtYWMoYWxnbywgaylcbiAgICAudXBkYXRlKHYpXG4gICAgLnVwZGF0ZShuZXcgQnVmZmVyKFswXSkpXG4gICAgLnVwZGF0ZSh4KVxuICAgIC51cGRhdGUoaGJpdHMpXG4gICAgLmRpZ2VzdCgpXG4gIHYgPSBjcmVhdGVIbWFjKGFsZ28sIGspXG4gICAgLnVwZGF0ZSh2KVxuICAgIC5kaWdlc3QoKVxuICBrID0gY3JlYXRlSG1hYyhhbGdvLCBrKVxuICAgIC51cGRhdGUodilcbiAgICAudXBkYXRlKG5ldyBCdWZmZXIoWzFdKSlcbiAgICAudXBkYXRlKHgpXG4gICAgLnVwZGF0ZShoYml0cylcbiAgICAuZGlnZXN0KClcbiAgdiA9IGNyZWF0ZUhtYWMoYWxnbywgaylcbiAgICAudXBkYXRlKHYpXG4gICAgLmRpZ2VzdCgpXG4gIHJldHVybiB7XG4gICAgazogayxcbiAgICB2OiB2XG4gIH1cbn1cblxuZnVuY3Rpb24gYml0czJpbnQgKG9iaXRzLCBxKSB7XG4gIHZhciBiaXRzID0gbmV3IEJOKG9iaXRzKVxuICB2YXIgc2hpZnQgPSAob2JpdHMubGVuZ3RoIDw8IDMpIC0gcS5iaXRMZW5ndGgoKVxuICBpZiAoc2hpZnQgPiAwKSB7XG4gICAgYml0cy5pc2hybihzaGlmdClcbiAgfVxuICByZXR1cm4gYml0c1xufVxuXG5mdW5jdGlvbiBiaXRzMm9jdGV0cyAoYml0cywgcSkge1xuICBiaXRzID0gYml0czJpbnQoYml0cywgcSlcbiAgYml0cyA9IGJpdHMubW9kKHEpXG4gIHZhciBvdXQgPSBuZXcgQnVmZmVyKGJpdHMudG9BcnJheSgpKVxuICBpZiAob3V0Lmxlbmd0aCA8IHEuYnl0ZUxlbmd0aCgpKSB7XG4gICAgdmFyIHplcm9zID0gbmV3IEJ1ZmZlcihxLmJ5dGVMZW5ndGgoKSAtIG91dC5sZW5ndGgpXG4gICAgemVyb3MuZmlsbCgwKVxuICAgIG91dCA9IEJ1ZmZlci5jb25jYXQoW3plcm9zLCBvdXRdKVxuICB9XG4gIHJldHVybiBvdXRcbn1cblxuZnVuY3Rpb24gbWFrZUtleSAocSwga3YsIGFsZ28pIHtcbiAgdmFyIHQsIGtcblxuICBkbyB7XG4gICAgdCA9IG5ldyBCdWZmZXIoJycpXG5cbiAgICB3aGlsZSAodC5sZW5ndGggKiA4IDwgcS5iaXRMZW5ndGgoKSkge1xuICAgICAga3YudiA9IGNyZWF0ZUhtYWMoYWxnbywga3YuaylcbiAgICAgICAgLnVwZGF0ZShrdi52KVxuICAgICAgICAuZGlnZXN0KClcbiAgICAgIHQgPSBCdWZmZXIuY29uY2F0KFt0LCBrdi52XSlcbiAgICB9XG5cbiAgICBrID0gYml0czJpbnQodCwgcSlcbiAgICBrdi5rID0gY3JlYXRlSG1hYyhhbGdvLCBrdi5rKVxuICAgICAgLnVwZGF0ZShrdi52KVxuICAgICAgLnVwZGF0ZShuZXcgQnVmZmVyKFswXSkpXG4gICAgICAuZGlnZXN0KClcbiAgICBrdi52ID0gY3JlYXRlSG1hYyhhbGdvLCBrdi5rKVxuICAgICAgLnVwZGF0ZShrdi52KVxuICAgICAgLmRpZ2VzdCgpXG4gIH0gd2hpbGUgKGsuY21wKHEpICE9PSAtMSlcblxuICByZXR1cm4ga1xufVxuXG5mdW5jdGlvbiBtYWtlUiAoZywgaywgcCwgcSkge1xuICByZXR1cm4gZy50b1JlZChCTi5tb250KHApKS5yZWRQb3coaykuZnJvbVJlZCgpLm1vZChxKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNpZ25cbm1vZHVsZS5leHBvcnRzLmdldEtleSA9IGdldEtleVxubW9kdWxlLmV4cG9ydHMubWFrZUtleSA9IG1ha2VLZXlcbiIsIi8vIG11Y2ggb2YgdGhpcyBiYXNlZCBvbiBodHRwczovL2dpdGh1Yi5jb20vaW5kdXRueS9zZWxmLXNpZ25lZC9ibG9iL2doLXBhZ2VzL2xpYi9yc2EuanNcbnZhciBjdXJ2ZXMgPSByZXF1aXJlKCcuL2N1cnZlcycpXG52YXIgZWxsaXB0aWMgPSByZXF1aXJlKCdlbGxpcHRpYycpXG52YXIgcGFyc2VLZXlzID0gcmVxdWlyZSgncGFyc2UtYXNuMScpXG5cbnZhciBCTiA9IHJlcXVpcmUoJ2JuLmpzJylcbnZhciBFQyA9IGVsbGlwdGljLmVjXG5cbmZ1bmN0aW9uIHZlcmlmeSAoc2lnLCBoYXNoLCBrZXksIHNpZ25UeXBlKSB7XG4gIHZhciBwdWIgPSBwYXJzZUtleXMoa2V5KVxuICBpZiAocHViLnR5cGUgPT09ICdlYycpIHtcbiAgICBpZiAoc2lnblR5cGUgIT09ICdlY2RzYScpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignd3JvbmcgcHVibGljIGtleSB0eXBlJylcbiAgICB9XG4gICAgcmV0dXJuIGVjVmVyaWZ5KHNpZywgaGFzaCwgcHViKVxuICB9IGVsc2UgaWYgKHB1Yi50eXBlID09PSAnZHNhJykge1xuICAgIGlmIChzaWduVHlwZSAhPT0gJ2RzYScpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignd3JvbmcgcHVibGljIGtleSB0eXBlJylcbiAgICB9XG4gICAgcmV0dXJuIGRzYVZlcmlmeShzaWcsIGhhc2gsIHB1YilcbiAgfSBlbHNlIHtcbiAgICBpZiAoc2lnblR5cGUgIT09ICdyc2EnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3dyb25nIHB1YmxpYyBrZXkgdHlwZScpXG4gICAgfVxuICB9XG4gIHZhciBsZW4gPSBwdWIubW9kdWx1cy5ieXRlTGVuZ3RoKClcbiAgdmFyIHBhZCA9IFsgMSBdXG4gIHZhciBwYWROdW0gPSAwXG4gIHdoaWxlIChoYXNoLmxlbmd0aCArIHBhZC5sZW5ndGggKyAyIDwgbGVuKSB7XG4gICAgcGFkLnB1c2goMHhmZilcbiAgICBwYWROdW0rK1xuICB9XG4gIHBhZC5wdXNoKDB4MDApXG4gIHZhciBpID0gLTFcbiAgd2hpbGUgKCsraSA8IGhhc2gubGVuZ3RoKSB7XG4gICAgcGFkLnB1c2goaGFzaFtpXSlcbiAgfVxuICBwYWQgPSBuZXcgQnVmZmVyKHBhZClcbiAgdmFyIHJlZCA9IEJOLm1vbnQocHViLm1vZHVsdXMpXG4gIHNpZyA9IG5ldyBCTihzaWcpLnRvUmVkKHJlZClcblxuICBzaWcgPSBzaWcucmVkUG93KG5ldyBCTihwdWIucHVibGljRXhwb25lbnQpKVxuXG4gIHNpZyA9IG5ldyBCdWZmZXIoc2lnLmZyb21SZWQoKS50b0FycmF5KCkpXG4gIHZhciBvdXQgPSAwXG4gIGlmIChwYWROdW0gPCA4KSB7XG4gICAgb3V0ID0gMVxuICB9XG4gIGxlbiA9IE1hdGgubWluKHNpZy5sZW5ndGgsIHBhZC5sZW5ndGgpXG4gIGlmIChzaWcubGVuZ3RoICE9PSBwYWQubGVuZ3RoKSB7XG4gICAgb3V0ID0gMVxuICB9XG5cbiAgaSA9IC0xXG4gIHdoaWxlICgrK2kgPCBsZW4pIHtcbiAgICBvdXQgfD0gKHNpZ1tpXSBeIHBhZFtpXSlcbiAgfVxuICByZXR1cm4gb3V0ID09PSAwXG59XG5cbmZ1bmN0aW9uIGVjVmVyaWZ5IChzaWcsIGhhc2gsIHB1Yikge1xuICB2YXIgY3VydmVJZCA9IGN1cnZlc1twdWIuZGF0YS5hbGdvcml0aG0uY3VydmUuam9pbignLicpXVxuICBpZiAoIWN1cnZlSWQpIHRocm93IG5ldyBFcnJvcigndW5rbm93biBjdXJ2ZSAnICsgcHViLmRhdGEuYWxnb3JpdGhtLmN1cnZlLmpvaW4oJy4nKSlcblxuICB2YXIgY3VydmUgPSBuZXcgRUMoY3VydmVJZClcbiAgdmFyIHB1YmtleSA9IHB1Yi5kYXRhLnN1YmplY3RQcml2YXRlS2V5LmRhdGFcblxuICByZXR1cm4gY3VydmUudmVyaWZ5KGhhc2gsIHNpZywgcHVia2V5KVxufVxuXG5mdW5jdGlvbiBkc2FWZXJpZnkgKHNpZywgaGFzaCwgcHViKSB7XG4gIHZhciBwID0gcHViLmRhdGEucFxuICB2YXIgcSA9IHB1Yi5kYXRhLnFcbiAgdmFyIGcgPSBwdWIuZGF0YS5nXG4gIHZhciB5ID0gcHViLmRhdGEucHViX2tleVxuICB2YXIgdW5wYWNrZWQgPSBwYXJzZUtleXMuc2lnbmF0dXJlLmRlY29kZShzaWcsICdkZXInKVxuICB2YXIgcyA9IHVucGFja2VkLnNcbiAgdmFyIHIgPSB1bnBhY2tlZC5yXG4gIGNoZWNrVmFsdWUocywgcSlcbiAgY2hlY2tWYWx1ZShyLCBxKVxuICB2YXIgbW9udHAgPSBCTi5tb250KHApXG4gIHZhciB3ID0gcy5pbnZtKHEpXG4gIHZhciB2ID0gZy50b1JlZChtb250cClcbiAgICAucmVkUG93KG5ldyBCTihoYXNoKS5tdWwodykubW9kKHEpKVxuICAgIC5mcm9tUmVkKClcbiAgICAubXVsKFxuICAgICAgeS50b1JlZChtb250cClcbiAgICAgICAgLnJlZFBvdyhyLm11bCh3KS5tb2QocSkpXG4gICAgICAgIC5mcm9tUmVkKClcbiAgKS5tb2QocCkubW9kKHEpXG4gIHJldHVybiAhdi5jbXAocilcbn1cblxuZnVuY3Rpb24gY2hlY2tWYWx1ZSAoYiwgcSkge1xuICBpZiAoYi5jbXBuKDApIDw9IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgc2lnJylcbiAgfVxuICBpZiAoYi5jbXAocSkgPj0gcSkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBzaWcnKVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdmVyaWZ5XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHhvciAoYSwgYikge1xuICB2YXIgbGVuZ3RoID0gTWF0aC5taW4oYS5sZW5ndGgsIGIubGVuZ3RoKVxuICB2YXIgYnVmZmVyID0gbmV3IEJ1ZmZlcihsZW5ndGgpXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgIGJ1ZmZlcltpXSA9IGFbaV0gXiBiW2ldXG4gIH1cblxuICByZXR1cm4gYnVmZmVyXG59XG4iLCIvKiFcbiAqIFRoZSBidWZmZXIgbW9kdWxlIGZyb20gbm9kZS5qcywgZm9yIHRoZSBicm93c2VyLlxuICpcbiAqIEBhdXRob3IgICBGZXJvc3MgQWJvdWtoYWRpamVoIDxmZXJvc3NAZmVyb3NzLm9yZz4gPGh0dHA6Ly9mZXJvc3Mub3JnPlxuICogQGxpY2Vuc2UgIE1JVFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1wcm90byAqL1xuXG4ndXNlIHN0cmljdCdcblxudmFyIGJhc2U2NCA9IHJlcXVpcmUoJ2Jhc2U2NC1qcycpXG52YXIgaWVlZTc1NCA9IHJlcXVpcmUoJ2llZWU3NTQnKVxudmFyIGlzQXJyYXkgPSByZXF1aXJlKCdpc2FycmF5JylcblxuZXhwb3J0cy5CdWZmZXIgPSBCdWZmZXJcbmV4cG9ydHMuU2xvd0J1ZmZlciA9IFNsb3dCdWZmZXJcbmV4cG9ydHMuSU5TUEVDVF9NQVhfQllURVMgPSA1MFxuQnVmZmVyLnBvb2xTaXplID0gODE5MiAvLyBub3QgdXNlZCBieSB0aGlzIGltcGxlbWVudGF0aW9uXG5cbnZhciByb290UGFyZW50ID0ge31cblxuLyoqXG4gKiBJZiBgQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlRgOlxuICogICA9PT0gdHJ1ZSAgICBVc2UgVWludDhBcnJheSBpbXBsZW1lbnRhdGlvbiAoZmFzdGVzdClcbiAqICAgPT09IGZhbHNlICAgVXNlIE9iamVjdCBpbXBsZW1lbnRhdGlvbiAobW9zdCBjb21wYXRpYmxlLCBldmVuIElFNilcbiAqXG4gKiBCcm93c2VycyB0aGF0IHN1cHBvcnQgdHlwZWQgYXJyYXlzIGFyZSBJRSAxMCssIEZpcmVmb3ggNCssIENocm9tZSA3KywgU2FmYXJpIDUuMSssXG4gKiBPcGVyYSAxMS42KywgaU9TIDQuMisuXG4gKlxuICogRHVlIHRvIHZhcmlvdXMgYnJvd3NlciBidWdzLCBzb21ldGltZXMgdGhlIE9iamVjdCBpbXBsZW1lbnRhdGlvbiB3aWxsIGJlIHVzZWQgZXZlblxuICogd2hlbiB0aGUgYnJvd3NlciBzdXBwb3J0cyB0eXBlZCBhcnJheXMuXG4gKlxuICogTm90ZTpcbiAqXG4gKiAgIC0gRmlyZWZveCA0LTI5IGxhY2tzIHN1cHBvcnQgZm9yIGFkZGluZyBuZXcgcHJvcGVydGllcyB0byBgVWludDhBcnJheWAgaW5zdGFuY2VzLFxuICogICAgIFNlZTogaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njk1NDM4LlxuICpcbiAqICAgLSBDaHJvbWUgOS0xMCBpcyBtaXNzaW5nIHRoZSBgVHlwZWRBcnJheS5wcm90b3R5cGUuc3ViYXJyYXlgIGZ1bmN0aW9uLlxuICpcbiAqICAgLSBJRTEwIGhhcyBhIGJyb2tlbiBgVHlwZWRBcnJheS5wcm90b3R5cGUuc3ViYXJyYXlgIGZ1bmN0aW9uIHdoaWNoIHJldHVybnMgYXJyYXlzIG9mXG4gKiAgICAgaW5jb3JyZWN0IGxlbmd0aCBpbiBzb21lIHNpdHVhdGlvbnMuXG5cbiAqIFdlIGRldGVjdCB0aGVzZSBidWdneSBicm93c2VycyBhbmQgc2V0IGBCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVGAgdG8gYGZhbHNlYCBzbyB0aGV5XG4gKiBnZXQgdGhlIE9iamVjdCBpbXBsZW1lbnRhdGlvbiwgd2hpY2ggaXMgc2xvd2VyIGJ1dCBiZWhhdmVzIGNvcnJlY3RseS5cbiAqL1xuQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQgPSBnbG9iYWwuVFlQRURfQVJSQVlfU1VQUE9SVCAhPT0gdW5kZWZpbmVkXG4gID8gZ2xvYmFsLlRZUEVEX0FSUkFZX1NVUFBPUlRcbiAgOiB0eXBlZEFycmF5U3VwcG9ydCgpXG5cbmZ1bmN0aW9uIHR5cGVkQXJyYXlTdXBwb3J0ICgpIHtcbiAgdHJ5IHtcbiAgICB2YXIgYXJyID0gbmV3IFVpbnQ4QXJyYXkoMSlcbiAgICBhcnIuZm9vID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gNDIgfVxuICAgIHJldHVybiBhcnIuZm9vKCkgPT09IDQyICYmIC8vIHR5cGVkIGFycmF5IGluc3RhbmNlcyBjYW4gYmUgYXVnbWVudGVkXG4gICAgICAgIHR5cGVvZiBhcnIuc3ViYXJyYXkgPT09ICdmdW5jdGlvbicgJiYgLy8gY2hyb21lIDktMTAgbGFjayBgc3ViYXJyYXlgXG4gICAgICAgIGFyci5zdWJhcnJheSgxLCAxKS5ieXRlTGVuZ3RoID09PSAwIC8vIGllMTAgaGFzIGJyb2tlbiBgc3ViYXJyYXlgXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5mdW5jdGlvbiBrTWF4TGVuZ3RoICgpIHtcbiAgcmV0dXJuIEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUXG4gICAgPyAweDdmZmZmZmZmXG4gICAgOiAweDNmZmZmZmZmXG59XG5cbi8qKlxuICogVGhlIEJ1ZmZlciBjb25zdHJ1Y3RvciByZXR1cm5zIGluc3RhbmNlcyBvZiBgVWludDhBcnJheWAgdGhhdCBoYXZlIHRoZWlyXG4gKiBwcm90b3R5cGUgY2hhbmdlZCB0byBgQnVmZmVyLnByb3RvdHlwZWAuIEZ1cnRoZXJtb3JlLCBgQnVmZmVyYCBpcyBhIHN1YmNsYXNzIG9mXG4gKiBgVWludDhBcnJheWAsIHNvIHRoZSByZXR1cm5lZCBpbnN0YW5jZXMgd2lsbCBoYXZlIGFsbCB0aGUgbm9kZSBgQnVmZmVyYCBtZXRob2RzXG4gKiBhbmQgdGhlIGBVaW50OEFycmF5YCBtZXRob2RzLiBTcXVhcmUgYnJhY2tldCBub3RhdGlvbiB3b3JrcyBhcyBleHBlY3RlZCAtLSBpdFxuICogcmV0dXJucyBhIHNpbmdsZSBvY3RldC5cbiAqXG4gKiBUaGUgYFVpbnQ4QXJyYXlgIHByb3RvdHlwZSByZW1haW5zIHVubW9kaWZpZWQuXG4gKi9cbmZ1bmN0aW9uIEJ1ZmZlciAoYXJnKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBCdWZmZXIpKSB7XG4gICAgLy8gQXZvaWQgZ29pbmcgdGhyb3VnaCBhbiBBcmd1bWVudHNBZGFwdG9yVHJhbXBvbGluZSBpbiB0aGUgY29tbW9uIGNhc2UuXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSByZXR1cm4gbmV3IEJ1ZmZlcihhcmcsIGFyZ3VtZW50c1sxXSlcbiAgICByZXR1cm4gbmV3IEJ1ZmZlcihhcmcpXG4gIH1cblxuICBpZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpcy5sZW5ndGggPSAwXG4gICAgdGhpcy5wYXJlbnQgPSB1bmRlZmluZWRcbiAgfVxuXG4gIC8vIENvbW1vbiBjYXNlLlxuICBpZiAodHlwZW9mIGFyZyA9PT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gZnJvbU51bWJlcih0aGlzLCBhcmcpXG4gIH1cblxuICAvLyBTbGlnaHRseSBsZXNzIGNvbW1vbiBjYXNlLlxuICBpZiAodHlwZW9mIGFyZyA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZnJvbVN0cmluZyh0aGlzLCBhcmcsIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogJ3V0ZjgnKVxuICB9XG5cbiAgLy8gVW51c3VhbC5cbiAgcmV0dXJuIGZyb21PYmplY3QodGhpcywgYXJnKVxufVxuXG4vLyBUT0RPOiBMZWdhY3ksIG5vdCBuZWVkZWQgYW55bW9yZS4gUmVtb3ZlIGluIG5leHQgbWFqb3IgdmVyc2lvbi5cbkJ1ZmZlci5fYXVnbWVudCA9IGZ1bmN0aW9uIChhcnIpIHtcbiAgYXJyLl9fcHJvdG9fXyA9IEJ1ZmZlci5wcm90b3R5cGVcbiAgcmV0dXJuIGFyclxufVxuXG5mdW5jdGlvbiBmcm9tTnVtYmVyICh0aGF0LCBsZW5ndGgpIHtcbiAgdGhhdCA9IGFsbG9jYXRlKHRoYXQsIGxlbmd0aCA8IDAgPyAwIDogY2hlY2tlZChsZW5ndGgpIHwgMClcbiAgaWYgKCFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoYXRbaV0gPSAwXG4gICAgfVxuICB9XG4gIHJldHVybiB0aGF0XG59XG5cbmZ1bmN0aW9uIGZyb21TdHJpbmcgKHRoYXQsIHN0cmluZywgZW5jb2RpbmcpIHtcbiAgaWYgKHR5cGVvZiBlbmNvZGluZyAhPT0gJ3N0cmluZycgfHwgZW5jb2RpbmcgPT09ICcnKSBlbmNvZGluZyA9ICd1dGY4J1xuXG4gIC8vIEFzc3VtcHRpb246IGJ5dGVMZW5ndGgoKSByZXR1cm4gdmFsdWUgaXMgYWx3YXlzIDwga01heExlbmd0aC5cbiAgdmFyIGxlbmd0aCA9IGJ5dGVMZW5ndGgoc3RyaW5nLCBlbmNvZGluZykgfCAwXG4gIHRoYXQgPSBhbGxvY2F0ZSh0aGF0LCBsZW5ndGgpXG5cbiAgdGhhdC53cml0ZShzdHJpbmcsIGVuY29kaW5nKVxuICByZXR1cm4gdGhhdFxufVxuXG5mdW5jdGlvbiBmcm9tT2JqZWN0ICh0aGF0LCBvYmplY3QpIHtcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihvYmplY3QpKSByZXR1cm4gZnJvbUJ1ZmZlcih0aGF0LCBvYmplY3QpXG5cbiAgaWYgKGlzQXJyYXkob2JqZWN0KSkgcmV0dXJuIGZyb21BcnJheSh0aGF0LCBvYmplY3QpXG5cbiAgaWYgKG9iamVjdCA9PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignbXVzdCBzdGFydCB3aXRoIG51bWJlciwgYnVmZmVyLCBhcnJheSBvciBzdHJpbmcnKVxuICB9XG5cbiAgaWYgKHR5cGVvZiBBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBpZiAob2JqZWN0LmJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB7XG4gICAgICByZXR1cm4gZnJvbVR5cGVkQXJyYXkodGhhdCwgb2JqZWN0KVxuICAgIH1cbiAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcbiAgICAgIHJldHVybiBmcm9tQXJyYXlCdWZmZXIodGhhdCwgb2JqZWN0KVxuICAgIH1cbiAgfVxuXG4gIGlmIChvYmplY3QubGVuZ3RoKSByZXR1cm4gZnJvbUFycmF5TGlrZSh0aGF0LCBvYmplY3QpXG5cbiAgcmV0dXJuIGZyb21Kc29uT2JqZWN0KHRoYXQsIG9iamVjdClcbn1cblxuZnVuY3Rpb24gZnJvbUJ1ZmZlciAodGhhdCwgYnVmZmVyKSB7XG4gIHZhciBsZW5ndGggPSBjaGVja2VkKGJ1ZmZlci5sZW5ndGgpIHwgMFxuICB0aGF0ID0gYWxsb2NhdGUodGhhdCwgbGVuZ3RoKVxuICBidWZmZXIuY29weSh0aGF0LCAwLCAwLCBsZW5ndGgpXG4gIHJldHVybiB0aGF0XG59XG5cbmZ1bmN0aW9uIGZyb21BcnJheSAodGhhdCwgYXJyYXkpIHtcbiAgdmFyIGxlbmd0aCA9IGNoZWNrZWQoYXJyYXkubGVuZ3RoKSB8IDBcbiAgdGhhdCA9IGFsbG9jYXRlKHRoYXQsIGxlbmd0aClcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMSkge1xuICAgIHRoYXRbaV0gPSBhcnJheVtpXSAmIDI1NVxuICB9XG4gIHJldHVybiB0aGF0XG59XG5cbi8vIER1cGxpY2F0ZSBvZiBmcm9tQXJyYXkoKSB0byBrZWVwIGZyb21BcnJheSgpIG1vbm9tb3JwaGljLlxuZnVuY3Rpb24gZnJvbVR5cGVkQXJyYXkgKHRoYXQsIGFycmF5KSB7XG4gIHZhciBsZW5ndGggPSBjaGVja2VkKGFycmF5Lmxlbmd0aCkgfCAwXG4gIHRoYXQgPSBhbGxvY2F0ZSh0aGF0LCBsZW5ndGgpXG4gIC8vIFRydW5jYXRpbmcgdGhlIGVsZW1lbnRzIGlzIHByb2JhYmx5IG5vdCB3aGF0IHBlb3BsZSBleHBlY3QgZnJvbSB0eXBlZFxuICAvLyBhcnJheXMgd2l0aCBCWVRFU19QRVJfRUxFTUVOVCA+IDEgYnV0IGl0J3MgY29tcGF0aWJsZSB3aXRoIHRoZSBiZWhhdmlvclxuICAvLyBvZiB0aGUgb2xkIEJ1ZmZlciBjb25zdHJ1Y3Rvci5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMSkge1xuICAgIHRoYXRbaV0gPSBhcnJheVtpXSAmIDI1NVxuICB9XG4gIHJldHVybiB0aGF0XG59XG5cbmZ1bmN0aW9uIGZyb21BcnJheUJ1ZmZlciAodGhhdCwgYXJyYXkpIHtcbiAgYXJyYXkuYnl0ZUxlbmd0aCAvLyB0aGlzIHRocm93cyBpZiBgYXJyYXlgIGlzIG5vdCBhIHZhbGlkIEFycmF5QnVmZmVyXG5cbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgLy8gUmV0dXJuIGFuIGF1Z21lbnRlZCBgVWludDhBcnJheWAgaW5zdGFuY2UsIGZvciBiZXN0IHBlcmZvcm1hbmNlXG4gICAgdGhhdCA9IG5ldyBVaW50OEFycmF5KGFycmF5KVxuICAgIHRoYXQuX19wcm90b19fID0gQnVmZmVyLnByb3RvdHlwZVxuICB9IGVsc2Uge1xuICAgIC8vIEZhbGxiYWNrOiBSZXR1cm4gYW4gb2JqZWN0IGluc3RhbmNlIG9mIHRoZSBCdWZmZXIgY2xhc3NcbiAgICB0aGF0ID0gZnJvbVR5cGVkQXJyYXkodGhhdCwgbmV3IFVpbnQ4QXJyYXkoYXJyYXkpKVxuICB9XG4gIHJldHVybiB0aGF0XG59XG5cbmZ1bmN0aW9uIGZyb21BcnJheUxpa2UgKHRoYXQsIGFycmF5KSB7XG4gIHZhciBsZW5ndGggPSBjaGVja2VkKGFycmF5Lmxlbmd0aCkgfCAwXG4gIHRoYXQgPSBhbGxvY2F0ZSh0aGF0LCBsZW5ndGgpXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDEpIHtcbiAgICB0aGF0W2ldID0gYXJyYXlbaV0gJiAyNTVcbiAgfVxuICByZXR1cm4gdGhhdFxufVxuXG4vLyBEZXNlcmlhbGl6ZSB7IHR5cGU6ICdCdWZmZXInLCBkYXRhOiBbMSwyLDMsLi4uXSB9IGludG8gYSBCdWZmZXIgb2JqZWN0LlxuLy8gUmV0dXJucyBhIHplcm8tbGVuZ3RoIGJ1ZmZlciBmb3IgaW5wdXRzIHRoYXQgZG9uJ3QgY29uZm9ybSB0byB0aGUgc3BlYy5cbmZ1bmN0aW9uIGZyb21Kc29uT2JqZWN0ICh0aGF0LCBvYmplY3QpIHtcbiAgdmFyIGFycmF5XG4gIHZhciBsZW5ndGggPSAwXG5cbiAgaWYgKG9iamVjdC50eXBlID09PSAnQnVmZmVyJyAmJiBpc0FycmF5KG9iamVjdC5kYXRhKSkge1xuICAgIGFycmF5ID0gb2JqZWN0LmRhdGFcbiAgICBsZW5ndGggPSBjaGVja2VkKGFycmF5Lmxlbmd0aCkgfCAwXG4gIH1cbiAgdGhhdCA9IGFsbG9jYXRlKHRoYXQsIGxlbmd0aClcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAxKSB7XG4gICAgdGhhdFtpXSA9IGFycmF5W2ldICYgMjU1XG4gIH1cbiAgcmV0dXJuIHRoYXRcbn1cblxuaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gIEJ1ZmZlci5wcm90b3R5cGUuX19wcm90b19fID0gVWludDhBcnJheS5wcm90b3R5cGVcbiAgQnVmZmVyLl9fcHJvdG9fXyA9IFVpbnQ4QXJyYXlcbn0gZWxzZSB7XG4gIC8vIHByZS1zZXQgZm9yIHZhbHVlcyB0aGF0IG1heSBleGlzdCBpbiB0aGUgZnV0dXJlXG4gIEJ1ZmZlci5wcm90b3R5cGUubGVuZ3RoID0gdW5kZWZpbmVkXG4gIEJ1ZmZlci5wcm90b3R5cGUucGFyZW50ID0gdW5kZWZpbmVkXG59XG5cbmZ1bmN0aW9uIGFsbG9jYXRlICh0aGF0LCBsZW5ndGgpIHtcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgLy8gUmV0dXJuIGFuIGF1Z21lbnRlZCBgVWludDhBcnJheWAgaW5zdGFuY2UsIGZvciBiZXN0IHBlcmZvcm1hbmNlXG4gICAgdGhhdCA9IG5ldyBVaW50OEFycmF5KGxlbmd0aClcbiAgICB0aGF0Ll9fcHJvdG9fXyA9IEJ1ZmZlci5wcm90b3R5cGVcbiAgfSBlbHNlIHtcbiAgICAvLyBGYWxsYmFjazogUmV0dXJuIGFuIG9iamVjdCBpbnN0YW5jZSBvZiB0aGUgQnVmZmVyIGNsYXNzXG4gICAgdGhhdC5sZW5ndGggPSBsZW5ndGhcbiAgfVxuXG4gIHZhciBmcm9tUG9vbCA9IGxlbmd0aCAhPT0gMCAmJiBsZW5ndGggPD0gQnVmZmVyLnBvb2xTaXplID4+PiAxXG4gIGlmIChmcm9tUG9vbCkgdGhhdC5wYXJlbnQgPSByb290UGFyZW50XG5cbiAgcmV0dXJuIHRoYXRcbn1cblxuZnVuY3Rpb24gY2hlY2tlZCAobGVuZ3RoKSB7XG4gIC8vIE5vdGU6IGNhbm5vdCB1c2UgYGxlbmd0aCA8IGtNYXhMZW5ndGhgIGhlcmUgYmVjYXVzZSB0aGF0IGZhaWxzIHdoZW5cbiAgLy8gbGVuZ3RoIGlzIE5hTiAod2hpY2ggaXMgb3RoZXJ3aXNlIGNvZXJjZWQgdG8gemVyby4pXG4gIGlmIChsZW5ndGggPj0ga01heExlbmd0aCgpKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0F0dGVtcHQgdG8gYWxsb2NhdGUgQnVmZmVyIGxhcmdlciB0aGFuIG1heGltdW0gJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgJ3NpemU6IDB4JyArIGtNYXhMZW5ndGgoKS50b1N0cmluZygxNikgKyAnIGJ5dGVzJylcbiAgfVxuICByZXR1cm4gbGVuZ3RoIHwgMFxufVxuXG5mdW5jdGlvbiBTbG93QnVmZmVyIChzdWJqZWN0LCBlbmNvZGluZykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgU2xvd0J1ZmZlcikpIHJldHVybiBuZXcgU2xvd0J1ZmZlcihzdWJqZWN0LCBlbmNvZGluZylcblxuICB2YXIgYnVmID0gbmV3IEJ1ZmZlcihzdWJqZWN0LCBlbmNvZGluZylcbiAgZGVsZXRlIGJ1Zi5wYXJlbnRcbiAgcmV0dXJuIGJ1ZlxufVxuXG5CdWZmZXIuaXNCdWZmZXIgPSBmdW5jdGlvbiBpc0J1ZmZlciAoYikge1xuICByZXR1cm4gISEoYiAhPSBudWxsICYmIGIuX2lzQnVmZmVyKVxufVxuXG5CdWZmZXIuY29tcGFyZSA9IGZ1bmN0aW9uIGNvbXBhcmUgKGEsIGIpIHtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYSkgfHwgIUJ1ZmZlci5pc0J1ZmZlcihiKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50cyBtdXN0IGJlIEJ1ZmZlcnMnKVxuICB9XG5cbiAgaWYgKGEgPT09IGIpIHJldHVybiAwXG5cbiAgdmFyIHggPSBhLmxlbmd0aFxuICB2YXIgeSA9IGIubGVuZ3RoXG5cbiAgdmFyIGkgPSAwXG4gIHZhciBsZW4gPSBNYXRoLm1pbih4LCB5KVxuICB3aGlsZSAoaSA8IGxlbikge1xuICAgIGlmIChhW2ldICE9PSBiW2ldKSBicmVha1xuXG4gICAgKytpXG4gIH1cblxuICBpZiAoaSAhPT0gbGVuKSB7XG4gICAgeCA9IGFbaV1cbiAgICB5ID0gYltpXVxuICB9XG5cbiAgaWYgKHggPCB5KSByZXR1cm4gLTFcbiAgaWYgKHkgPCB4KSByZXR1cm4gMVxuICByZXR1cm4gMFxufVxuXG5CdWZmZXIuaXNFbmNvZGluZyA9IGZ1bmN0aW9uIGlzRW5jb2RpbmcgKGVuY29kaW5nKSB7XG4gIHN3aXRjaCAoU3RyaW5nKGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgY2FzZSAnaGV4JzpcbiAgICBjYXNlICd1dGY4JzpcbiAgICBjYXNlICd1dGYtOCc6XG4gICAgY2FzZSAnYXNjaWknOlxuICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgY2FzZSAnYmFzZTY0JzpcbiAgICBjYXNlICdyYXcnOlxuICAgIGNhc2UgJ3VjczInOlxuICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICBjYXNlICd1dGYxNmxlJzpcbiAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5CdWZmZXIuY29uY2F0ID0gZnVuY3Rpb24gY29uY2F0IChsaXN0LCBsZW5ndGgpIHtcbiAgaWYgKCFpc0FycmF5KGxpc3QpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdsaXN0IGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycy4nKVxuXG4gIGlmIChsaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBuZXcgQnVmZmVyKDApXG4gIH1cblxuICB2YXIgaVxuICBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQpIHtcbiAgICBsZW5ndGggPSAwXG4gICAgZm9yIChpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgIGxlbmd0aCArPSBsaXN0W2ldLmxlbmd0aFxuICAgIH1cbiAgfVxuXG4gIHZhciBidWYgPSBuZXcgQnVmZmVyKGxlbmd0aClcbiAgdmFyIHBvcyA9IDBcbiAgZm9yIChpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgaXRlbSA9IGxpc3RbaV1cbiAgICBpdGVtLmNvcHkoYnVmLCBwb3MpXG4gICAgcG9zICs9IGl0ZW0ubGVuZ3RoXG4gIH1cbiAgcmV0dXJuIGJ1ZlxufVxuXG5mdW5jdGlvbiBieXRlTGVuZ3RoIChzdHJpbmcsIGVuY29kaW5nKSB7XG4gIGlmICh0eXBlb2Ygc3RyaW5nICE9PSAnc3RyaW5nJykgc3RyaW5nID0gJycgKyBzdHJpbmdcblxuICB2YXIgbGVuID0gc3RyaW5nLmxlbmd0aFxuICBpZiAobGVuID09PSAwKSByZXR1cm4gMFxuXG4gIC8vIFVzZSBhIGZvciBsb29wIHRvIGF2b2lkIHJlY3Vyc2lvblxuICB2YXIgbG93ZXJlZENhc2UgPSBmYWxzZVxuICBmb3IgKDs7KSB7XG4gICAgc3dpdGNoIChlbmNvZGluZykge1xuICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgIC8vIERlcHJlY2F0ZWRcbiAgICAgIGNhc2UgJ3Jhdyc6XG4gICAgICBjYXNlICdyYXdzJzpcbiAgICAgICAgcmV0dXJuIGxlblxuICAgICAgY2FzZSAndXRmOCc6XG4gICAgICBjYXNlICd1dGYtOCc6XG4gICAgICAgIHJldHVybiB1dGY4VG9CeXRlcyhzdHJpbmcpLmxlbmd0aFxuICAgICAgY2FzZSAndWNzMic6XG4gICAgICBjYXNlICd1Y3MtMic6XG4gICAgICBjYXNlICd1dGYxNmxlJzpcbiAgICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgICAgcmV0dXJuIGxlbiAqIDJcbiAgICAgIGNhc2UgJ2hleCc6XG4gICAgICAgIHJldHVybiBsZW4gPj4+IDFcbiAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAgIHJldHVybiBiYXNlNjRUb0J5dGVzKHN0cmluZykubGVuZ3RoXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAobG93ZXJlZENhc2UpIHJldHVybiB1dGY4VG9CeXRlcyhzdHJpbmcpLmxlbmd0aCAvLyBhc3N1bWUgdXRmOFxuICAgICAgICBlbmNvZGluZyA9ICgnJyArIGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgIGxvd2VyZWRDYXNlID0gdHJ1ZVxuICAgIH1cbiAgfVxufVxuQnVmZmVyLmJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoXG5cbmZ1bmN0aW9uIHNsb3dUb1N0cmluZyAoZW5jb2RpbmcsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGxvd2VyZWRDYXNlID0gZmFsc2VcblxuICBzdGFydCA9IHN0YXJ0IHwgMFxuICBlbmQgPSBlbmQgPT09IHVuZGVmaW5lZCB8fCBlbmQgPT09IEluZmluaXR5ID8gdGhpcy5sZW5ndGggOiBlbmQgfCAwXG5cbiAgaWYgKCFlbmNvZGluZykgZW5jb2RpbmcgPSAndXRmOCdcbiAgaWYgKHN0YXJ0IDwgMCkgc3RhcnQgPSAwXG4gIGlmIChlbmQgPiB0aGlzLmxlbmd0aCkgZW5kID0gdGhpcy5sZW5ndGhcbiAgaWYgKGVuZCA8PSBzdGFydCkgcmV0dXJuICcnXG5cbiAgd2hpbGUgKHRydWUpIHtcbiAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gaGV4U2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAndXRmOCc6XG4gICAgICBjYXNlICd1dGYtOCc6XG4gICAgICAgIHJldHVybiB1dGY4U2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgICByZXR1cm4gYXNjaWlTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgICByZXR1cm4gYmluYXJ5U2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgICAgcmV0dXJuIGJhc2U2NFNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgY2FzZSAndWNzLTInOlxuICAgICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICAgIHJldHVybiB1dGYxNmxlU2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGxvd2VyZWRDYXNlKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpXG4gICAgICAgIGVuY29kaW5nID0gKGVuY29kaW5nICsgJycpLnRvTG93ZXJDYXNlKClcbiAgICAgICAgbG93ZXJlZENhc2UgPSB0cnVlXG4gICAgfVxuICB9XG59XG5cbi8vIFRoZSBwcm9wZXJ0eSBpcyB1c2VkIGJ5IGBCdWZmZXIuaXNCdWZmZXJgIGFuZCBgaXMtYnVmZmVyYCAoaW4gU2FmYXJpIDUtNykgdG8gZGV0ZWN0XG4vLyBCdWZmZXIgaW5zdGFuY2VzLlxuQnVmZmVyLnByb3RvdHlwZS5faXNCdWZmZXIgPSB0cnVlXG5cbkJ1ZmZlci5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZyAoKSB7XG4gIHZhciBsZW5ndGggPSB0aGlzLmxlbmd0aCB8IDBcbiAgaWYgKGxlbmd0aCA9PT0gMCkgcmV0dXJuICcnXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSByZXR1cm4gdXRmOFNsaWNlKHRoaXMsIDAsIGxlbmd0aClcbiAgcmV0dXJuIHNsb3dUb1N0cmluZy5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuZXF1YWxzID0gZnVuY3Rpb24gZXF1YWxzIChiKSB7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKGIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyJylcbiAgaWYgKHRoaXMgPT09IGIpIHJldHVybiB0cnVlXG4gIHJldHVybiBCdWZmZXIuY29tcGFyZSh0aGlzLCBiKSA9PT0gMFxufVxuXG5CdWZmZXIucHJvdG90eXBlLmluc3BlY3QgPSBmdW5jdGlvbiBpbnNwZWN0ICgpIHtcbiAgdmFyIHN0ciA9ICcnXG4gIHZhciBtYXggPSBleHBvcnRzLklOU1BFQ1RfTUFYX0JZVEVTXG4gIGlmICh0aGlzLmxlbmd0aCA+IDApIHtcbiAgICBzdHIgPSB0aGlzLnRvU3RyaW5nKCdoZXgnLCAwLCBtYXgpLm1hdGNoKC8uezJ9L2cpLmpvaW4oJyAnKVxuICAgIGlmICh0aGlzLmxlbmd0aCA+IG1heCkgc3RyICs9ICcgLi4uICdcbiAgfVxuICByZXR1cm4gJzxCdWZmZXIgJyArIHN0ciArICc+J1xufVxuXG5CdWZmZXIucHJvdG90eXBlLmNvbXBhcmUgPSBmdW5jdGlvbiBjb21wYXJlIChiKSB7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKGIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyJylcbiAgaWYgKHRoaXMgPT09IGIpIHJldHVybiAwXG4gIHJldHVybiBCdWZmZXIuY29tcGFyZSh0aGlzLCBiKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLmluZGV4T2YgPSBmdW5jdGlvbiBpbmRleE9mICh2YWwsIGJ5dGVPZmZzZXQpIHtcbiAgaWYgKGJ5dGVPZmZzZXQgPiAweDdmZmZmZmZmKSBieXRlT2Zmc2V0ID0gMHg3ZmZmZmZmZlxuICBlbHNlIGlmIChieXRlT2Zmc2V0IDwgLTB4ODAwMDAwMDApIGJ5dGVPZmZzZXQgPSAtMHg4MDAwMDAwMFxuICBieXRlT2Zmc2V0ID4+PSAwXG5cbiAgaWYgKHRoaXMubGVuZ3RoID09PSAwKSByZXR1cm4gLTFcbiAgaWYgKGJ5dGVPZmZzZXQgPj0gdGhpcy5sZW5ndGgpIHJldHVybiAtMVxuXG4gIC8vIE5lZ2F0aXZlIG9mZnNldHMgc3RhcnQgZnJvbSB0aGUgZW5kIG9mIHRoZSBidWZmZXJcbiAgaWYgKGJ5dGVPZmZzZXQgPCAwKSBieXRlT2Zmc2V0ID0gTWF0aC5tYXgodGhpcy5sZW5ndGggKyBieXRlT2Zmc2V0LCAwKVxuXG4gIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgIGlmICh2YWwubGVuZ3RoID09PSAwKSByZXR1cm4gLTEgLy8gc3BlY2lhbCBjYXNlOiBsb29raW5nIGZvciBlbXB0eSBzdHJpbmcgYWx3YXlzIGZhaWxzXG4gICAgcmV0dXJuIFN0cmluZy5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKHRoaXMsIHZhbCwgYnl0ZU9mZnNldClcbiAgfVxuICBpZiAoQnVmZmVyLmlzQnVmZmVyKHZhbCkpIHtcbiAgICByZXR1cm4gYXJyYXlJbmRleE9mKHRoaXMsIHZhbCwgYnl0ZU9mZnNldClcbiAgfVxuICBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQgJiYgVWludDhBcnJheS5wcm90b3R5cGUuaW5kZXhPZiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbCh0aGlzLCB2YWwsIGJ5dGVPZmZzZXQpXG4gICAgfVxuICAgIHJldHVybiBhcnJheUluZGV4T2YodGhpcywgWyB2YWwgXSwgYnl0ZU9mZnNldClcbiAgfVxuXG4gIGZ1bmN0aW9uIGFycmF5SW5kZXhPZiAoYXJyLCB2YWwsIGJ5dGVPZmZzZXQpIHtcbiAgICB2YXIgZm91bmRJbmRleCA9IC0xXG4gICAgZm9yICh2YXIgaSA9IDA7IGJ5dGVPZmZzZXQgKyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoYXJyW2J5dGVPZmZzZXQgKyBpXSA9PT0gdmFsW2ZvdW5kSW5kZXggPT09IC0xID8gMCA6IGkgLSBmb3VuZEluZGV4XSkge1xuICAgICAgICBpZiAoZm91bmRJbmRleCA9PT0gLTEpIGZvdW5kSW5kZXggPSBpXG4gICAgICAgIGlmIChpIC0gZm91bmRJbmRleCArIDEgPT09IHZhbC5sZW5ndGgpIHJldHVybiBieXRlT2Zmc2V0ICsgZm91bmRJbmRleFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm91bmRJbmRleCA9IC0xXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAtMVxuICB9XG5cbiAgdGhyb3cgbmV3IFR5cGVFcnJvcigndmFsIG11c3QgYmUgc3RyaW5nLCBudW1iZXIgb3IgQnVmZmVyJylcbn1cblxuZnVuY3Rpb24gaGV4V3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICBvZmZzZXQgPSBOdW1iZXIob2Zmc2V0KSB8fCAwXG4gIHZhciByZW1haW5pbmcgPSBidWYubGVuZ3RoIC0gb2Zmc2V0XG4gIGlmICghbGVuZ3RoKSB7XG4gICAgbGVuZ3RoID0gcmVtYWluaW5nXG4gIH0gZWxzZSB7XG4gICAgbGVuZ3RoID0gTnVtYmVyKGxlbmd0aClcbiAgICBpZiAobGVuZ3RoID4gcmVtYWluaW5nKSB7XG4gICAgICBsZW5ndGggPSByZW1haW5pbmdcbiAgICB9XG4gIH1cblxuICAvLyBtdXN0IGJlIGFuIGV2ZW4gbnVtYmVyIG9mIGRpZ2l0c1xuICB2YXIgc3RyTGVuID0gc3RyaW5nLmxlbmd0aFxuICBpZiAoc3RyTGVuICUgMiAhPT0gMCkgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGhleCBzdHJpbmcnKVxuXG4gIGlmIChsZW5ndGggPiBzdHJMZW4gLyAyKSB7XG4gICAgbGVuZ3RoID0gc3RyTGVuIC8gMlxuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcGFyc2VkID0gcGFyc2VJbnQoc3RyaW5nLnN1YnN0cihpICogMiwgMiksIDE2KVxuICAgIGlmIChpc05hTihwYXJzZWQpKSB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgaGV4IHN0cmluZycpXG4gICAgYnVmW29mZnNldCArIGldID0gcGFyc2VkXG4gIH1cbiAgcmV0dXJuIGlcbn1cblxuZnVuY3Rpb24gdXRmOFdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJsaXRCdWZmZXIodXRmOFRvQnl0ZXMoc3RyaW5nLCBidWYubGVuZ3RoIC0gb2Zmc2V0KSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gYXNjaWlXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKGFzY2lpVG9CeXRlcyhzdHJpbmcpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5mdW5jdGlvbiBiaW5hcnlXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBhc2NpaVdyaXRlKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gYmFzZTY0V3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcihiYXNlNjRUb0J5dGVzKHN0cmluZyksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIHVjczJXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKHV0ZjE2bGVUb0J5dGVzKHN0cmluZywgYnVmLmxlbmd0aCAtIG9mZnNldCksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbiB3cml0ZSAoc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCwgZW5jb2RpbmcpIHtcbiAgLy8gQnVmZmVyI3dyaXRlKHN0cmluZylcbiAgaWYgKG9mZnNldCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZW5jb2RpbmcgPSAndXRmOCdcbiAgICBsZW5ndGggPSB0aGlzLmxlbmd0aFxuICAgIG9mZnNldCA9IDBcbiAgLy8gQnVmZmVyI3dyaXRlKHN0cmluZywgZW5jb2RpbmcpXG4gIH0gZWxzZSBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQgJiYgdHlwZW9mIG9mZnNldCA9PT0gJ3N0cmluZycpIHtcbiAgICBlbmNvZGluZyA9IG9mZnNldFxuICAgIGxlbmd0aCA9IHRoaXMubGVuZ3RoXG4gICAgb2Zmc2V0ID0gMFxuICAvLyBCdWZmZXIjd3JpdGUoc3RyaW5nLCBvZmZzZXRbLCBsZW5ndGhdWywgZW5jb2RpbmddKVxuICB9IGVsc2UgaWYgKGlzRmluaXRlKG9mZnNldCkpIHtcbiAgICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gICAgaWYgKGlzRmluaXRlKGxlbmd0aCkpIHtcbiAgICAgIGxlbmd0aCA9IGxlbmd0aCB8IDBcbiAgICAgIGlmIChlbmNvZGluZyA9PT0gdW5kZWZpbmVkKSBlbmNvZGluZyA9ICd1dGY4J1xuICAgIH0gZWxzZSB7XG4gICAgICBlbmNvZGluZyA9IGxlbmd0aFxuICAgICAgbGVuZ3RoID0gdW5kZWZpbmVkXG4gICAgfVxuICAvLyBsZWdhY3kgd3JpdGUoc3RyaW5nLCBlbmNvZGluZywgb2Zmc2V0LCBsZW5ndGgpIC0gcmVtb3ZlIGluIHYwLjEzXG4gIH0gZWxzZSB7XG4gICAgdmFyIHN3YXAgPSBlbmNvZGluZ1xuICAgIGVuY29kaW5nID0gb2Zmc2V0XG4gICAgb2Zmc2V0ID0gbGVuZ3RoIHwgMFxuICAgIGxlbmd0aCA9IHN3YXBcbiAgfVxuXG4gIHZhciByZW1haW5pbmcgPSB0aGlzLmxlbmd0aCAtIG9mZnNldFxuICBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQgfHwgbGVuZ3RoID4gcmVtYWluaW5nKSBsZW5ndGggPSByZW1haW5pbmdcblxuICBpZiAoKHN0cmluZy5sZW5ndGggPiAwICYmIChsZW5ndGggPCAwIHx8IG9mZnNldCA8IDApKSB8fCBvZmZzZXQgPiB0aGlzLmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdhdHRlbXB0IHRvIHdyaXRlIG91dHNpZGUgYnVmZmVyIGJvdW5kcycpXG4gIH1cblxuICBpZiAoIWVuY29kaW5nKSBlbmNvZGluZyA9ICd1dGY4J1xuXG4gIHZhciBsb3dlcmVkQ2FzZSA9IGZhbHNlXG4gIGZvciAoOzspIHtcbiAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gaGV4V3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAndXRmOCc6XG4gICAgICBjYXNlICd1dGYtOCc6XG4gICAgICAgIHJldHVybiB1dGY4V3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgICByZXR1cm4gYXNjaWlXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgICByZXR1cm4gYmluYXJ5V3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgICAgLy8gV2FybmluZzogbWF4TGVuZ3RoIG5vdCB0YWtlbiBpbnRvIGFjY291bnQgaW4gYmFzZTY0V3JpdGVcbiAgICAgICAgcmV0dXJuIGJhc2U2NFdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgY2FzZSAndWNzLTInOlxuICAgICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICAgIHJldHVybiB1Y3MyV3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGxvd2VyZWRDYXNlKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpXG4gICAgICAgIGVuY29kaW5nID0gKCcnICsgZW5jb2RpbmcpLnRvTG93ZXJDYXNlKClcbiAgICAgICAgbG93ZXJlZENhc2UgPSB0cnVlXG4gICAgfVxuICB9XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gdG9KU09OICgpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnQnVmZmVyJyxcbiAgICBkYXRhOiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0aGlzLl9hcnIgfHwgdGhpcywgMClcbiAgfVxufVxuXG5mdW5jdGlvbiBiYXNlNjRTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIGlmIChzdGFydCA9PT0gMCAmJiBlbmQgPT09IGJ1Zi5sZW5ndGgpIHtcbiAgICByZXR1cm4gYmFzZTY0LmZyb21CeXRlQXJyYXkoYnVmKVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBiYXNlNjQuZnJvbUJ5dGVBcnJheShidWYuc2xpY2Uoc3RhcnQsIGVuZCkpXG4gIH1cbn1cblxuZnVuY3Rpb24gdXRmOFNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgZW5kID0gTWF0aC5taW4oYnVmLmxlbmd0aCwgZW5kKVxuICB2YXIgcmVzID0gW11cblxuICB2YXIgaSA9IHN0YXJ0XG4gIHdoaWxlIChpIDwgZW5kKSB7XG4gICAgdmFyIGZpcnN0Qnl0ZSA9IGJ1ZltpXVxuICAgIHZhciBjb2RlUG9pbnQgPSBudWxsXG4gICAgdmFyIGJ5dGVzUGVyU2VxdWVuY2UgPSAoZmlyc3RCeXRlID4gMHhFRikgPyA0XG4gICAgICA6IChmaXJzdEJ5dGUgPiAweERGKSA/IDNcbiAgICAgIDogKGZpcnN0Qnl0ZSA+IDB4QkYpID8gMlxuICAgICAgOiAxXG5cbiAgICBpZiAoaSArIGJ5dGVzUGVyU2VxdWVuY2UgPD0gZW5kKSB7XG4gICAgICB2YXIgc2Vjb25kQnl0ZSwgdGhpcmRCeXRlLCBmb3VydGhCeXRlLCB0ZW1wQ29kZVBvaW50XG5cbiAgICAgIHN3aXRjaCAoYnl0ZXNQZXJTZXF1ZW5jZSkge1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgaWYgKGZpcnN0Qnl0ZSA8IDB4ODApIHtcbiAgICAgICAgICAgIGNvZGVQb2ludCA9IGZpcnN0Qnl0ZVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgc2Vjb25kQnl0ZSA9IGJ1ZltpICsgMV1cbiAgICAgICAgICBpZiAoKHNlY29uZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgICAgdGVtcENvZGVQb2ludCA9IChmaXJzdEJ5dGUgJiAweDFGKSA8PCAweDYgfCAoc2Vjb25kQnl0ZSAmIDB4M0YpXG4gICAgICAgICAgICBpZiAodGVtcENvZGVQb2ludCA+IDB4N0YpIHtcbiAgICAgICAgICAgICAgY29kZVBvaW50ID0gdGVtcENvZGVQb2ludFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgc2Vjb25kQnl0ZSA9IGJ1ZltpICsgMV1cbiAgICAgICAgICB0aGlyZEJ5dGUgPSBidWZbaSArIDJdXG4gICAgICAgICAgaWYgKChzZWNvbmRCeXRlICYgMHhDMCkgPT09IDB4ODAgJiYgKHRoaXJkQnl0ZSAmIDB4QzApID09PSAweDgwKSB7XG4gICAgICAgICAgICB0ZW1wQ29kZVBvaW50ID0gKGZpcnN0Qnl0ZSAmIDB4RikgPDwgMHhDIHwgKHNlY29uZEJ5dGUgJiAweDNGKSA8PCAweDYgfCAodGhpcmRCeXRlICYgMHgzRilcbiAgICAgICAgICAgIGlmICh0ZW1wQ29kZVBvaW50ID4gMHg3RkYgJiYgKHRlbXBDb2RlUG9pbnQgPCAweEQ4MDAgfHwgdGVtcENvZGVQb2ludCA+IDB4REZGRikpIHtcbiAgICAgICAgICAgICAgY29kZVBvaW50ID0gdGVtcENvZGVQb2ludFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgc2Vjb25kQnl0ZSA9IGJ1ZltpICsgMV1cbiAgICAgICAgICB0aGlyZEJ5dGUgPSBidWZbaSArIDJdXG4gICAgICAgICAgZm91cnRoQnl0ZSA9IGJ1ZltpICsgM11cbiAgICAgICAgICBpZiAoKHNlY29uZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCAmJiAodGhpcmRCeXRlICYgMHhDMCkgPT09IDB4ODAgJiYgKGZvdXJ0aEJ5dGUgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgICAgdGVtcENvZGVQb2ludCA9IChmaXJzdEJ5dGUgJiAweEYpIDw8IDB4MTIgfCAoc2Vjb25kQnl0ZSAmIDB4M0YpIDw8IDB4QyB8ICh0aGlyZEJ5dGUgJiAweDNGKSA8PCAweDYgfCAoZm91cnRoQnl0ZSAmIDB4M0YpXG4gICAgICAgICAgICBpZiAodGVtcENvZGVQb2ludCA+IDB4RkZGRiAmJiB0ZW1wQ29kZVBvaW50IDwgMHgxMTAwMDApIHtcbiAgICAgICAgICAgICAgY29kZVBvaW50ID0gdGVtcENvZGVQb2ludFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY29kZVBvaW50ID09PSBudWxsKSB7XG4gICAgICAvLyB3ZSBkaWQgbm90IGdlbmVyYXRlIGEgdmFsaWQgY29kZVBvaW50IHNvIGluc2VydCBhXG4gICAgICAvLyByZXBsYWNlbWVudCBjaGFyIChVK0ZGRkQpIGFuZCBhZHZhbmNlIG9ubHkgMSBieXRlXG4gICAgICBjb2RlUG9pbnQgPSAweEZGRkRcbiAgICAgIGJ5dGVzUGVyU2VxdWVuY2UgPSAxXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPiAweEZGRkYpIHtcbiAgICAgIC8vIGVuY29kZSB0byB1dGYxNiAoc3Vycm9nYXRlIHBhaXIgZGFuY2UpXG4gICAgICBjb2RlUG9pbnQgLT0gMHgxMDAwMFxuICAgICAgcmVzLnB1c2goY29kZVBvaW50ID4+PiAxMCAmIDB4M0ZGIHwgMHhEODAwKVxuICAgICAgY29kZVBvaW50ID0gMHhEQzAwIHwgY29kZVBvaW50ICYgMHgzRkZcbiAgICB9XG5cbiAgICByZXMucHVzaChjb2RlUG9pbnQpXG4gICAgaSArPSBieXRlc1BlclNlcXVlbmNlXG4gIH1cblxuICByZXR1cm4gZGVjb2RlQ29kZVBvaW50c0FycmF5KHJlcylcbn1cblxuLy8gQmFzZWQgb24gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMjI3NDcyNzIvNjgwNzQyLCB0aGUgYnJvd3NlciB3aXRoXG4vLyB0aGUgbG93ZXN0IGxpbWl0IGlzIENocm9tZSwgd2l0aCAweDEwMDAwIGFyZ3MuXG4vLyBXZSBnbyAxIG1hZ25pdHVkZSBsZXNzLCBmb3Igc2FmZXR5XG52YXIgTUFYX0FSR1VNRU5UU19MRU5HVEggPSAweDEwMDBcblxuZnVuY3Rpb24gZGVjb2RlQ29kZVBvaW50c0FycmF5IChjb2RlUG9pbnRzKSB7XG4gIHZhciBsZW4gPSBjb2RlUG9pbnRzLmxlbmd0aFxuICBpZiAobGVuIDw9IE1BWF9BUkdVTUVOVFNfTEVOR1RIKSB7XG4gICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLCBjb2RlUG9pbnRzKSAvLyBhdm9pZCBleHRyYSBzbGljZSgpXG4gIH1cblxuICAvLyBEZWNvZGUgaW4gY2h1bmtzIHRvIGF2b2lkIFwiY2FsbCBzdGFjayBzaXplIGV4Y2VlZGVkXCIuXG4gIHZhciByZXMgPSAnJ1xuICB2YXIgaSA9IDBcbiAgd2hpbGUgKGkgPCBsZW4pIHtcbiAgICByZXMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShcbiAgICAgIFN0cmluZyxcbiAgICAgIGNvZGVQb2ludHMuc2xpY2UoaSwgaSArPSBNQVhfQVJHVU1FTlRTX0xFTkdUSClcbiAgICApXG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuXG5mdW5jdGlvbiBhc2NpaVNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIHJldCA9ICcnXG4gIGVuZCA9IE1hdGgubWluKGJ1Zi5sZW5ndGgsIGVuZClcblxuICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykge1xuICAgIHJldCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ1ZltpXSAmIDB4N0YpXG4gIH1cbiAgcmV0dXJuIHJldFxufVxuXG5mdW5jdGlvbiBiaW5hcnlTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIHZhciByZXQgPSAnJ1xuICBlbmQgPSBNYXRoLm1pbihidWYubGVuZ3RoLCBlbmQpXG5cbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHtcbiAgICByZXQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShidWZbaV0pXG4gIH1cbiAgcmV0dXJuIHJldFxufVxuXG5mdW5jdGlvbiBoZXhTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIHZhciBsZW4gPSBidWYubGVuZ3RoXG5cbiAgaWYgKCFzdGFydCB8fCBzdGFydCA8IDApIHN0YXJ0ID0gMFxuICBpZiAoIWVuZCB8fCBlbmQgPCAwIHx8IGVuZCA+IGxlbikgZW5kID0gbGVuXG5cbiAgdmFyIG91dCA9ICcnXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7XG4gICAgb3V0ICs9IHRvSGV4KGJ1ZltpXSlcbiAgfVxuICByZXR1cm4gb3V0XG59XG5cbmZ1bmN0aW9uIHV0ZjE2bGVTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIHZhciBieXRlcyA9IGJ1Zi5zbGljZShzdGFydCwgZW5kKVxuICB2YXIgcmVzID0gJydcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkgKz0gMikge1xuICAgIHJlcyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ5dGVzW2ldICsgYnl0ZXNbaSArIDFdICogMjU2KVxuICB9XG4gIHJldHVybiByZXNcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5zbGljZSA9IGZ1bmN0aW9uIHNsaWNlIChzdGFydCwgZW5kKSB7XG4gIHZhciBsZW4gPSB0aGlzLmxlbmd0aFxuICBzdGFydCA9IH5+c3RhcnRcbiAgZW5kID0gZW5kID09PSB1bmRlZmluZWQgPyBsZW4gOiB+fmVuZFxuXG4gIGlmIChzdGFydCA8IDApIHtcbiAgICBzdGFydCArPSBsZW5cbiAgICBpZiAoc3RhcnQgPCAwKSBzdGFydCA9IDBcbiAgfSBlbHNlIGlmIChzdGFydCA+IGxlbikge1xuICAgIHN0YXJ0ID0gbGVuXG4gIH1cblxuICBpZiAoZW5kIDwgMCkge1xuICAgIGVuZCArPSBsZW5cbiAgICBpZiAoZW5kIDwgMCkgZW5kID0gMFxuICB9IGVsc2UgaWYgKGVuZCA+IGxlbikge1xuICAgIGVuZCA9IGxlblxuICB9XG5cbiAgaWYgKGVuZCA8IHN0YXJ0KSBlbmQgPSBzdGFydFxuXG4gIHZhciBuZXdCdWZcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgbmV3QnVmID0gdGhpcy5zdWJhcnJheShzdGFydCwgZW5kKVxuICAgIG5ld0J1Zi5fX3Byb3RvX18gPSBCdWZmZXIucHJvdG90eXBlXG4gIH0gZWxzZSB7XG4gICAgdmFyIHNsaWNlTGVuID0gZW5kIC0gc3RhcnRcbiAgICBuZXdCdWYgPSBuZXcgQnVmZmVyKHNsaWNlTGVuLCB1bmRlZmluZWQpXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzbGljZUxlbjsgaSsrKSB7XG4gICAgICBuZXdCdWZbaV0gPSB0aGlzW2kgKyBzdGFydF1cbiAgICB9XG4gIH1cblxuICBpZiAobmV3QnVmLmxlbmd0aCkgbmV3QnVmLnBhcmVudCA9IHRoaXMucGFyZW50IHx8IHRoaXNcblxuICByZXR1cm4gbmV3QnVmXG59XG5cbi8qXG4gKiBOZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IGJ1ZmZlciBpc24ndCB0cnlpbmcgdG8gd3JpdGUgb3V0IG9mIGJvdW5kcy5cbiAqL1xuZnVuY3Rpb24gY2hlY2tPZmZzZXQgKG9mZnNldCwgZXh0LCBsZW5ndGgpIHtcbiAgaWYgKChvZmZzZXQgJSAxKSAhPT0gMCB8fCBvZmZzZXQgPCAwKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignb2Zmc2V0IGlzIG5vdCB1aW50JylcbiAgaWYgKG9mZnNldCArIGV4dCA+IGxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RyeWluZyB0byBhY2Nlc3MgYmV5b25kIGJ1ZmZlciBsZW5ndGgnKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50TEUgPSBmdW5jdGlvbiByZWFkVUludExFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG5cbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0XVxuICB2YXIgbXVsID0gMVxuICB2YXIgaSA9IDBcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyBpXSAqIG11bFxuICB9XG5cbiAgcmV0dXJuIHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50QkUgPSBmdW5jdGlvbiByZWFkVUludEJFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKVxuICB9XG5cbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0ICsgLS1ieXRlTGVuZ3RoXVxuICB2YXIgbXVsID0gMVxuICB3aGlsZSAoYnl0ZUxlbmd0aCA+IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyAtLWJ5dGVMZW5ndGhdICogbXVsXG4gIH1cblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQ4ID0gZnVuY3Rpb24gcmVhZFVJbnQ4IChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMSwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiB0aGlzW29mZnNldF1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDE2TEUgPSBmdW5jdGlvbiByZWFkVUludDE2TEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIHRoaXNbb2Zmc2V0XSB8ICh0aGlzW29mZnNldCArIDFdIDw8IDgpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQxNkJFID0gZnVuY3Rpb24gcmVhZFVJbnQxNkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiAodGhpc1tvZmZzZXRdIDw8IDgpIHwgdGhpc1tvZmZzZXQgKyAxXVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MzJMRSA9IGZ1bmN0aW9uIHJlYWRVSW50MzJMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAoKHRoaXNbb2Zmc2V0XSkgfFxuICAgICAgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOCkgfFxuICAgICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgMTYpKSArXG4gICAgICAodGhpc1tvZmZzZXQgKyAzXSAqIDB4MTAwMDAwMClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDMyQkUgPSBmdW5jdGlvbiByZWFkVUludDMyQkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcblxuICByZXR1cm4gKHRoaXNbb2Zmc2V0XSAqIDB4MTAwMDAwMCkgK1xuICAgICgodGhpc1tvZmZzZXQgKyAxXSA8PCAxNikgfFxuICAgICh0aGlzW29mZnNldCArIDJdIDw8IDgpIHxcbiAgICB0aGlzW29mZnNldCArIDNdKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnRMRSA9IGZ1bmN0aW9uIHJlYWRJbnRMRSAob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKVxuXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldF1cbiAgdmFyIG11bCA9IDFcbiAgdmFyIGkgPSAwXG4gIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgaV0gKiBtdWxcbiAgfVxuICBtdWwgKj0gMHg4MFxuXG4gIGlmICh2YWwgPj0gbXVsKSB2YWwgLT0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpXG5cbiAgcmV0dXJuIHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnRCRSA9IGZ1bmN0aW9uIHJlYWRJbnRCRSAob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKVxuXG4gIHZhciBpID0gYnl0ZUxlbmd0aFxuICB2YXIgbXVsID0gMVxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXQgKyAtLWldXG4gIHdoaWxlIChpID4gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIC0taV0gKiBtdWxcbiAgfVxuICBtdWwgKj0gMHg4MFxuXG4gIGlmICh2YWwgPj0gbXVsKSB2YWwgLT0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpXG5cbiAgcmV0dXJuIHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQ4ID0gZnVuY3Rpb24gcmVhZEludDggKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAxLCB0aGlzLmxlbmd0aClcbiAgaWYgKCEodGhpc1tvZmZzZXRdICYgMHg4MCkpIHJldHVybiAodGhpc1tvZmZzZXRdKVxuICByZXR1cm4gKCgweGZmIC0gdGhpc1tvZmZzZXRdICsgMSkgKiAtMSlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MTZMRSA9IGZ1bmN0aW9uIHJlYWRJbnQxNkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldF0gfCAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KVxuICByZXR1cm4gKHZhbCAmIDB4ODAwMCkgPyB2YWwgfCAweEZGRkYwMDAwIDogdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDE2QkUgPSBmdW5jdGlvbiByZWFkSW50MTZCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXQgKyAxXSB8ICh0aGlzW29mZnNldF0gPDwgOClcbiAgcmV0dXJuICh2YWwgJiAweDgwMDApID8gdmFsIHwgMHhGRkZGMDAwMCA6IHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQzMkxFID0gZnVuY3Rpb24gcmVhZEludDMyTEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcblxuICByZXR1cm4gKHRoaXNbb2Zmc2V0XSkgfFxuICAgICh0aGlzW29mZnNldCArIDFdIDw8IDgpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCAxNikgfFxuICAgICh0aGlzW29mZnNldCArIDNdIDw8IDI0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQzMkJFID0gZnVuY3Rpb24gcmVhZEludDMyQkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcblxuICByZXR1cm4gKHRoaXNbb2Zmc2V0XSA8PCAyNCkgfFxuICAgICh0aGlzW29mZnNldCArIDFdIDw8IDE2KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgOCkgfFxuICAgICh0aGlzW29mZnNldCArIDNdKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRGbG9hdExFID0gZnVuY3Rpb24gcmVhZEZsb2F0TEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIHRydWUsIDIzLCA0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRGbG9hdEJFID0gZnVuY3Rpb24gcmVhZEZsb2F0QkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIGZhbHNlLCAyMywgNClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRG91YmxlTEUgPSBmdW5jdGlvbiByZWFkRG91YmxlTEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA4LCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIHRydWUsIDUyLCA4KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWREb3VibGVCRSA9IGZ1bmN0aW9uIHJlYWREb3VibGVCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDgsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgZmFsc2UsIDUyLCA4KVxufVxuXG5mdW5jdGlvbiBjaGVja0ludCAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBleHQsIG1heCwgbWluKSB7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKGJ1ZikpIHRocm93IG5ldyBUeXBlRXJyb3IoJ2J1ZmZlciBtdXN0IGJlIGEgQnVmZmVyIGluc3RhbmNlJylcbiAgaWYgKHZhbHVlID4gbWF4IHx8IHZhbHVlIDwgbWluKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcigndmFsdWUgaXMgb3V0IG9mIGJvdW5kcycpXG4gIGlmIChvZmZzZXQgKyBleHQgPiBidWYubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignaW5kZXggb3V0IG9mIHJhbmdlJylcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnRMRSA9IGZ1bmN0aW9uIHdyaXRlVUludExFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCksIDApXG5cbiAgdmFyIG11bCA9IDFcbiAgdmFyIGkgPSAwXG4gIHRoaXNbb2Zmc2V0XSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAodmFsdWUgLyBtdWwpICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnRCRSA9IGZ1bmN0aW9uIHdyaXRlVUludEJFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCksIDApXG5cbiAgdmFyIGkgPSBieXRlTGVuZ3RoIC0gMVxuICB2YXIgbXVsID0gMVxuICB0aGlzW29mZnNldCArIGldID0gdmFsdWUgJiAweEZGXG4gIHdoaWxlICgtLWkgPj0gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAodmFsdWUgLyBtdWwpICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQ4ID0gZnVuY3Rpb24gd3JpdGVVSW50OCAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAxLCAweGZmLCAwKVxuICBpZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB2YWx1ZSA9IE1hdGguZmxvb3IodmFsdWUpXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHJldHVybiBvZmZzZXQgKyAxXG59XG5cbmZ1bmN0aW9uIG9iamVjdFdyaXRlVUludDE2IChidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbikge1xuICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmZmZiArIHZhbHVlICsgMVxuICBmb3IgKHZhciBpID0gMCwgaiA9IE1hdGgubWluKGJ1Zi5sZW5ndGggLSBvZmZzZXQsIDIpOyBpIDwgajsgaSsrKSB7XG4gICAgYnVmW29mZnNldCArIGldID0gKHZhbHVlICYgKDB4ZmYgPDwgKDggKiAobGl0dGxlRW5kaWFuID8gaSA6IDEgLSBpKSkpKSA+Pj5cbiAgICAgIChsaXR0bGVFbmRpYW4gPyBpIDogMSAtIGkpICogOFxuICB9XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MTZMRSA9IGZ1bmN0aW9uIHdyaXRlVUludDE2TEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHhmZmZmLCAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MTYodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDE2QkUgPSBmdW5jdGlvbiB3cml0ZVVJbnQxNkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4ZmZmZiwgMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgJiAweGZmKVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDE2KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyAyXG59XG5cbmZ1bmN0aW9uIG9iamVjdFdyaXRlVUludDMyIChidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbikge1xuICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmZmZmZmZmYgKyB2YWx1ZSArIDFcbiAgZm9yICh2YXIgaSA9IDAsIGogPSBNYXRoLm1pbihidWYubGVuZ3RoIC0gb2Zmc2V0LCA0KTsgaSA8IGo7IGkrKykge1xuICAgIGJ1ZltvZmZzZXQgKyBpXSA9ICh2YWx1ZSA+Pj4gKGxpdHRsZUVuZGlhbiA/IGkgOiAzIC0gaSkgKiA4KSAmIDB4ZmZcbiAgfVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDMyTEUgPSBmdW5jdGlvbiB3cml0ZVVJbnQzMkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4ZmZmZmZmZmYsIDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgPj4+IDI0KVxuICAgIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDE2KVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQzMih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MzJCRSA9IGZ1bmN0aW9uIHdyaXRlVUludDMyQkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHhmZmZmZmZmZiwgMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiAyNClcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiAxNilcbiAgICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgJiAweGZmKVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDMyKHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnRMRSA9IGZ1bmN0aW9uIHdyaXRlSW50TEUgKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIHZhciBsaW1pdCA9IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoIC0gMSlcblxuICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIGxpbWl0IC0gMSwgLWxpbWl0KVxuICB9XG5cbiAgdmFyIGkgPSAwXG4gIHZhciBtdWwgPSAxXG4gIHZhciBzdWIgPSB2YWx1ZSA8IDAgPyAxIDogMFxuICB0aGlzW29mZnNldF0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB0aGlzW29mZnNldCArIGldID0gKCh2YWx1ZSAvIG11bCkgPj4gMCkgLSBzdWIgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50QkUgPSBmdW5jdGlvbiB3cml0ZUludEJFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICB2YXIgbGltaXQgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCAtIDEpXG5cbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBsaW1pdCAtIDEsIC1saW1pdClcbiAgfVxuXG4gIHZhciBpID0gYnl0ZUxlbmd0aCAtIDFcbiAgdmFyIG11bCA9IDFcbiAgdmFyIHN1YiA9IHZhbHVlIDwgMCA/IDEgOiAwXG4gIHRoaXNbb2Zmc2V0ICsgaV0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKC0taSA+PSAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9ICgodmFsdWUgLyBtdWwpID4+IDApIC0gc3ViICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDggPSBmdW5jdGlvbiB3cml0ZUludDggKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMSwgMHg3ZiwgLTB4ODApXG4gIGlmICghQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHZhbHVlID0gTWF0aC5mbG9vcih2YWx1ZSlcbiAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgPSAweGZmICsgdmFsdWUgKyAxXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHJldHVybiBvZmZzZXQgKyAxXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQxNkxFID0gZnVuY3Rpb24gd3JpdGVJbnQxNkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4N2ZmZiwgLTB4ODAwMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDE2KHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDE2QkUgPSBmdW5jdGlvbiB3cml0ZUludDE2QkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHg3ZmZmLCAtMHg4MDAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MTYodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDMyTEUgPSBmdW5jdGlvbiB3cml0ZUludDMyTEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHg3ZmZmZmZmZiwgLTB4ODAwMDAwMDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiAxNilcbiAgICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlID4+PiAyNClcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQzMih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQzMkJFID0gZnVuY3Rpb24gd3JpdGVJbnQzMkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4N2ZmZmZmZmYsIC0weDgwMDAwMDAwKVxuICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmZmZmZmZmYgKyB2YWx1ZSArIDFcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiAyNClcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiAxNilcbiAgICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgJiAweGZmKVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDMyKHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbmZ1bmN0aW9uIGNoZWNrSUVFRTc1NCAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBleHQsIG1heCwgbWluKSB7XG4gIGlmIChvZmZzZXQgKyBleHQgPiBidWYubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignaW5kZXggb3V0IG9mIHJhbmdlJylcbiAgaWYgKG9mZnNldCA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yKCdpbmRleCBvdXQgb2YgcmFuZ2UnKVxufVxuXG5mdW5jdGlvbiB3cml0ZUZsb2F0IChidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGNoZWNrSUVFRTc1NChidWYsIHZhbHVlLCBvZmZzZXQsIDQsIDMuNDAyODIzNDY2Mzg1Mjg4NmUrMzgsIC0zLjQwMjgyMzQ2NjM4NTI4ODZlKzM4KVxuICB9XG4gIGllZWU3NTQud3JpdGUoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIDIzLCA0KVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRmxvYXRMRSA9IGZ1bmN0aW9uIHdyaXRlRmxvYXRMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRmxvYXQodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSwgbm9Bc3NlcnQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVGbG9hdEJFID0gZnVuY3Rpb24gd3JpdGVGbG9hdEJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVGbG9hdCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSwgbm9Bc3NlcnQpXG59XG5cbmZ1bmN0aW9uIHdyaXRlRG91YmxlIChidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGNoZWNrSUVFRTc1NChidWYsIHZhbHVlLCBvZmZzZXQsIDgsIDEuNzk3NjkzMTM0ODYyMzE1N0UrMzA4LCAtMS43OTc2OTMxMzQ4NjIzMTU3RSszMDgpXG4gIH1cbiAgaWVlZTc1NC53cml0ZShidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgNTIsIDgpXG4gIHJldHVybiBvZmZzZXQgKyA4XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVEb3VibGVMRSA9IGZ1bmN0aW9uIHdyaXRlRG91YmxlTEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZURvdWJsZSh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlLCBub0Fzc2VydClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZURvdWJsZUJFID0gZnVuY3Rpb24gd3JpdGVEb3VibGVCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRG91YmxlKHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlLCBub0Fzc2VydClcbn1cblxuLy8gY29weSh0YXJnZXRCdWZmZXIsIHRhcmdldFN0YXJ0PTAsIHNvdXJjZVN0YXJ0PTAsIHNvdXJjZUVuZD1idWZmZXIubGVuZ3RoKVxuQnVmZmVyLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gY29weSAodGFyZ2V0LCB0YXJnZXRTdGFydCwgc3RhcnQsIGVuZCkge1xuICBpZiAoIXN0YXJ0KSBzdGFydCA9IDBcbiAgaWYgKCFlbmQgJiYgZW5kICE9PSAwKSBlbmQgPSB0aGlzLmxlbmd0aFxuICBpZiAodGFyZ2V0U3RhcnQgPj0gdGFyZ2V0Lmxlbmd0aCkgdGFyZ2V0U3RhcnQgPSB0YXJnZXQubGVuZ3RoXG4gIGlmICghdGFyZ2V0U3RhcnQpIHRhcmdldFN0YXJ0ID0gMFxuICBpZiAoZW5kID4gMCAmJiBlbmQgPCBzdGFydCkgZW5kID0gc3RhcnRcblxuICAvLyBDb3B5IDAgYnl0ZXM7IHdlJ3JlIGRvbmVcbiAgaWYgKGVuZCA9PT0gc3RhcnQpIHJldHVybiAwXG4gIGlmICh0YXJnZXQubGVuZ3RoID09PSAwIHx8IHRoaXMubGVuZ3RoID09PSAwKSByZXR1cm4gMFxuXG4gIC8vIEZhdGFsIGVycm9yIGNvbmRpdGlvbnNcbiAgaWYgKHRhcmdldFN0YXJ0IDwgMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCd0YXJnZXRTdGFydCBvdXQgb2YgYm91bmRzJylcbiAgfVxuICBpZiAoc3RhcnQgPCAwIHx8IHN0YXJ0ID49IHRoaXMubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignc291cmNlU3RhcnQgb3V0IG9mIGJvdW5kcycpXG4gIGlmIChlbmQgPCAwKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignc291cmNlRW5kIG91dCBvZiBib3VuZHMnKVxuXG4gIC8vIEFyZSB3ZSBvb2I/XG4gIGlmIChlbmQgPiB0aGlzLmxlbmd0aCkgZW5kID0gdGhpcy5sZW5ndGhcbiAgaWYgKHRhcmdldC5sZW5ndGggLSB0YXJnZXRTdGFydCA8IGVuZCAtIHN0YXJ0KSB7XG4gICAgZW5kID0gdGFyZ2V0Lmxlbmd0aCAtIHRhcmdldFN0YXJ0ICsgc3RhcnRcbiAgfVxuXG4gIHZhciBsZW4gPSBlbmQgLSBzdGFydFxuICB2YXIgaVxuXG4gIGlmICh0aGlzID09PSB0YXJnZXQgJiYgc3RhcnQgPCB0YXJnZXRTdGFydCAmJiB0YXJnZXRTdGFydCA8IGVuZCkge1xuICAgIC8vIGRlc2NlbmRpbmcgY29weSBmcm9tIGVuZFxuICAgIGZvciAoaSA9IGxlbiAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB0YXJnZXRbaSArIHRhcmdldFN0YXJ0XSA9IHRoaXNbaSArIHN0YXJ0XVxuICAgIH1cbiAgfSBlbHNlIGlmIChsZW4gPCAxMDAwIHx8ICFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIC8vIGFzY2VuZGluZyBjb3B5IGZyb20gc3RhcnRcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIHRhcmdldFtpICsgdGFyZ2V0U3RhcnRdID0gdGhpc1tpICsgc3RhcnRdXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIFVpbnQ4QXJyYXkucHJvdG90eXBlLnNldC5jYWxsKFxuICAgICAgdGFyZ2V0LFxuICAgICAgdGhpcy5zdWJhcnJheShzdGFydCwgc3RhcnQgKyBsZW4pLFxuICAgICAgdGFyZ2V0U3RhcnRcbiAgICApXG4gIH1cblxuICByZXR1cm4gbGVuXG59XG5cbi8vIGZpbGwodmFsdWUsIHN0YXJ0PTAsIGVuZD1idWZmZXIubGVuZ3RoKVxuQnVmZmVyLnByb3RvdHlwZS5maWxsID0gZnVuY3Rpb24gZmlsbCAodmFsdWUsIHN0YXJ0LCBlbmQpIHtcbiAgaWYgKCF2YWx1ZSkgdmFsdWUgPSAwXG4gIGlmICghc3RhcnQpIHN0YXJ0ID0gMFxuICBpZiAoIWVuZCkgZW5kID0gdGhpcy5sZW5ndGhcblxuICBpZiAoZW5kIDwgc3RhcnQpIHRocm93IG5ldyBSYW5nZUVycm9yKCdlbmQgPCBzdGFydCcpXG5cbiAgLy8gRmlsbCAwIGJ5dGVzOyB3ZSdyZSBkb25lXG4gIGlmIChlbmQgPT09IHN0YXJ0KSByZXR1cm5cbiAgaWYgKHRoaXMubGVuZ3RoID09PSAwKSByZXR1cm5cblxuICBpZiAoc3RhcnQgPCAwIHx8IHN0YXJ0ID49IHRoaXMubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignc3RhcnQgb3V0IG9mIGJvdW5kcycpXG4gIGlmIChlbmQgPCAwIHx8IGVuZCA+IHRoaXMubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignZW5kIG91dCBvZiBib3VuZHMnKVxuXG4gIHZhciBpXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgZm9yIChpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykge1xuICAgICAgdGhpc1tpXSA9IHZhbHVlXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHZhciBieXRlcyA9IHV0ZjhUb0J5dGVzKHZhbHVlLnRvU3RyaW5nKCkpXG4gICAgdmFyIGxlbiA9IGJ5dGVzLmxlbmd0aFxuICAgIGZvciAoaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHtcbiAgICAgIHRoaXNbaV0gPSBieXRlc1tpICUgbGVuXVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0aGlzXG59XG5cbi8vIEhFTFBFUiBGVU5DVElPTlNcbi8vID09PT09PT09PT09PT09PT1cblxudmFyIElOVkFMSURfQkFTRTY0X1JFID0gL1teK1xcLzAtOUEtWmEtei1fXS9nXG5cbmZ1bmN0aW9uIGJhc2U2NGNsZWFuIChzdHIpIHtcbiAgLy8gTm9kZSBzdHJpcHMgb3V0IGludmFsaWQgY2hhcmFjdGVycyBsaWtlIFxcbiBhbmQgXFx0IGZyb20gdGhlIHN0cmluZywgYmFzZTY0LWpzIGRvZXMgbm90XG4gIHN0ciA9IHN0cmluZ3RyaW0oc3RyKS5yZXBsYWNlKElOVkFMSURfQkFTRTY0X1JFLCAnJylcbiAgLy8gTm9kZSBjb252ZXJ0cyBzdHJpbmdzIHdpdGggbGVuZ3RoIDwgMiB0byAnJ1xuICBpZiAoc3RyLmxlbmd0aCA8IDIpIHJldHVybiAnJ1xuICAvLyBOb2RlIGFsbG93cyBmb3Igbm9uLXBhZGRlZCBiYXNlNjQgc3RyaW5ncyAobWlzc2luZyB0cmFpbGluZyA9PT0pLCBiYXNlNjQtanMgZG9lcyBub3RcbiAgd2hpbGUgKHN0ci5sZW5ndGggJSA0ICE9PSAwKSB7XG4gICAgc3RyID0gc3RyICsgJz0nXG4gIH1cbiAgcmV0dXJuIHN0clxufVxuXG5mdW5jdGlvbiBzdHJpbmd0cmltIChzdHIpIHtcbiAgaWYgKHN0ci50cmltKSByZXR1cm4gc3RyLnRyaW0oKVxuICByZXR1cm4gc3RyLnJlcGxhY2UoL15cXHMrfFxccyskL2csICcnKVxufVxuXG5mdW5jdGlvbiB0b0hleCAobikge1xuICBpZiAobiA8IDE2KSByZXR1cm4gJzAnICsgbi50b1N0cmluZygxNilcbiAgcmV0dXJuIG4udG9TdHJpbmcoMTYpXG59XG5cbmZ1bmN0aW9uIHV0ZjhUb0J5dGVzIChzdHJpbmcsIHVuaXRzKSB7XG4gIHVuaXRzID0gdW5pdHMgfHwgSW5maW5pdHlcbiAgdmFyIGNvZGVQb2ludFxuICB2YXIgbGVuZ3RoID0gc3RyaW5nLmxlbmd0aFxuICB2YXIgbGVhZFN1cnJvZ2F0ZSA9IG51bGxcbiAgdmFyIGJ5dGVzID0gW11cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgY29kZVBvaW50ID0gc3RyaW5nLmNoYXJDb2RlQXQoaSlcblxuICAgIC8vIGlzIHN1cnJvZ2F0ZSBjb21wb25lbnRcbiAgICBpZiAoY29kZVBvaW50ID4gMHhEN0ZGICYmIGNvZGVQb2ludCA8IDB4RTAwMCkge1xuICAgICAgLy8gbGFzdCBjaGFyIHdhcyBhIGxlYWRcbiAgICAgIGlmICghbGVhZFN1cnJvZ2F0ZSkge1xuICAgICAgICAvLyBubyBsZWFkIHlldFxuICAgICAgICBpZiAoY29kZVBvaW50ID4gMHhEQkZGKSB7XG4gICAgICAgICAgLy8gdW5leHBlY3RlZCB0cmFpbFxuICAgICAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH0gZWxzZSBpZiAoaSArIDEgPT09IGxlbmd0aCkge1xuICAgICAgICAgIC8vIHVucGFpcmVkIGxlYWRcbiAgICAgICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRClcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gdmFsaWQgbGVhZFxuICAgICAgICBsZWFkU3Vycm9nYXRlID0gY29kZVBvaW50XG5cbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgLy8gMiBsZWFkcyBpbiBhIHJvd1xuICAgICAgaWYgKGNvZGVQb2ludCA8IDB4REMwMCkge1xuICAgICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRClcbiAgICAgICAgbGVhZFN1cnJvZ2F0ZSA9IGNvZGVQb2ludFxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICAvLyB2YWxpZCBzdXJyb2dhdGUgcGFpclxuICAgICAgY29kZVBvaW50ID0gKGxlYWRTdXJyb2dhdGUgLSAweEQ4MDAgPDwgMTAgfCBjb2RlUG9pbnQgLSAweERDMDApICsgMHgxMDAwMFxuICAgIH0gZWxzZSBpZiAobGVhZFN1cnJvZ2F0ZSkge1xuICAgICAgLy8gdmFsaWQgYm1wIGNoYXIsIGJ1dCBsYXN0IGNoYXIgd2FzIGEgbGVhZFxuICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgfVxuXG4gICAgbGVhZFN1cnJvZ2F0ZSA9IG51bGxcblxuICAgIC8vIGVuY29kZSB1dGY4XG4gICAgaWYgKGNvZGVQb2ludCA8IDB4ODApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gMSkgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChjb2RlUG9pbnQpXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPCAweDgwMCkge1xuICAgICAgaWYgKCh1bml0cyAtPSAyKSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHg2IHwgMHhDMCxcbiAgICAgICAgY29kZVBvaW50ICYgMHgzRiB8IDB4ODBcbiAgICAgIClcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA8IDB4MTAwMDApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gMykgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChcbiAgICAgICAgY29kZVBvaW50ID4+IDB4QyB8IDB4RTAsXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDYgJiAweDNGIHwgMHg4MCxcbiAgICAgICAgY29kZVBvaW50ICYgMHgzRiB8IDB4ODBcbiAgICAgIClcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA8IDB4MTEwMDAwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDQpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDEyIHwgMHhGMCxcbiAgICAgICAgY29kZVBvaW50ID4+IDB4QyAmIDB4M0YgfCAweDgwLFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHg2ICYgMHgzRiB8IDB4ODAsXG4gICAgICAgIGNvZGVQb2ludCAmIDB4M0YgfCAweDgwXG4gICAgICApXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjb2RlIHBvaW50JylcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYnl0ZXNcbn1cblxuZnVuY3Rpb24gYXNjaWlUb0J5dGVzIChzdHIpIHtcbiAgdmFyIGJ5dGVBcnJheSA9IFtdXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7XG4gICAgLy8gTm9kZSdzIGNvZGUgc2VlbXMgdG8gYmUgZG9pbmcgdGhpcyBhbmQgbm90ICYgMHg3Ri4uXG4gICAgYnl0ZUFycmF5LnB1c2goc3RyLmNoYXJDb2RlQXQoaSkgJiAweEZGKVxuICB9XG4gIHJldHVybiBieXRlQXJyYXlcbn1cblxuZnVuY3Rpb24gdXRmMTZsZVRvQnl0ZXMgKHN0ciwgdW5pdHMpIHtcbiAgdmFyIGMsIGhpLCBsb1xuICB2YXIgYnl0ZUFycmF5ID0gW11cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoKHVuaXRzIC09IDIpIDwgMCkgYnJlYWtcblxuICAgIGMgPSBzdHIuY2hhckNvZGVBdChpKVxuICAgIGhpID0gYyA+PiA4XG4gICAgbG8gPSBjICUgMjU2XG4gICAgYnl0ZUFycmF5LnB1c2gobG8pXG4gICAgYnl0ZUFycmF5LnB1c2goaGkpXG4gIH1cblxuICByZXR1cm4gYnl0ZUFycmF5XG59XG5cbmZ1bmN0aW9uIGJhc2U2NFRvQnl0ZXMgKHN0cikge1xuICByZXR1cm4gYmFzZTY0LnRvQnl0ZUFycmF5KGJhc2U2NGNsZWFuKHN0cikpXG59XG5cbmZ1bmN0aW9uIGJsaXRCdWZmZXIgKHNyYywgZHN0LCBvZmZzZXQsIGxlbmd0aCkge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKChpICsgb2Zmc2V0ID49IGRzdC5sZW5ndGgpIHx8IChpID49IHNyYy5sZW5ndGgpKSBicmVha1xuICAgIGRzdFtpICsgb2Zmc2V0XSA9IHNyY1tpXVxuICB9XG4gIHJldHVybiBpXG59XG4iLCJ2YXIgdG9TdHJpbmcgPSB7fS50b1N0cmluZztcblxubW9kdWxlLmV4cG9ydHMgPSBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uIChhcnIpIHtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwoYXJyKSA9PSAnW29iamVjdCBBcnJheV0nO1xufTtcbiIsInZhciBUcmFuc2Zvcm0gPSByZXF1aXJlKCdzdHJlYW0nKS5UcmFuc2Zvcm1cbnZhciBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJylcbnZhciBTdHJpbmdEZWNvZGVyID0gcmVxdWlyZSgnc3RyaW5nX2RlY29kZXInKS5TdHJpbmdEZWNvZGVyXG5tb2R1bGUuZXhwb3J0cyA9IENpcGhlckJhc2VcbmluaGVyaXRzKENpcGhlckJhc2UsIFRyYW5zZm9ybSlcbmZ1bmN0aW9uIENpcGhlckJhc2UgKGhhc2hNb2RlKSB7XG4gIFRyYW5zZm9ybS5jYWxsKHRoaXMpXG4gIHRoaXMuaGFzaE1vZGUgPSB0eXBlb2YgaGFzaE1vZGUgPT09ICdzdHJpbmcnXG4gIGlmICh0aGlzLmhhc2hNb2RlKSB7XG4gICAgdGhpc1toYXNoTW9kZV0gPSB0aGlzLl9maW5hbE9yRGlnZXN0XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5maW5hbCA9IHRoaXMuX2ZpbmFsT3JEaWdlc3RcbiAgfVxuICB0aGlzLl9kZWNvZGVyID0gbnVsbFxuICB0aGlzLl9lbmNvZGluZyA9IG51bGxcbn1cbkNpcGhlckJhc2UucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uIChkYXRhLCBpbnB1dEVuYywgb3V0cHV0RW5jKSB7XG4gIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICBkYXRhID0gbmV3IEJ1ZmZlcihkYXRhLCBpbnB1dEVuYylcbiAgfVxuICB2YXIgb3V0RGF0YSA9IHRoaXMuX3VwZGF0ZShkYXRhKVxuICBpZiAodGhpcy5oYXNoTW9kZSkge1xuICAgIHJldHVybiB0aGlzXG4gIH1cbiAgaWYgKG91dHB1dEVuYykge1xuICAgIG91dERhdGEgPSB0aGlzLl90b1N0cmluZyhvdXREYXRhLCBvdXRwdXRFbmMpXG4gIH1cbiAgcmV0dXJuIG91dERhdGFcbn1cblxuQ2lwaGVyQmFzZS5wcm90b3R5cGUuc2V0QXV0b1BhZGRpbmcgPSBmdW5jdGlvbiAoKSB7fVxuXG5DaXBoZXJCYXNlLnByb3RvdHlwZS5nZXRBdXRoVGFnID0gZnVuY3Rpb24gKCkge1xuICB0aHJvdyBuZXcgRXJyb3IoJ3RyeWluZyB0byBnZXQgYXV0aCB0YWcgaW4gdW5zdXBwb3J0ZWQgc3RhdGUnKVxufVxuXG5DaXBoZXJCYXNlLnByb3RvdHlwZS5zZXRBdXRoVGFnID0gZnVuY3Rpb24gKCkge1xuICB0aHJvdyBuZXcgRXJyb3IoJ3RyeWluZyB0byBzZXQgYXV0aCB0YWcgaW4gdW5zdXBwb3J0ZWQgc3RhdGUnKVxufVxuXG5DaXBoZXJCYXNlLnByb3RvdHlwZS5zZXRBQUQgPSBmdW5jdGlvbiAoKSB7XG4gIHRocm93IG5ldyBFcnJvcigndHJ5aW5nIHRvIHNldCBhYWQgaW4gdW5zdXBwb3J0ZWQgc3RhdGUnKVxufVxuXG5DaXBoZXJCYXNlLnByb3RvdHlwZS5fdHJhbnNmb3JtID0gZnVuY3Rpb24gKGRhdGEsIF8sIG5leHQpIHtcbiAgdmFyIGVyclxuICB0cnkge1xuICAgIGlmICh0aGlzLmhhc2hNb2RlKSB7XG4gICAgICB0aGlzLl91cGRhdGUoZGF0YSlcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wdXNoKHRoaXMuX3VwZGF0ZShkYXRhKSlcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBlcnIgPSBlXG4gIH0gZmluYWxseSB7XG4gICAgbmV4dChlcnIpXG4gIH1cbn1cbkNpcGhlckJhc2UucHJvdG90eXBlLl9mbHVzaCA9IGZ1bmN0aW9uIChkb25lKSB7XG4gIHZhciBlcnJcbiAgdHJ5IHtcbiAgICB0aGlzLnB1c2godGhpcy5fZmluYWwoKSlcbiAgfSBjYXRjaCAoZSkge1xuICAgIGVyciA9IGVcbiAgfSBmaW5hbGx5IHtcbiAgICBkb25lKGVycilcbiAgfVxufVxuQ2lwaGVyQmFzZS5wcm90b3R5cGUuX2ZpbmFsT3JEaWdlc3QgPSBmdW5jdGlvbiAob3V0cHV0RW5jKSB7XG4gIHZhciBvdXREYXRhID0gdGhpcy5fZmluYWwoKSB8fCBuZXcgQnVmZmVyKCcnKVxuICBpZiAob3V0cHV0RW5jKSB7XG4gICAgb3V0RGF0YSA9IHRoaXMuX3RvU3RyaW5nKG91dERhdGEsIG91dHB1dEVuYywgdHJ1ZSlcbiAgfVxuICByZXR1cm4gb3V0RGF0YVxufVxuXG5DaXBoZXJCYXNlLnByb3RvdHlwZS5fdG9TdHJpbmcgPSBmdW5jdGlvbiAodmFsdWUsIGVuYywgZmluYWwpIHtcbiAgaWYgKCF0aGlzLl9kZWNvZGVyKSB7XG4gICAgdGhpcy5fZGVjb2RlciA9IG5ldyBTdHJpbmdEZWNvZGVyKGVuYylcbiAgICB0aGlzLl9lbmNvZGluZyA9IGVuY1xuICB9XG4gIGlmICh0aGlzLl9lbmNvZGluZyAhPT0gZW5jKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdjYW5cXCd0IHN3aXRjaCBlbmNvZGluZ3MnKVxuICB9XG4gIHZhciBvdXQgPSB0aGlzLl9kZWNvZGVyLndyaXRlKHZhbHVlKVxuICBpZiAoZmluYWwpIHtcbiAgICBvdXQgKz0gdGhpcy5fZGVjb2Rlci5lbmQoKVxuICB9XG4gIHJldHVybiBvdXRcbn1cbiIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4vLyBOT1RFOiBUaGVzZSB0eXBlIGNoZWNraW5nIGZ1bmN0aW9ucyBpbnRlbnRpb25hbGx5IGRvbid0IHVzZSBgaW5zdGFuY2VvZmBcbi8vIGJlY2F1c2UgaXQgaXMgZnJhZ2lsZSBhbmQgY2FuIGJlIGVhc2lseSBmYWtlZCB3aXRoIGBPYmplY3QuY3JlYXRlKClgLlxuXG5mdW5jdGlvbiBpc0FycmF5KGFyZykge1xuICBpZiAoQXJyYXkuaXNBcnJheSkge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KGFyZyk7XG4gIH1cbiAgcmV0dXJuIG9iamVjdFRvU3RyaW5nKGFyZykgPT09ICdbb2JqZWN0IEFycmF5XSc7XG59XG5leHBvcnRzLmlzQXJyYXkgPSBpc0FycmF5O1xuXG5mdW5jdGlvbiBpc0Jvb2xlYW4oYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnYm9vbGVhbic7XG59XG5leHBvcnRzLmlzQm9vbGVhbiA9IGlzQm9vbGVhbjtcblxuZnVuY3Rpb24gaXNOdWxsKGFyZykge1xuICByZXR1cm4gYXJnID09PSBudWxsO1xufVxuZXhwb3J0cy5pc051bGwgPSBpc051bGw7XG5cbmZ1bmN0aW9uIGlzTnVsbE9yVW5kZWZpbmVkKGFyZykge1xuICByZXR1cm4gYXJnID09IG51bGw7XG59XG5leHBvcnRzLmlzTnVsbE9yVW5kZWZpbmVkID0gaXNOdWxsT3JVbmRlZmluZWQ7XG5cbmZ1bmN0aW9uIGlzTnVtYmVyKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ251bWJlcic7XG59XG5leHBvcnRzLmlzTnVtYmVyID0gaXNOdW1iZXI7XG5cbmZ1bmN0aW9uIGlzU3RyaW5nKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ3N0cmluZyc7XG59XG5leHBvcnRzLmlzU3RyaW5nID0gaXNTdHJpbmc7XG5cbmZ1bmN0aW9uIGlzU3ltYm9sKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ3N5bWJvbCc7XG59XG5leHBvcnRzLmlzU3ltYm9sID0gaXNTeW1ib2w7XG5cbmZ1bmN0aW9uIGlzVW5kZWZpbmVkKGFyZykge1xuICByZXR1cm4gYXJnID09PSB2b2lkIDA7XG59XG5leHBvcnRzLmlzVW5kZWZpbmVkID0gaXNVbmRlZmluZWQ7XG5cbmZ1bmN0aW9uIGlzUmVnRXhwKHJlKSB7XG4gIHJldHVybiBvYmplY3RUb1N0cmluZyhyZSkgPT09ICdbb2JqZWN0IFJlZ0V4cF0nO1xufVxuZXhwb3J0cy5pc1JlZ0V4cCA9IGlzUmVnRXhwO1xuXG5mdW5jdGlvbiBpc09iamVjdChhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdvYmplY3QnICYmIGFyZyAhPT0gbnVsbDtcbn1cbmV4cG9ydHMuaXNPYmplY3QgPSBpc09iamVjdDtcblxuZnVuY3Rpb24gaXNEYXRlKGQpIHtcbiAgcmV0dXJuIG9iamVjdFRvU3RyaW5nKGQpID09PSAnW29iamVjdCBEYXRlXSc7XG59XG5leHBvcnRzLmlzRGF0ZSA9IGlzRGF0ZTtcblxuZnVuY3Rpb24gaXNFcnJvcihlKSB7XG4gIHJldHVybiAob2JqZWN0VG9TdHJpbmcoZSkgPT09ICdbb2JqZWN0IEVycm9yXScgfHwgZSBpbnN0YW5jZW9mIEVycm9yKTtcbn1cbmV4cG9ydHMuaXNFcnJvciA9IGlzRXJyb3I7XG5cbmZ1bmN0aW9uIGlzRnVuY3Rpb24oYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnZnVuY3Rpb24nO1xufVxuZXhwb3J0cy5pc0Z1bmN0aW9uID0gaXNGdW5jdGlvbjtcblxuZnVuY3Rpb24gaXNQcmltaXRpdmUoYXJnKSB7XG4gIHJldHVybiBhcmcgPT09IG51bGwgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdib29sZWFuJyB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ251bWJlcicgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnc3ltYm9sJyB8fCAgLy8gRVM2IHN5bWJvbFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ3VuZGVmaW5lZCc7XG59XG5leHBvcnRzLmlzUHJpbWl0aXZlID0gaXNQcmltaXRpdmU7XG5cbmV4cG9ydHMuaXNCdWZmZXIgPSBCdWZmZXIuaXNCdWZmZXI7XG5cbmZ1bmN0aW9uIG9iamVjdFRvU3RyaW5nKG8pIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKTtcbn1cbiIsInZhciBlbGxpcHRpYyA9IHJlcXVpcmUoJ2VsbGlwdGljJyk7XG52YXIgQk4gPSByZXF1aXJlKCdibi5qcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGNyZWF0ZUVDREgoY3VydmUpIHtcblx0cmV0dXJuIG5ldyBFQ0RIKGN1cnZlKTtcbn07XG5cbnZhciBhbGlhc2VzID0ge1xuXHRzZWNwMjU2azE6IHtcblx0XHRuYW1lOiAnc2VjcDI1NmsxJyxcblx0XHRieXRlTGVuZ3RoOiAzMlxuXHR9LFxuXHRzZWNwMjI0cjE6IHtcblx0XHRuYW1lOiAncDIyNCcsXG5cdFx0Ynl0ZUxlbmd0aDogMjhcblx0fSxcblx0cHJpbWUyNTZ2MToge1xuXHRcdG5hbWU6ICdwMjU2Jyxcblx0XHRieXRlTGVuZ3RoOiAzMlxuXHR9LFxuXHRwcmltZTE5MnYxOiB7XG5cdFx0bmFtZTogJ3AxOTInLFxuXHRcdGJ5dGVMZW5ndGg6IDI0XG5cdH0sXG5cdGVkMjU1MTk6IHtcblx0XHRuYW1lOiAnZWQyNTUxOScsXG5cdFx0Ynl0ZUxlbmd0aDogMzJcblx0fSxcblx0c2VjcDM4NHIxOiB7XG5cdFx0bmFtZTogJ3AzODQnLFxuXHRcdGJ5dGVMZW5ndGg6IDQ4XG5cdH0sXG5cdHNlY3A1MjFyMToge1xuXHRcdG5hbWU6ICdwNTIxJyxcblx0XHRieXRlTGVuZ3RoOiA2NlxuXHR9XG59O1xuXG5hbGlhc2VzLnAyMjQgPSBhbGlhc2VzLnNlY3AyMjRyMTtcbmFsaWFzZXMucDI1NiA9IGFsaWFzZXMuc2VjcDI1NnIxID0gYWxpYXNlcy5wcmltZTI1NnYxO1xuYWxpYXNlcy5wMTkyID0gYWxpYXNlcy5zZWNwMTkycjEgPSBhbGlhc2VzLnByaW1lMTkydjE7XG5hbGlhc2VzLnAzODQgPSBhbGlhc2VzLnNlY3AzODRyMTtcbmFsaWFzZXMucDUyMSA9IGFsaWFzZXMuc2VjcDUyMXIxO1xuXG5mdW5jdGlvbiBFQ0RIKGN1cnZlKSB7XG5cdHRoaXMuY3VydmVUeXBlID0gYWxpYXNlc1tjdXJ2ZV07XG5cdGlmICghdGhpcy5jdXJ2ZVR5cGUgKSB7XG5cdFx0dGhpcy5jdXJ2ZVR5cGUgPSB7XG5cdFx0XHRuYW1lOiBjdXJ2ZVxuXHRcdH07XG5cdH1cblx0dGhpcy5jdXJ2ZSA9IG5ldyBlbGxpcHRpYy5lYyh0aGlzLmN1cnZlVHlwZS5uYW1lKTtcblx0dGhpcy5rZXlzID0gdm9pZCAwO1xufVxuXG5FQ0RILnByb3RvdHlwZS5nZW5lcmF0ZUtleXMgPSBmdW5jdGlvbiAoZW5jLCBmb3JtYXQpIHtcblx0dGhpcy5rZXlzID0gdGhpcy5jdXJ2ZS5nZW5LZXlQYWlyKCk7XG5cdHJldHVybiB0aGlzLmdldFB1YmxpY0tleShlbmMsIGZvcm1hdCk7XG59O1xuXG5FQ0RILnByb3RvdHlwZS5jb21wdXRlU2VjcmV0ID0gZnVuY3Rpb24gKG90aGVyLCBpbmVuYywgZW5jKSB7XG5cdGluZW5jID0gaW5lbmMgfHwgJ3V0ZjgnO1xuXHRpZiAoIUJ1ZmZlci5pc0J1ZmZlcihvdGhlcikpIHtcblx0XHRvdGhlciA9IG5ldyBCdWZmZXIob3RoZXIsIGluZW5jKTtcblx0fVxuXHR2YXIgb3RoZXJQdWIgPSB0aGlzLmN1cnZlLmtleUZyb21QdWJsaWMob3RoZXIpLmdldFB1YmxpYygpO1xuXHR2YXIgb3V0ID0gb3RoZXJQdWIubXVsKHRoaXMua2V5cy5nZXRQcml2YXRlKCkpLmdldFgoKTtcblx0cmV0dXJuIGZvcm1hdFJldHVyblZhbHVlKG91dCwgZW5jLCB0aGlzLmN1cnZlVHlwZS5ieXRlTGVuZ3RoKTtcbn07XG5cbkVDREgucHJvdG90eXBlLmdldFB1YmxpY0tleSA9IGZ1bmN0aW9uIChlbmMsIGZvcm1hdCkge1xuXHR2YXIga2V5ID0gdGhpcy5rZXlzLmdldFB1YmxpYyhmb3JtYXQgPT09ICdjb21wcmVzc2VkJywgdHJ1ZSk7XG5cdGlmIChmb3JtYXQgPT09ICdoeWJyaWQnKSB7XG5cdFx0aWYgKGtleVtrZXkubGVuZ3RoIC0gMV0gJSAyKSB7XG5cdFx0XHRrZXlbMF0gPSA3O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRrZXkgWzBdID0gNjtcblx0XHR9XG5cdH1cblx0cmV0dXJuIGZvcm1hdFJldHVyblZhbHVlKGtleSwgZW5jKTtcbn07XG5cbkVDREgucHJvdG90eXBlLmdldFByaXZhdGVLZXkgPSBmdW5jdGlvbiAoZW5jKSB7XG5cdHJldHVybiBmb3JtYXRSZXR1cm5WYWx1ZSh0aGlzLmtleXMuZ2V0UHJpdmF0ZSgpLCBlbmMpO1xufTtcblxuRUNESC5wcm90b3R5cGUuc2V0UHVibGljS2V5ID0gZnVuY3Rpb24gKHB1YiwgZW5jKSB7XG5cdGVuYyA9IGVuYyB8fCAndXRmOCc7XG5cdGlmICghQnVmZmVyLmlzQnVmZmVyKHB1YikpIHtcblx0XHRwdWIgPSBuZXcgQnVmZmVyKHB1YiwgZW5jKTtcblx0fVxuXHR0aGlzLmtleXMuX2ltcG9ydFB1YmxpYyhwdWIpO1xuXHRyZXR1cm4gdGhpcztcbn07XG5cbkVDREgucHJvdG90eXBlLnNldFByaXZhdGVLZXkgPSBmdW5jdGlvbiAocHJpdiwgZW5jKSB7XG5cdGVuYyA9IGVuYyB8fCAndXRmOCc7XG5cdGlmICghQnVmZmVyLmlzQnVmZmVyKHByaXYpKSB7XG5cdFx0cHJpdiA9IG5ldyBCdWZmZXIocHJpdiwgZW5jKTtcblx0fVxuXHR2YXIgX3ByaXYgPSBuZXcgQk4ocHJpdik7XG5cdF9wcml2ID0gX3ByaXYudG9TdHJpbmcoMTYpO1xuXHR0aGlzLmtleXMuX2ltcG9ydFByaXZhdGUoX3ByaXYpO1xuXHRyZXR1cm4gdGhpcztcbn07XG5cbmZ1bmN0aW9uIGZvcm1hdFJldHVyblZhbHVlKGJuLCBlbmMsIGxlbikge1xuXHRpZiAoIUFycmF5LmlzQXJyYXkoYm4pKSB7XG5cdFx0Ym4gPSBibi50b0FycmF5KCk7XG5cdH1cblx0dmFyIGJ1ZiA9IG5ldyBCdWZmZXIoYm4pO1xuXHRpZiAobGVuICYmIGJ1Zi5sZW5ndGggPCBsZW4pIHtcblx0XHR2YXIgemVyb3MgPSBuZXcgQnVmZmVyKGxlbiAtIGJ1Zi5sZW5ndGgpO1xuXHRcdHplcm9zLmZpbGwoMCk7XG5cdFx0YnVmID0gQnVmZmVyLmNvbmNhdChbemVyb3MsIGJ1Zl0pO1xuXHR9XG5cdGlmICghZW5jKSB7XG5cdFx0cmV0dXJuIGJ1Zjtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gYnVmLnRvU3RyaW5nKGVuYyk7XG5cdH1cbn1cbiIsIid1c2Ugc3RyaWN0JztcbnZhciBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJylcbnZhciBtZDUgPSByZXF1aXJlKCcuL21kNScpXG52YXIgcm1kMTYwID0gcmVxdWlyZSgncmlwZW1kMTYwJylcbnZhciBzaGEgPSByZXF1aXJlKCdzaGEuanMnKVxuXG52YXIgQmFzZSA9IHJlcXVpcmUoJ2NpcGhlci1iYXNlJylcblxuZnVuY3Rpb24gSGFzaE5vQ29uc3RydWN0b3IoaGFzaCkge1xuICBCYXNlLmNhbGwodGhpcywgJ2RpZ2VzdCcpXG5cbiAgdGhpcy5faGFzaCA9IGhhc2hcbiAgdGhpcy5idWZmZXJzID0gW11cbn1cblxuaW5oZXJpdHMoSGFzaE5vQ29uc3RydWN0b3IsIEJhc2UpXG5cbkhhc2hOb0NvbnN0cnVjdG9yLnByb3RvdHlwZS5fdXBkYXRlID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgdGhpcy5idWZmZXJzLnB1c2goZGF0YSlcbn1cblxuSGFzaE5vQ29uc3RydWN0b3IucHJvdG90eXBlLl9maW5hbCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGJ1ZiA9IEJ1ZmZlci5jb25jYXQodGhpcy5idWZmZXJzKVxuICB2YXIgciA9IHRoaXMuX2hhc2goYnVmKVxuICB0aGlzLmJ1ZmZlcnMgPSBudWxsXG5cbiAgcmV0dXJuIHJcbn1cblxuZnVuY3Rpb24gSGFzaChoYXNoKSB7XG4gIEJhc2UuY2FsbCh0aGlzLCAnZGlnZXN0JylcblxuICB0aGlzLl9oYXNoID0gaGFzaFxufVxuXG5pbmhlcml0cyhIYXNoLCBCYXNlKVxuXG5IYXNoLnByb3RvdHlwZS5fdXBkYXRlID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgdGhpcy5faGFzaC51cGRhdGUoZGF0YSlcbn1cblxuSGFzaC5wcm90b3R5cGUuX2ZpbmFsID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5faGFzaC5kaWdlc3QoKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGNyZWF0ZUhhc2ggKGFsZykge1xuICBhbGcgPSBhbGcudG9Mb3dlckNhc2UoKVxuICBpZiAoJ21kNScgPT09IGFsZykgcmV0dXJuIG5ldyBIYXNoTm9Db25zdHJ1Y3RvcihtZDUpXG4gIGlmICgncm1kMTYwJyA9PT0gYWxnIHx8ICdyaXBlbWQxNjAnID09PSBhbGcpIHJldHVybiBuZXcgSGFzaE5vQ29uc3RydWN0b3Iocm1kMTYwKVxuXG4gIHJldHVybiBuZXcgSGFzaChzaGEoYWxnKSlcbn1cbiIsIid1c2Ugc3RyaWN0JztcbnZhciBpbnRTaXplID0gNDtcbnZhciB6ZXJvQnVmZmVyID0gbmV3IEJ1ZmZlcihpbnRTaXplKTsgemVyb0J1ZmZlci5maWxsKDApO1xudmFyIGNocnN6ID0gODtcblxuZnVuY3Rpb24gdG9BcnJheShidWYsIGJpZ0VuZGlhbikge1xuICBpZiAoKGJ1Zi5sZW5ndGggJSBpbnRTaXplKSAhPT0gMCkge1xuICAgIHZhciBsZW4gPSBidWYubGVuZ3RoICsgKGludFNpemUgLSAoYnVmLmxlbmd0aCAlIGludFNpemUpKTtcbiAgICBidWYgPSBCdWZmZXIuY29uY2F0KFtidWYsIHplcm9CdWZmZXJdLCBsZW4pO1xuICB9XG5cbiAgdmFyIGFyciA9IFtdO1xuICB2YXIgZm4gPSBiaWdFbmRpYW4gPyBidWYucmVhZEludDMyQkUgOiBidWYucmVhZEludDMyTEU7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYnVmLmxlbmd0aDsgaSArPSBpbnRTaXplKSB7XG4gICAgYXJyLnB1c2goZm4uY2FsbChidWYsIGkpKTtcbiAgfVxuICByZXR1cm4gYXJyO1xufVxuXG5mdW5jdGlvbiB0b0J1ZmZlcihhcnIsIHNpemUsIGJpZ0VuZGlhbikge1xuICB2YXIgYnVmID0gbmV3IEJ1ZmZlcihzaXplKTtcbiAgdmFyIGZuID0gYmlnRW5kaWFuID8gYnVmLndyaXRlSW50MzJCRSA6IGJ1Zi53cml0ZUludDMyTEU7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgZm4uY2FsbChidWYsIGFycltpXSwgaSAqIDQsIHRydWUpO1xuICB9XG4gIHJldHVybiBidWY7XG59XG5cbmZ1bmN0aW9uIGhhc2goYnVmLCBmbiwgaGFzaFNpemUsIGJpZ0VuZGlhbikge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihidWYpKSBidWYgPSBuZXcgQnVmZmVyKGJ1Zik7XG4gIHZhciBhcnIgPSBmbih0b0FycmF5KGJ1ZiwgYmlnRW5kaWFuKSwgYnVmLmxlbmd0aCAqIGNocnN6KTtcbiAgcmV0dXJuIHRvQnVmZmVyKGFyciwgaGFzaFNpemUsIGJpZ0VuZGlhbik7XG59XG5leHBvcnRzLmhhc2ggPSBoYXNoOyIsIid1c2Ugc3RyaWN0Jztcbi8qXG4gKiBBIEphdmFTY3JpcHQgaW1wbGVtZW50YXRpb24gb2YgdGhlIFJTQSBEYXRhIFNlY3VyaXR5LCBJbmMuIE1ENSBNZXNzYWdlXG4gKiBEaWdlc3QgQWxnb3JpdGhtLCBhcyBkZWZpbmVkIGluIFJGQyAxMzIxLlxuICogVmVyc2lvbiAyLjEgQ29weXJpZ2h0IChDKSBQYXVsIEpvaG5zdG9uIDE5OTkgLSAyMDAyLlxuICogT3RoZXIgY29udHJpYnV0b3JzOiBHcmVnIEhvbHQsIEFuZHJldyBLZXBlcnQsIFlkbmFyLCBMb3N0aW5ldFxuICogRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlXG4gKiBTZWUgaHR0cDovL3BhamhvbWUub3JnLnVrL2NyeXB0L21kNSBmb3IgbW9yZSBpbmZvLlxuICovXG5cbnZhciBoZWxwZXJzID0gcmVxdWlyZSgnLi9oZWxwZXJzJyk7XG5cbi8qXG4gKiBDYWxjdWxhdGUgdGhlIE1ENSBvZiBhbiBhcnJheSBvZiBsaXR0bGUtZW5kaWFuIHdvcmRzLCBhbmQgYSBiaXQgbGVuZ3RoXG4gKi9cbmZ1bmN0aW9uIGNvcmVfbWQ1KHgsIGxlbilcbntcbiAgLyogYXBwZW5kIHBhZGRpbmcgKi9cbiAgeFtsZW4gPj4gNV0gfD0gMHg4MCA8PCAoKGxlbikgJSAzMik7XG4gIHhbKCgobGVuICsgNjQpID4+PiA5KSA8PCA0KSArIDE0XSA9IGxlbjtcblxuICB2YXIgYSA9ICAxNzMyNTg0MTkzO1xuICB2YXIgYiA9IC0yNzE3MzM4Nzk7XG4gIHZhciBjID0gLTE3MzI1ODQxOTQ7XG4gIHZhciBkID0gIDI3MTczMzg3ODtcblxuICBmb3IodmFyIGkgPSAwOyBpIDwgeC5sZW5ndGg7IGkgKz0gMTYpXG4gIHtcbiAgICB2YXIgb2xkYSA9IGE7XG4gICAgdmFyIG9sZGIgPSBiO1xuICAgIHZhciBvbGRjID0gYztcbiAgICB2YXIgb2xkZCA9IGQ7XG5cbiAgICBhID0gbWQ1X2ZmKGEsIGIsIGMsIGQsIHhbaSsgMF0sIDcgLCAtNjgwODc2OTM2KTtcbiAgICBkID0gbWQ1X2ZmKGQsIGEsIGIsIGMsIHhbaSsgMV0sIDEyLCAtMzg5NTY0NTg2KTtcbiAgICBjID0gbWQ1X2ZmKGMsIGQsIGEsIGIsIHhbaSsgMl0sIDE3LCAgNjA2MTA1ODE5KTtcbiAgICBiID0gbWQ1X2ZmKGIsIGMsIGQsIGEsIHhbaSsgM10sIDIyLCAtMTA0NDUyNTMzMCk7XG4gICAgYSA9IG1kNV9mZihhLCBiLCBjLCBkLCB4W2krIDRdLCA3ICwgLTE3NjQxODg5Nyk7XG4gICAgZCA9IG1kNV9mZihkLCBhLCBiLCBjLCB4W2krIDVdLCAxMiwgIDEyMDAwODA0MjYpO1xuICAgIGMgPSBtZDVfZmYoYywgZCwgYSwgYiwgeFtpKyA2XSwgMTcsIC0xNDczMjMxMzQxKTtcbiAgICBiID0gbWQ1X2ZmKGIsIGMsIGQsIGEsIHhbaSsgN10sIDIyLCAtNDU3MDU5ODMpO1xuICAgIGEgPSBtZDVfZmYoYSwgYiwgYywgZCwgeFtpKyA4XSwgNyAsICAxNzcwMDM1NDE2KTtcbiAgICBkID0gbWQ1X2ZmKGQsIGEsIGIsIGMsIHhbaSsgOV0sIDEyLCAtMTk1ODQxNDQxNyk7XG4gICAgYyA9IG1kNV9mZihjLCBkLCBhLCBiLCB4W2krMTBdLCAxNywgLTQyMDYzKTtcbiAgICBiID0gbWQ1X2ZmKGIsIGMsIGQsIGEsIHhbaSsxMV0sIDIyLCAtMTk5MDQwNDE2Mik7XG4gICAgYSA9IG1kNV9mZihhLCBiLCBjLCBkLCB4W2krMTJdLCA3ICwgIDE4MDQ2MDM2ODIpO1xuICAgIGQgPSBtZDVfZmYoZCwgYSwgYiwgYywgeFtpKzEzXSwgMTIsIC00MDM0MTEwMSk7XG4gICAgYyA9IG1kNV9mZihjLCBkLCBhLCBiLCB4W2krMTRdLCAxNywgLTE1MDIwMDIyOTApO1xuICAgIGIgPSBtZDVfZmYoYiwgYywgZCwgYSwgeFtpKzE1XSwgMjIsICAxMjM2NTM1MzI5KTtcblxuICAgIGEgPSBtZDVfZ2coYSwgYiwgYywgZCwgeFtpKyAxXSwgNSAsIC0xNjU3OTY1MTApO1xuICAgIGQgPSBtZDVfZ2coZCwgYSwgYiwgYywgeFtpKyA2XSwgOSAsIC0xMDY5NTAxNjMyKTtcbiAgICBjID0gbWQ1X2dnKGMsIGQsIGEsIGIsIHhbaSsxMV0sIDE0LCAgNjQzNzE3NzEzKTtcbiAgICBiID0gbWQ1X2dnKGIsIGMsIGQsIGEsIHhbaSsgMF0sIDIwLCAtMzczODk3MzAyKTtcbiAgICBhID0gbWQ1X2dnKGEsIGIsIGMsIGQsIHhbaSsgNV0sIDUgLCAtNzAxNTU4NjkxKTtcbiAgICBkID0gbWQ1X2dnKGQsIGEsIGIsIGMsIHhbaSsxMF0sIDkgLCAgMzgwMTYwODMpO1xuICAgIGMgPSBtZDVfZ2coYywgZCwgYSwgYiwgeFtpKzE1XSwgMTQsIC02NjA0NzgzMzUpO1xuICAgIGIgPSBtZDVfZ2coYiwgYywgZCwgYSwgeFtpKyA0XSwgMjAsIC00MDU1Mzc4NDgpO1xuICAgIGEgPSBtZDVfZ2coYSwgYiwgYywgZCwgeFtpKyA5XSwgNSAsICA1Njg0NDY0MzgpO1xuICAgIGQgPSBtZDVfZ2coZCwgYSwgYiwgYywgeFtpKzE0XSwgOSAsIC0xMDE5ODAzNjkwKTtcbiAgICBjID0gbWQ1X2dnKGMsIGQsIGEsIGIsIHhbaSsgM10sIDE0LCAtMTg3MzYzOTYxKTtcbiAgICBiID0gbWQ1X2dnKGIsIGMsIGQsIGEsIHhbaSsgOF0sIDIwLCAgMTE2MzUzMTUwMSk7XG4gICAgYSA9IG1kNV9nZyhhLCBiLCBjLCBkLCB4W2krMTNdLCA1ICwgLTE0NDQ2ODE0NjcpO1xuICAgIGQgPSBtZDVfZ2coZCwgYSwgYiwgYywgeFtpKyAyXSwgOSAsIC01MTQwMzc4NCk7XG4gICAgYyA9IG1kNV9nZyhjLCBkLCBhLCBiLCB4W2krIDddLCAxNCwgIDE3MzUzMjg0NzMpO1xuICAgIGIgPSBtZDVfZ2coYiwgYywgZCwgYSwgeFtpKzEyXSwgMjAsIC0xOTI2NjA3NzM0KTtcblxuICAgIGEgPSBtZDVfaGgoYSwgYiwgYywgZCwgeFtpKyA1XSwgNCAsIC0zNzg1NTgpO1xuICAgIGQgPSBtZDVfaGgoZCwgYSwgYiwgYywgeFtpKyA4XSwgMTEsIC0yMDIyNTc0NDYzKTtcbiAgICBjID0gbWQ1X2hoKGMsIGQsIGEsIGIsIHhbaSsxMV0sIDE2LCAgMTgzOTAzMDU2Mik7XG4gICAgYiA9IG1kNV9oaChiLCBjLCBkLCBhLCB4W2krMTRdLCAyMywgLTM1MzA5NTU2KTtcbiAgICBhID0gbWQ1X2hoKGEsIGIsIGMsIGQsIHhbaSsgMV0sIDQgLCAtMTUzMDk5MjA2MCk7XG4gICAgZCA9IG1kNV9oaChkLCBhLCBiLCBjLCB4W2krIDRdLCAxMSwgIDEyNzI4OTMzNTMpO1xuICAgIGMgPSBtZDVfaGgoYywgZCwgYSwgYiwgeFtpKyA3XSwgMTYsIC0xNTU0OTc2MzIpO1xuICAgIGIgPSBtZDVfaGgoYiwgYywgZCwgYSwgeFtpKzEwXSwgMjMsIC0xMDk0NzMwNjQwKTtcbiAgICBhID0gbWQ1X2hoKGEsIGIsIGMsIGQsIHhbaSsxM10sIDQgLCAgNjgxMjc5MTc0KTtcbiAgICBkID0gbWQ1X2hoKGQsIGEsIGIsIGMsIHhbaSsgMF0sIDExLCAtMzU4NTM3MjIyKTtcbiAgICBjID0gbWQ1X2hoKGMsIGQsIGEsIGIsIHhbaSsgM10sIDE2LCAtNzIyNTIxOTc5KTtcbiAgICBiID0gbWQ1X2hoKGIsIGMsIGQsIGEsIHhbaSsgNl0sIDIzLCAgNzYwMjkxODkpO1xuICAgIGEgPSBtZDVfaGgoYSwgYiwgYywgZCwgeFtpKyA5XSwgNCAsIC02NDAzNjQ0ODcpO1xuICAgIGQgPSBtZDVfaGgoZCwgYSwgYiwgYywgeFtpKzEyXSwgMTEsIC00MjE4MTU4MzUpO1xuICAgIGMgPSBtZDVfaGgoYywgZCwgYSwgYiwgeFtpKzE1XSwgMTYsICA1MzA3NDI1MjApO1xuICAgIGIgPSBtZDVfaGgoYiwgYywgZCwgYSwgeFtpKyAyXSwgMjMsIC05OTUzMzg2NTEpO1xuXG4gICAgYSA9IG1kNV9paShhLCBiLCBjLCBkLCB4W2krIDBdLCA2ICwgLTE5ODYzMDg0NCk7XG4gICAgZCA9IG1kNV9paShkLCBhLCBiLCBjLCB4W2krIDddLCAxMCwgIDExMjY4OTE0MTUpO1xuICAgIGMgPSBtZDVfaWkoYywgZCwgYSwgYiwgeFtpKzE0XSwgMTUsIC0xNDE2MzU0OTA1KTtcbiAgICBiID0gbWQ1X2lpKGIsIGMsIGQsIGEsIHhbaSsgNV0sIDIxLCAtNTc0MzQwNTUpO1xuICAgIGEgPSBtZDVfaWkoYSwgYiwgYywgZCwgeFtpKzEyXSwgNiAsICAxNzAwNDg1NTcxKTtcbiAgICBkID0gbWQ1X2lpKGQsIGEsIGIsIGMsIHhbaSsgM10sIDEwLCAtMTg5NDk4NjYwNik7XG4gICAgYyA9IG1kNV9paShjLCBkLCBhLCBiLCB4W2krMTBdLCAxNSwgLTEwNTE1MjMpO1xuICAgIGIgPSBtZDVfaWkoYiwgYywgZCwgYSwgeFtpKyAxXSwgMjEsIC0yMDU0OTIyNzk5KTtcbiAgICBhID0gbWQ1X2lpKGEsIGIsIGMsIGQsIHhbaSsgOF0sIDYgLCAgMTg3MzMxMzM1OSk7XG4gICAgZCA9IG1kNV9paShkLCBhLCBiLCBjLCB4W2krMTVdLCAxMCwgLTMwNjExNzQ0KTtcbiAgICBjID0gbWQ1X2lpKGMsIGQsIGEsIGIsIHhbaSsgNl0sIDE1LCAtMTU2MDE5ODM4MCk7XG4gICAgYiA9IG1kNV9paShiLCBjLCBkLCBhLCB4W2krMTNdLCAyMSwgIDEzMDkxNTE2NDkpO1xuICAgIGEgPSBtZDVfaWkoYSwgYiwgYywgZCwgeFtpKyA0XSwgNiAsIC0xNDU1MjMwNzApO1xuICAgIGQgPSBtZDVfaWkoZCwgYSwgYiwgYywgeFtpKzExXSwgMTAsIC0xMTIwMjEwMzc5KTtcbiAgICBjID0gbWQ1X2lpKGMsIGQsIGEsIGIsIHhbaSsgMl0sIDE1LCAgNzE4Nzg3MjU5KTtcbiAgICBiID0gbWQ1X2lpKGIsIGMsIGQsIGEsIHhbaSsgOV0sIDIxLCAtMzQzNDg1NTUxKTtcblxuICAgIGEgPSBzYWZlX2FkZChhLCBvbGRhKTtcbiAgICBiID0gc2FmZV9hZGQoYiwgb2xkYik7XG4gICAgYyA9IHNhZmVfYWRkKGMsIG9sZGMpO1xuICAgIGQgPSBzYWZlX2FkZChkLCBvbGRkKTtcbiAgfVxuICByZXR1cm4gQXJyYXkoYSwgYiwgYywgZCk7XG5cbn1cblxuLypcbiAqIFRoZXNlIGZ1bmN0aW9ucyBpbXBsZW1lbnQgdGhlIGZvdXIgYmFzaWMgb3BlcmF0aW9ucyB0aGUgYWxnb3JpdGhtIHVzZXMuXG4gKi9cbmZ1bmN0aW9uIG1kNV9jbW4ocSwgYSwgYiwgeCwgcywgdClcbntcbiAgcmV0dXJuIHNhZmVfYWRkKGJpdF9yb2woc2FmZV9hZGQoc2FmZV9hZGQoYSwgcSksIHNhZmVfYWRkKHgsIHQpKSwgcyksYik7XG59XG5mdW5jdGlvbiBtZDVfZmYoYSwgYiwgYywgZCwgeCwgcywgdClcbntcbiAgcmV0dXJuIG1kNV9jbW4oKGIgJiBjKSB8ICgofmIpICYgZCksIGEsIGIsIHgsIHMsIHQpO1xufVxuZnVuY3Rpb24gbWQ1X2dnKGEsIGIsIGMsIGQsIHgsIHMsIHQpXG57XG4gIHJldHVybiBtZDVfY21uKChiICYgZCkgfCAoYyAmICh+ZCkpLCBhLCBiLCB4LCBzLCB0KTtcbn1cbmZ1bmN0aW9uIG1kNV9oaChhLCBiLCBjLCBkLCB4LCBzLCB0KVxue1xuICByZXR1cm4gbWQ1X2NtbihiIF4gYyBeIGQsIGEsIGIsIHgsIHMsIHQpO1xufVxuZnVuY3Rpb24gbWQ1X2lpKGEsIGIsIGMsIGQsIHgsIHMsIHQpXG57XG4gIHJldHVybiBtZDVfY21uKGMgXiAoYiB8ICh+ZCkpLCBhLCBiLCB4LCBzLCB0KTtcbn1cblxuLypcbiAqIEFkZCBpbnRlZ2Vycywgd3JhcHBpbmcgYXQgMl4zMi4gVGhpcyB1c2VzIDE2LWJpdCBvcGVyYXRpb25zIGludGVybmFsbHlcbiAqIHRvIHdvcmsgYXJvdW5kIGJ1Z3MgaW4gc29tZSBKUyBpbnRlcnByZXRlcnMuXG4gKi9cbmZ1bmN0aW9uIHNhZmVfYWRkKHgsIHkpXG57XG4gIHZhciBsc3cgPSAoeCAmIDB4RkZGRikgKyAoeSAmIDB4RkZGRik7XG4gIHZhciBtc3cgPSAoeCA+PiAxNikgKyAoeSA+PiAxNikgKyAobHN3ID4+IDE2KTtcbiAgcmV0dXJuIChtc3cgPDwgMTYpIHwgKGxzdyAmIDB4RkZGRik7XG59XG5cbi8qXG4gKiBCaXR3aXNlIHJvdGF0ZSBhIDMyLWJpdCBudW1iZXIgdG8gdGhlIGxlZnQuXG4gKi9cbmZ1bmN0aW9uIGJpdF9yb2wobnVtLCBjbnQpXG57XG4gIHJldHVybiAobnVtIDw8IGNudCkgfCAobnVtID4+PiAoMzIgLSBjbnQpKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBtZDUoYnVmKSB7XG4gIHJldHVybiBoZWxwZXJzLmhhc2goYnVmLCBjb3JlX21kNSwgMTYpO1xufTsiLCIndXNlIHN0cmljdCc7XG52YXIgY3JlYXRlSGFzaCA9IHJlcXVpcmUoJ2NyZWF0ZS1oYXNoL2Jyb3dzZXInKTtcbnZhciBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJylcblxudmFyIFRyYW5zZm9ybSA9IHJlcXVpcmUoJ3N0cmVhbScpLlRyYW5zZm9ybVxuXG52YXIgWkVST1MgPSBuZXcgQnVmZmVyKDEyOClcblpFUk9TLmZpbGwoMClcblxuZnVuY3Rpb24gSG1hYyhhbGcsIGtleSkge1xuICBUcmFuc2Zvcm0uY2FsbCh0aGlzKVxuICBhbGcgPSBhbGcudG9Mb3dlckNhc2UoKVxuICBpZiAodHlwZW9mIGtleSA9PT0gJ3N0cmluZycpIHtcbiAgICBrZXkgPSBuZXcgQnVmZmVyKGtleSlcbiAgfVxuXG4gIHZhciBibG9ja3NpemUgPSAoYWxnID09PSAnc2hhNTEyJyB8fCBhbGcgPT09ICdzaGEzODQnKSA/IDEyOCA6IDY0XG5cbiAgdGhpcy5fYWxnID0gYWxnXG4gIHRoaXMuX2tleSA9IGtleVxuXG4gIGlmIChrZXkubGVuZ3RoID4gYmxvY2tzaXplKSB7XG4gICAga2V5ID0gY3JlYXRlSGFzaChhbGcpLnVwZGF0ZShrZXkpLmRpZ2VzdCgpXG5cbiAgfSBlbHNlIGlmIChrZXkubGVuZ3RoIDwgYmxvY2tzaXplKSB7XG4gICAga2V5ID0gQnVmZmVyLmNvbmNhdChba2V5LCBaRVJPU10sIGJsb2Nrc2l6ZSlcbiAgfVxuXG4gIHZhciBpcGFkID0gdGhpcy5faXBhZCA9IG5ldyBCdWZmZXIoYmxvY2tzaXplKVxuICB2YXIgb3BhZCA9IHRoaXMuX29wYWQgPSBuZXcgQnVmZmVyKGJsb2Nrc2l6ZSlcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGJsb2Nrc2l6ZTsgaSsrKSB7XG4gICAgaXBhZFtpXSA9IGtleVtpXSBeIDB4MzZcbiAgICBvcGFkW2ldID0ga2V5W2ldIF4gMHg1Q1xuICB9XG5cbiAgdGhpcy5faGFzaCA9IGNyZWF0ZUhhc2goYWxnKS51cGRhdGUoaXBhZClcbn1cblxuaW5oZXJpdHMoSG1hYywgVHJhbnNmb3JtKVxuXG5IbWFjLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiAoZGF0YSwgZW5jKSB7XG4gIHRoaXMuX2hhc2gudXBkYXRlKGRhdGEsIGVuYylcblxuICByZXR1cm4gdGhpc1xufVxuXG5IbWFjLnByb3RvdHlwZS5fdHJhbnNmb3JtID0gZnVuY3Rpb24gKGRhdGEsIF8sIG5leHQpIHtcbiAgdGhpcy5faGFzaC51cGRhdGUoZGF0YSlcblxuICBuZXh0KClcbn1cblxuSG1hYy5wcm90b3R5cGUuX2ZsdXNoID0gZnVuY3Rpb24gKG5leHQpIHtcbiAgdGhpcy5wdXNoKHRoaXMuZGlnZXN0KCkpXG5cbiAgbmV4dCgpXG59XG5cbkhtYWMucHJvdG90eXBlLmRpZ2VzdCA9IGZ1bmN0aW9uIChlbmMpIHtcbiAgdmFyIGggPSB0aGlzLl9oYXNoLmRpZ2VzdCgpXG5cbiAgcmV0dXJuIGNyZWF0ZUhhc2godGhpcy5fYWxnKS51cGRhdGUodGhpcy5fb3BhZCkudXBkYXRlKGgpLmRpZ2VzdChlbmMpXG59XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gY3JlYXRlSG1hYyhhbGcsIGtleSkge1xuICByZXR1cm4gbmV3IEhtYWMoYWxnLCBrZXkpXG59XG4iLCIndXNlIHN0cmljdCdcblxuZXhwb3J0cy5yYW5kb21CeXRlcyA9IGV4cG9ydHMucm5nID0gZXhwb3J0cy5wc2V1ZG9SYW5kb21CeXRlcyA9IGV4cG9ydHMucHJuZyA9IHJlcXVpcmUoJ3JhbmRvbWJ5dGVzJylcbmV4cG9ydHMuY3JlYXRlSGFzaCA9IGV4cG9ydHMuSGFzaCA9IHJlcXVpcmUoJ2NyZWF0ZS1oYXNoJylcbmV4cG9ydHMuY3JlYXRlSG1hYyA9IGV4cG9ydHMuSG1hYyA9IHJlcXVpcmUoJ2NyZWF0ZS1obWFjJylcblxudmFyIGhhc2hlcyA9IFsnc2hhMScsICdzaGEyMjQnLCAnc2hhMjU2JywgJ3NoYTM4NCcsICdzaGE1MTInLCAnbWQ1JywgJ3JtZDE2MCddLmNvbmNhdChPYmplY3Qua2V5cyhyZXF1aXJlKCdicm93c2VyaWZ5LXNpZ24vYWxnb3MnKSkpXG5leHBvcnRzLmdldEhhc2hlcyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGhhc2hlc1xufVxuXG52YXIgcCA9IHJlcXVpcmUoJ3Bia2RmMicpXG5leHBvcnRzLnBia2RmMiA9IHAucGJrZGYyXG5leHBvcnRzLnBia2RmMlN5bmMgPSBwLnBia2RmMlN5bmNcblxudmFyIGFlcyA9IHJlcXVpcmUoJ2Jyb3dzZXJpZnktY2lwaGVyJylcbjtbXG4gICdDaXBoZXInLFxuICAnY3JlYXRlQ2lwaGVyJyxcbiAgJ0NpcGhlcml2JyxcbiAgJ2NyZWF0ZUNpcGhlcml2JyxcbiAgJ0RlY2lwaGVyJyxcbiAgJ2NyZWF0ZURlY2lwaGVyJyxcbiAgJ0RlY2lwaGVyaXYnLFxuICAnY3JlYXRlRGVjaXBoZXJpdicsXG4gICdnZXRDaXBoZXJzJyxcbiAgJ2xpc3RDaXBoZXJzJ1xuXS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgZXhwb3J0c1trZXldID0gYWVzW2tleV1cbn0pXG5cbnZhciBkaCA9IHJlcXVpcmUoJ2RpZmZpZS1oZWxsbWFuJylcbjtbXG4gICdEaWZmaWVIZWxsbWFuR3JvdXAnLFxuICAnY3JlYXRlRGlmZmllSGVsbG1hbkdyb3VwJyxcbiAgJ2dldERpZmZpZUhlbGxtYW4nLFxuICAnY3JlYXRlRGlmZmllSGVsbG1hbicsXG4gICdEaWZmaWVIZWxsbWFuJ1xuXS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgZXhwb3J0c1trZXldID0gZGhba2V5XVxufSlcblxudmFyIHNpZ24gPSByZXF1aXJlKCdicm93c2VyaWZ5LXNpZ24nKVxuO1tcbiAgJ2NyZWF0ZVNpZ24nLFxuICAnU2lnbicsXG4gICdjcmVhdGVWZXJpZnknLFxuICAnVmVyaWZ5J1xuXS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgZXhwb3J0c1trZXldID0gc2lnbltrZXldXG59KVxuXG5leHBvcnRzLmNyZWF0ZUVDREggPSByZXF1aXJlKCdjcmVhdGUtZWNkaCcpXG5cbnZhciBwdWJsaWNFbmNyeXB0ID0gcmVxdWlyZSgncHVibGljLWVuY3J5cHQnKVxuXG47W1xuICAncHVibGljRW5jcnlwdCcsXG4gICdwcml2YXRlRW5jcnlwdCcsXG4gICdwdWJsaWNEZWNyeXB0JyxcbiAgJ3ByaXZhdGVEZWNyeXB0J1xuXS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgZXhwb3J0c1trZXldID0gcHVibGljRW5jcnlwdFtrZXldXG59KVxuXG4vLyB0aGUgbGVhc3QgSSBjYW4gZG8gaXMgbWFrZSBlcnJvciBtZXNzYWdlcyBmb3IgdGhlIHJlc3Qgb2YgdGhlIG5vZGUuanMvY3J5cHRvIGFwaS5cbjtbXG4gICdjcmVhdGVDcmVkZW50aWFscydcbl0uZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICBleHBvcnRzW25hbWVdID0gZnVuY3Rpb24gKCkge1xuICAgIHRocm93IG5ldyBFcnJvcihbXG4gICAgICAnc29ycnksICcgKyBuYW1lICsgJyBpcyBub3QgaW1wbGVtZW50ZWQgeWV0JyxcbiAgICAgICd3ZSBhY2NlcHQgcHVsbCByZXF1ZXN0cycsXG4gICAgICAnaHR0cHM6Ly9naXRodWIuY29tL2NyeXB0by1icm93c2VyaWZ5L2NyeXB0by1icm93c2VyaWZ5J1xuICAgIF0uam9pbignXFxuJykpXG4gIH1cbn0pXG4iLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMudXRpbHMgPSByZXF1aXJlKCcuL2Rlcy91dGlscycpO1xuZXhwb3J0cy5DaXBoZXIgPSByZXF1aXJlKCcuL2Rlcy9jaXBoZXInKTtcbmV4cG9ydHMuREVTID0gcmVxdWlyZSgnLi9kZXMvZGVzJyk7XG5leHBvcnRzLkNCQyA9IHJlcXVpcmUoJy4vZGVzL2NiYycpO1xuZXhwb3J0cy5FREUgPSByZXF1aXJlKCcuL2Rlcy9lZGUnKTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGFzc2VydCA9IHJlcXVpcmUoJ21pbmltYWxpc3RpYy1hc3NlcnQnKTtcbnZhciBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG5cbnZhciBwcm90byA9IHt9O1xuXG5mdW5jdGlvbiBDQkNTdGF0ZShpdikge1xuICBhc3NlcnQuZXF1YWwoaXYubGVuZ3RoLCA4LCAnSW52YWxpZCBJViBsZW5ndGgnKTtcblxuICB0aGlzLml2ID0gbmV3IEFycmF5KDgpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuaXYubGVuZ3RoOyBpKyspXG4gICAgdGhpcy5pdltpXSA9IGl2W2ldO1xufVxuXG5mdW5jdGlvbiBpbnN0YW50aWF0ZShCYXNlKSB7XG4gIGZ1bmN0aW9uIENCQyhvcHRpb25zKSB7XG4gICAgQmFzZS5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuICAgIHRoaXMuX2NiY0luaXQoKTtcbiAgfVxuICBpbmhlcml0cyhDQkMsIEJhc2UpO1xuXG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMocHJvdG8pO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIga2V5ID0ga2V5c1tpXTtcbiAgICBDQkMucHJvdG90eXBlW2tleV0gPSBwcm90b1trZXldO1xuICB9XG5cbiAgQ0JDLmNyZWF0ZSA9IGZ1bmN0aW9uIGNyZWF0ZShvcHRpb25zKSB7XG4gICAgcmV0dXJuIG5ldyBDQkMob3B0aW9ucyk7XG4gIH07XG5cbiAgcmV0dXJuIENCQztcbn1cblxuZXhwb3J0cy5pbnN0YW50aWF0ZSA9IGluc3RhbnRpYXRlO1xuXG5wcm90by5fY2JjSW5pdCA9IGZ1bmN0aW9uIF9jYmNJbml0KCkge1xuICB2YXIgc3RhdGUgPSBuZXcgQ0JDU3RhdGUodGhpcy5vcHRpb25zLml2KTtcbiAgdGhpcy5fY2JjU3RhdGUgPSBzdGF0ZTtcbn07XG5cbnByb3RvLl91cGRhdGUgPSBmdW5jdGlvbiBfdXBkYXRlKGlucCwgaW5PZmYsIG91dCwgb3V0T2ZmKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX2NiY1N0YXRlO1xuICB2YXIgc3VwZXJQcm90byA9IHRoaXMuY29uc3RydWN0b3Iuc3VwZXJfLnByb3RvdHlwZTtcblxuICB2YXIgaXYgPSBzdGF0ZS5pdjtcbiAgaWYgKHRoaXMudHlwZSA9PT0gJ2VuY3J5cHQnKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmJsb2NrU2l6ZTsgaSsrKVxuICAgICAgaXZbaV0gXj0gaW5wW2luT2ZmICsgaV07XG5cbiAgICBzdXBlclByb3RvLl91cGRhdGUuY2FsbCh0aGlzLCBpdiwgMCwgb3V0LCBvdXRPZmYpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmJsb2NrU2l6ZTsgaSsrKVxuICAgICAgaXZbaV0gPSBvdXRbb3V0T2ZmICsgaV07XG4gIH0gZWxzZSB7XG4gICAgc3VwZXJQcm90by5fdXBkYXRlLmNhbGwodGhpcywgaW5wLCBpbk9mZiwgb3V0LCBvdXRPZmYpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmJsb2NrU2l6ZTsgaSsrKVxuICAgICAgb3V0W291dE9mZiArIGldIF49IGl2W2ldO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmJsb2NrU2l6ZTsgaSsrKVxuICAgICAgaXZbaV0gPSBpbnBbaW5PZmYgKyBpXTtcbiAgfVxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGFzc2VydCA9IHJlcXVpcmUoJ21pbmltYWxpc3RpYy1hc3NlcnQnKTtcblxuZnVuY3Rpb24gQ2lwaGVyKG9wdGlvbnMpIHtcbiAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcblxuICB0aGlzLnR5cGUgPSB0aGlzLm9wdGlvbnMudHlwZTtcbiAgdGhpcy5ibG9ja1NpemUgPSA4O1xuICB0aGlzLl9pbml0KCk7XG5cbiAgdGhpcy5idWZmZXIgPSBuZXcgQXJyYXkodGhpcy5ibG9ja1NpemUpO1xuICB0aGlzLmJ1ZmZlck9mZiA9IDA7XG59XG5tb2R1bGUuZXhwb3J0cyA9IENpcGhlcjtcblxuQ2lwaGVyLnByb3RvdHlwZS5faW5pdCA9IGZ1bmN0aW9uIF9pbml0KCkge1xuICAvLyBNaWdodCBiZSBvdmVycmlkZWRcbn07XG5cbkNpcGhlci5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gdXBkYXRlKGRhdGEpIHtcbiAgaWYgKGRhdGEubGVuZ3RoID09PSAwKVxuICAgIHJldHVybiBbXTtcblxuICBpZiAodGhpcy50eXBlID09PSAnZGVjcnlwdCcpXG4gICAgcmV0dXJuIHRoaXMuX3VwZGF0ZURlY3J5cHQoZGF0YSk7XG4gIGVsc2VcbiAgICByZXR1cm4gdGhpcy5fdXBkYXRlRW5jcnlwdChkYXRhKTtcbn07XG5cbkNpcGhlci5wcm90b3R5cGUuX2J1ZmZlciA9IGZ1bmN0aW9uIF9idWZmZXIoZGF0YSwgb2ZmKSB7XG4gIC8vIEFwcGVuZCBkYXRhIHRvIGJ1ZmZlclxuICB2YXIgbWluID0gTWF0aC5taW4odGhpcy5idWZmZXIubGVuZ3RoIC0gdGhpcy5idWZmZXJPZmYsIGRhdGEubGVuZ3RoIC0gb2ZmKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBtaW47IGkrKylcbiAgICB0aGlzLmJ1ZmZlclt0aGlzLmJ1ZmZlck9mZiArIGldID0gZGF0YVtvZmYgKyBpXTtcbiAgdGhpcy5idWZmZXJPZmYgKz0gbWluO1xuXG4gIC8vIFNoaWZ0IG5leHRcbiAgcmV0dXJuIG1pbjtcbn07XG5cbkNpcGhlci5wcm90b3R5cGUuX2ZsdXNoQnVmZmVyID0gZnVuY3Rpb24gX2ZsdXNoQnVmZmVyKG91dCwgb2ZmKSB7XG4gIHRoaXMuX3VwZGF0ZSh0aGlzLmJ1ZmZlciwgMCwgb3V0LCBvZmYpO1xuICB0aGlzLmJ1ZmZlck9mZiA9IDA7XG4gIHJldHVybiB0aGlzLmJsb2NrU2l6ZTtcbn07XG5cbkNpcGhlci5wcm90b3R5cGUuX3VwZGF0ZUVuY3J5cHQgPSBmdW5jdGlvbiBfdXBkYXRlRW5jcnlwdChkYXRhKSB7XG4gIHZhciBpbnB1dE9mZiA9IDA7XG4gIHZhciBvdXRwdXRPZmYgPSAwO1xuXG4gIHZhciBjb3VudCA9ICgodGhpcy5idWZmZXJPZmYgKyBkYXRhLmxlbmd0aCkgLyB0aGlzLmJsb2NrU2l6ZSkgfCAwO1xuICB2YXIgb3V0ID0gbmV3IEFycmF5KGNvdW50ICogdGhpcy5ibG9ja1NpemUpO1xuXG4gIGlmICh0aGlzLmJ1ZmZlck9mZiAhPT0gMCkge1xuICAgIGlucHV0T2ZmICs9IHRoaXMuX2J1ZmZlcihkYXRhLCBpbnB1dE9mZik7XG5cbiAgICBpZiAodGhpcy5idWZmZXJPZmYgPT09IHRoaXMuYnVmZmVyLmxlbmd0aClcbiAgICAgIG91dHB1dE9mZiArPSB0aGlzLl9mbHVzaEJ1ZmZlcihvdXQsIG91dHB1dE9mZik7XG4gIH1cblxuICAvLyBXcml0ZSBibG9ja3NcbiAgdmFyIG1heCA9IGRhdGEubGVuZ3RoIC0gKChkYXRhLmxlbmd0aCAtIGlucHV0T2ZmKSAlIHRoaXMuYmxvY2tTaXplKTtcbiAgZm9yICg7IGlucHV0T2ZmIDwgbWF4OyBpbnB1dE9mZiArPSB0aGlzLmJsb2NrU2l6ZSkge1xuICAgIHRoaXMuX3VwZGF0ZShkYXRhLCBpbnB1dE9mZiwgb3V0LCBvdXRwdXRPZmYpO1xuICAgIG91dHB1dE9mZiArPSB0aGlzLmJsb2NrU2l6ZTtcbiAgfVxuXG4gIC8vIFF1ZXVlIHJlc3RcbiAgZm9yICg7IGlucHV0T2ZmIDwgZGF0YS5sZW5ndGg7IGlucHV0T2ZmKyssIHRoaXMuYnVmZmVyT2ZmKyspXG4gICAgdGhpcy5idWZmZXJbdGhpcy5idWZmZXJPZmZdID0gZGF0YVtpbnB1dE9mZl07XG5cbiAgcmV0dXJuIG91dDtcbn07XG5cbkNpcGhlci5wcm90b3R5cGUuX3VwZGF0ZURlY3J5cHQgPSBmdW5jdGlvbiBfdXBkYXRlRGVjcnlwdChkYXRhKSB7XG4gIHZhciBpbnB1dE9mZiA9IDA7XG4gIHZhciBvdXRwdXRPZmYgPSAwO1xuXG4gIHZhciBjb3VudCA9IE1hdGguY2VpbCgodGhpcy5idWZmZXJPZmYgKyBkYXRhLmxlbmd0aCkgLyB0aGlzLmJsb2NrU2l6ZSkgLSAxO1xuICB2YXIgb3V0ID0gbmV3IEFycmF5KGNvdW50ICogdGhpcy5ibG9ja1NpemUpO1xuXG4gIC8vIFRPRE8oaW5kdXRueSk6IG9wdGltaXplIGl0LCB0aGlzIGlzIGZhciBmcm9tIG9wdGltYWxcbiAgZm9yICg7IGNvdW50ID4gMDsgY291bnQtLSkge1xuICAgIGlucHV0T2ZmICs9IHRoaXMuX2J1ZmZlcihkYXRhLCBpbnB1dE9mZik7XG4gICAgb3V0cHV0T2ZmICs9IHRoaXMuX2ZsdXNoQnVmZmVyKG91dCwgb3V0cHV0T2ZmKTtcbiAgfVxuXG4gIC8vIEJ1ZmZlciByZXN0IG9mIHRoZSBpbnB1dFxuICBpbnB1dE9mZiArPSB0aGlzLl9idWZmZXIoZGF0YSwgaW5wdXRPZmYpO1xuXG4gIHJldHVybiBvdXQ7XG59O1xuXG5DaXBoZXIucHJvdG90eXBlLmZpbmFsID0gZnVuY3Rpb24gZmluYWwoYnVmZmVyKSB7XG4gIHZhciBmaXJzdDtcbiAgaWYgKGJ1ZmZlcilcbiAgICBmaXJzdCA9IHRoaXMudXBkYXRlKGJ1ZmZlcik7XG5cbiAgdmFyIGxhc3Q7XG4gIGlmICh0aGlzLnR5cGUgPT09ICdlbmNyeXB0JylcbiAgICBsYXN0ID0gdGhpcy5fZmluYWxFbmNyeXB0KCk7XG4gIGVsc2VcbiAgICBsYXN0ID0gdGhpcy5fZmluYWxEZWNyeXB0KCk7XG5cbiAgaWYgKGZpcnN0KVxuICAgIHJldHVybiBmaXJzdC5jb25jYXQobGFzdCk7XG4gIGVsc2VcbiAgICByZXR1cm4gbGFzdDtcbn07XG5cbkNpcGhlci5wcm90b3R5cGUuX3BhZCA9IGZ1bmN0aW9uIF9wYWQoYnVmZmVyLCBvZmYpIHtcbiAgaWYgKG9mZiA9PT0gMClcbiAgICByZXR1cm4gZmFsc2U7XG5cbiAgd2hpbGUgKG9mZiA8IGJ1ZmZlci5sZW5ndGgpXG4gICAgYnVmZmVyW29mZisrXSA9IDA7XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG5DaXBoZXIucHJvdG90eXBlLl9maW5hbEVuY3J5cHQgPSBmdW5jdGlvbiBfZmluYWxFbmNyeXB0KCkge1xuICBpZiAoIXRoaXMuX3BhZCh0aGlzLmJ1ZmZlciwgdGhpcy5idWZmZXJPZmYpKVxuICAgIHJldHVybiBbXTtcblxuICB2YXIgb3V0ID0gbmV3IEFycmF5KHRoaXMuYmxvY2tTaXplKTtcbiAgdGhpcy5fdXBkYXRlKHRoaXMuYnVmZmVyLCAwLCBvdXQsIDApO1xuICByZXR1cm4gb3V0O1xufTtcblxuQ2lwaGVyLnByb3RvdHlwZS5fdW5wYWQgPSBmdW5jdGlvbiBfdW5wYWQoYnVmZmVyKSB7XG4gIHJldHVybiBidWZmZXI7XG59O1xuXG5DaXBoZXIucHJvdG90eXBlLl9maW5hbERlY3J5cHQgPSBmdW5jdGlvbiBfZmluYWxEZWNyeXB0KCkge1xuICBhc3NlcnQuZXF1YWwodGhpcy5idWZmZXJPZmYsIHRoaXMuYmxvY2tTaXplLCAnTm90IGVub3VnaCBkYXRhIHRvIGRlY3J5cHQnKTtcbiAgdmFyIG91dCA9IG5ldyBBcnJheSh0aGlzLmJsb2NrU2l6ZSk7XG4gIHRoaXMuX2ZsdXNoQnVmZmVyKG91dCwgMCk7XG5cbiAgcmV0dXJuIHRoaXMuX3VucGFkKG91dCk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgYXNzZXJ0ID0gcmVxdWlyZSgnbWluaW1hbGlzdGljLWFzc2VydCcpO1xudmFyIGluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcblxudmFyIGRlcyA9IHJlcXVpcmUoJy4uL2RlcycpO1xudmFyIHV0aWxzID0gZGVzLnV0aWxzO1xudmFyIENpcGhlciA9IGRlcy5DaXBoZXI7XG5cbmZ1bmN0aW9uIERFU1N0YXRlKCkge1xuICB0aGlzLnRtcCA9IG5ldyBBcnJheSgyKTtcbiAgdGhpcy5rZXlzID0gbnVsbDtcbn1cblxuZnVuY3Rpb24gREVTKG9wdGlvbnMpIHtcbiAgQ2lwaGVyLmNhbGwodGhpcywgb3B0aW9ucyk7XG5cbiAgdmFyIHN0YXRlID0gbmV3IERFU1N0YXRlKCk7XG4gIHRoaXMuX2Rlc1N0YXRlID0gc3RhdGU7XG5cbiAgdGhpcy5kZXJpdmVLZXlzKHN0YXRlLCBvcHRpb25zLmtleSk7XG59XG5pbmhlcml0cyhERVMsIENpcGhlcik7XG5tb2R1bGUuZXhwb3J0cyA9IERFUztcblxuREVTLmNyZWF0ZSA9IGZ1bmN0aW9uIGNyZWF0ZShvcHRpb25zKSB7XG4gIHJldHVybiBuZXcgREVTKG9wdGlvbnMpO1xufTtcblxudmFyIHNoaWZ0VGFibGUgPSBbXG4gIDEsIDEsIDIsIDIsIDIsIDIsIDIsIDIsXG4gIDEsIDIsIDIsIDIsIDIsIDIsIDIsIDFcbl07XG5cbkRFUy5wcm90b3R5cGUuZGVyaXZlS2V5cyA9IGZ1bmN0aW9uIGRlcml2ZUtleXMoc3RhdGUsIGtleSkge1xuICBzdGF0ZS5rZXlzID0gbmV3IEFycmF5KDE2ICogMik7XG5cbiAgYXNzZXJ0LmVxdWFsKGtleS5sZW5ndGgsIHRoaXMuYmxvY2tTaXplLCAnSW52YWxpZCBrZXkgbGVuZ3RoJyk7XG5cbiAgdmFyIGtMID0gdXRpbHMucmVhZFVJbnQzMkJFKGtleSwgMCk7XG4gIHZhciBrUiA9IHV0aWxzLnJlYWRVSW50MzJCRShrZXksIDQpO1xuXG4gIHV0aWxzLnBjMShrTCwga1IsIHN0YXRlLnRtcCwgMCk7XG4gIGtMID0gc3RhdGUudG1wWzBdO1xuICBrUiA9IHN0YXRlLnRtcFsxXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdGF0ZS5rZXlzLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgdmFyIHNoaWZ0ID0gc2hpZnRUYWJsZVtpID4+PiAxXTtcbiAgICBrTCA9IHV0aWxzLnIyOHNobChrTCwgc2hpZnQpO1xuICAgIGtSID0gdXRpbHMucjI4c2hsKGtSLCBzaGlmdCk7XG4gICAgdXRpbHMucGMyKGtMLCBrUiwgc3RhdGUua2V5cywgaSk7XG4gIH1cbn07XG5cbkRFUy5wcm90b3R5cGUuX3VwZGF0ZSA9IGZ1bmN0aW9uIF91cGRhdGUoaW5wLCBpbk9mZiwgb3V0LCBvdXRPZmYpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fZGVzU3RhdGU7XG5cbiAgdmFyIGwgPSB1dGlscy5yZWFkVUludDMyQkUoaW5wLCBpbk9mZik7XG4gIHZhciByID0gdXRpbHMucmVhZFVJbnQzMkJFKGlucCwgaW5PZmYgKyA0KTtcblxuICAvLyBJbml0aWFsIFBlcm11dGF0aW9uXG4gIHV0aWxzLmlwKGwsIHIsIHN0YXRlLnRtcCwgMCk7XG4gIGwgPSBzdGF0ZS50bXBbMF07XG4gIHIgPSBzdGF0ZS50bXBbMV07XG5cbiAgaWYgKHRoaXMudHlwZSA9PT0gJ2VuY3J5cHQnKVxuICAgIHRoaXMuX2VuY3J5cHQoc3RhdGUsIGwsIHIsIHN0YXRlLnRtcCwgMCk7XG4gIGVsc2VcbiAgICB0aGlzLl9kZWNyeXB0KHN0YXRlLCBsLCByLCBzdGF0ZS50bXAsIDApO1xuXG4gIGwgPSBzdGF0ZS50bXBbMF07XG4gIHIgPSBzdGF0ZS50bXBbMV07XG5cbiAgdXRpbHMud3JpdGVVSW50MzJCRShvdXQsIGwsIG91dE9mZik7XG4gIHV0aWxzLndyaXRlVUludDMyQkUob3V0LCByLCBvdXRPZmYgKyA0KTtcbn07XG5cbkRFUy5wcm90b3R5cGUuX3BhZCA9IGZ1bmN0aW9uIF9wYWQoYnVmZmVyLCBvZmYpIHtcbiAgdmFyIHZhbHVlID0gYnVmZmVyLmxlbmd0aCAtIG9mZjtcbiAgZm9yICh2YXIgaSA9IG9mZjsgaSA8IGJ1ZmZlci5sZW5ndGg7IGkrKylcbiAgICBidWZmZXJbaV0gPSB2YWx1ZTtcblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbkRFUy5wcm90b3R5cGUuX3VucGFkID0gZnVuY3Rpb24gX3VucGFkKGJ1ZmZlcikge1xuICB2YXIgcGFkID0gYnVmZmVyW2J1ZmZlci5sZW5ndGggLSAxXTtcbiAgZm9yICh2YXIgaSA9IGJ1ZmZlci5sZW5ndGggLSBwYWQ7IGkgPCBidWZmZXIubGVuZ3RoOyBpKyspXG4gICAgYXNzZXJ0LmVxdWFsKGJ1ZmZlcltpXSwgcGFkKTtcblxuICByZXR1cm4gYnVmZmVyLnNsaWNlKDAsIGJ1ZmZlci5sZW5ndGggLSBwYWQpO1xufTtcblxuREVTLnByb3RvdHlwZS5fZW5jcnlwdCA9IGZ1bmN0aW9uIF9lbmNyeXB0KHN0YXRlLCBsU3RhcnQsIHJTdGFydCwgb3V0LCBvZmYpIHtcbiAgdmFyIGwgPSBsU3RhcnQ7XG4gIHZhciByID0gclN0YXJ0O1xuXG4gIC8vIEFwcGx5IGYoKSB4MTYgdGltZXNcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdGF0ZS5rZXlzLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgdmFyIGtleUwgPSBzdGF0ZS5rZXlzW2ldO1xuICAgIHZhciBrZXlSID0gc3RhdGUua2V5c1tpICsgMV07XG5cbiAgICAvLyBmKHIsIGspXG4gICAgdXRpbHMuZXhwYW5kKHIsIHN0YXRlLnRtcCwgMCk7XG5cbiAgICBrZXlMIF49IHN0YXRlLnRtcFswXTtcbiAgICBrZXlSIF49IHN0YXRlLnRtcFsxXTtcbiAgICB2YXIgcyA9IHV0aWxzLnN1YnN0aXR1dGUoa2V5TCwga2V5Uik7XG4gICAgdmFyIGYgPSB1dGlscy5wZXJtdXRlKHMpO1xuXG4gICAgdmFyIHQgPSByO1xuICAgIHIgPSAobCBeIGYpID4+PiAwO1xuICAgIGwgPSB0O1xuICB9XG5cbiAgLy8gUmV2ZXJzZSBJbml0aWFsIFBlcm11dGF0aW9uXG4gIHV0aWxzLnJpcChyLCBsLCBvdXQsIG9mZik7XG59O1xuXG5ERVMucHJvdG90eXBlLl9kZWNyeXB0ID0gZnVuY3Rpb24gX2RlY3J5cHQoc3RhdGUsIGxTdGFydCwgclN0YXJ0LCBvdXQsIG9mZikge1xuICB2YXIgbCA9IHJTdGFydDtcbiAgdmFyIHIgPSBsU3RhcnQ7XG5cbiAgLy8gQXBwbHkgZigpIHgxNiB0aW1lc1xuICBmb3IgKHZhciBpID0gc3RhdGUua2V5cy5sZW5ndGggLSAyOyBpID49IDA7IGkgLT0gMikge1xuICAgIHZhciBrZXlMID0gc3RhdGUua2V5c1tpXTtcbiAgICB2YXIga2V5UiA9IHN0YXRlLmtleXNbaSArIDFdO1xuXG4gICAgLy8gZihyLCBrKVxuICAgIHV0aWxzLmV4cGFuZChsLCBzdGF0ZS50bXAsIDApO1xuXG4gICAga2V5TCBePSBzdGF0ZS50bXBbMF07XG4gICAga2V5UiBePSBzdGF0ZS50bXBbMV07XG4gICAgdmFyIHMgPSB1dGlscy5zdWJzdGl0dXRlKGtleUwsIGtleVIpO1xuICAgIHZhciBmID0gdXRpbHMucGVybXV0ZShzKTtcblxuICAgIHZhciB0ID0gbDtcbiAgICBsID0gKHIgXiBmKSA+Pj4gMDtcbiAgICByID0gdDtcbiAgfVxuXG4gIC8vIFJldmVyc2UgSW5pdGlhbCBQZXJtdXRhdGlvblxuICB1dGlscy5yaXAobCwgciwgb3V0LCBvZmYpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGFzc2VydCA9IHJlcXVpcmUoJ21pbmltYWxpc3RpYy1hc3NlcnQnKTtcbnZhciBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG5cbnZhciBkZXMgPSByZXF1aXJlKCcuLi9kZXMnKTtcbnZhciBDaXBoZXIgPSBkZXMuQ2lwaGVyO1xudmFyIERFUyA9IGRlcy5ERVM7XG5cbmZ1bmN0aW9uIEVERVN0YXRlKHR5cGUsIGtleSkge1xuICBhc3NlcnQuZXF1YWwoa2V5Lmxlbmd0aCwgMjQsICdJbnZhbGlkIGtleSBsZW5ndGgnKTtcblxuICB2YXIgazEgPSBrZXkuc2xpY2UoMCwgOCk7XG4gIHZhciBrMiA9IGtleS5zbGljZSg4LCAxNik7XG4gIHZhciBrMyA9IGtleS5zbGljZSgxNiwgMjQpO1xuXG4gIGlmICh0eXBlID09PSAnZW5jcnlwdCcpIHtcbiAgICB0aGlzLmNpcGhlcnMgPSBbXG4gICAgICBERVMuY3JlYXRlKHsgdHlwZTogJ2VuY3J5cHQnLCBrZXk6IGsxIH0pLFxuICAgICAgREVTLmNyZWF0ZSh7IHR5cGU6ICdkZWNyeXB0Jywga2V5OiBrMiB9KSxcbiAgICAgIERFUy5jcmVhdGUoeyB0eXBlOiAnZW5jcnlwdCcsIGtleTogazMgfSlcbiAgICBdO1xuICB9IGVsc2Uge1xuICAgIHRoaXMuY2lwaGVycyA9IFtcbiAgICAgIERFUy5jcmVhdGUoeyB0eXBlOiAnZGVjcnlwdCcsIGtleTogazMgfSksXG4gICAgICBERVMuY3JlYXRlKHsgdHlwZTogJ2VuY3J5cHQnLCBrZXk6IGsyIH0pLFxuICAgICAgREVTLmNyZWF0ZSh7IHR5cGU6ICdkZWNyeXB0Jywga2V5OiBrMSB9KVxuICAgIF07XG4gIH1cbn1cblxuZnVuY3Rpb24gRURFKG9wdGlvbnMpIHtcbiAgQ2lwaGVyLmNhbGwodGhpcywgb3B0aW9ucyk7XG5cbiAgdmFyIHN0YXRlID0gbmV3IEVERVN0YXRlKHRoaXMudHlwZSwgdGhpcy5vcHRpb25zLmtleSk7XG4gIHRoaXMuX2VkZVN0YXRlID0gc3RhdGU7XG59XG5pbmhlcml0cyhFREUsIENpcGhlcik7XG5cbm1vZHVsZS5leHBvcnRzID0gRURFO1xuXG5FREUuY3JlYXRlID0gZnVuY3Rpb24gY3JlYXRlKG9wdGlvbnMpIHtcbiAgcmV0dXJuIG5ldyBFREUob3B0aW9ucyk7XG59O1xuXG5FREUucHJvdG90eXBlLl91cGRhdGUgPSBmdW5jdGlvbiBfdXBkYXRlKGlucCwgaW5PZmYsIG91dCwgb3V0T2ZmKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX2VkZVN0YXRlO1xuXG4gIHN0YXRlLmNpcGhlcnNbMF0uX3VwZGF0ZShpbnAsIGluT2ZmLCBvdXQsIG91dE9mZik7XG4gIHN0YXRlLmNpcGhlcnNbMV0uX3VwZGF0ZShvdXQsIG91dE9mZiwgb3V0LCBvdXRPZmYpO1xuICBzdGF0ZS5jaXBoZXJzWzJdLl91cGRhdGUob3V0LCBvdXRPZmYsIG91dCwgb3V0T2ZmKTtcbn07XG5cbkVERS5wcm90b3R5cGUuX3BhZCA9IERFUy5wcm90b3R5cGUuX3BhZDtcbkVERS5wcm90b3R5cGUuX3VucGFkID0gREVTLnByb3RvdHlwZS5fdW5wYWQ7XG4iLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMucmVhZFVJbnQzMkJFID0gZnVuY3Rpb24gcmVhZFVJbnQzMkJFKGJ5dGVzLCBvZmYpIHtcbiAgdmFyIHJlcyA9ICAoYnl0ZXNbMCArIG9mZl0gPDwgMjQpIHxcbiAgICAgICAgICAgICAoYnl0ZXNbMSArIG9mZl0gPDwgMTYpIHxcbiAgICAgICAgICAgICAoYnl0ZXNbMiArIG9mZl0gPDwgOCkgfFxuICAgICAgICAgICAgIGJ5dGVzWzMgKyBvZmZdO1xuICByZXR1cm4gcmVzID4+PiAwO1xufTtcblxuZXhwb3J0cy53cml0ZVVJbnQzMkJFID0gZnVuY3Rpb24gd3JpdGVVSW50MzJCRShieXRlcywgdmFsdWUsIG9mZikge1xuICBieXRlc1swICsgb2ZmXSA9IHZhbHVlID4+PiAyNDtcbiAgYnl0ZXNbMSArIG9mZl0gPSAodmFsdWUgPj4+IDE2KSAmIDB4ZmY7XG4gIGJ5dGVzWzIgKyBvZmZdID0gKHZhbHVlID4+PiA4KSAmIDB4ZmY7XG4gIGJ5dGVzWzMgKyBvZmZdID0gdmFsdWUgJiAweGZmO1xufTtcblxuZXhwb3J0cy5pcCA9IGZ1bmN0aW9uIGlwKGluTCwgaW5SLCBvdXQsIG9mZikge1xuICB2YXIgb3V0TCA9IDA7XG4gIHZhciBvdXRSID0gMDtcblxuICBmb3IgKHZhciBpID0gNjsgaSA+PSAwOyBpIC09IDIpIHtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8PSAyNDsgaiArPSA4KSB7XG4gICAgICBvdXRMIDw8PSAxO1xuICAgICAgb3V0TCB8PSAoaW5SID4+PiAoaiArIGkpKSAmIDE7XG4gICAgfVxuICAgIGZvciAodmFyIGogPSAwOyBqIDw9IDI0OyBqICs9IDgpIHtcbiAgICAgIG91dEwgPDw9IDE7XG4gICAgICBvdXRMIHw9IChpbkwgPj4+IChqICsgaSkpICYgMTtcbiAgICB9XG4gIH1cblxuICBmb3IgKHZhciBpID0gNjsgaSA+PSAwOyBpIC09IDIpIHtcbiAgICBmb3IgKHZhciBqID0gMTsgaiA8PSAyNTsgaiArPSA4KSB7XG4gICAgICBvdXRSIDw8PSAxO1xuICAgICAgb3V0UiB8PSAoaW5SID4+PiAoaiArIGkpKSAmIDE7XG4gICAgfVxuICAgIGZvciAodmFyIGogPSAxOyBqIDw9IDI1OyBqICs9IDgpIHtcbiAgICAgIG91dFIgPDw9IDE7XG4gICAgICBvdXRSIHw9IChpbkwgPj4+IChqICsgaSkpICYgMTtcbiAgICB9XG4gIH1cblxuICBvdXRbb2ZmICsgMF0gPSBvdXRMID4+PiAwO1xuICBvdXRbb2ZmICsgMV0gPSBvdXRSID4+PiAwO1xufTtcblxuZXhwb3J0cy5yaXAgPSBmdW5jdGlvbiByaXAoaW5MLCBpblIsIG91dCwgb2ZmKSB7XG4gIHZhciBvdXRMID0gMDtcbiAgdmFyIG91dFIgPSAwO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgNDsgaSsrKSB7XG4gICAgZm9yICh2YXIgaiA9IDI0OyBqID49IDA7IGogLT0gOCkge1xuICAgICAgb3V0TCA8PD0gMTtcbiAgICAgIG91dEwgfD0gKGluUiA+Pj4gKGogKyBpKSkgJiAxO1xuICAgICAgb3V0TCA8PD0gMTtcbiAgICAgIG91dEwgfD0gKGluTCA+Pj4gKGogKyBpKSkgJiAxO1xuICAgIH1cbiAgfVxuICBmb3IgKHZhciBpID0gNDsgaSA8IDg7IGkrKykge1xuICAgIGZvciAodmFyIGogPSAyNDsgaiA+PSAwOyBqIC09IDgpIHtcbiAgICAgIG91dFIgPDw9IDE7XG4gICAgICBvdXRSIHw9IChpblIgPj4+IChqICsgaSkpICYgMTtcbiAgICAgIG91dFIgPDw9IDE7XG4gICAgICBvdXRSIHw9IChpbkwgPj4+IChqICsgaSkpICYgMTtcbiAgICB9XG4gIH1cblxuICBvdXRbb2ZmICsgMF0gPSBvdXRMID4+PiAwO1xuICBvdXRbb2ZmICsgMV0gPSBvdXRSID4+PiAwO1xufTtcblxuZXhwb3J0cy5wYzEgPSBmdW5jdGlvbiBwYzEoaW5MLCBpblIsIG91dCwgb2ZmKSB7XG4gIHZhciBvdXRMID0gMDtcbiAgdmFyIG91dFIgPSAwO1xuXG4gIC8vIDcsIDE1LCAyMywgMzEsIDM5LCA0NywgNTUsIDYzXG4gIC8vIDYsIDE0LCAyMiwgMzAsIDM5LCA0NywgNTUsIDYzXG4gIC8vIDUsIDEzLCAyMSwgMjksIDM5LCA0NywgNTUsIDYzXG4gIC8vIDQsIDEyLCAyMCwgMjhcbiAgZm9yICh2YXIgaSA9IDc7IGkgPj0gNTsgaS0tKSB7XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPD0gMjQ7IGogKz0gOCkge1xuICAgICAgb3V0TCA8PD0gMTtcbiAgICAgIG91dEwgfD0gKGluUiA+PiAoaiArIGkpKSAmIDE7XG4gICAgfVxuICAgIGZvciAodmFyIGogPSAwOyBqIDw9IDI0OyBqICs9IDgpIHtcbiAgICAgIG91dEwgPDw9IDE7XG4gICAgICBvdXRMIHw9IChpbkwgPj4gKGogKyBpKSkgJiAxO1xuICAgIH1cbiAgfVxuICBmb3IgKHZhciBqID0gMDsgaiA8PSAyNDsgaiArPSA4KSB7XG4gICAgb3V0TCA8PD0gMTtcbiAgICBvdXRMIHw9IChpblIgPj4gKGogKyBpKSkgJiAxO1xuICB9XG5cbiAgLy8gMSwgOSwgMTcsIDI1LCAzMywgNDEsIDQ5LCA1N1xuICAvLyAyLCAxMCwgMTgsIDI2LCAzNCwgNDIsIDUwLCA1OFxuICAvLyAzLCAxMSwgMTksIDI3LCAzNSwgNDMsIDUxLCA1OVxuICAvLyAzNiwgNDQsIDUyLCA2MFxuICBmb3IgKHZhciBpID0gMTsgaSA8PSAzOyBpKyspIHtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8PSAyNDsgaiArPSA4KSB7XG4gICAgICBvdXRSIDw8PSAxO1xuICAgICAgb3V0UiB8PSAoaW5SID4+IChqICsgaSkpICYgMTtcbiAgICB9XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPD0gMjQ7IGogKz0gOCkge1xuICAgICAgb3V0UiA8PD0gMTtcbiAgICAgIG91dFIgfD0gKGluTCA+PiAoaiArIGkpKSAmIDE7XG4gICAgfVxuICB9XG4gIGZvciAodmFyIGogPSAwOyBqIDw9IDI0OyBqICs9IDgpIHtcbiAgICBvdXRSIDw8PSAxO1xuICAgIG91dFIgfD0gKGluTCA+PiAoaiArIGkpKSAmIDE7XG4gIH1cblxuICBvdXRbb2ZmICsgMF0gPSBvdXRMID4+PiAwO1xuICBvdXRbb2ZmICsgMV0gPSBvdXRSID4+PiAwO1xufTtcblxuZXhwb3J0cy5yMjhzaGwgPSBmdW5jdGlvbiByMjhzaGwobnVtLCBzaGlmdCkge1xuICByZXR1cm4gKChudW0gPDwgc2hpZnQpICYgMHhmZmZmZmZmKSB8IChudW0gPj4+ICgyOCAtIHNoaWZ0KSk7XG59O1xuXG52YXIgcGMydGFibGUgPSBbXG4gIC8vIGluTCA9PiBvdXRMXG4gIDE0LCAxMSwgMTcsIDQsIDI3LCAyMywgMjUsIDAsXG4gIDEzLCAyMiwgNywgMTgsIDUsIDksIDE2LCAyNCxcbiAgMiwgMjAsIDEyLCAyMSwgMSwgOCwgMTUsIDI2LFxuXG4gIC8vIGluUiA9PiBvdXRSXG4gIDE1LCA0LCAyNSwgMTksIDksIDEsIDI2LCAxNixcbiAgNSwgMTEsIDIzLCA4LCAxMiwgNywgMTcsIDAsXG4gIDIyLCAzLCAxMCwgMTQsIDYsIDIwLCAyNywgMjRcbl07XG5cbmV4cG9ydHMucGMyID0gZnVuY3Rpb24gcGMyKGluTCwgaW5SLCBvdXQsIG9mZikge1xuICB2YXIgb3V0TCA9IDA7XG4gIHZhciBvdXRSID0gMDtcblxuICB2YXIgbGVuID0gcGMydGFibGUubGVuZ3RoID4+PiAxO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgb3V0TCA8PD0gMTtcbiAgICBvdXRMIHw9IChpbkwgPj4+IHBjMnRhYmxlW2ldKSAmIDB4MTtcbiAgfVxuICBmb3IgKHZhciBpID0gbGVuOyBpIDwgcGMydGFibGUubGVuZ3RoOyBpKyspIHtcbiAgICBvdXRSIDw8PSAxO1xuICAgIG91dFIgfD0gKGluUiA+Pj4gcGMydGFibGVbaV0pICYgMHgxO1xuICB9XG5cbiAgb3V0W29mZiArIDBdID0gb3V0TCA+Pj4gMDtcbiAgb3V0W29mZiArIDFdID0gb3V0UiA+Pj4gMDtcbn07XG5cbmV4cG9ydHMuZXhwYW5kID0gZnVuY3Rpb24gZXhwYW5kKHIsIG91dCwgb2ZmKSB7XG4gIHZhciBvdXRMID0gMDtcbiAgdmFyIG91dFIgPSAwO1xuXG4gIG91dEwgPSAoKHIgJiAxKSA8PCA1KSB8IChyID4+PiAyNyk7XG4gIGZvciAodmFyIGkgPSAyMzsgaSA+PSAxNTsgaSAtPSA0KSB7XG4gICAgb3V0TCA8PD0gNjtcbiAgICBvdXRMIHw9IChyID4+PiBpKSAmIDB4M2Y7XG4gIH1cbiAgZm9yICh2YXIgaSA9IDExOyBpID49IDM7IGkgLT0gNCkge1xuICAgIG91dFIgfD0gKHIgPj4+IGkpICYgMHgzZjtcbiAgICBvdXRSIDw8PSA2O1xuICB9XG4gIG91dFIgfD0gKChyICYgMHgxZikgPDwgMSkgfCAociA+Pj4gMzEpO1xuXG4gIG91dFtvZmYgKyAwXSA9IG91dEwgPj4+IDA7XG4gIG91dFtvZmYgKyAxXSA9IG91dFIgPj4+IDA7XG59O1xuXG52YXIgc1RhYmxlID0gW1xuICAxNCwgMCwgNCwgMTUsIDEzLCA3LCAxLCA0LCAyLCAxNCwgMTUsIDIsIDExLCAxMywgOCwgMSxcbiAgMywgMTAsIDEwLCA2LCA2LCAxMiwgMTIsIDExLCA1LCA5LCA5LCA1LCAwLCAzLCA3LCA4LFxuICA0LCAxNSwgMSwgMTIsIDE0LCA4LCA4LCAyLCAxMywgNCwgNiwgOSwgMiwgMSwgMTEsIDcsXG4gIDE1LCA1LCAxMiwgMTEsIDksIDMsIDcsIDE0LCAzLCAxMCwgMTAsIDAsIDUsIDYsIDAsIDEzLFxuXG4gIDE1LCAzLCAxLCAxMywgOCwgNCwgMTQsIDcsIDYsIDE1LCAxMSwgMiwgMywgOCwgNCwgMTQsXG4gIDksIDEyLCA3LCAwLCAyLCAxLCAxMywgMTAsIDEyLCA2LCAwLCA5LCA1LCAxMSwgMTAsIDUsXG4gIDAsIDEzLCAxNCwgOCwgNywgMTAsIDExLCAxLCAxMCwgMywgNCwgMTUsIDEzLCA0LCAxLCAyLFxuICA1LCAxMSwgOCwgNiwgMTIsIDcsIDYsIDEyLCA5LCAwLCAzLCA1LCAyLCAxNCwgMTUsIDksXG5cbiAgMTAsIDEzLCAwLCA3LCA5LCAwLCAxNCwgOSwgNiwgMywgMywgNCwgMTUsIDYsIDUsIDEwLFxuICAxLCAyLCAxMywgOCwgMTIsIDUsIDcsIDE0LCAxMSwgMTIsIDQsIDExLCAyLCAxNSwgOCwgMSxcbiAgMTMsIDEsIDYsIDEwLCA0LCAxMywgOSwgMCwgOCwgNiwgMTUsIDksIDMsIDgsIDAsIDcsXG4gIDExLCA0LCAxLCAxNSwgMiwgMTQsIDEyLCAzLCA1LCAxMSwgMTAsIDUsIDE0LCAyLCA3LCAxMixcblxuICA3LCAxMywgMTMsIDgsIDE0LCAxMSwgMywgNSwgMCwgNiwgNiwgMTUsIDksIDAsIDEwLCAzLFxuICAxLCA0LCAyLCA3LCA4LCAyLCA1LCAxMiwgMTEsIDEsIDEyLCAxMCwgNCwgMTQsIDE1LCA5LFxuICAxMCwgMywgNiwgMTUsIDksIDAsIDAsIDYsIDEyLCAxMCwgMTEsIDEsIDcsIDEzLCAxMywgOCxcbiAgMTUsIDksIDEsIDQsIDMsIDUsIDE0LCAxMSwgNSwgMTIsIDIsIDcsIDgsIDIsIDQsIDE0LFxuXG4gIDIsIDE0LCAxMiwgMTEsIDQsIDIsIDEsIDEyLCA3LCA0LCAxMCwgNywgMTEsIDEzLCA2LCAxLFxuICA4LCA1LCA1LCAwLCAzLCAxNSwgMTUsIDEwLCAxMywgMywgMCwgOSwgMTQsIDgsIDksIDYsXG4gIDQsIDExLCAyLCA4LCAxLCAxMiwgMTEsIDcsIDEwLCAxLCAxMywgMTQsIDcsIDIsIDgsIDEzLFxuICAxNSwgNiwgOSwgMTUsIDEyLCAwLCA1LCA5LCA2LCAxMCwgMywgNCwgMCwgNSwgMTQsIDMsXG5cbiAgMTIsIDEwLCAxLCAxNSwgMTAsIDQsIDE1LCAyLCA5LCA3LCAyLCAxMiwgNiwgOSwgOCwgNSxcbiAgMCwgNiwgMTMsIDEsIDMsIDEzLCA0LCAxNCwgMTQsIDAsIDcsIDExLCA1LCAzLCAxMSwgOCxcbiAgOSwgNCwgMTQsIDMsIDE1LCAyLCA1LCAxMiwgMiwgOSwgOCwgNSwgMTIsIDE1LCAzLCAxMCxcbiAgNywgMTEsIDAsIDE0LCA0LCAxLCAxMCwgNywgMSwgNiwgMTMsIDAsIDExLCA4LCA2LCAxMyxcblxuICA0LCAxMywgMTEsIDAsIDIsIDExLCAxNCwgNywgMTUsIDQsIDAsIDksIDgsIDEsIDEzLCAxMCxcbiAgMywgMTQsIDEyLCAzLCA5LCA1LCA3LCAxMiwgNSwgMiwgMTAsIDE1LCA2LCA4LCAxLCA2LFxuICAxLCA2LCA0LCAxMSwgMTEsIDEzLCAxMywgOCwgMTIsIDEsIDMsIDQsIDcsIDEwLCAxNCwgNyxcbiAgMTAsIDksIDE1LCA1LCA2LCAwLCA4LCAxNSwgMCwgMTQsIDUsIDIsIDksIDMsIDIsIDEyLFxuXG4gIDEzLCAxLCAyLCAxNSwgOCwgMTMsIDQsIDgsIDYsIDEwLCAxNSwgMywgMTEsIDcsIDEsIDQsXG4gIDEwLCAxMiwgOSwgNSwgMywgNiwgMTQsIDExLCA1LCAwLCAwLCAxNCwgMTIsIDksIDcsIDIsXG4gIDcsIDIsIDExLCAxLCA0LCAxNCwgMSwgNywgOSwgNCwgMTIsIDEwLCAxNCwgOCwgMiwgMTMsXG4gIDAsIDE1LCA2LCAxMiwgMTAsIDksIDEzLCAwLCAxNSwgMywgMywgNSwgNSwgNiwgOCwgMTFcbl07XG5cbmV4cG9ydHMuc3Vic3RpdHV0ZSA9IGZ1bmN0aW9uIHN1YnN0aXR1dGUoaW5MLCBpblIpIHtcbiAgdmFyIG91dCA9IDA7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgNDsgaSsrKSB7XG4gICAgdmFyIGIgPSAoaW5MID4+PiAoMTggLSBpICogNikpICYgMHgzZjtcbiAgICB2YXIgc2IgPSBzVGFibGVbaSAqIDB4NDAgKyBiXTtcblxuICAgIG91dCA8PD0gNDtcbiAgICBvdXQgfD0gc2I7XG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCA0OyBpKyspIHtcbiAgICB2YXIgYiA9IChpblIgPj4+ICgxOCAtIGkgKiA2KSkgJiAweDNmO1xuICAgIHZhciBzYiA9IHNUYWJsZVs0ICogMHg0MCArIGkgKiAweDQwICsgYl07XG5cbiAgICBvdXQgPDw9IDQ7XG4gICAgb3V0IHw9IHNiO1xuICB9XG4gIHJldHVybiBvdXQgPj4+IDA7XG59O1xuXG52YXIgcGVybXV0ZVRhYmxlID0gW1xuICAxNiwgMjUsIDEyLCAxMSwgMywgMjAsIDQsIDE1LCAzMSwgMTcsIDksIDYsIDI3LCAxNCwgMSwgMjIsXG4gIDMwLCAyNCwgOCwgMTgsIDAsIDUsIDI5LCAyMywgMTMsIDE5LCAyLCAyNiwgMTAsIDIxLCAyOCwgN1xuXTtcblxuZXhwb3J0cy5wZXJtdXRlID0gZnVuY3Rpb24gcGVybXV0ZShudW0pIHtcbiAgdmFyIG91dCA9IDA7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcGVybXV0ZVRhYmxlLmxlbmd0aDsgaSsrKSB7XG4gICAgb3V0IDw8PSAxO1xuICAgIG91dCB8PSAobnVtID4+PiBwZXJtdXRlVGFibGVbaV0pICYgMHgxO1xuICB9XG4gIHJldHVybiBvdXQgPj4+IDA7XG59O1xuXG5leHBvcnRzLnBhZFNwbGl0ID0gZnVuY3Rpb24gcGFkU3BsaXQobnVtLCBzaXplLCBncm91cCkge1xuICB2YXIgc3RyID0gbnVtLnRvU3RyaW5nKDIpO1xuICB3aGlsZSAoc3RyLmxlbmd0aCA8IHNpemUpXG4gICAgc3RyID0gJzAnICsgc3RyO1xuXG4gIHZhciBvdXQgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaXplOyBpICs9IGdyb3VwKVxuICAgIG91dC5wdXNoKHN0ci5zbGljZShpLCBpICsgZ3JvdXApKTtcbiAgcmV0dXJuIG91dC5qb2luKCcgJyk7XG59O1xuIiwidmFyIGdlbmVyYXRlUHJpbWUgPSByZXF1aXJlKCcuL2xpYi9nZW5lcmF0ZVByaW1lJylcbnZhciBwcmltZXMgPSByZXF1aXJlKCcuL2xpYi9wcmltZXMuanNvbicpXG5cbnZhciBESCA9IHJlcXVpcmUoJy4vbGliL2RoJylcblxuZnVuY3Rpb24gZ2V0RGlmZmllSGVsbG1hbiAobW9kKSB7XG4gIHZhciBwcmltZSA9IG5ldyBCdWZmZXIocHJpbWVzW21vZF0ucHJpbWUsICdoZXgnKVxuICB2YXIgZ2VuID0gbmV3IEJ1ZmZlcihwcmltZXNbbW9kXS5nZW4sICdoZXgnKVxuXG4gIHJldHVybiBuZXcgREgocHJpbWUsIGdlbilcbn1cblxudmFyIEVOQ09ESU5HUyA9IHtcbiAgJ2JpbmFyeSc6IHRydWUsICdoZXgnOiB0cnVlLCAnYmFzZTY0JzogdHJ1ZVxufVxuXG5mdW5jdGlvbiBjcmVhdGVEaWZmaWVIZWxsbWFuIChwcmltZSwgZW5jLCBnZW5lcmF0b3IsIGdlbmMpIHtcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihlbmMpIHx8IEVOQ09ESU5HU1tlbmNdID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gY3JlYXRlRGlmZmllSGVsbG1hbihwcmltZSwgJ2JpbmFyeScsIGVuYywgZ2VuZXJhdG9yKVxuICB9XG5cbiAgZW5jID0gZW5jIHx8ICdiaW5hcnknXG4gIGdlbmMgPSBnZW5jIHx8ICdiaW5hcnknXG4gIGdlbmVyYXRvciA9IGdlbmVyYXRvciB8fCBuZXcgQnVmZmVyKFsyXSlcblxuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihnZW5lcmF0b3IpKSB7XG4gICAgZ2VuZXJhdG9yID0gbmV3IEJ1ZmZlcihnZW5lcmF0b3IsIGdlbmMpXG4gIH1cblxuICBpZiAodHlwZW9mIHByaW1lID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiBuZXcgREgoZ2VuZXJhdGVQcmltZShwcmltZSwgZ2VuZXJhdG9yKSwgZ2VuZXJhdG9yLCB0cnVlKVxuICB9XG5cbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIocHJpbWUpKSB7XG4gICAgcHJpbWUgPSBuZXcgQnVmZmVyKHByaW1lLCBlbmMpXG4gIH1cblxuICByZXR1cm4gbmV3IERIKHByaW1lLCBnZW5lcmF0b3IsIHRydWUpXG59XG5cbmV4cG9ydHMuRGlmZmllSGVsbG1hbkdyb3VwID0gZXhwb3J0cy5jcmVhdGVEaWZmaWVIZWxsbWFuR3JvdXAgPSBleHBvcnRzLmdldERpZmZpZUhlbGxtYW4gPSBnZXREaWZmaWVIZWxsbWFuXG5leHBvcnRzLmNyZWF0ZURpZmZpZUhlbGxtYW4gPSBleHBvcnRzLkRpZmZpZUhlbGxtYW4gPSBjcmVhdGVEaWZmaWVIZWxsbWFuXG4iLCJ2YXIgQk4gPSByZXF1aXJlKCdibi5qcycpO1xudmFyIE1pbGxlclJhYmluID0gcmVxdWlyZSgnbWlsbGVyLXJhYmluJyk7XG52YXIgbWlsbGVyUmFiaW4gPSBuZXcgTWlsbGVyUmFiaW4oKTtcbnZhciBUV0VOVFlGT1VSID0gbmV3IEJOKDI0KTtcbnZhciBFTEVWRU4gPSBuZXcgQk4oMTEpO1xudmFyIFRFTiA9IG5ldyBCTigxMCk7XG52YXIgVEhSRUUgPSBuZXcgQk4oMyk7XG52YXIgU0VWRU4gPSBuZXcgQk4oNyk7XG52YXIgcHJpbWVzID0gcmVxdWlyZSgnLi9nZW5lcmF0ZVByaW1lJyk7XG52YXIgcmFuZG9tQnl0ZXMgPSByZXF1aXJlKCdyYW5kb21ieXRlcycpO1xubW9kdWxlLmV4cG9ydHMgPSBESDtcblxuZnVuY3Rpb24gc2V0UHVibGljS2V5KHB1YiwgZW5jKSB7XG4gIGVuYyA9IGVuYyB8fCAndXRmOCc7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKHB1YikpIHtcbiAgICBwdWIgPSBuZXcgQnVmZmVyKHB1YiwgZW5jKTtcbiAgfVxuICB0aGlzLl9wdWIgPSBuZXcgQk4ocHViKTtcbiAgcmV0dXJuIHRoaXM7XG59XG5cbmZ1bmN0aW9uIHNldFByaXZhdGVLZXkocHJpdiwgZW5jKSB7XG4gIGVuYyA9IGVuYyB8fCAndXRmOCc7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKHByaXYpKSB7XG4gICAgcHJpdiA9IG5ldyBCdWZmZXIocHJpdiwgZW5jKTtcbiAgfVxuICB0aGlzLl9wcml2ID0gbmV3IEJOKHByaXYpO1xuICByZXR1cm4gdGhpcztcbn1cblxudmFyIHByaW1lQ2FjaGUgPSB7fTtcbmZ1bmN0aW9uIGNoZWNrUHJpbWUocHJpbWUsIGdlbmVyYXRvcikge1xuICB2YXIgZ2VuID0gZ2VuZXJhdG9yLnRvU3RyaW5nKCdoZXgnKTtcbiAgdmFyIGhleCA9IFtnZW4sIHByaW1lLnRvU3RyaW5nKDE2KV0uam9pbignXycpO1xuICBpZiAoaGV4IGluIHByaW1lQ2FjaGUpIHtcbiAgICByZXR1cm4gcHJpbWVDYWNoZVtoZXhdO1xuICB9XG4gIHZhciBlcnJvciA9IDA7XG5cbiAgaWYgKHByaW1lLmlzRXZlbigpIHx8XG4gICAgIXByaW1lcy5zaW1wbGVTaWV2ZSB8fFxuICAgICFwcmltZXMuZmVybWF0VGVzdChwcmltZSkgfHxcbiAgICAhbWlsbGVyUmFiaW4udGVzdChwcmltZSkpIHtcbiAgICAvL25vdCBhIHByaW1lIHNvICsxXG4gICAgZXJyb3IgKz0gMTtcblxuICAgIGlmIChnZW4gPT09ICcwMicgfHwgZ2VuID09PSAnMDUnKSB7XG4gICAgICAvLyB3ZSdkIGJlIGFibGUgdG8gY2hlY2sgdGhlIGdlbmVyYXRvclxuICAgICAgLy8gaXQgd291bGQgZmFpbCBzbyArOFxuICAgICAgZXJyb3IgKz0gODtcbiAgICB9IGVsc2Uge1xuICAgICAgLy93ZSB3b3VsZG4ndCBiZSBhYmxlIHRvIHRlc3QgdGhlIGdlbmVyYXRvclxuICAgICAgLy8gc28gKzRcbiAgICAgIGVycm9yICs9IDQ7XG4gICAgfVxuICAgIHByaW1lQ2FjaGVbaGV4XSA9IGVycm9yO1xuICAgIHJldHVybiBlcnJvcjtcbiAgfVxuICBpZiAoIW1pbGxlclJhYmluLnRlc3QocHJpbWUuc2hybigxKSkpIHtcbiAgICAvL25vdCBhIHNhZmUgcHJpbWVcbiAgICBlcnJvciArPSAyO1xuICB9XG4gIHZhciByZW07XG4gIHN3aXRjaCAoZ2VuKSB7XG4gICAgY2FzZSAnMDInOlxuICAgICAgaWYgKHByaW1lLm1vZChUV0VOVFlGT1VSKS5jbXAoRUxFVkVOKSkge1xuICAgICAgICAvLyB1bnN1aWRhYmxlIGdlbmVyYXRvclxuICAgICAgICBlcnJvciArPSA4O1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnMDUnOlxuICAgICAgcmVtID0gcHJpbWUubW9kKFRFTik7XG4gICAgICBpZiAocmVtLmNtcChUSFJFRSkgJiYgcmVtLmNtcChTRVZFTikpIHtcbiAgICAgICAgLy8gcHJpbWUgbW9kIDEwIG5lZWRzIHRvIGVxdWFsIDMgb3IgN1xuICAgICAgICBlcnJvciArPSA4O1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIGVycm9yICs9IDQ7XG4gIH1cbiAgcHJpbWVDYWNoZVtoZXhdID0gZXJyb3I7XG4gIHJldHVybiBlcnJvcjtcbn1cblxuZnVuY3Rpb24gREgocHJpbWUsIGdlbmVyYXRvciwgbWFsbGVhYmxlKSB7XG4gIHRoaXMuc2V0R2VuZXJhdG9yKGdlbmVyYXRvcik7XG4gIHRoaXMuX19wcmltZSA9IG5ldyBCTihwcmltZSk7XG4gIHRoaXMuX3ByaW1lID0gQk4ubW9udCh0aGlzLl9fcHJpbWUpO1xuICB0aGlzLl9wcmltZUxlbiA9IHByaW1lLmxlbmd0aDtcbiAgdGhpcy5fcHViID0gdW5kZWZpbmVkO1xuICB0aGlzLl9wcml2ID0gdW5kZWZpbmVkO1xuICB0aGlzLl9wcmltZUNvZGUgPSB1bmRlZmluZWQ7XG4gIGlmIChtYWxsZWFibGUpIHtcbiAgICB0aGlzLnNldFB1YmxpY0tleSA9IHNldFB1YmxpY0tleTtcbiAgICB0aGlzLnNldFByaXZhdGVLZXkgPSBzZXRQcml2YXRlS2V5O1xuICB9IGVsc2Uge1xuICAgIHRoaXMuX3ByaW1lQ29kZSA9IDg7XG4gIH1cbn1cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShESC5wcm90b3R5cGUsICd2ZXJpZnlFcnJvcicsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHR5cGVvZiB0aGlzLl9wcmltZUNvZGUgIT09ICdudW1iZXInKSB7XG4gICAgICB0aGlzLl9wcmltZUNvZGUgPSBjaGVja1ByaW1lKHRoaXMuX19wcmltZSwgdGhpcy5fX2dlbik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9wcmltZUNvZGU7XG4gIH1cbn0pO1xuREgucHJvdG90eXBlLmdlbmVyYXRlS2V5cyA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKCF0aGlzLl9wcml2KSB7XG4gICAgdGhpcy5fcHJpdiA9IG5ldyBCTihyYW5kb21CeXRlcyh0aGlzLl9wcmltZUxlbikpO1xuICB9XG4gIHRoaXMuX3B1YiA9IHRoaXMuX2dlbi50b1JlZCh0aGlzLl9wcmltZSkucmVkUG93KHRoaXMuX3ByaXYpLmZyb21SZWQoKTtcbiAgcmV0dXJuIHRoaXMuZ2V0UHVibGljS2V5KCk7XG59O1xuXG5ESC5wcm90b3R5cGUuY29tcHV0ZVNlY3JldCA9IGZ1bmN0aW9uIChvdGhlcikge1xuICBvdGhlciA9IG5ldyBCTihvdGhlcik7XG4gIG90aGVyID0gb3RoZXIudG9SZWQodGhpcy5fcHJpbWUpO1xuICB2YXIgc2VjcmV0ID0gb3RoZXIucmVkUG93KHRoaXMuX3ByaXYpLmZyb21SZWQoKTtcbiAgdmFyIG91dCA9IG5ldyBCdWZmZXIoc2VjcmV0LnRvQXJyYXkoKSk7XG4gIHZhciBwcmltZSA9IHRoaXMuZ2V0UHJpbWUoKTtcbiAgaWYgKG91dC5sZW5ndGggPCBwcmltZS5sZW5ndGgpIHtcbiAgICB2YXIgZnJvbnQgPSBuZXcgQnVmZmVyKHByaW1lLmxlbmd0aCAtIG91dC5sZW5ndGgpO1xuICAgIGZyb250LmZpbGwoMCk7XG4gICAgb3V0ID0gQnVmZmVyLmNvbmNhdChbZnJvbnQsIG91dF0pO1xuICB9XG4gIHJldHVybiBvdXQ7XG59O1xuXG5ESC5wcm90b3R5cGUuZ2V0UHVibGljS2V5ID0gZnVuY3Rpb24gZ2V0UHVibGljS2V5KGVuYykge1xuICByZXR1cm4gZm9ybWF0UmV0dXJuVmFsdWUodGhpcy5fcHViLCBlbmMpO1xufTtcblxuREgucHJvdG90eXBlLmdldFByaXZhdGVLZXkgPSBmdW5jdGlvbiBnZXRQcml2YXRlS2V5KGVuYykge1xuICByZXR1cm4gZm9ybWF0UmV0dXJuVmFsdWUodGhpcy5fcHJpdiwgZW5jKTtcbn07XG5cbkRILnByb3RvdHlwZS5nZXRQcmltZSA9IGZ1bmN0aW9uIChlbmMpIHtcbiAgcmV0dXJuIGZvcm1hdFJldHVyblZhbHVlKHRoaXMuX19wcmltZSwgZW5jKTtcbn07XG5cbkRILnByb3RvdHlwZS5nZXRHZW5lcmF0b3IgPSBmdW5jdGlvbiAoZW5jKSB7XG4gIHJldHVybiBmb3JtYXRSZXR1cm5WYWx1ZSh0aGlzLl9nZW4sIGVuYyk7XG59O1xuXG5ESC5wcm90b3R5cGUuc2V0R2VuZXJhdG9yID0gZnVuY3Rpb24gKGdlbiwgZW5jKSB7XG4gIGVuYyA9IGVuYyB8fCAndXRmOCc7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKGdlbikpIHtcbiAgICBnZW4gPSBuZXcgQnVmZmVyKGdlbiwgZW5jKTtcbiAgfVxuICB0aGlzLl9fZ2VuID0gZ2VuO1xuICB0aGlzLl9nZW4gPSBuZXcgQk4oZ2VuKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5mdW5jdGlvbiBmb3JtYXRSZXR1cm5WYWx1ZShibiwgZW5jKSB7XG4gIHZhciBidWYgPSBuZXcgQnVmZmVyKGJuLnRvQXJyYXkoKSk7XG4gIGlmICghZW5jKSB7XG4gICAgcmV0dXJuIGJ1ZjtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gYnVmLnRvU3RyaW5nKGVuYyk7XG4gIH1cbn1cbiIsInZhciByYW5kb21CeXRlcyA9IHJlcXVpcmUoJ3JhbmRvbWJ5dGVzJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZpbmRQcmltZTtcbmZpbmRQcmltZS5zaW1wbGVTaWV2ZSA9IHNpbXBsZVNpZXZlO1xuZmluZFByaW1lLmZlcm1hdFRlc3QgPSBmZXJtYXRUZXN0O1xudmFyIEJOID0gcmVxdWlyZSgnYm4uanMnKTtcbnZhciBUV0VOVFlGT1VSID0gbmV3IEJOKDI0KTtcbnZhciBNaWxsZXJSYWJpbiA9IHJlcXVpcmUoJ21pbGxlci1yYWJpbicpO1xudmFyIG1pbGxlclJhYmluID0gbmV3IE1pbGxlclJhYmluKCk7XG52YXIgT05FID0gbmV3IEJOKDEpO1xudmFyIFRXTyA9IG5ldyBCTigyKTtcbnZhciBGSVZFID0gbmV3IEJOKDUpO1xudmFyIFNJWFRFRU4gPSBuZXcgQk4oMTYpO1xudmFyIEVJR0hUID0gbmV3IEJOKDgpO1xudmFyIFRFTiA9IG5ldyBCTigxMCk7XG52YXIgVEhSRUUgPSBuZXcgQk4oMyk7XG52YXIgU0VWRU4gPSBuZXcgQk4oNyk7XG52YXIgRUxFVkVOID0gbmV3IEJOKDExKTtcbnZhciBGT1VSID0gbmV3IEJOKDQpO1xudmFyIFRXRUxWRSA9IG5ldyBCTigxMik7XG52YXIgcHJpbWVzID0gbnVsbDtcblxuZnVuY3Rpb24gX2dldFByaW1lcygpIHtcbiAgaWYgKHByaW1lcyAhPT0gbnVsbClcbiAgICByZXR1cm4gcHJpbWVzO1xuXG4gIHZhciBsaW1pdCA9IDB4MTAwMDAwO1xuICB2YXIgcmVzID0gW107XG4gIHJlc1swXSA9IDI7XG4gIGZvciAodmFyIGkgPSAxLCBrID0gMzsgayA8IGxpbWl0OyBrICs9IDIpIHtcbiAgICB2YXIgc3FydCA9IE1hdGguY2VpbChNYXRoLnNxcnQoaykpO1xuICAgIGZvciAodmFyIGogPSAwOyBqIDwgaSAmJiByZXNbal0gPD0gc3FydDsgaisrKVxuICAgICAgaWYgKGsgJSByZXNbal0gPT09IDApXG4gICAgICAgIGJyZWFrO1xuXG4gICAgaWYgKGkgIT09IGogJiYgcmVzW2pdIDw9IHNxcnQpXG4gICAgICBjb250aW51ZTtcblxuICAgIHJlc1tpKytdID0gaztcbiAgfVxuICBwcmltZXMgPSByZXM7XG4gIHJldHVybiByZXM7XG59XG5cbmZ1bmN0aW9uIHNpbXBsZVNpZXZlKHApIHtcbiAgdmFyIHByaW1lcyA9IF9nZXRQcmltZXMoKTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHByaW1lcy5sZW5ndGg7IGkrKylcbiAgICBpZiAocC5tb2RuKHByaW1lc1tpXSkgPT09IDApIHtcbiAgICAgIGlmIChwLmNtcG4ocHJpbWVzW2ldKSA9PT0gMCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGZlcm1hdFRlc3QocCkge1xuICB2YXIgcmVkID0gQk4ubW9udChwKTtcbiAgcmV0dXJuIFRXTy50b1JlZChyZWQpLnJlZFBvdyhwLnN1Ym4oMSkpLmZyb21SZWQoKS5jbXBuKDEpID09PSAwO1xufVxuXG5mdW5jdGlvbiBmaW5kUHJpbWUoYml0cywgZ2VuKSB7XG4gIGlmIChiaXRzIDwgMTYpIHtcbiAgICAvLyB0aGlzIGlzIHdoYXQgb3BlbnNzbCBkb2VzXG4gICAgaWYgKGdlbiA9PT0gMiB8fCBnZW4gPT09IDUpIHtcbiAgICAgIHJldHVybiBuZXcgQk4oWzB4OGMsIDB4N2JdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5ldyBCTihbMHg4YywgMHgyN10pO1xuICAgIH1cbiAgfVxuICBnZW4gPSBuZXcgQk4oZ2VuKTtcblxuICB2YXIgbnVtLCBuMjtcblxuICB3aGlsZSAodHJ1ZSkge1xuICAgIG51bSA9IG5ldyBCTihyYW5kb21CeXRlcyhNYXRoLmNlaWwoYml0cyAvIDgpKSk7XG4gICAgd2hpbGUgKG51bS5iaXRMZW5ndGgoKSA+IGJpdHMpIHtcbiAgICAgIG51bS5pc2hybigxKTtcbiAgICB9XG4gICAgaWYgKG51bS5pc0V2ZW4oKSkge1xuICAgICAgbnVtLmlhZGQoT05FKTtcbiAgICB9XG4gICAgaWYgKCFudW0udGVzdG4oMSkpIHtcbiAgICAgIG51bS5pYWRkKFRXTyk7XG4gICAgfVxuICAgIGlmICghZ2VuLmNtcChUV08pKSB7XG4gICAgICB3aGlsZSAobnVtLm1vZChUV0VOVFlGT1VSKS5jbXAoRUxFVkVOKSkge1xuICAgICAgICBudW0uaWFkZChGT1VSKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCFnZW4uY21wKEZJVkUpKSB7XG4gICAgICB3aGlsZSAobnVtLm1vZChURU4pLmNtcChUSFJFRSkpIHtcbiAgICAgICAgbnVtLmlhZGQoRk9VUik7XG4gICAgICB9XG4gICAgfVxuICAgIG4yID0gbnVtLnNocm4oMSk7XG4gICAgaWYgKHNpbXBsZVNpZXZlKG4yKSAmJiBzaW1wbGVTaWV2ZShudW0pICYmXG4gICAgICBmZXJtYXRUZXN0KG4yKSAmJiBmZXJtYXRUZXN0KG51bSkgJiZcbiAgICAgIG1pbGxlclJhYmluLnRlc3QobjIpICYmIG1pbGxlclJhYmluLnRlc3QobnVtKSkge1xuICAgICAgcmV0dXJuIG51bTtcbiAgICB9XG4gIH1cblxufVxuIiwibW9kdWxlLmV4cG9ydHM9e1xuICAgIFwibW9kcDFcIjoge1xuICAgICAgICBcImdlblwiOiBcIjAyXCIsXG4gICAgICAgIFwicHJpbWVcIjogXCJmZmZmZmZmZmZmZmZmZmZmYzkwZmRhYTIyMTY4YzIzNGM0YzY2MjhiODBkYzFjZDEyOTAyNGUwODhhNjdjYzc0MDIwYmJlYTYzYjEzOWIyMjUxNGEwODc5OGUzNDA0ZGRlZjk1MTliM2NkM2E0MzFiMzAyYjBhNmRmMjVmMTQzNzRmZTEzNTZkNmQ1MWMyNDVlNDg1YjU3NjYyNWU3ZWM2ZjQ0YzQyZTlhNjNhMzYyMGZmZmZmZmZmZmZmZmZmZmZcIlxuICAgIH0sXG4gICAgXCJtb2RwMlwiOiB7XG4gICAgICAgIFwiZ2VuXCI6IFwiMDJcIixcbiAgICAgICAgXCJwcmltZVwiOiBcImZmZmZmZmZmZmZmZmZmZmZjOTBmZGFhMjIxNjhjMjM0YzRjNjYyOGI4MGRjMWNkMTI5MDI0ZTA4OGE2N2NjNzQwMjBiYmVhNjNiMTM5YjIyNTE0YTA4Nzk4ZTM0MDRkZGVmOTUxOWIzY2QzYTQzMWIzMDJiMGE2ZGYyNWYxNDM3NGZlMTM1NmQ2ZDUxYzI0NWU0ODViNTc2NjI1ZTdlYzZmNDRjNDJlOWE2MzdlZDZiMGJmZjVjYjZmNDA2YjdlZGVlMzg2YmZiNWE4OTlmYTVhZTlmMjQxMTdjNGIxZmU2NDkyODY2NTFlY2U2NTM4MWZmZmZmZmZmZmZmZmZmZmZcIlxuICAgIH0sXG4gICAgXCJtb2RwNVwiOiB7XG4gICAgICAgIFwiZ2VuXCI6IFwiMDJcIixcbiAgICAgICAgXCJwcmltZVwiOiBcImZmZmZmZmZmZmZmZmZmZmZjOTBmZGFhMjIxNjhjMjM0YzRjNjYyOGI4MGRjMWNkMTI5MDI0ZTA4OGE2N2NjNzQwMjBiYmVhNjNiMTM5YjIyNTE0YTA4Nzk4ZTM0MDRkZGVmOTUxOWIzY2QzYTQzMWIzMDJiMGE2ZGYyNWYxNDM3NGZlMTM1NmQ2ZDUxYzI0NWU0ODViNTc2NjI1ZTdlYzZmNDRjNDJlOWE2MzdlZDZiMGJmZjVjYjZmNDA2YjdlZGVlMzg2YmZiNWE4OTlmYTVhZTlmMjQxMTdjNGIxZmU2NDkyODY2NTFlY2U0NWIzZGMyMDA3Y2I4YTE2M2JmMDU5OGRhNDgzNjFjNTVkMzlhNjkxNjNmYThmZDI0Y2Y1ZjgzNjU1ZDIzZGNhM2FkOTYxYzYyZjM1NjIwODU1MmJiOWVkNTI5MDc3MDk2OTY2ZDY3MGMzNTRlNGFiYzk4MDRmMTc0NmMwOGNhMjM3MzI3ZmZmZmZmZmZmZmZmZmZmZlwiXG4gICAgfSxcbiAgICBcIm1vZHAxNFwiOiB7XG4gICAgICAgIFwiZ2VuXCI6IFwiMDJcIixcbiAgICAgICAgXCJwcmltZVwiOiBcImZmZmZmZmZmZmZmZmZmZmZjOTBmZGFhMjIxNjhjMjM0YzRjNjYyOGI4MGRjMWNkMTI5MDI0ZTA4OGE2N2NjNzQwMjBiYmVhNjNiMTM5YjIyNTE0YTA4Nzk4ZTM0MDRkZGVmOTUxOWIzY2QzYTQzMWIzMDJiMGE2ZGYyNWYxNDM3NGZlMTM1NmQ2ZDUxYzI0NWU0ODViNTc2NjI1ZTdlYzZmNDRjNDJlOWE2MzdlZDZiMGJmZjVjYjZmNDA2YjdlZGVlMzg2YmZiNWE4OTlmYTVhZTlmMjQxMTdjNGIxZmU2NDkyODY2NTFlY2U0NWIzZGMyMDA3Y2I4YTE2M2JmMDU5OGRhNDgzNjFjNTVkMzlhNjkxNjNmYThmZDI0Y2Y1ZjgzNjU1ZDIzZGNhM2FkOTYxYzYyZjM1NjIwODU1MmJiOWVkNTI5MDc3MDk2OTY2ZDY3MGMzNTRlNGFiYzk4MDRmMTc0NmMwOGNhMTgyMTdjMzI5MDVlNDYyZTM2Y2UzYmUzOWU3NzJjMTgwZTg2MDM5YjI3ODNhMmVjMDdhMjhmYjVjNTVkZjA2ZjRjNTJjOWRlMmJjYmY2OTU1ODE3MTgzOTk1NDk3Y2VhOTU2YWU1MTVkMjI2MTg5OGZhMDUxMDE1NzI4ZTVhOGFhY2FhNjhmZmZmZmZmZmZmZmZmZmZmXCJcbiAgICB9LFxuICAgIFwibW9kcDE1XCI6IHtcbiAgICAgICAgXCJnZW5cIjogXCIwMlwiLFxuICAgICAgICBcInByaW1lXCI6IFwiZmZmZmZmZmZmZmZmZmZmZmM5MGZkYWEyMjE2OGMyMzRjNGM2NjI4YjgwZGMxY2QxMjkwMjRlMDg4YTY3Y2M3NDAyMGJiZWE2M2IxMzliMjI1MTRhMDg3OThlMzQwNGRkZWY5NTE5YjNjZDNhNDMxYjMwMmIwYTZkZjI1ZjE0Mzc0ZmUxMzU2ZDZkNTFjMjQ1ZTQ4NWI1NzY2MjVlN2VjNmY0NGM0MmU5YTYzN2VkNmIwYmZmNWNiNmY0MDZiN2VkZWUzODZiZmI1YTg5OWZhNWFlOWYyNDExN2M0YjFmZTY0OTI4NjY1MWVjZTQ1YjNkYzIwMDdjYjhhMTYzYmYwNTk4ZGE0ODM2MWM1NWQzOWE2OTE2M2ZhOGZkMjRjZjVmODM2NTVkMjNkY2EzYWQ5NjFjNjJmMzU2MjA4NTUyYmI5ZWQ1MjkwNzcwOTY5NjZkNjcwYzM1NGU0YWJjOTgwNGYxNzQ2YzA4Y2ExODIxN2MzMjkwNWU0NjJlMzZjZTNiZTM5ZTc3MmMxODBlODYwMzliMjc4M2EyZWMwN2EyOGZiNWM1NWRmMDZmNGM1MmM5ZGUyYmNiZjY5NTU4MTcxODM5OTU0OTdjZWE5NTZhZTUxNWQyMjYxODk4ZmEwNTEwMTU3MjhlNWE4YWFhYzQyZGFkMzMxNzBkMDQ1MDdhMzNhODU1MjFhYmRmMWNiYTY0ZWNmYjg1MDQ1OGRiZWYwYThhZWE3MTU3NWQwNjBjN2RiMzk3MGY4NWE2ZTFlNGM3YWJmNWFlOGNkYjA5MzNkNzFlOGM5NGUwNGEyNTYxOWRjZWUzZDIyNjFhZDJlZTZiZjEyZmZhMDZkOThhMDg2NGQ4NzYwMjczM2VjODZhNjQ1MjFmMmIxODE3N2IyMDBjYmJlMTE3NTc3YTYxNWQ2Yzc3MDk4OGMwYmFkOTQ2ZTIwOGUyNGZhMDc0ZTVhYjMxNDNkYjViZmNlMGZkMTA4ZTRiODJkMTIwYTkzYWQyY2FmZmZmZmZmZmZmZmZmZmZmXCJcbiAgICB9LFxuICAgIFwibW9kcDE2XCI6IHtcbiAgICAgICAgXCJnZW5cIjogXCIwMlwiLFxuICAgICAgICBcInByaW1lXCI6IFwiZmZmZmZmZmZmZmZmZmZmZmM5MGZkYWEyMjE2OGMyMzRjNGM2NjI4YjgwZGMxY2QxMjkwMjRlMDg4YTY3Y2M3NDAyMGJiZWE2M2IxMzliMjI1MTRhMDg3OThlMzQwNGRkZWY5NTE5YjNjZDNhNDMxYjMwMmIwYTZkZjI1ZjE0Mzc0ZmUxMzU2ZDZkNTFjMjQ1ZTQ4NWI1NzY2MjVlN2VjNmY0NGM0MmU5YTYzN2VkNmIwYmZmNWNiNmY0MDZiN2VkZWUzODZiZmI1YTg5OWZhNWFlOWYyNDExN2M0YjFmZTY0OTI4NjY1MWVjZTQ1YjNkYzIwMDdjYjhhMTYzYmYwNTk4ZGE0ODM2MWM1NWQzOWE2OTE2M2ZhOGZkMjRjZjVmODM2NTVkMjNkY2EzYWQ5NjFjNjJmMzU2MjA4NTUyYmI5ZWQ1MjkwNzcwOTY5NjZkNjcwYzM1NGU0YWJjOTgwNGYxNzQ2YzA4Y2ExODIxN2MzMjkwNWU0NjJlMzZjZTNiZTM5ZTc3MmMxODBlODYwMzliMjc4M2EyZWMwN2EyOGZiNWM1NWRmMDZmNGM1MmM5ZGUyYmNiZjY5NTU4MTcxODM5OTU0OTdjZWE5NTZhZTUxNWQyMjYxODk4ZmEwNTEwMTU3MjhlNWE4YWFhYzQyZGFkMzMxNzBkMDQ1MDdhMzNhODU1MjFhYmRmMWNiYTY0ZWNmYjg1MDQ1OGRiZWYwYThhZWE3MTU3NWQwNjBjN2RiMzk3MGY4NWE2ZTFlNGM3YWJmNWFlOGNkYjA5MzNkNzFlOGM5NGUwNGEyNTYxOWRjZWUzZDIyNjFhZDJlZTZiZjEyZmZhMDZkOThhMDg2NGQ4NzYwMjczM2VjODZhNjQ1MjFmMmIxODE3N2IyMDBjYmJlMTE3NTc3YTYxNWQ2Yzc3MDk4OGMwYmFkOTQ2ZTIwOGUyNGZhMDc0ZTVhYjMxNDNkYjViZmNlMGZkMTA4ZTRiODJkMTIwYTkyMTA4MDExYTcyM2MxMmE3ODdlNmQ3ODg3MTlhMTBiZGJhNWIyNjk5YzMyNzE4NmFmNGUyM2MxYTk0NjgzNGI2MTUwYmRhMjU4M2U5Y2EyYWQ0NGNlOGRiYmJjMmRiMDRkZThlZjkyZThlZmMxNDFmYmVjYWE2Mjg3YzU5NDc0ZTZiYzA1ZDk5YjI5NjRmYTA5MGMzYTIyMzNiYTE4NjUxNWJlN2VkMWY2MTI5NzBjZWUyZDdhZmI4MWJkZDc2MjE3MDQ4MWNkMDA2OTEyN2Q1YjA1YWE5OTNiNGVhOTg4ZDhmZGRjMTg2ZmZiN2RjOTBhNmMwOGY0ZGY0MzVjOTM0MDYzMTk5ZmZmZmZmZmZmZmZmZmZmZlwiXG4gICAgfSxcbiAgICBcIm1vZHAxN1wiOiB7XG4gICAgICAgIFwiZ2VuXCI6IFwiMDJcIixcbiAgICAgICAgXCJwcmltZVwiOiBcImZmZmZmZmZmZmZmZmZmZmZjOTBmZGFhMjIxNjhjMjM0YzRjNjYyOGI4MGRjMWNkMTI5MDI0ZTA4OGE2N2NjNzQwMjBiYmVhNjNiMTM5YjIyNTE0YTA4Nzk4ZTM0MDRkZGVmOTUxOWIzY2QzYTQzMWIzMDJiMGE2ZGYyNWYxNDM3NGZlMTM1NmQ2ZDUxYzI0NWU0ODViNTc2NjI1ZTdlYzZmNDRjNDJlOWE2MzdlZDZiMGJmZjVjYjZmNDA2YjdlZGVlMzg2YmZiNWE4OTlmYTVhZTlmMjQxMTdjNGIxZmU2NDkyODY2NTFlY2U0NWIzZGMyMDA3Y2I4YTE2M2JmMDU5OGRhNDgzNjFjNTVkMzlhNjkxNjNmYThmZDI0Y2Y1ZjgzNjU1ZDIzZGNhM2FkOTYxYzYyZjM1NjIwODU1MmJiOWVkNTI5MDc3MDk2OTY2ZDY3MGMzNTRlNGFiYzk4MDRmMTc0NmMwOGNhMTgyMTdjMzI5MDVlNDYyZTM2Y2UzYmUzOWU3NzJjMTgwZTg2MDM5YjI3ODNhMmVjMDdhMjhmYjVjNTVkZjA2ZjRjNTJjOWRlMmJjYmY2OTU1ODE3MTgzOTk1NDk3Y2VhOTU2YWU1MTVkMjI2MTg5OGZhMDUxMDE1NzI4ZTVhOGFhYWM0MmRhZDMzMTcwZDA0NTA3YTMzYTg1NTIxYWJkZjFjYmE2NGVjZmI4NTA0NThkYmVmMGE4YWVhNzE1NzVkMDYwYzdkYjM5NzBmODVhNmUxZTRjN2FiZjVhZThjZGIwOTMzZDcxZThjOTRlMDRhMjU2MTlkY2VlM2QyMjYxYWQyZWU2YmYxMmZmYTA2ZDk4YTA4NjRkODc2MDI3MzNlYzg2YTY0NTIxZjJiMTgxNzdiMjAwY2JiZTExNzU3N2E2MTVkNmM3NzA5ODhjMGJhZDk0NmUyMDhlMjRmYTA3NGU1YWIzMTQzZGI1YmZjZTBmZDEwOGU0YjgyZDEyMGE5MjEwODAxMWE3MjNjMTJhNzg3ZTZkNzg4NzE5YTEwYmRiYTViMjY5OWMzMjcxODZhZjRlMjNjMWE5NDY4MzRiNjE1MGJkYTI1ODNlOWNhMmFkNDRjZThkYmJiYzJkYjA0ZGU4ZWY5MmU4ZWZjMTQxZmJlY2FhNjI4N2M1OTQ3NGU2YmMwNWQ5OWIyOTY0ZmEwOTBjM2EyMjMzYmExODY1MTViZTdlZDFmNjEyOTcwY2VlMmQ3YWZiODFiZGQ3NjIxNzA0ODFjZDAwNjkxMjdkNWIwNWFhOTkzYjRlYTk4OGQ4ZmRkYzE4NmZmYjdkYzkwYTZjMDhmNGRmNDM1YzkzNDAyODQ5MjM2YzNmYWI0ZDI3YzcwMjZjMWQ0ZGNiMjYwMjY0NmRlYzk3NTFlNzYzZGJhMzdiZGY4ZmY5NDA2YWQ5ZTUzMGVlNWRiMzgyZjQxMzAwMWFlYjA2YTUzZWQ5MDI3ZDgzMTE3OTcyN2IwODY1YTg5MThkYTNlZGJlYmNmOWIxNGVkNDRjZTZjYmFjZWQ0YmIxYmRiN2YxNDQ3ZTZjYzI1NGIzMzIwNTE1MTJiZDdhZjQyNmZiOGY0MDEzNzhjZDJiZjU5ODNjYTAxYzY0YjkyZWNmMDMyZWExNWQxNzIxZDAzZjQ4MmQ3Y2U2ZTc0ZmVmNmQ1NWU3MDJmNDY5ODBjODJiNWE4NDAzMTkwMGIxYzllNTllN2M5N2ZiZWM3ZThmMzIzYTk3YTdlMzZjYzg4YmUwZjFkNDViN2ZmNTg1YWM1NGJkNDA3YjIyYjQxNTRhYWNjOGY2ZDdlYmY0OGUxZDgxNGNjNWVkMjBmODAzN2UwYTc5NzE1ZWVmMjliZTMyODA2YTFkNThiYjdjNWRhNzZmNTUwYWEzZDhhMWZiZmYwZWIxOWNjYjFhMzEzZDU1Y2RhNTZjOWVjMmVmMjk2MzIzODdmZThkNzZlM2MwNDY4MDQzZThmNjYzZjQ4NjBlZTEyYmYyZDViMGI3NDc0ZDZlNjk0ZjkxZTZkY2M0MDI0ZmZmZmZmZmZmZmZmZmZmZlwiXG4gICAgfSxcbiAgICBcIm1vZHAxOFwiOiB7XG4gICAgICAgIFwiZ2VuXCI6IFwiMDJcIixcbiAgICAgICAgXCJwcmltZVwiOiBcImZmZmZmZmZmZmZmZmZmZmZjOTBmZGFhMjIxNjhjMjM0YzRjNjYyOGI4MGRjMWNkMTI5MDI0ZTA4OGE2N2NjNzQwMjBiYmVhNjNiMTM5YjIyNTE0YTA4Nzk4ZTM0MDRkZGVmOTUxOWIzY2QzYTQzMWIzMDJiMGE2ZGYyNWYxNDM3NGZlMTM1NmQ2ZDUxYzI0NWU0ODViNTc2NjI1ZTdlYzZmNDRjNDJlOWE2MzdlZDZiMGJmZjVjYjZmNDA2YjdlZGVlMzg2YmZiNWE4OTlmYTVhZTlmMjQxMTdjNGIxZmU2NDkyODY2NTFlY2U0NWIzZGMyMDA3Y2I4YTE2M2JmMDU5OGRhNDgzNjFjNTVkMzlhNjkxNjNmYThmZDI0Y2Y1ZjgzNjU1ZDIzZGNhM2FkOTYxYzYyZjM1NjIwODU1MmJiOWVkNTI5MDc3MDk2OTY2ZDY3MGMzNTRlNGFiYzk4MDRmMTc0NmMwOGNhMTgyMTdjMzI5MDVlNDYyZTM2Y2UzYmUzOWU3NzJjMTgwZTg2MDM5YjI3ODNhMmVjMDdhMjhmYjVjNTVkZjA2ZjRjNTJjOWRlMmJjYmY2OTU1ODE3MTgzOTk1NDk3Y2VhOTU2YWU1MTVkMjI2MTg5OGZhMDUxMDE1NzI4ZTVhOGFhYWM0MmRhZDMzMTcwZDA0NTA3YTMzYTg1NTIxYWJkZjFjYmE2NGVjZmI4NTA0NThkYmVmMGE4YWVhNzE1NzVkMDYwYzdkYjM5NzBmODVhNmUxZTRjN2FiZjVhZThjZGIwOTMzZDcxZThjOTRlMDRhMjU2MTlkY2VlM2QyMjYxYWQyZWU2YmYxMmZmYTA2ZDk4YTA4NjRkODc2MDI3MzNlYzg2YTY0NTIxZjJiMTgxNzdiMjAwY2JiZTExNzU3N2E2MTVkNmM3NzA5ODhjMGJhZDk0NmUyMDhlMjRmYTA3NGU1YWIzMTQzZGI1YmZjZTBmZDEwOGU0YjgyZDEyMGE5MjEwODAxMWE3MjNjMTJhNzg3ZTZkNzg4NzE5YTEwYmRiYTViMjY5OWMzMjcxODZhZjRlMjNjMWE5NDY4MzRiNjE1MGJkYTI1ODNlOWNhMmFkNDRjZThkYmJiYzJkYjA0ZGU4ZWY5MmU4ZWZjMTQxZmJlY2FhNjI4N2M1OTQ3NGU2YmMwNWQ5OWIyOTY0ZmEwOTBjM2EyMjMzYmExODY1MTViZTdlZDFmNjEyOTcwY2VlMmQ3YWZiODFiZGQ3NjIxNzA0ODFjZDAwNjkxMjdkNWIwNWFhOTkzYjRlYTk4OGQ4ZmRkYzE4NmZmYjdkYzkwYTZjMDhmNGRmNDM1YzkzNDAyODQ5MjM2YzNmYWI0ZDI3YzcwMjZjMWQ0ZGNiMjYwMjY0NmRlYzk3NTFlNzYzZGJhMzdiZGY4ZmY5NDA2YWQ5ZTUzMGVlNWRiMzgyZjQxMzAwMWFlYjA2YTUzZWQ5MDI3ZDgzMTE3OTcyN2IwODY1YTg5MThkYTNlZGJlYmNmOWIxNGVkNDRjZTZjYmFjZWQ0YmIxYmRiN2YxNDQ3ZTZjYzI1NGIzMzIwNTE1MTJiZDdhZjQyNmZiOGY0MDEzNzhjZDJiZjU5ODNjYTAxYzY0YjkyZWNmMDMyZWExNWQxNzIxZDAzZjQ4MmQ3Y2U2ZTc0ZmVmNmQ1NWU3MDJmNDY5ODBjODJiNWE4NDAzMTkwMGIxYzllNTllN2M5N2ZiZWM3ZThmMzIzYTk3YTdlMzZjYzg4YmUwZjFkNDViN2ZmNTg1YWM1NGJkNDA3YjIyYjQxNTRhYWNjOGY2ZDdlYmY0OGUxZDgxNGNjNWVkMjBmODAzN2UwYTc5NzE1ZWVmMjliZTMyODA2YTFkNThiYjdjNWRhNzZmNTUwYWEzZDhhMWZiZmYwZWIxOWNjYjFhMzEzZDU1Y2RhNTZjOWVjMmVmMjk2MzIzODdmZThkNzZlM2MwNDY4MDQzZThmNjYzZjQ4NjBlZTEyYmYyZDViMGI3NDc0ZDZlNjk0ZjkxZTZkYmUxMTU5NzRhMzkyNmYxMmZlZTVlNDM4Nzc3Y2I2YTkzMmRmOGNkOGJlYzRkMDczYjkzMWJhM2JjODMyYjY4ZDlkZDMwMDc0MWZhN2JmOGFmYzQ3ZWQyNTc2ZjY5MzZiYTQyNDY2M2FhYjYzOWM1YWU0ZjU2ODM0MjNiNDc0MmJmMWM5NzgyMzhmMTZjYmUzOWQ2NTJkZTNmZGI4YmVmYzg0OGFkOTIyMjIyZTA0YTQwMzdjMDcxM2ViNTdhODFhMjNmMGM3MzQ3M2ZjNjQ2Y2VhMzA2YjRiY2JjODg2MmY4Mzg1ZGRmYTlkNGI3ZmEyYzA4N2U4Nzk2ODMzMDNlZDViZGQzYTA2MmIzY2Y1YjNhMjc4YTY2ZDJhMTNmODNmNDRmODJkZGYzMTBlZTA3NGFiNmEzNjQ1OTdlODk5YTAyNTVkYzE2NGYzMWNjNTA4NDY4NTFkZjlhYjQ4MTk1ZGVkN2VhMWIxZDUxMGJkN2VlNzRkNzNmYWYzNmJjMzFlY2ZhMjY4MzU5MDQ2ZjRlYjg3OWY5MjQwMDk0MzhiNDgxYzZjZDc4ODlhMDAyZWQ1ZWUzODJiYzkxOTBkYTZmYzAyNmU0Nzk1NThlNDQ3NTY3N2U5YWE5ZTMwNTBlMjc2NTY5NGRmYzgxZjU2ZTg4MGI5NmU3MTYwYzk4MGRkOThlZGQzZGZmZmZmZmZmZmZmZmZmZmZmXCJcbiAgICB9XG59IiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgZWxsaXB0aWMgPSBleHBvcnRzO1xuXG5lbGxpcHRpYy52ZXJzaW9uID0gcmVxdWlyZSgnLi4vcGFja2FnZS5qc29uJykudmVyc2lvbjtcbmVsbGlwdGljLnV0aWxzID0gcmVxdWlyZSgnLi9lbGxpcHRpYy91dGlscycpO1xuZWxsaXB0aWMucmFuZCA9IHJlcXVpcmUoJ2Jyb3JhbmQnKTtcbmVsbGlwdGljLmhtYWNEUkJHID0gcmVxdWlyZSgnLi9lbGxpcHRpYy9obWFjLWRyYmcnKTtcbmVsbGlwdGljLmN1cnZlID0gcmVxdWlyZSgnLi9lbGxpcHRpYy9jdXJ2ZScpO1xuZWxsaXB0aWMuY3VydmVzID0gcmVxdWlyZSgnLi9lbGxpcHRpYy9jdXJ2ZXMnKTtcblxuLy8gUHJvdG9jb2xzXG5lbGxpcHRpYy5lYyA9IHJlcXVpcmUoJy4vZWxsaXB0aWMvZWMnKTtcbmVsbGlwdGljLmVkZHNhID0gcmVxdWlyZSgnLi9lbGxpcHRpYy9lZGRzYScpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQk4gPSByZXF1aXJlKCdibi5qcycpO1xudmFyIGVsbGlwdGljID0gcmVxdWlyZSgnLi4vLi4vZWxsaXB0aWMnKTtcbnZhciB1dGlscyA9IGVsbGlwdGljLnV0aWxzO1xudmFyIGdldE5BRiA9IHV0aWxzLmdldE5BRjtcbnZhciBnZXRKU0YgPSB1dGlscy5nZXRKU0Y7XG52YXIgYXNzZXJ0ID0gdXRpbHMuYXNzZXJ0O1xuXG5mdW5jdGlvbiBCYXNlQ3VydmUodHlwZSwgY29uZikge1xuICB0aGlzLnR5cGUgPSB0eXBlO1xuICB0aGlzLnAgPSBuZXcgQk4oY29uZi5wLCAxNik7XG5cbiAgLy8gVXNlIE1vbnRnb21lcnksIHdoZW4gdGhlcmUgaXMgbm8gZmFzdCByZWR1Y3Rpb24gZm9yIHRoZSBwcmltZVxuICB0aGlzLnJlZCA9IGNvbmYucHJpbWUgPyBCTi5yZWQoY29uZi5wcmltZSkgOiBCTi5tb250KHRoaXMucCk7XG5cbiAgLy8gVXNlZnVsIGZvciBtYW55IGN1cnZlc1xuICB0aGlzLnplcm8gPSBuZXcgQk4oMCkudG9SZWQodGhpcy5yZWQpO1xuICB0aGlzLm9uZSA9IG5ldyBCTigxKS50b1JlZCh0aGlzLnJlZCk7XG4gIHRoaXMudHdvID0gbmV3IEJOKDIpLnRvUmVkKHRoaXMucmVkKTtcblxuICAvLyBDdXJ2ZSBjb25maWd1cmF0aW9uLCBvcHRpb25hbFxuICB0aGlzLm4gPSBjb25mLm4gJiYgbmV3IEJOKGNvbmYubiwgMTYpO1xuICB0aGlzLmcgPSBjb25mLmcgJiYgdGhpcy5wb2ludEZyb21KU09OKGNvbmYuZywgY29uZi5nUmVkKTtcblxuICAvLyBUZW1wb3JhcnkgYXJyYXlzXG4gIHRoaXMuX3duYWZUMSA9IG5ldyBBcnJheSg0KTtcbiAgdGhpcy5fd25hZlQyID0gbmV3IEFycmF5KDQpO1xuICB0aGlzLl93bmFmVDMgPSBuZXcgQXJyYXkoNCk7XG4gIHRoaXMuX3duYWZUNCA9IG5ldyBBcnJheSg0KTtcbn1cbm1vZHVsZS5leHBvcnRzID0gQmFzZUN1cnZlO1xuXG5CYXNlQ3VydmUucHJvdG90eXBlLnBvaW50ID0gZnVuY3Rpb24gcG9pbnQoKSB7XG4gIHRocm93IG5ldyBFcnJvcignTm90IGltcGxlbWVudGVkJyk7XG59O1xuXG5CYXNlQ3VydmUucHJvdG90eXBlLnZhbGlkYXRlID0gZnVuY3Rpb24gdmFsaWRhdGUoKSB7XG4gIHRocm93IG5ldyBFcnJvcignTm90IGltcGxlbWVudGVkJyk7XG59O1xuXG5CYXNlQ3VydmUucHJvdG90eXBlLl9maXhlZE5hZk11bCA9IGZ1bmN0aW9uIF9maXhlZE5hZk11bChwLCBrKSB7XG4gIGFzc2VydChwLnByZWNvbXB1dGVkKTtcbiAgdmFyIGRvdWJsZXMgPSBwLl9nZXREb3VibGVzKCk7XG5cbiAgdmFyIG5hZiA9IGdldE5BRihrLCAxKTtcbiAgdmFyIEkgPSAoMSA8PCAoZG91Ymxlcy5zdGVwICsgMSkpIC0gKGRvdWJsZXMuc3RlcCAlIDIgPT09IDAgPyAyIDogMSk7XG4gIEkgLz0gMztcblxuICAvLyBUcmFuc2xhdGUgaW50byBtb3JlIHdpbmRvd2VkIGZvcm1cbiAgdmFyIHJlcHIgPSBbXTtcbiAgZm9yICh2YXIgaiA9IDA7IGogPCBuYWYubGVuZ3RoOyBqICs9IGRvdWJsZXMuc3RlcCkge1xuICAgIHZhciBuYWZXID0gMDtcbiAgICBmb3IgKHZhciBrID0gaiArIGRvdWJsZXMuc3RlcCAtIDE7IGsgPj0gajsgay0tKVxuICAgICAgbmFmVyA9IChuYWZXIDw8IDEpICsgbmFmW2tdO1xuICAgIHJlcHIucHVzaChuYWZXKTtcbiAgfVxuXG4gIHZhciBhID0gdGhpcy5qcG9pbnQobnVsbCwgbnVsbCwgbnVsbCk7XG4gIHZhciBiID0gdGhpcy5qcG9pbnQobnVsbCwgbnVsbCwgbnVsbCk7XG4gIGZvciAodmFyIGkgPSBJOyBpID4gMDsgaS0tKSB7XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCByZXByLmxlbmd0aDsgaisrKSB7XG4gICAgICB2YXIgbmFmVyA9IHJlcHJbal07XG4gICAgICBpZiAobmFmVyA9PT0gaSlcbiAgICAgICAgYiA9IGIubWl4ZWRBZGQoZG91Ymxlcy5wb2ludHNbal0pO1xuICAgICAgZWxzZSBpZiAobmFmVyA9PT0gLWkpXG4gICAgICAgIGIgPSBiLm1peGVkQWRkKGRvdWJsZXMucG9pbnRzW2pdLm5lZygpKTtcbiAgICB9XG4gICAgYSA9IGEuYWRkKGIpO1xuICB9XG4gIHJldHVybiBhLnRvUCgpO1xufTtcblxuQmFzZUN1cnZlLnByb3RvdHlwZS5fd25hZk11bCA9IGZ1bmN0aW9uIF93bmFmTXVsKHAsIGspIHtcbiAgdmFyIHcgPSA0O1xuXG4gIC8vIFByZWNvbXB1dGUgd2luZG93XG4gIHZhciBuYWZQb2ludHMgPSBwLl9nZXROQUZQb2ludHModyk7XG4gIHcgPSBuYWZQb2ludHMud25kO1xuICB2YXIgd25kID0gbmFmUG9pbnRzLnBvaW50cztcblxuICAvLyBHZXQgTkFGIGZvcm1cbiAgdmFyIG5hZiA9IGdldE5BRihrLCB3KTtcblxuICAvLyBBZGQgYHRoaXNgKihOKzEpIGZvciBldmVyeSB3LU5BRiBpbmRleFxuICB2YXIgYWNjID0gdGhpcy5qcG9pbnQobnVsbCwgbnVsbCwgbnVsbCk7XG4gIGZvciAodmFyIGkgPSBuYWYubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAvLyBDb3VudCB6ZXJvZXNcbiAgICBmb3IgKHZhciBrID0gMDsgaSA+PSAwICYmIG5hZltpXSA9PT0gMDsgaS0tKVxuICAgICAgaysrO1xuICAgIGlmIChpID49IDApXG4gICAgICBrKys7XG4gICAgYWNjID0gYWNjLmRibHAoayk7XG5cbiAgICBpZiAoaSA8IDApXG4gICAgICBicmVhaztcbiAgICB2YXIgeiA9IG5hZltpXTtcbiAgICBhc3NlcnQoeiAhPT0gMCk7XG4gICAgaWYgKHAudHlwZSA9PT0gJ2FmZmluZScpIHtcbiAgICAgIC8vIEogKy0gUFxuICAgICAgaWYgKHogPiAwKVxuICAgICAgICBhY2MgPSBhY2MubWl4ZWRBZGQod25kWyh6IC0gMSkgPj4gMV0pO1xuICAgICAgZWxzZVxuICAgICAgICBhY2MgPSBhY2MubWl4ZWRBZGQod25kWygteiAtIDEpID4+IDFdLm5lZygpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSiArLSBKXG4gICAgICBpZiAoeiA+IDApXG4gICAgICAgIGFjYyA9IGFjYy5hZGQod25kWyh6IC0gMSkgPj4gMV0pO1xuICAgICAgZWxzZVxuICAgICAgICBhY2MgPSBhY2MuYWRkKHduZFsoLXogLSAxKSA+PiAxXS5uZWcoKSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBwLnR5cGUgPT09ICdhZmZpbmUnID8gYWNjLnRvUCgpIDogYWNjO1xufTtcblxuQmFzZUN1cnZlLnByb3RvdHlwZS5fd25hZk11bEFkZCA9IGZ1bmN0aW9uIF93bmFmTXVsQWRkKGRlZlcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZWZmcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4pIHtcbiAgdmFyIHduZFdpZHRoID0gdGhpcy5fd25hZlQxO1xuICB2YXIgd25kID0gdGhpcy5fd25hZlQyO1xuICB2YXIgbmFmID0gdGhpcy5fd25hZlQzO1xuXG4gIC8vIEZpbGwgYWxsIGFycmF5c1xuICB2YXIgbWF4ID0gMDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIHZhciBwID0gcG9pbnRzW2ldO1xuICAgIHZhciBuYWZQb2ludHMgPSBwLl9nZXROQUZQb2ludHMoZGVmVyk7XG4gICAgd25kV2lkdGhbaV0gPSBuYWZQb2ludHMud25kO1xuICAgIHduZFtpXSA9IG5hZlBvaW50cy5wb2ludHM7XG4gIH1cblxuICAvLyBDb21iIHNtYWxsIHdpbmRvdyBOQUZzXG4gIGZvciAodmFyIGkgPSBsZW4gLSAxOyBpID49IDE7IGkgLT0gMikge1xuICAgIHZhciBhID0gaSAtIDE7XG4gICAgdmFyIGIgPSBpO1xuICAgIGlmICh3bmRXaWR0aFthXSAhPT0gMSB8fCB3bmRXaWR0aFtiXSAhPT0gMSkge1xuICAgICAgbmFmW2FdID0gZ2V0TkFGKGNvZWZmc1thXSwgd25kV2lkdGhbYV0pO1xuICAgICAgbmFmW2JdID0gZ2V0TkFGKGNvZWZmc1tiXSwgd25kV2lkdGhbYl0pO1xuICAgICAgbWF4ID0gTWF0aC5tYXgobmFmW2FdLmxlbmd0aCwgbWF4KTtcbiAgICAgIG1heCA9IE1hdGgubWF4KG5hZltiXS5sZW5ndGgsIG1heCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICB2YXIgY29tYiA9IFtcbiAgICAgIHBvaW50c1thXSwgLyogMSAqL1xuICAgICAgbnVsbCwgLyogMyAqL1xuICAgICAgbnVsbCwgLyogNSAqL1xuICAgICAgcG9pbnRzW2JdIC8qIDcgKi9cbiAgICBdO1xuXG4gICAgLy8gVHJ5IHRvIGF2b2lkIFByb2plY3RpdmUgcG9pbnRzLCBpZiBwb3NzaWJsZVxuICAgIGlmIChwb2ludHNbYV0ueS5jbXAocG9pbnRzW2JdLnkpID09PSAwKSB7XG4gICAgICBjb21iWzFdID0gcG9pbnRzW2FdLmFkZChwb2ludHNbYl0pO1xuICAgICAgY29tYlsyXSA9IHBvaW50c1thXS50b0ooKS5taXhlZEFkZChwb2ludHNbYl0ubmVnKCkpO1xuICAgIH0gZWxzZSBpZiAocG9pbnRzW2FdLnkuY21wKHBvaW50c1tiXS55LnJlZE5lZygpKSA9PT0gMCkge1xuICAgICAgY29tYlsxXSA9IHBvaW50c1thXS50b0ooKS5taXhlZEFkZChwb2ludHNbYl0pO1xuICAgICAgY29tYlsyXSA9IHBvaW50c1thXS5hZGQocG9pbnRzW2JdLm5lZygpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29tYlsxXSA9IHBvaW50c1thXS50b0ooKS5taXhlZEFkZChwb2ludHNbYl0pO1xuICAgICAgY29tYlsyXSA9IHBvaW50c1thXS50b0ooKS5taXhlZEFkZChwb2ludHNbYl0ubmVnKCkpO1xuICAgIH1cblxuICAgIHZhciBpbmRleCA9IFtcbiAgICAgIC0zLCAvKiAtMSAtMSAqL1xuICAgICAgLTEsIC8qIC0xIDAgKi9cbiAgICAgIC01LCAvKiAtMSAxICovXG4gICAgICAtNywgLyogMCAtMSAqL1xuICAgICAgMCwgLyogMCAwICovXG4gICAgICA3LCAvKiAwIDEgKi9cbiAgICAgIDUsIC8qIDEgLTEgKi9cbiAgICAgIDEsIC8qIDEgMCAqL1xuICAgICAgMyAgLyogMSAxICovXG4gICAgXTtcblxuICAgIHZhciBqc2YgPSBnZXRKU0YoY29lZmZzW2FdLCBjb2VmZnNbYl0pO1xuICAgIG1heCA9IE1hdGgubWF4KGpzZlswXS5sZW5ndGgsIG1heCk7XG4gICAgbmFmW2FdID0gbmV3IEFycmF5KG1heCk7XG4gICAgbmFmW2JdID0gbmV3IEFycmF5KG1heCk7XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBtYXg7IGorKykge1xuICAgICAgdmFyIGphID0ganNmWzBdW2pdIHwgMDtcbiAgICAgIHZhciBqYiA9IGpzZlsxXVtqXSB8IDA7XG5cbiAgICAgIG5hZlthXVtqXSA9IGluZGV4WyhqYSArIDEpICogMyArIChqYiArIDEpXTtcbiAgICAgIG5hZltiXVtqXSA9IDA7XG4gICAgICB3bmRbYV0gPSBjb21iO1xuICAgIH1cbiAgfVxuXG4gIHZhciBhY2MgPSB0aGlzLmpwb2ludChudWxsLCBudWxsLCBudWxsKTtcbiAgdmFyIHRtcCA9IHRoaXMuX3duYWZUNDtcbiAgZm9yICh2YXIgaSA9IG1heDsgaSA+PSAwOyBpLS0pIHtcbiAgICB2YXIgayA9IDA7XG5cbiAgICB3aGlsZSAoaSA+PSAwKSB7XG4gICAgICB2YXIgemVybyA9IHRydWU7XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGxlbjsgaisrKSB7XG4gICAgICAgIHRtcFtqXSA9IG5hZltqXVtpXSB8IDA7XG4gICAgICAgIGlmICh0bXBbal0gIT09IDApXG4gICAgICAgICAgemVybyA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKCF6ZXJvKVxuICAgICAgICBicmVhaztcbiAgICAgIGsrKztcbiAgICAgIGktLTtcbiAgICB9XG4gICAgaWYgKGkgPj0gMClcbiAgICAgIGsrKztcbiAgICBhY2MgPSBhY2MuZGJscChrKTtcbiAgICBpZiAoaSA8IDApXG4gICAgICBicmVhaztcblxuICAgIGZvciAodmFyIGogPSAwOyBqIDwgbGVuOyBqKyspIHtcbiAgICAgIHZhciB6ID0gdG1wW2pdO1xuICAgICAgdmFyIHA7XG4gICAgICBpZiAoeiA9PT0gMClcbiAgICAgICAgY29udGludWU7XG4gICAgICBlbHNlIGlmICh6ID4gMClcbiAgICAgICAgcCA9IHduZFtqXVsoeiAtIDEpID4+IDFdO1xuICAgICAgZWxzZSBpZiAoeiA8IDApXG4gICAgICAgIHAgPSB3bmRbal1bKC16IC0gMSkgPj4gMV0ubmVnKCk7XG5cbiAgICAgIGlmIChwLnR5cGUgPT09ICdhZmZpbmUnKVxuICAgICAgICBhY2MgPSBhY2MubWl4ZWRBZGQocCk7XG4gICAgICBlbHNlXG4gICAgICAgIGFjYyA9IGFjYy5hZGQocCk7XG4gICAgfVxuICB9XG4gIC8vIFplcm9pZnkgcmVmZXJlbmNlc1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKVxuICAgIHduZFtpXSA9IG51bGw7XG4gIHJldHVybiBhY2MudG9QKCk7XG59O1xuXG5mdW5jdGlvbiBCYXNlUG9pbnQoY3VydmUsIHR5cGUpIHtcbiAgdGhpcy5jdXJ2ZSA9IGN1cnZlO1xuICB0aGlzLnR5cGUgPSB0eXBlO1xuICB0aGlzLnByZWNvbXB1dGVkID0gbnVsbDtcbn1cbkJhc2VDdXJ2ZS5CYXNlUG9pbnQgPSBCYXNlUG9pbnQ7XG5cbkJhc2VQb2ludC5wcm90b3R5cGUuZXEgPSBmdW5jdGlvbiBlcSgvKm90aGVyKi8pIHtcbiAgdGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQnKTtcbn07XG5cbkJhc2VQb2ludC5wcm90b3R5cGUudmFsaWRhdGUgPSBmdW5jdGlvbiB2YWxpZGF0ZSgpIHtcbiAgcmV0dXJuIHRoaXMuY3VydmUudmFsaWRhdGUodGhpcyk7XG59O1xuXG5CYXNlQ3VydmUucHJvdG90eXBlLmRlY29kZVBvaW50ID0gZnVuY3Rpb24gZGVjb2RlUG9pbnQoYnl0ZXMsIGVuYykge1xuICBieXRlcyA9IHV0aWxzLnRvQXJyYXkoYnl0ZXMsIGVuYyk7XG5cbiAgdmFyIGxlbiA9IHRoaXMucC5ieXRlTGVuZ3RoKCk7XG4gIGlmIChieXRlc1swXSA9PT0gMHgwNCAmJiBieXRlcy5sZW5ndGggLSAxID09PSAyICogbGVuKSB7XG4gICAgcmV0dXJuIHRoaXMucG9pbnQoYnl0ZXMuc2xpY2UoMSwgMSArIGxlbiksXG4gICAgICAgICAgICAgICAgICAgICAgYnl0ZXMuc2xpY2UoMSArIGxlbiwgMSArIDIgKiBsZW4pKTtcbiAgfSBlbHNlIGlmICgoYnl0ZXNbMF0gPT09IDB4MDIgfHwgYnl0ZXNbMF0gPT09IDB4MDMpICYmXG4gICAgICAgICAgICAgIGJ5dGVzLmxlbmd0aCAtIDEgPT09IGxlbikge1xuICAgIHJldHVybiB0aGlzLnBvaW50RnJvbVgoYnl0ZXMuc2xpY2UoMSwgMSArIGxlbiksIGJ5dGVzWzBdID09PSAweDAzKTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gcG9pbnQgZm9ybWF0Jyk7XG59O1xuXG5CYXNlUG9pbnQucHJvdG90eXBlLmVuY29kZUNvbXByZXNzZWQgPSBmdW5jdGlvbiBlbmNvZGVDb21wcmVzc2VkKGVuYykge1xuICByZXR1cm4gdGhpcy5lbmNvZGUoZW5jLCB0cnVlKTtcbn07XG5cbkJhc2VQb2ludC5wcm90b3R5cGUuX2VuY29kZSA9IGZ1bmN0aW9uIF9lbmNvZGUoY29tcGFjdCkge1xuICB2YXIgbGVuID0gdGhpcy5jdXJ2ZS5wLmJ5dGVMZW5ndGgoKTtcbiAgdmFyIHggPSB0aGlzLmdldFgoKS50b0FycmF5KCdiZScsIGxlbik7XG5cbiAgaWYgKGNvbXBhY3QpXG4gICAgcmV0dXJuIFsgdGhpcy5nZXRZKCkuaXNFdmVuKCkgPyAweDAyIDogMHgwMyBdLmNvbmNhdCh4KTtcblxuICByZXR1cm4gWyAweDA0IF0uY29uY2F0KHgsIHRoaXMuZ2V0WSgpLnRvQXJyYXkoJ2JlJywgbGVuKSkgO1xufTtcblxuQmFzZVBvaW50LnByb3RvdHlwZS5lbmNvZGUgPSBmdW5jdGlvbiBlbmNvZGUoZW5jLCBjb21wYWN0KSB7XG4gIHJldHVybiB1dGlscy5lbmNvZGUodGhpcy5fZW5jb2RlKGNvbXBhY3QpLCBlbmMpO1xufTtcblxuQmFzZVBvaW50LnByb3RvdHlwZS5wcmVjb21wdXRlID0gZnVuY3Rpb24gcHJlY29tcHV0ZShwb3dlcikge1xuICBpZiAodGhpcy5wcmVjb21wdXRlZClcbiAgICByZXR1cm4gdGhpcztcblxuICB2YXIgcHJlY29tcHV0ZWQgPSB7XG4gICAgZG91YmxlczogbnVsbCxcbiAgICBuYWY6IG51bGwsXG4gICAgYmV0YTogbnVsbFxuICB9O1xuICBwcmVjb21wdXRlZC5uYWYgPSB0aGlzLl9nZXROQUZQb2ludHMoOCk7XG4gIHByZWNvbXB1dGVkLmRvdWJsZXMgPSB0aGlzLl9nZXREb3VibGVzKDQsIHBvd2VyKTtcbiAgcHJlY29tcHV0ZWQuYmV0YSA9IHRoaXMuX2dldEJldGEoKTtcbiAgdGhpcy5wcmVjb21wdXRlZCA9IHByZWNvbXB1dGVkO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuQmFzZVBvaW50LnByb3RvdHlwZS5faGFzRG91YmxlcyA9IGZ1bmN0aW9uIF9oYXNEb3VibGVzKGspIHtcbiAgaWYgKCF0aGlzLnByZWNvbXB1dGVkKVxuICAgIHJldHVybiBmYWxzZTtcblxuICB2YXIgZG91YmxlcyA9IHRoaXMucHJlY29tcHV0ZWQuZG91YmxlcztcbiAgaWYgKCFkb3VibGVzKVxuICAgIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gZG91Ymxlcy5wb2ludHMubGVuZ3RoID49IE1hdGguY2VpbCgoay5iaXRMZW5ndGgoKSArIDEpIC8gZG91Ymxlcy5zdGVwKTtcbn07XG5cbkJhc2VQb2ludC5wcm90b3R5cGUuX2dldERvdWJsZXMgPSBmdW5jdGlvbiBfZ2V0RG91YmxlcyhzdGVwLCBwb3dlcikge1xuICBpZiAodGhpcy5wcmVjb21wdXRlZCAmJiB0aGlzLnByZWNvbXB1dGVkLmRvdWJsZXMpXG4gICAgcmV0dXJuIHRoaXMucHJlY29tcHV0ZWQuZG91YmxlcztcblxuICB2YXIgZG91YmxlcyA9IFsgdGhpcyBdO1xuICB2YXIgYWNjID0gdGhpcztcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwb3dlcjsgaSArPSBzdGVwKSB7XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBzdGVwOyBqKyspXG4gICAgICBhY2MgPSBhY2MuZGJsKCk7XG4gICAgZG91Ymxlcy5wdXNoKGFjYyk7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBzdGVwOiBzdGVwLFxuICAgIHBvaW50czogZG91Ymxlc1xuICB9O1xufTtcblxuQmFzZVBvaW50LnByb3RvdHlwZS5fZ2V0TkFGUG9pbnRzID0gZnVuY3Rpb24gX2dldE5BRlBvaW50cyh3bmQpIHtcbiAgaWYgKHRoaXMucHJlY29tcHV0ZWQgJiYgdGhpcy5wcmVjb21wdXRlZC5uYWYpXG4gICAgcmV0dXJuIHRoaXMucHJlY29tcHV0ZWQubmFmO1xuXG4gIHZhciByZXMgPSBbIHRoaXMgXTtcbiAgdmFyIG1heCA9ICgxIDw8IHduZCkgLSAxO1xuICB2YXIgZGJsID0gbWF4ID09PSAxID8gbnVsbCA6IHRoaXMuZGJsKCk7XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgbWF4OyBpKyspXG4gICAgcmVzW2ldID0gcmVzW2kgLSAxXS5hZGQoZGJsKTtcbiAgcmV0dXJuIHtcbiAgICB3bmQ6IHduZCxcbiAgICBwb2ludHM6IHJlc1xuICB9O1xufTtcblxuQmFzZVBvaW50LnByb3RvdHlwZS5fZ2V0QmV0YSA9IGZ1bmN0aW9uIF9nZXRCZXRhKCkge1xuICByZXR1cm4gbnVsbDtcbn07XG5cbkJhc2VQb2ludC5wcm90b3R5cGUuZGJscCA9IGZ1bmN0aW9uIGRibHAoaykge1xuICB2YXIgciA9IHRoaXM7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgazsgaSsrKVxuICAgIHIgPSByLmRibCgpO1xuICByZXR1cm4gcjtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBjdXJ2ZSA9IHJlcXVpcmUoJy4uL2N1cnZlJyk7XG52YXIgZWxsaXB0aWMgPSByZXF1aXJlKCcuLi8uLi9lbGxpcHRpYycpO1xudmFyIEJOID0gcmVxdWlyZSgnYm4uanMnKTtcbnZhciBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG52YXIgQmFzZSA9IGN1cnZlLmJhc2U7XG5cbnZhciBhc3NlcnQgPSBlbGxpcHRpYy51dGlscy5hc3NlcnQ7XG5cbmZ1bmN0aW9uIEVkd2FyZHNDdXJ2ZShjb25mKSB7XG4gIC8vIE5PVEU6IEltcG9ydGFudCBhcyB3ZSBhcmUgY3JlYXRpbmcgcG9pbnQgaW4gQmFzZS5jYWxsKClcbiAgdGhpcy50d2lzdGVkID0gKGNvbmYuYSB8IDApICE9PSAxO1xuICB0aGlzLm1PbmVBID0gdGhpcy50d2lzdGVkICYmIChjb25mLmEgfCAwKSA9PT0gLTE7XG4gIHRoaXMuZXh0ZW5kZWQgPSB0aGlzLm1PbmVBO1xuXG4gIEJhc2UuY2FsbCh0aGlzLCAnZWR3YXJkcycsIGNvbmYpO1xuXG4gIHRoaXMuYSA9IG5ldyBCTihjb25mLmEsIDE2KS51bW9kKHRoaXMucmVkLm0pO1xuICB0aGlzLmEgPSB0aGlzLmEudG9SZWQodGhpcy5yZWQpO1xuICB0aGlzLmMgPSBuZXcgQk4oY29uZi5jLCAxNikudG9SZWQodGhpcy5yZWQpO1xuICB0aGlzLmMyID0gdGhpcy5jLnJlZFNxcigpO1xuICB0aGlzLmQgPSBuZXcgQk4oY29uZi5kLCAxNikudG9SZWQodGhpcy5yZWQpO1xuICB0aGlzLmRkID0gdGhpcy5kLnJlZEFkZCh0aGlzLmQpO1xuXG4gIGFzc2VydCghdGhpcy50d2lzdGVkIHx8IHRoaXMuYy5mcm9tUmVkKCkuY21wbigxKSA9PT0gMCk7XG4gIHRoaXMub25lQyA9IChjb25mLmMgfCAwKSA9PT0gMTtcbn1cbmluaGVyaXRzKEVkd2FyZHNDdXJ2ZSwgQmFzZSk7XG5tb2R1bGUuZXhwb3J0cyA9IEVkd2FyZHNDdXJ2ZTtcblxuRWR3YXJkc0N1cnZlLnByb3RvdHlwZS5fbXVsQSA9IGZ1bmN0aW9uIF9tdWxBKG51bSkge1xuICBpZiAodGhpcy5tT25lQSlcbiAgICByZXR1cm4gbnVtLnJlZE5lZygpO1xuICBlbHNlXG4gICAgcmV0dXJuIHRoaXMuYS5yZWRNdWwobnVtKTtcbn07XG5cbkVkd2FyZHNDdXJ2ZS5wcm90b3R5cGUuX211bEMgPSBmdW5jdGlvbiBfbXVsQyhudW0pIHtcbiAgaWYgKHRoaXMub25lQylcbiAgICByZXR1cm4gbnVtO1xuICBlbHNlXG4gICAgcmV0dXJuIHRoaXMuYy5yZWRNdWwobnVtKTtcbn07XG5cbi8vIEp1c3QgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBTaG9ydCBjdXJ2ZVxuRWR3YXJkc0N1cnZlLnByb3RvdHlwZS5qcG9pbnQgPSBmdW5jdGlvbiBqcG9pbnQoeCwgeSwgeiwgdCkge1xuICByZXR1cm4gdGhpcy5wb2ludCh4LCB5LCB6LCB0KTtcbn07XG5cbkVkd2FyZHNDdXJ2ZS5wcm90b3R5cGUucG9pbnRGcm9tWCA9IGZ1bmN0aW9uIHBvaW50RnJvbVgoeCwgb2RkKSB7XG4gIHggPSBuZXcgQk4oeCwgMTYpO1xuICBpZiAoIXgucmVkKVxuICAgIHggPSB4LnRvUmVkKHRoaXMucmVkKTtcblxuICB2YXIgeDIgPSB4LnJlZFNxcigpO1xuICB2YXIgcmhzID0gdGhpcy5jMi5yZWRTdWIodGhpcy5hLnJlZE11bCh4MikpO1xuICB2YXIgbGhzID0gdGhpcy5vbmUucmVkU3ViKHRoaXMuYzIucmVkTXVsKHRoaXMuZCkucmVkTXVsKHgyKSk7XG5cbiAgdmFyIHkyID0gcmhzLnJlZE11bChsaHMucmVkSW52bSgpKTtcbiAgdmFyIHkgPSB5Mi5yZWRTcXJ0KCk7XG4gIGlmICh5LnJlZFNxcigpLnJlZFN1Yih5MikuY21wKHRoaXMuemVybykgIT09IDApXG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHBvaW50Jyk7XG5cbiAgdmFyIGlzT2RkID0geS5mcm9tUmVkKCkuaXNPZGQoKTtcbiAgaWYgKG9kZCAmJiAhaXNPZGQgfHwgIW9kZCAmJiBpc09kZClcbiAgICB5ID0geS5yZWROZWcoKTtcblxuICByZXR1cm4gdGhpcy5wb2ludCh4LCB5KTtcbn07XG5cbkVkd2FyZHNDdXJ2ZS5wcm90b3R5cGUucG9pbnRGcm9tWSA9IGZ1bmN0aW9uIHBvaW50RnJvbVkoeSwgb2RkKSB7XG4gIHkgPSBuZXcgQk4oeSwgMTYpO1xuICBpZiAoIXkucmVkKVxuICAgIHkgPSB5LnRvUmVkKHRoaXMucmVkKTtcblxuICAvLyB4XjIgPSAoeV4yIC0gMSkgLyAoZCB5XjIgKyAxKVxuICB2YXIgeTIgPSB5LnJlZFNxcigpO1xuICB2YXIgbGhzID0geTIucmVkU3ViKHRoaXMub25lKTtcbiAgdmFyIHJocyA9IHkyLnJlZE11bCh0aGlzLmQpLnJlZEFkZCh0aGlzLm9uZSk7XG4gIHZhciB4MiA9IGxocy5yZWRNdWwocmhzLnJlZEludm0oKSk7XG5cbiAgaWYgKHgyLmNtcCh0aGlzLnplcm8pID09PSAwKSB7XG4gICAgaWYgKG9kZClcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBwb2ludCcpO1xuICAgIGVsc2VcbiAgICAgIHJldHVybiB0aGlzLnBvaW50KHRoaXMuemVybywgeSk7XG4gIH1cblxuICB2YXIgeCA9IHgyLnJlZFNxcnQoKTtcbiAgaWYgKHgucmVkU3FyKCkucmVkU3ViKHgyKS5jbXAodGhpcy56ZXJvKSAhPT0gMClcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcG9pbnQnKTtcblxuICBpZiAoeC5pc09kZCgpICE9PSBvZGQpXG4gICAgeCA9IHgucmVkTmVnKCk7XG5cbiAgcmV0dXJuIHRoaXMucG9pbnQoeCwgeSk7XG59O1xuXG5FZHdhcmRzQ3VydmUucHJvdG90eXBlLnZhbGlkYXRlID0gZnVuY3Rpb24gdmFsaWRhdGUocG9pbnQpIHtcbiAgaWYgKHBvaW50LmlzSW5maW5pdHkoKSlcbiAgICByZXR1cm4gdHJ1ZTtcblxuICAvLyBDdXJ2ZTogQSAqIFheMiArIFleMiA9IENeMiAqICgxICsgRCAqIFheMiAqIFleMilcbiAgcG9pbnQubm9ybWFsaXplKCk7XG5cbiAgdmFyIHgyID0gcG9pbnQueC5yZWRTcXIoKTtcbiAgdmFyIHkyID0gcG9pbnQueS5yZWRTcXIoKTtcbiAgdmFyIGxocyA9IHgyLnJlZE11bCh0aGlzLmEpLnJlZEFkZCh5Mik7XG4gIHZhciByaHMgPSB0aGlzLmMyLnJlZE11bCh0aGlzLm9uZS5yZWRBZGQodGhpcy5kLnJlZE11bCh4MikucmVkTXVsKHkyKSkpO1xuXG4gIHJldHVybiBsaHMuY21wKHJocykgPT09IDA7XG59O1xuXG5mdW5jdGlvbiBQb2ludChjdXJ2ZSwgeCwgeSwgeiwgdCkge1xuICBCYXNlLkJhc2VQb2ludC5jYWxsKHRoaXMsIGN1cnZlLCAncHJvamVjdGl2ZScpO1xuICBpZiAoeCA9PT0gbnVsbCAmJiB5ID09PSBudWxsICYmIHogPT09IG51bGwpIHtcbiAgICB0aGlzLnggPSB0aGlzLmN1cnZlLnplcm87XG4gICAgdGhpcy55ID0gdGhpcy5jdXJ2ZS5vbmU7XG4gICAgdGhpcy56ID0gdGhpcy5jdXJ2ZS5vbmU7XG4gICAgdGhpcy50ID0gdGhpcy5jdXJ2ZS56ZXJvO1xuICAgIHRoaXMuek9uZSA9IHRydWU7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy54ID0gbmV3IEJOKHgsIDE2KTtcbiAgICB0aGlzLnkgPSBuZXcgQk4oeSwgMTYpO1xuICAgIHRoaXMueiA9IHogPyBuZXcgQk4oeiwgMTYpIDogdGhpcy5jdXJ2ZS5vbmU7XG4gICAgdGhpcy50ID0gdCAmJiBuZXcgQk4odCwgMTYpO1xuICAgIGlmICghdGhpcy54LnJlZClcbiAgICAgIHRoaXMueCA9IHRoaXMueC50b1JlZCh0aGlzLmN1cnZlLnJlZCk7XG4gICAgaWYgKCF0aGlzLnkucmVkKVxuICAgICAgdGhpcy55ID0gdGhpcy55LnRvUmVkKHRoaXMuY3VydmUucmVkKTtcbiAgICBpZiAoIXRoaXMuei5yZWQpXG4gICAgICB0aGlzLnogPSB0aGlzLnoudG9SZWQodGhpcy5jdXJ2ZS5yZWQpO1xuICAgIGlmICh0aGlzLnQgJiYgIXRoaXMudC5yZWQpXG4gICAgICB0aGlzLnQgPSB0aGlzLnQudG9SZWQodGhpcy5jdXJ2ZS5yZWQpO1xuICAgIHRoaXMuek9uZSA9IHRoaXMueiA9PT0gdGhpcy5jdXJ2ZS5vbmU7XG5cbiAgICAvLyBVc2UgZXh0ZW5kZWQgY29vcmRpbmF0ZXNcbiAgICBpZiAodGhpcy5jdXJ2ZS5leHRlbmRlZCAmJiAhdGhpcy50KSB7XG4gICAgICB0aGlzLnQgPSB0aGlzLngucmVkTXVsKHRoaXMueSk7XG4gICAgICBpZiAoIXRoaXMuek9uZSlcbiAgICAgICAgdGhpcy50ID0gdGhpcy50LnJlZE11bCh0aGlzLnoucmVkSW52bSgpKTtcbiAgICB9XG4gIH1cbn1cbmluaGVyaXRzKFBvaW50LCBCYXNlLkJhc2VQb2ludCk7XG5cbkVkd2FyZHNDdXJ2ZS5wcm90b3R5cGUucG9pbnRGcm9tSlNPTiA9IGZ1bmN0aW9uIHBvaW50RnJvbUpTT04ob2JqKSB7XG4gIHJldHVybiBQb2ludC5mcm9tSlNPTih0aGlzLCBvYmopO1xufTtcblxuRWR3YXJkc0N1cnZlLnByb3RvdHlwZS5wb2ludCA9IGZ1bmN0aW9uIHBvaW50KHgsIHksIHosIHQpIHtcbiAgcmV0dXJuIG5ldyBQb2ludCh0aGlzLCB4LCB5LCB6LCB0KTtcbn07XG5cblBvaW50LmZyb21KU09OID0gZnVuY3Rpb24gZnJvbUpTT04oY3VydmUsIG9iaikge1xuICByZXR1cm4gbmV3IFBvaW50KGN1cnZlLCBvYmpbMF0sIG9ialsxXSwgb2JqWzJdKTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5pbnNwZWN0ID0gZnVuY3Rpb24gaW5zcGVjdCgpIHtcbiAgaWYgKHRoaXMuaXNJbmZpbml0eSgpKVxuICAgIHJldHVybiAnPEVDIFBvaW50IEluZmluaXR5Pic7XG4gIHJldHVybiAnPEVDIFBvaW50IHg6ICcgKyB0aGlzLnguZnJvbVJlZCgpLnRvU3RyaW5nKDE2LCAyKSArXG4gICAgICAnIHk6ICcgKyB0aGlzLnkuZnJvbVJlZCgpLnRvU3RyaW5nKDE2LCAyKSArXG4gICAgICAnIHo6ICcgKyB0aGlzLnouZnJvbVJlZCgpLnRvU3RyaW5nKDE2LCAyKSArICc+Jztcbn07XG5cblBvaW50LnByb3RvdHlwZS5pc0luZmluaXR5ID0gZnVuY3Rpb24gaXNJbmZpbml0eSgpIHtcbiAgLy8gWFhYIFRoaXMgY29kZSBhc3N1bWVzIHRoYXQgemVybyBpcyBhbHdheXMgemVybyBpbiByZWRcbiAgcmV0dXJuIHRoaXMueC5jbXBuKDApID09PSAwICYmXG4gICAgICAgICB0aGlzLnkuY21wKHRoaXMueikgPT09IDA7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuX2V4dERibCA9IGZ1bmN0aW9uIF9leHREYmwoKSB7XG4gIC8vIGh5cGVyZWxsaXB0aWMub3JnL0VGRC9nMXAvYXV0by10d2lzdGVkLWV4dGVuZGVkLTEuaHRtbFxuICAvLyAgICAgI2RvdWJsaW5nLWRibC0yMDA4LWh3Y2RcbiAgLy8gNE0gKyA0U1xuXG4gIC8vIEEgPSBYMV4yXG4gIHZhciBhID0gdGhpcy54LnJlZFNxcigpO1xuICAvLyBCID0gWTFeMlxuICB2YXIgYiA9IHRoaXMueS5yZWRTcXIoKTtcbiAgLy8gQyA9IDIgKiBaMV4yXG4gIHZhciBjID0gdGhpcy56LnJlZFNxcigpO1xuICBjID0gYy5yZWRJQWRkKGMpO1xuICAvLyBEID0gYSAqIEFcbiAgdmFyIGQgPSB0aGlzLmN1cnZlLl9tdWxBKGEpO1xuICAvLyBFID0gKFgxICsgWTEpXjIgLSBBIC0gQlxuICB2YXIgZSA9IHRoaXMueC5yZWRBZGQodGhpcy55KS5yZWRTcXIoKS5yZWRJU3ViKGEpLnJlZElTdWIoYik7XG4gIC8vIEcgPSBEICsgQlxuICB2YXIgZyA9IGQucmVkQWRkKGIpO1xuICAvLyBGID0gRyAtIENcbiAgdmFyIGYgPSBnLnJlZFN1YihjKTtcbiAgLy8gSCA9IEQgLSBCXG4gIHZhciBoID0gZC5yZWRTdWIoYik7XG4gIC8vIFgzID0gRSAqIEZcbiAgdmFyIG54ID0gZS5yZWRNdWwoZik7XG4gIC8vIFkzID0gRyAqIEhcbiAgdmFyIG55ID0gZy5yZWRNdWwoaCk7XG4gIC8vIFQzID0gRSAqIEhcbiAgdmFyIG50ID0gZS5yZWRNdWwoaCk7XG4gIC8vIFozID0gRiAqIEdcbiAgdmFyIG56ID0gZi5yZWRNdWwoZyk7XG4gIHJldHVybiB0aGlzLmN1cnZlLnBvaW50KG54LCBueSwgbnosIG50KTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5fcHJvakRibCA9IGZ1bmN0aW9uIF9wcm9qRGJsKCkge1xuICAvLyBoeXBlcmVsbGlwdGljLm9yZy9FRkQvZzFwL2F1dG8tdHdpc3RlZC1wcm9qZWN0aXZlLmh0bWxcbiAgLy8gICAgICNkb3VibGluZy1kYmwtMjAwOC1iYmpscFxuICAvLyAgICAgI2RvdWJsaW5nLWRibC0yMDA3LWJsXG4gIC8vIGFuZCBvdGhlcnNcbiAgLy8gR2VuZXJhbGx5IDNNICsgNFMgb3IgMk0gKyA0U1xuXG4gIC8vIEIgPSAoWDEgKyBZMSleMlxuICB2YXIgYiA9IHRoaXMueC5yZWRBZGQodGhpcy55KS5yZWRTcXIoKTtcbiAgLy8gQyA9IFgxXjJcbiAgdmFyIGMgPSB0aGlzLngucmVkU3FyKCk7XG4gIC8vIEQgPSBZMV4yXG4gIHZhciBkID0gdGhpcy55LnJlZFNxcigpO1xuXG4gIHZhciBueDtcbiAgdmFyIG55O1xuICB2YXIgbno7XG4gIGlmICh0aGlzLmN1cnZlLnR3aXN0ZWQpIHtcbiAgICAvLyBFID0gYSAqIENcbiAgICB2YXIgZSA9IHRoaXMuY3VydmUuX211bEEoYyk7XG4gICAgLy8gRiA9IEUgKyBEXG4gICAgdmFyIGYgPSBlLnJlZEFkZChkKTtcbiAgICBpZiAodGhpcy56T25lKSB7XG4gICAgICAvLyBYMyA9IChCIC0gQyAtIEQpICogKEYgLSAyKVxuICAgICAgbnggPSBiLnJlZFN1YihjKS5yZWRTdWIoZCkucmVkTXVsKGYucmVkU3ViKHRoaXMuY3VydmUudHdvKSk7XG4gICAgICAvLyBZMyA9IEYgKiAoRSAtIEQpXG4gICAgICBueSA9IGYucmVkTXVsKGUucmVkU3ViKGQpKTtcbiAgICAgIC8vIFozID0gRl4yIC0gMiAqIEZcbiAgICAgIG56ID0gZi5yZWRTcXIoKS5yZWRTdWIoZikucmVkU3ViKGYpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBIID0gWjFeMlxuICAgICAgdmFyIGggPSB0aGlzLnoucmVkU3FyKCk7XG4gICAgICAvLyBKID0gRiAtIDIgKiBIXG4gICAgICB2YXIgaiA9IGYucmVkU3ViKGgpLnJlZElTdWIoaCk7XG4gICAgICAvLyBYMyA9IChCLUMtRCkqSlxuICAgICAgbnggPSBiLnJlZFN1YihjKS5yZWRJU3ViKGQpLnJlZE11bChqKTtcbiAgICAgIC8vIFkzID0gRiAqIChFIC0gRClcbiAgICAgIG55ID0gZi5yZWRNdWwoZS5yZWRTdWIoZCkpO1xuICAgICAgLy8gWjMgPSBGICogSlxuICAgICAgbnogPSBmLnJlZE11bChqKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gRSA9IEMgKyBEXG4gICAgdmFyIGUgPSBjLnJlZEFkZChkKTtcbiAgICAvLyBIID0gKGMgKiBaMSleMlxuICAgIHZhciBoID0gdGhpcy5jdXJ2ZS5fbXVsQyh0aGlzLmMucmVkTXVsKHRoaXMueikpLnJlZFNxcigpO1xuICAgIC8vIEogPSBFIC0gMiAqIEhcbiAgICB2YXIgaiA9IGUucmVkU3ViKGgpLnJlZFN1YihoKTtcbiAgICAvLyBYMyA9IGMgKiAoQiAtIEUpICogSlxuICAgIG54ID0gdGhpcy5jdXJ2ZS5fbXVsQyhiLnJlZElTdWIoZSkpLnJlZE11bChqKTtcbiAgICAvLyBZMyA9IGMgKiBFICogKEMgLSBEKVxuICAgIG55ID0gdGhpcy5jdXJ2ZS5fbXVsQyhlKS5yZWRNdWwoYy5yZWRJU3ViKGQpKTtcbiAgICAvLyBaMyA9IEUgKiBKXG4gICAgbnogPSBlLnJlZE11bChqKTtcbiAgfVxuICByZXR1cm4gdGhpcy5jdXJ2ZS5wb2ludChueCwgbnksIG56KTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5kYmwgPSBmdW5jdGlvbiBkYmwoKSB7XG4gIGlmICh0aGlzLmlzSW5maW5pdHkoKSlcbiAgICByZXR1cm4gdGhpcztcblxuICAvLyBEb3VibGUgaW4gZXh0ZW5kZWQgY29vcmRpbmF0ZXNcbiAgaWYgKHRoaXMuY3VydmUuZXh0ZW5kZWQpXG4gICAgcmV0dXJuIHRoaXMuX2V4dERibCgpO1xuICBlbHNlXG4gICAgcmV0dXJuIHRoaXMuX3Byb2pEYmwoKTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5fZXh0QWRkID0gZnVuY3Rpb24gX2V4dEFkZChwKSB7XG4gIC8vIGh5cGVyZWxsaXB0aWMub3JnL0VGRC9nMXAvYXV0by10d2lzdGVkLWV4dGVuZGVkLTEuaHRtbFxuICAvLyAgICAgI2FkZGl0aW9uLWFkZC0yMDA4LWh3Y2QtM1xuICAvLyA4TVxuXG4gIC8vIEEgPSAoWTEgLSBYMSkgKiAoWTIgLSBYMilcbiAgdmFyIGEgPSB0aGlzLnkucmVkU3ViKHRoaXMueCkucmVkTXVsKHAueS5yZWRTdWIocC54KSk7XG4gIC8vIEIgPSAoWTEgKyBYMSkgKiAoWTIgKyBYMilcbiAgdmFyIGIgPSB0aGlzLnkucmVkQWRkKHRoaXMueCkucmVkTXVsKHAueS5yZWRBZGQocC54KSk7XG4gIC8vIEMgPSBUMSAqIGsgKiBUMlxuICB2YXIgYyA9IHRoaXMudC5yZWRNdWwodGhpcy5jdXJ2ZS5kZCkucmVkTXVsKHAudCk7XG4gIC8vIEQgPSBaMSAqIDIgKiBaMlxuICB2YXIgZCA9IHRoaXMuei5yZWRNdWwocC56LnJlZEFkZChwLnopKTtcbiAgLy8gRSA9IEIgLSBBXG4gIHZhciBlID0gYi5yZWRTdWIoYSk7XG4gIC8vIEYgPSBEIC0gQ1xuICB2YXIgZiA9IGQucmVkU3ViKGMpO1xuICAvLyBHID0gRCArIENcbiAgdmFyIGcgPSBkLnJlZEFkZChjKTtcbiAgLy8gSCA9IEIgKyBBXG4gIHZhciBoID0gYi5yZWRBZGQoYSk7XG4gIC8vIFgzID0gRSAqIEZcbiAgdmFyIG54ID0gZS5yZWRNdWwoZik7XG4gIC8vIFkzID0gRyAqIEhcbiAgdmFyIG55ID0gZy5yZWRNdWwoaCk7XG4gIC8vIFQzID0gRSAqIEhcbiAgdmFyIG50ID0gZS5yZWRNdWwoaCk7XG4gIC8vIFozID0gRiAqIEdcbiAgdmFyIG56ID0gZi5yZWRNdWwoZyk7XG4gIHJldHVybiB0aGlzLmN1cnZlLnBvaW50KG54LCBueSwgbnosIG50KTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5fcHJvakFkZCA9IGZ1bmN0aW9uIF9wcm9qQWRkKHApIHtcbiAgLy8gaHlwZXJlbGxpcHRpYy5vcmcvRUZEL2cxcC9hdXRvLXR3aXN0ZWQtcHJvamVjdGl2ZS5odG1sXG4gIC8vICAgICAjYWRkaXRpb24tYWRkLTIwMDgtYmJqbHBcbiAgLy8gICAgICNhZGRpdGlvbi1hZGQtMjAwNy1ibFxuICAvLyAxME0gKyAxU1xuXG4gIC8vIEEgPSBaMSAqIFoyXG4gIHZhciBhID0gdGhpcy56LnJlZE11bChwLnopO1xuICAvLyBCID0gQV4yXG4gIHZhciBiID0gYS5yZWRTcXIoKTtcbiAgLy8gQyA9IFgxICogWDJcbiAgdmFyIGMgPSB0aGlzLngucmVkTXVsKHAueCk7XG4gIC8vIEQgPSBZMSAqIFkyXG4gIHZhciBkID0gdGhpcy55LnJlZE11bChwLnkpO1xuICAvLyBFID0gZCAqIEMgKiBEXG4gIHZhciBlID0gdGhpcy5jdXJ2ZS5kLnJlZE11bChjKS5yZWRNdWwoZCk7XG4gIC8vIEYgPSBCIC0gRVxuICB2YXIgZiA9IGIucmVkU3ViKGUpO1xuICAvLyBHID0gQiArIEVcbiAgdmFyIGcgPSBiLnJlZEFkZChlKTtcbiAgLy8gWDMgPSBBICogRiAqICgoWDEgKyBZMSkgKiAoWDIgKyBZMikgLSBDIC0gRClcbiAgdmFyIHRtcCA9IHRoaXMueC5yZWRBZGQodGhpcy55KS5yZWRNdWwocC54LnJlZEFkZChwLnkpKS5yZWRJU3ViKGMpLnJlZElTdWIoZCk7XG4gIHZhciBueCA9IGEucmVkTXVsKGYpLnJlZE11bCh0bXApO1xuICB2YXIgbnk7XG4gIHZhciBuejtcbiAgaWYgKHRoaXMuY3VydmUudHdpc3RlZCkge1xuICAgIC8vIFkzID0gQSAqIEcgKiAoRCAtIGEgKiBDKVxuICAgIG55ID0gYS5yZWRNdWwoZykucmVkTXVsKGQucmVkU3ViKHRoaXMuY3VydmUuX211bEEoYykpKTtcbiAgICAvLyBaMyA9IEYgKiBHXG4gICAgbnogPSBmLnJlZE11bChnKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBZMyA9IEEgKiBHICogKEQgLSBDKVxuICAgIG55ID0gYS5yZWRNdWwoZykucmVkTXVsKGQucmVkU3ViKGMpKTtcbiAgICAvLyBaMyA9IGMgKiBGICogR1xuICAgIG56ID0gdGhpcy5jdXJ2ZS5fbXVsQyhmKS5yZWRNdWwoZyk7XG4gIH1cbiAgcmV0dXJuIHRoaXMuY3VydmUucG9pbnQobngsIG55LCBueik7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gYWRkKHApIHtcbiAgaWYgKHRoaXMuaXNJbmZpbml0eSgpKVxuICAgIHJldHVybiBwO1xuICBpZiAocC5pc0luZmluaXR5KCkpXG4gICAgcmV0dXJuIHRoaXM7XG5cbiAgaWYgKHRoaXMuY3VydmUuZXh0ZW5kZWQpXG4gICAgcmV0dXJuIHRoaXMuX2V4dEFkZChwKTtcbiAgZWxzZVxuICAgIHJldHVybiB0aGlzLl9wcm9qQWRkKHApO1xufTtcblxuUG9pbnQucHJvdG90eXBlLm11bCA9IGZ1bmN0aW9uIG11bChrKSB7XG4gIGlmICh0aGlzLl9oYXNEb3VibGVzKGspKVxuICAgIHJldHVybiB0aGlzLmN1cnZlLl9maXhlZE5hZk11bCh0aGlzLCBrKTtcbiAgZWxzZVxuICAgIHJldHVybiB0aGlzLmN1cnZlLl93bmFmTXVsKHRoaXMsIGspO1xufTtcblxuUG9pbnQucHJvdG90eXBlLm11bEFkZCA9IGZ1bmN0aW9uIG11bEFkZChrMSwgcCwgazIpIHtcbiAgcmV0dXJuIHRoaXMuY3VydmUuX3duYWZNdWxBZGQoMSwgWyB0aGlzLCBwIF0sIFsgazEsIGsyIF0sIDIpO1xufTtcblxuUG9pbnQucHJvdG90eXBlLm5vcm1hbGl6ZSA9IGZ1bmN0aW9uIG5vcm1hbGl6ZSgpIHtcbiAgaWYgKHRoaXMuek9uZSlcbiAgICByZXR1cm4gdGhpcztcblxuICAvLyBOb3JtYWxpemUgY29vcmRpbmF0ZXNcbiAgdmFyIHppID0gdGhpcy56LnJlZEludm0oKTtcbiAgdGhpcy54ID0gdGhpcy54LnJlZE11bCh6aSk7XG4gIHRoaXMueSA9IHRoaXMueS5yZWRNdWwoemkpO1xuICBpZiAodGhpcy50KVxuICAgIHRoaXMudCA9IHRoaXMudC5yZWRNdWwoemkpO1xuICB0aGlzLnogPSB0aGlzLmN1cnZlLm9uZTtcbiAgdGhpcy56T25lID0gdHJ1ZTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUubmVnID0gZnVuY3Rpb24gbmVnKCkge1xuICByZXR1cm4gdGhpcy5jdXJ2ZS5wb2ludCh0aGlzLngucmVkTmVnKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMueSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy56LFxuICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnQgJiYgdGhpcy50LnJlZE5lZygpKTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5nZXRYID0gZnVuY3Rpb24gZ2V0WCgpIHtcbiAgdGhpcy5ub3JtYWxpemUoKTtcbiAgcmV0dXJuIHRoaXMueC5mcm9tUmVkKCk7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuZ2V0WSA9IGZ1bmN0aW9uIGdldFkoKSB7XG4gIHRoaXMubm9ybWFsaXplKCk7XG4gIHJldHVybiB0aGlzLnkuZnJvbVJlZCgpO1xufTtcblxuUG9pbnQucHJvdG90eXBlLmVxID0gZnVuY3Rpb24gZXEob3RoZXIpIHtcbiAgcmV0dXJuIHRoaXMgPT09IG90aGVyIHx8XG4gICAgICAgICB0aGlzLmdldFgoKS5jbXAob3RoZXIuZ2V0WCgpKSA9PT0gMCAmJlxuICAgICAgICAgdGhpcy5nZXRZKCkuY21wKG90aGVyLmdldFkoKSkgPT09IDA7XG59O1xuXG4vLyBDb21wYXRpYmlsaXR5IHdpdGggQmFzZUN1cnZlXG5Qb2ludC5wcm90b3R5cGUudG9QID0gUG9pbnQucHJvdG90eXBlLm5vcm1hbGl6ZTtcblBvaW50LnByb3RvdHlwZS5taXhlZEFkZCA9IFBvaW50LnByb3RvdHlwZS5hZGQ7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBjdXJ2ZSA9IGV4cG9ydHM7XG5cbmN1cnZlLmJhc2UgPSByZXF1aXJlKCcuL2Jhc2UnKTtcbmN1cnZlLnNob3J0ID0gcmVxdWlyZSgnLi9zaG9ydCcpO1xuY3VydmUubW9udCA9IHJlcXVpcmUoJy4vbW9udCcpO1xuY3VydmUuZWR3YXJkcyA9IHJlcXVpcmUoJy4vZWR3YXJkcycpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgY3VydmUgPSByZXF1aXJlKCcuLi9jdXJ2ZScpO1xudmFyIEJOID0gcmVxdWlyZSgnYm4uanMnKTtcbnZhciBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG52YXIgQmFzZSA9IGN1cnZlLmJhc2U7XG5cbnZhciBlbGxpcHRpYyA9IHJlcXVpcmUoJy4uLy4uL2VsbGlwdGljJyk7XG52YXIgdXRpbHMgPSBlbGxpcHRpYy51dGlscztcblxuZnVuY3Rpb24gTW9udEN1cnZlKGNvbmYpIHtcbiAgQmFzZS5jYWxsKHRoaXMsICdtb250JywgY29uZik7XG5cbiAgdGhpcy5hID0gbmV3IEJOKGNvbmYuYSwgMTYpLnRvUmVkKHRoaXMucmVkKTtcbiAgdGhpcy5iID0gbmV3IEJOKGNvbmYuYiwgMTYpLnRvUmVkKHRoaXMucmVkKTtcbiAgdGhpcy5pNCA9IG5ldyBCTig0KS50b1JlZCh0aGlzLnJlZCkucmVkSW52bSgpO1xuICB0aGlzLnR3byA9IG5ldyBCTigyKS50b1JlZCh0aGlzLnJlZCk7XG4gIHRoaXMuYTI0ID0gdGhpcy5pNC5yZWRNdWwodGhpcy5hLnJlZEFkZCh0aGlzLnR3bykpO1xufVxuaW5oZXJpdHMoTW9udEN1cnZlLCBCYXNlKTtcbm1vZHVsZS5leHBvcnRzID0gTW9udEN1cnZlO1xuXG5Nb250Q3VydmUucHJvdG90eXBlLnZhbGlkYXRlID0gZnVuY3Rpb24gdmFsaWRhdGUocG9pbnQpIHtcbiAgdmFyIHggPSBwb2ludC5ub3JtYWxpemUoKS54O1xuICB2YXIgeDIgPSB4LnJlZFNxcigpO1xuICB2YXIgcmhzID0geDIucmVkTXVsKHgpLnJlZEFkZCh4Mi5yZWRNdWwodGhpcy5hKSkucmVkQWRkKHgpO1xuICB2YXIgeSA9IHJocy5yZWRTcXJ0KCk7XG5cbiAgcmV0dXJuIHkucmVkU3FyKCkuY21wKHJocykgPT09IDA7XG59O1xuXG5mdW5jdGlvbiBQb2ludChjdXJ2ZSwgeCwgeikge1xuICBCYXNlLkJhc2VQb2ludC5jYWxsKHRoaXMsIGN1cnZlLCAncHJvamVjdGl2ZScpO1xuICBpZiAoeCA9PT0gbnVsbCAmJiB6ID09PSBudWxsKSB7XG4gICAgdGhpcy54ID0gdGhpcy5jdXJ2ZS5vbmU7XG4gICAgdGhpcy56ID0gdGhpcy5jdXJ2ZS56ZXJvO1xuICB9IGVsc2Uge1xuICAgIHRoaXMueCA9IG5ldyBCTih4LCAxNik7XG4gICAgdGhpcy56ID0gbmV3IEJOKHosIDE2KTtcbiAgICBpZiAoIXRoaXMueC5yZWQpXG4gICAgICB0aGlzLnggPSB0aGlzLngudG9SZWQodGhpcy5jdXJ2ZS5yZWQpO1xuICAgIGlmICghdGhpcy56LnJlZClcbiAgICAgIHRoaXMueiA9IHRoaXMuei50b1JlZCh0aGlzLmN1cnZlLnJlZCk7XG4gIH1cbn1cbmluaGVyaXRzKFBvaW50LCBCYXNlLkJhc2VQb2ludCk7XG5cbk1vbnRDdXJ2ZS5wcm90b3R5cGUuZGVjb2RlUG9pbnQgPSBmdW5jdGlvbiBkZWNvZGVQb2ludChieXRlcywgZW5jKSB7XG4gIHJldHVybiB0aGlzLnBvaW50KHV0aWxzLnRvQXJyYXkoYnl0ZXMsIGVuYyksIDEpO1xufTtcblxuTW9udEN1cnZlLnByb3RvdHlwZS5wb2ludCA9IGZ1bmN0aW9uIHBvaW50KHgsIHopIHtcbiAgcmV0dXJuIG5ldyBQb2ludCh0aGlzLCB4LCB6KTtcbn07XG5cbk1vbnRDdXJ2ZS5wcm90b3R5cGUucG9pbnRGcm9tSlNPTiA9IGZ1bmN0aW9uIHBvaW50RnJvbUpTT04ob2JqKSB7XG4gIHJldHVybiBQb2ludC5mcm9tSlNPTih0aGlzLCBvYmopO1xufTtcblxuUG9pbnQucHJvdG90eXBlLnByZWNvbXB1dGUgPSBmdW5jdGlvbiBwcmVjb21wdXRlKCkge1xuICAvLyBOby1vcFxufTtcblxuUG9pbnQucHJvdG90eXBlLl9lbmNvZGUgPSBmdW5jdGlvbiBfZW5jb2RlKCkge1xuICByZXR1cm4gdGhpcy5nZXRYKCkudG9BcnJheSgnYmUnLCB0aGlzLmN1cnZlLnAuYnl0ZUxlbmd0aCgpKTtcbn07XG5cblBvaW50LmZyb21KU09OID0gZnVuY3Rpb24gZnJvbUpTT04oY3VydmUsIG9iaikge1xuICByZXR1cm4gbmV3IFBvaW50KGN1cnZlLCBvYmpbMF0sIG9ialsxXSB8fCBjdXJ2ZS5vbmUpO1xufTtcblxuUG9pbnQucHJvdG90eXBlLmluc3BlY3QgPSBmdW5jdGlvbiBpbnNwZWN0KCkge1xuICBpZiAodGhpcy5pc0luZmluaXR5KCkpXG4gICAgcmV0dXJuICc8RUMgUG9pbnQgSW5maW5pdHk+JztcbiAgcmV0dXJuICc8RUMgUG9pbnQgeDogJyArIHRoaXMueC5mcm9tUmVkKCkudG9TdHJpbmcoMTYsIDIpICtcbiAgICAgICcgejogJyArIHRoaXMuei5mcm9tUmVkKCkudG9TdHJpbmcoMTYsIDIpICsgJz4nO1xufTtcblxuUG9pbnQucHJvdG90eXBlLmlzSW5maW5pdHkgPSBmdW5jdGlvbiBpc0luZmluaXR5KCkge1xuICAvLyBYWFggVGhpcyBjb2RlIGFzc3VtZXMgdGhhdCB6ZXJvIGlzIGFsd2F5cyB6ZXJvIGluIHJlZFxuICByZXR1cm4gdGhpcy56LmNtcG4oMCkgPT09IDA7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuZGJsID0gZnVuY3Rpb24gZGJsKCkge1xuICAvLyBodHRwOi8vaHlwZXJlbGxpcHRpYy5vcmcvRUZEL2cxcC9hdXRvLW1vbnRnb20teHouaHRtbCNkb3VibGluZy1kYmwtMTk4Ny1tLTNcbiAgLy8gMk0gKyAyUyArIDRBXG5cbiAgLy8gQSA9IFgxICsgWjFcbiAgdmFyIGEgPSB0aGlzLngucmVkQWRkKHRoaXMueik7XG4gIC8vIEFBID0gQV4yXG4gIHZhciBhYSA9IGEucmVkU3FyKCk7XG4gIC8vIEIgPSBYMSAtIFoxXG4gIHZhciBiID0gdGhpcy54LnJlZFN1Yih0aGlzLnopO1xuICAvLyBCQiA9IEJeMlxuICB2YXIgYmIgPSBiLnJlZFNxcigpO1xuICAvLyBDID0gQUEgLSBCQlxuICB2YXIgYyA9IGFhLnJlZFN1YihiYik7XG4gIC8vIFgzID0gQUEgKiBCQlxuICB2YXIgbnggPSBhYS5yZWRNdWwoYmIpO1xuICAvLyBaMyA9IEMgKiAoQkIgKyBBMjQgKiBDKVxuICB2YXIgbnogPSBjLnJlZE11bChiYi5yZWRBZGQodGhpcy5jdXJ2ZS5hMjQucmVkTXVsKGMpKSk7XG4gIHJldHVybiB0aGlzLmN1cnZlLnBvaW50KG54LCBueik7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gYWRkKCkge1xuICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBzdXBwb3J0ZWQgb24gTW9udGdvbWVyeSBjdXJ2ZScpO1xufTtcblxuUG9pbnQucHJvdG90eXBlLmRpZmZBZGQgPSBmdW5jdGlvbiBkaWZmQWRkKHAsIGRpZmYpIHtcbiAgLy8gaHR0cDovL2h5cGVyZWxsaXB0aWMub3JnL0VGRC9nMXAvYXV0by1tb250Z29tLXh6Lmh0bWwjZGlmZmFkZC1kYWRkLTE5ODctbS0zXG4gIC8vIDRNICsgMlMgKyA2QVxuXG4gIC8vIEEgPSBYMiArIFoyXG4gIHZhciBhID0gdGhpcy54LnJlZEFkZCh0aGlzLnopO1xuICAvLyBCID0gWDIgLSBaMlxuICB2YXIgYiA9IHRoaXMueC5yZWRTdWIodGhpcy56KTtcbiAgLy8gQyA9IFgzICsgWjNcbiAgdmFyIGMgPSBwLngucmVkQWRkKHAueik7XG4gIC8vIEQgPSBYMyAtIFozXG4gIHZhciBkID0gcC54LnJlZFN1YihwLnopO1xuICAvLyBEQSA9IEQgKiBBXG4gIHZhciBkYSA9IGQucmVkTXVsKGEpO1xuICAvLyBDQiA9IEMgKiBCXG4gIHZhciBjYiA9IGMucmVkTXVsKGIpO1xuICAvLyBYNSA9IFoxICogKERBICsgQ0IpXjJcbiAgdmFyIG54ID0gZGlmZi56LnJlZE11bChkYS5yZWRBZGQoY2IpLnJlZFNxcigpKTtcbiAgLy8gWjUgPSBYMSAqIChEQSAtIENCKV4yXG4gIHZhciBueiA9IGRpZmYueC5yZWRNdWwoZGEucmVkSVN1YihjYikucmVkU3FyKCkpO1xuICByZXR1cm4gdGhpcy5jdXJ2ZS5wb2ludChueCwgbnopO1xufTtcblxuUG9pbnQucHJvdG90eXBlLm11bCA9IGZ1bmN0aW9uIG11bChrKSB7XG4gIHZhciB0ID0gay5jbG9uZSgpO1xuICB2YXIgYSA9IHRoaXM7IC8vIChOIC8gMikgKiBRICsgUVxuICB2YXIgYiA9IHRoaXMuY3VydmUucG9pbnQobnVsbCwgbnVsbCk7IC8vIChOIC8gMikgKiBRXG4gIHZhciBjID0gdGhpczsgLy8gUVxuXG4gIGZvciAodmFyIGJpdHMgPSBbXTsgdC5jbXBuKDApICE9PSAwOyB0Lml1c2hybigxKSlcbiAgICBiaXRzLnB1c2godC5hbmRsbigxKSk7XG5cbiAgZm9yICh2YXIgaSA9IGJpdHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBpZiAoYml0c1tpXSA9PT0gMCkge1xuICAgICAgLy8gTiAqIFEgKyBRID0gKChOIC8gMikgKiBRICsgUSkpICsgKE4gLyAyKSAqIFFcbiAgICAgIGEgPSBhLmRpZmZBZGQoYiwgYyk7XG4gICAgICAvLyBOICogUSA9IDIgKiAoKE4gLyAyKSAqIFEgKyBRKSlcbiAgICAgIGIgPSBiLmRibCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBOICogUSA9ICgoTiAvIDIpICogUSArIFEpICsgKChOIC8gMikgKiBRKVxuICAgICAgYiA9IGEuZGlmZkFkZChiLCBjKTtcbiAgICAgIC8vIE4gKiBRICsgUSA9IDIgKiAoKE4gLyAyKSAqIFEgKyBRKVxuICAgICAgYSA9IGEuZGJsKCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBiO1xufTtcblxuUG9pbnQucHJvdG90eXBlLm11bEFkZCA9IGZ1bmN0aW9uIG11bEFkZCgpIHtcbiAgdGhyb3cgbmV3IEVycm9yKCdOb3Qgc3VwcG9ydGVkIG9uIE1vbnRnb21lcnkgY3VydmUnKTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5lcSA9IGZ1bmN0aW9uIGVxKG90aGVyKSB7XG4gIHJldHVybiB0aGlzLmdldFgoKS5jbXAob3RoZXIuZ2V0WCgpKSA9PT0gMDtcbn07XG5cblBvaW50LnByb3RvdHlwZS5ub3JtYWxpemUgPSBmdW5jdGlvbiBub3JtYWxpemUoKSB7XG4gIHRoaXMueCA9IHRoaXMueC5yZWRNdWwodGhpcy56LnJlZEludm0oKSk7XG4gIHRoaXMueiA9IHRoaXMuY3VydmUub25lO1xuICByZXR1cm4gdGhpcztcbn07XG5cblBvaW50LnByb3RvdHlwZS5nZXRYID0gZnVuY3Rpb24gZ2V0WCgpIHtcbiAgLy8gTm9ybWFsaXplIGNvb3JkaW5hdGVzXG4gIHRoaXMubm9ybWFsaXplKCk7XG5cbiAgcmV0dXJuIHRoaXMueC5mcm9tUmVkKCk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgY3VydmUgPSByZXF1aXJlKCcuLi9jdXJ2ZScpO1xudmFyIGVsbGlwdGljID0gcmVxdWlyZSgnLi4vLi4vZWxsaXB0aWMnKTtcbnZhciBCTiA9IHJlcXVpcmUoJ2JuLmpzJyk7XG52YXIgaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xudmFyIEJhc2UgPSBjdXJ2ZS5iYXNlO1xuXG52YXIgYXNzZXJ0ID0gZWxsaXB0aWMudXRpbHMuYXNzZXJ0O1xuXG5mdW5jdGlvbiBTaG9ydEN1cnZlKGNvbmYpIHtcbiAgQmFzZS5jYWxsKHRoaXMsICdzaG9ydCcsIGNvbmYpO1xuXG4gIHRoaXMuYSA9IG5ldyBCTihjb25mLmEsIDE2KS50b1JlZCh0aGlzLnJlZCk7XG4gIHRoaXMuYiA9IG5ldyBCTihjb25mLmIsIDE2KS50b1JlZCh0aGlzLnJlZCk7XG4gIHRoaXMudGludiA9IHRoaXMudHdvLnJlZEludm0oKTtcblxuICB0aGlzLnplcm9BID0gdGhpcy5hLmZyb21SZWQoKS5jbXBuKDApID09PSAwO1xuICB0aGlzLnRocmVlQSA9IHRoaXMuYS5mcm9tUmVkKCkuc3ViKHRoaXMucCkuY21wbigtMykgPT09IDA7XG5cbiAgLy8gSWYgdGhlIGN1cnZlIGlzIGVuZG9tb3JwaGljLCBwcmVjYWxjdWxhdGUgYmV0YSBhbmQgbGFtYmRhXG4gIHRoaXMuZW5kbyA9IHRoaXMuX2dldEVuZG9tb3JwaGlzbShjb25mKTtcbiAgdGhpcy5fZW5kb1duYWZUMSA9IG5ldyBBcnJheSg0KTtcbiAgdGhpcy5fZW5kb1duYWZUMiA9IG5ldyBBcnJheSg0KTtcbn1cbmluaGVyaXRzKFNob3J0Q3VydmUsIEJhc2UpO1xubW9kdWxlLmV4cG9ydHMgPSBTaG9ydEN1cnZlO1xuXG5TaG9ydEN1cnZlLnByb3RvdHlwZS5fZ2V0RW5kb21vcnBoaXNtID0gZnVuY3Rpb24gX2dldEVuZG9tb3JwaGlzbShjb25mKSB7XG4gIC8vIE5vIGVmZmljaWVudCBlbmRvbW9ycGhpc21cbiAgaWYgKCF0aGlzLnplcm9BIHx8ICF0aGlzLmcgfHwgIXRoaXMubiB8fCB0aGlzLnAubW9kbigzKSAhPT0gMSlcbiAgICByZXR1cm47XG5cbiAgLy8gQ29tcHV0ZSBiZXRhIGFuZCBsYW1iZGEsIHRoYXQgbGFtYmRhICogUCA9IChiZXRhICogUHg7IFB5KVxuICB2YXIgYmV0YTtcbiAgdmFyIGxhbWJkYTtcbiAgaWYgKGNvbmYuYmV0YSkge1xuICAgIGJldGEgPSBuZXcgQk4oY29uZi5iZXRhLCAxNikudG9SZWQodGhpcy5yZWQpO1xuICB9IGVsc2Uge1xuICAgIHZhciBiZXRhcyA9IHRoaXMuX2dldEVuZG9Sb290cyh0aGlzLnApO1xuICAgIC8vIENob29zZSB0aGUgc21hbGxlc3QgYmV0YVxuICAgIGJldGEgPSBiZXRhc1swXS5jbXAoYmV0YXNbMV0pIDwgMCA/IGJldGFzWzBdIDogYmV0YXNbMV07XG4gICAgYmV0YSA9IGJldGEudG9SZWQodGhpcy5yZWQpO1xuICB9XG4gIGlmIChjb25mLmxhbWJkYSkge1xuICAgIGxhbWJkYSA9IG5ldyBCTihjb25mLmxhbWJkYSwgMTYpO1xuICB9IGVsc2Uge1xuICAgIC8vIENob29zZSB0aGUgbGFtYmRhIHRoYXQgaXMgbWF0Y2hpbmcgc2VsZWN0ZWQgYmV0YVxuICAgIHZhciBsYW1iZGFzID0gdGhpcy5fZ2V0RW5kb1Jvb3RzKHRoaXMubik7XG4gICAgaWYgKHRoaXMuZy5tdWwobGFtYmRhc1swXSkueC5jbXAodGhpcy5nLngucmVkTXVsKGJldGEpKSA9PT0gMCkge1xuICAgICAgbGFtYmRhID0gbGFtYmRhc1swXTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGFtYmRhID0gbGFtYmRhc1sxXTtcbiAgICAgIGFzc2VydCh0aGlzLmcubXVsKGxhbWJkYSkueC5jbXAodGhpcy5nLngucmVkTXVsKGJldGEpKSA9PT0gMCk7XG4gICAgfVxuICB9XG5cbiAgLy8gR2V0IGJhc2lzIHZlY3RvcnMsIHVzZWQgZm9yIGJhbGFuY2VkIGxlbmd0aC10d28gcmVwcmVzZW50YXRpb25cbiAgdmFyIGJhc2lzO1xuICBpZiAoY29uZi5iYXNpcykge1xuICAgIGJhc2lzID0gY29uZi5iYXNpcy5tYXAoZnVuY3Rpb24odmVjKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBhOiBuZXcgQk4odmVjLmEsIDE2KSxcbiAgICAgICAgYjogbmV3IEJOKHZlYy5iLCAxNilcbiAgICAgIH07XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgYmFzaXMgPSB0aGlzLl9nZXRFbmRvQmFzaXMobGFtYmRhKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgYmV0YTogYmV0YSxcbiAgICBsYW1iZGE6IGxhbWJkYSxcbiAgICBiYXNpczogYmFzaXNcbiAgfTtcbn07XG5cblNob3J0Q3VydmUucHJvdG90eXBlLl9nZXRFbmRvUm9vdHMgPSBmdW5jdGlvbiBfZ2V0RW5kb1Jvb3RzKG51bSkge1xuICAvLyBGaW5kIHJvb3RzIG9mIGZvciB4XjIgKyB4ICsgMSBpbiBGXG4gIC8vIFJvb3QgPSAoLTEgKy0gU3FydCgtMykpIC8gMlxuICAvL1xuICB2YXIgcmVkID0gbnVtID09PSB0aGlzLnAgPyB0aGlzLnJlZCA6IEJOLm1vbnQobnVtKTtcbiAgdmFyIHRpbnYgPSBuZXcgQk4oMikudG9SZWQocmVkKS5yZWRJbnZtKCk7XG4gIHZhciBudGludiA9IHRpbnYucmVkTmVnKCk7XG5cbiAgdmFyIHMgPSBuZXcgQk4oMykudG9SZWQocmVkKS5yZWROZWcoKS5yZWRTcXJ0KCkucmVkTXVsKHRpbnYpO1xuXG4gIHZhciBsMSA9IG50aW52LnJlZEFkZChzKS5mcm9tUmVkKCk7XG4gIHZhciBsMiA9IG50aW52LnJlZFN1YihzKS5mcm9tUmVkKCk7XG4gIHJldHVybiBbIGwxLCBsMiBdO1xufTtcblxuU2hvcnRDdXJ2ZS5wcm90b3R5cGUuX2dldEVuZG9CYXNpcyA9IGZ1bmN0aW9uIF9nZXRFbmRvQmFzaXMobGFtYmRhKSB7XG4gIC8vIGFwcnhTcXJ0ID49IHNxcnQodGhpcy5uKVxuICB2YXIgYXByeFNxcnQgPSB0aGlzLm4udXNocm4oTWF0aC5mbG9vcih0aGlzLm4uYml0TGVuZ3RoKCkgLyAyKSk7XG5cbiAgLy8gMy43NFxuICAvLyBSdW4gRUdDRCwgdW50aWwgcihMICsgMSkgPCBhcHJ4U3FydFxuICB2YXIgdSA9IGxhbWJkYTtcbiAgdmFyIHYgPSB0aGlzLm4uY2xvbmUoKTtcbiAgdmFyIHgxID0gbmV3IEJOKDEpO1xuICB2YXIgeTEgPSBuZXcgQk4oMCk7XG4gIHZhciB4MiA9IG5ldyBCTigwKTtcbiAgdmFyIHkyID0gbmV3IEJOKDEpO1xuXG4gIC8vIE5PVEU6IGFsbCB2ZWN0b3JzIGFyZSByb290cyBvZjogYSArIGIgKiBsYW1iZGEgPSAwIChtb2QgbilcbiAgdmFyIGEwO1xuICB2YXIgYjA7XG4gIC8vIEZpcnN0IHZlY3RvclxuICB2YXIgYTE7XG4gIHZhciBiMTtcbiAgLy8gU2Vjb25kIHZlY3RvclxuICB2YXIgYTI7XG4gIHZhciBiMjtcblxuICB2YXIgcHJldlI7XG4gIHZhciBpID0gMDtcbiAgdmFyIHI7XG4gIHZhciB4O1xuICB3aGlsZSAodS5jbXBuKDApICE9PSAwKSB7XG4gICAgdmFyIHEgPSB2LmRpdih1KTtcbiAgICByID0gdi5zdWIocS5tdWwodSkpO1xuICAgIHggPSB4Mi5zdWIocS5tdWwoeDEpKTtcbiAgICB2YXIgeSA9IHkyLnN1YihxLm11bCh5MSkpO1xuXG4gICAgaWYgKCFhMSAmJiByLmNtcChhcHJ4U3FydCkgPCAwKSB7XG4gICAgICBhMCA9IHByZXZSLm5lZygpO1xuICAgICAgYjAgPSB4MTtcbiAgICAgIGExID0gci5uZWcoKTtcbiAgICAgIGIxID0geDtcbiAgICB9IGVsc2UgaWYgKGExICYmICsraSA9PT0gMikge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHByZXZSID0gcjtcblxuICAgIHYgPSB1O1xuICAgIHUgPSByO1xuICAgIHgyID0geDE7XG4gICAgeDEgPSB4O1xuICAgIHkyID0geTE7XG4gICAgeTEgPSB5O1xuICB9XG4gIGEyID0gci5uZWcoKTtcbiAgYjIgPSB4O1xuXG4gIHZhciBsZW4xID0gYTEuc3FyKCkuYWRkKGIxLnNxcigpKTtcbiAgdmFyIGxlbjIgPSBhMi5zcXIoKS5hZGQoYjIuc3FyKCkpO1xuICBpZiAobGVuMi5jbXAobGVuMSkgPj0gMCkge1xuICAgIGEyID0gYTA7XG4gICAgYjIgPSBiMDtcbiAgfVxuXG4gIC8vIE5vcm1hbGl6ZSBzaWduc1xuICBpZiAoYTEubmVnYXRpdmUpIHtcbiAgICBhMSA9IGExLm5lZygpO1xuICAgIGIxID0gYjEubmVnKCk7XG4gIH1cbiAgaWYgKGEyLm5lZ2F0aXZlKSB7XG4gICAgYTIgPSBhMi5uZWcoKTtcbiAgICBiMiA9IGIyLm5lZygpO1xuICB9XG5cbiAgcmV0dXJuIFtcbiAgICB7IGE6IGExLCBiOiBiMSB9LFxuICAgIHsgYTogYTIsIGI6IGIyIH1cbiAgXTtcbn07XG5cblNob3J0Q3VydmUucHJvdG90eXBlLl9lbmRvU3BsaXQgPSBmdW5jdGlvbiBfZW5kb1NwbGl0KGspIHtcbiAgdmFyIGJhc2lzID0gdGhpcy5lbmRvLmJhc2lzO1xuICB2YXIgdjEgPSBiYXNpc1swXTtcbiAgdmFyIHYyID0gYmFzaXNbMV07XG5cbiAgdmFyIGMxID0gdjIuYi5tdWwoaykuZGl2Um91bmQodGhpcy5uKTtcbiAgdmFyIGMyID0gdjEuYi5uZWcoKS5tdWwoaykuZGl2Um91bmQodGhpcy5uKTtcblxuICB2YXIgcDEgPSBjMS5tdWwodjEuYSk7XG4gIHZhciBwMiA9IGMyLm11bCh2Mi5hKTtcbiAgdmFyIHExID0gYzEubXVsKHYxLmIpO1xuICB2YXIgcTIgPSBjMi5tdWwodjIuYik7XG5cbiAgLy8gQ2FsY3VsYXRlIGFuc3dlclxuICB2YXIgazEgPSBrLnN1YihwMSkuc3ViKHAyKTtcbiAgdmFyIGsyID0gcTEuYWRkKHEyKS5uZWcoKTtcbiAgcmV0dXJuIHsgazE6IGsxLCBrMjogazIgfTtcbn07XG5cblNob3J0Q3VydmUucHJvdG90eXBlLnBvaW50RnJvbVggPSBmdW5jdGlvbiBwb2ludEZyb21YKHgsIG9kZCkge1xuICB4ID0gbmV3IEJOKHgsIDE2KTtcbiAgaWYgKCF4LnJlZClcbiAgICB4ID0geC50b1JlZCh0aGlzLnJlZCk7XG5cbiAgdmFyIHkyID0geC5yZWRTcXIoKS5yZWRNdWwoeCkucmVkSUFkZCh4LnJlZE11bCh0aGlzLmEpKS5yZWRJQWRkKHRoaXMuYik7XG4gIHZhciB5ID0geTIucmVkU3FydCgpO1xuICBpZiAoeS5yZWRTcXIoKS5yZWRTdWIoeTIpLmNtcCh0aGlzLnplcm8pICE9PSAwKVxuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBwb2ludCcpO1xuXG4gIC8vIFhYWCBJcyB0aGVyZSBhbnkgd2F5IHRvIHRlbGwgaWYgdGhlIG51bWJlciBpcyBvZGQgd2l0aG91dCBjb252ZXJ0aW5nIGl0XG4gIC8vIHRvIG5vbi1yZWQgZm9ybT9cbiAgdmFyIGlzT2RkID0geS5mcm9tUmVkKCkuaXNPZGQoKTtcbiAgaWYgKG9kZCAmJiAhaXNPZGQgfHwgIW9kZCAmJiBpc09kZClcbiAgICB5ID0geS5yZWROZWcoKTtcblxuICByZXR1cm4gdGhpcy5wb2ludCh4LCB5KTtcbn07XG5cblNob3J0Q3VydmUucHJvdG90eXBlLnZhbGlkYXRlID0gZnVuY3Rpb24gdmFsaWRhdGUocG9pbnQpIHtcbiAgaWYgKHBvaW50LmluZilcbiAgICByZXR1cm4gdHJ1ZTtcblxuICB2YXIgeCA9IHBvaW50Lng7XG4gIHZhciB5ID0gcG9pbnQueTtcblxuICB2YXIgYXggPSB0aGlzLmEucmVkTXVsKHgpO1xuICB2YXIgcmhzID0geC5yZWRTcXIoKS5yZWRNdWwoeCkucmVkSUFkZChheCkucmVkSUFkZCh0aGlzLmIpO1xuICByZXR1cm4geS5yZWRTcXIoKS5yZWRJU3ViKHJocykuY21wbigwKSA9PT0gMDtcbn07XG5cblNob3J0Q3VydmUucHJvdG90eXBlLl9lbmRvV25hZk11bEFkZCA9XG4gICAgZnVuY3Rpb24gX2VuZG9XbmFmTXVsQWRkKHBvaW50cywgY29lZmZzKSB7XG4gIHZhciBucG9pbnRzID0gdGhpcy5fZW5kb1duYWZUMTtcbiAgdmFyIG5jb2VmZnMgPSB0aGlzLl9lbmRvV25hZlQyO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHBvaW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBzcGxpdCA9IHRoaXMuX2VuZG9TcGxpdChjb2VmZnNbaV0pO1xuICAgIHZhciBwID0gcG9pbnRzW2ldO1xuICAgIHZhciBiZXRhID0gcC5fZ2V0QmV0YSgpO1xuXG4gICAgaWYgKHNwbGl0LmsxLm5lZ2F0aXZlKSB7XG4gICAgICBzcGxpdC5rMS5pbmVnKCk7XG4gICAgICBwID0gcC5uZWcodHJ1ZSk7XG4gICAgfVxuICAgIGlmIChzcGxpdC5rMi5uZWdhdGl2ZSkge1xuICAgICAgc3BsaXQuazIuaW5lZygpO1xuICAgICAgYmV0YSA9IGJldGEubmVnKHRydWUpO1xuICAgIH1cblxuICAgIG5wb2ludHNbaSAqIDJdID0gcDtcbiAgICBucG9pbnRzW2kgKiAyICsgMV0gPSBiZXRhO1xuICAgIG5jb2VmZnNbaSAqIDJdID0gc3BsaXQuazE7XG4gICAgbmNvZWZmc1tpICogMiArIDFdID0gc3BsaXQuazI7XG4gIH1cbiAgdmFyIHJlcyA9IHRoaXMuX3duYWZNdWxBZGQoMSwgbnBvaW50cywgbmNvZWZmcywgaSAqIDIpO1xuXG4gIC8vIENsZWFuLXVwIHJlZmVyZW5jZXMgdG8gcG9pbnRzIGFuZCBjb2VmZmljaWVudHNcbiAgZm9yICh2YXIgaiA9IDA7IGogPCBpICogMjsgaisrKSB7XG4gICAgbnBvaW50c1tqXSA9IG51bGw7XG4gICAgbmNvZWZmc1tqXSA9IG51bGw7XG4gIH1cbiAgcmV0dXJuIHJlcztcbn07XG5cbmZ1bmN0aW9uIFBvaW50KGN1cnZlLCB4LCB5LCBpc1JlZCkge1xuICBCYXNlLkJhc2VQb2ludC5jYWxsKHRoaXMsIGN1cnZlLCAnYWZmaW5lJyk7XG4gIGlmICh4ID09PSBudWxsICYmIHkgPT09IG51bGwpIHtcbiAgICB0aGlzLnggPSBudWxsO1xuICAgIHRoaXMueSA9IG51bGw7XG4gICAgdGhpcy5pbmYgPSB0cnVlO1xuICB9IGVsc2Uge1xuICAgIHRoaXMueCA9IG5ldyBCTih4LCAxNik7XG4gICAgdGhpcy55ID0gbmV3IEJOKHksIDE2KTtcbiAgICAvLyBGb3JjZSByZWRnb21lcnkgcmVwcmVzZW50YXRpb24gd2hlbiBsb2FkaW5nIGZyb20gSlNPTlxuICAgIGlmIChpc1JlZCkge1xuICAgICAgdGhpcy54LmZvcmNlUmVkKHRoaXMuY3VydmUucmVkKTtcbiAgICAgIHRoaXMueS5mb3JjZVJlZCh0aGlzLmN1cnZlLnJlZCk7XG4gICAgfVxuICAgIGlmICghdGhpcy54LnJlZClcbiAgICAgIHRoaXMueCA9IHRoaXMueC50b1JlZCh0aGlzLmN1cnZlLnJlZCk7XG4gICAgaWYgKCF0aGlzLnkucmVkKVxuICAgICAgdGhpcy55ID0gdGhpcy55LnRvUmVkKHRoaXMuY3VydmUucmVkKTtcbiAgICB0aGlzLmluZiA9IGZhbHNlO1xuICB9XG59XG5pbmhlcml0cyhQb2ludCwgQmFzZS5CYXNlUG9pbnQpO1xuXG5TaG9ydEN1cnZlLnByb3RvdHlwZS5wb2ludCA9IGZ1bmN0aW9uIHBvaW50KHgsIHksIGlzUmVkKSB7XG4gIHJldHVybiBuZXcgUG9pbnQodGhpcywgeCwgeSwgaXNSZWQpO1xufTtcblxuU2hvcnRDdXJ2ZS5wcm90b3R5cGUucG9pbnRGcm9tSlNPTiA9IGZ1bmN0aW9uIHBvaW50RnJvbUpTT04ob2JqLCByZWQpIHtcbiAgcmV0dXJuIFBvaW50LmZyb21KU09OKHRoaXMsIG9iaiwgcmVkKTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5fZ2V0QmV0YSA9IGZ1bmN0aW9uIF9nZXRCZXRhKCkge1xuICBpZiAoIXRoaXMuY3VydmUuZW5kbylcbiAgICByZXR1cm47XG5cbiAgdmFyIHByZSA9IHRoaXMucHJlY29tcHV0ZWQ7XG4gIGlmIChwcmUgJiYgcHJlLmJldGEpXG4gICAgcmV0dXJuIHByZS5iZXRhO1xuXG4gIHZhciBiZXRhID0gdGhpcy5jdXJ2ZS5wb2ludCh0aGlzLngucmVkTXVsKHRoaXMuY3VydmUuZW5kby5iZXRhKSwgdGhpcy55KTtcbiAgaWYgKHByZSkge1xuICAgIHZhciBjdXJ2ZSA9IHRoaXMuY3VydmU7XG4gICAgdmFyIGVuZG9NdWwgPSBmdW5jdGlvbihwKSB7XG4gICAgICByZXR1cm4gY3VydmUucG9pbnQocC54LnJlZE11bChjdXJ2ZS5lbmRvLmJldGEpLCBwLnkpO1xuICAgIH07XG4gICAgcHJlLmJldGEgPSBiZXRhO1xuICAgIGJldGEucHJlY29tcHV0ZWQgPSB7XG4gICAgICBiZXRhOiBudWxsLFxuICAgICAgbmFmOiBwcmUubmFmICYmIHtcbiAgICAgICAgd25kOiBwcmUubmFmLnduZCxcbiAgICAgICAgcG9pbnRzOiBwcmUubmFmLnBvaW50cy5tYXAoZW5kb011bClcbiAgICAgIH0sXG4gICAgICBkb3VibGVzOiBwcmUuZG91YmxlcyAmJiB7XG4gICAgICAgIHN0ZXA6IHByZS5kb3VibGVzLnN0ZXAsXG4gICAgICAgIHBvaW50czogcHJlLmRvdWJsZXMucG9pbnRzLm1hcChlbmRvTXVsKVxuICAgICAgfVxuICAgIH07XG4gIH1cbiAgcmV0dXJuIGJldGE7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gdG9KU09OKCkge1xuICBpZiAoIXRoaXMucHJlY29tcHV0ZWQpXG4gICAgcmV0dXJuIFsgdGhpcy54LCB0aGlzLnkgXTtcblxuICByZXR1cm4gWyB0aGlzLngsIHRoaXMueSwgdGhpcy5wcmVjb21wdXRlZCAmJiB7XG4gICAgZG91YmxlczogdGhpcy5wcmVjb21wdXRlZC5kb3VibGVzICYmIHtcbiAgICAgIHN0ZXA6IHRoaXMucHJlY29tcHV0ZWQuZG91Ymxlcy5zdGVwLFxuICAgICAgcG9pbnRzOiB0aGlzLnByZWNvbXB1dGVkLmRvdWJsZXMucG9pbnRzLnNsaWNlKDEpXG4gICAgfSxcbiAgICBuYWY6IHRoaXMucHJlY29tcHV0ZWQubmFmICYmIHtcbiAgICAgIHduZDogdGhpcy5wcmVjb21wdXRlZC5uYWYud25kLFxuICAgICAgcG9pbnRzOiB0aGlzLnByZWNvbXB1dGVkLm5hZi5wb2ludHMuc2xpY2UoMSlcbiAgICB9XG4gIH0gXTtcbn07XG5cblBvaW50LmZyb21KU09OID0gZnVuY3Rpb24gZnJvbUpTT04oY3VydmUsIG9iaiwgcmVkKSB7XG4gIGlmICh0eXBlb2Ygb2JqID09PSAnc3RyaW5nJylcbiAgICBvYmogPSBKU09OLnBhcnNlKG9iaik7XG4gIHZhciByZXMgPSBjdXJ2ZS5wb2ludChvYmpbMF0sIG9ialsxXSwgcmVkKTtcbiAgaWYgKCFvYmpbMl0pXG4gICAgcmV0dXJuIHJlcztcblxuICBmdW5jdGlvbiBvYmoycG9pbnQob2JqKSB7XG4gICAgcmV0dXJuIGN1cnZlLnBvaW50KG9ialswXSwgb2JqWzFdLCByZWQpO1xuICB9XG5cbiAgdmFyIHByZSA9IG9ialsyXTtcbiAgcmVzLnByZWNvbXB1dGVkID0ge1xuICAgIGJldGE6IG51bGwsXG4gICAgZG91YmxlczogcHJlLmRvdWJsZXMgJiYge1xuICAgICAgc3RlcDogcHJlLmRvdWJsZXMuc3RlcCxcbiAgICAgIHBvaW50czogWyByZXMgXS5jb25jYXQocHJlLmRvdWJsZXMucG9pbnRzLm1hcChvYmoycG9pbnQpKVxuICAgIH0sXG4gICAgbmFmOiBwcmUubmFmICYmIHtcbiAgICAgIHduZDogcHJlLm5hZi53bmQsXG4gICAgICBwb2ludHM6IFsgcmVzIF0uY29uY2F0KHByZS5uYWYucG9pbnRzLm1hcChvYmoycG9pbnQpKVxuICAgIH1cbiAgfTtcbiAgcmV0dXJuIHJlcztcbn07XG5cblBvaW50LnByb3RvdHlwZS5pbnNwZWN0ID0gZnVuY3Rpb24gaW5zcGVjdCgpIHtcbiAgaWYgKHRoaXMuaXNJbmZpbml0eSgpKVxuICAgIHJldHVybiAnPEVDIFBvaW50IEluZmluaXR5Pic7XG4gIHJldHVybiAnPEVDIFBvaW50IHg6ICcgKyB0aGlzLnguZnJvbVJlZCgpLnRvU3RyaW5nKDE2LCAyKSArXG4gICAgICAnIHk6ICcgKyB0aGlzLnkuZnJvbVJlZCgpLnRvU3RyaW5nKDE2LCAyKSArICc+Jztcbn07XG5cblBvaW50LnByb3RvdHlwZS5pc0luZmluaXR5ID0gZnVuY3Rpb24gaXNJbmZpbml0eSgpIHtcbiAgcmV0dXJuIHRoaXMuaW5mO1xufTtcblxuUG9pbnQucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIGFkZChwKSB7XG4gIC8vIE8gKyBQID0gUFxuICBpZiAodGhpcy5pbmYpXG4gICAgcmV0dXJuIHA7XG5cbiAgLy8gUCArIE8gPSBQXG4gIGlmIChwLmluZilcbiAgICByZXR1cm4gdGhpcztcblxuICAvLyBQICsgUCA9IDJQXG4gIGlmICh0aGlzLmVxKHApKVxuICAgIHJldHVybiB0aGlzLmRibCgpO1xuXG4gIC8vIFAgKyAoLVApID0gT1xuICBpZiAodGhpcy5uZWcoKS5lcShwKSlcbiAgICByZXR1cm4gdGhpcy5jdXJ2ZS5wb2ludChudWxsLCBudWxsKTtcblxuICAvLyBQICsgUSA9IE9cbiAgaWYgKHRoaXMueC5jbXAocC54KSA9PT0gMClcbiAgICByZXR1cm4gdGhpcy5jdXJ2ZS5wb2ludChudWxsLCBudWxsKTtcblxuICB2YXIgYyA9IHRoaXMueS5yZWRTdWIocC55KTtcbiAgaWYgKGMuY21wbigwKSAhPT0gMClcbiAgICBjID0gYy5yZWRNdWwodGhpcy54LnJlZFN1YihwLngpLnJlZEludm0oKSk7XG4gIHZhciBueCA9IGMucmVkU3FyKCkucmVkSVN1Yih0aGlzLngpLnJlZElTdWIocC54KTtcbiAgdmFyIG55ID0gYy5yZWRNdWwodGhpcy54LnJlZFN1YihueCkpLnJlZElTdWIodGhpcy55KTtcbiAgcmV0dXJuIHRoaXMuY3VydmUucG9pbnQobngsIG55KTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5kYmwgPSBmdW5jdGlvbiBkYmwoKSB7XG4gIGlmICh0aGlzLmluZilcbiAgICByZXR1cm4gdGhpcztcblxuICAvLyAyUCA9IE9cbiAgdmFyIHlzMSA9IHRoaXMueS5yZWRBZGQodGhpcy55KTtcbiAgaWYgKHlzMS5jbXBuKDApID09PSAwKVxuICAgIHJldHVybiB0aGlzLmN1cnZlLnBvaW50KG51bGwsIG51bGwpO1xuXG4gIHZhciBhID0gdGhpcy5jdXJ2ZS5hO1xuXG4gIHZhciB4MiA9IHRoaXMueC5yZWRTcXIoKTtcbiAgdmFyIGR5aW52ID0geXMxLnJlZEludm0oKTtcbiAgdmFyIGMgPSB4Mi5yZWRBZGQoeDIpLnJlZElBZGQoeDIpLnJlZElBZGQoYSkucmVkTXVsKGR5aW52KTtcblxuICB2YXIgbnggPSBjLnJlZFNxcigpLnJlZElTdWIodGhpcy54LnJlZEFkZCh0aGlzLngpKTtcbiAgdmFyIG55ID0gYy5yZWRNdWwodGhpcy54LnJlZFN1YihueCkpLnJlZElTdWIodGhpcy55KTtcbiAgcmV0dXJuIHRoaXMuY3VydmUucG9pbnQobngsIG55KTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5nZXRYID0gZnVuY3Rpb24gZ2V0WCgpIHtcbiAgcmV0dXJuIHRoaXMueC5mcm9tUmVkKCk7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuZ2V0WSA9IGZ1bmN0aW9uIGdldFkoKSB7XG4gIHJldHVybiB0aGlzLnkuZnJvbVJlZCgpO1xufTtcblxuUG9pbnQucHJvdG90eXBlLm11bCA9IGZ1bmN0aW9uIG11bChrKSB7XG4gIGsgPSBuZXcgQk4oaywgMTYpO1xuXG4gIGlmICh0aGlzLl9oYXNEb3VibGVzKGspKVxuICAgIHJldHVybiB0aGlzLmN1cnZlLl9maXhlZE5hZk11bCh0aGlzLCBrKTtcbiAgZWxzZSBpZiAodGhpcy5jdXJ2ZS5lbmRvKVxuICAgIHJldHVybiB0aGlzLmN1cnZlLl9lbmRvV25hZk11bEFkZChbIHRoaXMgXSwgWyBrIF0pO1xuICBlbHNlXG4gICAgcmV0dXJuIHRoaXMuY3VydmUuX3duYWZNdWwodGhpcywgayk7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUubXVsQWRkID0gZnVuY3Rpb24gbXVsQWRkKGsxLCBwMiwgazIpIHtcbiAgdmFyIHBvaW50cyA9IFsgdGhpcywgcDIgXTtcbiAgdmFyIGNvZWZmcyA9IFsgazEsIGsyIF07XG4gIGlmICh0aGlzLmN1cnZlLmVuZG8pXG4gICAgcmV0dXJuIHRoaXMuY3VydmUuX2VuZG9XbmFmTXVsQWRkKHBvaW50cywgY29lZmZzKTtcbiAgZWxzZVxuICAgIHJldHVybiB0aGlzLmN1cnZlLl93bmFmTXVsQWRkKDEsIHBvaW50cywgY29lZmZzLCAyKTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5lcSA9IGZ1bmN0aW9uIGVxKHApIHtcbiAgcmV0dXJuIHRoaXMgPT09IHAgfHxcbiAgICAgICAgIHRoaXMuaW5mID09PSBwLmluZiAmJlxuICAgICAgICAgICAgICh0aGlzLmluZiB8fCB0aGlzLnguY21wKHAueCkgPT09IDAgJiYgdGhpcy55LmNtcChwLnkpID09PSAwKTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5uZWcgPSBmdW5jdGlvbiBuZWcoX3ByZWNvbXB1dGUpIHtcbiAgaWYgKHRoaXMuaW5mKVxuICAgIHJldHVybiB0aGlzO1xuXG4gIHZhciByZXMgPSB0aGlzLmN1cnZlLnBvaW50KHRoaXMueCwgdGhpcy55LnJlZE5lZygpKTtcbiAgaWYgKF9wcmVjb21wdXRlICYmIHRoaXMucHJlY29tcHV0ZWQpIHtcbiAgICB2YXIgcHJlID0gdGhpcy5wcmVjb21wdXRlZDtcbiAgICB2YXIgbmVnYXRlID0gZnVuY3Rpb24ocCkge1xuICAgICAgcmV0dXJuIHAubmVnKCk7XG4gICAgfTtcbiAgICByZXMucHJlY29tcHV0ZWQgPSB7XG4gICAgICBuYWY6IHByZS5uYWYgJiYge1xuICAgICAgICB3bmQ6IHByZS5uYWYud25kLFxuICAgICAgICBwb2ludHM6IHByZS5uYWYucG9pbnRzLm1hcChuZWdhdGUpXG4gICAgICB9LFxuICAgICAgZG91YmxlczogcHJlLmRvdWJsZXMgJiYge1xuICAgICAgICBzdGVwOiBwcmUuZG91Ymxlcy5zdGVwLFxuICAgICAgICBwb2ludHM6IHByZS5kb3VibGVzLnBvaW50cy5tYXAobmVnYXRlKVxuICAgICAgfVxuICAgIH07XG4gIH1cbiAgcmV0dXJuIHJlcztcbn07XG5cblBvaW50LnByb3RvdHlwZS50b0ogPSBmdW5jdGlvbiB0b0ooKSB7XG4gIGlmICh0aGlzLmluZilcbiAgICByZXR1cm4gdGhpcy5jdXJ2ZS5qcG9pbnQobnVsbCwgbnVsbCwgbnVsbCk7XG5cbiAgdmFyIHJlcyA9IHRoaXMuY3VydmUuanBvaW50KHRoaXMueCwgdGhpcy55LCB0aGlzLmN1cnZlLm9uZSk7XG4gIHJldHVybiByZXM7XG59O1xuXG5mdW5jdGlvbiBKUG9pbnQoY3VydmUsIHgsIHksIHopIHtcbiAgQmFzZS5CYXNlUG9pbnQuY2FsbCh0aGlzLCBjdXJ2ZSwgJ2phY29iaWFuJyk7XG4gIGlmICh4ID09PSBudWxsICYmIHkgPT09IG51bGwgJiYgeiA9PT0gbnVsbCkge1xuICAgIHRoaXMueCA9IHRoaXMuY3VydmUub25lO1xuICAgIHRoaXMueSA9IHRoaXMuY3VydmUub25lO1xuICAgIHRoaXMueiA9IG5ldyBCTigwKTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLnggPSBuZXcgQk4oeCwgMTYpO1xuICAgIHRoaXMueSA9IG5ldyBCTih5LCAxNik7XG4gICAgdGhpcy56ID0gbmV3IEJOKHosIDE2KTtcbiAgfVxuICBpZiAoIXRoaXMueC5yZWQpXG4gICAgdGhpcy54ID0gdGhpcy54LnRvUmVkKHRoaXMuY3VydmUucmVkKTtcbiAgaWYgKCF0aGlzLnkucmVkKVxuICAgIHRoaXMueSA9IHRoaXMueS50b1JlZCh0aGlzLmN1cnZlLnJlZCk7XG4gIGlmICghdGhpcy56LnJlZClcbiAgICB0aGlzLnogPSB0aGlzLnoudG9SZWQodGhpcy5jdXJ2ZS5yZWQpO1xuXG4gIHRoaXMuek9uZSA9IHRoaXMueiA9PT0gdGhpcy5jdXJ2ZS5vbmU7XG59XG5pbmhlcml0cyhKUG9pbnQsIEJhc2UuQmFzZVBvaW50KTtcblxuU2hvcnRDdXJ2ZS5wcm90b3R5cGUuanBvaW50ID0gZnVuY3Rpb24ganBvaW50KHgsIHksIHopIHtcbiAgcmV0dXJuIG5ldyBKUG9pbnQodGhpcywgeCwgeSwgeik7XG59O1xuXG5KUG9pbnQucHJvdG90eXBlLnRvUCA9IGZ1bmN0aW9uIHRvUCgpIHtcbiAgaWYgKHRoaXMuaXNJbmZpbml0eSgpKVxuICAgIHJldHVybiB0aGlzLmN1cnZlLnBvaW50KG51bGwsIG51bGwpO1xuXG4gIHZhciB6aW52ID0gdGhpcy56LnJlZEludm0oKTtcbiAgdmFyIHppbnYyID0gemludi5yZWRTcXIoKTtcbiAgdmFyIGF4ID0gdGhpcy54LnJlZE11bCh6aW52Mik7XG4gIHZhciBheSA9IHRoaXMueS5yZWRNdWwoemludjIpLnJlZE11bCh6aW52KTtcblxuICByZXR1cm4gdGhpcy5jdXJ2ZS5wb2ludChheCwgYXkpO1xufTtcblxuSlBvaW50LnByb3RvdHlwZS5uZWcgPSBmdW5jdGlvbiBuZWcoKSB7XG4gIHJldHVybiB0aGlzLmN1cnZlLmpwb2ludCh0aGlzLngsIHRoaXMueS5yZWROZWcoKSwgdGhpcy56KTtcbn07XG5cbkpQb2ludC5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gYWRkKHApIHtcbiAgLy8gTyArIFAgPSBQXG4gIGlmICh0aGlzLmlzSW5maW5pdHkoKSlcbiAgICByZXR1cm4gcDtcblxuICAvLyBQICsgTyA9IFBcbiAgaWYgKHAuaXNJbmZpbml0eSgpKVxuICAgIHJldHVybiB0aGlzO1xuXG4gIC8vIDEyTSArIDRTICsgN0FcbiAgdmFyIHB6MiA9IHAuei5yZWRTcXIoKTtcbiAgdmFyIHoyID0gdGhpcy56LnJlZFNxcigpO1xuICB2YXIgdTEgPSB0aGlzLngucmVkTXVsKHB6Mik7XG4gIHZhciB1MiA9IHAueC5yZWRNdWwoejIpO1xuICB2YXIgczEgPSB0aGlzLnkucmVkTXVsKHB6Mi5yZWRNdWwocC56KSk7XG4gIHZhciBzMiA9IHAueS5yZWRNdWwoejIucmVkTXVsKHRoaXMueikpO1xuXG4gIHZhciBoID0gdTEucmVkU3ViKHUyKTtcbiAgdmFyIHIgPSBzMS5yZWRTdWIoczIpO1xuICBpZiAoaC5jbXBuKDApID09PSAwKSB7XG4gICAgaWYgKHIuY21wbigwKSAhPT0gMClcbiAgICAgIHJldHVybiB0aGlzLmN1cnZlLmpwb2ludChudWxsLCBudWxsLCBudWxsKTtcbiAgICBlbHNlXG4gICAgICByZXR1cm4gdGhpcy5kYmwoKTtcbiAgfVxuXG4gIHZhciBoMiA9IGgucmVkU3FyKCk7XG4gIHZhciBoMyA9IGgyLnJlZE11bChoKTtcbiAgdmFyIHYgPSB1MS5yZWRNdWwoaDIpO1xuXG4gIHZhciBueCA9IHIucmVkU3FyKCkucmVkSUFkZChoMykucmVkSVN1Yih2KS5yZWRJU3ViKHYpO1xuICB2YXIgbnkgPSByLnJlZE11bCh2LnJlZElTdWIobngpKS5yZWRJU3ViKHMxLnJlZE11bChoMykpO1xuICB2YXIgbnogPSB0aGlzLnoucmVkTXVsKHAueikucmVkTXVsKGgpO1xuXG4gIHJldHVybiB0aGlzLmN1cnZlLmpwb2ludChueCwgbnksIG56KTtcbn07XG5cbkpQb2ludC5wcm90b3R5cGUubWl4ZWRBZGQgPSBmdW5jdGlvbiBtaXhlZEFkZChwKSB7XG4gIC8vIE8gKyBQID0gUFxuICBpZiAodGhpcy5pc0luZmluaXR5KCkpXG4gICAgcmV0dXJuIHAudG9KKCk7XG5cbiAgLy8gUCArIE8gPSBQXG4gIGlmIChwLmlzSW5maW5pdHkoKSlcbiAgICByZXR1cm4gdGhpcztcblxuICAvLyA4TSArIDNTICsgN0FcbiAgdmFyIHoyID0gdGhpcy56LnJlZFNxcigpO1xuICB2YXIgdTEgPSB0aGlzLng7XG4gIHZhciB1MiA9IHAueC5yZWRNdWwoejIpO1xuICB2YXIgczEgPSB0aGlzLnk7XG4gIHZhciBzMiA9IHAueS5yZWRNdWwoejIpLnJlZE11bCh0aGlzLnopO1xuXG4gIHZhciBoID0gdTEucmVkU3ViKHUyKTtcbiAgdmFyIHIgPSBzMS5yZWRTdWIoczIpO1xuICBpZiAoaC5jbXBuKDApID09PSAwKSB7XG4gICAgaWYgKHIuY21wbigwKSAhPT0gMClcbiAgICAgIHJldHVybiB0aGlzLmN1cnZlLmpwb2ludChudWxsLCBudWxsLCBudWxsKTtcbiAgICBlbHNlXG4gICAgICByZXR1cm4gdGhpcy5kYmwoKTtcbiAgfVxuXG4gIHZhciBoMiA9IGgucmVkU3FyKCk7XG4gIHZhciBoMyA9IGgyLnJlZE11bChoKTtcbiAgdmFyIHYgPSB1MS5yZWRNdWwoaDIpO1xuXG4gIHZhciBueCA9IHIucmVkU3FyKCkucmVkSUFkZChoMykucmVkSVN1Yih2KS5yZWRJU3ViKHYpO1xuICB2YXIgbnkgPSByLnJlZE11bCh2LnJlZElTdWIobngpKS5yZWRJU3ViKHMxLnJlZE11bChoMykpO1xuICB2YXIgbnogPSB0aGlzLnoucmVkTXVsKGgpO1xuXG4gIHJldHVybiB0aGlzLmN1cnZlLmpwb2ludChueCwgbnksIG56KTtcbn07XG5cbkpQb2ludC5wcm90b3R5cGUuZGJscCA9IGZ1bmN0aW9uIGRibHAocG93KSB7XG4gIGlmIChwb3cgPT09IDApXG4gICAgcmV0dXJuIHRoaXM7XG4gIGlmICh0aGlzLmlzSW5maW5pdHkoKSlcbiAgICByZXR1cm4gdGhpcztcbiAgaWYgKCFwb3cpXG4gICAgcmV0dXJuIHRoaXMuZGJsKCk7XG5cbiAgaWYgKHRoaXMuY3VydmUuemVyb0EgfHwgdGhpcy5jdXJ2ZS50aHJlZUEpIHtcbiAgICB2YXIgciA9IHRoaXM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwb3c7IGkrKylcbiAgICAgIHIgPSByLmRibCgpO1xuICAgIHJldHVybiByO1xuICB9XG5cbiAgLy8gMU0gKyAyUyArIDFBICsgTiAqICg0UyArIDVNICsgOEEpXG4gIC8vIE4gPSAxID0+IDZNICsgNlMgKyA5QVxuICB2YXIgYSA9IHRoaXMuY3VydmUuYTtcbiAgdmFyIHRpbnYgPSB0aGlzLmN1cnZlLnRpbnY7XG5cbiAgdmFyIGp4ID0gdGhpcy54O1xuICB2YXIgankgPSB0aGlzLnk7XG4gIHZhciBqeiA9IHRoaXMuejtcbiAgdmFyIGp6NCA9IGp6LnJlZFNxcigpLnJlZFNxcigpO1xuXG4gIC8vIFJldXNlIHJlc3VsdHNcbiAgdmFyIGp5ZCA9IGp5LnJlZEFkZChqeSk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcG93OyBpKyspIHtcbiAgICB2YXIgangyID0gangucmVkU3FyKCk7XG4gICAgdmFyIGp5ZDIgPSBqeWQucmVkU3FyKCk7XG4gICAgdmFyIGp5ZDQgPSBqeWQyLnJlZFNxcigpO1xuICAgIHZhciBjID0gangyLnJlZEFkZChqeDIpLnJlZElBZGQoangyKS5yZWRJQWRkKGEucmVkTXVsKGp6NCkpO1xuXG4gICAgdmFyIHQxID0gangucmVkTXVsKGp5ZDIpO1xuICAgIHZhciBueCA9IGMucmVkU3FyKCkucmVkSVN1Yih0MS5yZWRBZGQodDEpKTtcbiAgICB2YXIgdDIgPSB0MS5yZWRJU3ViKG54KTtcbiAgICB2YXIgZG55ID0gYy5yZWRNdWwodDIpO1xuICAgIGRueSA9IGRueS5yZWRJQWRkKGRueSkucmVkSVN1YihqeWQ0KTtcbiAgICB2YXIgbnogPSBqeWQucmVkTXVsKGp6KTtcbiAgICBpZiAoaSArIDEgPCBwb3cpXG4gICAgICBqejQgPSBqejQucmVkTXVsKGp5ZDQpO1xuXG4gICAganggPSBueDtcbiAgICBqeiA9IG56O1xuICAgIGp5ZCA9IGRueTtcbiAgfVxuXG4gIHJldHVybiB0aGlzLmN1cnZlLmpwb2ludChqeCwganlkLnJlZE11bCh0aW52KSwganopO1xufTtcblxuSlBvaW50LnByb3RvdHlwZS5kYmwgPSBmdW5jdGlvbiBkYmwoKSB7XG4gIGlmICh0aGlzLmlzSW5maW5pdHkoKSlcbiAgICByZXR1cm4gdGhpcztcblxuICBpZiAodGhpcy5jdXJ2ZS56ZXJvQSlcbiAgICByZXR1cm4gdGhpcy5femVyb0RibCgpO1xuICBlbHNlIGlmICh0aGlzLmN1cnZlLnRocmVlQSlcbiAgICByZXR1cm4gdGhpcy5fdGhyZWVEYmwoKTtcbiAgZWxzZVxuICAgIHJldHVybiB0aGlzLl9kYmwoKTtcbn07XG5cbkpQb2ludC5wcm90b3R5cGUuX3plcm9EYmwgPSBmdW5jdGlvbiBfemVyb0RibCgpIHtcbiAgdmFyIG54O1xuICB2YXIgbnk7XG4gIHZhciBuejtcbiAgLy8gWiA9IDFcbiAgaWYgKHRoaXMuek9uZSkge1xuICAgIC8vIGh5cGVyZWxsaXB0aWMub3JnL0VGRC9nMXAvYXV0by1zaG9ydHctamFjb2JpYW4tMC5odG1sXG4gICAgLy8gICAgICNkb3VibGluZy1tZGJsLTIwMDctYmxcbiAgICAvLyAxTSArIDVTICsgMTRBXG5cbiAgICAvLyBYWCA9IFgxXjJcbiAgICB2YXIgeHggPSB0aGlzLngucmVkU3FyKCk7XG4gICAgLy8gWVkgPSBZMV4yXG4gICAgdmFyIHl5ID0gdGhpcy55LnJlZFNxcigpO1xuICAgIC8vIFlZWVkgPSBZWV4yXG4gICAgdmFyIHl5eXkgPSB5eS5yZWRTcXIoKTtcbiAgICAvLyBTID0gMiAqICgoWDEgKyBZWSleMiAtIFhYIC0gWVlZWSlcbiAgICB2YXIgcyA9IHRoaXMueC5yZWRBZGQoeXkpLnJlZFNxcigpLnJlZElTdWIoeHgpLnJlZElTdWIoeXl5eSk7XG4gICAgcyA9IHMucmVkSUFkZChzKTtcbiAgICAvLyBNID0gMyAqIFhYICsgYTsgYSA9IDBcbiAgICB2YXIgbSA9IHh4LnJlZEFkZCh4eCkucmVkSUFkZCh4eCk7XG4gICAgLy8gVCA9IE0gXiAyIC0gMipTXG4gICAgdmFyIHQgPSBtLnJlZFNxcigpLnJlZElTdWIocykucmVkSVN1YihzKTtcblxuICAgIC8vIDggKiBZWVlZXG4gICAgdmFyIHl5eXk4ID0geXl5eS5yZWRJQWRkKHl5eXkpO1xuICAgIHl5eXk4ID0geXl5eTgucmVkSUFkZCh5eXl5OCk7XG4gICAgeXl5eTggPSB5eXl5OC5yZWRJQWRkKHl5eXk4KTtcblxuICAgIC8vIFgzID0gVFxuICAgIG54ID0gdDtcbiAgICAvLyBZMyA9IE0gKiAoUyAtIFQpIC0gOCAqIFlZWVlcbiAgICBueSA9IG0ucmVkTXVsKHMucmVkSVN1Yih0KSkucmVkSVN1Yih5eXl5OCk7XG4gICAgLy8gWjMgPSAyKlkxXG4gICAgbnogPSB0aGlzLnkucmVkQWRkKHRoaXMueSk7XG4gIH0gZWxzZSB7XG4gICAgLy8gaHlwZXJlbGxpcHRpYy5vcmcvRUZEL2cxcC9hdXRvLXNob3J0dy1qYWNvYmlhbi0wLmh0bWxcbiAgICAvLyAgICAgI2RvdWJsaW5nLWRibC0yMDA5LWxcbiAgICAvLyAyTSArIDVTICsgMTNBXG5cbiAgICAvLyBBID0gWDFeMlxuICAgIHZhciBhID0gdGhpcy54LnJlZFNxcigpO1xuICAgIC8vIEIgPSBZMV4yXG4gICAgdmFyIGIgPSB0aGlzLnkucmVkU3FyKCk7XG4gICAgLy8gQyA9IEJeMlxuICAgIHZhciBjID0gYi5yZWRTcXIoKTtcbiAgICAvLyBEID0gMiAqICgoWDEgKyBCKV4yIC0gQSAtIEMpXG4gICAgdmFyIGQgPSB0aGlzLngucmVkQWRkKGIpLnJlZFNxcigpLnJlZElTdWIoYSkucmVkSVN1YihjKTtcbiAgICBkID0gZC5yZWRJQWRkKGQpO1xuICAgIC8vIEUgPSAzICogQVxuICAgIHZhciBlID0gYS5yZWRBZGQoYSkucmVkSUFkZChhKTtcbiAgICAvLyBGID0gRV4yXG4gICAgdmFyIGYgPSBlLnJlZFNxcigpO1xuXG4gICAgLy8gOCAqIENcbiAgICB2YXIgYzggPSBjLnJlZElBZGQoYyk7XG4gICAgYzggPSBjOC5yZWRJQWRkKGM4KTtcbiAgICBjOCA9IGM4LnJlZElBZGQoYzgpO1xuXG4gICAgLy8gWDMgPSBGIC0gMiAqIERcbiAgICBueCA9IGYucmVkSVN1YihkKS5yZWRJU3ViKGQpO1xuICAgIC8vIFkzID0gRSAqIChEIC0gWDMpIC0gOCAqIENcbiAgICBueSA9IGUucmVkTXVsKGQucmVkSVN1YihueCkpLnJlZElTdWIoYzgpO1xuICAgIC8vIFozID0gMiAqIFkxICogWjFcbiAgICBueiA9IHRoaXMueS5yZWRNdWwodGhpcy56KTtcbiAgICBueiA9IG56LnJlZElBZGQobnopO1xuICB9XG5cbiAgcmV0dXJuIHRoaXMuY3VydmUuanBvaW50KG54LCBueSwgbnopO1xufTtcblxuSlBvaW50LnByb3RvdHlwZS5fdGhyZWVEYmwgPSBmdW5jdGlvbiBfdGhyZWVEYmwoKSB7XG4gIHZhciBueDtcbiAgdmFyIG55O1xuICB2YXIgbno7XG4gIC8vIFogPSAxXG4gIGlmICh0aGlzLnpPbmUpIHtcbiAgICAvLyBoeXBlcmVsbGlwdGljLm9yZy9FRkQvZzFwL2F1dG8tc2hvcnR3LWphY29iaWFuLTMuaHRtbFxuICAgIC8vICAgICAjZG91YmxpbmctbWRibC0yMDA3LWJsXG4gICAgLy8gMU0gKyA1UyArIDE1QVxuXG4gICAgLy8gWFggPSBYMV4yXG4gICAgdmFyIHh4ID0gdGhpcy54LnJlZFNxcigpO1xuICAgIC8vIFlZID0gWTFeMlxuICAgIHZhciB5eSA9IHRoaXMueS5yZWRTcXIoKTtcbiAgICAvLyBZWVlZID0gWVleMlxuICAgIHZhciB5eXl5ID0geXkucmVkU3FyKCk7XG4gICAgLy8gUyA9IDIgKiAoKFgxICsgWVkpXjIgLSBYWCAtIFlZWVkpXG4gICAgdmFyIHMgPSB0aGlzLngucmVkQWRkKHl5KS5yZWRTcXIoKS5yZWRJU3ViKHh4KS5yZWRJU3ViKHl5eXkpO1xuICAgIHMgPSBzLnJlZElBZGQocyk7XG4gICAgLy8gTSA9IDMgKiBYWCArIGFcbiAgICB2YXIgbSA9IHh4LnJlZEFkZCh4eCkucmVkSUFkZCh4eCkucmVkSUFkZCh0aGlzLmN1cnZlLmEpO1xuICAgIC8vIFQgPSBNXjIgLSAyICogU1xuICAgIHZhciB0ID0gbS5yZWRTcXIoKS5yZWRJU3ViKHMpLnJlZElTdWIocyk7XG4gICAgLy8gWDMgPSBUXG4gICAgbnggPSB0O1xuICAgIC8vIFkzID0gTSAqIChTIC0gVCkgLSA4ICogWVlZWVxuICAgIHZhciB5eXl5OCA9IHl5eXkucmVkSUFkZCh5eXl5KTtcbiAgICB5eXl5OCA9IHl5eXk4LnJlZElBZGQoeXl5eTgpO1xuICAgIHl5eXk4ID0geXl5eTgucmVkSUFkZCh5eXl5OCk7XG4gICAgbnkgPSBtLnJlZE11bChzLnJlZElTdWIodCkpLnJlZElTdWIoeXl5eTgpO1xuICAgIC8vIFozID0gMiAqIFkxXG4gICAgbnogPSB0aGlzLnkucmVkQWRkKHRoaXMueSk7XG4gIH0gZWxzZSB7XG4gICAgLy8gaHlwZXJlbGxpcHRpYy5vcmcvRUZEL2cxcC9hdXRvLXNob3J0dy1qYWNvYmlhbi0zLmh0bWwjZG91YmxpbmctZGJsLTIwMDEtYlxuICAgIC8vIDNNICsgNVNcblxuICAgIC8vIGRlbHRhID0gWjFeMlxuICAgIHZhciBkZWx0YSA9IHRoaXMuei5yZWRTcXIoKTtcbiAgICAvLyBnYW1tYSA9IFkxXjJcbiAgICB2YXIgZ2FtbWEgPSB0aGlzLnkucmVkU3FyKCk7XG4gICAgLy8gYmV0YSA9IFgxICogZ2FtbWFcbiAgICB2YXIgYmV0YSA9IHRoaXMueC5yZWRNdWwoZ2FtbWEpO1xuICAgIC8vIGFscGhhID0gMyAqIChYMSAtIGRlbHRhKSAqIChYMSArIGRlbHRhKVxuICAgIHZhciBhbHBoYSA9IHRoaXMueC5yZWRTdWIoZGVsdGEpLnJlZE11bCh0aGlzLngucmVkQWRkKGRlbHRhKSk7XG4gICAgYWxwaGEgPSBhbHBoYS5yZWRBZGQoYWxwaGEpLnJlZElBZGQoYWxwaGEpO1xuICAgIC8vIFgzID0gYWxwaGFeMiAtIDggKiBiZXRhXG4gICAgdmFyIGJldGE0ID0gYmV0YS5yZWRJQWRkKGJldGEpO1xuICAgIGJldGE0ID0gYmV0YTQucmVkSUFkZChiZXRhNCk7XG4gICAgdmFyIGJldGE4ID0gYmV0YTQucmVkQWRkKGJldGE0KTtcbiAgICBueCA9IGFscGhhLnJlZFNxcigpLnJlZElTdWIoYmV0YTgpO1xuICAgIC8vIFozID0gKFkxICsgWjEpXjIgLSBnYW1tYSAtIGRlbHRhXG4gICAgbnogPSB0aGlzLnkucmVkQWRkKHRoaXMueikucmVkU3FyKCkucmVkSVN1YihnYW1tYSkucmVkSVN1YihkZWx0YSk7XG4gICAgLy8gWTMgPSBhbHBoYSAqICg0ICogYmV0YSAtIFgzKSAtIDggKiBnYW1tYV4yXG4gICAgdmFyIGdnYW1tYTggPSBnYW1tYS5yZWRTcXIoKTtcbiAgICBnZ2FtbWE4ID0gZ2dhbW1hOC5yZWRJQWRkKGdnYW1tYTgpO1xuICAgIGdnYW1tYTggPSBnZ2FtbWE4LnJlZElBZGQoZ2dhbW1hOCk7XG4gICAgZ2dhbW1hOCA9IGdnYW1tYTgucmVkSUFkZChnZ2FtbWE4KTtcbiAgICBueSA9IGFscGhhLnJlZE11bChiZXRhNC5yZWRJU3ViKG54KSkucmVkSVN1YihnZ2FtbWE4KTtcbiAgfVxuXG4gIHJldHVybiB0aGlzLmN1cnZlLmpwb2ludChueCwgbnksIG56KTtcbn07XG5cbkpQb2ludC5wcm90b3R5cGUuX2RibCA9IGZ1bmN0aW9uIF9kYmwoKSB7XG4gIHZhciBhID0gdGhpcy5jdXJ2ZS5hO1xuXG4gIC8vIDRNICsgNlMgKyAxMEFcbiAgdmFyIGp4ID0gdGhpcy54O1xuICB2YXIgankgPSB0aGlzLnk7XG4gIHZhciBqeiA9IHRoaXMuejtcbiAgdmFyIGp6NCA9IGp6LnJlZFNxcigpLnJlZFNxcigpO1xuXG4gIHZhciBqeDIgPSBqeC5yZWRTcXIoKTtcbiAgdmFyIGp5MiA9IGp5LnJlZFNxcigpO1xuXG4gIHZhciBjID0gangyLnJlZEFkZChqeDIpLnJlZElBZGQoangyKS5yZWRJQWRkKGEucmVkTXVsKGp6NCkpO1xuXG4gIHZhciBqeGQ0ID0gangucmVkQWRkKGp4KTtcbiAganhkNCA9IGp4ZDQucmVkSUFkZChqeGQ0KTtcbiAgdmFyIHQxID0ganhkNC5yZWRNdWwoankyKTtcbiAgdmFyIG54ID0gYy5yZWRTcXIoKS5yZWRJU3ViKHQxLnJlZEFkZCh0MSkpO1xuICB2YXIgdDIgPSB0MS5yZWRJU3ViKG54KTtcblxuICB2YXIganlkOCA9IGp5Mi5yZWRTcXIoKTtcbiAganlkOCA9IGp5ZDgucmVkSUFkZChqeWQ4KTtcbiAganlkOCA9IGp5ZDgucmVkSUFkZChqeWQ4KTtcbiAganlkOCA9IGp5ZDgucmVkSUFkZChqeWQ4KTtcbiAgdmFyIG55ID0gYy5yZWRNdWwodDIpLnJlZElTdWIoanlkOCk7XG4gIHZhciBueiA9IGp5LnJlZEFkZChqeSkucmVkTXVsKGp6KTtcblxuICByZXR1cm4gdGhpcy5jdXJ2ZS5qcG9pbnQobngsIG55LCBueik7XG59O1xuXG5KUG9pbnQucHJvdG90eXBlLnRycGwgPSBmdW5jdGlvbiB0cnBsKCkge1xuICBpZiAoIXRoaXMuY3VydmUuemVyb0EpXG4gICAgcmV0dXJuIHRoaXMuZGJsKCkuYWRkKHRoaXMpO1xuXG4gIC8vIGh5cGVyZWxsaXB0aWMub3JnL0VGRC9nMXAvYXV0by1zaG9ydHctamFjb2JpYW4tMC5odG1sI3RyaXBsaW5nLXRwbC0yMDA3LWJsXG4gIC8vIDVNICsgMTBTICsgLi4uXG5cbiAgLy8gWFggPSBYMV4yXG4gIHZhciB4eCA9IHRoaXMueC5yZWRTcXIoKTtcbiAgLy8gWVkgPSBZMV4yXG4gIHZhciB5eSA9IHRoaXMueS5yZWRTcXIoKTtcbiAgLy8gWlogPSBaMV4yXG4gIHZhciB6eiA9IHRoaXMuei5yZWRTcXIoKTtcbiAgLy8gWVlZWSA9IFlZXjJcbiAgdmFyIHl5eXkgPSB5eS5yZWRTcXIoKTtcbiAgLy8gTSA9IDMgKiBYWCArIGEgKiBaWjI7IGEgPSAwXG4gIHZhciBtID0geHgucmVkQWRkKHh4KS5yZWRJQWRkKHh4KTtcbiAgLy8gTU0gPSBNXjJcbiAgdmFyIG1tID0gbS5yZWRTcXIoKTtcbiAgLy8gRSA9IDYgKiAoKFgxICsgWVkpXjIgLSBYWCAtIFlZWVkpIC0gTU1cbiAgdmFyIGUgPSB0aGlzLngucmVkQWRkKHl5KS5yZWRTcXIoKS5yZWRJU3ViKHh4KS5yZWRJU3ViKHl5eXkpO1xuICBlID0gZS5yZWRJQWRkKGUpO1xuICBlID0gZS5yZWRBZGQoZSkucmVkSUFkZChlKTtcbiAgZSA9IGUucmVkSVN1YihtbSk7XG4gIC8vIEVFID0gRV4yXG4gIHZhciBlZSA9IGUucmVkU3FyKCk7XG4gIC8vIFQgPSAxNipZWVlZXG4gIHZhciB0ID0geXl5eS5yZWRJQWRkKHl5eXkpO1xuICB0ID0gdC5yZWRJQWRkKHQpO1xuICB0ID0gdC5yZWRJQWRkKHQpO1xuICB0ID0gdC5yZWRJQWRkKHQpO1xuICAvLyBVID0gKE0gKyBFKV4yIC0gTU0gLSBFRSAtIFRcbiAgdmFyIHUgPSBtLnJlZElBZGQoZSkucmVkU3FyKCkucmVkSVN1YihtbSkucmVkSVN1YihlZSkucmVkSVN1Yih0KTtcbiAgLy8gWDMgPSA0ICogKFgxICogRUUgLSA0ICogWVkgKiBVKVxuICB2YXIgeXl1NCA9IHl5LnJlZE11bCh1KTtcbiAgeXl1NCA9IHl5dTQucmVkSUFkZCh5eXU0KTtcbiAgeXl1NCA9IHl5dTQucmVkSUFkZCh5eXU0KTtcbiAgdmFyIG54ID0gdGhpcy54LnJlZE11bChlZSkucmVkSVN1Yih5eXU0KTtcbiAgbnggPSBueC5yZWRJQWRkKG54KTtcbiAgbnggPSBueC5yZWRJQWRkKG54KTtcbiAgLy8gWTMgPSA4ICogWTEgKiAoVSAqIChUIC0gVSkgLSBFICogRUUpXG4gIHZhciBueSA9IHRoaXMueS5yZWRNdWwodS5yZWRNdWwodC5yZWRJU3ViKHUpKS5yZWRJU3ViKGUucmVkTXVsKGVlKSkpO1xuICBueSA9IG55LnJlZElBZGQobnkpO1xuICBueSA9IG55LnJlZElBZGQobnkpO1xuICBueSA9IG55LnJlZElBZGQobnkpO1xuICAvLyBaMyA9IChaMSArIEUpXjIgLSBaWiAtIEVFXG4gIHZhciBueiA9IHRoaXMuei5yZWRBZGQoZSkucmVkU3FyKCkucmVkSVN1Yih6eikucmVkSVN1YihlZSk7XG5cbiAgcmV0dXJuIHRoaXMuY3VydmUuanBvaW50KG54LCBueSwgbnopO1xufTtcblxuSlBvaW50LnByb3RvdHlwZS5tdWwgPSBmdW5jdGlvbiBtdWwoaywga2Jhc2UpIHtcbiAgayA9IG5ldyBCTihrLCBrYmFzZSk7XG5cbiAgcmV0dXJuIHRoaXMuY3VydmUuX3duYWZNdWwodGhpcywgayk7XG59O1xuXG5KUG9pbnQucHJvdG90eXBlLmVxID0gZnVuY3Rpb24gZXEocCkge1xuICBpZiAocC50eXBlID09PSAnYWZmaW5lJylcbiAgICByZXR1cm4gdGhpcy5lcShwLnRvSigpKTtcblxuICBpZiAodGhpcyA9PT0gcClcbiAgICByZXR1cm4gdHJ1ZTtcblxuICAvLyB4MSAqIHoyXjIgPT0geDIgKiB6MV4yXG4gIHZhciB6MiA9IHRoaXMuei5yZWRTcXIoKTtcbiAgdmFyIHB6MiA9IHAuei5yZWRTcXIoKTtcbiAgaWYgKHRoaXMueC5yZWRNdWwocHoyKS5yZWRJU3ViKHAueC5yZWRNdWwoejIpKS5jbXBuKDApICE9PSAwKVxuICAgIHJldHVybiBmYWxzZTtcblxuICAvLyB5MSAqIHoyXjMgPT0geTIgKiB6MV4zXG4gIHZhciB6MyA9IHoyLnJlZE11bCh0aGlzLnopO1xuICB2YXIgcHozID0gcHoyLnJlZE11bChwLnopO1xuICByZXR1cm4gdGhpcy55LnJlZE11bChwejMpLnJlZElTdWIocC55LnJlZE11bCh6MykpLmNtcG4oMCkgPT09IDA7XG59O1xuXG5KUG9pbnQucHJvdG90eXBlLmluc3BlY3QgPSBmdW5jdGlvbiBpbnNwZWN0KCkge1xuICBpZiAodGhpcy5pc0luZmluaXR5KCkpXG4gICAgcmV0dXJuICc8RUMgSlBvaW50IEluZmluaXR5Pic7XG4gIHJldHVybiAnPEVDIEpQb2ludCB4OiAnICsgdGhpcy54LnRvU3RyaW5nKDE2LCAyKSArXG4gICAgICAnIHk6ICcgKyB0aGlzLnkudG9TdHJpbmcoMTYsIDIpICtcbiAgICAgICcgejogJyArIHRoaXMuei50b1N0cmluZygxNiwgMikgKyAnPic7XG59O1xuXG5KUG9pbnQucHJvdG90eXBlLmlzSW5maW5pdHkgPSBmdW5jdGlvbiBpc0luZmluaXR5KCkge1xuICAvLyBYWFggVGhpcyBjb2RlIGFzc3VtZXMgdGhhdCB6ZXJvIGlzIGFsd2F5cyB6ZXJvIGluIHJlZFxuICByZXR1cm4gdGhpcy56LmNtcG4oMCkgPT09IDA7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgY3VydmVzID0gZXhwb3J0cztcblxudmFyIGhhc2ggPSByZXF1aXJlKCdoYXNoLmpzJyk7XG52YXIgZWxsaXB0aWMgPSByZXF1aXJlKCcuLi9lbGxpcHRpYycpO1xuXG52YXIgYXNzZXJ0ID0gZWxsaXB0aWMudXRpbHMuYXNzZXJ0O1xuXG5mdW5jdGlvbiBQcmVzZXRDdXJ2ZShvcHRpb25zKSB7XG4gIGlmIChvcHRpb25zLnR5cGUgPT09ICdzaG9ydCcpXG4gICAgdGhpcy5jdXJ2ZSA9IG5ldyBlbGxpcHRpYy5jdXJ2ZS5zaG9ydChvcHRpb25zKTtcbiAgZWxzZSBpZiAob3B0aW9ucy50eXBlID09PSAnZWR3YXJkcycpXG4gICAgdGhpcy5jdXJ2ZSA9IG5ldyBlbGxpcHRpYy5jdXJ2ZS5lZHdhcmRzKG9wdGlvbnMpO1xuICBlbHNlXG4gICAgdGhpcy5jdXJ2ZSA9IG5ldyBlbGxpcHRpYy5jdXJ2ZS5tb250KG9wdGlvbnMpO1xuICB0aGlzLmcgPSB0aGlzLmN1cnZlLmc7XG4gIHRoaXMubiA9IHRoaXMuY3VydmUubjtcbiAgdGhpcy5oYXNoID0gb3B0aW9ucy5oYXNoO1xuXG4gIGFzc2VydCh0aGlzLmcudmFsaWRhdGUoKSwgJ0ludmFsaWQgY3VydmUnKTtcbiAgYXNzZXJ0KHRoaXMuZy5tdWwodGhpcy5uKS5pc0luZmluaXR5KCksICdJbnZhbGlkIGN1cnZlLCBHKk4gIT0gTycpO1xufVxuY3VydmVzLlByZXNldEN1cnZlID0gUHJlc2V0Q3VydmU7XG5cbmZ1bmN0aW9uIGRlZmluZUN1cnZlKG5hbWUsIG9wdGlvbnMpIHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGN1cnZlcywgbmFtZSwge1xuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGdldDogZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgY3VydmUgPSBuZXcgUHJlc2V0Q3VydmUob3B0aW9ucyk7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY3VydmVzLCBuYW1lLCB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgdmFsdWU6IGN1cnZlXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBjdXJ2ZTtcbiAgICB9XG4gIH0pO1xufVxuXG5kZWZpbmVDdXJ2ZSgncDE5MicsIHtcbiAgdHlwZTogJ3Nob3J0JyxcbiAgcHJpbWU6ICdwMTkyJyxcbiAgcDogJ2ZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZlIGZmZmZmZmZmIGZmZmZmZmZmJyxcbiAgYTogJ2ZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZlIGZmZmZmZmZmIGZmZmZmZmZjJyxcbiAgYjogJzY0MjEwNTE5IGU1OWM4MGU3IDBmYTdlOWFiIDcyMjQzMDQ5IGZlYjhkZWVjIGMxNDZiOWIxJyxcbiAgbjogJ2ZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIDk5ZGVmODM2IDE0NmJjOWIxIGI0ZDIyODMxJyxcbiAgaGFzaDogaGFzaC5zaGEyNTYsXG4gIGdSZWQ6IGZhbHNlLFxuICBnOiBbXG4gICAgJzE4OGRhODBlIGIwMzA5MGY2IDdjYmYyMGViIDQzYTE4ODAwIGY0ZmYwYWZkIDgyZmYxMDEyJyxcbiAgICAnMDcxOTJiOTUgZmZjOGRhNzggNjMxMDExZWQgNmIyNGNkZDUgNzNmOTc3YTEgMWU3OTQ4MTEnXG4gIF1cbn0pO1xuXG5kZWZpbmVDdXJ2ZSgncDIyNCcsIHtcbiAgdHlwZTogJ3Nob3J0JyxcbiAgcHJpbWU6ICdwMjI0JyxcbiAgcDogJ2ZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAxJyxcbiAgYTogJ2ZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZlIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZlJyxcbiAgYjogJ2I0MDUwYTg1IDBjMDRiM2FiIGY1NDEzMjU2IDUwNDRiMGI3IGQ3YmZkOGJhIDI3MGIzOTQzIDIzNTVmZmI0JyxcbiAgbjogJ2ZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmYxNmEyIGUwYjhmMDNlIDEzZGQyOTQ1IDVjNWMyYTNkJyxcbiAgaGFzaDogaGFzaC5zaGEyNTYsXG4gIGdSZWQ6IGZhbHNlLFxuICBnOiBbXG4gICAgJ2I3MGUwY2JkIDZiYjRiZjdmIDMyMTM5MGI5IDRhMDNjMWQzIDU2YzIxMTIyIDM0MzI4MGQ2IDExNWMxZDIxJyxcbiAgICAnYmQzNzYzODggYjVmNzIzZmIgNGMyMmRmZTYgY2Q0Mzc1YTAgNWEwNzQ3NjQgNDRkNTgxOTkgODUwMDdlMzQnXG4gIF1cbn0pO1xuXG5kZWZpbmVDdXJ2ZSgncDI1NicsIHtcbiAgdHlwZTogJ3Nob3J0JyxcbiAgcHJpbWU6IG51bGwsXG4gIHA6ICdmZmZmZmZmZiAwMDAwMDAwMSAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZicsXG4gIGE6ICdmZmZmZmZmZiAwMDAwMDAwMSAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmYycsXG4gIGI6ICc1YWM2MzVkOCBhYTNhOTNlNyBiM2ViYmQ1NSA3Njk4ODZiYyA2NTFkMDZiMCBjYzUzYjBmNiAzYmNlM2MzZSAyN2QyNjA0YicsXG4gIG46ICdmZmZmZmZmZiAwMDAwMDAwMCBmZmZmZmZmZiBmZmZmZmZmZiBiY2U2ZmFhZCBhNzE3OWU4NCBmM2I5Y2FjMiBmYzYzMjU1MScsXG4gIGhhc2g6IGhhc2guc2hhMjU2LFxuICBnUmVkOiBmYWxzZSxcbiAgZzogW1xuICAgICc2YjE3ZDFmMiBlMTJjNDI0NyBmOGJjZTZlNSA2M2E0NDBmMiA3NzAzN2Q4MSAyZGViMzNhMCBmNGExMzk0NSBkODk4YzI5NicsXG4gICAgJzRmZTM0MmUyIGZlMWE3ZjliIDhlZTdlYjRhIDdjMGY5ZTE2IDJiY2UzMzU3IDZiMzE1ZWNlIGNiYjY0MDY4IDM3YmY1MWY1J1xuICBdXG59KTtcblxuZGVmaW5lQ3VydmUoJ3AzODQnLCB7XG4gIHR5cGU6ICdzaG9ydCcsXG4gIHByaW1lOiBudWxsLFxuICBwOiAnZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgJyArXG4gICAgICdmZmZmZmZmZSBmZmZmZmZmZiAwMDAwMDAwMCAwMDAwMDAwMCBmZmZmZmZmZicsXG4gIGE6ICdmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiAnICtcbiAgICAgJ2ZmZmZmZmZlIGZmZmZmZmZmIDAwMDAwMDAwIDAwMDAwMDAwIGZmZmZmZmZjJyxcbiAgYjogJ2IzMzEyZmE3IGUyM2VlN2U0IDk4OGUwNTZiIGUzZjgyZDE5IDE4MWQ5YzZlIGZlODE0MTEyIDAzMTQwODhmICcgK1xuICAgICAnNTAxMzg3NWEgYzY1NjM5OGQgOGEyZWQxOWQgMmE4NWM4ZWQgZDNlYzJhZWYnLFxuICBuOiAnZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgYzc2MzRkODEgJyArXG4gICAgICdmNDM3MmRkZiA1ODFhMGRiMiA0OGIwYTc3YSBlY2VjMTk2YSBjY2M1Mjk3MycsXG4gIGhhc2g6IGhhc2guc2hhMzg0LFxuICBnUmVkOiBmYWxzZSxcbiAgZzogW1xuICAgICdhYTg3Y2EyMiBiZThiMDUzNyA4ZWIxYzcxZSBmMzIwYWQ3NCA2ZTFkM2I2MiA4YmE3OWI5OCA1OWY3NDFlMCA4MjU0MmEzOCAnICtcbiAgICAnNTUwMmYyNWQgYmY1NTI5NmMgM2E1NDVlMzggNzI3NjBhYjcnLFxuICAgICczNjE3ZGU0YSA5NjI2MmM2ZiA1ZDllOThiZiA5MjkyZGMyOSBmOGY0MWRiZCAyODlhMTQ3YyBlOWRhMzExMyBiNWYwYjhjMCAnICtcbiAgICAnMGE2MGIxY2UgMWQ3ZTgxOWQgN2E0MzFkN2MgOTBlYTBlNWYnXG4gIF1cbn0pO1xuXG5kZWZpbmVDdXJ2ZSgncDUyMScsIHtcbiAgdHlwZTogJ3Nob3J0JyxcbiAgcHJpbWU6IG51bGwsXG4gIHA6ICcwMDAwMDFmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiAnICtcbiAgICAgJ2ZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmICcgK1xuICAgICAnZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYnLFxuICBhOiAnMDAwMDAxZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgJyArXG4gICAgICdmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiAnICtcbiAgICAgJ2ZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZjJyxcbiAgYjogJzAwMDAwMDUxIDk1M2ViOTYxIDhlMWM5YTFmIDkyOWEyMWEwIGI2ODU0MGVlIGEyZGE3MjViICcgK1xuICAgICAnOTliMzE1ZjMgYjhiNDg5OTEgOGVmMTA5ZTEgNTYxOTM5NTEgZWM3ZTkzN2IgMTY1MmMwYmQgJyArXG4gICAgICczYmIxYmYwNyAzNTczZGY4OCAzZDJjMzRmMSBlZjQ1MWZkNCA2YjUwM2YwMCcsXG4gIG46ICcwMDAwMDFmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiAnICtcbiAgICAgJ2ZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZhIDUxODY4NzgzIGJmMmY5NjZiIDdmY2MwMTQ4ICcgK1xuICAgICAnZjcwOWE1ZDAgM2JiNWM5YjggODk5YzQ3YWUgYmI2ZmI3MWUgOTEzODY0MDknLFxuICBoYXNoOiBoYXNoLnNoYTUxMixcbiAgZ1JlZDogZmFsc2UsXG4gIGc6IFtcbiAgICAnMDAwMDAwYzYgODU4ZTA2YjcgMDQwNGU5Y2QgOWUzZWNiNjYgMjM5NWI0NDIgOWM2NDgxMzkgJyArXG4gICAgJzA1M2ZiNTIxIGY4MjhhZjYwIDZiNGQzZGJhIGExNGI1ZTc3IGVmZTc1OTI4IGZlMWRjMTI3ICcgK1xuICAgICdhMmZmYThkZSAzMzQ4YjNjMSA4NTZhNDI5YiBmOTdlN2UzMSBjMmU1YmQ2NicsXG4gICAgJzAwMDAwMTE4IDM5Mjk2YTc4IDlhM2JjMDA0IDVjOGE1ZmI0IDJjN2QxYmQ5IDk4ZjU0NDQ5ICcgK1xuICAgICc1NzliNDQ2OCAxN2FmYmQxNyAyNzNlNjYyYyA5N2VlNzI5OSA1ZWY0MjY0MCBjNTUwYjkwMSAnICtcbiAgICAnM2ZhZDA3NjEgMzUzYzcwODYgYTI3MmMyNDAgODhiZTk0NzYgOWZkMTY2NTAnXG4gIF1cbn0pO1xuXG5kZWZpbmVDdXJ2ZSgnY3VydmUyNTUxOScsIHtcbiAgdHlwZTogJ21vbnQnLFxuICBwcmltZTogJ3AyNTUxOScsXG4gIHA6ICc3ZmZmZmZmZmZmZmZmZmZmIGZmZmZmZmZmZmZmZmZmZmYgZmZmZmZmZmZmZmZmZmZmZiBmZmZmZmZmZmZmZmZmZmVkJyxcbiAgYTogJzc2ZDA2JyxcbiAgYjogJzAnLFxuICBuOiAnMTAwMDAwMDAwMDAwMDAwMCAwMDAwMDAwMDAwMDAwMDAwIDE0ZGVmOWRlYTJmNzljZDYgNTgxMjYzMWE1Y2Y1ZDNlZCcsXG4gIGhhc2g6IGhhc2guc2hhMjU2LFxuICBnUmVkOiBmYWxzZSxcbiAgZzogW1xuICAgICc5J1xuICBdXG59KTtcblxuZGVmaW5lQ3VydmUoJ2VkMjU1MTknLCB7XG4gIHR5cGU6ICdlZHdhcmRzJyxcbiAgcHJpbWU6ICdwMjU1MTknLFxuICBwOiAnN2ZmZmZmZmZmZmZmZmZmZiBmZmZmZmZmZmZmZmZmZmZmIGZmZmZmZmZmZmZmZmZmZmYgZmZmZmZmZmZmZmZmZmZlZCcsXG4gIGE6ICctMScsXG4gIGM6ICcxJyxcbiAgLy8gLTEyMTY2NSAqICgxMjE2NjZeKC0xKSkgKG1vZCBQKVxuICBkOiAnNTIwMzZjZWUyYjZmZmU3MyA4Y2M3NDA3OTc3NzllODk4IDAwNzAwYTRkNDE0MWQ4YWIgNzVlYjRkY2ExMzU5NzhhMycsXG4gIG46ICcxMDAwMDAwMDAwMDAwMDAwIDAwMDAwMDAwMDAwMDAwMDAgMTRkZWY5ZGVhMmY3OWNkNiA1ODEyNjMxYTVjZjVkM2VkJyxcbiAgaGFzaDogaGFzaC5zaGEyNTYsXG4gIGdSZWQ6IGZhbHNlLFxuICBnOiBbXG4gICAgJzIxNjkzNmQzY2Q2ZTUzZmVjMGE0ZTIzMWZkZDZkYzVjNjkyY2M3NjA5NTI1YTdiMmM5NTYyZDYwOGYyNWQ1MWEnLFxuXG4gICAgLy8gNC81XG4gICAgJzY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NTgnXG4gIF1cbn0pO1xuXG52YXIgcHJlO1xudHJ5IHtcbiAgcHJlID0gcmVxdWlyZSgnLi9wcmVjb21wdXRlZC9zZWNwMjU2azEnKTtcbn0gY2F0Y2ggKGUpIHtcbiAgcHJlID0gdW5kZWZpbmVkO1xufVxuXG5kZWZpbmVDdXJ2ZSgnc2VjcDI1NmsxJywge1xuICB0eXBlOiAnc2hvcnQnLFxuICBwcmltZTogJ2syNTYnLFxuICBwOiAnZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmUgZmZmZmZjMmYnLFxuICBhOiAnMCcsXG4gIGI6ICc3JyxcbiAgbjogJ2ZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZlIGJhYWVkY2U2IGFmNDhhMDNiIGJmZDI1ZThjIGQwMzY0MTQxJyxcbiAgaDogJzEnLFxuICBoYXNoOiBoYXNoLnNoYTI1NixcblxuICAvLyBQcmVjb21wdXRlZCBlbmRvbW9ycGhpc21cbiAgYmV0YTogJzdhZTk2YTJiNjU3YzA3MTA2ZTY0NDc5ZWFjMzQzNGU5OWNmMDQ5NzUxMmY1ODk5NWMxMzk2YzI4NzE5NTAxZWUnLFxuICBsYW1iZGE6ICc1MzYzYWQ0Y2MwNWMzMGUwYTUyNjFjMDI4ODEyNjQ1YTEyMmUyMmVhMjA4MTY2NzhkZjAyOTY3YzFiMjNiZDcyJyxcbiAgYmFzaXM6IFtcbiAgICB7XG4gICAgICBhOiAnMzA4NmQyMjFhN2Q0NmJjZGU4NmM5MGU0OTI4NGViMTUnLFxuICAgICAgYjogJy1lNDQzN2VkNjAxMGU4ODI4NmY1NDdmYTkwYWJmZTRjMydcbiAgICB9LFxuICAgIHtcbiAgICAgIGE6ICcxMTRjYTUwZjdhOGUyZjNmNjU3YzExMDhkOWQ0NGNmZDgnLFxuICAgICAgYjogJzMwODZkMjIxYTdkNDZiY2RlODZjOTBlNDkyODRlYjE1J1xuICAgIH1cbiAgXSxcblxuICBnUmVkOiBmYWxzZSxcbiAgZzogW1xuICAgICc3OWJlNjY3ZWY5ZGNiYmFjNTVhMDYyOTVjZTg3MGIwNzAyOWJmY2RiMmRjZTI4ZDk1OWYyODE1YjE2ZjgxNzk4JyxcbiAgICAnNDgzYWRhNzcyNmEzYzQ2NTVkYTRmYmZjMGUxMTA4YThmZDE3YjQ0OGE2ODU1NDE5OWM0N2QwOGZmYjEwZDRiOCcsXG4gICAgcHJlXG4gIF1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQk4gPSByZXF1aXJlKCdibi5qcycpO1xudmFyIGVsbGlwdGljID0gcmVxdWlyZSgnLi4vLi4vZWxsaXB0aWMnKTtcbnZhciB1dGlscyA9IGVsbGlwdGljLnV0aWxzO1xudmFyIGFzc2VydCA9IHV0aWxzLmFzc2VydDtcblxudmFyIEtleVBhaXIgPSByZXF1aXJlKCcuL2tleScpO1xudmFyIFNpZ25hdHVyZSA9IHJlcXVpcmUoJy4vc2lnbmF0dXJlJyk7XG5cbmZ1bmN0aW9uIEVDKG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIEVDKSlcbiAgICByZXR1cm4gbmV3IEVDKG9wdGlvbnMpO1xuXG4gIC8vIFNob3J0Y3V0IGBlbGxpcHRpYy5lYyhjdXJ2ZS1uYW1lKWBcbiAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnc3RyaW5nJykge1xuICAgIGFzc2VydChlbGxpcHRpYy5jdXJ2ZXMuaGFzT3duUHJvcGVydHkob3B0aW9ucyksICdVbmtub3duIGN1cnZlICcgKyBvcHRpb25zKTtcblxuICAgIG9wdGlvbnMgPSBlbGxpcHRpYy5jdXJ2ZXNbb3B0aW9uc107XG4gIH1cblxuICAvLyBTaG9ydGN1dCBmb3IgYGVsbGlwdGljLmVjKGVsbGlwdGljLmN1cnZlcy5jdXJ2ZU5hbWUpYFxuICBpZiAob3B0aW9ucyBpbnN0YW5jZW9mIGVsbGlwdGljLmN1cnZlcy5QcmVzZXRDdXJ2ZSlcbiAgICBvcHRpb25zID0geyBjdXJ2ZTogb3B0aW9ucyB9O1xuXG4gIHRoaXMuY3VydmUgPSBvcHRpb25zLmN1cnZlLmN1cnZlO1xuICB0aGlzLm4gPSB0aGlzLmN1cnZlLm47XG4gIHRoaXMubmggPSB0aGlzLm4udXNocm4oMSk7XG4gIHRoaXMuZyA9IHRoaXMuY3VydmUuZztcblxuICAvLyBQb2ludCBvbiBjdXJ2ZVxuICB0aGlzLmcgPSBvcHRpb25zLmN1cnZlLmc7XG4gIHRoaXMuZy5wcmVjb21wdXRlKG9wdGlvbnMuY3VydmUubi5iaXRMZW5ndGgoKSArIDEpO1xuXG4gIC8vIEhhc2ggZm9yIGZ1bmN0aW9uIGZvciBEUkJHXG4gIHRoaXMuaGFzaCA9IG9wdGlvbnMuaGFzaCB8fCBvcHRpb25zLmN1cnZlLmhhc2g7XG59XG5tb2R1bGUuZXhwb3J0cyA9IEVDO1xuXG5FQy5wcm90b3R5cGUua2V5UGFpciA9IGZ1bmN0aW9uIGtleVBhaXIob3B0aW9ucykge1xuICByZXR1cm4gbmV3IEtleVBhaXIodGhpcywgb3B0aW9ucyk7XG59O1xuXG5FQy5wcm90b3R5cGUua2V5RnJvbVByaXZhdGUgPSBmdW5jdGlvbiBrZXlGcm9tUHJpdmF0ZShwcml2LCBlbmMpIHtcbiAgcmV0dXJuIEtleVBhaXIuZnJvbVByaXZhdGUodGhpcywgcHJpdiwgZW5jKTtcbn07XG5cbkVDLnByb3RvdHlwZS5rZXlGcm9tUHVibGljID0gZnVuY3Rpb24ga2V5RnJvbVB1YmxpYyhwdWIsIGVuYykge1xuICByZXR1cm4gS2V5UGFpci5mcm9tUHVibGljKHRoaXMsIHB1YiwgZW5jKTtcbn07XG5cbkVDLnByb3RvdHlwZS5nZW5LZXlQYWlyID0gZnVuY3Rpb24gZ2VuS2V5UGFpcihvcHRpb25zKSB7XG4gIGlmICghb3B0aW9ucylcbiAgICBvcHRpb25zID0ge307XG5cbiAgLy8gSW5zdGFudGlhdGUgSG1hY19EUkJHXG4gIHZhciBkcmJnID0gbmV3IGVsbGlwdGljLmhtYWNEUkJHKHtcbiAgICBoYXNoOiB0aGlzLmhhc2gsXG4gICAgcGVyczogb3B0aW9ucy5wZXJzLFxuICAgIGVudHJvcHk6IG9wdGlvbnMuZW50cm9weSB8fCBlbGxpcHRpYy5yYW5kKHRoaXMuaGFzaC5obWFjU3RyZW5ndGgpLFxuICAgIG5vbmNlOiB0aGlzLm4udG9BcnJheSgpXG4gIH0pO1xuXG4gIHZhciBieXRlcyA9IHRoaXMubi5ieXRlTGVuZ3RoKCk7XG4gIHZhciBuczIgPSB0aGlzLm4uc3ViKG5ldyBCTigyKSk7XG4gIGRvIHtcbiAgICB2YXIgcHJpdiA9IG5ldyBCTihkcmJnLmdlbmVyYXRlKGJ5dGVzKSk7XG4gICAgaWYgKHByaXYuY21wKG5zMikgPiAwKVxuICAgICAgY29udGludWU7XG5cbiAgICBwcml2LmlhZGRuKDEpO1xuICAgIHJldHVybiB0aGlzLmtleUZyb21Qcml2YXRlKHByaXYpO1xuICB9IHdoaWxlICh0cnVlKTtcbn07XG5cbkVDLnByb3RvdHlwZS5fdHJ1bmNhdGVUb04gPSBmdW5jdGlvbiB0cnVuY2F0ZVRvTihtc2csIHRydW5jT25seSkge1xuICB2YXIgZGVsdGEgPSBtc2cuYnl0ZUxlbmd0aCgpICogOCAtIHRoaXMubi5iaXRMZW5ndGgoKTtcbiAgaWYgKGRlbHRhID4gMClcbiAgICBtc2cgPSBtc2cudXNocm4oZGVsdGEpO1xuICBpZiAoIXRydW5jT25seSAmJiBtc2cuY21wKHRoaXMubikgPj0gMClcbiAgICByZXR1cm4gbXNnLnN1Yih0aGlzLm4pO1xuICBlbHNlXG4gICAgcmV0dXJuIG1zZztcbn07XG5cbkVDLnByb3RvdHlwZS5zaWduID0gZnVuY3Rpb24gc2lnbihtc2csIGtleSwgZW5jLCBvcHRpb25zKSB7XG4gIGlmICh0eXBlb2YgZW5jID09PSAnb2JqZWN0Jykge1xuICAgIG9wdGlvbnMgPSBlbmM7XG4gICAgZW5jID0gbnVsbDtcbiAgfVxuICBpZiAoIW9wdGlvbnMpXG4gICAgb3B0aW9ucyA9IHt9O1xuXG4gIGtleSA9IHRoaXMua2V5RnJvbVByaXZhdGUoa2V5LCBlbmMpO1xuICBtc2cgPSB0aGlzLl90cnVuY2F0ZVRvTihuZXcgQk4obXNnLCAxNikpO1xuXG4gIC8vIFplcm8tZXh0ZW5kIGtleSB0byBwcm92aWRlIGVub3VnaCBlbnRyb3B5XG4gIHZhciBieXRlcyA9IHRoaXMubi5ieXRlTGVuZ3RoKCk7XG4gIHZhciBia2V5ID0ga2V5LmdldFByaXZhdGUoKS50b0FycmF5KCdiZScsIGJ5dGVzKTtcblxuICAvLyBaZXJvLWV4dGVuZCBub25jZSB0byBoYXZlIHRoZSBzYW1lIGJ5dGUgc2l6ZSBhcyBOXG4gIHZhciBub25jZSA9IG1zZy50b0FycmF5KCdiZScsIGJ5dGVzKTtcblxuICAvLyBJbnN0YW50aWF0ZSBIbWFjX0RSQkdcbiAgdmFyIGRyYmcgPSBuZXcgZWxsaXB0aWMuaG1hY0RSQkcoe1xuICAgIGhhc2g6IHRoaXMuaGFzaCxcbiAgICBlbnRyb3B5OiBia2V5LFxuICAgIG5vbmNlOiBub25jZSxcbiAgICBwZXJzOiBvcHRpb25zLnBlcnMsXG4gICAgcGVyc0VuYzogb3B0aW9ucy5wZXJzRW5jXG4gIH0pO1xuXG4gIC8vIE51bWJlciBvZiBieXRlcyB0byBnZW5lcmF0ZVxuICB2YXIgbnMxID0gdGhpcy5uLnN1YihuZXcgQk4oMSkpO1xuXG4gIGZvciAodmFyIGl0ZXIgPSAwOyB0cnVlOyBpdGVyKyspIHtcbiAgICB2YXIgayA9IG9wdGlvbnMuayA/XG4gICAgICAgIG9wdGlvbnMuayhpdGVyKSA6XG4gICAgICAgIG5ldyBCTihkcmJnLmdlbmVyYXRlKHRoaXMubi5ieXRlTGVuZ3RoKCkpKTtcbiAgICBrID0gdGhpcy5fdHJ1bmNhdGVUb04oaywgdHJ1ZSk7XG4gICAgaWYgKGsuY21wbigxKSA8PSAwIHx8IGsuY21wKG5zMSkgPj0gMClcbiAgICAgIGNvbnRpbnVlO1xuXG4gICAgdmFyIGtwID0gdGhpcy5nLm11bChrKTtcbiAgICBpZiAoa3AuaXNJbmZpbml0eSgpKVxuICAgICAgY29udGludWU7XG5cbiAgICB2YXIga3BYID0ga3AuZ2V0WCgpO1xuICAgIHZhciByID0ga3BYLnVtb2QodGhpcy5uKTtcbiAgICBpZiAoci5jbXBuKDApID09PSAwKVxuICAgICAgY29udGludWU7XG5cbiAgICB2YXIgcyA9IGsuaW52bSh0aGlzLm4pLm11bChyLm11bChrZXkuZ2V0UHJpdmF0ZSgpKS5pYWRkKG1zZykpO1xuICAgIHMgPSBzLnVtb2QodGhpcy5uKTtcbiAgICBpZiAocy5jbXBuKDApID09PSAwKVxuICAgICAgY29udGludWU7XG5cbiAgICB2YXIgcmVjb3ZlcnlQYXJhbSA9IChrcC5nZXRZKCkuaXNPZGQoKSA/IDEgOiAwKSB8XG4gICAgICAgICAgICAgICAgICAgICAgICAoa3BYLmNtcChyKSAhPT0gMCA/IDIgOiAwKTtcblxuICAgIC8vIFVzZSBjb21wbGVtZW50IG9mIGBzYCwgaWYgaXQgaXMgPiBgbiAvIDJgXG4gICAgaWYgKG9wdGlvbnMuY2Fub25pY2FsICYmIHMuY21wKHRoaXMubmgpID4gMCkge1xuICAgICAgcyA9IHRoaXMubi5zdWIocyk7XG4gICAgICByZWNvdmVyeVBhcmFtIF49IDE7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBTaWduYXR1cmUoeyByOiByLCBzOiBzLCByZWNvdmVyeVBhcmFtOiByZWNvdmVyeVBhcmFtIH0pO1xuICB9XG59O1xuXG5FQy5wcm90b3R5cGUudmVyaWZ5ID0gZnVuY3Rpb24gdmVyaWZ5KG1zZywgc2lnbmF0dXJlLCBrZXksIGVuYykge1xuICBtc2cgPSB0aGlzLl90cnVuY2F0ZVRvTihuZXcgQk4obXNnLCAxNikpO1xuICBrZXkgPSB0aGlzLmtleUZyb21QdWJsaWMoa2V5LCBlbmMpO1xuICBzaWduYXR1cmUgPSBuZXcgU2lnbmF0dXJlKHNpZ25hdHVyZSwgJ2hleCcpO1xuXG4gIC8vIFBlcmZvcm0gcHJpbWl0aXZlIHZhbHVlcyB2YWxpZGF0aW9uXG4gIHZhciByID0gc2lnbmF0dXJlLnI7XG4gIHZhciBzID0gc2lnbmF0dXJlLnM7XG4gIGlmIChyLmNtcG4oMSkgPCAwIHx8IHIuY21wKHRoaXMubikgPj0gMClcbiAgICByZXR1cm4gZmFsc2U7XG4gIGlmIChzLmNtcG4oMSkgPCAwIHx8IHMuY21wKHRoaXMubikgPj0gMClcbiAgICByZXR1cm4gZmFsc2U7XG5cbiAgLy8gVmFsaWRhdGUgc2lnbmF0dXJlXG4gIHZhciBzaW52ID0gcy5pbnZtKHRoaXMubik7XG4gIHZhciB1MSA9IHNpbnYubXVsKG1zZykudW1vZCh0aGlzLm4pO1xuICB2YXIgdTIgPSBzaW52Lm11bChyKS51bW9kKHRoaXMubik7XG5cbiAgdmFyIHAgPSB0aGlzLmcubXVsQWRkKHUxLCBrZXkuZ2V0UHVibGljKCksIHUyKTtcbiAgaWYgKHAuaXNJbmZpbml0eSgpKVxuICAgIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gcC5nZXRYKCkudW1vZCh0aGlzLm4pLmNtcChyKSA9PT0gMDtcbn07XG5cbkVDLnByb3RvdHlwZS5yZWNvdmVyUHViS2V5ID0gZnVuY3Rpb24obXNnLCBzaWduYXR1cmUsIGosIGVuYykge1xuICBhc3NlcnQoKDMgJiBqKSA9PT0gaiwgJ1RoZSByZWNvdmVyeSBwYXJhbSBpcyBtb3JlIHRoYW4gdHdvIGJpdHMnKTtcbiAgc2lnbmF0dXJlID0gbmV3IFNpZ25hdHVyZShzaWduYXR1cmUsIGVuYyk7XG5cbiAgdmFyIG4gPSB0aGlzLm47XG4gIHZhciBlID0gbmV3IEJOKG1zZyk7XG4gIHZhciByID0gc2lnbmF0dXJlLnI7XG4gIHZhciBzID0gc2lnbmF0dXJlLnM7XG5cbiAgLy8gQSBzZXQgTFNCIHNpZ25pZmllcyB0aGF0IHRoZSB5LWNvb3JkaW5hdGUgaXMgb2RkXG4gIHZhciBpc1lPZGQgPSBqICYgMTtcbiAgdmFyIGlzU2Vjb25kS2V5ID0gaiA+PiAxO1xuICBpZiAoci5jbXAodGhpcy5jdXJ2ZS5wLnVtb2QodGhpcy5jdXJ2ZS5uKSkgPj0gMCAmJiBpc1NlY29uZEtleSlcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBmaW5kIHNlbmNvbmQga2V5IGNhbmRpbmF0ZScpO1xuXG4gIC8vIDEuMS4gTGV0IHggPSByICsgam4uXG4gIGlmIChpc1NlY29uZEtleSlcbiAgICByID0gdGhpcy5jdXJ2ZS5wb2ludEZyb21YKHIuYWRkKHRoaXMuY3VydmUubiksIGlzWU9kZCk7XG4gIGVsc2VcbiAgICByID0gdGhpcy5jdXJ2ZS5wb2ludEZyb21YKHIsIGlzWU9kZCk7XG5cbiAgdmFyIGVOZWcgPSBuLnN1YihlKTtcblxuICAvLyAxLjYuMSBDb21wdXRlIFEgPSByXi0xIChzUiAtICBlRylcbiAgLy8gICAgICAgICAgICAgICBRID0gcl4tMSAoc1IgKyAtZUcpXG4gIHZhciBySW52ID0gc2lnbmF0dXJlLnIuaW52bShuKTtcbiAgcmV0dXJuIHRoaXMuZy5tdWxBZGQoZU5lZywgciwgcykubXVsKHJJbnYpO1xufTtcblxuRUMucHJvdG90eXBlLmdldEtleVJlY292ZXJ5UGFyYW0gPSBmdW5jdGlvbihlLCBzaWduYXR1cmUsIFEsIGVuYykge1xuICBzaWduYXR1cmUgPSBuZXcgU2lnbmF0dXJlKHNpZ25hdHVyZSwgZW5jKTtcbiAgaWYgKHNpZ25hdHVyZS5yZWNvdmVyeVBhcmFtICE9PSBudWxsKVxuICAgIHJldHVybiBzaWduYXR1cmUucmVjb3ZlcnlQYXJhbTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IDQ7IGkrKykge1xuICAgIHZhciBRcHJpbWU7XG4gICAgdHJ5IHtcbiAgICAgIFFwcmltZSA9IHRoaXMucmVjb3ZlclB1YktleShlLCBzaWduYXR1cmUsIGkpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChRcHJpbWUuZXEoUSkpXG4gICAgICByZXR1cm4gaTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBmaW5kIHZhbGlkIHJlY292ZXJ5IGZhY3RvcicpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIEJOID0gcmVxdWlyZSgnYm4uanMnKTtcblxuZnVuY3Rpb24gS2V5UGFpcihlYywgb3B0aW9ucykge1xuICB0aGlzLmVjID0gZWM7XG4gIHRoaXMucHJpdiA9IG51bGw7XG4gIHRoaXMucHViID0gbnVsbDtcblxuICAvLyBLZXlQYWlyKGVjLCB7IHByaXY6IC4uLiwgcHViOiAuLi4gfSlcbiAgaWYgKG9wdGlvbnMucHJpdilcbiAgICB0aGlzLl9pbXBvcnRQcml2YXRlKG9wdGlvbnMucHJpdiwgb3B0aW9ucy5wcml2RW5jKTtcbiAgaWYgKG9wdGlvbnMucHViKVxuICAgIHRoaXMuX2ltcG9ydFB1YmxpYyhvcHRpb25zLnB1Yiwgb3B0aW9ucy5wdWJFbmMpO1xufVxubW9kdWxlLmV4cG9ydHMgPSBLZXlQYWlyO1xuXG5LZXlQYWlyLmZyb21QdWJsaWMgPSBmdW5jdGlvbiBmcm9tUHVibGljKGVjLCBwdWIsIGVuYykge1xuICBpZiAocHViIGluc3RhbmNlb2YgS2V5UGFpcilcbiAgICByZXR1cm4gcHViO1xuXG4gIHJldHVybiBuZXcgS2V5UGFpcihlYywge1xuICAgIHB1YjogcHViLFxuICAgIHB1YkVuYzogZW5jXG4gIH0pO1xufTtcblxuS2V5UGFpci5mcm9tUHJpdmF0ZSA9IGZ1bmN0aW9uIGZyb21Qcml2YXRlKGVjLCBwcml2LCBlbmMpIHtcbiAgaWYgKHByaXYgaW5zdGFuY2VvZiBLZXlQYWlyKVxuICAgIHJldHVybiBwcml2O1xuXG4gIHJldHVybiBuZXcgS2V5UGFpcihlYywge1xuICAgIHByaXY6IHByaXYsXG4gICAgcHJpdkVuYzogZW5jXG4gIH0pO1xufTtcblxuS2V5UGFpci5wcm90b3R5cGUudmFsaWRhdGUgPSBmdW5jdGlvbiB2YWxpZGF0ZSgpIHtcbiAgdmFyIHB1YiA9IHRoaXMuZ2V0UHVibGljKCk7XG5cbiAgaWYgKHB1Yi5pc0luZmluaXR5KCkpXG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgcmVhc29uOiAnSW52YWxpZCBwdWJsaWMga2V5JyB9O1xuICBpZiAoIXB1Yi52YWxpZGF0ZSgpKVxuICAgIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIHJlYXNvbjogJ1B1YmxpYyBrZXkgaXMgbm90IGEgcG9pbnQnIH07XG4gIGlmICghcHViLm11bCh0aGlzLmVjLmN1cnZlLm4pLmlzSW5maW5pdHkoKSlcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCByZWFzb246ICdQdWJsaWMga2V5ICogTiAhPSBPJyB9O1xuXG4gIHJldHVybiB7IHJlc3VsdDogdHJ1ZSwgcmVhc29uOiBudWxsIH07XG59O1xuXG5LZXlQYWlyLnByb3RvdHlwZS5nZXRQdWJsaWMgPSBmdW5jdGlvbiBnZXRQdWJsaWMoY29tcGFjdCwgZW5jKSB7XG4gIC8vIGNvbXBhY3QgaXMgb3B0aW9uYWwgYXJndW1lbnRcbiAgaWYgKHR5cGVvZiBjb21wYWN0ID09PSAnc3RyaW5nJykge1xuICAgIGVuYyA9IGNvbXBhY3Q7XG4gICAgY29tcGFjdCA9IG51bGw7XG4gIH1cblxuICBpZiAoIXRoaXMucHViKVxuICAgIHRoaXMucHViID0gdGhpcy5lYy5nLm11bCh0aGlzLnByaXYpO1xuXG4gIGlmICghZW5jKVxuICAgIHJldHVybiB0aGlzLnB1YjtcblxuICByZXR1cm4gdGhpcy5wdWIuZW5jb2RlKGVuYywgY29tcGFjdCk7XG59O1xuXG5LZXlQYWlyLnByb3RvdHlwZS5nZXRQcml2YXRlID0gZnVuY3Rpb24gZ2V0UHJpdmF0ZShlbmMpIHtcbiAgaWYgKGVuYyA9PT0gJ2hleCcpXG4gICAgcmV0dXJuIHRoaXMucHJpdi50b1N0cmluZygxNiwgMik7XG4gIGVsc2VcbiAgICByZXR1cm4gdGhpcy5wcml2O1xufTtcblxuS2V5UGFpci5wcm90b3R5cGUuX2ltcG9ydFByaXZhdGUgPSBmdW5jdGlvbiBfaW1wb3J0UHJpdmF0ZShrZXksIGVuYykge1xuICB0aGlzLnByaXYgPSBuZXcgQk4oa2V5LCBlbmMgfHwgMTYpO1xuXG4gIC8vIEVuc3VyZSB0aGF0IHRoZSBwcml2IHdvbid0IGJlIGJpZ2dlciB0aGFuIG4sIG90aGVyd2lzZSB3ZSBtYXkgZmFpbFxuICAvLyBpbiBmaXhlZCBtdWx0aXBsaWNhdGlvbiBtZXRob2RcbiAgdGhpcy5wcml2ID0gdGhpcy5wcml2LnVtb2QodGhpcy5lYy5jdXJ2ZS5uKTtcbn07XG5cbktleVBhaXIucHJvdG90eXBlLl9pbXBvcnRQdWJsaWMgPSBmdW5jdGlvbiBfaW1wb3J0UHVibGljKGtleSwgZW5jKSB7XG4gIGlmIChrZXkueCB8fCBrZXkueSkge1xuICAgIHRoaXMucHViID0gdGhpcy5lYy5jdXJ2ZS5wb2ludChrZXkueCwga2V5LnkpO1xuICAgIHJldHVybjtcbiAgfVxuICB0aGlzLnB1YiA9IHRoaXMuZWMuY3VydmUuZGVjb2RlUG9pbnQoa2V5LCBlbmMpO1xufTtcblxuLy8gRUNESFxuS2V5UGFpci5wcm90b3R5cGUuZGVyaXZlID0gZnVuY3Rpb24gZGVyaXZlKHB1Yikge1xuICByZXR1cm4gcHViLm11bCh0aGlzLnByaXYpLmdldFgoKTtcbn07XG5cbi8vIEVDRFNBXG5LZXlQYWlyLnByb3RvdHlwZS5zaWduID0gZnVuY3Rpb24gc2lnbihtc2csIGVuYywgb3B0aW9ucykge1xuICByZXR1cm4gdGhpcy5lYy5zaWduKG1zZywgdGhpcywgZW5jLCBvcHRpb25zKTtcbn07XG5cbktleVBhaXIucHJvdG90eXBlLnZlcmlmeSA9IGZ1bmN0aW9uIHZlcmlmeShtc2csIHNpZ25hdHVyZSkge1xuICByZXR1cm4gdGhpcy5lYy52ZXJpZnkobXNnLCBzaWduYXR1cmUsIHRoaXMpO1xufTtcblxuS2V5UGFpci5wcm90b3R5cGUuaW5zcGVjdCA9IGZ1bmN0aW9uIGluc3BlY3QoKSB7XG4gIHJldHVybiAnPEtleSBwcml2OiAnICsgKHRoaXMucHJpdiAmJiB0aGlzLnByaXYudG9TdHJpbmcoMTYsIDIpKSArXG4gICAgICAgICAnIHB1YjogJyArICh0aGlzLnB1YiAmJiB0aGlzLnB1Yi5pbnNwZWN0KCkpICsgJyA+Jztcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBCTiA9IHJlcXVpcmUoJ2JuLmpzJyk7XG5cbnZhciBlbGxpcHRpYyA9IHJlcXVpcmUoJy4uLy4uL2VsbGlwdGljJyk7XG52YXIgdXRpbHMgPSBlbGxpcHRpYy51dGlscztcbnZhciBhc3NlcnQgPSB1dGlscy5hc3NlcnQ7XG5cbmZ1bmN0aW9uIFNpZ25hdHVyZShvcHRpb25zLCBlbmMpIHtcbiAgaWYgKG9wdGlvbnMgaW5zdGFuY2VvZiBTaWduYXR1cmUpXG4gICAgcmV0dXJuIG9wdGlvbnM7XG5cbiAgaWYgKHRoaXMuX2ltcG9ydERFUihvcHRpb25zLCBlbmMpKVxuICAgIHJldHVybjtcblxuICBhc3NlcnQob3B0aW9ucy5yICYmIG9wdGlvbnMucywgJ1NpZ25hdHVyZSB3aXRob3V0IHIgb3IgcycpO1xuICB0aGlzLnIgPSBuZXcgQk4ob3B0aW9ucy5yLCAxNik7XG4gIHRoaXMucyA9IG5ldyBCTihvcHRpb25zLnMsIDE2KTtcbiAgaWYgKG9wdGlvbnMucmVjb3ZlcnlQYXJhbSA9PT0gdW5kZWZpbmVkKVxuICAgIHRoaXMucmVjb3ZlcnlQYXJhbSA9IG51bGw7XG4gIGVsc2VcbiAgICB0aGlzLnJlY292ZXJ5UGFyYW0gPSBvcHRpb25zLnJlY292ZXJ5UGFyYW07XG59XG5tb2R1bGUuZXhwb3J0cyA9IFNpZ25hdHVyZTtcblxuZnVuY3Rpb24gUG9zaXRpb24oKSB7XG4gIHRoaXMucGxhY2UgPSAwO1xufVxuXG5mdW5jdGlvbiBnZXRMZW5ndGgoYnVmLCBwKSB7XG4gIHZhciBpbml0aWFsID0gYnVmW3AucGxhY2UrK107XG4gIGlmICghKGluaXRpYWwgJiAweDgwKSkge1xuICAgIHJldHVybiBpbml0aWFsO1xuICB9XG4gIHZhciBvY3RldExlbiA9IGluaXRpYWwgJiAweGY7XG4gIHZhciB2YWwgPSAwO1xuICBmb3IgKHZhciBpID0gMCwgb2ZmID0gcC5wbGFjZTsgaSA8IG9jdGV0TGVuOyBpKyssIG9mZisrKSB7XG4gICAgdmFsIDw8PSA4O1xuICAgIHZhbCB8PSBidWZbb2ZmXTtcbiAgfVxuICBwLnBsYWNlID0gb2ZmO1xuICByZXR1cm4gdmFsO1xufVxuXG5mdW5jdGlvbiBybVBhZGRpbmcoYnVmKSB7XG4gIHZhciBpID0gMDtcbiAgdmFyIGxlbiA9IGJ1Zi5sZW5ndGggLSAxO1xuICB3aGlsZSAoIWJ1ZltpXSAmJiAhKGJ1ZltpICsgMV0gJiAweDgwKSAmJiBpIDwgbGVuKSB7XG4gICAgaSsrO1xuICB9XG4gIGlmIChpID09PSAwKSB7XG4gICAgcmV0dXJuIGJ1ZjtcbiAgfVxuICByZXR1cm4gYnVmLnNsaWNlKGkpO1xufVxuXG5TaWduYXR1cmUucHJvdG90eXBlLl9pbXBvcnRERVIgPSBmdW5jdGlvbiBfaW1wb3J0REVSKGRhdGEsIGVuYykge1xuICBkYXRhID0gdXRpbHMudG9BcnJheShkYXRhLCBlbmMpO1xuICB2YXIgcCA9IG5ldyBQb3NpdGlvbigpO1xuICBpZiAoZGF0YVtwLnBsYWNlKytdICE9PSAweDMwKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciBsZW4gPSBnZXRMZW5ndGgoZGF0YSwgcCk7XG4gIGlmICgobGVuICsgcC5wbGFjZSkgIT09IGRhdGEubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChkYXRhW3AucGxhY2UrK10gIT09IDB4MDIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIHJsZW4gPSBnZXRMZW5ndGgoZGF0YSwgcCk7XG4gIHZhciByID0gZGF0YS5zbGljZShwLnBsYWNlLCBybGVuICsgcC5wbGFjZSk7XG4gIHAucGxhY2UgKz0gcmxlbjtcbiAgaWYgKGRhdGFbcC5wbGFjZSsrXSAhPT0gMHgwMikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgc2xlbiA9IGdldExlbmd0aChkYXRhLCBwKTtcbiAgaWYgKGRhdGEubGVuZ3RoICE9PSBzbGVuICsgcC5wbGFjZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgcyA9IGRhdGEuc2xpY2UocC5wbGFjZSwgc2xlbiArIHAucGxhY2UpO1xuICBpZiAoclswXSA9PT0gMCAmJiAoclsxXSAmIDB4ODApKSB7XG4gICAgciA9IHIuc2xpY2UoMSk7XG4gIH1cbiAgaWYgKHNbMF0gPT09IDAgJiYgKHNbMV0gJiAweDgwKSkge1xuICAgIHMgPSBzLnNsaWNlKDEpO1xuICB9XG5cbiAgdGhpcy5yID0gbmV3IEJOKHIpO1xuICB0aGlzLnMgPSBuZXcgQk4ocyk7XG4gIHRoaXMucmVjb3ZlcnlQYXJhbSA9IG51bGw7XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG5mdW5jdGlvbiBjb25zdHJ1Y3RMZW5ndGgoYXJyLCBsZW4pIHtcbiAgaWYgKGxlbiA8IDB4ODApIHtcbiAgICBhcnIucHVzaChsZW4pO1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgb2N0ZXRzID0gMSArIChNYXRoLmxvZyhsZW4pIC8gTWF0aC5MTjIgPj4+IDMpO1xuICBhcnIucHVzaChvY3RldHMgfCAweDgwKTtcbiAgd2hpbGUgKC0tb2N0ZXRzKSB7XG4gICAgYXJyLnB1c2goKGxlbiA+Pj4gKG9jdGV0cyA8PCAzKSkgJiAweGZmKTtcbiAgfVxuICBhcnIucHVzaChsZW4pO1xufVxuXG5TaWduYXR1cmUucHJvdG90eXBlLnRvREVSID0gZnVuY3Rpb24gdG9ERVIoZW5jKSB7XG4gIHZhciByID0gdGhpcy5yLnRvQXJyYXkoKTtcbiAgdmFyIHMgPSB0aGlzLnMudG9BcnJheSgpO1xuXG4gIC8vIFBhZCB2YWx1ZXNcbiAgaWYgKHJbMF0gJiAweDgwKVxuICAgIHIgPSBbIDAgXS5jb25jYXQocik7XG4gIC8vIFBhZCB2YWx1ZXNcbiAgaWYgKHNbMF0gJiAweDgwKVxuICAgIHMgPSBbIDAgXS5jb25jYXQocyk7XG5cbiAgciA9IHJtUGFkZGluZyhyKTtcbiAgcyA9IHJtUGFkZGluZyhzKTtcblxuICB3aGlsZSAoIXNbMF0gJiYgIShzWzFdICYgMHg4MCkpIHtcbiAgICBzID0gcy5zbGljZSgxKTtcbiAgfVxuICB2YXIgYXJyID0gWyAweDAyIF07XG4gIGNvbnN0cnVjdExlbmd0aChhcnIsIHIubGVuZ3RoKTtcbiAgYXJyID0gYXJyLmNvbmNhdChyKTtcbiAgYXJyLnB1c2goMHgwMik7XG4gIGNvbnN0cnVjdExlbmd0aChhcnIsIHMubGVuZ3RoKTtcbiAgdmFyIGJhY2tIYWxmID0gYXJyLmNvbmNhdChzKTtcbiAgdmFyIHJlcyA9IFsgMHgzMCBdO1xuICBjb25zdHJ1Y3RMZW5ndGgocmVzLCBiYWNrSGFsZi5sZW5ndGgpO1xuICByZXMgPSByZXMuY29uY2F0KGJhY2tIYWxmKTtcbiAgcmV0dXJuIHV0aWxzLmVuY29kZShyZXMsIGVuYyk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgaGFzaCA9IHJlcXVpcmUoJ2hhc2guanMnKTtcbnZhciBlbGxpcHRpYyA9IHJlcXVpcmUoJy4uLy4uL2VsbGlwdGljJyk7XG52YXIgdXRpbHMgPSBlbGxpcHRpYy51dGlscztcbnZhciBhc3NlcnQgPSB1dGlscy5hc3NlcnQ7XG52YXIgcGFyc2VCeXRlcyA9IHV0aWxzLnBhcnNlQnl0ZXM7XG52YXIgS2V5UGFpciA9IHJlcXVpcmUoJy4va2V5Jyk7XG52YXIgU2lnbmF0dXJlID0gcmVxdWlyZSgnLi9zaWduYXR1cmUnKTtcblxuZnVuY3Rpb24gRUREU0EoY3VydmUpIHtcbiAgYXNzZXJ0KGN1cnZlID09PSAnZWQyNTUxOScsICdvbmx5IHRlc3RlZCB3aXRoIGVkMjU1MTkgc28gZmFyJyk7XG5cbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIEVERFNBKSlcbiAgICByZXR1cm4gbmV3IEVERFNBKGN1cnZlKTtcblxuICB2YXIgY3VydmUgPSBlbGxpcHRpYy5jdXJ2ZXNbY3VydmVdLmN1cnZlO1xuICB0aGlzLmN1cnZlID0gY3VydmU7XG4gIHRoaXMuZyA9IGN1cnZlLmc7XG4gIHRoaXMuZy5wcmVjb21wdXRlKGN1cnZlLm4uYml0TGVuZ3RoKCkgKyAxKTtcblxuICB0aGlzLnBvaW50Q2xhc3MgPSBjdXJ2ZS5wb2ludCgpLmNvbnN0cnVjdG9yO1xuICB0aGlzLmVuY29kaW5nTGVuZ3RoID0gTWF0aC5jZWlsKGN1cnZlLm4uYml0TGVuZ3RoKCkgLyA4KTtcbiAgdGhpcy5oYXNoID0gaGFzaC5zaGE1MTI7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gRUREU0E7XG5cbi8qKlxuKiBAcGFyYW0ge0FycmF5fFN0cmluZ30gbWVzc2FnZSAtIG1lc3NhZ2UgYnl0ZXNcbiogQHBhcmFtIHtBcnJheXxTdHJpbmd8S2V5UGFpcn0gc2VjcmV0IC0gc2VjcmV0IGJ5dGVzIG9yIGEga2V5cGFpclxuKiBAcmV0dXJucyB7U2lnbmF0dXJlfSAtIHNpZ25hdHVyZVxuKi9cbkVERFNBLnByb3RvdHlwZS5zaWduID0gZnVuY3Rpb24gc2lnbihtZXNzYWdlLCBzZWNyZXQpIHtcbiAgbWVzc2FnZSA9IHBhcnNlQnl0ZXMobWVzc2FnZSk7XG4gIHZhciBrZXkgPSB0aGlzLmtleUZyb21TZWNyZXQoc2VjcmV0KTtcbiAgdmFyIHIgPSB0aGlzLmhhc2hJbnQoa2V5Lm1lc3NhZ2VQcmVmaXgoKSwgbWVzc2FnZSk7XG4gIHZhciBSID0gdGhpcy5nLm11bChyKTtcbiAgdmFyIFJlbmNvZGVkID0gdGhpcy5lbmNvZGVQb2ludChSKTtcbiAgdmFyIHNfID0gdGhpcy5oYXNoSW50KFJlbmNvZGVkLCBrZXkucHViQnl0ZXMoKSwgbWVzc2FnZSlcbiAgICAgICAgICAgICAgIC5tdWwoa2V5LnByaXYoKSk7XG4gIHZhciBTID0gci5hZGQoc18pLnVtb2QodGhpcy5jdXJ2ZS5uKTtcbiAgcmV0dXJuIHRoaXMubWFrZVNpZ25hdHVyZSh7IFI6IFIsIFM6IFMsIFJlbmNvZGVkOiBSZW5jb2RlZCB9KTtcbn07XG5cbi8qKlxuKiBAcGFyYW0ge0FycmF5fSBtZXNzYWdlIC0gbWVzc2FnZSBieXRlc1xuKiBAcGFyYW0ge0FycmF5fFN0cmluZ3xTaWduYXR1cmV9IHNpZyAtIHNpZyBieXRlc1xuKiBAcGFyYW0ge0FycmF5fFN0cmluZ3xQb2ludHxLZXlQYWlyfSBwdWIgLSBwdWJsaWMga2V5XG4qIEByZXR1cm5zIHtCb29sZWFufSAtIHRydWUgaWYgcHVibGljIGtleSBtYXRjaGVzIHNpZyBvZiBtZXNzYWdlXG4qL1xuRUREU0EucHJvdG90eXBlLnZlcmlmeSA9IGZ1bmN0aW9uIHZlcmlmeShtZXNzYWdlLCBzaWcsIHB1Yikge1xuICBtZXNzYWdlID0gcGFyc2VCeXRlcyhtZXNzYWdlKTtcbiAgc2lnID0gdGhpcy5tYWtlU2lnbmF0dXJlKHNpZyk7XG4gIHZhciBrZXkgPSB0aGlzLmtleUZyb21QdWJsaWMocHViKTtcbiAgdmFyIGggPSB0aGlzLmhhc2hJbnQoc2lnLlJlbmNvZGVkKCksIGtleS5wdWJCeXRlcygpLCBtZXNzYWdlKTtcbiAgdmFyIFNHID0gdGhpcy5nLm11bChzaWcuUygpKTtcbiAgdmFyIFJwbHVzQWggPSBzaWcuUigpLmFkZChrZXkucHViKCkubXVsKGgpKTtcbiAgcmV0dXJuIFJwbHVzQWguZXEoU0cpO1xufTtcblxuRUREU0EucHJvdG90eXBlLmhhc2hJbnQgPSBmdW5jdGlvbiBoYXNoSW50KCkge1xuICB2YXIgaGFzaCA9IHRoaXMuaGFzaCgpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKylcbiAgICBoYXNoLnVwZGF0ZShhcmd1bWVudHNbaV0pO1xuICByZXR1cm4gdXRpbHMuaW50RnJvbUxFKGhhc2guZGlnZXN0KCkpLnVtb2QodGhpcy5jdXJ2ZS5uKTtcbn07XG5cbkVERFNBLnByb3RvdHlwZS5rZXlGcm9tUHVibGljID0gZnVuY3Rpb24ga2V5RnJvbVB1YmxpYyhwdWIpIHtcbiAgcmV0dXJuIEtleVBhaXIuZnJvbVB1YmxpYyh0aGlzLCBwdWIpO1xufTtcblxuRUREU0EucHJvdG90eXBlLmtleUZyb21TZWNyZXQgPSBmdW5jdGlvbiBrZXlGcm9tU2VjcmV0KHNlY3JldCkge1xuICByZXR1cm4gS2V5UGFpci5mcm9tU2VjcmV0KHRoaXMsIHNlY3JldCk7XG59O1xuXG5FRERTQS5wcm90b3R5cGUubWFrZVNpZ25hdHVyZSA9IGZ1bmN0aW9uIG1ha2VTaWduYXR1cmUoc2lnKSB7XG4gIGlmIChzaWcgaW5zdGFuY2VvZiBTaWduYXR1cmUpXG4gICAgcmV0dXJuIHNpZztcbiAgcmV0dXJuIG5ldyBTaWduYXR1cmUodGhpcywgc2lnKTtcbn07XG5cbi8qKlxuKiAqIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9kcmFmdC1qb3NlZnNzb24tZWRkc2EtZWQyNTUxOS0wMyNzZWN0aW9uLTUuMlxuKlxuKiBFRERTQSBkZWZpbmVzIG1ldGhvZHMgZm9yIGVuY29kaW5nIGFuZCBkZWNvZGluZyBwb2ludHMgYW5kIGludGVnZXJzLiBUaGVzZSBhcmVcbiogaGVscGVyIGNvbnZlbmllbmNlIG1ldGhvZHMsIHRoYXQgcGFzcyBhbG9uZyB0byB1dGlsaXR5IGZ1bmN0aW9ucyBpbXBsaWVkXG4qIHBhcmFtZXRlcnMuXG4qXG4qL1xuRUREU0EucHJvdG90eXBlLmVuY29kZVBvaW50ID0gZnVuY3Rpb24gZW5jb2RlUG9pbnQocG9pbnQpIHtcbiAgdmFyIGVuYyA9IHBvaW50LmdldFkoKS50b0FycmF5KCdsZScsIHRoaXMuZW5jb2RpbmdMZW5ndGgpO1xuICBlbmNbdGhpcy5lbmNvZGluZ0xlbmd0aCAtIDFdIHw9IHBvaW50LmdldFgoKS5pc09kZCgpID8gMHg4MCA6IDA7XG4gIHJldHVybiBlbmM7XG59O1xuXG5FRERTQS5wcm90b3R5cGUuZGVjb2RlUG9pbnQgPSBmdW5jdGlvbiBkZWNvZGVQb2ludChieXRlcykge1xuICBieXRlcyA9IHV0aWxzLnBhcnNlQnl0ZXMoYnl0ZXMpO1xuXG4gIHZhciBsYXN0SXggPSBieXRlcy5sZW5ndGggLSAxO1xuICB2YXIgbm9ybWVkID0gYnl0ZXMuc2xpY2UoMCwgbGFzdEl4KS5jb25jYXQoYnl0ZXNbbGFzdEl4XSAmIH4weDgwKTtcbiAgdmFyIHhJc09kZCA9IChieXRlc1tsYXN0SXhdICYgMHg4MCkgIT09IDA7XG5cbiAgdmFyIHkgPSB1dGlscy5pbnRGcm9tTEUobm9ybWVkKTtcbiAgcmV0dXJuIHRoaXMuY3VydmUucG9pbnRGcm9tWSh5LCB4SXNPZGQpO1xufTtcblxuRUREU0EucHJvdG90eXBlLmVuY29kZUludCA9IGZ1bmN0aW9uIGVuY29kZUludChudW0pIHtcbiAgcmV0dXJuIG51bS50b0FycmF5KCdsZScsIHRoaXMuZW5jb2RpbmdMZW5ndGgpO1xufTtcblxuRUREU0EucHJvdG90eXBlLmRlY29kZUludCA9IGZ1bmN0aW9uIGRlY29kZUludChieXRlcykge1xuICByZXR1cm4gdXRpbHMuaW50RnJvbUxFKGJ5dGVzKTtcbn07XG5cbkVERFNBLnByb3RvdHlwZS5pc1BvaW50ID0gZnVuY3Rpb24gaXNQb2ludCh2YWwpIHtcbiAgcmV0dXJuIHZhbCBpbnN0YW5jZW9mIHRoaXMucG9pbnRDbGFzcztcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBlbGxpcHRpYyA9IHJlcXVpcmUoJy4uLy4uL2VsbGlwdGljJyk7XG52YXIgdXRpbHMgPSBlbGxpcHRpYy51dGlscztcbnZhciBhc3NlcnQgPSB1dGlscy5hc3NlcnQ7XG52YXIgcGFyc2VCeXRlcyA9IHV0aWxzLnBhcnNlQnl0ZXM7XG52YXIgY2FjaGVkUHJvcGVydHkgPSB1dGlscy5jYWNoZWRQcm9wZXJ0eTtcblxuLyoqXG4qIEBwYXJhbSB7RUREU0F9IGVkZHNhIC0gaW5zdGFuY2VcbiogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyAtIHB1YmxpYy9wcml2YXRlIGtleSBwYXJhbWV0ZXJzXG4qXG4qIEBwYXJhbSB7QXJyYXk8Qnl0ZT59IFtwYXJhbXMuc2VjcmV0XSAtIHNlY3JldCBzZWVkIGJ5dGVzXG4qIEBwYXJhbSB7UG9pbnR9IFtwYXJhbXMucHViXSAtIHB1YmxpYyBrZXkgcG9pbnQgKGFrYSBgQWAgaW4gZWRkc2EgdGVybXMpXG4qIEBwYXJhbSB7QXJyYXk8Qnl0ZT59IFtwYXJhbXMucHViXSAtIHB1YmxpYyBrZXkgcG9pbnQgZW5jb2RlZCBhcyBieXRlc1xuKlxuKi9cbmZ1bmN0aW9uIEtleVBhaXIoZWRkc2EsIHBhcmFtcykge1xuICB0aGlzLmVkZHNhID0gZWRkc2E7XG4gIHRoaXMuX3NlY3JldCA9IHBhcnNlQnl0ZXMocGFyYW1zLnNlY3JldCk7XG4gIGlmIChlZGRzYS5pc1BvaW50KHBhcmFtcy5wdWIpKVxuICAgIHRoaXMuX3B1YiA9IHBhcmFtcy5wdWI7XG4gIGVsc2VcbiAgICB0aGlzLl9wdWJCeXRlcyA9IHBhcnNlQnl0ZXMocGFyYW1zLnB1Yik7XG59XG5cbktleVBhaXIuZnJvbVB1YmxpYyA9IGZ1bmN0aW9uIGZyb21QdWJsaWMoZWRkc2EsIHB1Yikge1xuICBpZiAocHViIGluc3RhbmNlb2YgS2V5UGFpcilcbiAgICByZXR1cm4gcHViO1xuICByZXR1cm4gbmV3IEtleVBhaXIoZWRkc2EsIHsgcHViOiBwdWIgfSk7XG59O1xuXG5LZXlQYWlyLmZyb21TZWNyZXQgPSBmdW5jdGlvbiBmcm9tU2VjcmV0KGVkZHNhLCBzZWNyZXQpIHtcbiAgaWYgKHNlY3JldCBpbnN0YW5jZW9mIEtleVBhaXIpXG4gICAgcmV0dXJuIHNlY3JldDtcbiAgcmV0dXJuIG5ldyBLZXlQYWlyKGVkZHNhLCB7IHNlY3JldDogc2VjcmV0IH0pO1xufTtcblxuS2V5UGFpci5wcm90b3R5cGUuc2VjcmV0ID0gZnVuY3Rpb24gc2VjcmV0KCkge1xuICByZXR1cm4gdGhpcy5fc2VjcmV0O1xufTtcblxuY2FjaGVkUHJvcGVydHkoS2V5UGFpciwgZnVuY3Rpb24gcHViQnl0ZXMoKSB7XG4gIHJldHVybiB0aGlzLmVkZHNhLmVuY29kZVBvaW50KHRoaXMucHViKCkpO1xufSk7XG5cbmNhY2hlZFByb3BlcnR5KEtleVBhaXIsIGZ1bmN0aW9uIHB1YigpIHtcbiAgaWYgKHRoaXMuX3B1YkJ5dGVzKVxuICAgIHJldHVybiB0aGlzLmVkZHNhLmRlY29kZVBvaW50KHRoaXMuX3B1YkJ5dGVzKTtcbiAgcmV0dXJuIHRoaXMuZWRkc2EuZy5tdWwodGhpcy5wcml2KCkpO1xufSk7XG5cbmNhY2hlZFByb3BlcnR5KEtleVBhaXIsIGZ1bmN0aW9uIHByaXZCeXRlcygpIHtcbiAgdmFyIGVkZHNhID0gdGhpcy5lZGRzYTtcbiAgdmFyIGhhc2ggPSB0aGlzLmhhc2goKTtcbiAgdmFyIGxhc3RJeCA9IGVkZHNhLmVuY29kaW5nTGVuZ3RoIC0gMTtcblxuICB2YXIgYSA9IGhhc2guc2xpY2UoMCwgZWRkc2EuZW5jb2RpbmdMZW5ndGgpO1xuICBhWzBdICY9IDI0ODtcbiAgYVtsYXN0SXhdICY9IDEyNztcbiAgYVtsYXN0SXhdIHw9IDY0O1xuXG4gIHJldHVybiBhO1xufSk7XG5cbmNhY2hlZFByb3BlcnR5KEtleVBhaXIsIGZ1bmN0aW9uIHByaXYoKSB7XG4gIHJldHVybiB0aGlzLmVkZHNhLmRlY29kZUludCh0aGlzLnByaXZCeXRlcygpKTtcbn0pO1xuXG5jYWNoZWRQcm9wZXJ0eShLZXlQYWlyLCBmdW5jdGlvbiBoYXNoKCkge1xuICByZXR1cm4gdGhpcy5lZGRzYS5oYXNoKCkudXBkYXRlKHRoaXMuc2VjcmV0KCkpLmRpZ2VzdCgpO1xufSk7XG5cbmNhY2hlZFByb3BlcnR5KEtleVBhaXIsIGZ1bmN0aW9uIG1lc3NhZ2VQcmVmaXgoKSB7XG4gIHJldHVybiB0aGlzLmhhc2goKS5zbGljZSh0aGlzLmVkZHNhLmVuY29kaW5nTGVuZ3RoKTtcbn0pO1xuXG5LZXlQYWlyLnByb3RvdHlwZS5zaWduID0gZnVuY3Rpb24gc2lnbihtZXNzYWdlKSB7XG4gIGFzc2VydCh0aGlzLl9zZWNyZXQsICdLZXlQYWlyIGNhbiBvbmx5IHZlcmlmeScpO1xuICByZXR1cm4gdGhpcy5lZGRzYS5zaWduKG1lc3NhZ2UsIHRoaXMpO1xufTtcblxuS2V5UGFpci5wcm90b3R5cGUudmVyaWZ5ID0gZnVuY3Rpb24gdmVyaWZ5KG1lc3NhZ2UsIHNpZykge1xuICByZXR1cm4gdGhpcy5lZGRzYS52ZXJpZnkobWVzc2FnZSwgc2lnLCB0aGlzKTtcbn07XG5cbktleVBhaXIucHJvdG90eXBlLmdldFNlY3JldCA9IGZ1bmN0aW9uIGdldFNlY3JldChlbmMpIHtcbiAgYXNzZXJ0KHRoaXMuX3NlY3JldCwgJ0tleVBhaXIgaXMgcHVibGljIG9ubHknKTtcbiAgcmV0dXJuIHV0aWxzLmVuY29kZSh0aGlzLnNlY3JldCgpLCBlbmMpO1xufTtcblxuS2V5UGFpci5wcm90b3R5cGUuZ2V0UHVibGljID0gZnVuY3Rpb24gZ2V0UHVibGljKGVuYykge1xuICByZXR1cm4gdXRpbHMuZW5jb2RlKHRoaXMucHViQnl0ZXMoKSwgZW5jKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gS2V5UGFpcjtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIEJOID0gcmVxdWlyZSgnYm4uanMnKTtcbnZhciBlbGxpcHRpYyA9IHJlcXVpcmUoJy4uLy4uL2VsbGlwdGljJyk7XG52YXIgdXRpbHMgPSBlbGxpcHRpYy51dGlscztcbnZhciBhc3NlcnQgPSB1dGlscy5hc3NlcnQ7XG52YXIgY2FjaGVkUHJvcGVydHkgPSB1dGlscy5jYWNoZWRQcm9wZXJ0eTtcbnZhciBwYXJzZUJ5dGVzID0gdXRpbHMucGFyc2VCeXRlcztcblxuLyoqXG4qIEBwYXJhbSB7RUREU0F9IGVkZHNhIC0gZWRkc2EgaW5zdGFuY2VcbiogQHBhcmFtIHtBcnJheTxCeXRlcz58T2JqZWN0fSBzaWcgLVxuKiBAcGFyYW0ge0FycmF5PEJ5dGVzPnxQb2ludH0gW3NpZy5SXSAtIFIgcG9pbnQgYXMgUG9pbnQgb3IgYnl0ZXNcbiogQHBhcmFtIHtBcnJheTxCeXRlcz58Ym59IFtzaWcuU10gLSBTIHNjYWxhciBhcyBibiBvciBieXRlc1xuKiBAcGFyYW0ge0FycmF5PEJ5dGVzPn0gW3NpZy5SZW5jb2RlZF0gLSBSIHBvaW50IGVuY29kZWRcbiogQHBhcmFtIHtBcnJheTxCeXRlcz59IFtzaWcuU2VuY29kZWRdIC0gUyBzY2FsYXIgZW5jb2RlZFxuKi9cbmZ1bmN0aW9uIFNpZ25hdHVyZShlZGRzYSwgc2lnKSB7XG4gIHRoaXMuZWRkc2EgPSBlZGRzYTtcblxuICBpZiAodHlwZW9mIHNpZyAhPT0gJ29iamVjdCcpXG4gICAgc2lnID0gcGFyc2VCeXRlcyhzaWcpO1xuXG4gIGlmIChBcnJheS5pc0FycmF5KHNpZykpIHtcbiAgICBzaWcgPSB7XG4gICAgICBSOiBzaWcuc2xpY2UoMCwgZWRkc2EuZW5jb2RpbmdMZW5ndGgpLFxuICAgICAgUzogc2lnLnNsaWNlKGVkZHNhLmVuY29kaW5nTGVuZ3RoKVxuICAgIH07XG4gIH1cblxuICBhc3NlcnQoc2lnLlIgJiYgc2lnLlMsICdTaWduYXR1cmUgd2l0aG91dCBSIG9yIFMnKTtcblxuICBpZiAoZWRkc2EuaXNQb2ludChzaWcuUikpXG4gICAgdGhpcy5fUiA9IHNpZy5SO1xuICBpZiAoc2lnLlMgaW5zdGFuY2VvZiBCTilcbiAgICB0aGlzLl9TID0gc2lnLlM7XG5cbiAgdGhpcy5fUmVuY29kZWQgPSBBcnJheS5pc0FycmF5KHNpZy5SKSA/IHNpZy5SIDogc2lnLlJlbmNvZGVkO1xuICB0aGlzLl9TZW5jb2RlZCA9IEFycmF5LmlzQXJyYXkoc2lnLlMpID8gc2lnLlMgOiBzaWcuU2VuY29kZWQ7XG59XG5cbmNhY2hlZFByb3BlcnR5KFNpZ25hdHVyZSwgZnVuY3Rpb24gUygpIHtcbiAgcmV0dXJuIHRoaXMuZWRkc2EuZGVjb2RlSW50KHRoaXMuU2VuY29kZWQoKSk7XG59KTtcblxuY2FjaGVkUHJvcGVydHkoU2lnbmF0dXJlLCBmdW5jdGlvbiBSKCkge1xuICByZXR1cm4gdGhpcy5lZGRzYS5kZWNvZGVQb2ludCh0aGlzLlJlbmNvZGVkKCkpO1xufSk7XG5cbmNhY2hlZFByb3BlcnR5KFNpZ25hdHVyZSwgZnVuY3Rpb24gUmVuY29kZWQoKSB7XG4gIHJldHVybiB0aGlzLmVkZHNhLmVuY29kZVBvaW50KHRoaXMuUigpKTtcbn0pO1xuXG5jYWNoZWRQcm9wZXJ0eShTaWduYXR1cmUsIGZ1bmN0aW9uIFNlbmNvZGVkKCkge1xuICByZXR1cm4gdGhpcy5lZGRzYS5lbmNvZGVJbnQodGhpcy5TKCkpO1xufSk7XG5cblNpZ25hdHVyZS5wcm90b3R5cGUudG9CeXRlcyA9IGZ1bmN0aW9uIHRvQnl0ZXMoKSB7XG4gIHJldHVybiB0aGlzLlJlbmNvZGVkKCkuY29uY2F0KHRoaXMuU2VuY29kZWQoKSk7XG59O1xuXG5TaWduYXR1cmUucHJvdG90eXBlLnRvSGV4ID0gZnVuY3Rpb24gdG9IZXgoKSB7XG4gIHJldHVybiB1dGlscy5lbmNvZGUodGhpcy50b0J5dGVzKCksICdoZXgnKS50b1VwcGVyQ2FzZSgpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBTaWduYXR1cmU7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBoYXNoID0gcmVxdWlyZSgnaGFzaC5qcycpO1xudmFyIGVsbGlwdGljID0gcmVxdWlyZSgnLi4vZWxsaXB0aWMnKTtcbnZhciB1dGlscyA9IGVsbGlwdGljLnV0aWxzO1xudmFyIGFzc2VydCA9IHV0aWxzLmFzc2VydDtcblxuZnVuY3Rpb24gSG1hY0RSQkcob3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgSG1hY0RSQkcpKVxuICAgIHJldHVybiBuZXcgSG1hY0RSQkcob3B0aW9ucyk7XG4gIHRoaXMuaGFzaCA9IG9wdGlvbnMuaGFzaDtcbiAgdGhpcy5wcmVkUmVzaXN0ID0gISFvcHRpb25zLnByZWRSZXNpc3Q7XG5cbiAgdGhpcy5vdXRMZW4gPSB0aGlzLmhhc2gub3V0U2l6ZTtcbiAgdGhpcy5taW5FbnRyb3B5ID0gb3B0aW9ucy5taW5FbnRyb3B5IHx8IHRoaXMuaGFzaC5obWFjU3RyZW5ndGg7XG5cbiAgdGhpcy5yZXNlZWQgPSBudWxsO1xuICB0aGlzLnJlc2VlZEludGVydmFsID0gbnVsbDtcbiAgdGhpcy5LID0gbnVsbDtcbiAgdGhpcy5WID0gbnVsbDtcblxuICB2YXIgZW50cm9weSA9IHV0aWxzLnRvQXJyYXkob3B0aW9ucy5lbnRyb3B5LCBvcHRpb25zLmVudHJvcHlFbmMpO1xuICB2YXIgbm9uY2UgPSB1dGlscy50b0FycmF5KG9wdGlvbnMubm9uY2UsIG9wdGlvbnMubm9uY2VFbmMpO1xuICB2YXIgcGVycyA9IHV0aWxzLnRvQXJyYXkob3B0aW9ucy5wZXJzLCBvcHRpb25zLnBlcnNFbmMpO1xuICBhc3NlcnQoZW50cm9weS5sZW5ndGggPj0gKHRoaXMubWluRW50cm9weSAvIDgpLFxuICAgICAgICAgJ05vdCBlbm91Z2ggZW50cm9weS4gTWluaW11bSBpczogJyArIHRoaXMubWluRW50cm9weSArICcgYml0cycpO1xuICB0aGlzLl9pbml0KGVudHJvcHksIG5vbmNlLCBwZXJzKTtcbn1cbm1vZHVsZS5leHBvcnRzID0gSG1hY0RSQkc7XG5cbkhtYWNEUkJHLnByb3RvdHlwZS5faW5pdCA9IGZ1bmN0aW9uIGluaXQoZW50cm9weSwgbm9uY2UsIHBlcnMpIHtcbiAgdmFyIHNlZWQgPSBlbnRyb3B5LmNvbmNhdChub25jZSkuY29uY2F0KHBlcnMpO1xuXG4gIHRoaXMuSyA9IG5ldyBBcnJheSh0aGlzLm91dExlbiAvIDgpO1xuICB0aGlzLlYgPSBuZXcgQXJyYXkodGhpcy5vdXRMZW4gLyA4KTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLlYubGVuZ3RoOyBpKyspIHtcbiAgICB0aGlzLktbaV0gPSAweDAwO1xuICAgIHRoaXMuVltpXSA9IDB4MDE7XG4gIH1cblxuICB0aGlzLl91cGRhdGUoc2VlZCk7XG4gIHRoaXMucmVzZWVkID0gMTtcbiAgdGhpcy5yZXNlZWRJbnRlcnZhbCA9IDB4MTAwMDAwMDAwMDAwMDsgIC8vIDJeNDhcbn07XG5cbkhtYWNEUkJHLnByb3RvdHlwZS5faG1hYyA9IGZ1bmN0aW9uIGhtYWMoKSB7XG4gIHJldHVybiBuZXcgaGFzaC5obWFjKHRoaXMuaGFzaCwgdGhpcy5LKTtcbn07XG5cbkhtYWNEUkJHLnByb3RvdHlwZS5fdXBkYXRlID0gZnVuY3Rpb24gdXBkYXRlKHNlZWQpIHtcbiAgdmFyIGttYWMgPSB0aGlzLl9obWFjKClcbiAgICAgICAgICAgICAgICAgLnVwZGF0ZSh0aGlzLlYpXG4gICAgICAgICAgICAgICAgIC51cGRhdGUoWyAweDAwIF0pO1xuICBpZiAoc2VlZClcbiAgICBrbWFjID0ga21hYy51cGRhdGUoc2VlZCk7XG4gIHRoaXMuSyA9IGttYWMuZGlnZXN0KCk7XG4gIHRoaXMuViA9IHRoaXMuX2htYWMoKS51cGRhdGUodGhpcy5WKS5kaWdlc3QoKTtcbiAgaWYgKCFzZWVkKVxuICAgIHJldHVybjtcblxuICB0aGlzLksgPSB0aGlzLl9obWFjKClcbiAgICAgICAgICAgICAgIC51cGRhdGUodGhpcy5WKVxuICAgICAgICAgICAgICAgLnVwZGF0ZShbIDB4MDEgXSlcbiAgICAgICAgICAgICAgIC51cGRhdGUoc2VlZClcbiAgICAgICAgICAgICAgIC5kaWdlc3QoKTtcbiAgdGhpcy5WID0gdGhpcy5faG1hYygpLnVwZGF0ZSh0aGlzLlYpLmRpZ2VzdCgpO1xufTtcblxuSG1hY0RSQkcucHJvdG90eXBlLnJlc2VlZCA9IGZ1bmN0aW9uIHJlc2VlZChlbnRyb3B5LCBlbnRyb3B5RW5jLCBhZGQsIGFkZEVuYykge1xuICAvLyBPcHRpb25hbCBlbnRyb3B5IGVuY1xuICBpZiAodHlwZW9mIGVudHJvcHlFbmMgIT09ICdzdHJpbmcnKSB7XG4gICAgYWRkRW5jID0gYWRkO1xuICAgIGFkZCA9IGVudHJvcHlFbmM7XG4gICAgZW50cm9weUVuYyA9IG51bGw7XG4gIH1cblxuICBlbnRyb3B5ID0gdXRpbHMudG9CdWZmZXIoZW50cm9weSwgZW50cm9weUVuYyk7XG4gIGFkZCA9IHV0aWxzLnRvQnVmZmVyKGFkZCwgYWRkRW5jKTtcblxuICBhc3NlcnQoZW50cm9weS5sZW5ndGggPj0gKHRoaXMubWluRW50cm9weSAvIDgpLFxuICAgICAgICAgJ05vdCBlbm91Z2ggZW50cm9weS4gTWluaW11bSBpczogJyArIHRoaXMubWluRW50cm9weSArICcgYml0cycpO1xuXG4gIHRoaXMuX3VwZGF0ZShlbnRyb3B5LmNvbmNhdChhZGQgfHwgW10pKTtcbiAgdGhpcy5yZXNlZWQgPSAxO1xufTtcblxuSG1hY0RSQkcucHJvdG90eXBlLmdlbmVyYXRlID0gZnVuY3Rpb24gZ2VuZXJhdGUobGVuLCBlbmMsIGFkZCwgYWRkRW5jKSB7XG4gIGlmICh0aGlzLnJlc2VlZCA+IHRoaXMucmVzZWVkSW50ZXJ2YWwpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdSZXNlZWQgaXMgcmVxdWlyZWQnKTtcblxuICAvLyBPcHRpb25hbCBlbmNvZGluZ1xuICBpZiAodHlwZW9mIGVuYyAhPT0gJ3N0cmluZycpIHtcbiAgICBhZGRFbmMgPSBhZGQ7XG4gICAgYWRkID0gZW5jO1xuICAgIGVuYyA9IG51bGw7XG4gIH1cblxuICAvLyBPcHRpb25hbCBhZGRpdGlvbmFsIGRhdGFcbiAgaWYgKGFkZCkge1xuICAgIGFkZCA9IHV0aWxzLnRvQXJyYXkoYWRkLCBhZGRFbmMpO1xuICAgIHRoaXMuX3VwZGF0ZShhZGQpO1xuICB9XG5cbiAgdmFyIHRlbXAgPSBbXTtcbiAgd2hpbGUgKHRlbXAubGVuZ3RoIDwgbGVuKSB7XG4gICAgdGhpcy5WID0gdGhpcy5faG1hYygpLnVwZGF0ZSh0aGlzLlYpLmRpZ2VzdCgpO1xuICAgIHRlbXAgPSB0ZW1wLmNvbmNhdCh0aGlzLlYpO1xuICB9XG5cbiAgdmFyIHJlcyA9IHRlbXAuc2xpY2UoMCwgbGVuKTtcbiAgdGhpcy5fdXBkYXRlKGFkZCk7XG4gIHRoaXMucmVzZWVkKys7XG4gIHJldHVybiB1dGlscy5lbmNvZGUocmVzLCBlbmMpO1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0ge1xuICBkb3VibGVzOiB7XG4gICAgc3RlcDogNCxcbiAgICBwb2ludHM6IFtcbiAgICAgIFtcbiAgICAgICAgJ2U2MGZjZTkzYjU5ZTllYzUzMDExYWFiYzIxYzIzZTk3YjJhMzEzNjliODdhNWFlOWM0NGVlODllMmE2ZGVjMGEnLFxuICAgICAgICAnZjdlMzUwNzM5OWU1OTU5MjlkYjk5ZjM0ZjU3OTM3MTAxMjk2ODkxZTQ0ZDIzZjBiZTFmMzJjY2U2OTYxNjgyMSdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc4MjgyMjYzMjEyYzYwOWQ5ZWEyYTZlM2UxNzJkZTIzOGQ4YzM5Y2FiZDVhYzFjYTEwNjQ2ZTIzZmQ1ZjUxNTA4JyxcbiAgICAgICAgJzExZjhhODA5ODU1N2RmZTQ1ZTgyNTZlODMwYjYwYWNlNjJkNjEzYWMyZjdiMTdiZWQzMWI2ZWFmZjZlMjZjYWYnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMTc1ZTE1OWY3MjhiODY1YTcyZjk5Y2M2YzZmYzg0NmRlMGI5MzgzM2ZkMjIyMmVkNzNmY2U1YjU1MWU1YjczOScsXG4gICAgICAgICdkMzUwNmUwZDllM2M3OWViYTRlZjk3YTUxZmY3MWY1ZWFjYjU5NTVhZGQyNDM0NWM2ZWZhNmZmZWU5ZmVkNjk1J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzM2M2Q5MGQ0NDdiMDBjOWM5OWNlYWMwNWI2MjYyZWUwNTM0NDFjN2U1NTU1MmZmZTUyNmJhZDhmODNmZjQ2NDAnLFxuICAgICAgICAnNGUyNzNhZGZjNzMyMjIxOTUzYjQ0NTM5N2YzMzYzMTQ1YjlhODkwMDgxOTllY2I2MjAwM2M3ZjNiZWU5ZGU5J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzhiNGI1ZjE2NWRmM2MyYmU4YzYyNDRiNWI3NDU2Mzg4NDNlNGE3ODFhMTViY2QxYjY5Zjc5YTU1ZGZmZGY4MGMnLFxuICAgICAgICAnNGFhZDBhNmY2OGQzMDhiNGIzZmJkNzgxM2FiMGRhMDRmOWUzMzY1NDYxNjJlZTU2YjNlZmYwYzY1ZmQ0ZmQzNidcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc3MjNjYmFhNmU1ZGI5OTZkNmJmNzcxYzAwYmQ1NDhjN2I3MDBkYmZmYTZjMGU3N2JjYjYxMTU5MjUyMzJmY2RhJyxcbiAgICAgICAgJzk2ZTg2N2I1NTk1Y2M0OThhOTIxMTM3NDg4ODI0ZDZlMjY2MGEwNjUzNzc5NDk0ODAxZGMwNjlkOWViMzlmNWYnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZWViZmE0ZDQ5M2JlYmY5OGJhNWZlZWM4MTJjMmQzYjUwOTQ3OTYxMjM3YTkxOTgzOWE1MzNlY2EwZTdkZDdmYScsXG4gICAgICAgICc1ZDlhOGNhMzk3MGVmMGYyNjllZTdlZGFmMTc4MDg5ZDlhZTRjZGMzYTcxMWY3MTJkZGZkNGZkYWUxZGU4OTk5J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzEwMGY0NGRhNjk2ZTcxNjcyNzkxZDBhMDliN2JkZTQ1OWYxMjE1YTI5YjNjMDNiZmVmZDc4MzViMzlhNDhkYjAnLFxuICAgICAgICAnY2RkOWUxMzE5MmEwMGI3NzJlYzhmMzMwMGMwOTA2NjZiN2ZmNGExOGZmNTE5NWFjMGZiZDVjZDYyYmM2NWEwOSdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdlMTAzMWJlMjYyYzdlZDFiMWRjOTIyN2E0YTA0YzAxN2E3N2Y4ZDQ0NjRmM2IzODUyYzhhY2RlNmU1MzRmZDJkJyxcbiAgICAgICAgJzlkNzA2MTkyODk0MDQwNWU2YmI2YTQxNzY1OTc1MzVhZjI5MmRkNDE5ZTFjZWQ3OWE0NGYxOGYyOTQ1NmEwMGQnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZmVlYTZjYWU0NmQ1NWI1MzBhYzI4MzlmMTQzYmQ3ZWM1Y2Y4YjI2NmE0MWQ2YWY1MmQ1ZTY4OGQ5MDk0Njk2ZCcsXG4gICAgICAgICdlNTdjNmI2Yzk3ZGNlMWJhYjA2ZTRlMTJiZjNlY2Q1Yzk4MWM4OTU3Y2M0MTQ0MmQzMTU1ZGViZjE4MDkwMDg4J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2RhNjdhOTFkOTEwNDljZGNiMzY3YmU0YmU2ZmZjYTNjZmVlZDY1N2Q4MDg1ODNkZTMzZmE5NzhiYzFlYzZjYjEnLFxuICAgICAgICAnOWJhY2FhMzU0ODE2NDJiYzQxZjQ2M2Y3ZWM5NzgwZTVkZWM3YWRjNTA4Zjc0MGExN2U5ZWE4ZTI3YTY4YmUxZCdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc1MzkwNGZhYTBiMzM0Y2RkYTZlMDAwOTM1ZWYyMjE1MWVjMDhkMGY3YmIxMTA2OWY1NzU0NWNjYzFhMzdiN2MwJyxcbiAgICAgICAgJzViYzA4N2QwYmM4MDEwNmQ4OGM5ZWNjYWMyMGQzYzFjMTM5OTk5ODFlMTQ0MzQ2OTlkY2IwOTZiMDIyNzcxYzgnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnOGU3YmNkMGJkMzU5ODNhNzcxOWNjYTc3NjRjYTkwNjc3OWI1M2EwNDNhOWI4YmNhZWZmOTU5ZjQzYWQ4NjA0NycsXG4gICAgICAgICcxMGI3NzcwYjJhM2RhNGIzOTQwMzEwNDIwY2E5NTE0NTc5ZTg4ZTJlNDdmZDY4YjNlYTEwMDQ3ZTg0NjAzNzJhJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzM4NWVlZDM0YzFjZGZmMjFlNmQwODE4Njg5YjgxYmRlNzFhN2Y0ZjE4Mzk3ZTY2OTBhODQxZTE1OTljNDM4NjInLFxuICAgICAgICAnMjgzYmViYzNlOGVhMjNmNTY3MDFkZTE5ZTllYmY0NTc2YjMwNGVlYzIwODZkYzhjYzA0NThmZTU1NDJlNTQ1MydcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc2ZjlkOWI4MDNlY2YxOTE2MzdjNzNhNDQxM2RmYTE4MGZkZGY4NGE1OTQ3ZmJjOWM2MDZlZDg2YzNmYWMzYTcnLFxuICAgICAgICAnN2M4MGM2OGU2MDMwNTliYTY5YjhlMmEzMGU0NWM0ZDQ3ZWE0ZGQyZjVjMjgxMDAyZDg2ODkwNjAzYTg0MjE2MCdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICczMzIyZDQwMTI0M2M0ZTI1ODJhMjE0N2MxMDRkNmVjYmY3NzRkMTYzZGIwZjVlNTMxM2I3ZTBlNzQyZDBlNmJkJyxcbiAgICAgICAgJzU2ZTcwNzk3ZTk2NjRlZjViZmIwMTliYzRkZGFmOWI3MjgwNWY2M2VhMjg3M2FmNjI0ZjNhMmU5NmMyOGIyYTAnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnODU2NzJjN2QyZGUwYjdkYTJiZDE3NzBkODk2NjU4Njg3NDFiM2Y5YWY3NjQzMzk3NzIxZDc0ZDI4MTM0YWI4MycsXG4gICAgICAgICc3YzQ4MWI5YjViNDNiMmViNjM3NDA0OWJmYTYyYzJlNWU3N2YxN2ZjYzUyOThmNDRjOGUzMDk0Zjc5MDMxM2E2J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzk0OGJmODA5YjE5ODhhNDZiMDZjOWYxOTE5NDEzYjEwZjkyMjZjNjBmNjY4ODMyZmZkOTU5YWY2MGM4MmEwYScsXG4gICAgICAgICc1M2E1NjI4NTZkY2I2NjQ2ZGM2Yjc0YzVkMWMzNDE4YzZkNGRmZjA4Yzk3Y2QyYmVkNGNiN2Y4OGQ4YzhlNTg5J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzYyNjBjZTdmNDYxODAxYzM0ZjA2N2NlMGYwMjg3M2E4ZjFiMGU0NGRmYzY5NzUyYWNjZWNkODE5ZjM4ZmQ4ZTgnLFxuICAgICAgICAnYmMyZGE4MmI2ZmE1YjU3MWE3ZjA5MDQ5Nzc2YTFlZjdlY2QyOTIyMzgwNTFjMTk4YzFhODRlOTViMmI0YWUxNydcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdlNTAzN2RlMGFmYzFkOGQ0M2Q4MzQ4NDE0YmJmNDEwMzA0M2VjOGY1NzViZmRjNDMyOTUzY2M4ZDIwMzdmYTJkJyxcbiAgICAgICAgJzQ1NzE1MzRiYWE5NGQzYjVmOWY5OGQwOWZiOTkwYmRkYmQ1ZjViMDNlYzQ4MWYxMGUwZTVkYzg0MWQ3NTViZGEnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZTA2MzcyYjBmNGEyMDdhZGY1ZWE5MDVlOGYxNzcxYjRlN2U4ZGJkMWM2YTZjNWI3MjU4NjZhMGFlNGZjZTcyNScsXG4gICAgICAgICc3YTkwODk3NGJjZTE4Y2ZlMTJhMjdiYjJhZDVhNDg4Y2Q3NDg0YTc3ODcxMDQ4NzBiMjcwMzRmOTRlZWUzMWRkJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzIxM2M3YTcxNWNkNWQ0NTM1OGQwYmJmOWRjMGNlMDIyMDRiMTBiZGRlMmEzZjU4NTQwYWQ2OTA4ZDA1NTk3NTQnLFxuICAgICAgICAnNGI2ZGFkMGI1YWU0NjI1MDcwMTNhZDA2MjQ1YmExOTBiYjQ4NTBmNWYzNmE3ZWVkZGZmMmMyNzUzNGI0NThmMidcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc0ZTdjMjcyYTdhZjRiMzRlOGRiYjkzNTJhNTQxOWE4N2UyODM4YzcwYWRjNjJjZGRmMGNjM2EzYjA4ZmJkNTNjJyxcbiAgICAgICAgJzE3NzQ5Yzc2NmM5ZDBiMThlMTZmZDA5ZjZkZWY2ODFiNTMwYjk2MTRiZmY3ZGQzM2UwYjM5NDE4MTdkY2FhZTYnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZmVhNzRlM2RiZTc3OGIxYjEwZjIzOGFkNjE2ODZhYTVjNzZlM2RiMmJlNDMwNTc2MzI0MjdlMjg0MGZiMjdiNicsXG4gICAgICAgICc2ZTA1NjhkYjliMGIxMzI5N2NmNjc0ZGVjY2I2YWY5MzEyNmI1OTZiOTczZjdiNzc3MDFkM2RiN2YyM2NiOTZmJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzc2ZTY0MTEzZjY3N2NmMGUxMGEyNTcwZDU5OTk2OGQzMTU0NGUxNzliNzYwNDMyOTUyYzAyYTQ0MTdiZGRlMzknLFxuICAgICAgICAnYzkwZGRmOGRlZTRlOTVjZjU3NzA2NmQ3MDY4MWYwZDM1ZTJhMzNkMmI1NmQyMDMyYjRiMTc1MmQxOTAxYWMwMSdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdjNzM4YzU2YjAzYjJhYmUxZTgyODFiYWE3NDNmOGY5YThmN2NjNjQzZGYyNmNiZWUzYWIxNTAyNDJiY2JiODkxJyxcbiAgICAgICAgJzg5M2ZiNTc4OTUxYWQyNTM3ZjcxOGYyZWFjYmZiYmJiODIzMTRlZWY3ODgwY2ZlOTE3ZTczNWQ5Njk5YTg0YzMnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZDg5NTYyNjU0OGI2NWI4MWUyNjRjNzYzN2M5NzI4NzdkMWQ3MmU1ZjNhOTI1MDE0MzcyZTlmNjU4OGY2YzE0YicsXG4gICAgICAgICdmZWJmYWEzOGYyYmM3ZWFlNzI4ZWM2MDgxOGMzNDBlYjAzNDI4ZDYzMmJiMDY3ZTE3OTM2M2VkNzVkN2Q5OTFmJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2I4ZGE5NDAzMmE5NTc1MThlYjBmNjQzMzU3MWU4NzYxY2VmZmM3MzY5M2U4NGVkZDQ5MTUwYTU2NGY2NzZlMDMnLFxuICAgICAgICAnMjgwNGRmYTQ0ODA1YTFlNGQ3Yzk5Y2M5NzYyODA4YjA5MmNjNTg0ZDk1ZmYzYjUxMTQ4OGU0ZTc0ZWZkZjZlNydcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdlODBmZWExNDQ0MWZiMzNhN2Q4YWRhYjk0NzVkN2ZhYjIwMTllZmZiNTE1NmE3OTJmMWExMTc3OGUzYzBkZjVkJyxcbiAgICAgICAgJ2VlZDFkZTdmNjM4ZTAwNzcxZTg5NzY4Y2EzY2E5NDQ3MmQxNTVlODBhZjMyMmVhOWZjYjQyOTFiNmFjOWVjNzgnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnYTMwMTY5N2JkZmNkNzA0MzEzYmE0OGU1MWQ1Njc1NDNmMmExODIwMzFlZmQ2OTE1ZGRjMDdiYmNjNGUxNjA3MCcsXG4gICAgICAgICc3MzcwZjkxY2ZiNjdlNGY1MDgxODA5ZmEyNWQ0MGY5YjE3MzVkYmY3YzBhMTFhMTMwYzBkMWEwNDFlMTc3ZWExJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzkwYWQ4NWIzODlkNmI5MzY0NjNmOWQwNTEyNjc4ZGUyMDhjYzMzMGIxMTMwN2ZmZmFiN2FjNjNlM2ZiMDRlZDQnLFxuICAgICAgICAnZTUwN2EzNjIwYTM4MjYxYWZmZGNiZDk0MjcyMjJiODM5YWVmYWJlMTU4Mjg5NGQ5OTFkNGQ0OGNiNmVmMTUwJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzhmNjhiOWQyZjYzYjVmMzM5MjM5YzFhZDk4MWYxNjJlZTg4YzU2Nzg3MjNlYTMzNTFiN2I0NDRjOWVjNGMwZGEnLFxuICAgICAgICAnNjYyYTlmMmRiYTA2Mzk4NmRlMWQ5MGMyYjZiZTIxNWRiYmVhMmNmZTk1NTEwYmZkZjIzY2JmNzk1MDFmZmY4MidcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdlNGYzZmIwMTc2YWY4NWQ2NWZmOTlmZjkxOThjMzYwOTFmNDhlODY1MDM2ODFlM2U2Njg2ZmQ1MDUzMjMxZTExJyxcbiAgICAgICAgJzFlNjM2MzNhZDBlZjRmMWMxNjYxYTZkMGVhMDJiNzI4NmNjN2U3NGVjOTUxZDFjOTgyMmMzODU3NmZlYjczYmMnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnOGMwMGZhOWIxOGViZjMzMWViOTYxNTM3YTQ1YTQyNjZjNzAzNGYyZjBkNGUxZDA3MTZmYjZlYWUyMGVhZTI5ZScsXG4gICAgICAgICdlZmE0NzI2N2ZlYTUyMWExYTlkYzM0M2EzNzM2Yzk3NGMyZmFkYWZhODFlMzZjNTRlN2QyYTRjNjY3MDI0MTRiJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2U3YTI2Y2U2OWRkNDgyOWYzZTEwY2VjMGE5ZTk4ZWQzMTQzZDA4NGYzMDhiOTJjMDk5N2ZkZGZjNjBjYjNlNDEnLFxuICAgICAgICAnMmE3NThlMzAwZmE3OTg0YjQ3MWIwMDZhMWFhZmJiMThkMGE2YjJjMDQyMGU4M2UyMGU4YTk0MjFjZjJjZmQ1MSdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdiNjQ1OWUwZWUzNjYyZWM4ZDIzNTQwYzIyM2JjYmRjNTcxY2JjYjk2N2Q3OTQyNGYzY2YyOWViM2RlNmI4MGVmJyxcbiAgICAgICAgJzY3Yzg3NmQwNmYzZTA2ZGUxZGFkZjE2ZTU2NjFkYjNjNGIzYWU2ZDQ4ZTM1YjJmZjMwYmYwYjYxYTcxYmE0NSdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdkNjhhODBjODI4MGJiODQwNzkzMjM0YWExMThmMDYyMzFkNmYxZmM2N2U3M2M1YTVkZWRhMGY1YjQ5Njk0M2U4JyxcbiAgICAgICAgJ2RiOGJhOWZmZjRiNTg2ZDAwYzRiMWY5MTc3YjBlMjhiNWIwZTdiOGY3ODQ1Mjk1YTI5NGM4NDI2NmIxMzMxMjAnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMzI0YWVkN2RmNjVjODA0MjUyZGMwMjcwOTA3YTMwYjA5NjEyYWViOTczNDQ5Y2VhNDA5NTk4MGZjMjhkM2Q1ZCcsXG4gICAgICAgICc2NDhhMzY1Nzc0YjYxZjJmZjEzMGMwYzM1YWVjMWY0ZjE5MjEzYjBjN2UzMzI4NDM5NjcyMjRhZjk2YWI3Yzg0J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzRkZjljMTQ5MTljZGU2MWY2ZDUxZGZkYmU1ZmVlNWRjZWVjNDE0M2JhOGQxY2E4ODhlOGJkMzczZmQwNTRjOTYnLFxuICAgICAgICAnMzVlYzUxMDkyZDg3MjgwNTA5NzRjMjNhMWQ4NWQ0YjVkNTA2Y2RjMjg4NDkwMTkyZWJhYzA2Y2FkMTBkNWQnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnOWMzOTE5YTg0YTQ3NDg3MGZhZWQ4YTljMWNjNjYwMjE1MjM0ODkwNTRkN2YwMzA4Y2JmYzk5YzhhYzFmOThjZCcsXG4gICAgICAgICdkZGI4NGYwZjRhNGRkZDU3NTg0ZjA0NGJmMjYwZTY0MTkwNTMyNmY3NmM2NGM4ZTZiZTdlNWUwM2Q0ZmM1OTlkJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzYwNTcxNzBiMWRkMTJmZGY4ZGUwNWYyODFkOGUwNmJiOTFlMTQ5M2E4YjkxZDRjYzVhMjEzODIxMjBhOTU5ZTUnLFxuICAgICAgICAnOWExYWYwYjI2YTZhNDgwN2FkZDlhMmRhZjcxZGYyNjI0NjUxNTJiYzNlZTI0YzY1ZTg5OWJlOTMyMzg1YTJhOCdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdhNTc2ZGY4ZTIzYTA4NDExNDIxNDM5YTQ1MThkYTMxODgwY2VmMGZiYTdkNGRmMTJiMWE2OTczZWVjYjk0MjY2JyxcbiAgICAgICAgJzQwYTZiZjIwZTc2NjQwYjJjOTJiOTdhZmU1OGNkODJjNDMyZTEwYTdmNTE0ZDlmM2VlOGJlMTFhZTFiMjhlYzgnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNzc3OGE3OGMyOGRlYzNlMzBhMDVmZTk2MjlkZThjMzhiYjMwZDFmNWNmOWEzYTIwOGY3NjM4ODliZTU4YWQ3MScsXG4gICAgICAgICczNDYyNmQ5YWI1YTViMjJmZjcwOThlMTJmMmZmNTgwMDg3YjM4NDExZmYyNGFjNTYzYjUxM2ZjMWZkOWY0M2FjJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzkyODk1NWVlNjM3YTg0NDYzNzI5ZmQzMGU3YWZkMmVkNWY5NjI3NGU1YWQ3ZTVjYjA5ZWRhOWMwNmQ5MDNhYycsXG4gICAgICAgICdjMjU2MjEwMDNkM2Y0MmE4MjdiNzhhMTMwOTNhOTVlZWFjM2QyNmVmYThhOGQ4M2ZjNTE4MGU5MzViY2QwOTFmJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzg1ZDBmZWYzZWM2ZGIxMDkzOTkwNjRmM2EwZTNiMjg1NTY0NWI0YTkwN2FkMzU0NTI3YWFlNzUxNjNkODI3NTEnLFxuICAgICAgICAnMWYwMzY0ODQxM2EzOGMwYmUyOWQ0OTZlNTgyY2Y1NjYzZTg3NTFlOTY4NzczMzE1ODJjMjM3YTI0ZWIxZjk2MidcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdmZjJiMGRjZTk3ZWVjZTk3YzFjOWI2MDQxNzk4Yjg1ZGZkZmI2ZDg4ODJkYTIwMzA4ZjU0MDQ4MjQ1MjYwODdlJyxcbiAgICAgICAgJzQ5M2QxM2ZlZjUyNGJhMTg4YWY0YzRkYzU0ZDA3OTM2YzdiN2VkNmZiOTBlMmNlYjJjOTUxZTAxZjBjMjk5MDcnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnODI3ZmJiZTRiMWU4ODBlYTllZDJiMmU2MzAxYjIxMmI1N2YxZWUxNDhjZDZkZDI4NzgwZTVlMmNmODU2ZTI0MScsXG4gICAgICAgICdjNjBmOWM5MjNjNzI3YjBiNzFiZWYyYzY3ZDFkMTI2ODdmZjdhNjMxODY5MDMxNjZkNjA1YjY4YmFlYzI5M2VjJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2VhYTY0OWYyMWY1MWJkYmFlN2JlNGFlMzRjZTZlNTIxN2E1OGZkY2U3ZjQ3ZjlhYTdmM2I1OGZhMjEyMGUyYjMnLFxuICAgICAgICAnYmUzMjc5ZWQ1YmJiYjAzYWM2OWE4MGY4OTg3OWFhNWEwMWE2Yjk2NWYxM2Y3ZTU5ZDQ3YTUzMDViYTVhZDkzZCdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdlNGE0MmQ0M2M1Y2YxNjlkOTM5MWRmNmRlY2Y0MmVlNTQxYjZkOGYwYzlhMTM3NDAxZTIzNjMyZGRhMzRkMjRmJyxcbiAgICAgICAgJzRkOWY5MmU3MTZkMWM3MzUyNmZjOTljY2ZiOGFkMzRjZTg4NmVlZGZhOGQ4ZTRmMTNhN2Y3MTMxZGViYTk0MTQnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMWVjODBmZWYzNjBjYmRkOTU0MTYwZmFkYWIzNTJiNmI5MmI1MzU3NmE4OGZlYTQ5NDcxNzNiOWQ0MzAwYmYxOScsXG4gICAgICAgICdhZWVmZTkzNzU2YjUzNDBkMmYzYTQ5NThhN2FiYmY1ZTAxNDZlNzdmNjI5NWEwN2I2NzFjZGMxY2MxMDdjZWZkJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzE0NmE3NzhjMDQ2NzBjMmY5MWIwMGFmNDY4MGRmYThiY2UzNDkwNzE3ZDU4YmE4ODlkZGI1OTI4MzY2NjQyYmUnLFxuICAgICAgICAnYjMxOGUwZWMzMzU0MDI4YWRkNjY5ODI3ZjlkNGIyODcwYWFhOTcxZDJmN2U1ZWQxZDBiMjk3NDgzZDgzZWZkMCdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdmYTUwYzBmNjFkMjJlNWYwN2UzYWNlYmIxYWEwN2IxMjhkMDAxMjIwOWEyOGI5Nzc2ZDc2YTg3OTMxODBlZWY5JyxcbiAgICAgICAgJzZiODRjNjkyMjM5N2ViYTliNzJjZDI4NzIyODFhNjhhNWU2ODMyOTNhNTdhMjEzYjM4Y2Q4ZDdkM2Y0ZjI4MTEnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZGExZDYxZDBjYTcyMWExMWIxYTViZjZiN2Q4OGU4NDIxYTI4OGFiNWQ1YmJhNTIyMGU1M2QzMmI1ZjA2N2VjMicsXG4gICAgICAgICc4MTU3ZjU1YTdjOTkzMDZjNzljMDc2NjE2MWM5MWUyOTY2YTczODk5ZDI3OWI0OGE2NTVmYmEwZjFhZDgzNmYxJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2E4ZTI4MmZmMGM5NzA2OTA3MjE1ZmY5OGU4ZmQ0MTY2MTUzMTFkZTA0NDZmMWUwNjJhNzNiMDYxMGQwNjRlMTMnLFxuICAgICAgICAnN2Y5NzM1NWI4ZGI4MWMwOWFiZmI3ZjNjNWIyNTE1ODg4YjY3OWEzZTUwZGQ2YmQ2Y2VmN2M3MzExMWY0Y2MwYydcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICcxNzRhNTNiOWM5YTI4NTg3MmQzOWU1NmU2OTEzY2FiMTVkNTliMWZhNTEyNTA4YzAyMmYzODJkZTgzMTk0OTdjJyxcbiAgICAgICAgJ2NjYzlkYzM3YWJmYzljMTY1N2I0MTU1ZjJjNDdmOWU2NjQ2YjNhMWQ4Y2I5ODU0MzgzZGExM2FjMDc5YWZhNzMnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnOTU5Mzk2OTgxOTQzNzg1YzNkM2U1N2VkZjUwMThjZGJlMDM5ZTczMGU0OTE4YjNkODg0ZmRmZjA5NDc1YjdiYScsXG4gICAgICAgICcyZTdlNTUyODg4YzMzMWRkOGJhMDM4NmE0YjljZDY4NDljNjUzZjY0Yzg3MDkzODVlOWI4YWJmODc1MjRmMmZkJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2QyYTYzYTUwYWU0MDFlNTZkNjQ1YTExNTNiMTA5YThmY2NhMGE0M2Q1NjFmYmEyZGJiNTEzNDBjOWQ4MmIxNTEnLFxuICAgICAgICAnZTgyZDg2ZmI2NDQzZmNiNzU2NWFlZTU4YjI5NDgyMjBhNzBmNzUwYWY0ODRjYTUyZDQxNDIxNzRkY2Y4OTQwNSdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc2NDU4N2UyMzM1NDcxZWI4OTBlZTc4OTZkN2NmZGM4NjZiYWNiZGJkMzgzOTMxN2IzNDM2ZjliNDU2MTdlMDczJyxcbiAgICAgICAgJ2Q5OWZjZGQ1YmY2OTAyZTJhZTk2ZGQ2NDQ3YzI5OWExODViOTBhMzkxMzNhZWFiMzU4Mjk5ZTVlOWZhZjY1ODknXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnODQ4MWJkZTBlNGU0ZDg4NWIzYTU0NmQzZTU0OWRlMDQyZjBhYTZjZWEyNTBlN2ZkMzU4ZDZjODZkZDQ1ZTQ1OCcsXG4gICAgICAgICczOGVlN2I4Y2JhNTQwNGRkODRhMjViZjM5Y2VjYjJjYTkwMGE3OWM0MmIyNjJlNTU2ZDY0YjFiNTk3NzkwNTdlJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzEzNDY0YTU3YTc4MTAyYWE2MmI2OTc5YWU4MTdmNDYzN2ZmY2ZlZDNjNGIxY2UzMGJjZDYzMDNmNmNhZjY2NmInLFxuICAgICAgICAnNjliZTE1OTAwNDYxNDU4MGVmN2U0MzM0NTNjY2IwY2E0OGYzMDBhODFkMDk0MmUxM2Y0OTVhOTA3ZjZlY2MyNydcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdiYzRhOWRmNWI3MTNmZTJlOWFlZjQzMGJjYzFkYzk3YTBjZDljY2VkZTJmMjg1ODhjYWRhM2EwZDJkODNmMzY2JyxcbiAgICAgICAgJ2QzYTgxY2E2ZTc4NWMwNjM4MzkzN2FkZjRiNzk4Y2FhNmU4YTlmYmZhNTQ3YjE2ZDc1OGQ2NjY1ODFmMzNjMSdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc4YzI4YTk3YmY4Mjk4YmMwZDIzZDhjNzQ5NDUyYTMyZTY5NGI2NWUzMGE5NDcyYTM5NTRhYjMwZmU1MzI0Y2FhJyxcbiAgICAgICAgJzQwYTMwNDYzYTMzMDUxOTMzNzhmZWRmMzFmN2NjMGViN2FlNzg0ZjA0NTFjYjk0NTllNzFkYzczY2JlZjk0ODInXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnOGVhOTY2NjEzOTUyN2E4YzFkZDk0Y2U0ZjA3MWZkMjNjOGIzNTBjNWE0YmIzMzc0OGM0YmExMTFmYWNjYWUwJyxcbiAgICAgICAgJzYyMGVmYWJiYzhlZTI3ODJlMjRlN2MwY2ZiOTVjNWQ3MzViNzgzYmU5Y2YwZjhlOTU1YWYzNGEzMGU2MmI5NDUnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZGQzNjI1ZmFlZjViYTA2MDc0NjY5NzE2YmJkMzc4OGQ4OWJkZGU4MTU5NTk5NjgwOTJmNzZjYzRlYjlhOTc4NycsXG4gICAgICAgICc3YTE4OGZhMzUyMGUzMGQ0NjFkYTI1MDEwNDU3MzFjYTk0MTQ2MTk4Mjg4MzM5NTkzN2Y2OGQwMGM2NDRhNTczJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2Y3MTBkNzlkOWViOTYyMjk3ZTRmNjIzMmI0MGU4ZjdmZWIyYmM2MzgxNDYxNGQ2OTJjMTJkZTc1MjQwODIyMWUnLFxuICAgICAgICAnZWE5OGU2NzIzMmQzYjMyOTVkM2I1MzU1MzIxMTVjY2FjODYxMmM3MjE4NTE2MTc1MjZhZTQ3YTljNzdiZmM4MidcbiAgICAgIF1cbiAgICBdXG4gIH0sXG4gIG5hZjoge1xuICAgIHduZDogNyxcbiAgICBwb2ludHM6IFtcbiAgICAgIFtcbiAgICAgICAgJ2Y5MzA4YTAxOTI1OGMzMTA0OTM0NGY4NWY4OWQ1MjI5YjUzMWM4NDU4MzZmOTliMDg2MDFmMTEzYmNlMDM2ZjknLFxuICAgICAgICAnMzg4ZjdiMGY2MzJkZTgxNDBmZTMzN2U2MmEzN2YzNTY2NTAwYTk5OTM0YzIyMzFiNmNiOWZkNzU4NGI4ZTY3MidcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICcyZjhiZGU0ZDFhMDcyMDkzNTViNGE3MjUwYTVjNTEyOGU4OGI4NGJkZGM2MTlhYjdjYmE4ZDU2OWIyNDBlZmU0JyxcbiAgICAgICAgJ2Q4YWMyMjI2MzZlNWUzZDZkNGRiYTlkZGE2YzljNDI2Zjc4ODI3MWJhYjBkNjg0MGRjYTg3ZDNhYTZhYzYyZDYnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNWNiZGYwNjQ2ZTVkYjRlYWEzOThmMzY1ZjJlYTdhMGUzZDQxOWI3ZTAzMzBlMzljZTkyYmRkZWRjYWM0ZjliYycsXG4gICAgICAgICc2YWViY2E0MGJhMjU1OTYwYTMxNzhkNmQ4NjFhNTRkYmE4MTNkMGI4MTNmZGU3YjVhNTA4MjYyODA4NzI2NGRhJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2FjZDQ4NGUyZjBjN2Y2NTMwOWFkMTc4YTlmNTU5YWJkZTA5Nzk2OTc0YzU3ZTcxNGMzNWYxMTBkZmMyN2NjYmUnLFxuICAgICAgICAnY2MzMzg5MjFiMGE3ZDlmZDY0MzgwOTcxNzYzYjYxZTlhZGQ4ODhhNDM3NWY4ZTBmMDVjYzI2MmFjNjRmOWMzNydcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc3NzRhZTdmODU4YTk0MTFlNWVmNDI0NmI3MGM2NWFhYzU2NDk5ODBiZTVjMTc4OTFiYmVjMTc4OTVkYTAwOGNiJyxcbiAgICAgICAgJ2Q5ODRhMDMyZWI2YjVlMTkwMjQzZGQ1NmQ3YjdiMzY1MzcyZGIxZTJkZmY5ZDZhODMwMWQ3NGM5Yzk1M2M2MWInXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZjI4NzczYzJkOTc1Mjg4YmM3ZDFkMjA1YzM3NDg2NTFiMDc1ZmJjNjYxMGU1OGNkZGVlZGRmOGYxOTQwNWFhOCcsXG4gICAgICAgICdhYjA5MDJlOGQ4ODBhODk3NTgyMTJlYjY1Y2RhZjQ3M2ExYTA2ZGE1MjFmYTkxZjI5YjVjYjUyZGIwM2VkODEnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZDc5MjRkNGY3ZDQzZWE5NjVhNDY1YWUzMDk1ZmY0MTEzMWU1OTQ2ZjNjODVmNzllNDRhZGJjZjhlMjdlMDgwZScsXG4gICAgICAgICc1ODFlMjg3MmE4NmM3MmE2ODM4NDJlYzIyOGNjNmRlZmVhNDBhZjJiZDg5NmQzYTVjNTA0ZGM5ZmY2YTI2YjU4J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2RlZmRlYTRjZGI2Nzc3NTBhNDIwZmVlODA3ZWFjZjIxZWI5ODk4YWU3OWI5NzY4NzY2ZTRmYWEwNGEyZDRhMzQnLFxuICAgICAgICAnNDIxMWFiMDY5NDYzNTE2OGU5OTdiMGVhZDJhOTNkYWVjZWQxZjRhMDRhOTVjMGY2Y2ZiMTk5ZjY5ZTU2ZWI3NydcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICcyYjRlYTBhNzk3YTQ0M2QyOTNlZjVjZmY0NDRmNDk3OWYwNmFjZmViZDdlODZkMjc3NDc1NjU2MTM4Mzg1YjZjJyxcbiAgICAgICAgJzg1ZTg5YmMwMzc5NDVkOTNiMzQzMDgzYjVhMWM4NjEzMWEwMWY2MGM1MDI2OTc2M2I1NzBjODU0ZTVjMDliN2EnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMzUyYmJmNGE0Y2RkMTI1NjRmOTNmYTMzMmNlMzMzMzAxZDlhZDQwMjcxZjgxMDcxODEzNDBhZWYyNWJlNTlkNScsXG4gICAgICAgICczMjFlYjQwNzUzNDhmNTM0ZDU5YzE4MjU5ZGRhM2UxZjRhMWIzYjJlNzFiMTAzOWM2N2JkM2Q4YmNmODE5OThjJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzJmYTIxMDRkNmIzOGQxMWIwMjMwMDEwNTU5ODc5MTI0ZTQyYWI4ZGZlZmY1ZmYyOWRjOWNkYWRkNGVjYWNjM2YnLFxuICAgICAgICAnMmRlMTA2ODI5NWRkODY1YjY0NTY5MzM1YmQ1ZGQ4MDE4MWQ3MGVjZmM4ODI2NDg0MjNiYTc2YjUzMmI3ZDY3J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzkyNDgyNzliMDliNGQ2OGRhYjIxYTliMDY2ZWRkYTgzMjYzYzNkODRlMDk1NzJlMjY5Y2EwY2Q3ZjU0NTM3MTQnLFxuICAgICAgICAnNzMwMTZmN2JmMjM0YWFkZTVkMWFhNzFiZGVhMmIxZmYzZmMwZGUyYTg4NzkxMmZmZTU0YTMyY2U5N2NiMzQwMidcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdkYWVkNGYyYmUzYThiZjI3OGU3MDEzMmZiMGJlYjc1MjJmNTcwZTE0NGJmNjE1YzA3ZTk5NmQ0NDNkZWU4NzI5JyxcbiAgICAgICAgJ2E2OWRjZTRhN2Q2Yzk4ZThkNGExYWNhODdlZjhkNzAwM2Y4M2MyMzBmM2FmYTcyNmFiNDBlNTIyOTBiZTFjNTUnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnYzQ0ZDEyYzcwNjVkODEyZThhY2YyOGQ3Y2JiMTlmOTAxMWVjZDllOWZkZjI4MWIwZTZhM2I1ZTg3ZDIyZTdkYicsXG4gICAgICAgICcyMTE5YTQ2MGNlMzI2Y2RjNzZjNDU5MjZjOTgyZmRhYzBlMTA2ZTg2MWVkZjYxYzVhMDM5MDYzZjBlMGU2NDgyJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzZhMjQ1YmY2ZGM2OTg1MDRjODlhMjBjZmRlZDYwODUzMTUyYjY5NTMzNmMyODA2M2I2MWM2NWNiZDI2OWU2YjQnLFxuICAgICAgICAnZTAyMmNmNDJjMmJkNGE3MDhiM2Y1MTI2ZjE2YTI0YWQ4YjMzYmE0OGQwNDIzYjZlZmQ1ZTYzNDgxMDBkOGE4MidcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICcxNjk3ZmZhNmZkOWRlNjI3YzA3N2UzZDJmZTU0MTA4NGNlMTMzMDBiMGJlYzExNDZmOTVhZTU3ZjBkMGJkNmE1JyxcbiAgICAgICAgJ2I5YzM5OGYxODY4MDZmNWQyNzU2MTUwNmU0NTU3NDMzYTJjZjE1MDA5ZTQ5OGFlN2FkZWU5ZDYzZDAxYjIzOTYnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNjA1YmRiMDE5OTgxNzE4Yjk4NmQwZjA3ZTgzNGNiMGQ5ZGViODM2MGZmYjdmNjFkZjk4MjM0NWVmMjdhNzQ3OScsXG4gICAgICAgICcyOTcyZDJkZTRmOGQyMDY4MWE3OGQ5M2VjOTZmZTIzYzI2YmZhZTg0ZmIxNGRiNDNiMDFlMWU5MDU2YjhjNDknXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNjJkMTRkYWI0MTUwYmY0OTc0MDJmZGM0NWEyMTVlMTBkY2IwMWMzNTQ5NTliMTBjZmUzMWM3ZTlkODdmZjMzZCcsXG4gICAgICAgICc4MGZjMDZiZDhjYzViMDEwOTgwODhhMTk1MGVlZDBkYjAxYWExMzI5NjdhYjQ3MjIzNWY1NjQyNDgzYjI1ZWFmJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzgwYzYwYWQwMDQwZjI3ZGFkZTViNGIwNmM0MDhlNTZiMmM1MGU5ZjU2YjliOGI0MjVlNTU1YzJmODYzMDhiNmYnLFxuICAgICAgICAnMWMzODMwM2YxY2M1YzMwZjI2ZTY2YmFkN2ZlNzJmNzBhNjVlZWQ0Y2JlNzAyNGViMWFhMDFmNTY0MzBiZDU3YSdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc3YTkzNzVhZDYxNjdhZDU0YWE3NGM2MzQ4Y2M1NGQzNDRjYzVkYzk0ODdkODQ3MDQ5ZDVlYWJiMGZhMDNjOGZiJyxcbiAgICAgICAgJ2QwZTNmYTllY2E4NzI2OTA5NTU5ZTBkNzkyNjkwNDZiZGM1OWVhMTBjNzBjZTJiMDJkNDk5ZWMyMjRkYzdmNydcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdkNTI4ZWNkOWI2OTZiNTRjOTA3YTllZDA0NTQ0N2E3OWJiNDA4ZWMzOWI2OGRmNTA0YmI1MWY0NTliYzNmZmM5JyxcbiAgICAgICAgJ2VlY2Y0MTI1MzEzNmU1Zjk5OTY2ZjIxODgxZmQ2NTZlYmM0MzQ1NDA1YzUyMGRiYzA2MzQ2NWI1MjE0MDk5MzMnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNDkzNzBhNGI1ZjQzNDEyZWEyNWY1MTRlOGVjZGFkMDUyNjYxMTVlNGE3ZWNiMTM4NzIzMTgwOGY4YjQ1OTYzJyxcbiAgICAgICAgJzc1OGYzZjQxYWZkNmVkNDI4YjMwODFiMDUxMmZkNjJhNTRjM2YzYWZiYjViNjc2NGI2NTMwNTJhMTI5NDljOWEnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNzdmMjMwOTM2ZWU4OGNiYmQ3M2RmOTMwZDY0NzAyZWY4ODFkODExZTBlMTQ5OGUyZjFjMTNlYjFmYzM0NWQ3NCcsXG4gICAgICAgICc5NThlZjQyYTc4ODZiNjQwMGEwODI2NmU5YmExYjM3ODk2Yzk1MzMwZDk3MDc3Y2JiZThlYjNjNzY3MWM2MGQ2J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2YyZGFjOTkxY2M0Y2U0YjllYTQ0ODg3ZTVjN2MwYmNlNThjODAwNzRhYjlkNGRiYWViMjg1MzFiNzczOWY1MzAnLFxuICAgICAgICAnZTBkZWRjOWIzYjJmOGRhZDRkYTFmMzJkZWMyNTMxZGY5ZWI1ZmJlYjA1OThlNGZkMWExMTdkYmE3MDNhM2MzNydcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc0NjNiM2Q5ZjY2MjYyMWZiMWI0YmU4ZmJiZTI1MjAxMjVhMjE2Y2RmYzlkYWUzZGViY2JhNDg1MGM2OTBkNDViJyxcbiAgICAgICAgJzVlZDQzMGQ3OGMyOTZjMzU0MzExNDMwNmRkODYyMmQ3YzYyMmUyN2M5NzBhMWRlMzFjYjM3N2IwMWFmNzMwN2UnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZjE2ZjgwNDI0NGU0NmUyYTA5MjMyZDRhZmYzYjU5OTc2Yjk4ZmFjMTQzMjhhMmQxYTMyNDk2YjQ5OTk4ZjI0NycsXG4gICAgICAgICdjZWRhYmQ5YjgyMjAzZjdlMTNkMjA2ZmNkZjRlMzNkOTJhNmM1M2MyNmU1Y2NlMjZkNjU3OTk2MmM0ZTMxZGY2J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2NhZjc1NDI3MmRjODQ1NjNiMDM1MmI3YTE0MzExYWY1NWQyNDUzMTVhY2UyN2M2NTM2OWUxNWY3MTUxZDQxZDEnLFxuICAgICAgICAnY2I0NzQ2NjBlZjM1ZjVmMmE0MWI2NDNmYTVlNDYwNTc1ZjRmYTliNzk2MjIzMmE1YzMyZjkwODMxOGEwNDQ3NidcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICcyNjAwY2E0YjI4MmNiOTg2Zjg1ZDBmMTcwOTk3OWQ4YjQ0YTA5YzA3Y2I4NmQ3YzEyNDQ5N2JjODZmMDgyMTIwJyxcbiAgICAgICAgJzQxMTliODg3NTNjMTViZDZhNjkzYjAzZmNkZGJiNDVkNWFjNmJlNzRhYjVmMGVmNDRiMGJlOTQ3NWE3ZTRiNDAnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNzYzNWNhNzJkN2U4NDMyYzMzOGVjNTNjZDEyMjIwYmMwMWM0ODY4NWUyNGY3ZGM4YzYwMmE3NzQ2OTk4ZTQzNScsXG4gICAgICAgICc5MWI2NDk2MDk0ODlkNjEzZDFkNWU1OTBmNzhlNmQ3NGVjZmMwNjFkNTcwNDhiYWQ5ZTc2ZjMwMmM1YjljNjEnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNzU0ZTMyMzlmMzI1NTcwY2RiYmY0YTg3ZGVlZThhNjZiN2YyYjMzNDc5ZDQ2OGZiYzFhNTA3NDNiZjU2Y2MxOCcsXG4gICAgICAgICc2NzNmYjg2ZTViZGEzMGZiM2NkMGVkMzA0ZWE0OWEwMjNlZTMzZDAxOTdhNjk1ZDBjNWQ5ODA5M2M1MzY2ODMnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZTNlNmJkMTA3MWExZTk2YWZmNTc4NTljODJkNTcwZjAzMzA4MDA2NjFkMWM5NTJmOWZlMjY5NDY5MWQ5YjllOCcsXG4gICAgICAgICc1OWM5ZTBiYmEzOTRlNzZmNDBjMGFhNTgzNzlhM2NiNmE1YTIyODM5OTNlOTBjNDE2NzAwMmFmNDkyMGUzN2Y1J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzE4NmI0ODNkMDU2YTAzMzgyNmFlNzNkODhmNzMyOTg1YzRjY2IxZjMyYmEzNWY0YjRjYzQ3ZmRjZjA0YWE2ZWInLFxuICAgICAgICAnM2I5NTJkMzJjNjdjZjc3ZTJlMTc0NDZlMjA0MTgwYWIyMWZiODA5MDg5NTEzOGI0YTRhNzk3Zjg2ZTgwODg4YidcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdkZjlkNzBhNmI5ODc2Y2U1NDRjOTg1NjFmNGJlNGY3MjU0NDJlNmQyYjczN2Q5YzkxYTgzMjE3MjRjZTA5NjNmJyxcbiAgICAgICAgJzU1ZWIyZGFmZDg0ZDZjY2Q1Zjg2MmI3ODVkYzM5ZDRhYjE1NzIyMjcyMGVmOWRhMjE3YjhjNDVjZjJiYTI0MTcnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNWVkZDVjYzIzYzUxZTg3YTQ5N2NhODE1ZDVkY2UwZjhhYjUyNTU0Zjg0OWVkODk5NWRlNjRjNWYzNGNlNzE0MycsXG4gICAgICAgICdlZmFlOWM4ZGJjMTQxMzA2NjFlOGNlYzAzMGM4OWFkMGMxM2M2NmMwZDE3YTI5MDVjZGM3MDZhYjczOTlhODY4J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzI5MDc5OGMyYjY0NzY4MzBkYTEyZmUwMjI4N2U5ZTc3N2FhM2ZiYTFjMzU1YjE3YTcyMmQzNjJmODQ2MTRmYmEnLFxuICAgICAgICAnZTM4ZGE3NmRjZDQ0MDYyMTk4OGQwMGJjZjc5YWYyNWQ1YjI5YzA5NGRiMmEyMzE0NmQwMDNhZmQ0MTk0M2U3YSdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdhZjNjNDIzYTk1ZDlmNWIzMDU0NzU0ZWZhMTUwYWMzOWNkMjk1NTJmZTM2MDI1NzM2MmRmZGVjZWY0MDUzYjQ1JyxcbiAgICAgICAgJ2Y5OGEzZmQ4MzFlYjJiNzQ5YTkzYjBlNmYzNWNmYjQwYzhjZDVhYTY2N2ExNTU4MWJjMmZlZGVkNDk4ZmQ5YzYnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNzY2ZGJiMjRkMTM0ZTc0NWNjY2FhMjhjOTliZjI3NDkwNmJiNjZiMjZkY2Y5OGRmOGQyZmVkNTBkODg0MjQ5YScsXG4gICAgICAgICc3NDRiMTE1MmVhY2JlNWUzOGRjYzg4Nzk4MGRhMzhiODk3NTg0YTY1ZmEwNmNlZGQyYzkyNGY5N2NiYWM1OTk2J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzU5ZGJmNDZmOGM5NDc1OWJhMjEyNzdjMzM3ODRmNDE2NDVmN2I0NGY2YzU5NmE1OGNlOTJlNjY2MTkxYWJlM2UnLFxuICAgICAgICAnYzUzNGFkNDQxNzVmYmMzMDBmNGVhNmNlNjQ4MzA5YTA0MmNlNzM5YTc5MTk3OThjZDg1ZTIxNmM0YTMwN2Y2ZSdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdmMTNhZGE5NTEwM2M0NTM3MzA1ZTY5MWU3NGU5YTRhOGRkNjQ3ZTcxMWE5NWU3M2NiNjJkYzYwMThjZmQ4N2I4JyxcbiAgICAgICAgJ2UxMzgxN2I0NGVlMTRkZTY2M2JmNGJjODA4MzQxZjMyNjk0OWUyMWE2YTc1YzI1NzA3Nzg0MTliZGFmNTczM2QnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNzc1NGI0ZmEwZThhY2VkMDZkNDE2N2EyYzU5Y2NhNGNkYTE4NjljMDZlYmFkZmI2NDg4NTUwMDE1YTg4NTIyYycsXG4gICAgICAgICczMGU5M2U4NjRlNjY5ZDgyMjI0Yjk2N2MzMDIwYjhmYThkMWU0ZTM1MGI2Y2JjYzUzN2E0OGI1Nzg0MTE2M2EyJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzk0OGRjYWRmNTk5MGUwNDhhYTM4NzRkNDZhYmVmOWQ3MDE4NThmOTVkZTgwNDFkMmE2ODI4Yzk5ZTIyNjI1MTknLFxuICAgICAgICAnZTQ5MWE0MjUzN2Y2ZTU5N2Q1ZDI4YTMyMjRiMWJjMjVkZjkxNTRlZmJkMmVmMWQyY2JiYTJjYWU1MzQ3ZDU3ZSdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc3OTYyNDE0NDUwYzc2YzE2ODljN2I0OGY4MjAyZWMzN2ZiMjI0Y2Y1YWMwYmZhMTU3MDMyOGE4YTNkN2M3N2FiJyxcbiAgICAgICAgJzEwMGI2MTBlYzRmZmI0NzYwZDVjMWZjMTMzZWY2ZjZiMTI1MDdhMDUxZjA0YWM1NzYwYWZhNWIyOWRiODM0MzcnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMzUxNDA4NzgzNDk2NGI1NGIxNWIxNjA2NDRkOTE1NDg1YTE2OTc3MjI1Yjg4NDdiYjBkZDA4NTEzN2VjNDdjYScsXG4gICAgICAgICdlZjBhZmJiMjA1NjIwNTQ0OGUxNjUyYzQ4ZTgxMjdmYzYwMzllNzdjMTVjMjM3OGI3ZTdkMTVhMGRlMjkzMzExJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2QzY2MzMGFkNmI0ODNlNGJjNzljZTJjOWRkOGJjNTQ5OTNlOTQ3ZWI4ZGY3ODdiNDQyOTQzZDNmN2I1MjdlYWYnLFxuICAgICAgICAnOGIzNzhhMjJkODI3Mjc4ZDg5YzVlOWJlOGY5NTA4YWUzYzJhZDQ2MjkwMzU4NjMwYWZiMzRkYjA0ZWVkZTBhNCdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICcxNjI0ZDg0NzgwNzMyODYwY2UxYzc4ZmNiZmVmZTA4YjJiMjk4MjNkYjkxM2Y2NDkzOTc1YmEwZmY0ODQ3NjEwJyxcbiAgICAgICAgJzY4NjUxY2Y5YjZkYTkwM2UwOTE0NDQ4YzZjZDlkNGNhODk2ODc4ZjUyODJiZTRjOGNjMDZlMmE0MDQwNzg1NzUnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNzMzY2U4MGRhOTU1YThhMjY5MDJjOTU2MzNlNjJhOTg1MTkyNDc0YjVhZjIwN2RhNmRmN2I0ZmQ1ZmM2MWNkNCcsXG4gICAgICAgICdmNTQzNWEyYmQyYmFkZjdkNDg1YTRkOGI4ZGI5ZmNjZTNlMWVmOGUwMjAxZTQ1NzhjNTQ2NzNiYzFkYzVlYTFkJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzE1ZDk0NDEyNTQ5NDUwNjRjZjFhMWMzM2JiZDNiNDlmODk2NmM1MDkyMTcxZTY5OWVmMjU4ZGZhYjgxYzA0NWMnLFxuICAgICAgICAnZDU2ZWIzMGI2OTQ2M2U3MjM0ZjUxMzdiNzNiODQxNzc0MzQ4MDBiYWNlYmZjNjg1ZmMzN2JiZTllZmU0MDcwZCdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdhMWQwZmNmMmVjOWRlNjc1YjYxMjEzNmU1Y2U3MGQyNzFjMjE0MTdjOWQyYjhhYWFhYzEzODU5OWQwNzE3OTQwJyxcbiAgICAgICAgJ2VkZDc3ZjUwYmNiNWEzY2FiMmU5MDczNzMwOTY2N2YyNjQxNDYyYTU0MDcwZjNkNTE5MjEyZDM5YzE5N2E2MjknXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZTIyZmJlMTVjMGFmOGNjYzU3ODBjMDczNWY4NGRiZTlhNzkwYmFkZWU4MjQ1YzA2YzdjYTM3MzMxY2IzNjk4MCcsXG4gICAgICAgICdhODU1YmFiYWQ1Y2Q2MGM4OGI0MzBhNjlmNTNhMWE3YTM4Mjg5MTU0OTY0Nzk5YmU0M2QwNmQ3N2QzMWRhMDYnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMzExMDkxZGQ5ODYwZThlMjBlZTEzNDczYzExNTVmNWY2OTYzNWUzOTQ3MDRlYWE3NDAwOTQ1MjI0NmNmYTliMycsXG4gICAgICAgICc2NmRiNjU2Zjg3ZDFmMDRmZmZkMWYwNDc4OGMwNjgzMDg3MWVjNWE2NGZlZWU2ODViZDgwZjBiMTI4NmQ4Mzc0J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzM0YzFmZDA0ZDMwMWJlODliMzFjMDQ0MmQzZTZhYzI0ODgzOTI4YjQ1YTkzNDA3ODE4NjdkNDIzMmVjMmRiZGYnLFxuICAgICAgICAnOTQxNDY4NWU5N2IxYjU5NTRiZDQ2ZjczMDE3NDEzNmQ1N2YxY2VlYjQ4NzQ0M2RjNTMyMTg1N2JhNzNhYmVlJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2YyMTllYTVkNmI1NDcwMWMxYzE0ZGU1YjU1N2ViNDJhOGQxM2YzYWJiY2QwOGFmZmNjMmE1ZTZiMDQ5YjhkNjMnLFxuICAgICAgICAnNGNiOTU5NTdlODNkNDBiMGY3M2FmNDU0NGNjY2Y2YjFmNGIwOGQzYzA3YjI3ZmI4ZDhjMjk2MmE0MDA3NjZkMSdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdkN2I4NzQwZjc0YThmYmFhYjFmNjgzZGI4ZjQ1ZGUyNjU0M2E1NDkwYmNhNjI3MDg3MjM2OTEyNDY5YTBiNDQ4JyxcbiAgICAgICAgJ2ZhNzc5NjgxMjhkOWM5MmVlMTAxMGYzMzdhZDQ3MTdlZmYxNWRiNWVkM2MwNDliMzQxMWUwMzE1ZWFhNDU5M2InXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMzJkMzFjMjIyZjhmNmYwZWY4NmY3Yzk4ZDNhMzMzNWVhZDViY2QzMmFiZGQ5NDI4OWZlNGQzMDkxYWE4MjRiZicsXG4gICAgICAgICc1ZjMwMzJmNTg5MjE1NmUzOWNjZDNkNzkxNWI5ZTFkYTJlNmRhYzllNmYyNmU5NjExMThkMTRiODQ2MmUxNjYxJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzc0NjFmMzcxOTE0YWIzMjY3MTA0NWExNTVkOTgzMWVhODc5M2Q3N2NkNTk1OTJjNDM0MGY4NmNiYzE4MzQ3YjUnLFxuICAgICAgICAnOGVjMGJhMjM4Yjk2YmVjMGNiZGRkY2FlMGFhNDQyNTQyZWVlMWZmNTBjOTg2ZWE2YjM5ODQ3YjNjYzA5MmZmNidcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdlZTA3OWFkYjFkZjE4NjAwNzQzNTZhMjVhYTM4MjA2YTZkNzE2YjJjM2U2NzQ1M2QyODc2OThiYWQ3YjJiMmQ2JyxcbiAgICAgICAgJzhkYzI0MTJhYWZlM2JlNWM0YzVmMzdlMGVjYzVmOWY2YTQ0Njk4OWFmMDRjNGUyNWViYWFjNDc5ZWMxYzhjMWUnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMTZlYzkzZTQ0N2VjODNmMDQ2N2IxODMwMmVlNjIwZjdlNjVkZTMzMTg3NGM5ZGM3MmJmZDg2MTZiYTlkYTZiNScsXG4gICAgICAgICc1ZTQ2MzExNTBlNjJmYjQwZDBlOGMyYTdjYTU4MDRhMzlkNTgxODZhNTBlNDk3MTM5NjI2Nzc4ZTI1YjA2NzRkJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2VhYTVmOTgwYzI0NWY2ZjAzODk3ODI5MGFmYTcwYjZiZDg4NTU4OTdmOThiNmFhNDg1Yjk2MDY1ZDUzN2JkOTknLFxuICAgICAgICAnZjY1ZjVkM2UyOTJjMmUwODE5YTUyODM5MWM5OTQ2MjRkNzg0ODY5ZDdlNmVhNjdmYjE4MDQxMDI0ZWRjMDdkYydcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc3OGM5NDA3NTQ0YWMxMzI2OTJlZTE5MTBhMDI0Mzk5NThhZTA0ODc3MTUxMzQyZWE5NmM0YjZiMzVhNDlmNTEnLFxuICAgICAgICAnZjNlMDMxOTE2OWViOWI4NWQ1NDA0Nzk1NTM5YTVlNjhmYTFmYmQ1ODNjMDY0ZDI0NjJiNjc1ZjE5NGEzZGRiNCdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc0OTRmNGJlMjE5YTFhNzcwMTZkY2Q4Mzg0MzFhZWEwMDAxY2RjOGFlN2E2ZmM2ODg3MjY1NzhkOTcwMjg1N2E1JyxcbiAgICAgICAgJzQyMjQyYTk2OTI4M2E1ZjMzOWJhN2YwNzVlMzZiYTJhZjkyNWNlMzBkNzY3ZWQ2ZTU1ZjRiMDMxODgwZDU2MmMnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnYTU5OGE4MDMwZGE2ZDg2YzZiYzdmMmY1MTQ0ZWE1NDlkMjgyMTFlYTU4ZmFhNzBlYmY0YzFlNjY1YzFmZTliNScsXG4gICAgICAgICcyMDRiNWQ2Zjg0ODIyYzMwN2U0YjRhNzE0MDczN2FlYzIzZmM2M2I2NWIzNWY4NmExMDAyNmRiZDJkODY0ZTZiJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2M0MTkxNjM2NWFiYjJiNWQwOTE5MmY1ZjJkYmVhZmVjMjA4ZjAyMGYxMjU3MGExODRkYmFkYzNlNTg1OTU5OTcnLFxuICAgICAgICAnNGYxNDM1MWQwMDg3ZWZhNDlkMjQ1YjMyODk4NDk4OWQ1Y2FmOTQ1MGYzNGJmYzBlZDE2ZTk2YjU4ZmE5OTEzJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzg0MWQ2MDYzYTU4NmZhNDc1YTcyNDYwNGRhMDNiYzViOTJhMmUwZDJlMGEzNmFjZmU0YzczYTU1MTQ3NDI4ODEnLFxuICAgICAgICAnNzM4NjdmNTljMDY1OWU4MTkwNGY5YTFjNzU0MzY5OGU2MjU2MmQ2NzQ0YzE2OWNlN2EzNmRlMDFhOGQ2MTU0J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzVlOTViYjM5OWE2OTcxZDM3NjAyNjk0N2Y4OWJkZTJmMjgyYjMzODEwOTI4YmU0ZGVkMTEyYWM0ZDcwZTIwZDUnLFxuICAgICAgICAnMzlmMjNmMzY2ODA5MDg1YmVlYmZjNzExODEzMTM3NzVhOTljOWFlZDdkOGJhMzhiMTYxMzg0Yzc0NjAxMjg2NSdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICczNmU0NjQxYTUzOTQ4ZmQ0NzZjMzlmOGE5OWZkOTc0ZTVlYzA3NTY0YjUzMTVkOGJmOTk0NzFiY2EwZWYyZjY2JyxcbiAgICAgICAgJ2QyNDI0YjFiMWFiZTRlYjgxNjQyMjdiMDg1YzlhYTk0NTZlYTEzNDkzZmQ1NjNlMDZmZDUxY2Y1Njk0Yzc4ZmMnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMzM2NTgxZWE3YmZiYmIyOTBjMTkxYTJmNTA3YTQxY2Y1NjQzODQyMTcwZTkxNGZhZWFiMjdjMmM1NzlmNzI2JyxcbiAgICAgICAgJ2VhZDEyMTY4NTk1ZmUxYmU5OTI1MjEyOWI2ZTU2YjMzOTFmN2FiMTQxMGNkMWUwZWYzZGNkY2FiZDJmZGEyMjQnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnOGFiODk4MTZkYWRmZDZiNmExZjI2MzRmY2YwMGVjODQwMzc4MTAyNWVkNjg5MGM0ODQ5NzQyNzA2YmQ0M2VkZScsXG4gICAgICAgICc2ZmRjZWYwOWYyZjZkMGEwNDRlNjU0YWVmNjI0MTM2ZjUwM2Q0NTljM2U4OTg0NTg1OGE0N2E5MTI5Y2RkMjRlJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzFlMzNmMWE3NDZjOWM1Nzc4MTMzMzQ0ZDkyOTlmY2FhMjBiMDkzOGU4YWNmZjI1NDRiYjQwMjg0YjhjNWZiOTQnLFxuICAgICAgICAnNjA2NjAyNTdkZDExYjNhYTljOGVkNjE4ZDI0ZWRmZjIzMDZkMzIwZjFkMDMwMTBlMzNhN2QyMDU3ZjNiM2I2J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzg1YjdjMWRjYjNjZWMxYjdlZTdmMzBkZWQ3OWRkMjBhMGVkMWY0Y2MxOGNiY2ZjZmE0MTAzNjFmZDhmMDhmMzEnLFxuICAgICAgICAnM2Q5OGE5Y2RkMDI2ZGQ0M2YzOTA0OGYyNWE4ODQ3ZjRmY2FmYWQxODk1ZDdhNjMzYzZmZWQzYzM1ZTk5OTUxMSdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICcyOWRmOWZiZDhkOWU0NjUwOTI3NWY0YjEyNWQ2ZDQ1ZDdmYmU5YTNiODc4YTdhZjg3MmEyODAwNjYxYWM1ZjUxJyxcbiAgICAgICAgJ2I0YzRmZTk5Yzc3NWE2MDZlMmQ4ODYyMTc5MTM5ZmZkYTYxZGM4NjFjMDE5ZTU1Y2QyODc2ZWIyYTI3ZDg0YidcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdhMGIxY2FlMDZiMGE4NDdhM2ZlYTZlNjcxYWFmOGFkZmRmZTU4Y2EyZjc2ODEwNWM4MDgyYjJlNDQ5ZmNlMjUyJyxcbiAgICAgICAgJ2FlNDM0MTAyZWRkZTA5NThlYzRiMTlkOTE3YTZhMjhlNmI3MmRhMTgzNGFmZjBlNjUwZjA0OTUwM2EyOTZjZjInXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNGU4Y2VhZmI5YjNlOWExMzZkYzdmZjY3ZTg0MDI5NWI0OTlkZmIzYjIxMzNlNGJhMTEzZjJlNGMwZTEyMWU1JyxcbiAgICAgICAgJ2NmMjE3NDExOGM4YjZkN2E0YjQ4ZjZkNTM0Y2U1Yzc5NDIyYzA4NmE2MzQ2MDUwMmI4MjdjZTYyYTMyNjY4M2MnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZDI0YTQ0ZTA0N2UxOWI2ZjVhZmI4MWM3Y2EyZjY5MDgwYTUwNzY2ODlhMDEwOTE5ZjQyNzI1YzJiNzg5YTMzYicsXG4gICAgICAgICc2ZmI4ZDU1OTFiNDY2ZjhmYzYzZGI1MGYxYzBmMWM2OTAxM2Y5OTY4ODdiODI0NGQyY2RlYzQxN2FmZWE4ZmEzJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2VhMDE2MDZhN2E2YzljZGQyNDlmZGZjZmFjYjk5NTg0MDAxZWRkMjhhYmJhYjc3YjUxMDRlOThlOGUzYjM1ZDQnLFxuICAgICAgICAnMzIyYWY0OTA4YzczMTJiMGNmYmZlMzY5ZjdhN2IzY2RiN2Q0NDk0YmMyODIzNzAwY2ZkNjUyMTg4YTNlYTk4ZCdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdhZjhhZGRiZjJiNjYxYzhhNmM2MzI4NjU1ZWI5NjY1MTI1MjAwN2Q4YzVlYTMxYmU0YWQxOTZkZThjZTIxMzFmJyxcbiAgICAgICAgJzY3NDllNjdjMDI5Yjg1ZjUyYTAzNGVhZmQwOTY4MzZiMjUyMDgxODY4MGUyNmFjOGYzZGZiY2RiNzE3NDk3MDAnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZTNhZTE5NzQ1NjZjYTA2Y2M1MTZkNDdlMGZiMTY1YTY3NGEzZGFiY2ZjYTE1ZTcyMmYwZTM0NTBmNDU4ODknLFxuICAgICAgICAnMmFlYWJlN2U0NTMxNTEwMTE2MjE3ZjA3YmY0ZDA3MzAwZGU5N2U0ODc0ZjgxZjUzMzQyMGE3MmVlYjBiZDZhNCdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc1OTFlZTM1NTMxM2Q5OTcyMWNmNjk5M2ZmZWQxZTNlMzAxOTkzZmYzZWQyNTg4MDIwNzVlYThjZWQzOTdlMjQ2JyxcbiAgICAgICAgJ2IwZWE1NThhMTEzYzMwYmVhNjBmYzQ3NzU0NjBjNzkwMWZmMGIwNTNkMjVjYTJiZGVlZTk4ZjFhNGJlNWQxOTYnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMTEzOTZkNTVmZGE1NGM0OWYxOWFhOTczMThkOGRhNjFmYTg1ODRlNDdiMDg0OTQ1MDc3Y2YwMzI1NWI1Mjk4NCcsXG4gICAgICAgICc5OThjNzRhOGNkNDVhYzAxMjg5ZDU4MzNhN2JlYjQ3NDRmZjUzNmIwMWIyNTdiZTRjNTc2N2JlYTkzZWE1N2E0J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzNjNWQyYTFiYTM5YzVhMTc5MDAwMDczOGM5ZTBjNDBiOGRjZGZkNTQ2ODc1NGI2NDA1NTQwMTU3ZTAxN2FhN2EnLFxuICAgICAgICAnYjIyODQyNzk5OTVhMzRlMmY5ZDRkZTczOTZmYzE4YjgwZjliOGI5ZmRkMjcwZjY2NjFmNzljYTRjODFiZDI1NydcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdjYzg3MDRiOGE2MGEwZGVmYTNhOTlhNzI5OWYyZTljM2ZiYzM5NWFmYjA0YWMwNzg0MjVlZjhhMTc5M2NjMDMwJyxcbiAgICAgICAgJ2JkZDQ2MDM5ZmVlZDE3ODgxZDFlMDg2MmRiMzQ3ZjhjZjM5NWI3NGZjNGJjZGM0ZTk0MGI3NGUzYWMxZjFiMTMnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnYzUzM2U0ZjdlYTg1NTVhYWNkOTc3N2FjNWNhZDI5Yjk3ZGQ0ZGVmY2NjNTNlZTdlYTIwNDExOWIyODg5YjE5NycsXG4gICAgICAgICc2ZjBhMjU2YmM1ZWZkZjQyOWEyZmI2MjQyZjFhNDNhMmQ5YjkyNWJiNGE0YjNhMjZiYjhlMGY0NWViNTk2MDk2J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2MxNGY4ZjJjY2IyN2Q2ZjEwOWY2ZDA4ZDAzY2M5NmE2OWJhOGMzNGVlYzA3YmJjZjU2NmQ0OGUzM2RhNjU5MycsXG4gICAgICAgICdjMzU5ZDY5MjNiYjM5OGY3ZmQ0NDczZTE2ZmUxYzI4NDc1Yjc0MGRkMDk4MDc1ZTZjMGU4NjQ5MTEzZGMzYTM4J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2E2Y2JjMzA0NmJjNmE0NTBiYWMyNDc4OWZhMTcxMTVhNGM5NzM5ZWQ3NWY4ZjIxY2U0NDFmNzJlMGI5MGU2ZWYnLFxuICAgICAgICAnMjFhZTdmNDY4MGU4ODliYjEzMDYxOWUyYzBmOTVhMzYwY2ViNTczYzcwNjAzMTM5ODYyYWZkNjE3ZmE5YjlmJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzM0N2Q2ZDlhMDJjNDg5MjdlYmZiODZjMTM1OWIxY2FmMTMwYTNjMDI2N2QxMWNlNjM0NGIzOWY5OWQ0M2NjMzgnLFxuICAgICAgICAnNjBlYTdmNjFhMzUzNTI0ZDFjOTg3ZjZlY2VjOTJmMDg2ZDU2NWFiNjg3ODcwY2IxMjY4OWZmMWUzMWM3NDQ0OCdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdkYTY1NDVkMjE4MWRiOGQ5ODNmN2RjYjM3NWVmNTg2NmQ0N2M2N2IxYmYzMWM4Y2Y4NTVlZjc0MzdiNzI2NTZhJyxcbiAgICAgICAgJzQ5Yjk2NzE1YWI2ODc4YTc5ZTc4ZjA3Y2U1NjgwYzVkNjY3MzA1MWI0OTM1YmQ4OTdmZWE4MjRiNzdkYzIwOGEnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnYzQwNzQ3Y2M5ZDAxMmNiMWExM2I4MTQ4MzA5YzZkZTdlYzI1ZDY5NDVkNjU3MTQ2YjlkNTk5NGI4ZmViMTExMScsXG4gICAgICAgICc1Y2E1NjA3NTNiZTJhMTJmYzZkZTZjYWYyY2I0ODk1NjVkYjkzNjE1NmI5NTE0ZTFiYjVlODMwMzdlMGZhMmQ0J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzRlNDJjOGVjODJjOTk3OThjY2YzYTYxMGJlODcwZTc4MzM4YzdmNzEzMzQ4YmQzNGM4MjAzZWY0MDM3ZjM1MDInLFxuICAgICAgICAnNzU3MWQ3NGVlNWUwZmI5MmE3YThiMzNhMDc3ODMzNDFhNTQ5MjE0NGNjNTRiY2M0MGE5NDQ3MzY5MzYwNjQzNydcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICczNzc1YWI3MDg5YmM2YWY4MjNhYmEyZTFhZjcwYjIzNmQyNTFjYWRiMGM4Njc0MzI4NzUyMmExYjNiMGRlZGVhJyxcbiAgICAgICAgJ2JlNTJkMTA3YmNmYTA5ZDhiY2I5NzM2YTgyOGNmYTdmYWM4ZGIxN2JmN2E3NmEyYzQyYWQ5NjE0MDkwMThjZjcnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnY2VlMzFjYmY3ZTM0ZWMzNzlkOTRmYjgxNGQzZDc3NWFkOTU0NTk1ZDEzMTRiYTg4NDY5NTllM2U4MmY3NGUyNicsXG4gICAgICAgICc4ZmQ2NGExNGMwNmI1ODljMjZiOTQ3YWUyYmNmNmJmYTAxNDllZjBiZTE0ZWQ0ZDgwZjQ0OGEwMWM0M2IxYzZkJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2I0ZjllYWVhMDliNjkxNzYxOWY2ZWE2YTRlYjU0NjRlZmRkYjU4ZmQ0NWIxZWJlZmNkYzFhMDFkMDhiNDc5ODYnLFxuICAgICAgICAnMzllNWM5OTI1YjVhNTRiMDc0MzNhNGYxOGM2MTcyNmY4YmIxMzFjMDEyY2E1NDJlYjI0YThhYzA3MjAwNjgyYSdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdkNDI2M2RmYzNkMmRmOTIzYTAxNzlhNDg5NjZkMzBjZTg0ZTI1MTVhZmMzZGNjYzFiNzc5MDc3OTJlYmNjNjBlJyxcbiAgICAgICAgJzYyZGZhZjA3YTBmNzhmZWIzMGUzMGQ2Mjk1ODUzY2UxODllMTI3NzYwYWQ2Y2Y3ZmFlMTY0ZTEyMmEyMDhkNTQnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNDg0NTc1MjQ4MjBmYTY1YTRmOGQzNWViNjkzMDg1N2MwMDMyYWNjMGE0YTJkZTQyMjIzM2VlZGE4OTc2MTJjNCcsXG4gICAgICAgICcyNWE3NDhhYjM2Nzk3OWQ5ODczM2MzOGExZmExYzJlN2RjNmNjMDdkYjJkNjBhOWFlN2E3NmFhYTQ5YmQwZjc3J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2RmZWVlZjE4ODExMDFmMmNiMTE2NDRmM2EyYWZkZmMyMDQ1ZTE5OTE5MTUyOTIzZjM2N2ExNzY3YzExY2NlZGEnLFxuICAgICAgICAnZWNmYjcwNTZjZjFkZTA0MmY5NDIwYmFiMzk2NzkzYzBjMzkwYmRlNzRiNGJiZGZmMTZhODNhZTA5YTlhNzUxNydcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc2ZDdlZjZiMTc1NDNmODM3M2M1NzNmNDRlMWYzODk4MzVkODliY2JjNjA2MmNlZDM2YzgyZGY4M2I4ZmFlODU5JyxcbiAgICAgICAgJ2NkNDUwZWMzMzU0Mzg5ODZkZmVmYTEwYzU3ZmVhOWJjYzUyMWEwOTU5YjJkODBiYmY3NGIxOTBkY2E3MTJkMTAnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZTc1NjA1ZDU5MTAyYTVhMjY4NDUwMGQzYjk5MWYyZTNmM2M4OGI5MzIyNTU0NzAzNWFmMjVhZjY2ZTA0NTQxZicsXG4gICAgICAgICdmNWM1NDc1NGE4ZjcxZWU1NDBiOWI0ODcyODQ3M2UzMTRmNzI5YWM1MzA4YjA2OTM4MzYwOTkwZTJiZmFkMTI1J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2ViOTg2NjBmNGM0ZGZhYTA2YTJiZTQ1M2Q1MDIwYmM5OWEwYzJlNjBhYmUzODg0NTdkZDQzZmVmYjFlZDYyMGMnLFxuICAgICAgICAnNmNiOWE4ODc2ZDljYjg1MjA2MDlhZjNhZGQyNmNkMjBhMGE3Y2Q4YTk0MTExMzFjZTg1ZjQ0MTAwMDk5MjIzZSdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICcxM2U4N2IwMjdkODUxNGQzNTkzOWYyZTY4OTJiMTk5MjIxNTQ1OTY5NDE4ODgzMzZkYzM1NjNlM2I4ZGJhOTQyJyxcbiAgICAgICAgJ2ZlZjVhM2M2ODA1OWE2ZGVjNWQ2MjQxMTRiZjFlOTFhYWMyYjlkYTU2OGQ2YWJlYjI1NzBkNTU2NDZiOGFkZjEnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZWUxNjMwMjZlOWZkNmZlMDE3YzM4ZjA2YTViZTZmYzEyNTQyNGIzNzFjZTI3MDhlN2JmNDQ5MTY5MWU1NzY0YScsXG4gICAgICAgICcxYWNiMjUwZjI1NWRkNjFjNDNkOTRjY2M2NzBkMGY1OGY0OWFlM2ZhMTViOTY2MjNlNTQzMGRhMGFkNmM2MmIyJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2IyNjhmNWVmOWFkNTFlNGQ3OGRlM2E3NTBjMmRjODliMWU2MjZkNDM1MDU4Njc5OTk5MzJlNWRiMzNhZjNkODAnLFxuICAgICAgICAnNWYzMTBkNGIzYzk5YjllYmIxOWY3N2Q0MWMxZGVlMDE4Y2YwZDM0ZmQ0MTkxNjE0MDAzZTk0NWExMjE2ZTQyMydcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdmZjA3ZjMxMThhOWRmMDM1ZTlmYWQ4NWViNmM3YmZlNDJiMDJmMDFjYTk5Y2VlYTNiZjdmZmRiYTkzYzQ3NTBkJyxcbiAgICAgICAgJzQzODEzNmQ2MDNlODU4YTNhNWM0NDBjMzhlY2NiYWRkYzFkMjk0MjExNGUyZWRkZDQ3NDBkMDk4Y2VkMWYwZDgnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnOGQ4Yjk4NTVjN2MwNTJhMzQxNDZmZDIwZmZiNjU4YmVhNGI5ZjY5ZTBkODI1ZWJlYzE2ZThjM2NlMmI1MjZhMScsXG4gICAgICAgICdjZGI1NTllZWRjMmQ3OWY5MjZiYWY0NGZiODRlYTRkNDRiY2Y1MGZlZTUxZDdjZWIzMGUyZTdmNDYzMDM2NzU4J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzUyZGIwYjUzODRkZmJmMDViZmE5ZDQ3MmQ3YWUyNmRmZTRiODUxY2VjYTkxYjFlYmE1NDI2MzE4MGRhMzJiNjMnLFxuICAgICAgICAnYzNiOTk3ZDA1MGVlNWQ0MjNlYmFmNjZhNmRiOWY1N2IzMTgwYzkwMjg3NTY3OWRlOTI0YjY5ZDg0YTdiMzc1J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2U2MmY5NDkwZDNkNTFkYTYzOTVlZmQyNGU4MDkxOWNjN2QwZjI5YzNmM2ZhNDhjNmZmZjU0M2JlY2JkNDMzNTInLFxuICAgICAgICAnNmQ4OWFkN2JhNDg3NmIwYjIyYzJjYTI4MGM2ODI4NjJmMzQyYzg1OTFmMWRhZjUxNzBlMDdiZmQ5Y2NhZmE3ZCdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc3ZjMwZWEyNDc2YjM5OWI0OTU3NTA5Yzg4Zjc3ZDAxOTFhZmEyZmY1Y2I3YjE0ZmQ2ZDhlN2Q2NWFhYWIxMTkzJyxcbiAgICAgICAgJ2NhNWVmN2Q0YjIzMWM5NGMzYjE1Mzg5YTVmNjMxMWU5ZGFmZjdiYjY3YjEwM2U5ODgwZWY0YmZmNjM3YWNhZWMnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNTA5OGZmMWUxZDlmMTRmYjQ2YTIxMGZhZGE2YzkwM2ZlZjBmYjdiNGExZGQxZDlhYzYwYTAzNjE4MDBiN2EwMCcsXG4gICAgICAgICc5NzMxMTQxZDgxZmM4ZjgwODRkMzdjNmU3NTQyMDA2YjNlZTFiNDBkNjBkZmU1MzYyYTViMTMyZmQxN2RkYzAnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMzJiNzhjN2RlOWVlNTEyYTcyODk1YmU2YjljYmVmYTZlMmYzYzRjY2NlNDQ1Yzk2YjlmMmM4MWUyNzc4YWQ1OCcsXG4gICAgICAgICdlZTE4NDlmNTEzZGY3MWUzMmVmYzM4OTZlZTI4MjYwYzczYmI4MDU0N2FlMjI3NWJhNDk3MjM3Nzk0Yzg3NTNjJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2UyY2I3NGZkZGM4ZTlmYmNkMDc2ZWVmMmE3YzcyYjBjZTM3ZDUwZjA4MjY5ZGZjMDc0YjU4MTU1MDU0N2E0ZjcnLFxuICAgICAgICAnZDNhYTJlZDcxYzlkZDIyNDdhNjJkZjA2MjczNmViMGJhZGRlYTllMzYxMjJkMmJlODY0MWFiY2IwMDVjYzRhNCdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc4NDM4NDQ3NTY2ZDRkN2JlZGFkYzI5OTQ5NmFiMzU3NDI2MDA5YTM1ZjIzNWNiMTQxYmUwZDk5Y2QxMGFlM2E4JyxcbiAgICAgICAgJ2M0ZTEwMjA5MTY5ODBhNGRhNWQwMWFjNWU2YWQzMzA3MzRlZjBkNzkwNjYzMWM0ZjIzOTA0MjZiMmVkZDc5MWYnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNDE2MmQ0ODhiODk0MDIwMzliNTg0YzZmYzZjMzA4ODcwNTg3ZDljNDZmNjYwYjg3OGFiNjVjODJjNzExZDY3ZScsXG4gICAgICAgICc2NzE2M2U5MDMyMzYyODlmNzc2ZjIyYzI1ZmI4YTNhZmMxNzMyZjJiODRiNGU5NWRiZGE0N2FlNWEwODUyNjQ5J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzNmYWQzZmE4NGNhZjBmMzRmMGY4OWJmZDJkY2Y1NGZjMTc1ZDc2N2FlYzNlNTA2ODRmM2JhNGE0YmY1ZjY4M2QnLFxuICAgICAgICAnY2QxYmM3Y2I2Y2M0MDdiYjJmMGNhNjQ3YzcxOGE3MzBjZjcxODcyZTdkMGQyYTUzZmEyMGVmY2RmZTYxODI2J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzY3NGYyNjAwYTMwMDdhMDA1NjhjMWE3Y2UwNWQwODE2YzFmYjg0YmYxMzcwNzk4ZjFjNjk1MzJmYWViMWE4NmInLFxuICAgICAgICAnMjk5ZDIxZjk0MTNmMzNiM2VkZjQzYjI1NzAwNDU4MGI3MGRiNTdkYTBiMTgyMjU5ZTA5ZWVjYzY5ZTBkMzhhNSdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdkMzJmNGRhNTRhZGU3NGFiYjgxYjgxNWFkMWZiM2IyNjNkODJkNmM2OTI3MTRiY2ZmODdkMjliZDVlZTlmMDhmJyxcbiAgICAgICAgJ2Y5NDI5ZTczOGI4ZTUzYjk2OGU5OTAxNmMwNTk3MDc3ODJlMTRmNDUzNTM1OWQ1ODJmYzQxNjkxMGIzZWVhODcnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMzBlNGU2NzA0MzUzODU1NTZlNTkzNjU3MTM1ODQ1ZDM2ZmJiNjkzMWY3MmIwOGNiMWVkOTU0ZjFlM2NlM2ZmNicsXG4gICAgICAgICc0NjJmOWJjZTYxOTg5ODYzODQ5OTM1MDExM2JiYzliMTBhODc4ZDM1ZGE3MDc0MGRjNjk1YTU1OWViODhkYjdiJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2JlMjA2MjAwM2M1MWNjMzAwNDY4MjkwNDMzMGU0ZGVlN2YzZGNkMTBiMDFlNTgwYmYxOTcxYjA0ZDRjYWQyOTcnLFxuICAgICAgICAnNjIxODhiYzQ5ZDYxZTU0Mjg1NzNkNDhhNzRlMWM2NTViMWM2MTA5MDkwNTY4MmEwZDU1NThlZDcyZGNjYjliYydcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc5MzE0NDQyM2FjZTM0NTFlZDI5ZTBmYjlhYzJhZjIxMWNiNmU4NGE2MDFkZjU5OTNjNDE5ODU5ZmZmNWRmMDRhJyxcbiAgICAgICAgJzdjMTBkZmIxNjRjMzQyNWY1YzcxYTNmOWQ3OTkyMDM4ZjEwNjUyMjRmNzJiYjlkMWQ5MDJhNmQxMzAzN2I0N2MnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnYjAxNWY4MDQ0ZjVmY2JkY2YyMWNhMjZkNmMzNGZiODE5NzgyOTIwNWM3YjdkMmE3Y2I2NjQxOGMxNTdiMTEyYycsXG4gICAgICAgICdhYjhjMWUwODZkMDRlODEzNzQ0YTY1NWIyZGY4ZDVmODNiM2NkYzZmYWEzMDg4YzFkM2FlYTE0NTRlM2ExZDVmJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2Q1ZTllMWRhNjQ5ZDk3ZDg5ZTQ4NjgxMTdhNDY1YTNhNGY4YTE4ZGU1N2ExNDBkMzZiM2YyYWYzNDFhMjFiNTInLFxuICAgICAgICAnNGNiMDQ0MzdmMzkxZWQ3MzExMWExM2NjMWQ0ZGQwZGIxNjkzNDY1YzIyNDA0ODBkODk1NWU4NTkyZjI3NDQ3YSdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdkM2FlNDEwNDdkZDdjYTA2NWRiZjhlZDc3Yjk5MjQzOTk4MzAwNWNkNzJlMTZkNmY5OTZhNTMxNmQzNjk2NmJiJyxcbiAgICAgICAgJ2JkMWFlYjIxYWQyMmViYjIyYTEwZjAzMDM0MTdjNmQ5NjRmOGNkZDdkZjBhY2E2MTRiMTBkYzE0ZDEyNWFjNDYnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNDYzZTI3NjNkODg1Zjk1OGZjNjZjZGQyMjgwMGYwYTQ4NzE5N2QwYTgyZTM3N2I0OWY4MGFmODdjODk3YjA2NScsXG4gICAgICAgICdiZmVmYWNkYjBlNWQwZmQ3ZGYzYTMxMWE5NGRlMDYyYjI2YjgwYzYxZmJjOTc1MDhiNzk5OTI2NzFlZjdjYTdmJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzc5ODVmZGZkMTI3YzA1NjdjNmY1M2VjMWJiNjNlYzMxNThlNTk3YzQwYmZlNzQ3YzgzY2RkZmM5MTA2NDE5MTcnLFxuICAgICAgICAnNjAzYzEyZGFmM2Q5ODYyZWYyYjI1ZmUxZGUyODlhZWQyNGVkMjkxZTBlYzY3MDg3MDNhNWJkNTY3ZjMyZWQwMydcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc3NGExYWQ2YjVmNzZlMzlkYjJkZDI0OTQxMGVhYzdmOTllNzRjNTljYjgzZDJkMGVkNWZmMTU0M2RhNzcwM2U5JyxcbiAgICAgICAgJ2NjNjE1N2VmMThjOWM2M2NkNjE5M2Q4MzYzMWJiZWEwMDkzZTA5Njg5NDJlOGMzM2Q1NzM3ZmQ3OTBlMGRiMDgnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMzA2ODJhNTA3MDMzNzVmNjAyZDQxNjY2NGJhMTliN2ZjOWJhYjQyYzcyNzQ3NDYzYTcxZDA4OTZiMjJmNmRhMycsXG4gICAgICAgICc1NTNlMDRmNmIwMThiNGZhNmM4ZjM5ZTdmMzExZDMxNzYyOTBkMGUwZjE5Y2E3M2YxNzcxNGQ5OTc3YTIyZmY4J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzllMjE1OGYwZDdjMGQ1ZjI2YzM3OTFlZmVmYTc5NTk3NjU0ZTdhMmIyNDY0ZjUyYjFlZTZjMTM0Nzc2OWVmNTcnLFxuICAgICAgICAnNzEyZmNkZDFiOTA1M2YwOTAwM2EzNDgxZmE3NzYyZTlmZmQ3YzhlZjM1YTM4NTA5ZTJmYmYyNjI5MDA4MzczJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzE3NmUyNjk4OWE0M2M5Y2ZlYmE0MDI5YzIwMjUzOGMyODE3MmU1NjZlM2M0ZmNlNzMyMjg1N2YzYmUzMjdkNjYnLFxuICAgICAgICAnZWQ4Y2M5ZDA0YjI5ZWI4NzdkMjcwYjQ4NzhkYzQzYzE5YWVmZDMxZjRlZWUwOWVlN2I0NzgzNGMxZmE0YjFjMydcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc3NWQ0NmVmZWEzNzcxZTZlNjhhYmI4OWExM2FkNzQ3ZWNmMTg5MjM5M2RmYzRmMWI3MDA0Nzg4YzUwMzc0ZGE4JyxcbiAgICAgICAgJzk4NTIzOTBhOTk1MDc2NzlmZDBiODZmZDJiMzlhODY4ZDdlZmMyMjE1MTM0NmUxYTNjYTQ3MjY1ODZhNmJlZDgnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnODA5YTIwYzY3ZDY0OTAwZmZiNjk4YzRjODI1ZjZkNWYyMzEwZmIwNDUxYzg2OTM0NWI3MzE5ZjY0NTYwNTcyMScsXG4gICAgICAgICc5ZTk5NDk4MGQ5OTE3ZTIyYjc2YjA2MTkyN2ZhMDQxNDNkMDk2Y2NjNTQ5NjNlNmE1ZWJmYTVmM2Y4ZTI4NmMxJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzFiMzg5MDNhNDNmN2YxMTRlZDQ1MDBiNGVhYzcwODNmZGVmZWNlMWNmMjljNjM1MjhkNTYzNDQ2Zjk3MmMxODAnLFxuICAgICAgICAnNDAzNmVkYzkzMWE2MGFlODg5MzUzZjc3ZmQ1M2RlNGEyNzA4YjI2YjZmNWRhNzJhZDMzOTQxMTlkYWY0MDhmOSdcbiAgICAgIF1cbiAgICBdXG4gIH1cbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IGV4cG9ydHM7XG52YXIgQk4gPSByZXF1aXJlKCdibi5qcycpO1xuXG51dGlscy5hc3NlcnQgPSBmdW5jdGlvbiBhc3NlcnQodmFsLCBtc2cpIHtcbiAgaWYgKCF2YWwpXG4gICAgdGhyb3cgbmV3IEVycm9yKG1zZyB8fCAnQXNzZXJ0aW9uIGZhaWxlZCcpO1xufTtcblxuZnVuY3Rpb24gdG9BcnJheShtc2csIGVuYykge1xuICBpZiAoQXJyYXkuaXNBcnJheShtc2cpKVxuICAgIHJldHVybiBtc2cuc2xpY2UoKTtcbiAgaWYgKCFtc2cpXG4gICAgcmV0dXJuIFtdO1xuICB2YXIgcmVzID0gW107XG4gIGlmICh0eXBlb2YgbXNnICE9PSAnc3RyaW5nJykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbXNnLmxlbmd0aDsgaSsrKVxuICAgICAgcmVzW2ldID0gbXNnW2ldIHwgMDtcbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIGlmICghZW5jKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtc2cubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBjID0gbXNnLmNoYXJDb2RlQXQoaSk7XG4gICAgICB2YXIgaGkgPSBjID4+IDg7XG4gICAgICB2YXIgbG8gPSBjICYgMHhmZjtcbiAgICAgIGlmIChoaSlcbiAgICAgICAgcmVzLnB1c2goaGksIGxvKTtcbiAgICAgIGVsc2VcbiAgICAgICAgcmVzLnB1c2gobG8pO1xuICAgIH1cbiAgfSBlbHNlIGlmIChlbmMgPT09ICdoZXgnKSB7XG4gICAgbXNnID0gbXNnLnJlcGxhY2UoL1teYS16MC05XSsvaWcsICcnKTtcbiAgICBpZiAobXNnLmxlbmd0aCAlIDIgIT09IDApXG4gICAgICBtc2cgPSAnMCcgKyBtc2c7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtc2cubGVuZ3RoOyBpICs9IDIpXG4gICAgICByZXMucHVzaChwYXJzZUludChtc2dbaV0gKyBtc2dbaSArIDFdLCAxNikpO1xuICB9XG4gIHJldHVybiByZXM7XG59XG51dGlscy50b0FycmF5ID0gdG9BcnJheTtcblxuZnVuY3Rpb24gemVybzIod29yZCkge1xuICBpZiAod29yZC5sZW5ndGggPT09IDEpXG4gICAgcmV0dXJuICcwJyArIHdvcmQ7XG4gIGVsc2VcbiAgICByZXR1cm4gd29yZDtcbn1cbnV0aWxzLnplcm8yID0gemVybzI7XG5cbmZ1bmN0aW9uIHRvSGV4KG1zZykge1xuICB2YXIgcmVzID0gJyc7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbXNnLmxlbmd0aDsgaSsrKVxuICAgIHJlcyArPSB6ZXJvMihtc2dbaV0udG9TdHJpbmcoMTYpKTtcbiAgcmV0dXJuIHJlcztcbn1cbnV0aWxzLnRvSGV4ID0gdG9IZXg7XG5cbnV0aWxzLmVuY29kZSA9IGZ1bmN0aW9uIGVuY29kZShhcnIsIGVuYykge1xuICBpZiAoZW5jID09PSAnaGV4JylcbiAgICByZXR1cm4gdG9IZXgoYXJyKTtcbiAgZWxzZVxuICAgIHJldHVybiBhcnI7XG59O1xuXG4vLyBSZXByZXNlbnQgbnVtIGluIGEgdy1OQUYgZm9ybVxuZnVuY3Rpb24gZ2V0TkFGKG51bSwgdykge1xuICB2YXIgbmFmID0gW107XG4gIHZhciB3cyA9IDEgPDwgKHcgKyAxKTtcbiAgdmFyIGsgPSBudW0uY2xvbmUoKTtcbiAgd2hpbGUgKGsuY21wbigxKSA+PSAwKSB7XG4gICAgdmFyIHo7XG4gICAgaWYgKGsuaXNPZGQoKSkge1xuICAgICAgdmFyIG1vZCA9IGsuYW5kbG4od3MgLSAxKTtcbiAgICAgIGlmIChtb2QgPiAod3MgPj4gMSkgLSAxKVxuICAgICAgICB6ID0gKHdzID4+IDEpIC0gbW9kO1xuICAgICAgZWxzZVxuICAgICAgICB6ID0gbW9kO1xuICAgICAgay5pc3Vibih6KTtcbiAgICB9IGVsc2Uge1xuICAgICAgeiA9IDA7XG4gICAgfVxuICAgIG5hZi5wdXNoKHopO1xuXG4gICAgLy8gT3B0aW1pemF0aW9uLCBzaGlmdCBieSB3b3JkIGlmIHBvc3NpYmxlXG4gICAgdmFyIHNoaWZ0ID0gKGsuY21wbigwKSAhPT0gMCAmJiBrLmFuZGxuKHdzIC0gMSkgPT09IDApID8gKHcgKyAxKSA6IDE7XG4gICAgZm9yICh2YXIgaSA9IDE7IGkgPCBzaGlmdDsgaSsrKVxuICAgICAgbmFmLnB1c2goMCk7XG4gICAgay5pdXNocm4oc2hpZnQpO1xuICB9XG5cbiAgcmV0dXJuIG5hZjtcbn1cbnV0aWxzLmdldE5BRiA9IGdldE5BRjtcblxuLy8gUmVwcmVzZW50IGsxLCBrMiBpbiBhIEpvaW50IFNwYXJzZSBGb3JtXG5mdW5jdGlvbiBnZXRKU0YoazEsIGsyKSB7XG4gIHZhciBqc2YgPSBbXG4gICAgW10sXG4gICAgW11cbiAgXTtcblxuICBrMSA9IGsxLmNsb25lKCk7XG4gIGsyID0gazIuY2xvbmUoKTtcbiAgdmFyIGQxID0gMDtcbiAgdmFyIGQyID0gMDtcbiAgd2hpbGUgKGsxLmNtcG4oLWQxKSA+IDAgfHwgazIuY21wbigtZDIpID4gMCkge1xuXG4gICAgLy8gRmlyc3QgcGhhc2VcbiAgICB2YXIgbTE0ID0gKGsxLmFuZGxuKDMpICsgZDEpICYgMztcbiAgICB2YXIgbTI0ID0gKGsyLmFuZGxuKDMpICsgZDIpICYgMztcbiAgICBpZiAobTE0ID09PSAzKVxuICAgICAgbTE0ID0gLTE7XG4gICAgaWYgKG0yNCA9PT0gMylcbiAgICAgIG0yNCA9IC0xO1xuICAgIHZhciB1MTtcbiAgICBpZiAoKG0xNCAmIDEpID09PSAwKSB7XG4gICAgICB1MSA9IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBtOCA9IChrMS5hbmRsbig3KSArIGQxKSAmIDc7XG4gICAgICBpZiAoKG04ID09PSAzIHx8IG04ID09PSA1KSAmJiBtMjQgPT09IDIpXG4gICAgICAgIHUxID0gLW0xNDtcbiAgICAgIGVsc2VcbiAgICAgICAgdTEgPSBtMTQ7XG4gICAgfVxuICAgIGpzZlswXS5wdXNoKHUxKTtcblxuICAgIHZhciB1MjtcbiAgICBpZiAoKG0yNCAmIDEpID09PSAwKSB7XG4gICAgICB1MiA9IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBtOCA9IChrMi5hbmRsbig3KSArIGQyKSAmIDc7XG4gICAgICBpZiAoKG04ID09PSAzIHx8IG04ID09PSA1KSAmJiBtMTQgPT09IDIpXG4gICAgICAgIHUyID0gLW0yNDtcbiAgICAgIGVsc2VcbiAgICAgICAgdTIgPSBtMjQ7XG4gICAgfVxuICAgIGpzZlsxXS5wdXNoKHUyKTtcblxuICAgIC8vIFNlY29uZCBwaGFzZVxuICAgIGlmICgyICogZDEgPT09IHUxICsgMSlcbiAgICAgIGQxID0gMSAtIGQxO1xuICAgIGlmICgyICogZDIgPT09IHUyICsgMSlcbiAgICAgIGQyID0gMSAtIGQyO1xuICAgIGsxLml1c2hybigxKTtcbiAgICBrMi5pdXNocm4oMSk7XG4gIH1cblxuICByZXR1cm4ganNmO1xufVxudXRpbHMuZ2V0SlNGID0gZ2V0SlNGO1xuXG5mdW5jdGlvbiBjYWNoZWRQcm9wZXJ0eShvYmosIGNvbXB1dGVyKSB7XG4gIHZhciBuYW1lID0gY29tcHV0ZXIubmFtZTtcbiAgdmFyIGtleSA9ICdfJyArIG5hbWU7XG4gIG9iai5wcm90b3R5cGVbbmFtZV0gPSBmdW5jdGlvbiBjYWNoZWRQcm9wZXJ0eSgpIHtcbiAgICByZXR1cm4gdGhpc1trZXldICE9PSB1bmRlZmluZWQgPyB0aGlzW2tleV0gOlxuICAgICAgICAgICB0aGlzW2tleV0gPSBjb21wdXRlci5jYWxsKHRoaXMpO1xuICB9O1xufVxudXRpbHMuY2FjaGVkUHJvcGVydHkgPSBjYWNoZWRQcm9wZXJ0eTtcblxuZnVuY3Rpb24gcGFyc2VCeXRlcyhieXRlcykge1xuICByZXR1cm4gdHlwZW9mIGJ5dGVzID09PSAnc3RyaW5nJyA/IHV0aWxzLnRvQXJyYXkoYnl0ZXMsICdoZXgnKSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXM7XG59XG51dGlscy5wYXJzZUJ5dGVzID0gcGFyc2VCeXRlcztcblxuZnVuY3Rpb24gaW50RnJvbUxFKGJ5dGVzKSB7XG4gIHJldHVybiBuZXcgQk4oYnl0ZXMsICdoZXgnLCAnbGUnKTtcbn1cbnV0aWxzLmludEZyb21MRSA9IGludEZyb21MRTtcblxuIiwibW9kdWxlLmV4cG9ydHM9e1xuICBcIl9hcmdzXCI6IFtcbiAgICBbXG4gICAgICBcImVsbGlwdGljQF42LjAuMFwiLFxuICAgICAgXCIvaG9tZS9uZXJ2b3VzLy5udm0tZmlzaC92NS40LjEvbGliL25vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9icm93c2VyaWZ5LXNpZ25cIlxuICAgIF1cbiAgXSxcbiAgXCJfZnJvbVwiOiBcImVsbGlwdGljQD49Ni4wLjAgPDcuMC4wXCIsXG4gIFwiX2lkXCI6IFwiZWxsaXB0aWNANi4yLjNcIixcbiAgXCJfaW5DYWNoZVwiOiB0cnVlLFxuICBcIl9pbnN0YWxsYWJsZVwiOiB0cnVlLFxuICBcIl9sb2NhdGlvblwiOiBcIi9icm93c2VyaWZ5L2VsbGlwdGljXCIsXG4gIFwiX25vZGVWZXJzaW9uXCI6IFwiNS40LjFcIixcbiAgXCJfbnBtVXNlclwiOiB7XG4gICAgXCJlbWFpbFwiOiBcImZlZG9yQGluZHV0bnkuY29tXCIsXG4gICAgXCJuYW1lXCI6IFwiaW5kdXRueVwiXG4gIH0sXG4gIFwiX25wbVZlcnNpb25cIjogXCIzLjMuMTJcIixcbiAgXCJfcGhhbnRvbUNoaWxkcmVuXCI6IHt9LFxuICBcIl9yZXF1ZXN0ZWRcIjoge1xuICAgIFwibmFtZVwiOiBcImVsbGlwdGljXCIsXG4gICAgXCJyYXdcIjogXCJlbGxpcHRpY0BeNi4wLjBcIixcbiAgICBcInJhd1NwZWNcIjogXCJeNi4wLjBcIixcbiAgICBcInNjb3BlXCI6IG51bGwsXG4gICAgXCJzcGVjXCI6IFwiPj02LjAuMCA8Ny4wLjBcIixcbiAgICBcInR5cGVcIjogXCJyYW5nZVwiXG4gIH0sXG4gIFwiX3JlcXVpcmVkQnlcIjogW1xuICAgIFwiL2Jyb3dzZXJpZnkvYnJvd3NlcmlmeS1zaWduXCIsXG4gICAgXCIvYnJvd3NlcmlmeS9jcmVhdGUtZWNkaFwiXG4gIF0sXG4gIFwiX3Jlc29sdmVkXCI6IFwiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZWxsaXB0aWMvLS9lbGxpcHRpYy02LjIuMy50Z3pcIixcbiAgXCJfc2hhc3VtXCI6IFwiMThlNDZkNzMwNmIwOTUxMjc1YTJkNDIwNjMyNzBhMTRiNzRlYmU5OVwiLFxuICBcIl9zaHJpbmt3cmFwXCI6IG51bGwsXG4gIFwiX3NwZWNcIjogXCJlbGxpcHRpY0BeNi4wLjBcIixcbiAgXCJfd2hlcmVcIjogXCIvaG9tZS9uZXJ2b3VzLy5udm0tZmlzaC92NS40LjEvbGliL25vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9icm93c2VyaWZ5LXNpZ25cIixcbiAgXCJhdXRob3JcIjoge1xuICAgIFwiZW1haWxcIjogXCJmZWRvckBpbmR1dG55LmNvbVwiLFxuICAgIFwibmFtZVwiOiBcIkZlZG9yIEluZHV0bnlcIlxuICB9LFxuICBcImJ1Z3NcIjoge1xuICAgIFwidXJsXCI6IFwiaHR0cHM6Ly9naXRodWIuY29tL2luZHV0bnkvZWxsaXB0aWMvaXNzdWVzXCJcbiAgfSxcbiAgXCJkZXBlbmRlbmNpZXNcIjoge1xuICAgIFwiYm4uanNcIjogXCJeNC4wLjBcIixcbiAgICBcImJyb3JhbmRcIjogXCJeMS4wLjFcIixcbiAgICBcImhhc2guanNcIjogXCJeMS4wLjBcIixcbiAgICBcImluaGVyaXRzXCI6IFwiXjIuMC4xXCJcbiAgfSxcbiAgXCJkZXNjcmlwdGlvblwiOiBcIkVDIGNyeXB0b2dyYXBoeVwiLFxuICBcImRldkRlcGVuZGVuY2llc1wiOiB7XG4gICAgXCJjb3ZlcmFsbHNcIjogXCJeMi4xMS4zXCIsXG4gICAgXCJpc3RhbmJ1bFwiOiBcIl4wLjQuMlwiLFxuICAgIFwianNjc1wiOiBcIl4yLjkuMFwiLFxuICAgIFwianNoaW50XCI6IFwiXjIuNi4wXCIsXG4gICAgXCJtb2NoYVwiOiBcIl4yLjEuMFwiXG4gIH0sXG4gIFwiZGlyZWN0b3JpZXNcIjoge30sXG4gIFwiZGlzdFwiOiB7XG4gICAgXCJzaGFzdW1cIjogXCIxOGU0NmQ3MzA2YjA5NTEyNzVhMmQ0MjA2MzI3MGExNGI3NGViZTk5XCIsXG4gICAgXCJ0YXJiYWxsXCI6IFwiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9lbGxpcHRpYy8tL2VsbGlwdGljLTYuMi4zLnRnelwiXG4gIH0sXG4gIFwiZmlsZXNcIjogW1xuICAgIFwibGliXCJcbiAgXSxcbiAgXCJnaXRIZWFkXCI6IFwiYzMyZjIwYjIyYjQyMGViNmFmM2M2ZGRhMjg5NjNkZWI3ZmFjZjgyM1wiLFxuICBcImhvbWVwYWdlXCI6IFwiaHR0cHM6Ly9naXRodWIuY29tL2luZHV0bnkvZWxsaXB0aWNcIixcbiAgXCJrZXl3b3Jkc1wiOiBbXG4gICAgXCJDcnlwdG9ncmFwaHlcIixcbiAgICBcIkVDXCIsXG4gICAgXCJFbGxpcHRpY1wiLFxuICAgIFwiY3VydmVcIlxuICBdLFxuICBcImxpY2Vuc2VcIjogXCJNSVRcIixcbiAgXCJtYWluXCI6IFwibGliL2VsbGlwdGljLmpzXCIsXG4gIFwibWFpbnRhaW5lcnNcIjogW1xuICAgIHtcbiAgICAgIFwibmFtZVwiOiBcImluZHV0bnlcIixcbiAgICAgIFwiZW1haWxcIjogXCJmZWRvckBpbmR1dG55LmNvbVwiXG4gICAgfVxuICBdLFxuICBcIm5hbWVcIjogXCJlbGxpcHRpY1wiLFxuICBcIm9wdGlvbmFsRGVwZW5kZW5jaWVzXCI6IHt9LFxuICBcInJlYWRtZVwiOiBcIkVSUk9SOiBObyBSRUFETUUgZGF0YSBmb3VuZCFcIixcbiAgXCJyZXBvc2l0b3J5XCI6IHtcbiAgICBcInR5cGVcIjogXCJnaXRcIixcbiAgICBcInVybFwiOiBcImdpdCtzc2g6Ly9naXRAZ2l0aHViLmNvbS9pbmR1dG55L2VsbGlwdGljLmdpdFwiXG4gIH0sXG4gIFwic2NyaXB0c1wiOiB7XG4gICAgXCJjb3ZlcmFnZVwiOiBcIm5wbSBydW4gdW5pdCAtLWNvdmVyYWdlXCIsXG4gICAgXCJjb3ZlcmFsbHNcIjogXCJucG0gcnVuIGNvdmVyYWdlICYmIGNhdCAuL2NvdmVyYWdlL2xjb3YuaW5mbyB8IGNvdmVyYWxsc1wiLFxuICAgIFwianNjc1wiOiBcImpzY3MgYmVuY2htYXJrcy8qLmpzIGxpYi8qLmpzIGxpYi8qKi8qLmpzIGxpYi8qKi8qKi8qLmpzIHRlc3QvKi5qc1wiLFxuICAgIFwianNoaW50XCI6IFwianNjcyBiZW5jaG1hcmtzLyouanMgbGliLyouanMgbGliLyoqLyouanMgbGliLyoqLyoqLyouanMgdGVzdC8qLmpzXCIsXG4gICAgXCJsaW50XCI6IFwibnBtIHJ1biBqc2NzICYmIG5wbSBydW4ganNoaW50XCIsXG4gICAgXCJ0ZXN0XCI6IFwibnBtIHJ1biBsaW50ICYmIG5wbSBydW4gdW5pdFwiLFxuICAgIFwidW5pdFwiOiBcImlzdGFuYnVsIHRlc3QgX21vY2hhIC0tcmVwb3J0ZXI9c3BlYyB0ZXN0LyotdGVzdC5qc1wiXG4gIH0sXG4gIFwidmVyc2lvblwiOiBcIjYuMi4zXCJcbn1cbiIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG5mdW5jdGlvbiBFdmVudEVtaXR0ZXIoKSB7XG4gIHRoaXMuX2V2ZW50cyA9IHRoaXMuX2V2ZW50cyB8fCB7fTtcbiAgdGhpcy5fbWF4TGlzdGVuZXJzID0gdGhpcy5fbWF4TGlzdGVuZXJzIHx8IHVuZGVmaW5lZDtcbn1cbm1vZHVsZS5leHBvcnRzID0gRXZlbnRFbWl0dGVyO1xuXG4vLyBCYWNrd2FyZHMtY29tcGF0IHdpdGggbm9kZSAwLjEwLnhcbkV2ZW50RW1pdHRlci5FdmVudEVtaXR0ZXIgPSBFdmVudEVtaXR0ZXI7XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuX2V2ZW50cyA9IHVuZGVmaW5lZDtcbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuX21heExpc3RlbmVycyA9IHVuZGVmaW5lZDtcblxuLy8gQnkgZGVmYXVsdCBFdmVudEVtaXR0ZXJzIHdpbGwgcHJpbnQgYSB3YXJuaW5nIGlmIG1vcmUgdGhhbiAxMCBsaXN0ZW5lcnMgYXJlXG4vLyBhZGRlZCB0byBpdC4gVGhpcyBpcyBhIHVzZWZ1bCBkZWZhdWx0IHdoaWNoIGhlbHBzIGZpbmRpbmcgbWVtb3J5IGxlYWtzLlxuRXZlbnRFbWl0dGVyLmRlZmF1bHRNYXhMaXN0ZW5lcnMgPSAxMDtcblxuLy8gT2J2aW91c2x5IG5vdCBhbGwgRW1pdHRlcnMgc2hvdWxkIGJlIGxpbWl0ZWQgdG8gMTAuIFRoaXMgZnVuY3Rpb24gYWxsb3dzXG4vLyB0aGF0IHRvIGJlIGluY3JlYXNlZC4gU2V0IHRvIHplcm8gZm9yIHVubGltaXRlZC5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuc2V0TWF4TGlzdGVuZXJzID0gZnVuY3Rpb24obikge1xuICBpZiAoIWlzTnVtYmVyKG4pIHx8IG4gPCAwIHx8IGlzTmFOKG4pKVxuICAgIHRocm93IFR5cGVFcnJvcignbiBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyJyk7XG4gIHRoaXMuX21heExpc3RlbmVycyA9IG47XG4gIHJldHVybiB0aGlzO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5lbWl0ID0gZnVuY3Rpb24odHlwZSkge1xuICB2YXIgZXIsIGhhbmRsZXIsIGxlbiwgYXJncywgaSwgbGlzdGVuZXJzO1xuXG4gIGlmICghdGhpcy5fZXZlbnRzKVxuICAgIHRoaXMuX2V2ZW50cyA9IHt9O1xuXG4gIC8vIElmIHRoZXJlIGlzIG5vICdlcnJvcicgZXZlbnQgbGlzdGVuZXIgdGhlbiB0aHJvdy5cbiAgaWYgKHR5cGUgPT09ICdlcnJvcicpIHtcbiAgICBpZiAoIXRoaXMuX2V2ZW50cy5lcnJvciB8fFxuICAgICAgICAoaXNPYmplY3QodGhpcy5fZXZlbnRzLmVycm9yKSAmJiAhdGhpcy5fZXZlbnRzLmVycm9yLmxlbmd0aCkpIHtcbiAgICAgIGVyID0gYXJndW1lbnRzWzFdO1xuICAgICAgaWYgKGVyIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgdGhyb3cgZXI7IC8vIFVuaGFuZGxlZCAnZXJyb3InIGV2ZW50XG4gICAgICB9XG4gICAgICB0aHJvdyBUeXBlRXJyb3IoJ1VuY2F1Z2h0LCB1bnNwZWNpZmllZCBcImVycm9yXCIgZXZlbnQuJyk7XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlciA9IHRoaXMuX2V2ZW50c1t0eXBlXTtcblxuICBpZiAoaXNVbmRlZmluZWQoaGFuZGxlcikpXG4gICAgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChpc0Z1bmN0aW9uKGhhbmRsZXIpKSB7XG4gICAgc3dpdGNoIChhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICAvLyBmYXN0IGNhc2VzXG4gICAgICBjYXNlIDE6XG4gICAgICAgIGhhbmRsZXIuY2FsbCh0aGlzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDI6XG4gICAgICAgIGhhbmRsZXIuY2FsbCh0aGlzLCBhcmd1bWVudHNbMV0pO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMzpcbiAgICAgICAgaGFuZGxlci5jYWxsKHRoaXMsIGFyZ3VtZW50c1sxXSwgYXJndW1lbnRzWzJdKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICAvLyBzbG93ZXJcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuICAgICAgICBoYW5kbGVyLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc09iamVjdChoYW5kbGVyKSkge1xuICAgIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuICAgIGxpc3RlbmVycyA9IGhhbmRsZXIuc2xpY2UoKTtcbiAgICBsZW4gPSBsaXN0ZW5lcnMubGVuZ3RoO1xuICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKylcbiAgICAgIGxpc3RlbmVyc1tpXS5hcHBseSh0aGlzLCBhcmdzKTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5hZGRMaXN0ZW5lciA9IGZ1bmN0aW9uKHR5cGUsIGxpc3RlbmVyKSB7XG4gIHZhciBtO1xuXG4gIGlmICghaXNGdW5jdGlvbihsaXN0ZW5lcikpXG4gICAgdGhyb3cgVHlwZUVycm9yKCdsaXN0ZW5lciBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcblxuICBpZiAoIXRoaXMuX2V2ZW50cylcbiAgICB0aGlzLl9ldmVudHMgPSB7fTtcblxuICAvLyBUbyBhdm9pZCByZWN1cnNpb24gaW4gdGhlIGNhc2UgdGhhdCB0eXBlID09PSBcIm5ld0xpc3RlbmVyXCIhIEJlZm9yZVxuICAvLyBhZGRpbmcgaXQgdG8gdGhlIGxpc3RlbmVycywgZmlyc3QgZW1pdCBcIm5ld0xpc3RlbmVyXCIuXG4gIGlmICh0aGlzLl9ldmVudHMubmV3TGlzdGVuZXIpXG4gICAgdGhpcy5lbWl0KCduZXdMaXN0ZW5lcicsIHR5cGUsXG4gICAgICAgICAgICAgIGlzRnVuY3Rpb24obGlzdGVuZXIubGlzdGVuZXIpID9cbiAgICAgICAgICAgICAgbGlzdGVuZXIubGlzdGVuZXIgOiBsaXN0ZW5lcik7XG5cbiAgaWYgKCF0aGlzLl9ldmVudHNbdHlwZV0pXG4gICAgLy8gT3B0aW1pemUgdGhlIGNhc2Ugb2Ygb25lIGxpc3RlbmVyLiBEb24ndCBuZWVkIHRoZSBleHRyYSBhcnJheSBvYmplY3QuXG4gICAgdGhpcy5fZXZlbnRzW3R5cGVdID0gbGlzdGVuZXI7XG4gIGVsc2UgaWYgKGlzT2JqZWN0KHRoaXMuX2V2ZW50c1t0eXBlXSkpXG4gICAgLy8gSWYgd2UndmUgYWxyZWFkeSBnb3QgYW4gYXJyYXksIGp1c3QgYXBwZW5kLlxuICAgIHRoaXMuX2V2ZW50c1t0eXBlXS5wdXNoKGxpc3RlbmVyKTtcbiAgZWxzZVxuICAgIC8vIEFkZGluZyB0aGUgc2Vjb25kIGVsZW1lbnQsIG5lZWQgdG8gY2hhbmdlIHRvIGFycmF5LlxuICAgIHRoaXMuX2V2ZW50c1t0eXBlXSA9IFt0aGlzLl9ldmVudHNbdHlwZV0sIGxpc3RlbmVyXTtcblxuICAvLyBDaGVjayBmb3IgbGlzdGVuZXIgbGVha1xuICBpZiAoaXNPYmplY3QodGhpcy5fZXZlbnRzW3R5cGVdKSAmJiAhdGhpcy5fZXZlbnRzW3R5cGVdLndhcm5lZCkge1xuICAgIGlmICghaXNVbmRlZmluZWQodGhpcy5fbWF4TGlzdGVuZXJzKSkge1xuICAgICAgbSA9IHRoaXMuX21heExpc3RlbmVycztcbiAgICB9IGVsc2Uge1xuICAgICAgbSA9IEV2ZW50RW1pdHRlci5kZWZhdWx0TWF4TGlzdGVuZXJzO1xuICAgIH1cblxuICAgIGlmIChtICYmIG0gPiAwICYmIHRoaXMuX2V2ZW50c1t0eXBlXS5sZW5ndGggPiBtKSB7XG4gICAgICB0aGlzLl9ldmVudHNbdHlwZV0ud2FybmVkID0gdHJ1ZTtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJyhub2RlKSB3YXJuaW5nOiBwb3NzaWJsZSBFdmVudEVtaXR0ZXIgbWVtb3J5ICcgK1xuICAgICAgICAgICAgICAgICAgICAnbGVhayBkZXRlY3RlZC4gJWQgbGlzdGVuZXJzIGFkZGVkLiAnICtcbiAgICAgICAgICAgICAgICAgICAgJ1VzZSBlbWl0dGVyLnNldE1heExpc3RlbmVycygpIHRvIGluY3JlYXNlIGxpbWl0LicsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2V2ZW50c1t0eXBlXS5sZW5ndGgpO1xuICAgICAgaWYgKHR5cGVvZiBjb25zb2xlLnRyYWNlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIC8vIG5vdCBzdXBwb3J0ZWQgaW4gSUUgMTBcbiAgICAgICAgY29uc29sZS50cmFjZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vbiA9IEV2ZW50RW1pdHRlci5wcm90b3R5cGUuYWRkTGlzdGVuZXI7XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUub25jZSA9IGZ1bmN0aW9uKHR5cGUsIGxpc3RlbmVyKSB7XG4gIGlmICghaXNGdW5jdGlvbihsaXN0ZW5lcikpXG4gICAgdGhyb3cgVHlwZUVycm9yKCdsaXN0ZW5lciBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcblxuICB2YXIgZmlyZWQgPSBmYWxzZTtcblxuICBmdW5jdGlvbiBnKCkge1xuICAgIHRoaXMucmVtb3ZlTGlzdGVuZXIodHlwZSwgZyk7XG5cbiAgICBpZiAoIWZpcmVkKSB7XG4gICAgICBmaXJlZCA9IHRydWU7XG4gICAgICBsaXN0ZW5lci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH1cbiAgfVxuXG4gIGcubGlzdGVuZXIgPSBsaXN0ZW5lcjtcbiAgdGhpcy5vbih0eXBlLCBnKTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbi8vIGVtaXRzIGEgJ3JlbW92ZUxpc3RlbmVyJyBldmVudCBpZmYgdGhlIGxpc3RlbmVyIHdhcyByZW1vdmVkXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyID0gZnVuY3Rpb24odHlwZSwgbGlzdGVuZXIpIHtcbiAgdmFyIGxpc3QsIHBvc2l0aW9uLCBsZW5ndGgsIGk7XG5cbiAgaWYgKCFpc0Z1bmN0aW9uKGxpc3RlbmVyKSlcbiAgICB0aHJvdyBUeXBlRXJyb3IoJ2xpc3RlbmVyIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuXG4gIGlmICghdGhpcy5fZXZlbnRzIHx8ICF0aGlzLl9ldmVudHNbdHlwZV0pXG4gICAgcmV0dXJuIHRoaXM7XG5cbiAgbGlzdCA9IHRoaXMuX2V2ZW50c1t0eXBlXTtcbiAgbGVuZ3RoID0gbGlzdC5sZW5ndGg7XG4gIHBvc2l0aW9uID0gLTE7XG5cbiAgaWYgKGxpc3QgPT09IGxpc3RlbmVyIHx8XG4gICAgICAoaXNGdW5jdGlvbihsaXN0Lmxpc3RlbmVyKSAmJiBsaXN0Lmxpc3RlbmVyID09PSBsaXN0ZW5lcikpIHtcbiAgICBkZWxldGUgdGhpcy5fZXZlbnRzW3R5cGVdO1xuICAgIGlmICh0aGlzLl9ldmVudHMucmVtb3ZlTGlzdGVuZXIpXG4gICAgICB0aGlzLmVtaXQoJ3JlbW92ZUxpc3RlbmVyJywgdHlwZSwgbGlzdGVuZXIpO1xuXG4gIH0gZWxzZSBpZiAoaXNPYmplY3QobGlzdCkpIHtcbiAgICBmb3IgKGkgPSBsZW5ndGg7IGktLSA+IDA7KSB7XG4gICAgICBpZiAobGlzdFtpXSA9PT0gbGlzdGVuZXIgfHxcbiAgICAgICAgICAobGlzdFtpXS5saXN0ZW5lciAmJiBsaXN0W2ldLmxpc3RlbmVyID09PSBsaXN0ZW5lcikpIHtcbiAgICAgICAgcG9zaXRpb24gPSBpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocG9zaXRpb24gPCAwKVxuICAgICAgcmV0dXJuIHRoaXM7XG5cbiAgICBpZiAobGlzdC5sZW5ndGggPT09IDEpIHtcbiAgICAgIGxpc3QubGVuZ3RoID0gMDtcbiAgICAgIGRlbGV0ZSB0aGlzLl9ldmVudHNbdHlwZV07XG4gICAgfSBlbHNlIHtcbiAgICAgIGxpc3Quc3BsaWNlKHBvc2l0aW9uLCAxKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fZXZlbnRzLnJlbW92ZUxpc3RlbmVyKVxuICAgICAgdGhpcy5lbWl0KCdyZW1vdmVMaXN0ZW5lcicsIHR5cGUsIGxpc3RlbmVyKTtcbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVBbGxMaXN0ZW5lcnMgPSBmdW5jdGlvbih0eXBlKSB7XG4gIHZhciBrZXksIGxpc3RlbmVycztcblxuICBpZiAoIXRoaXMuX2V2ZW50cylcbiAgICByZXR1cm4gdGhpcztcblxuICAvLyBub3QgbGlzdGVuaW5nIGZvciByZW1vdmVMaXN0ZW5lciwgbm8gbmVlZCB0byBlbWl0XG4gIGlmICghdGhpcy5fZXZlbnRzLnJlbW92ZUxpc3RlbmVyKSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApXG4gICAgICB0aGlzLl9ldmVudHMgPSB7fTtcbiAgICBlbHNlIGlmICh0aGlzLl9ldmVudHNbdHlwZV0pXG4gICAgICBkZWxldGUgdGhpcy5fZXZlbnRzW3R5cGVdO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gZW1pdCByZW1vdmVMaXN0ZW5lciBmb3IgYWxsIGxpc3RlbmVycyBvbiBhbGwgZXZlbnRzXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgZm9yIChrZXkgaW4gdGhpcy5fZXZlbnRzKSB7XG4gICAgICBpZiAoa2V5ID09PSAncmVtb3ZlTGlzdGVuZXInKSBjb250aW51ZTtcbiAgICAgIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKGtleSk7XG4gICAgfVxuICAgIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKCdyZW1vdmVMaXN0ZW5lcicpO1xuICAgIHRoaXMuX2V2ZW50cyA9IHt9O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgbGlzdGVuZXJzID0gdGhpcy5fZXZlbnRzW3R5cGVdO1xuXG4gIGlmIChpc0Z1bmN0aW9uKGxpc3RlbmVycykpIHtcbiAgICB0aGlzLnJlbW92ZUxpc3RlbmVyKHR5cGUsIGxpc3RlbmVycyk7XG4gIH0gZWxzZSBpZiAobGlzdGVuZXJzKSB7XG4gICAgLy8gTElGTyBvcmRlclxuICAgIHdoaWxlIChsaXN0ZW5lcnMubGVuZ3RoKVxuICAgICAgdGhpcy5yZW1vdmVMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcnNbbGlzdGVuZXJzLmxlbmd0aCAtIDFdKTtcbiAgfVxuICBkZWxldGUgdGhpcy5fZXZlbnRzW3R5cGVdO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5saXN0ZW5lcnMgPSBmdW5jdGlvbih0eXBlKSB7XG4gIHZhciByZXQ7XG4gIGlmICghdGhpcy5fZXZlbnRzIHx8ICF0aGlzLl9ldmVudHNbdHlwZV0pXG4gICAgcmV0ID0gW107XG4gIGVsc2UgaWYgKGlzRnVuY3Rpb24odGhpcy5fZXZlbnRzW3R5cGVdKSlcbiAgICByZXQgPSBbdGhpcy5fZXZlbnRzW3R5cGVdXTtcbiAgZWxzZVxuICAgIHJldCA9IHRoaXMuX2V2ZW50c1t0eXBlXS5zbGljZSgpO1xuICByZXR1cm4gcmV0O1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5saXN0ZW5lckNvdW50ID0gZnVuY3Rpb24odHlwZSkge1xuICBpZiAodGhpcy5fZXZlbnRzKSB7XG4gICAgdmFyIGV2bGlzdGVuZXIgPSB0aGlzLl9ldmVudHNbdHlwZV07XG5cbiAgICBpZiAoaXNGdW5jdGlvbihldmxpc3RlbmVyKSlcbiAgICAgIHJldHVybiAxO1xuICAgIGVsc2UgaWYgKGV2bGlzdGVuZXIpXG4gICAgICByZXR1cm4gZXZsaXN0ZW5lci5sZW5ndGg7XG4gIH1cbiAgcmV0dXJuIDA7XG59O1xuXG5FdmVudEVtaXR0ZXIubGlzdGVuZXJDb3VudCA9IGZ1bmN0aW9uKGVtaXR0ZXIsIHR5cGUpIHtcbiAgcmV0dXJuIGVtaXR0ZXIubGlzdGVuZXJDb3VudCh0eXBlKTtcbn07XG5cbmZ1bmN0aW9uIGlzRnVuY3Rpb24oYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnZnVuY3Rpb24nO1xufVxuXG5mdW5jdGlvbiBpc051bWJlcihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdudW1iZXInO1xufVxuXG5mdW5jdGlvbiBpc09iamVjdChhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdvYmplY3QnICYmIGFyZyAhPT0gbnVsbDtcbn1cblxuZnVuY3Rpb24gaXNVbmRlZmluZWQoYXJnKSB7XG4gIHJldHVybiBhcmcgPT09IHZvaWQgMDtcbn1cbiIsInZhciBtZDUgPSByZXF1aXJlKCdjcmVhdGUtaGFzaC9tZDUnKVxubW9kdWxlLmV4cG9ydHMgPSBFVlBfQnl0ZXNUb0tleVxuZnVuY3Rpb24gRVZQX0J5dGVzVG9LZXkgKHBhc3N3b3JkLCBzYWx0LCBrZXlMZW4sIGl2TGVuKSB7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKHBhc3N3b3JkKSkge1xuICAgIHBhc3N3b3JkID0gbmV3IEJ1ZmZlcihwYXNzd29yZCwgJ2JpbmFyeScpXG4gIH1cbiAgaWYgKHNhbHQgJiYgIUJ1ZmZlci5pc0J1ZmZlcihzYWx0KSkge1xuICAgIHNhbHQgPSBuZXcgQnVmZmVyKHNhbHQsICdiaW5hcnknKVxuICB9XG4gIGtleUxlbiA9IGtleUxlbiAvIDhcbiAgaXZMZW4gPSBpdkxlbiB8fCAwXG4gIHZhciBraSA9IDBcbiAgdmFyIGlpID0gMFxuICB2YXIga2V5ID0gbmV3IEJ1ZmZlcihrZXlMZW4pXG4gIHZhciBpdiA9IG5ldyBCdWZmZXIoaXZMZW4pXG4gIHZhciBhZGRtZCA9IDBcbiAgdmFyIG1kX2J1ZlxuICB2YXIgaVxuICB2YXIgYnVmcyA9IFtdXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgaWYgKGFkZG1kKysgPiAwKSB7XG4gICAgICBidWZzLnB1c2gobWRfYnVmKVxuICAgIH1cbiAgICBidWZzLnB1c2gocGFzc3dvcmQpXG4gICAgaWYgKHNhbHQpIHtcbiAgICAgIGJ1ZnMucHVzaChzYWx0KVxuICAgIH1cbiAgICBtZF9idWYgPSBtZDUoQnVmZmVyLmNvbmNhdChidWZzKSlcbiAgICBidWZzID0gW11cbiAgICBpID0gMFxuICAgIGlmIChrZXlMZW4gPiAwKSB7XG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICBpZiAoa2V5TGVuID09PSAwKSB7XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaSA9PT0gbWRfYnVmLmxlbmd0aCkge1xuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAga2V5W2tpKytdID0gbWRfYnVmW2ldXG4gICAgICAgIGtleUxlbi0tXG4gICAgICAgIGkrK1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXZMZW4gPiAwICYmIGkgIT09IG1kX2J1Zi5sZW5ndGgpIHtcbiAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIGlmIChpdkxlbiA9PT0gMCkge1xuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGkgPT09IG1kX2J1Zi5sZW5ndGgpIHtcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGl2W2lpKytdID0gbWRfYnVmW2ldXG4gICAgICAgIGl2TGVuLS1cbiAgICAgICAgaSsrXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChrZXlMZW4gPT09IDAgJiYgaXZMZW4gPT09IDApIHtcbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG4gIGZvciAoaSA9IDA7IGkgPCBtZF9idWYubGVuZ3RoOyBpKyspIHtcbiAgICBtZF9idWZbaV0gPSAwXG4gIH1cbiAgcmV0dXJuIHtcbiAgICBrZXk6IGtleSxcbiAgICBpdjogaXZcbiAgfVxufVxuIiwidmFyIGhhc2ggPSBleHBvcnRzO1xuXG5oYXNoLnV0aWxzID0gcmVxdWlyZSgnLi9oYXNoL3V0aWxzJyk7XG5oYXNoLmNvbW1vbiA9IHJlcXVpcmUoJy4vaGFzaC9jb21tb24nKTtcbmhhc2guc2hhID0gcmVxdWlyZSgnLi9oYXNoL3NoYScpO1xuaGFzaC5yaXBlbWQgPSByZXF1aXJlKCcuL2hhc2gvcmlwZW1kJyk7XG5oYXNoLmhtYWMgPSByZXF1aXJlKCcuL2hhc2gvaG1hYycpO1xuXG4vLyBQcm94eSBoYXNoIGZ1bmN0aW9ucyB0byB0aGUgbWFpbiBvYmplY3Rcbmhhc2guc2hhMSA9IGhhc2guc2hhLnNoYTE7XG5oYXNoLnNoYTI1NiA9IGhhc2guc2hhLnNoYTI1Njtcbmhhc2guc2hhMjI0ID0gaGFzaC5zaGEuc2hhMjI0O1xuaGFzaC5zaGEzODQgPSBoYXNoLnNoYS5zaGEzODQ7XG5oYXNoLnNoYTUxMiA9IGhhc2guc2hhLnNoYTUxMjtcbmhhc2gucmlwZW1kMTYwID0gaGFzaC5yaXBlbWQucmlwZW1kMTYwO1xuIiwidmFyIGhhc2ggPSByZXF1aXJlKCcuLi9oYXNoJyk7XG52YXIgdXRpbHMgPSBoYXNoLnV0aWxzO1xudmFyIGFzc2VydCA9IHV0aWxzLmFzc2VydDtcblxuZnVuY3Rpb24gQmxvY2tIYXNoKCkge1xuICB0aGlzLnBlbmRpbmcgPSBudWxsO1xuICB0aGlzLnBlbmRpbmdUb3RhbCA9IDA7XG4gIHRoaXMuYmxvY2tTaXplID0gdGhpcy5jb25zdHJ1Y3Rvci5ibG9ja1NpemU7XG4gIHRoaXMub3V0U2l6ZSA9IHRoaXMuY29uc3RydWN0b3Iub3V0U2l6ZTtcbiAgdGhpcy5obWFjU3RyZW5ndGggPSB0aGlzLmNvbnN0cnVjdG9yLmhtYWNTdHJlbmd0aDtcbiAgdGhpcy5wYWRMZW5ndGggPSB0aGlzLmNvbnN0cnVjdG9yLnBhZExlbmd0aCAvIDg7XG4gIHRoaXMuZW5kaWFuID0gJ2JpZyc7XG5cbiAgdGhpcy5fZGVsdGE4ID0gdGhpcy5ibG9ja1NpemUgLyA4O1xuICB0aGlzLl9kZWx0YTMyID0gdGhpcy5ibG9ja1NpemUgLyAzMjtcbn1cbmV4cG9ydHMuQmxvY2tIYXNoID0gQmxvY2tIYXNoO1xuXG5CbG9ja0hhc2gucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uIHVwZGF0ZShtc2csIGVuYykge1xuICAvLyBDb252ZXJ0IG1lc3NhZ2UgdG8gYXJyYXksIHBhZCBpdCwgYW5kIGpvaW4gaW50byAzMmJpdCBibG9ja3NcbiAgbXNnID0gdXRpbHMudG9BcnJheShtc2csIGVuYyk7XG4gIGlmICghdGhpcy5wZW5kaW5nKVxuICAgIHRoaXMucGVuZGluZyA9IG1zZztcbiAgZWxzZVxuICAgIHRoaXMucGVuZGluZyA9IHRoaXMucGVuZGluZy5jb25jYXQobXNnKTtcbiAgdGhpcy5wZW5kaW5nVG90YWwgKz0gbXNnLmxlbmd0aDtcblxuICAvLyBFbm91Z2ggZGF0YSwgdHJ5IHVwZGF0aW5nXG4gIGlmICh0aGlzLnBlbmRpbmcubGVuZ3RoID49IHRoaXMuX2RlbHRhOCkge1xuICAgIG1zZyA9IHRoaXMucGVuZGluZztcblxuICAgIC8vIFByb2Nlc3MgcGVuZGluZyBkYXRhIGluIGJsb2Nrc1xuICAgIHZhciByID0gbXNnLmxlbmd0aCAlIHRoaXMuX2RlbHRhODtcbiAgICB0aGlzLnBlbmRpbmcgPSBtc2cuc2xpY2UobXNnLmxlbmd0aCAtIHIsIG1zZy5sZW5ndGgpO1xuICAgIGlmICh0aGlzLnBlbmRpbmcubGVuZ3RoID09PSAwKVxuICAgICAgdGhpcy5wZW5kaW5nID0gbnVsbDtcblxuICAgIG1zZyA9IHV0aWxzLmpvaW4zMihtc2csIDAsIG1zZy5sZW5ndGggLSByLCB0aGlzLmVuZGlhbik7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtc2cubGVuZ3RoOyBpICs9IHRoaXMuX2RlbHRhMzIpXG4gICAgICB0aGlzLl91cGRhdGUobXNnLCBpLCBpICsgdGhpcy5fZGVsdGEzMik7XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn07XG5cbkJsb2NrSGFzaC5wcm90b3R5cGUuZGlnZXN0ID0gZnVuY3Rpb24gZGlnZXN0KGVuYykge1xuICB0aGlzLnVwZGF0ZSh0aGlzLl9wYWQoKSk7XG4gIGFzc2VydCh0aGlzLnBlbmRpbmcgPT09IG51bGwpO1xuXG4gIHJldHVybiB0aGlzLl9kaWdlc3QoZW5jKTtcbn07XG5cbkJsb2NrSGFzaC5wcm90b3R5cGUuX3BhZCA9IGZ1bmN0aW9uIHBhZCgpIHtcbiAgdmFyIGxlbiA9IHRoaXMucGVuZGluZ1RvdGFsO1xuICB2YXIgYnl0ZXMgPSB0aGlzLl9kZWx0YTg7XG4gIHZhciBrID0gYnl0ZXMgLSAoKGxlbiArIHRoaXMucGFkTGVuZ3RoKSAlIGJ5dGVzKTtcbiAgdmFyIHJlcyA9IG5ldyBBcnJheShrICsgdGhpcy5wYWRMZW5ndGgpO1xuICByZXNbMF0gPSAweDgwO1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGs7IGkrKylcbiAgICByZXNbaV0gPSAwO1xuXG4gIC8vIEFwcGVuZCBsZW5ndGhcbiAgbGVuIDw8PSAzO1xuICBpZiAodGhpcy5lbmRpYW4gPT09ICdiaWcnKSB7XG4gICAgZm9yICh2YXIgdCA9IDg7IHQgPCB0aGlzLnBhZExlbmd0aDsgdCsrKVxuICAgICAgcmVzW2krK10gPSAwO1xuXG4gICAgcmVzW2krK10gPSAwO1xuICAgIHJlc1tpKytdID0gMDtcbiAgICByZXNbaSsrXSA9IDA7XG4gICAgcmVzW2krK10gPSAwO1xuICAgIHJlc1tpKytdID0gKGxlbiA+Pj4gMjQpICYgMHhmZjtcbiAgICByZXNbaSsrXSA9IChsZW4gPj4+IDE2KSAmIDB4ZmY7XG4gICAgcmVzW2krK10gPSAobGVuID4+PiA4KSAmIDB4ZmY7XG4gICAgcmVzW2krK10gPSBsZW4gJiAweGZmO1xuICB9IGVsc2Uge1xuICAgIHJlc1tpKytdID0gbGVuICYgMHhmZjtcbiAgICByZXNbaSsrXSA9IChsZW4gPj4+IDgpICYgMHhmZjtcbiAgICByZXNbaSsrXSA9IChsZW4gPj4+IDE2KSAmIDB4ZmY7XG4gICAgcmVzW2krK10gPSAobGVuID4+PiAyNCkgJiAweGZmO1xuICAgIHJlc1tpKytdID0gMDtcbiAgICByZXNbaSsrXSA9IDA7XG4gICAgcmVzW2krK10gPSAwO1xuICAgIHJlc1tpKytdID0gMDtcblxuICAgIGZvciAodmFyIHQgPSA4OyB0IDwgdGhpcy5wYWRMZW5ndGg7IHQrKylcbiAgICAgIHJlc1tpKytdID0gMDtcbiAgfVxuXG4gIHJldHVybiByZXM7XG59O1xuIiwidmFyIGhtYWMgPSBleHBvcnRzO1xuXG52YXIgaGFzaCA9IHJlcXVpcmUoJy4uL2hhc2gnKTtcbnZhciB1dGlscyA9IGhhc2gudXRpbHM7XG52YXIgYXNzZXJ0ID0gdXRpbHMuYXNzZXJ0O1xuXG5mdW5jdGlvbiBIbWFjKGhhc2gsIGtleSwgZW5jKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBIbWFjKSlcbiAgICByZXR1cm4gbmV3IEhtYWMoaGFzaCwga2V5LCBlbmMpO1xuICB0aGlzLkhhc2ggPSBoYXNoO1xuICB0aGlzLmJsb2NrU2l6ZSA9IGhhc2guYmxvY2tTaXplIC8gODtcbiAgdGhpcy5vdXRTaXplID0gaGFzaC5vdXRTaXplIC8gODtcbiAgdGhpcy5pbm5lciA9IG51bGw7XG4gIHRoaXMub3V0ZXIgPSBudWxsO1xuXG4gIHRoaXMuX2luaXQodXRpbHMudG9BcnJheShrZXksIGVuYykpO1xufVxubW9kdWxlLmV4cG9ydHMgPSBIbWFjO1xuXG5IbWFjLnByb3RvdHlwZS5faW5pdCA9IGZ1bmN0aW9uIGluaXQoa2V5KSB7XG4gIC8vIFNob3J0ZW4ga2V5LCBpZiBuZWVkZWRcbiAgaWYgKGtleS5sZW5ndGggPiB0aGlzLmJsb2NrU2l6ZSlcbiAgICBrZXkgPSBuZXcgdGhpcy5IYXNoKCkudXBkYXRlKGtleSkuZGlnZXN0KCk7XG4gIGFzc2VydChrZXkubGVuZ3RoIDw9IHRoaXMuYmxvY2tTaXplKTtcblxuICAvLyBBZGQgcGFkZGluZyB0byBrZXlcbiAgZm9yICh2YXIgaSA9IGtleS5sZW5ndGg7IGkgPCB0aGlzLmJsb2NrU2l6ZTsgaSsrKVxuICAgIGtleS5wdXNoKDApO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwga2V5Lmxlbmd0aDsgaSsrKVxuICAgIGtleVtpXSBePSAweDM2O1xuICB0aGlzLmlubmVyID0gbmV3IHRoaXMuSGFzaCgpLnVwZGF0ZShrZXkpO1xuXG4gIC8vIDB4MzYgXiAweDVjID0gMHg2YVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGtleS5sZW5ndGg7IGkrKylcbiAgICBrZXlbaV0gXj0gMHg2YTtcbiAgdGhpcy5vdXRlciA9IG5ldyB0aGlzLkhhc2goKS51cGRhdGUoa2V5KTtcbn07XG5cbkhtYWMucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uIHVwZGF0ZShtc2csIGVuYykge1xuICB0aGlzLmlubmVyLnVwZGF0ZShtc2csIGVuYyk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuSG1hYy5wcm90b3R5cGUuZGlnZXN0ID0gZnVuY3Rpb24gZGlnZXN0KGVuYykge1xuICB0aGlzLm91dGVyLnVwZGF0ZSh0aGlzLmlubmVyLmRpZ2VzdCgpKTtcbiAgcmV0dXJuIHRoaXMub3V0ZXIuZGlnZXN0KGVuYyk7XG59O1xuIiwidmFyIGhhc2ggPSByZXF1aXJlKCcuLi9oYXNoJyk7XG52YXIgdXRpbHMgPSBoYXNoLnV0aWxzO1xuXG52YXIgcm90bDMyID0gdXRpbHMucm90bDMyO1xudmFyIHN1bTMyID0gdXRpbHMuc3VtMzI7XG52YXIgc3VtMzJfMyA9IHV0aWxzLnN1bTMyXzM7XG52YXIgc3VtMzJfNCA9IHV0aWxzLnN1bTMyXzQ7XG52YXIgQmxvY2tIYXNoID0gaGFzaC5jb21tb24uQmxvY2tIYXNoO1xuXG5mdW5jdGlvbiBSSVBFTUQxNjAoKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBSSVBFTUQxNjApKVxuICAgIHJldHVybiBuZXcgUklQRU1EMTYwKCk7XG5cbiAgQmxvY2tIYXNoLmNhbGwodGhpcyk7XG5cbiAgdGhpcy5oID0gWyAweDY3NDUyMzAxLCAweGVmY2RhYjg5LCAweDk4YmFkY2ZlLCAweDEwMzI1NDc2LCAweGMzZDJlMWYwIF07XG4gIHRoaXMuZW5kaWFuID0gJ2xpdHRsZSc7XG59XG51dGlscy5pbmhlcml0cyhSSVBFTUQxNjAsIEJsb2NrSGFzaCk7XG5leHBvcnRzLnJpcGVtZDE2MCA9IFJJUEVNRDE2MDtcblxuUklQRU1EMTYwLmJsb2NrU2l6ZSA9IDUxMjtcblJJUEVNRDE2MC5vdXRTaXplID0gMTYwO1xuUklQRU1EMTYwLmhtYWNTdHJlbmd0aCA9IDE5MjtcblJJUEVNRDE2MC5wYWRMZW5ndGggPSA2NDtcblxuUklQRU1EMTYwLnByb3RvdHlwZS5fdXBkYXRlID0gZnVuY3Rpb24gdXBkYXRlKG1zZywgc3RhcnQpIHtcbiAgdmFyIEEgPSB0aGlzLmhbMF07XG4gIHZhciBCID0gdGhpcy5oWzFdO1xuICB2YXIgQyA9IHRoaXMuaFsyXTtcbiAgdmFyIEQgPSB0aGlzLmhbM107XG4gIHZhciBFID0gdGhpcy5oWzRdO1xuICB2YXIgQWggPSBBO1xuICB2YXIgQmggPSBCO1xuICB2YXIgQ2ggPSBDO1xuICB2YXIgRGggPSBEO1xuICB2YXIgRWggPSBFO1xuICBmb3IgKHZhciBqID0gMDsgaiA8IDgwOyBqKyspIHtcbiAgICB2YXIgVCA9IHN1bTMyKFxuICAgICAgcm90bDMyKFxuICAgICAgICBzdW0zMl80KEEsIGYoaiwgQiwgQywgRCksIG1zZ1tyW2pdICsgc3RhcnRdLCBLKGopKSxcbiAgICAgICAgc1tqXSksXG4gICAgICBFKTtcbiAgICBBID0gRTtcbiAgICBFID0gRDtcbiAgICBEID0gcm90bDMyKEMsIDEwKTtcbiAgICBDID0gQjtcbiAgICBCID0gVDtcbiAgICBUID0gc3VtMzIoXG4gICAgICByb3RsMzIoXG4gICAgICAgIHN1bTMyXzQoQWgsIGYoNzkgLSBqLCBCaCwgQ2gsIERoKSwgbXNnW3JoW2pdICsgc3RhcnRdLCBLaChqKSksXG4gICAgICAgIHNoW2pdKSxcbiAgICAgIEVoKTtcbiAgICBBaCA9IEVoO1xuICAgIEVoID0gRGg7XG4gICAgRGggPSByb3RsMzIoQ2gsIDEwKTtcbiAgICBDaCA9IEJoO1xuICAgIEJoID0gVDtcbiAgfVxuICBUID0gc3VtMzJfMyh0aGlzLmhbMV0sIEMsIERoKTtcbiAgdGhpcy5oWzFdID0gc3VtMzJfMyh0aGlzLmhbMl0sIEQsIEVoKTtcbiAgdGhpcy5oWzJdID0gc3VtMzJfMyh0aGlzLmhbM10sIEUsIEFoKTtcbiAgdGhpcy5oWzNdID0gc3VtMzJfMyh0aGlzLmhbNF0sIEEsIEJoKTtcbiAgdGhpcy5oWzRdID0gc3VtMzJfMyh0aGlzLmhbMF0sIEIsIENoKTtcbiAgdGhpcy5oWzBdID0gVDtcbn07XG5cblJJUEVNRDE2MC5wcm90b3R5cGUuX2RpZ2VzdCA9IGZ1bmN0aW9uIGRpZ2VzdChlbmMpIHtcbiAgaWYgKGVuYyA9PT0gJ2hleCcpXG4gICAgcmV0dXJuIHV0aWxzLnRvSGV4MzIodGhpcy5oLCAnbGl0dGxlJyk7XG4gIGVsc2VcbiAgICByZXR1cm4gdXRpbHMuc3BsaXQzMih0aGlzLmgsICdsaXR0bGUnKTtcbn07XG5cbmZ1bmN0aW9uIGYoaiwgeCwgeSwgeikge1xuICBpZiAoaiA8PSAxNSlcbiAgICByZXR1cm4geCBeIHkgXiB6O1xuICBlbHNlIGlmIChqIDw9IDMxKVxuICAgIHJldHVybiAoeCAmIHkpIHwgKCh+eCkgJiB6KTtcbiAgZWxzZSBpZiAoaiA8PSA0NylcbiAgICByZXR1cm4gKHggfCAofnkpKSBeIHo7XG4gIGVsc2UgaWYgKGogPD0gNjMpXG4gICAgcmV0dXJuICh4ICYgeikgfCAoeSAmICh+eikpO1xuICBlbHNlXG4gICAgcmV0dXJuIHggXiAoeSB8ICh+eikpO1xufVxuXG5mdW5jdGlvbiBLKGopIHtcbiAgaWYgKGogPD0gMTUpXG4gICAgcmV0dXJuIDB4MDAwMDAwMDA7XG4gIGVsc2UgaWYgKGogPD0gMzEpXG4gICAgcmV0dXJuIDB4NWE4Mjc5OTk7XG4gIGVsc2UgaWYgKGogPD0gNDcpXG4gICAgcmV0dXJuIDB4NmVkOWViYTE7XG4gIGVsc2UgaWYgKGogPD0gNjMpXG4gICAgcmV0dXJuIDB4OGYxYmJjZGM7XG4gIGVsc2VcbiAgICByZXR1cm4gMHhhOTUzZmQ0ZTtcbn1cblxuZnVuY3Rpb24gS2goaikge1xuICBpZiAoaiA8PSAxNSlcbiAgICByZXR1cm4gMHg1MGEyOGJlNjtcbiAgZWxzZSBpZiAoaiA8PSAzMSlcbiAgICByZXR1cm4gMHg1YzRkZDEyNDtcbiAgZWxzZSBpZiAoaiA8PSA0NylcbiAgICByZXR1cm4gMHg2ZDcwM2VmMztcbiAgZWxzZSBpZiAoaiA8PSA2MylcbiAgICByZXR1cm4gMHg3YTZkNzZlOTtcbiAgZWxzZVxuICAgIHJldHVybiAweDAwMDAwMDAwO1xufVxuXG52YXIgciA9IFtcbiAgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSxcbiAgNywgNCwgMTMsIDEsIDEwLCA2LCAxNSwgMywgMTIsIDAsIDksIDUsIDIsIDE0LCAxMSwgOCxcbiAgMywgMTAsIDE0LCA0LCA5LCAxNSwgOCwgMSwgMiwgNywgMCwgNiwgMTMsIDExLCA1LCAxMixcbiAgMSwgOSwgMTEsIDEwLCAwLCA4LCAxMiwgNCwgMTMsIDMsIDcsIDE1LCAxNCwgNSwgNiwgMixcbiAgNCwgMCwgNSwgOSwgNywgMTIsIDIsIDEwLCAxNCwgMSwgMywgOCwgMTEsIDYsIDE1LCAxM1xuXTtcblxudmFyIHJoID0gW1xuICA1LCAxNCwgNywgMCwgOSwgMiwgMTEsIDQsIDEzLCA2LCAxNSwgOCwgMSwgMTAsIDMsIDEyLFxuICA2LCAxMSwgMywgNywgMCwgMTMsIDUsIDEwLCAxNCwgMTUsIDgsIDEyLCA0LCA5LCAxLCAyLFxuICAxNSwgNSwgMSwgMywgNywgMTQsIDYsIDksIDExLCA4LCAxMiwgMiwgMTAsIDAsIDQsIDEzLFxuICA4LCA2LCA0LCAxLCAzLCAxMSwgMTUsIDAsIDUsIDEyLCAyLCAxMywgOSwgNywgMTAsIDE0LFxuICAxMiwgMTUsIDEwLCA0LCAxLCA1LCA4LCA3LCA2LCAyLCAxMywgMTQsIDAsIDMsIDksIDExXG5dO1xuXG52YXIgcyA9IFtcbiAgMTEsIDE0LCAxNSwgMTIsIDUsIDgsIDcsIDksIDExLCAxMywgMTQsIDE1LCA2LCA3LCA5LCA4LFxuICA3LCA2LCA4LCAxMywgMTEsIDksIDcsIDE1LCA3LCAxMiwgMTUsIDksIDExLCA3LCAxMywgMTIsXG4gIDExLCAxMywgNiwgNywgMTQsIDksIDEzLCAxNSwgMTQsIDgsIDEzLCA2LCA1LCAxMiwgNywgNSxcbiAgMTEsIDEyLCAxNCwgMTUsIDE0LCAxNSwgOSwgOCwgOSwgMTQsIDUsIDYsIDgsIDYsIDUsIDEyLFxuICA5LCAxNSwgNSwgMTEsIDYsIDgsIDEzLCAxMiwgNSwgMTIsIDEzLCAxNCwgMTEsIDgsIDUsIDZcbl07XG5cbnZhciBzaCA9IFtcbiAgOCwgOSwgOSwgMTEsIDEzLCAxNSwgMTUsIDUsIDcsIDcsIDgsIDExLCAxNCwgMTQsIDEyLCA2LFxuICA5LCAxMywgMTUsIDcsIDEyLCA4LCA5LCAxMSwgNywgNywgMTIsIDcsIDYsIDE1LCAxMywgMTEsXG4gIDksIDcsIDE1LCAxMSwgOCwgNiwgNiwgMTQsIDEyLCAxMywgNSwgMTQsIDEzLCAxMywgNywgNSxcbiAgMTUsIDUsIDgsIDExLCAxNCwgMTQsIDYsIDE0LCA2LCA5LCAxMiwgOSwgMTIsIDUsIDE1LCA4LFxuICA4LCA1LCAxMiwgOSwgMTIsIDUsIDE0LCA2LCA4LCAxMywgNiwgNSwgMTUsIDEzLCAxMSwgMTFcbl07XG4iLCJ2YXIgaGFzaCA9IHJlcXVpcmUoJy4uL2hhc2gnKTtcbnZhciB1dGlscyA9IGhhc2gudXRpbHM7XG52YXIgYXNzZXJ0ID0gdXRpbHMuYXNzZXJ0O1xuXG52YXIgcm90cjMyID0gdXRpbHMucm90cjMyO1xudmFyIHJvdGwzMiA9IHV0aWxzLnJvdGwzMjtcbnZhciBzdW0zMiA9IHV0aWxzLnN1bTMyO1xudmFyIHN1bTMyXzQgPSB1dGlscy5zdW0zMl80O1xudmFyIHN1bTMyXzUgPSB1dGlscy5zdW0zMl81O1xudmFyIHJvdHI2NF9oaSA9IHV0aWxzLnJvdHI2NF9oaTtcbnZhciByb3RyNjRfbG8gPSB1dGlscy5yb3RyNjRfbG87XG52YXIgc2hyNjRfaGkgPSB1dGlscy5zaHI2NF9oaTtcbnZhciBzaHI2NF9sbyA9IHV0aWxzLnNocjY0X2xvO1xudmFyIHN1bTY0ID0gdXRpbHMuc3VtNjQ7XG52YXIgc3VtNjRfaGkgPSB1dGlscy5zdW02NF9oaTtcbnZhciBzdW02NF9sbyA9IHV0aWxzLnN1bTY0X2xvO1xudmFyIHN1bTY0XzRfaGkgPSB1dGlscy5zdW02NF80X2hpO1xudmFyIHN1bTY0XzRfbG8gPSB1dGlscy5zdW02NF80X2xvO1xudmFyIHN1bTY0XzVfaGkgPSB1dGlscy5zdW02NF81X2hpO1xudmFyIHN1bTY0XzVfbG8gPSB1dGlscy5zdW02NF81X2xvO1xudmFyIEJsb2NrSGFzaCA9IGhhc2guY29tbW9uLkJsb2NrSGFzaDtcblxudmFyIHNoYTI1Nl9LID0gW1xuICAweDQyOGEyZjk4LCAweDcxMzc0NDkxLCAweGI1YzBmYmNmLCAweGU5YjVkYmE1LFxuICAweDM5NTZjMjViLCAweDU5ZjExMWYxLCAweDkyM2Y4MmE0LCAweGFiMWM1ZWQ1LFxuICAweGQ4MDdhYTk4LCAweDEyODM1YjAxLCAweDI0MzE4NWJlLCAweDU1MGM3ZGMzLFxuICAweDcyYmU1ZDc0LCAweDgwZGViMWZlLCAweDliZGMwNmE3LCAweGMxOWJmMTc0LFxuICAweGU0OWI2OWMxLCAweGVmYmU0Nzg2LCAweDBmYzE5ZGM2LCAweDI0MGNhMWNjLFxuICAweDJkZTkyYzZmLCAweDRhNzQ4NGFhLCAweDVjYjBhOWRjLCAweDc2Zjk4OGRhLFxuICAweDk4M2U1MTUyLCAweGE4MzFjNjZkLCAweGIwMDMyN2M4LCAweGJmNTk3ZmM3LFxuICAweGM2ZTAwYmYzLCAweGQ1YTc5MTQ3LCAweDA2Y2E2MzUxLCAweDE0MjkyOTY3LFxuICAweDI3YjcwYTg1LCAweDJlMWIyMTM4LCAweDRkMmM2ZGZjLCAweDUzMzgwZDEzLFxuICAweDY1MGE3MzU0LCAweDc2NmEwYWJiLCAweDgxYzJjOTJlLCAweDkyNzIyYzg1LFxuICAweGEyYmZlOGExLCAweGE4MWE2NjRiLCAweGMyNGI4YjcwLCAweGM3NmM1MWEzLFxuICAweGQxOTJlODE5LCAweGQ2OTkwNjI0LCAweGY0MGUzNTg1LCAweDEwNmFhMDcwLFxuICAweDE5YTRjMTE2LCAweDFlMzc2YzA4LCAweDI3NDg3NzRjLCAweDM0YjBiY2I1LFxuICAweDM5MWMwY2IzLCAweDRlZDhhYTRhLCAweDViOWNjYTRmLCAweDY4MmU2ZmYzLFxuICAweDc0OGY4MmVlLCAweDc4YTU2MzZmLCAweDg0Yzg3ODE0LCAweDhjYzcwMjA4LFxuICAweDkwYmVmZmZhLCAweGE0NTA2Y2ViLCAweGJlZjlhM2Y3LCAweGM2NzE3OGYyXG5dO1xuXG52YXIgc2hhNTEyX0sgPSBbXG4gIDB4NDI4YTJmOTgsIDB4ZDcyOGFlMjIsIDB4NzEzNzQ0OTEsIDB4MjNlZjY1Y2QsXG4gIDB4YjVjMGZiY2YsIDB4ZWM0ZDNiMmYsIDB4ZTliNWRiYTUsIDB4ODE4OWRiYmMsXG4gIDB4Mzk1NmMyNWIsIDB4ZjM0OGI1MzgsIDB4NTlmMTExZjEsIDB4YjYwNWQwMTksXG4gIDB4OTIzZjgyYTQsIDB4YWYxOTRmOWIsIDB4YWIxYzVlZDUsIDB4ZGE2ZDgxMTgsXG4gIDB4ZDgwN2FhOTgsIDB4YTMwMzAyNDIsIDB4MTI4MzViMDEsIDB4NDU3MDZmYmUsXG4gIDB4MjQzMTg1YmUsIDB4NGVlNGIyOGMsIDB4NTUwYzdkYzMsIDB4ZDVmZmI0ZTIsXG4gIDB4NzJiZTVkNzQsIDB4ZjI3Yjg5NmYsIDB4ODBkZWIxZmUsIDB4M2IxNjk2YjEsXG4gIDB4OWJkYzA2YTcsIDB4MjVjNzEyMzUsIDB4YzE5YmYxNzQsIDB4Y2Y2OTI2OTQsXG4gIDB4ZTQ5YjY5YzEsIDB4OWVmMTRhZDIsIDB4ZWZiZTQ3ODYsIDB4Mzg0ZjI1ZTMsXG4gIDB4MGZjMTlkYzYsIDB4OGI4Y2Q1YjUsIDB4MjQwY2ExY2MsIDB4NzdhYzljNjUsXG4gIDB4MmRlOTJjNmYsIDB4NTkyYjAyNzUsIDB4NGE3NDg0YWEsIDB4NmVhNmU0ODMsXG4gIDB4NWNiMGE5ZGMsIDB4YmQ0MWZiZDQsIDB4NzZmOTg4ZGEsIDB4ODMxMTUzYjUsXG4gIDB4OTgzZTUxNTIsIDB4ZWU2NmRmYWIsIDB4YTgzMWM2NmQsIDB4MmRiNDMyMTAsXG4gIDB4YjAwMzI3YzgsIDB4OThmYjIxM2YsIDB4YmY1OTdmYzcsIDB4YmVlZjBlZTQsXG4gIDB4YzZlMDBiZjMsIDB4M2RhODhmYzIsIDB4ZDVhNzkxNDcsIDB4OTMwYWE3MjUsXG4gIDB4MDZjYTYzNTEsIDB4ZTAwMzgyNmYsIDB4MTQyOTI5NjcsIDB4MGEwZTZlNzAsXG4gIDB4MjdiNzBhODUsIDB4NDZkMjJmZmMsIDB4MmUxYjIxMzgsIDB4NWMyNmM5MjYsXG4gIDB4NGQyYzZkZmMsIDB4NWFjNDJhZWQsIDB4NTMzODBkMTMsIDB4OWQ5NWIzZGYsXG4gIDB4NjUwYTczNTQsIDB4OGJhZjYzZGUsIDB4NzY2YTBhYmIsIDB4M2M3N2IyYTgsXG4gIDB4ODFjMmM5MmUsIDB4NDdlZGFlZTYsIDB4OTI3MjJjODUsIDB4MTQ4MjM1M2IsXG4gIDB4YTJiZmU4YTEsIDB4NGNmMTAzNjQsIDB4YTgxYTY2NGIsIDB4YmM0MjMwMDEsXG4gIDB4YzI0YjhiNzAsIDB4ZDBmODk3OTEsIDB4Yzc2YzUxYTMsIDB4MDY1NGJlMzAsXG4gIDB4ZDE5MmU4MTksIDB4ZDZlZjUyMTgsIDB4ZDY5OTA2MjQsIDB4NTU2NWE5MTAsXG4gIDB4ZjQwZTM1ODUsIDB4NTc3MTIwMmEsIDB4MTA2YWEwNzAsIDB4MzJiYmQxYjgsXG4gIDB4MTlhNGMxMTYsIDB4YjhkMmQwYzgsIDB4MWUzNzZjMDgsIDB4NTE0MWFiNTMsXG4gIDB4Mjc0ODc3NGMsIDB4ZGY4ZWViOTksIDB4MzRiMGJjYjUsIDB4ZTE5YjQ4YTgsXG4gIDB4MzkxYzBjYjMsIDB4YzVjOTVhNjMsIDB4NGVkOGFhNGEsIDB4ZTM0MThhY2IsXG4gIDB4NWI5Y2NhNGYsIDB4Nzc2M2UzNzMsIDB4NjgyZTZmZjMsIDB4ZDZiMmI4YTMsXG4gIDB4NzQ4ZjgyZWUsIDB4NWRlZmIyZmMsIDB4NzhhNTYzNmYsIDB4NDMxNzJmNjAsXG4gIDB4ODRjODc4MTQsIDB4YTFmMGFiNzIsIDB4OGNjNzAyMDgsIDB4MWE2NDM5ZWMsXG4gIDB4OTBiZWZmZmEsIDB4MjM2MzFlMjgsIDB4YTQ1MDZjZWIsIDB4ZGU4MmJkZTksXG4gIDB4YmVmOWEzZjcsIDB4YjJjNjc5MTUsIDB4YzY3MTc4ZjIsIDB4ZTM3MjUzMmIsXG4gIDB4Y2EyNzNlY2UsIDB4ZWEyNjYxOWMsIDB4ZDE4NmI4YzcsIDB4MjFjMGMyMDcsXG4gIDB4ZWFkYTdkZDYsIDB4Y2RlMGViMWUsIDB4ZjU3ZDRmN2YsIDB4ZWU2ZWQxNzgsXG4gIDB4MDZmMDY3YWEsIDB4NzIxNzZmYmEsIDB4MGE2MzdkYzUsIDB4YTJjODk4YTYsXG4gIDB4MTEzZjk4MDQsIDB4YmVmOTBkYWUsIDB4MWI3MTBiMzUsIDB4MTMxYzQ3MWIsXG4gIDB4MjhkYjc3ZjUsIDB4MjMwNDdkODQsIDB4MzJjYWFiN2IsIDB4NDBjNzI0OTMsXG4gIDB4M2M5ZWJlMGEsIDB4MTVjOWJlYmMsIDB4NDMxZDY3YzQsIDB4OWMxMDBkNGMsXG4gIDB4NGNjNWQ0YmUsIDB4Y2IzZTQyYjYsIDB4NTk3ZjI5OWMsIDB4ZmM2NTdlMmEsXG4gIDB4NWZjYjZmYWIsIDB4M2FkNmZhZWMsIDB4NmM0NDE5OGMsIDB4NGE0NzU4MTdcbl07XG5cbnZhciBzaGExX0sgPSBbXG4gIDB4NUE4Mjc5OTksIDB4NkVEOUVCQTEsXG4gIDB4OEYxQkJDREMsIDB4Q0E2MkMxRDZcbl07XG5cbmZ1bmN0aW9uIFNIQTI1NigpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFNIQTI1NikpXG4gICAgcmV0dXJuIG5ldyBTSEEyNTYoKTtcblxuICBCbG9ja0hhc2guY2FsbCh0aGlzKTtcbiAgdGhpcy5oID0gWyAweDZhMDllNjY3LCAweGJiNjdhZTg1LCAweDNjNmVmMzcyLCAweGE1NGZmNTNhLFxuICAgICAgICAgICAgIDB4NTEwZTUyN2YsIDB4OWIwNTY4OGMsIDB4MWY4M2Q5YWIsIDB4NWJlMGNkMTkgXTtcbiAgdGhpcy5rID0gc2hhMjU2X0s7XG4gIHRoaXMuVyA9IG5ldyBBcnJheSg2NCk7XG59XG51dGlscy5pbmhlcml0cyhTSEEyNTYsIEJsb2NrSGFzaCk7XG5leHBvcnRzLnNoYTI1NiA9IFNIQTI1NjtcblxuU0hBMjU2LmJsb2NrU2l6ZSA9IDUxMjtcblNIQTI1Ni5vdXRTaXplID0gMjU2O1xuU0hBMjU2LmhtYWNTdHJlbmd0aCA9IDE5MjtcblNIQTI1Ni5wYWRMZW5ndGggPSA2NDtcblxuU0hBMjU2LnByb3RvdHlwZS5fdXBkYXRlID0gZnVuY3Rpb24gX3VwZGF0ZShtc2csIHN0YXJ0KSB7XG4gIHZhciBXID0gdGhpcy5XO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgMTY7IGkrKylcbiAgICBXW2ldID0gbXNnW3N0YXJ0ICsgaV07XG4gIGZvciAoOyBpIDwgVy5sZW5ndGg7IGkrKylcbiAgICBXW2ldID0gc3VtMzJfNChnMV8yNTYoV1tpIC0gMl0pLCBXW2kgLSA3XSwgZzBfMjU2KFdbaSAtIDE1XSksIFdbaSAtIDE2XSk7XG5cbiAgdmFyIGEgPSB0aGlzLmhbMF07XG4gIHZhciBiID0gdGhpcy5oWzFdO1xuICB2YXIgYyA9IHRoaXMuaFsyXTtcbiAgdmFyIGQgPSB0aGlzLmhbM107XG4gIHZhciBlID0gdGhpcy5oWzRdO1xuICB2YXIgZiA9IHRoaXMuaFs1XTtcbiAgdmFyIGcgPSB0aGlzLmhbNl07XG4gIHZhciBoID0gdGhpcy5oWzddO1xuXG4gIGFzc2VydCh0aGlzLmsubGVuZ3RoID09PSBXLmxlbmd0aCk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgVy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBUMSA9IHN1bTMyXzUoaCwgczFfMjU2KGUpLCBjaDMyKGUsIGYsIGcpLCB0aGlzLmtbaV0sIFdbaV0pO1xuICAgIHZhciBUMiA9IHN1bTMyKHMwXzI1NihhKSwgbWFqMzIoYSwgYiwgYykpO1xuICAgIGggPSBnO1xuICAgIGcgPSBmO1xuICAgIGYgPSBlO1xuICAgIGUgPSBzdW0zMihkLCBUMSk7XG4gICAgZCA9IGM7XG4gICAgYyA9IGI7XG4gICAgYiA9IGE7XG4gICAgYSA9IHN1bTMyKFQxLCBUMik7XG4gIH1cblxuICB0aGlzLmhbMF0gPSBzdW0zMih0aGlzLmhbMF0sIGEpO1xuICB0aGlzLmhbMV0gPSBzdW0zMih0aGlzLmhbMV0sIGIpO1xuICB0aGlzLmhbMl0gPSBzdW0zMih0aGlzLmhbMl0sIGMpO1xuICB0aGlzLmhbM10gPSBzdW0zMih0aGlzLmhbM10sIGQpO1xuICB0aGlzLmhbNF0gPSBzdW0zMih0aGlzLmhbNF0sIGUpO1xuICB0aGlzLmhbNV0gPSBzdW0zMih0aGlzLmhbNV0sIGYpO1xuICB0aGlzLmhbNl0gPSBzdW0zMih0aGlzLmhbNl0sIGcpO1xuICB0aGlzLmhbN10gPSBzdW0zMih0aGlzLmhbN10sIGgpO1xufTtcblxuU0hBMjU2LnByb3RvdHlwZS5fZGlnZXN0ID0gZnVuY3Rpb24gZGlnZXN0KGVuYykge1xuICBpZiAoZW5jID09PSAnaGV4JylcbiAgICByZXR1cm4gdXRpbHMudG9IZXgzMih0aGlzLmgsICdiaWcnKTtcbiAgZWxzZVxuICAgIHJldHVybiB1dGlscy5zcGxpdDMyKHRoaXMuaCwgJ2JpZycpO1xufTtcblxuZnVuY3Rpb24gU0hBMjI0KCkge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgU0hBMjI0KSlcbiAgICByZXR1cm4gbmV3IFNIQTIyNCgpO1xuXG4gIFNIQTI1Ni5jYWxsKHRoaXMpO1xuICB0aGlzLmggPSBbIDB4YzEwNTllZDgsIDB4MzY3Y2Q1MDcsIDB4MzA3MGRkMTcsIDB4ZjcwZTU5MzksXG4gICAgICAgICAgICAgMHhmZmMwMGIzMSwgMHg2ODU4MTUxMSwgMHg2NGY5OGZhNywgMHhiZWZhNGZhNCBdO1xufVxudXRpbHMuaW5oZXJpdHMoU0hBMjI0LCBTSEEyNTYpO1xuZXhwb3J0cy5zaGEyMjQgPSBTSEEyMjQ7XG5cblNIQTIyNC5ibG9ja1NpemUgPSA1MTI7XG5TSEEyMjQub3V0U2l6ZSA9IDIyNDtcblNIQTIyNC5obWFjU3RyZW5ndGggPSAxOTI7XG5TSEEyMjQucGFkTGVuZ3RoID0gNjQ7XG5cblNIQTIyNC5wcm90b3R5cGUuX2RpZ2VzdCA9IGZ1bmN0aW9uIGRpZ2VzdChlbmMpIHtcbiAgLy8gSnVzdCB0cnVuY2F0ZSBvdXRwdXRcbiAgaWYgKGVuYyA9PT0gJ2hleCcpXG4gICAgcmV0dXJuIHV0aWxzLnRvSGV4MzIodGhpcy5oLnNsaWNlKDAsIDcpLCAnYmlnJyk7XG4gIGVsc2VcbiAgICByZXR1cm4gdXRpbHMuc3BsaXQzMih0aGlzLmguc2xpY2UoMCwgNyksICdiaWcnKTtcbn07XG5cbmZ1bmN0aW9uIFNIQTUxMigpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFNIQTUxMikpXG4gICAgcmV0dXJuIG5ldyBTSEE1MTIoKTtcblxuICBCbG9ja0hhc2guY2FsbCh0aGlzKTtcbiAgdGhpcy5oID0gWyAweDZhMDllNjY3LCAweGYzYmNjOTA4LFxuICAgICAgICAgICAgIDB4YmI2N2FlODUsIDB4ODRjYWE3M2IsXG4gICAgICAgICAgICAgMHgzYzZlZjM3MiwgMHhmZTk0ZjgyYixcbiAgICAgICAgICAgICAweGE1NGZmNTNhLCAweDVmMWQzNmYxLFxuICAgICAgICAgICAgIDB4NTEwZTUyN2YsIDB4YWRlNjgyZDEsXG4gICAgICAgICAgICAgMHg5YjA1Njg4YywgMHgyYjNlNmMxZixcbiAgICAgICAgICAgICAweDFmODNkOWFiLCAweGZiNDFiZDZiLFxuICAgICAgICAgICAgIDB4NWJlMGNkMTksIDB4MTM3ZTIxNzkgXTtcbiAgdGhpcy5rID0gc2hhNTEyX0s7XG4gIHRoaXMuVyA9IG5ldyBBcnJheSgxNjApO1xufVxudXRpbHMuaW5oZXJpdHMoU0hBNTEyLCBCbG9ja0hhc2gpO1xuZXhwb3J0cy5zaGE1MTIgPSBTSEE1MTI7XG5cblNIQTUxMi5ibG9ja1NpemUgPSAxMDI0O1xuU0hBNTEyLm91dFNpemUgPSA1MTI7XG5TSEE1MTIuaG1hY1N0cmVuZ3RoID0gMTkyO1xuU0hBNTEyLnBhZExlbmd0aCA9IDEyODtcblxuU0hBNTEyLnByb3RvdHlwZS5fcHJlcGFyZUJsb2NrID0gZnVuY3Rpb24gX3ByZXBhcmVCbG9jayhtc2csIHN0YXJ0KSB7XG4gIHZhciBXID0gdGhpcy5XO1xuXG4gIC8vIDMyIHggMzJiaXQgd29yZHNcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCAzMjsgaSsrKVxuICAgIFdbaV0gPSBtc2dbc3RhcnQgKyBpXTtcbiAgZm9yICg7IGkgPCBXLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgdmFyIGMwX2hpID0gZzFfNTEyX2hpKFdbaSAtIDRdLCBXW2kgLSAzXSk7ICAvLyBpIC0gMlxuICAgIHZhciBjMF9sbyA9IGcxXzUxMl9sbyhXW2kgLSA0XSwgV1tpIC0gM10pO1xuICAgIHZhciBjMV9oaSA9IFdbaSAtIDE0XTsgIC8vIGkgLSA3XG4gICAgdmFyIGMxX2xvID0gV1tpIC0gMTNdO1xuICAgIHZhciBjMl9oaSA9IGcwXzUxMl9oaShXW2kgLSAzMF0sIFdbaSAtIDI5XSk7ICAvLyBpIC0gMTVcbiAgICB2YXIgYzJfbG8gPSBnMF81MTJfbG8oV1tpIC0gMzBdLCBXW2kgLSAyOV0pO1xuICAgIHZhciBjM19oaSA9IFdbaSAtIDMyXTsgIC8vIGkgLSAxNlxuICAgIHZhciBjM19sbyA9IFdbaSAtIDMxXTtcblxuICAgIFdbaV0gPSBzdW02NF80X2hpKGMwX2hpLCBjMF9sbyxcbiAgICAgICAgICAgICAgICAgICAgICBjMV9oaSwgYzFfbG8sXG4gICAgICAgICAgICAgICAgICAgICAgYzJfaGksIGMyX2xvLFxuICAgICAgICAgICAgICAgICAgICAgIGMzX2hpLCBjM19sbyk7XG4gICAgV1tpICsgMV0gPSBzdW02NF80X2xvKGMwX2hpLCBjMF9sbyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYzFfaGksIGMxX2xvLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBjMl9oaSwgYzJfbG8sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGMzX2hpLCBjM19sbyk7XG4gIH1cbn07XG5cblNIQTUxMi5wcm90b3R5cGUuX3VwZGF0ZSA9IGZ1bmN0aW9uIF91cGRhdGUobXNnLCBzdGFydCkge1xuICB0aGlzLl9wcmVwYXJlQmxvY2sobXNnLCBzdGFydCk7XG5cbiAgdmFyIFcgPSB0aGlzLlc7XG5cbiAgdmFyIGFoID0gdGhpcy5oWzBdO1xuICB2YXIgYWwgPSB0aGlzLmhbMV07XG4gIHZhciBiaCA9IHRoaXMuaFsyXTtcbiAgdmFyIGJsID0gdGhpcy5oWzNdO1xuICB2YXIgY2ggPSB0aGlzLmhbNF07XG4gIHZhciBjbCA9IHRoaXMuaFs1XTtcbiAgdmFyIGRoID0gdGhpcy5oWzZdO1xuICB2YXIgZGwgPSB0aGlzLmhbN107XG4gIHZhciBlaCA9IHRoaXMuaFs4XTtcbiAgdmFyIGVsID0gdGhpcy5oWzldO1xuICB2YXIgZmggPSB0aGlzLmhbMTBdO1xuICB2YXIgZmwgPSB0aGlzLmhbMTFdO1xuICB2YXIgZ2ggPSB0aGlzLmhbMTJdO1xuICB2YXIgZ2wgPSB0aGlzLmhbMTNdO1xuICB2YXIgaGggPSB0aGlzLmhbMTRdO1xuICB2YXIgaGwgPSB0aGlzLmhbMTVdO1xuXG4gIGFzc2VydCh0aGlzLmsubGVuZ3RoID09PSBXLmxlbmd0aCk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgVy5sZW5ndGg7IGkgKz0gMikge1xuICAgIHZhciBjMF9oaSA9IGhoO1xuICAgIHZhciBjMF9sbyA9IGhsO1xuICAgIHZhciBjMV9oaSA9IHMxXzUxMl9oaShlaCwgZWwpO1xuICAgIHZhciBjMV9sbyA9IHMxXzUxMl9sbyhlaCwgZWwpO1xuICAgIHZhciBjMl9oaSA9IGNoNjRfaGkoZWgsIGVsLCBmaCwgZmwsIGdoLCBnbCk7XG4gICAgdmFyIGMyX2xvID0gY2g2NF9sbyhlaCwgZWwsIGZoLCBmbCwgZ2gsIGdsKTtcbiAgICB2YXIgYzNfaGkgPSB0aGlzLmtbaV07XG4gICAgdmFyIGMzX2xvID0gdGhpcy5rW2kgKyAxXTtcbiAgICB2YXIgYzRfaGkgPSBXW2ldO1xuICAgIHZhciBjNF9sbyA9IFdbaSArIDFdO1xuXG4gICAgdmFyIFQxX2hpID0gc3VtNjRfNV9oaShjMF9oaSwgYzBfbG8sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBjMV9oaSwgYzFfbG8sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBjMl9oaSwgYzJfbG8sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBjM19oaSwgYzNfbG8sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBjNF9oaSwgYzRfbG8pO1xuICAgIHZhciBUMV9sbyA9IHN1bTY0XzVfbG8oYzBfaGksIGMwX2xvLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgYzFfaGksIGMxX2xvLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgYzJfaGksIGMyX2xvLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgYzNfaGksIGMzX2xvLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgYzRfaGksIGM0X2xvKTtcblxuICAgIHZhciBjMF9oaSA9IHMwXzUxMl9oaShhaCwgYWwpO1xuICAgIHZhciBjMF9sbyA9IHMwXzUxMl9sbyhhaCwgYWwpO1xuICAgIHZhciBjMV9oaSA9IG1hajY0X2hpKGFoLCBhbCwgYmgsIGJsLCBjaCwgY2wpO1xuICAgIHZhciBjMV9sbyA9IG1hajY0X2xvKGFoLCBhbCwgYmgsIGJsLCBjaCwgY2wpO1xuXG4gICAgdmFyIFQyX2hpID0gc3VtNjRfaGkoYzBfaGksIGMwX2xvLCBjMV9oaSwgYzFfbG8pO1xuICAgIHZhciBUMl9sbyA9IHN1bTY0X2xvKGMwX2hpLCBjMF9sbywgYzFfaGksIGMxX2xvKTtcblxuICAgIGhoID0gZ2g7XG4gICAgaGwgPSBnbDtcblxuICAgIGdoID0gZmg7XG4gICAgZ2wgPSBmbDtcblxuICAgIGZoID0gZWg7XG4gICAgZmwgPSBlbDtcblxuICAgIGVoID0gc3VtNjRfaGkoZGgsIGRsLCBUMV9oaSwgVDFfbG8pO1xuICAgIGVsID0gc3VtNjRfbG8oZGwsIGRsLCBUMV9oaSwgVDFfbG8pO1xuXG4gICAgZGggPSBjaDtcbiAgICBkbCA9IGNsO1xuXG4gICAgY2ggPSBiaDtcbiAgICBjbCA9IGJsO1xuXG4gICAgYmggPSBhaDtcbiAgICBibCA9IGFsO1xuXG4gICAgYWggPSBzdW02NF9oaShUMV9oaSwgVDFfbG8sIFQyX2hpLCBUMl9sbyk7XG4gICAgYWwgPSBzdW02NF9sbyhUMV9oaSwgVDFfbG8sIFQyX2hpLCBUMl9sbyk7XG4gIH1cblxuICBzdW02NCh0aGlzLmgsIDAsIGFoLCBhbCk7XG4gIHN1bTY0KHRoaXMuaCwgMiwgYmgsIGJsKTtcbiAgc3VtNjQodGhpcy5oLCA0LCBjaCwgY2wpO1xuICBzdW02NCh0aGlzLmgsIDYsIGRoLCBkbCk7XG4gIHN1bTY0KHRoaXMuaCwgOCwgZWgsIGVsKTtcbiAgc3VtNjQodGhpcy5oLCAxMCwgZmgsIGZsKTtcbiAgc3VtNjQodGhpcy5oLCAxMiwgZ2gsIGdsKTtcbiAgc3VtNjQodGhpcy5oLCAxNCwgaGgsIGhsKTtcbn07XG5cblNIQTUxMi5wcm90b3R5cGUuX2RpZ2VzdCA9IGZ1bmN0aW9uIGRpZ2VzdChlbmMpIHtcbiAgaWYgKGVuYyA9PT0gJ2hleCcpXG4gICAgcmV0dXJuIHV0aWxzLnRvSGV4MzIodGhpcy5oLCAnYmlnJyk7XG4gIGVsc2VcbiAgICByZXR1cm4gdXRpbHMuc3BsaXQzMih0aGlzLmgsICdiaWcnKTtcbn07XG5cbmZ1bmN0aW9uIFNIQTM4NCgpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFNIQTM4NCkpXG4gICAgcmV0dXJuIG5ldyBTSEEzODQoKTtcblxuICBTSEE1MTIuY2FsbCh0aGlzKTtcbiAgdGhpcy5oID0gWyAweGNiYmI5ZDVkLCAweGMxMDU5ZWQ4LFxuICAgICAgICAgICAgIDB4NjI5YTI5MmEsIDB4MzY3Y2Q1MDcsXG4gICAgICAgICAgICAgMHg5MTU5MDE1YSwgMHgzMDcwZGQxNyxcbiAgICAgICAgICAgICAweDE1MmZlY2Q4LCAweGY3MGU1OTM5LFxuICAgICAgICAgICAgIDB4NjczMzI2NjcsIDB4ZmZjMDBiMzEsXG4gICAgICAgICAgICAgMHg4ZWI0NGE4NywgMHg2ODU4MTUxMSxcbiAgICAgICAgICAgICAweGRiMGMyZTBkLCAweDY0Zjk4ZmE3LFxuICAgICAgICAgICAgIDB4NDdiNTQ4MWQsIDB4YmVmYTRmYTQgXTtcbn1cbnV0aWxzLmluaGVyaXRzKFNIQTM4NCwgU0hBNTEyKTtcbmV4cG9ydHMuc2hhMzg0ID0gU0hBMzg0O1xuXG5TSEEzODQuYmxvY2tTaXplID0gMTAyNDtcblNIQTM4NC5vdXRTaXplID0gMzg0O1xuU0hBMzg0LmhtYWNTdHJlbmd0aCA9IDE5MjtcblNIQTM4NC5wYWRMZW5ndGggPSAxMjg7XG5cblNIQTM4NC5wcm90b3R5cGUuX2RpZ2VzdCA9IGZ1bmN0aW9uIGRpZ2VzdChlbmMpIHtcbiAgaWYgKGVuYyA9PT0gJ2hleCcpXG4gICAgcmV0dXJuIHV0aWxzLnRvSGV4MzIodGhpcy5oLnNsaWNlKDAsIDEyKSwgJ2JpZycpO1xuICBlbHNlXG4gICAgcmV0dXJuIHV0aWxzLnNwbGl0MzIodGhpcy5oLnNsaWNlKDAsIDEyKSwgJ2JpZycpO1xufTtcblxuZnVuY3Rpb24gU0hBMSgpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFNIQTEpKVxuICAgIHJldHVybiBuZXcgU0hBMSgpO1xuXG4gIEJsb2NrSGFzaC5jYWxsKHRoaXMpO1xuICB0aGlzLmggPSBbIDB4Njc0NTIzMDEsIDB4ZWZjZGFiODksIDB4OThiYWRjZmUsXG4gICAgICAgICAgICAgMHgxMDMyNTQ3NiwgMHhjM2QyZTFmMCBdO1xuICB0aGlzLlcgPSBuZXcgQXJyYXkoODApO1xufVxuXG51dGlscy5pbmhlcml0cyhTSEExLCBCbG9ja0hhc2gpO1xuZXhwb3J0cy5zaGExID0gU0hBMTtcblxuU0hBMS5ibG9ja1NpemUgPSA1MTI7XG5TSEExLm91dFNpemUgPSAxNjA7XG5TSEExLmhtYWNTdHJlbmd0aCA9IDgwO1xuU0hBMS5wYWRMZW5ndGggPSA2NDtcblxuU0hBMS5wcm90b3R5cGUuX3VwZGF0ZSA9IGZ1bmN0aW9uIF91cGRhdGUobXNnLCBzdGFydCkge1xuICB2YXIgVyA9IHRoaXMuVztcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IDE2OyBpKyspXG4gICAgV1tpXSA9IG1zZ1tzdGFydCArIGldO1xuXG4gIGZvcig7IGkgPCBXLmxlbmd0aDsgaSsrKVxuICAgIFdbaV0gPSByb3RsMzIoV1tpIC0gM10gXiBXW2kgLSA4XSBeIFdbaSAtIDE0XSBeIFdbaSAtIDE2XSwgMSk7XG5cbiAgdmFyIGEgPSB0aGlzLmhbMF07XG4gIHZhciBiID0gdGhpcy5oWzFdO1xuICB2YXIgYyA9IHRoaXMuaFsyXTtcbiAgdmFyIGQgPSB0aGlzLmhbM107XG4gIHZhciBlID0gdGhpcy5oWzRdO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgVy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBzID0gfn4oaSAvIDIwKTtcbiAgICB2YXIgdCA9IHN1bTMyXzUocm90bDMyKGEsIDUpLCBmdF8xKHMsIGIsIGMsIGQpLCBlLCBXW2ldLCBzaGExX0tbc10pO1xuICAgIGUgPSBkO1xuICAgIGQgPSBjO1xuICAgIGMgPSByb3RsMzIoYiwgMzApO1xuICAgIGIgPSBhO1xuICAgIGEgPSB0O1xuICB9XG5cbiAgdGhpcy5oWzBdID0gc3VtMzIodGhpcy5oWzBdLCBhKTtcbiAgdGhpcy5oWzFdID0gc3VtMzIodGhpcy5oWzFdLCBiKTtcbiAgdGhpcy5oWzJdID0gc3VtMzIodGhpcy5oWzJdLCBjKTtcbiAgdGhpcy5oWzNdID0gc3VtMzIodGhpcy5oWzNdLCBkKTtcbiAgdGhpcy5oWzRdID0gc3VtMzIodGhpcy5oWzRdLCBlKTtcbn07XG5cblNIQTEucHJvdG90eXBlLl9kaWdlc3QgPSBmdW5jdGlvbiBkaWdlc3QoZW5jKSB7XG4gIGlmIChlbmMgPT09ICdoZXgnKVxuICAgIHJldHVybiB1dGlscy50b0hleDMyKHRoaXMuaCwgJ2JpZycpO1xuICBlbHNlXG4gICAgcmV0dXJuIHV0aWxzLnNwbGl0MzIodGhpcy5oLCAnYmlnJyk7XG59O1xuXG5mdW5jdGlvbiBjaDMyKHgsIHksIHopIHtcbiAgcmV0dXJuICh4ICYgeSkgXiAoKH54KSAmIHopO1xufVxuXG5mdW5jdGlvbiBtYWozMih4LCB5LCB6KSB7XG4gIHJldHVybiAoeCAmIHkpIF4gKHggJiB6KSBeICh5ICYgeik7XG59XG5cbmZ1bmN0aW9uIHAzMih4LCB5LCB6KSB7XG4gIHJldHVybiB4IF4geSBeIHo7XG59XG5cbmZ1bmN0aW9uIHMwXzI1Nih4KSB7XG4gIHJldHVybiByb3RyMzIoeCwgMikgXiByb3RyMzIoeCwgMTMpIF4gcm90cjMyKHgsIDIyKTtcbn1cblxuZnVuY3Rpb24gczFfMjU2KHgpIHtcbiAgcmV0dXJuIHJvdHIzMih4LCA2KSBeIHJvdHIzMih4LCAxMSkgXiByb3RyMzIoeCwgMjUpO1xufVxuXG5mdW5jdGlvbiBnMF8yNTYoeCkge1xuICByZXR1cm4gcm90cjMyKHgsIDcpIF4gcm90cjMyKHgsIDE4KSBeICh4ID4+PiAzKTtcbn1cblxuZnVuY3Rpb24gZzFfMjU2KHgpIHtcbiAgcmV0dXJuIHJvdHIzMih4LCAxNykgXiByb3RyMzIoeCwgMTkpIF4gKHggPj4+IDEwKTtcbn1cblxuZnVuY3Rpb24gZnRfMShzLCB4LCB5LCB6KSB7XG4gIGlmIChzID09PSAwKVxuICAgIHJldHVybiBjaDMyKHgsIHksIHopO1xuICBpZiAocyA9PT0gMSB8fCBzID09PSAzKVxuICAgIHJldHVybiBwMzIoeCwgeSwgeik7XG4gIGlmIChzID09PSAyKVxuICAgIHJldHVybiBtYWozMih4LCB5LCB6KTtcbn1cblxuZnVuY3Rpb24gY2g2NF9oaSh4aCwgeGwsIHloLCB5bCwgemgsIHpsKSB7XG4gIHZhciByID0gKHhoICYgeWgpIF4gKCh+eGgpICYgemgpO1xuICBpZiAociA8IDApXG4gICAgciArPSAweDEwMDAwMDAwMDtcbiAgcmV0dXJuIHI7XG59XG5cbmZ1bmN0aW9uIGNoNjRfbG8oeGgsIHhsLCB5aCwgeWwsIHpoLCB6bCkge1xuICB2YXIgciA9ICh4bCAmIHlsKSBeICgofnhsKSAmIHpsKTtcbiAgaWYgKHIgPCAwKVxuICAgIHIgKz0gMHgxMDAwMDAwMDA7XG4gIHJldHVybiByO1xufVxuXG5mdW5jdGlvbiBtYWo2NF9oaSh4aCwgeGwsIHloLCB5bCwgemgsIHpsKSB7XG4gIHZhciByID0gKHhoICYgeWgpIF4gKHhoICYgemgpIF4gKHloICYgemgpO1xuICBpZiAociA8IDApXG4gICAgciArPSAweDEwMDAwMDAwMDtcbiAgcmV0dXJuIHI7XG59XG5cbmZ1bmN0aW9uIG1hajY0X2xvKHhoLCB4bCwgeWgsIHlsLCB6aCwgemwpIHtcbiAgdmFyIHIgPSAoeGwgJiB5bCkgXiAoeGwgJiB6bCkgXiAoeWwgJiB6bCk7XG4gIGlmIChyIDwgMClcbiAgICByICs9IDB4MTAwMDAwMDAwO1xuICByZXR1cm4gcjtcbn1cblxuZnVuY3Rpb24gczBfNTEyX2hpKHhoLCB4bCkge1xuICB2YXIgYzBfaGkgPSByb3RyNjRfaGkoeGgsIHhsLCAyOCk7XG4gIHZhciBjMV9oaSA9IHJvdHI2NF9oaSh4bCwgeGgsIDIpOyAgLy8gMzRcbiAgdmFyIGMyX2hpID0gcm90cjY0X2hpKHhsLCB4aCwgNyk7ICAvLyAzOVxuXG4gIHZhciByID0gYzBfaGkgXiBjMV9oaSBeIGMyX2hpO1xuICBpZiAociA8IDApXG4gICAgciArPSAweDEwMDAwMDAwMDtcbiAgcmV0dXJuIHI7XG59XG5cbmZ1bmN0aW9uIHMwXzUxMl9sbyh4aCwgeGwpIHtcbiAgdmFyIGMwX2xvID0gcm90cjY0X2xvKHhoLCB4bCwgMjgpO1xuICB2YXIgYzFfbG8gPSByb3RyNjRfbG8oeGwsIHhoLCAyKTsgIC8vIDM0XG4gIHZhciBjMl9sbyA9IHJvdHI2NF9sbyh4bCwgeGgsIDcpOyAgLy8gMzlcblxuICB2YXIgciA9IGMwX2xvIF4gYzFfbG8gXiBjMl9sbztcbiAgaWYgKHIgPCAwKVxuICAgIHIgKz0gMHgxMDAwMDAwMDA7XG4gIHJldHVybiByO1xufVxuXG5mdW5jdGlvbiBzMV81MTJfaGkoeGgsIHhsKSB7XG4gIHZhciBjMF9oaSA9IHJvdHI2NF9oaSh4aCwgeGwsIDE0KTtcbiAgdmFyIGMxX2hpID0gcm90cjY0X2hpKHhoLCB4bCwgMTgpO1xuICB2YXIgYzJfaGkgPSByb3RyNjRfaGkoeGwsIHhoLCA5KTsgIC8vIDQxXG5cbiAgdmFyIHIgPSBjMF9oaSBeIGMxX2hpIF4gYzJfaGk7XG4gIGlmIChyIDwgMClcbiAgICByICs9IDB4MTAwMDAwMDAwO1xuICByZXR1cm4gcjtcbn1cblxuZnVuY3Rpb24gczFfNTEyX2xvKHhoLCB4bCkge1xuICB2YXIgYzBfbG8gPSByb3RyNjRfbG8oeGgsIHhsLCAxNCk7XG4gIHZhciBjMV9sbyA9IHJvdHI2NF9sbyh4aCwgeGwsIDE4KTtcbiAgdmFyIGMyX2xvID0gcm90cjY0X2xvKHhsLCB4aCwgOSk7ICAvLyA0MVxuXG4gIHZhciByID0gYzBfbG8gXiBjMV9sbyBeIGMyX2xvO1xuICBpZiAociA8IDApXG4gICAgciArPSAweDEwMDAwMDAwMDtcbiAgcmV0dXJuIHI7XG59XG5cbmZ1bmN0aW9uIGcwXzUxMl9oaSh4aCwgeGwpIHtcbiAgdmFyIGMwX2hpID0gcm90cjY0X2hpKHhoLCB4bCwgMSk7XG4gIHZhciBjMV9oaSA9IHJvdHI2NF9oaSh4aCwgeGwsIDgpO1xuICB2YXIgYzJfaGkgPSBzaHI2NF9oaSh4aCwgeGwsIDcpO1xuXG4gIHZhciByID0gYzBfaGkgXiBjMV9oaSBeIGMyX2hpO1xuICBpZiAociA8IDApXG4gICAgciArPSAweDEwMDAwMDAwMDtcbiAgcmV0dXJuIHI7XG59XG5cbmZ1bmN0aW9uIGcwXzUxMl9sbyh4aCwgeGwpIHtcbiAgdmFyIGMwX2xvID0gcm90cjY0X2xvKHhoLCB4bCwgMSk7XG4gIHZhciBjMV9sbyA9IHJvdHI2NF9sbyh4aCwgeGwsIDgpO1xuICB2YXIgYzJfbG8gPSBzaHI2NF9sbyh4aCwgeGwsIDcpO1xuXG4gIHZhciByID0gYzBfbG8gXiBjMV9sbyBeIGMyX2xvO1xuICBpZiAociA8IDApXG4gICAgciArPSAweDEwMDAwMDAwMDtcbiAgcmV0dXJuIHI7XG59XG5cbmZ1bmN0aW9uIGcxXzUxMl9oaSh4aCwgeGwpIHtcbiAgdmFyIGMwX2hpID0gcm90cjY0X2hpKHhoLCB4bCwgMTkpO1xuICB2YXIgYzFfaGkgPSByb3RyNjRfaGkoeGwsIHhoLCAyOSk7ICAvLyA2MVxuICB2YXIgYzJfaGkgPSBzaHI2NF9oaSh4aCwgeGwsIDYpO1xuXG4gIHZhciByID0gYzBfaGkgXiBjMV9oaSBeIGMyX2hpO1xuICBpZiAociA8IDApXG4gICAgciArPSAweDEwMDAwMDAwMDtcbiAgcmV0dXJuIHI7XG59XG5cbmZ1bmN0aW9uIGcxXzUxMl9sbyh4aCwgeGwpIHtcbiAgdmFyIGMwX2xvID0gcm90cjY0X2xvKHhoLCB4bCwgMTkpO1xuICB2YXIgYzFfbG8gPSByb3RyNjRfbG8oeGwsIHhoLCAyOSk7ICAvLyA2MVxuICB2YXIgYzJfbG8gPSBzaHI2NF9sbyh4aCwgeGwsIDYpO1xuXG4gIHZhciByID0gYzBfbG8gXiBjMV9sbyBeIGMyX2xvO1xuICBpZiAociA8IDApXG4gICAgciArPSAweDEwMDAwMDAwMDtcbiAgcmV0dXJuIHI7XG59XG4iLCJ2YXIgdXRpbHMgPSBleHBvcnRzO1xudmFyIGluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcblxuZnVuY3Rpb24gdG9BcnJheShtc2csIGVuYykge1xuICBpZiAoQXJyYXkuaXNBcnJheShtc2cpKVxuICAgIHJldHVybiBtc2cuc2xpY2UoKTtcbiAgaWYgKCFtc2cpXG4gICAgcmV0dXJuIFtdO1xuICB2YXIgcmVzID0gW107XG4gIGlmICh0eXBlb2YgbXNnID09PSAnc3RyaW5nJykge1xuICAgIGlmICghZW5jKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1zZy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgYyA9IG1zZy5jaGFyQ29kZUF0KGkpO1xuICAgICAgICB2YXIgaGkgPSBjID4+IDg7XG4gICAgICAgIHZhciBsbyA9IGMgJiAweGZmO1xuICAgICAgICBpZiAoaGkpXG4gICAgICAgICAgcmVzLnB1c2goaGksIGxvKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgIHJlcy5wdXNoKGxvKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGVuYyA9PT0gJ2hleCcpIHtcbiAgICAgIG1zZyA9IG1zZy5yZXBsYWNlKC9bXmEtejAtOV0rL2lnLCAnJyk7XG4gICAgICBpZiAobXNnLmxlbmd0aCAlIDIgIT09IDApXG4gICAgICAgIG1zZyA9ICcwJyArIG1zZztcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbXNnLmxlbmd0aDsgaSArPSAyKVxuICAgICAgICByZXMucHVzaChwYXJzZUludChtc2dbaV0gKyBtc2dbaSArIDFdLCAxNikpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1zZy5sZW5ndGg7IGkrKylcbiAgICAgIHJlc1tpXSA9IG1zZ1tpXSB8IDA7XG4gIH1cbiAgcmV0dXJuIHJlcztcbn1cbnV0aWxzLnRvQXJyYXkgPSB0b0FycmF5O1xuXG5mdW5jdGlvbiB0b0hleChtc2cpIHtcbiAgdmFyIHJlcyA9ICcnO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IG1zZy5sZW5ndGg7IGkrKylcbiAgICByZXMgKz0gemVybzIobXNnW2ldLnRvU3RyaW5nKDE2KSk7XG4gIHJldHVybiByZXM7XG59XG51dGlscy50b0hleCA9IHRvSGV4O1xuXG5mdW5jdGlvbiBodG9ubCh3KSB7XG4gIHZhciByZXMgPSAodyA+Pj4gMjQpIHxcbiAgICAgICAgICAgICgodyA+Pj4gOCkgJiAweGZmMDApIHxcbiAgICAgICAgICAgICgodyA8PCA4KSAmIDB4ZmYwMDAwKSB8XG4gICAgICAgICAgICAoKHcgJiAweGZmKSA8PCAyNCk7XG4gIHJldHVybiByZXMgPj4+IDA7XG59XG51dGlscy5odG9ubCA9IGh0b25sO1xuXG5mdW5jdGlvbiB0b0hleDMyKG1zZywgZW5kaWFuKSB7XG4gIHZhciByZXMgPSAnJztcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBtc2cubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgdyA9IG1zZ1tpXTtcbiAgICBpZiAoZW5kaWFuID09PSAnbGl0dGxlJylcbiAgICAgIHcgPSBodG9ubCh3KTtcbiAgICByZXMgKz0gemVybzgody50b1N0cmluZygxNikpO1xuICB9XG4gIHJldHVybiByZXM7XG59XG51dGlscy50b0hleDMyID0gdG9IZXgzMjtcblxuZnVuY3Rpb24gemVybzIod29yZCkge1xuICBpZiAod29yZC5sZW5ndGggPT09IDEpXG4gICAgcmV0dXJuICcwJyArIHdvcmQ7XG4gIGVsc2VcbiAgICByZXR1cm4gd29yZDtcbn1cbnV0aWxzLnplcm8yID0gemVybzI7XG5cbmZ1bmN0aW9uIHplcm84KHdvcmQpIHtcbiAgaWYgKHdvcmQubGVuZ3RoID09PSA3KVxuICAgIHJldHVybiAnMCcgKyB3b3JkO1xuICBlbHNlIGlmICh3b3JkLmxlbmd0aCA9PT0gNilcbiAgICByZXR1cm4gJzAwJyArIHdvcmQ7XG4gIGVsc2UgaWYgKHdvcmQubGVuZ3RoID09PSA1KVxuICAgIHJldHVybiAnMDAwJyArIHdvcmQ7XG4gIGVsc2UgaWYgKHdvcmQubGVuZ3RoID09PSA0KVxuICAgIHJldHVybiAnMDAwMCcgKyB3b3JkO1xuICBlbHNlIGlmICh3b3JkLmxlbmd0aCA9PT0gMylcbiAgICByZXR1cm4gJzAwMDAwJyArIHdvcmQ7XG4gIGVsc2UgaWYgKHdvcmQubGVuZ3RoID09PSAyKVxuICAgIHJldHVybiAnMDAwMDAwJyArIHdvcmQ7XG4gIGVsc2UgaWYgKHdvcmQubGVuZ3RoID09PSAxKVxuICAgIHJldHVybiAnMDAwMDAwMCcgKyB3b3JkO1xuICBlbHNlXG4gICAgcmV0dXJuIHdvcmQ7XG59XG51dGlscy56ZXJvOCA9IHplcm84O1xuXG5mdW5jdGlvbiBqb2luMzIobXNnLCBzdGFydCwgZW5kLCBlbmRpYW4pIHtcbiAgdmFyIGxlbiA9IGVuZCAtIHN0YXJ0O1xuICBhc3NlcnQobGVuICUgNCA9PT0gMCk7XG4gIHZhciByZXMgPSBuZXcgQXJyYXkobGVuIC8gNCk7XG4gIGZvciAodmFyIGkgPSAwLCBrID0gc3RhcnQ7IGkgPCByZXMubGVuZ3RoOyBpKyssIGsgKz0gNCkge1xuICAgIHZhciB3O1xuICAgIGlmIChlbmRpYW4gPT09ICdiaWcnKVxuICAgICAgdyA9IChtc2dba10gPDwgMjQpIHwgKG1zZ1trICsgMV0gPDwgMTYpIHwgKG1zZ1trICsgMl0gPDwgOCkgfCBtc2dbayArIDNdO1xuICAgIGVsc2VcbiAgICAgIHcgPSAobXNnW2sgKyAzXSA8PCAyNCkgfCAobXNnW2sgKyAyXSA8PCAxNikgfCAobXNnW2sgKyAxXSA8PCA4KSB8IG1zZ1trXTtcbiAgICByZXNbaV0gPSB3ID4+PiAwO1xuICB9XG4gIHJldHVybiByZXM7XG59XG51dGlscy5qb2luMzIgPSBqb2luMzI7XG5cbmZ1bmN0aW9uIHNwbGl0MzIobXNnLCBlbmRpYW4pIHtcbiAgdmFyIHJlcyA9IG5ldyBBcnJheShtc2cubGVuZ3RoICogNCk7XG4gIGZvciAodmFyIGkgPSAwLCBrID0gMDsgaSA8IG1zZy5sZW5ndGg7IGkrKywgayArPSA0KSB7XG4gICAgdmFyIG0gPSBtc2dbaV07XG4gICAgaWYgKGVuZGlhbiA9PT0gJ2JpZycpIHtcbiAgICAgIHJlc1trXSA9IG0gPj4+IDI0O1xuICAgICAgcmVzW2sgKyAxXSA9IChtID4+PiAxNikgJiAweGZmO1xuICAgICAgcmVzW2sgKyAyXSA9IChtID4+PiA4KSAmIDB4ZmY7XG4gICAgICByZXNbayArIDNdID0gbSAmIDB4ZmY7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc1trICsgM10gPSBtID4+PiAyNDtcbiAgICAgIHJlc1trICsgMl0gPSAobSA+Pj4gMTYpICYgMHhmZjtcbiAgICAgIHJlc1trICsgMV0gPSAobSA+Pj4gOCkgJiAweGZmO1xuICAgICAgcmVzW2tdID0gbSAmIDB4ZmY7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXM7XG59XG51dGlscy5zcGxpdDMyID0gc3BsaXQzMjtcblxuZnVuY3Rpb24gcm90cjMyKHcsIGIpIHtcbiAgcmV0dXJuICh3ID4+PiBiKSB8ICh3IDw8ICgzMiAtIGIpKTtcbn1cbnV0aWxzLnJvdHIzMiA9IHJvdHIzMjtcblxuZnVuY3Rpb24gcm90bDMyKHcsIGIpIHtcbiAgcmV0dXJuICh3IDw8IGIpIHwgKHcgPj4+ICgzMiAtIGIpKTtcbn1cbnV0aWxzLnJvdGwzMiA9IHJvdGwzMjtcblxuZnVuY3Rpb24gc3VtMzIoYSwgYikge1xuICByZXR1cm4gKGEgKyBiKSA+Pj4gMDtcbn1cbnV0aWxzLnN1bTMyID0gc3VtMzI7XG5cbmZ1bmN0aW9uIHN1bTMyXzMoYSwgYiwgYykge1xuICByZXR1cm4gKGEgKyBiICsgYykgPj4+IDA7XG59XG51dGlscy5zdW0zMl8zID0gc3VtMzJfMztcblxuZnVuY3Rpb24gc3VtMzJfNChhLCBiLCBjLCBkKSB7XG4gIHJldHVybiAoYSArIGIgKyBjICsgZCkgPj4+IDA7XG59XG51dGlscy5zdW0zMl80ID0gc3VtMzJfNDtcblxuZnVuY3Rpb24gc3VtMzJfNShhLCBiLCBjLCBkLCBlKSB7XG4gIHJldHVybiAoYSArIGIgKyBjICsgZCArIGUpID4+PiAwO1xufVxudXRpbHMuc3VtMzJfNSA9IHN1bTMyXzU7XG5cbmZ1bmN0aW9uIGFzc2VydChjb25kLCBtc2cpIHtcbiAgaWYgKCFjb25kKVxuICAgIHRocm93IG5ldyBFcnJvcihtc2cgfHwgJ0Fzc2VydGlvbiBmYWlsZWQnKTtcbn1cbnV0aWxzLmFzc2VydCA9IGFzc2VydDtcblxudXRpbHMuaW5oZXJpdHMgPSBpbmhlcml0cztcblxuZnVuY3Rpb24gc3VtNjQoYnVmLCBwb3MsIGFoLCBhbCkge1xuICB2YXIgYmggPSBidWZbcG9zXTtcbiAgdmFyIGJsID0gYnVmW3BvcyArIDFdO1xuXG4gIHZhciBsbyA9IChhbCArIGJsKSA+Pj4gMDtcbiAgdmFyIGhpID0gKGxvIDwgYWwgPyAxIDogMCkgKyBhaCArIGJoO1xuICBidWZbcG9zXSA9IGhpID4+PiAwO1xuICBidWZbcG9zICsgMV0gPSBsbztcbn1cbmV4cG9ydHMuc3VtNjQgPSBzdW02NDtcblxuZnVuY3Rpb24gc3VtNjRfaGkoYWgsIGFsLCBiaCwgYmwpIHtcbiAgdmFyIGxvID0gKGFsICsgYmwpID4+PiAwO1xuICB2YXIgaGkgPSAobG8gPCBhbCA/IDEgOiAwKSArIGFoICsgYmg7XG4gIHJldHVybiBoaSA+Pj4gMDtcbn07XG5leHBvcnRzLnN1bTY0X2hpID0gc3VtNjRfaGk7XG5cbmZ1bmN0aW9uIHN1bTY0X2xvKGFoLCBhbCwgYmgsIGJsKSB7XG4gIHZhciBsbyA9IGFsICsgYmw7XG4gIHJldHVybiBsbyA+Pj4gMDtcbn07XG5leHBvcnRzLnN1bTY0X2xvID0gc3VtNjRfbG87XG5cbmZ1bmN0aW9uIHN1bTY0XzRfaGkoYWgsIGFsLCBiaCwgYmwsIGNoLCBjbCwgZGgsIGRsKSB7XG4gIHZhciBjYXJyeSA9IDA7XG4gIHZhciBsbyA9IGFsO1xuICBsbyA9IChsbyArIGJsKSA+Pj4gMDtcbiAgY2FycnkgKz0gbG8gPCBhbCA/IDEgOiAwO1xuICBsbyA9IChsbyArIGNsKSA+Pj4gMDtcbiAgY2FycnkgKz0gbG8gPCBjbCA/IDEgOiAwO1xuICBsbyA9IChsbyArIGRsKSA+Pj4gMDtcbiAgY2FycnkgKz0gbG8gPCBkbCA/IDEgOiAwO1xuXG4gIHZhciBoaSA9IGFoICsgYmggKyBjaCArIGRoICsgY2Fycnk7XG4gIHJldHVybiBoaSA+Pj4gMDtcbn07XG5leHBvcnRzLnN1bTY0XzRfaGkgPSBzdW02NF80X2hpO1xuXG5mdW5jdGlvbiBzdW02NF80X2xvKGFoLCBhbCwgYmgsIGJsLCBjaCwgY2wsIGRoLCBkbCkge1xuICB2YXIgbG8gPSBhbCArIGJsICsgY2wgKyBkbDtcbiAgcmV0dXJuIGxvID4+PiAwO1xufTtcbmV4cG9ydHMuc3VtNjRfNF9sbyA9IHN1bTY0XzRfbG87XG5cbmZ1bmN0aW9uIHN1bTY0XzVfaGkoYWgsIGFsLCBiaCwgYmwsIGNoLCBjbCwgZGgsIGRsLCBlaCwgZWwpIHtcbiAgdmFyIGNhcnJ5ID0gMDtcbiAgdmFyIGxvID0gYWw7XG4gIGxvID0gKGxvICsgYmwpID4+PiAwO1xuICBjYXJyeSArPSBsbyA8IGFsID8gMSA6IDA7XG4gIGxvID0gKGxvICsgY2wpID4+PiAwO1xuICBjYXJyeSArPSBsbyA8IGNsID8gMSA6IDA7XG4gIGxvID0gKGxvICsgZGwpID4+PiAwO1xuICBjYXJyeSArPSBsbyA8IGRsID8gMSA6IDA7XG4gIGxvID0gKGxvICsgZWwpID4+PiAwO1xuICBjYXJyeSArPSBsbyA8IGVsID8gMSA6IDA7XG5cbiAgdmFyIGhpID0gYWggKyBiaCArIGNoICsgZGggKyBlaCArIGNhcnJ5O1xuICByZXR1cm4gaGkgPj4+IDA7XG59O1xuZXhwb3J0cy5zdW02NF81X2hpID0gc3VtNjRfNV9oaTtcblxuZnVuY3Rpb24gc3VtNjRfNV9sbyhhaCwgYWwsIGJoLCBibCwgY2gsIGNsLCBkaCwgZGwsIGVoLCBlbCkge1xuICB2YXIgbG8gPSBhbCArIGJsICsgY2wgKyBkbCArIGVsO1xuXG4gIHJldHVybiBsbyA+Pj4gMDtcbn07XG5leHBvcnRzLnN1bTY0XzVfbG8gPSBzdW02NF81X2xvO1xuXG5mdW5jdGlvbiByb3RyNjRfaGkoYWgsIGFsLCBudW0pIHtcbiAgdmFyIHIgPSAoYWwgPDwgKDMyIC0gbnVtKSkgfCAoYWggPj4+IG51bSk7XG4gIHJldHVybiByID4+PiAwO1xufTtcbmV4cG9ydHMucm90cjY0X2hpID0gcm90cjY0X2hpO1xuXG5mdW5jdGlvbiByb3RyNjRfbG8oYWgsIGFsLCBudW0pIHtcbiAgdmFyIHIgPSAoYWggPDwgKDMyIC0gbnVtKSkgfCAoYWwgPj4+IG51bSk7XG4gIHJldHVybiByID4+PiAwO1xufTtcbmV4cG9ydHMucm90cjY0X2xvID0gcm90cjY0X2xvO1xuXG5mdW5jdGlvbiBzaHI2NF9oaShhaCwgYWwsIG51bSkge1xuICByZXR1cm4gYWggPj4+IG51bTtcbn07XG5leHBvcnRzLnNocjY0X2hpID0gc2hyNjRfaGk7XG5cbmZ1bmN0aW9uIHNocjY0X2xvKGFoLCBhbCwgbnVtKSB7XG4gIHZhciByID0gKGFoIDw8ICgzMiAtIG51bSkpIHwgKGFsID4+PiBudW0pO1xuICByZXR1cm4gciA+Pj4gMDtcbn07XG5leHBvcnRzLnNocjY0X2xvID0gc2hyNjRfbG87XG4iLCJleHBvcnRzLnJlYWQgPSBmdW5jdGlvbiAoYnVmZmVyLCBvZmZzZXQsIGlzTEUsIG1MZW4sIG5CeXRlcykge1xuICB2YXIgZSwgbVxuICB2YXIgZUxlbiA9IG5CeXRlcyAqIDggLSBtTGVuIC0gMVxuICB2YXIgZU1heCA9ICgxIDw8IGVMZW4pIC0gMVxuICB2YXIgZUJpYXMgPSBlTWF4ID4+IDFcbiAgdmFyIG5CaXRzID0gLTdcbiAgdmFyIGkgPSBpc0xFID8gKG5CeXRlcyAtIDEpIDogMFxuICB2YXIgZCA9IGlzTEUgPyAtMSA6IDFcbiAgdmFyIHMgPSBidWZmZXJbb2Zmc2V0ICsgaV1cblxuICBpICs9IGRcblxuICBlID0gcyAmICgoMSA8PCAoLW5CaXRzKSkgLSAxKVxuICBzID4+PSAoLW5CaXRzKVxuICBuQml0cyArPSBlTGVuXG4gIGZvciAoOyBuQml0cyA+IDA7IGUgPSBlICogMjU2ICsgYnVmZmVyW29mZnNldCArIGldLCBpICs9IGQsIG5CaXRzIC09IDgpIHt9XG5cbiAgbSA9IGUgJiAoKDEgPDwgKC1uQml0cykpIC0gMSlcbiAgZSA+Pj0gKC1uQml0cylcbiAgbkJpdHMgKz0gbUxlblxuICBmb3IgKDsgbkJpdHMgPiAwOyBtID0gbSAqIDI1NiArIGJ1ZmZlcltvZmZzZXQgKyBpXSwgaSArPSBkLCBuQml0cyAtPSA4KSB7fVxuXG4gIGlmIChlID09PSAwKSB7XG4gICAgZSA9IDEgLSBlQmlhc1xuICB9IGVsc2UgaWYgKGUgPT09IGVNYXgpIHtcbiAgICByZXR1cm4gbSA/IE5hTiA6ICgocyA/IC0xIDogMSkgKiBJbmZpbml0eSlcbiAgfSBlbHNlIHtcbiAgICBtID0gbSArIE1hdGgucG93KDIsIG1MZW4pXG4gICAgZSA9IGUgLSBlQmlhc1xuICB9XG4gIHJldHVybiAocyA/IC0xIDogMSkgKiBtICogTWF0aC5wb3coMiwgZSAtIG1MZW4pXG59XG5cbmV4cG9ydHMud3JpdGUgPSBmdW5jdGlvbiAoYnVmZmVyLCB2YWx1ZSwgb2Zmc2V0LCBpc0xFLCBtTGVuLCBuQnl0ZXMpIHtcbiAgdmFyIGUsIG0sIGNcbiAgdmFyIGVMZW4gPSBuQnl0ZXMgKiA4IC0gbUxlbiAtIDFcbiAgdmFyIGVNYXggPSAoMSA8PCBlTGVuKSAtIDFcbiAgdmFyIGVCaWFzID0gZU1heCA+PiAxXG4gIHZhciBydCA9IChtTGVuID09PSAyMyA/IE1hdGgucG93KDIsIC0yNCkgLSBNYXRoLnBvdygyLCAtNzcpIDogMClcbiAgdmFyIGkgPSBpc0xFID8gMCA6IChuQnl0ZXMgLSAxKVxuICB2YXIgZCA9IGlzTEUgPyAxIDogLTFcbiAgdmFyIHMgPSB2YWx1ZSA8IDAgfHwgKHZhbHVlID09PSAwICYmIDEgLyB2YWx1ZSA8IDApID8gMSA6IDBcblxuICB2YWx1ZSA9IE1hdGguYWJzKHZhbHVlKVxuXG4gIGlmIChpc05hTih2YWx1ZSkgfHwgdmFsdWUgPT09IEluZmluaXR5KSB7XG4gICAgbSA9IGlzTmFOKHZhbHVlKSA/IDEgOiAwXG4gICAgZSA9IGVNYXhcbiAgfSBlbHNlIHtcbiAgICBlID0gTWF0aC5mbG9vcihNYXRoLmxvZyh2YWx1ZSkgLyBNYXRoLkxOMilcbiAgICBpZiAodmFsdWUgKiAoYyA9IE1hdGgucG93KDIsIC1lKSkgPCAxKSB7XG4gICAgICBlLS1cbiAgICAgIGMgKj0gMlxuICAgIH1cbiAgICBpZiAoZSArIGVCaWFzID49IDEpIHtcbiAgICAgIHZhbHVlICs9IHJ0IC8gY1xuICAgIH0gZWxzZSB7XG4gICAgICB2YWx1ZSArPSBydCAqIE1hdGgucG93KDIsIDEgLSBlQmlhcylcbiAgICB9XG4gICAgaWYgKHZhbHVlICogYyA+PSAyKSB7XG4gICAgICBlKytcbiAgICAgIGMgLz0gMlxuICAgIH1cblxuICAgIGlmIChlICsgZUJpYXMgPj0gZU1heCkge1xuICAgICAgbSA9IDBcbiAgICAgIGUgPSBlTWF4XG4gICAgfSBlbHNlIGlmIChlICsgZUJpYXMgPj0gMSkge1xuICAgICAgbSA9ICh2YWx1ZSAqIGMgLSAxKSAqIE1hdGgucG93KDIsIG1MZW4pXG4gICAgICBlID0gZSArIGVCaWFzXG4gICAgfSBlbHNlIHtcbiAgICAgIG0gPSB2YWx1ZSAqIE1hdGgucG93KDIsIGVCaWFzIC0gMSkgKiBNYXRoLnBvdygyLCBtTGVuKVxuICAgICAgZSA9IDBcbiAgICB9XG4gIH1cblxuICBmb3IgKDsgbUxlbiA+PSA4OyBidWZmZXJbb2Zmc2V0ICsgaV0gPSBtICYgMHhmZiwgaSArPSBkLCBtIC89IDI1NiwgbUxlbiAtPSA4KSB7fVxuXG4gIGUgPSAoZSA8PCBtTGVuKSB8IG1cbiAgZUxlbiArPSBtTGVuXG4gIGZvciAoOyBlTGVuID4gMDsgYnVmZmVyW29mZnNldCArIGldID0gZSAmIDB4ZmYsIGkgKz0gZCwgZSAvPSAyNTYsIGVMZW4gLT0gOCkge31cblxuICBidWZmZXJbb2Zmc2V0ICsgaSAtIGRdIHw9IHMgKiAxMjhcbn1cbiIsIlxudmFyIGluZGV4T2YgPSBbXS5pbmRleE9mO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGFyciwgb2JqKXtcbiAgaWYgKGluZGV4T2YpIHJldHVybiBhcnIuaW5kZXhPZihvYmopO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7ICsraSkge1xuICAgIGlmIChhcnJbaV0gPT09IG9iaikgcmV0dXJuIGk7XG4gIH1cbiAgcmV0dXJuIC0xO1xufTsiLCJpZiAodHlwZW9mIE9iamVjdC5jcmVhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgLy8gaW1wbGVtZW50YXRpb24gZnJvbSBzdGFuZGFyZCBub2RlLmpzICd1dGlsJyBtb2R1bGVcbiAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpbmhlcml0cyhjdG9yLCBzdXBlckN0b3IpIHtcbiAgICBjdG9yLnN1cGVyXyA9IHN1cGVyQ3RvclxuICAgIGN0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckN0b3IucHJvdG90eXBlLCB7XG4gICAgICBjb25zdHJ1Y3Rvcjoge1xuICAgICAgICB2YWx1ZTogY3RvcixcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcbn0gZWxzZSB7XG4gIC8vIG9sZCBzY2hvb2wgc2hpbSBmb3Igb2xkIGJyb3dzZXJzXG4gIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaW5oZXJpdHMoY3Rvciwgc3VwZXJDdG9yKSB7XG4gICAgY3Rvci5zdXBlcl8gPSBzdXBlckN0b3JcbiAgICB2YXIgVGVtcEN0b3IgPSBmdW5jdGlvbiAoKSB7fVxuICAgIFRlbXBDdG9yLnByb3RvdHlwZSA9IHN1cGVyQ3Rvci5wcm90b3R5cGVcbiAgICBjdG9yLnByb3RvdHlwZSA9IG5ldyBUZW1wQ3RvcigpXG4gICAgY3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBjdG9yXG4gIH1cbn1cbiIsIi8qKlxuICogRGV0ZXJtaW5lIGlmIGFuIG9iamVjdCBpcyBCdWZmZXJcbiAqXG4gKiBBdXRob3I6ICAgRmVyb3NzIEFib3VraGFkaWplaCA8ZmVyb3NzQGZlcm9zcy5vcmc+IDxodHRwOi8vZmVyb3NzLm9yZz5cbiAqIExpY2Vuc2U6ICBNSVRcbiAqXG4gKiBgbnBtIGluc3RhbGwgaXMtYnVmZmVyYFxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9iaikge1xuICByZXR1cm4gISEob2JqICE9IG51bGwgJiZcbiAgICAob2JqLl9pc0J1ZmZlciB8fCAvLyBGb3IgU2FmYXJpIDUtNyAobWlzc2luZyBPYmplY3QucHJvdG90eXBlLmNvbnN0cnVjdG9yKVxuICAgICAgKG9iai5jb25zdHJ1Y3RvciAmJlxuICAgICAgdHlwZW9mIG9iai5jb25zdHJ1Y3Rvci5pc0J1ZmZlciA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgICAgb2JqLmNvbnN0cnVjdG9yLmlzQnVmZmVyKG9iaikpXG4gICAgKSlcbn1cbiIsIm1vZHVsZS5leHBvcnRzID0gQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbiAoYXJyKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYXJyKSA9PSAnW29iamVjdCBBcnJheV0nO1xufTtcbiIsInZhciBibiA9IHJlcXVpcmUoJ2JuLmpzJyk7XG52YXIgYnJvcmFuZCA9IHJlcXVpcmUoJ2Jyb3JhbmQnKTtcblxuZnVuY3Rpb24gTWlsbGVyUmFiaW4ocmFuZCkge1xuICB0aGlzLnJhbmQgPSByYW5kIHx8IG5ldyBicm9yYW5kLlJhbmQoKTtcbn1cbm1vZHVsZS5leHBvcnRzID0gTWlsbGVyUmFiaW47XG5cbk1pbGxlclJhYmluLmNyZWF0ZSA9IGZ1bmN0aW9uIGNyZWF0ZShyYW5kKSB7XG4gIHJldHVybiBuZXcgTWlsbGVyUmFiaW4ocmFuZCk7XG59O1xuXG5NaWxsZXJSYWJpbi5wcm90b3R5cGUuX3JhbmQgPSBmdW5jdGlvbiBfcmFuZChuKSB7XG4gIHZhciBsZW4gPSBuLmJpdExlbmd0aCgpO1xuICB2YXIgYnVmID0gdGhpcy5yYW5kLmdlbmVyYXRlKE1hdGguY2VpbChsZW4gLyA4KSk7XG5cbiAgLy8gU2V0IGxvdyBiaXRzXG4gIGJ1ZlswXSB8PSAzO1xuXG4gIC8vIE1hc2sgaGlnaCBiaXRzXG4gIHZhciBtYXNrID0gbGVuICYgMHg3O1xuICBpZiAobWFzayAhPT0gMClcbiAgICBidWZbYnVmLmxlbmd0aCAtIDFdID4+PSA3IC0gbWFzaztcblxuICByZXR1cm4gbmV3IGJuKGJ1Zik7XG59XG5cbk1pbGxlclJhYmluLnByb3RvdHlwZS50ZXN0ID0gZnVuY3Rpb24gdGVzdChuLCBrLCBjYikge1xuICB2YXIgbGVuID0gbi5iaXRMZW5ndGgoKTtcbiAgdmFyIHJlZCA9IGJuLm1vbnQobik7XG4gIHZhciByb25lID0gbmV3IGJuKDEpLnRvUmVkKHJlZCk7XG5cbiAgaWYgKCFrKVxuICAgIGsgPSBNYXRoLm1heCgxLCAobGVuIC8gNDgpIHwgMCk7XG5cbiAgLy8gRmluZCBkIGFuZCBzLCAobiAtIDEpID0gKDIgXiBzKSAqIGQ7XG4gIHZhciBuMSA9IG4uc3VibigxKTtcbiAgdmFyIG4yID0gbjEuc3VibigxKTtcbiAgZm9yICh2YXIgcyA9IDA7ICFuMS50ZXN0bihzKTsgcysrKSB7fVxuICB2YXIgZCA9IG4uc2hybihzKTtcblxuICB2YXIgcm4xID0gbjEudG9SZWQocmVkKTtcblxuICB2YXIgcHJpbWUgPSB0cnVlO1xuICBmb3IgKDsgayA+IDA7IGstLSkge1xuICAgIHZhciBhID0gdGhpcy5fcmFuZChuMik7XG4gICAgaWYgKGNiKVxuICAgICAgY2IoYSk7XG5cbiAgICB2YXIgeCA9IGEudG9SZWQocmVkKS5yZWRQb3coZCk7XG4gICAgaWYgKHguY21wKHJvbmUpID09PSAwIHx8IHguY21wKHJuMSkgPT09IDApXG4gICAgICBjb250aW51ZTtcblxuICAgIGZvciAodmFyIGkgPSAxOyBpIDwgczsgaSsrKSB7XG4gICAgICB4ID0geC5yZWRTcXIoKTtcblxuICAgICAgaWYgKHguY21wKHJvbmUpID09PSAwKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICBpZiAoeC5jbXAocm4xKSA9PT0gMClcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgaWYgKGkgPT09IHMpXG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gcHJpbWU7XG59O1xuXG5NaWxsZXJSYWJpbi5wcm90b3R5cGUuZ2V0RGl2aXNvciA9IGZ1bmN0aW9uIGdldERpdmlzb3Iobiwgaykge1xuICB2YXIgbGVuID0gbi5iaXRMZW5ndGgoKTtcbiAgdmFyIHJlZCA9IGJuLm1vbnQobik7XG4gIHZhciByb25lID0gbmV3IGJuKDEpLnRvUmVkKHJlZCk7XG5cbiAgaWYgKCFrKVxuICAgIGsgPSBNYXRoLm1heCgxLCAobGVuIC8gNDgpIHwgMCk7XG5cbiAgLy8gRmluZCBkIGFuZCBzLCAobiAtIDEpID0gKDIgXiBzKSAqIGQ7XG4gIHZhciBuMSA9IG4uc3VibigxKTtcbiAgdmFyIG4yID0gbjEuc3VibigxKTtcbiAgZm9yICh2YXIgcyA9IDA7ICFuMS50ZXN0bihzKTsgcysrKSB7fVxuICB2YXIgZCA9IG4uc2hybihzKTtcblxuICB2YXIgcm4xID0gbjEudG9SZWQocmVkKTtcblxuICBmb3IgKDsgayA+IDA7IGstLSkge1xuICAgIHZhciBhID0gdGhpcy5fcmFuZChuMik7XG5cbiAgICB2YXIgZyA9IG4uZ2NkKGEpO1xuICAgIGlmIChnLmNtcG4oMSkgIT09IDApXG4gICAgICByZXR1cm4gZztcblxuICAgIHZhciB4ID0gYS50b1JlZChyZWQpLnJlZFBvdyhkKTtcbiAgICBpZiAoeC5jbXAocm9uZSkgPT09IDAgfHwgeC5jbXAocm4xKSA9PT0gMClcbiAgICAgIGNvbnRpbnVlO1xuXG4gICAgZm9yICh2YXIgaSA9IDE7IGkgPCBzOyBpKyspIHtcbiAgICAgIHggPSB4LnJlZFNxcigpO1xuXG4gICAgICBpZiAoeC5jbXAocm9uZSkgPT09IDApXG4gICAgICAgIHJldHVybiB4LmZyb21SZWQoKS5zdWJuKDEpLmdjZChuKTtcbiAgICAgIGlmICh4LmNtcChybjEpID09PSAwKVxuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICBpZiAoaSA9PT0gcykge1xuICAgICAgeCA9IHgucmVkU3FyKCk7XG4gICAgICByZXR1cm4geC5mcm9tUmVkKCkuc3VibigxKS5nY2Qobik7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gYXNzZXJ0O1xuXG5mdW5jdGlvbiBhc3NlcnQodmFsLCBtc2cpIHtcbiAgaWYgKCF2YWwpXG4gICAgdGhyb3cgbmV3IEVycm9yKG1zZyB8fCAnQXNzZXJ0aW9uIGZhaWxlZCcpO1xufVxuXG5hc3NlcnQuZXF1YWwgPSBmdW5jdGlvbiBhc3NlcnRFcXVhbChsLCByLCBtc2cpIHtcbiAgaWYgKGwgIT0gcilcbiAgICB0aHJvdyBuZXcgRXJyb3IobXNnIHx8ICgnQXNzZXJ0aW9uIGZhaWxlZDogJyArIGwgKyAnICE9ICcgKyByKSk7XG59O1xuIiwibW9kdWxlLmV4cG9ydHM9e1wiMi4xNi44NDAuMS4xMDEuMy40LjEuMVwiOiBcImFlcy0xMjgtZWNiXCIsXG5cIjIuMTYuODQwLjEuMTAxLjMuNC4xLjJcIjogXCJhZXMtMTI4LWNiY1wiLFxuXCIyLjE2Ljg0MC4xLjEwMS4zLjQuMS4zXCI6IFwiYWVzLTEyOC1vZmJcIixcblwiMi4xNi44NDAuMS4xMDEuMy40LjEuNFwiOiBcImFlcy0xMjgtY2ZiXCIsXG5cIjIuMTYuODQwLjEuMTAxLjMuNC4xLjIxXCI6IFwiYWVzLTE5Mi1lY2JcIixcblwiMi4xNi44NDAuMS4xMDEuMy40LjEuMjJcIjogXCJhZXMtMTkyLWNiY1wiLFxuXCIyLjE2Ljg0MC4xLjEwMS4zLjQuMS4yM1wiOiBcImFlcy0xOTItb2ZiXCIsXG5cIjIuMTYuODQwLjEuMTAxLjMuNC4xLjI0XCI6IFwiYWVzLTE5Mi1jZmJcIixcblwiMi4xNi44NDAuMS4xMDEuMy40LjEuNDFcIjogXCJhZXMtMjU2LWVjYlwiLFxuXCIyLjE2Ljg0MC4xLjEwMS4zLjQuMS40MlwiOiBcImFlcy0yNTYtY2JjXCIsXG5cIjIuMTYuODQwLjEuMTAxLjMuNC4xLjQzXCI6IFwiYWVzLTI1Ni1vZmJcIixcblwiMi4xNi44NDAuMS4xMDEuMy40LjEuNDRcIjogXCJhZXMtMjU2LWNmYlwiXG59IiwiLy8gZnJvbSBodHRwczovL2dpdGh1Yi5jb20vaW5kdXRueS9zZWxmLXNpZ25lZC9ibG9iL2doLXBhZ2VzL2xpYi9hc24xLmpzXG4vLyBGZWRvciwgeW91IGFyZSBhbWF6aW5nLlxuXG52YXIgYXNuMSA9IHJlcXVpcmUoJ2FzbjEuanMnKVxuXG52YXIgUlNBUHJpdmF0ZUtleSA9IGFzbjEuZGVmaW5lKCdSU0FQcml2YXRlS2V5JywgZnVuY3Rpb24gKCkge1xuICB0aGlzLnNlcSgpLm9iaihcbiAgICB0aGlzLmtleSgndmVyc2lvbicpLmludCgpLFxuICAgIHRoaXMua2V5KCdtb2R1bHVzJykuaW50KCksXG4gICAgdGhpcy5rZXkoJ3B1YmxpY0V4cG9uZW50JykuaW50KCksXG4gICAgdGhpcy5rZXkoJ3ByaXZhdGVFeHBvbmVudCcpLmludCgpLFxuICAgIHRoaXMua2V5KCdwcmltZTEnKS5pbnQoKSxcbiAgICB0aGlzLmtleSgncHJpbWUyJykuaW50KCksXG4gICAgdGhpcy5rZXkoJ2V4cG9uZW50MScpLmludCgpLFxuICAgIHRoaXMua2V5KCdleHBvbmVudDInKS5pbnQoKSxcbiAgICB0aGlzLmtleSgnY29lZmZpY2llbnQnKS5pbnQoKVxuICApXG59KVxuZXhwb3J0cy5SU0FQcml2YXRlS2V5ID0gUlNBUHJpdmF0ZUtleVxuXG52YXIgUlNBUHVibGljS2V5ID0gYXNuMS5kZWZpbmUoJ1JTQVB1YmxpY0tleScsIGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5zZXEoKS5vYmooXG4gICAgdGhpcy5rZXkoJ21vZHVsdXMnKS5pbnQoKSxcbiAgICB0aGlzLmtleSgncHVibGljRXhwb25lbnQnKS5pbnQoKVxuICApXG59KVxuZXhwb3J0cy5SU0FQdWJsaWNLZXkgPSBSU0FQdWJsaWNLZXlcblxudmFyIFB1YmxpY0tleSA9IGFzbjEuZGVmaW5lKCdTdWJqZWN0UHVibGljS2V5SW5mbycsIGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5zZXEoKS5vYmooXG4gICAgdGhpcy5rZXkoJ2FsZ29yaXRobScpLnVzZShBbGdvcml0aG1JZGVudGlmaWVyKSxcbiAgICB0aGlzLmtleSgnc3ViamVjdFB1YmxpY0tleScpLmJpdHN0cigpXG4gIClcbn0pXG5leHBvcnRzLlB1YmxpY0tleSA9IFB1YmxpY0tleVxuXG52YXIgQWxnb3JpdGhtSWRlbnRpZmllciA9IGFzbjEuZGVmaW5lKCdBbGdvcml0aG1JZGVudGlmaWVyJywgZnVuY3Rpb24gKCkge1xuICB0aGlzLnNlcSgpLm9iaihcbiAgICB0aGlzLmtleSgnYWxnb3JpdGhtJykub2JqaWQoKSxcbiAgICB0aGlzLmtleSgnbm9uZScpLm51bGxfKCkub3B0aW9uYWwoKSxcbiAgICB0aGlzLmtleSgnY3VydmUnKS5vYmppZCgpLm9wdGlvbmFsKCksXG4gICAgdGhpcy5rZXkoJ3BhcmFtcycpLnNlcSgpLm9iaihcbiAgICAgIHRoaXMua2V5KCdwJykuaW50KCksXG4gICAgICB0aGlzLmtleSgncScpLmludCgpLFxuICAgICAgdGhpcy5rZXkoJ2cnKS5pbnQoKVxuICAgICkub3B0aW9uYWwoKVxuICApXG59KVxuXG52YXIgUHJpdmF0ZUtleUluZm8gPSBhc24xLmRlZmluZSgnUHJpdmF0ZUtleUluZm8nLCBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuc2VxKCkub2JqKFxuICAgIHRoaXMua2V5KCd2ZXJzaW9uJykuaW50KCksXG4gICAgdGhpcy5rZXkoJ2FsZ29yaXRobScpLnVzZShBbGdvcml0aG1JZGVudGlmaWVyKSxcbiAgICB0aGlzLmtleSgnc3ViamVjdFByaXZhdGVLZXknKS5vY3RzdHIoKVxuICApXG59KVxuZXhwb3J0cy5Qcml2YXRlS2V5ID0gUHJpdmF0ZUtleUluZm9cbnZhciBFbmNyeXB0ZWRQcml2YXRlS2V5SW5mbyA9IGFzbjEuZGVmaW5lKCdFbmNyeXB0ZWRQcml2YXRlS2V5SW5mbycsIGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5zZXEoKS5vYmooXG4gICAgdGhpcy5rZXkoJ2FsZ29yaXRobScpLnNlcSgpLm9iaihcbiAgICAgIHRoaXMua2V5KCdpZCcpLm9iamlkKCksXG4gICAgICB0aGlzLmtleSgnZGVjcnlwdCcpLnNlcSgpLm9iaihcbiAgICAgICAgdGhpcy5rZXkoJ2tkZScpLnNlcSgpLm9iaihcbiAgICAgICAgICB0aGlzLmtleSgnaWQnKS5vYmppZCgpLFxuICAgICAgICAgIHRoaXMua2V5KCdrZGVwYXJhbXMnKS5zZXEoKS5vYmooXG4gICAgICAgICAgICB0aGlzLmtleSgnc2FsdCcpLm9jdHN0cigpLFxuICAgICAgICAgICAgdGhpcy5rZXkoJ2l0ZXJzJykuaW50KClcbiAgICAgICAgICApXG4gICAgICAgICksXG4gICAgICAgIHRoaXMua2V5KCdjaXBoZXInKS5zZXEoKS5vYmooXG4gICAgICAgICAgdGhpcy5rZXkoJ2FsZ28nKS5vYmppZCgpLFxuICAgICAgICAgIHRoaXMua2V5KCdpdicpLm9jdHN0cigpXG4gICAgICAgIClcbiAgICAgIClcbiAgICApLFxuICAgIHRoaXMua2V5KCdzdWJqZWN0UHJpdmF0ZUtleScpLm9jdHN0cigpXG4gIClcbn0pXG5cbmV4cG9ydHMuRW5jcnlwdGVkUHJpdmF0ZUtleSA9IEVuY3J5cHRlZFByaXZhdGVLZXlJbmZvXG5cbnZhciBEU0FQcml2YXRlS2V5ID0gYXNuMS5kZWZpbmUoJ0RTQVByaXZhdGVLZXknLCBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuc2VxKCkub2JqKFxuICAgIHRoaXMua2V5KCd2ZXJzaW9uJykuaW50KCksXG4gICAgdGhpcy5rZXkoJ3AnKS5pbnQoKSxcbiAgICB0aGlzLmtleSgncScpLmludCgpLFxuICAgIHRoaXMua2V5KCdnJykuaW50KCksXG4gICAgdGhpcy5rZXkoJ3B1Yl9rZXknKS5pbnQoKSxcbiAgICB0aGlzLmtleSgncHJpdl9rZXknKS5pbnQoKVxuICApXG59KVxuZXhwb3J0cy5EU0FQcml2YXRlS2V5ID0gRFNBUHJpdmF0ZUtleVxuXG5leHBvcnRzLkRTQXBhcmFtID0gYXNuMS5kZWZpbmUoJ0RTQXBhcmFtJywgZnVuY3Rpb24gKCkge1xuICB0aGlzLmludCgpXG59KVxudmFyIEVDUHJpdmF0ZUtleSA9IGFzbjEuZGVmaW5lKCdFQ1ByaXZhdGVLZXknLCBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuc2VxKCkub2JqKFxuICAgIHRoaXMua2V5KCd2ZXJzaW9uJykuaW50KCksXG4gICAgdGhpcy5rZXkoJ3ByaXZhdGVLZXknKS5vY3RzdHIoKSxcbiAgICB0aGlzLmtleSgncGFyYW1ldGVycycpLm9wdGlvbmFsKCkuZXhwbGljaXQoMCkudXNlKEVDUGFyYW1ldGVycyksXG4gICAgdGhpcy5rZXkoJ3B1YmxpY0tleScpLm9wdGlvbmFsKCkuZXhwbGljaXQoMSkuYml0c3RyKClcbiAgKVxufSlcbmV4cG9ydHMuRUNQcml2YXRlS2V5ID0gRUNQcml2YXRlS2V5XG52YXIgRUNQYXJhbWV0ZXJzID0gYXNuMS5kZWZpbmUoJ0VDUGFyYW1ldGVycycsIGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5jaG9pY2Uoe1xuICAgIG5hbWVkQ3VydmU6IHRoaXMub2JqaWQoKVxuICB9KVxufSlcblxuZXhwb3J0cy5zaWduYXR1cmUgPSBhc24xLmRlZmluZSgnc2lnbmF0dXJlJywgZnVuY3Rpb24gKCkge1xuICB0aGlzLnNlcSgpLm9iaihcbiAgICB0aGlzLmtleSgncicpLmludCgpLFxuICAgIHRoaXMua2V5KCdzJykuaW50KClcbiAgKVxufSlcbiIsIi8vIGFkYXB0ZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vYXBhdGlsL3BlbXN0cmlwXG52YXIgZmluZFByb2MgPSAvUHJvYy1UeXBlOiA0LEVOQ1JZUFRFRFxccj9cXG5ERUstSW5mbzogQUVTLSgoPzoxMjgpfCg/OjE5Mil8KD86MjU2KSktQ0JDLChbMC05QS1IXSspXFxyP1xcblxccj9cXG4oWzAtOUEtelxcblxcclxcK1xcL1xcPV0rKVxccj9cXG4vbVxudmFyIHN0YXJ0UmVnZXggPSAvXi0tLS0tQkVHSU4gKC4qKSBLRVktLS0tLVxccj9cXG4vbVxudmFyIGZ1bGxSZWdleCA9IC9eLS0tLS1CRUdJTiAoLiopIEtFWS0tLS0tXFxyP1xcbihbMC05QS16XFxuXFxyXFwrXFwvXFw9XSspXFxyP1xcbi0tLS0tRU5EIFxcMSBLRVktLS0tLSQvbVxudmFyIGV2cCA9IHJlcXVpcmUoJ2V2cF9ieXRlc3Rva2V5JylcbnZhciBjaXBoZXJzID0gcmVxdWlyZSgnYnJvd3NlcmlmeS1hZXMnKVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob2tleSwgcGFzc3dvcmQpIHtcbiAgdmFyIGtleSA9IG9rZXkudG9TdHJpbmcoKVxuICB2YXIgbWF0Y2ggPSBrZXkubWF0Y2goZmluZFByb2MpXG4gIHZhciBkZWNyeXB0ZWRcbiAgaWYgKCFtYXRjaCkge1xuICAgIHZhciBtYXRjaDIgPSBrZXkubWF0Y2goZnVsbFJlZ2V4KVxuICAgIGRlY3J5cHRlZCA9IG5ldyBCdWZmZXIobWF0Y2gyWzJdLnJlcGxhY2UoL1xccj9cXG4vZywgJycpLCAnYmFzZTY0JylcbiAgfSBlbHNlIHtcbiAgICB2YXIgc3VpdGUgPSAnYWVzJyArIG1hdGNoWzFdXG4gICAgdmFyIGl2ID0gbmV3IEJ1ZmZlcihtYXRjaFsyXSwgJ2hleCcpXG4gICAgdmFyIGNpcGhlclRleHQgPSBuZXcgQnVmZmVyKG1hdGNoWzNdLnJlcGxhY2UoL1xccj9cXG4vZywgJycpLCAnYmFzZTY0JylcbiAgICB2YXIgY2lwaGVyS2V5ID0gZXZwKHBhc3N3b3JkLCBpdi5zbGljZSgwLCA4KSwgcGFyc2VJbnQobWF0Y2hbMV0sIDEwKSkua2V5XG4gICAgdmFyIG91dCA9IFtdXG4gICAgdmFyIGNpcGhlciA9IGNpcGhlcnMuY3JlYXRlRGVjaXBoZXJpdihzdWl0ZSwgY2lwaGVyS2V5LCBpdilcbiAgICBvdXQucHVzaChjaXBoZXIudXBkYXRlKGNpcGhlclRleHQpKVxuICAgIG91dC5wdXNoKGNpcGhlci5maW5hbCgpKVxuICAgIGRlY3J5cHRlZCA9IEJ1ZmZlci5jb25jYXQob3V0KVxuICB9XG4gIHZhciB0YWcgPSBrZXkubWF0Y2goc3RhcnRSZWdleClbMV0gKyAnIEtFWSdcbiAgcmV0dXJuIHtcbiAgICB0YWc6IHRhZyxcbiAgICBkYXRhOiBkZWNyeXB0ZWRcbiAgfVxufVxuIiwidmFyIGFzbjEgPSByZXF1aXJlKCcuL2FzbjEnKVxudmFyIGFlc2lkID0gcmVxdWlyZSgnLi9hZXNpZC5qc29uJylcbnZhciBmaXhQcm9jID0gcmVxdWlyZSgnLi9maXhQcm9jJylcbnZhciBjaXBoZXJzID0gcmVxdWlyZSgnYnJvd3NlcmlmeS1hZXMnKVxudmFyIGNvbXBhdCA9IHJlcXVpcmUoJ3Bia2RmMicpXG5tb2R1bGUuZXhwb3J0cyA9IHBhcnNlS2V5c1xuXG5mdW5jdGlvbiBwYXJzZUtleXMgKGJ1ZmZlcikge1xuICB2YXIgcGFzc3dvcmRcbiAgaWYgKHR5cGVvZiBidWZmZXIgPT09ICdvYmplY3QnICYmICFCdWZmZXIuaXNCdWZmZXIoYnVmZmVyKSkge1xuICAgIHBhc3N3b3JkID0gYnVmZmVyLnBhc3NwaHJhc2VcbiAgICBidWZmZXIgPSBidWZmZXIua2V5XG4gIH1cbiAgaWYgKHR5cGVvZiBidWZmZXIgPT09ICdzdHJpbmcnKSB7XG4gICAgYnVmZmVyID0gbmV3IEJ1ZmZlcihidWZmZXIpXG4gIH1cblxuICB2YXIgc3RyaXBwZWQgPSBmaXhQcm9jKGJ1ZmZlciwgcGFzc3dvcmQpXG5cbiAgdmFyIHR5cGUgPSBzdHJpcHBlZC50YWdcbiAgdmFyIGRhdGEgPSBzdHJpcHBlZC5kYXRhXG4gIHZhciBzdWJ0eXBlLCBuZGF0YVxuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlICdQVUJMSUMgS0VZJzpcbiAgICAgIG5kYXRhID0gYXNuMS5QdWJsaWNLZXkuZGVjb2RlKGRhdGEsICdkZXInKVxuICAgICAgc3VidHlwZSA9IG5kYXRhLmFsZ29yaXRobS5hbGdvcml0aG0uam9pbignLicpXG4gICAgICBzd2l0Y2ggKHN1YnR5cGUpIHtcbiAgICAgICAgY2FzZSAnMS4yLjg0MC4xMTM1NDkuMS4xLjEnOlxuICAgICAgICAgIHJldHVybiBhc24xLlJTQVB1YmxpY0tleS5kZWNvZGUobmRhdGEuc3ViamVjdFB1YmxpY0tleS5kYXRhLCAnZGVyJylcbiAgICAgICAgY2FzZSAnMS4yLjg0MC4xMDA0NS4yLjEnOlxuICAgICAgICAgIG5kYXRhLnN1YmplY3RQcml2YXRlS2V5ID0gbmRhdGEuc3ViamVjdFB1YmxpY0tleVxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiAnZWMnLFxuICAgICAgICAgICAgZGF0YTogbmRhdGFcbiAgICAgICAgICB9XG4gICAgICAgIGNhc2UgJzEuMi44NDAuMTAwNDAuNC4xJzpcbiAgICAgICAgICBuZGF0YS5hbGdvcml0aG0ucGFyYW1zLnB1Yl9rZXkgPSBhc24xLkRTQXBhcmFtLmRlY29kZShuZGF0YS5zdWJqZWN0UHVibGljS2V5LmRhdGEsICdkZXInKVxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiAnZHNhJyxcbiAgICAgICAgICAgIGRhdGE6IG5kYXRhLmFsZ29yaXRobS5wYXJhbXNcbiAgICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHRocm93IG5ldyBFcnJvcigndW5rbm93biBrZXkgaWQgJyArIHN1YnR5cGUpXG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Vua25vd24ga2V5IHR5cGUgJyArIHR5cGUpXG4gICAgY2FzZSAnRU5DUllQVEVEIFBSSVZBVEUgS0VZJzpcbiAgICAgIGRhdGEgPSBhc24xLkVuY3J5cHRlZFByaXZhdGVLZXkuZGVjb2RlKGRhdGEsICdkZXInKVxuICAgICAgZGF0YSA9IGRlY3J5cHQoZGF0YSwgcGFzc3dvcmQpXG4gICAgICAvLyBmYWxscyB0aHJvdWdoXG4gICAgY2FzZSAnUFJJVkFURSBLRVknOlxuICAgICAgbmRhdGEgPSBhc24xLlByaXZhdGVLZXkuZGVjb2RlKGRhdGEsICdkZXInKVxuICAgICAgc3VidHlwZSA9IG5kYXRhLmFsZ29yaXRobS5hbGdvcml0aG0uam9pbignLicpXG4gICAgICBzd2l0Y2ggKHN1YnR5cGUpIHtcbiAgICAgICAgY2FzZSAnMS4yLjg0MC4xMTM1NDkuMS4xLjEnOlxuICAgICAgICAgIHJldHVybiBhc24xLlJTQVByaXZhdGVLZXkuZGVjb2RlKG5kYXRhLnN1YmplY3RQcml2YXRlS2V5LCAnZGVyJylcbiAgICAgICAgY2FzZSAnMS4yLjg0MC4xMDA0NS4yLjEnOlxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjdXJ2ZTogbmRhdGEuYWxnb3JpdGhtLmN1cnZlLFxuICAgICAgICAgICAgcHJpdmF0ZUtleTogYXNuMS5FQ1ByaXZhdGVLZXkuZGVjb2RlKG5kYXRhLnN1YmplY3RQcml2YXRlS2V5LCAnZGVyJykucHJpdmF0ZUtleVxuICAgICAgICAgIH1cbiAgICAgICAgY2FzZSAnMS4yLjg0MC4xMDA0MC40LjEnOlxuICAgICAgICAgIG5kYXRhLmFsZ29yaXRobS5wYXJhbXMucHJpdl9rZXkgPSBhc24xLkRTQXBhcmFtLmRlY29kZShuZGF0YS5zdWJqZWN0UHJpdmF0ZUtleSwgJ2RlcicpXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6ICdkc2EnLFxuICAgICAgICAgICAgcGFyYW1zOiBuZGF0YS5hbGdvcml0aG0ucGFyYW1zXG4gICAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB0aHJvdyBuZXcgRXJyb3IoJ3Vua25vd24ga2V5IGlkICcgKyBzdWJ0eXBlKVxuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bmtub3duIGtleSB0eXBlICcgKyB0eXBlKVxuICAgIGNhc2UgJ1JTQSBQVUJMSUMgS0VZJzpcbiAgICAgIHJldHVybiBhc24xLlJTQVB1YmxpY0tleS5kZWNvZGUoZGF0YSwgJ2RlcicpXG4gICAgY2FzZSAnUlNBIFBSSVZBVEUgS0VZJzpcbiAgICAgIHJldHVybiBhc24xLlJTQVByaXZhdGVLZXkuZGVjb2RlKGRhdGEsICdkZXInKVxuICAgIGNhc2UgJ0RTQSBQUklWQVRFIEtFWSc6XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiAnZHNhJyxcbiAgICAgICAgcGFyYW1zOiBhc24xLkRTQVByaXZhdGVLZXkuZGVjb2RlKGRhdGEsICdkZXInKVxuICAgICAgfVxuICAgIGNhc2UgJ0VDIFBSSVZBVEUgS0VZJzpcbiAgICAgIGRhdGEgPSBhc24xLkVDUHJpdmF0ZUtleS5kZWNvZGUoZGF0YSwgJ2RlcicpXG4gICAgICByZXR1cm4ge1xuICAgICAgICBjdXJ2ZTogZGF0YS5wYXJhbWV0ZXJzLnZhbHVlLFxuICAgICAgICBwcml2YXRlS2V5OiBkYXRhLnByaXZhdGVLZXlcbiAgICAgIH1cbiAgICBkZWZhdWx0OiB0aHJvdyBuZXcgRXJyb3IoJ3Vua25vd24ga2V5IHR5cGUgJyArIHR5cGUpXG4gIH1cbn1cbnBhcnNlS2V5cy5zaWduYXR1cmUgPSBhc24xLnNpZ25hdHVyZVxuZnVuY3Rpb24gZGVjcnlwdCAoZGF0YSwgcGFzc3dvcmQpIHtcbiAgdmFyIHNhbHQgPSBkYXRhLmFsZ29yaXRobS5kZWNyeXB0LmtkZS5rZGVwYXJhbXMuc2FsdFxuICB2YXIgaXRlcnMgPSBwYXJzZUludChkYXRhLmFsZ29yaXRobS5kZWNyeXB0LmtkZS5rZGVwYXJhbXMuaXRlcnMudG9TdHJpbmcoKSwgMTApXG4gIHZhciBhbGdvID0gYWVzaWRbZGF0YS5hbGdvcml0aG0uZGVjcnlwdC5jaXBoZXIuYWxnby5qb2luKCcuJyldXG4gIHZhciBpdiA9IGRhdGEuYWxnb3JpdGhtLmRlY3J5cHQuY2lwaGVyLml2XG4gIHZhciBjaXBoZXJUZXh0ID0gZGF0YS5zdWJqZWN0UHJpdmF0ZUtleVxuICB2YXIga2V5bGVuID0gcGFyc2VJbnQoYWxnby5zcGxpdCgnLScpWzFdLCAxMCkgLyA4XG4gIHZhciBrZXkgPSBjb21wYXQucGJrZGYyU3luYyhwYXNzd29yZCwgc2FsdCwgaXRlcnMsIGtleWxlbilcbiAgdmFyIGNpcGhlciA9IGNpcGhlcnMuY3JlYXRlRGVjaXBoZXJpdihhbGdvLCBrZXksIGl2KVxuICB2YXIgb3V0ID0gW11cbiAgb3V0LnB1c2goY2lwaGVyLnVwZGF0ZShjaXBoZXJUZXh0KSlcbiAgb3V0LnB1c2goY2lwaGVyLmZpbmFsKCkpXG4gIHJldHVybiBCdWZmZXIuY29uY2F0KG91dClcbn1cbiIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4vLyByZXNvbHZlcyAuIGFuZCAuLiBlbGVtZW50cyBpbiBhIHBhdGggYXJyYXkgd2l0aCBkaXJlY3RvcnkgbmFtZXMgdGhlcmVcbi8vIG11c3QgYmUgbm8gc2xhc2hlcywgZW1wdHkgZWxlbWVudHMsIG9yIGRldmljZSBuYW1lcyAoYzpcXCkgaW4gdGhlIGFycmF5XG4vLyAoc28gYWxzbyBubyBsZWFkaW5nIGFuZCB0cmFpbGluZyBzbGFzaGVzIC0gaXQgZG9lcyBub3QgZGlzdGluZ3Vpc2hcbi8vIHJlbGF0aXZlIGFuZCBhYnNvbHV0ZSBwYXRocylcbmZ1bmN0aW9uIG5vcm1hbGl6ZUFycmF5KHBhcnRzLCBhbGxvd0Fib3ZlUm9vdCkge1xuICAvLyBpZiB0aGUgcGF0aCB0cmllcyB0byBnbyBhYm92ZSB0aGUgcm9vdCwgYHVwYCBlbmRzIHVwID4gMFxuICB2YXIgdXAgPSAwO1xuICBmb3IgKHZhciBpID0gcGFydHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICB2YXIgbGFzdCA9IHBhcnRzW2ldO1xuICAgIGlmIChsYXN0ID09PSAnLicpIHtcbiAgICAgIHBhcnRzLnNwbGljZShpLCAxKTtcbiAgICB9IGVsc2UgaWYgKGxhc3QgPT09ICcuLicpIHtcbiAgICAgIHBhcnRzLnNwbGljZShpLCAxKTtcbiAgICAgIHVwKys7XG4gICAgfSBlbHNlIGlmICh1cCkge1xuICAgICAgcGFydHMuc3BsaWNlKGksIDEpO1xuICAgICAgdXAtLTtcbiAgICB9XG4gIH1cblxuICAvLyBpZiB0aGUgcGF0aCBpcyBhbGxvd2VkIHRvIGdvIGFib3ZlIHRoZSByb290LCByZXN0b3JlIGxlYWRpbmcgLi5zXG4gIGlmIChhbGxvd0Fib3ZlUm9vdCkge1xuICAgIGZvciAoOyB1cC0tOyB1cCkge1xuICAgICAgcGFydHMudW5zaGlmdCgnLi4nKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcGFydHM7XG59XG5cbi8vIFNwbGl0IGEgZmlsZW5hbWUgaW50byBbcm9vdCwgZGlyLCBiYXNlbmFtZSwgZXh0XSwgdW5peCB2ZXJzaW9uXG4vLyAncm9vdCcgaXMganVzdCBhIHNsYXNoLCBvciBub3RoaW5nLlxudmFyIHNwbGl0UGF0aFJlID1cbiAgICAvXihcXC8/fCkoW1xcc1xcU10qPykoKD86XFwuezEsMn18W15cXC9dKz98KShcXC5bXi5cXC9dKnwpKSg/OltcXC9dKikkLztcbnZhciBzcGxpdFBhdGggPSBmdW5jdGlvbihmaWxlbmFtZSkge1xuICByZXR1cm4gc3BsaXRQYXRoUmUuZXhlYyhmaWxlbmFtZSkuc2xpY2UoMSk7XG59O1xuXG4vLyBwYXRoLnJlc29sdmUoW2Zyb20gLi4uXSwgdG8pXG4vLyBwb3NpeCB2ZXJzaW9uXG5leHBvcnRzLnJlc29sdmUgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHJlc29sdmVkUGF0aCA9ICcnLFxuICAgICAgcmVzb2x2ZWRBYnNvbHV0ZSA9IGZhbHNlO1xuXG4gIGZvciAodmFyIGkgPSBhcmd1bWVudHMubGVuZ3RoIC0gMTsgaSA+PSAtMSAmJiAhcmVzb2x2ZWRBYnNvbHV0ZTsgaS0tKSB7XG4gICAgdmFyIHBhdGggPSAoaSA+PSAwKSA/IGFyZ3VtZW50c1tpXSA6IHByb2Nlc3MuY3dkKCk7XG5cbiAgICAvLyBTa2lwIGVtcHR5IGFuZCBpbnZhbGlkIGVudHJpZXNcbiAgICBpZiAodHlwZW9mIHBhdGggIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudHMgdG8gcGF0aC5yZXNvbHZlIG11c3QgYmUgc3RyaW5ncycpO1xuICAgIH0gZWxzZSBpZiAoIXBhdGgpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHJlc29sdmVkUGF0aCA9IHBhdGggKyAnLycgKyByZXNvbHZlZFBhdGg7XG4gICAgcmVzb2x2ZWRBYnNvbHV0ZSA9IHBhdGguY2hhckF0KDApID09PSAnLyc7XG4gIH1cblxuICAvLyBBdCB0aGlzIHBvaW50IHRoZSBwYXRoIHNob3VsZCBiZSByZXNvbHZlZCB0byBhIGZ1bGwgYWJzb2x1dGUgcGF0aCwgYnV0XG4gIC8vIGhhbmRsZSByZWxhdGl2ZSBwYXRocyB0byBiZSBzYWZlIChtaWdodCBoYXBwZW4gd2hlbiBwcm9jZXNzLmN3ZCgpIGZhaWxzKVxuXG4gIC8vIE5vcm1hbGl6ZSB0aGUgcGF0aFxuICByZXNvbHZlZFBhdGggPSBub3JtYWxpemVBcnJheShmaWx0ZXIocmVzb2x2ZWRQYXRoLnNwbGl0KCcvJyksIGZ1bmN0aW9uKHApIHtcbiAgICByZXR1cm4gISFwO1xuICB9KSwgIXJlc29sdmVkQWJzb2x1dGUpLmpvaW4oJy8nKTtcblxuICByZXR1cm4gKChyZXNvbHZlZEFic29sdXRlID8gJy8nIDogJycpICsgcmVzb2x2ZWRQYXRoKSB8fCAnLic7XG59O1xuXG4vLyBwYXRoLm5vcm1hbGl6ZShwYXRoKVxuLy8gcG9zaXggdmVyc2lvblxuZXhwb3J0cy5ub3JtYWxpemUgPSBmdW5jdGlvbihwYXRoKSB7XG4gIHZhciBpc0Fic29sdXRlID0gZXhwb3J0cy5pc0Fic29sdXRlKHBhdGgpLFxuICAgICAgdHJhaWxpbmdTbGFzaCA9IHN1YnN0cihwYXRoLCAtMSkgPT09ICcvJztcblxuICAvLyBOb3JtYWxpemUgdGhlIHBhdGhcbiAgcGF0aCA9IG5vcm1hbGl6ZUFycmF5KGZpbHRlcihwYXRoLnNwbGl0KCcvJyksIGZ1bmN0aW9uKHApIHtcbiAgICByZXR1cm4gISFwO1xuICB9KSwgIWlzQWJzb2x1dGUpLmpvaW4oJy8nKTtcblxuICBpZiAoIXBhdGggJiYgIWlzQWJzb2x1dGUpIHtcbiAgICBwYXRoID0gJy4nO1xuICB9XG4gIGlmIChwYXRoICYmIHRyYWlsaW5nU2xhc2gpIHtcbiAgICBwYXRoICs9ICcvJztcbiAgfVxuXG4gIHJldHVybiAoaXNBYnNvbHV0ZSA/ICcvJyA6ICcnKSArIHBhdGg7XG59O1xuXG4vLyBwb3NpeCB2ZXJzaW9uXG5leHBvcnRzLmlzQWJzb2x1dGUgPSBmdW5jdGlvbihwYXRoKSB7XG4gIHJldHVybiBwYXRoLmNoYXJBdCgwKSA9PT0gJy8nO1xufTtcblxuLy8gcG9zaXggdmVyc2lvblxuZXhwb3J0cy5qb2luID0gZnVuY3Rpb24oKSB7XG4gIHZhciBwYXRocyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMCk7XG4gIHJldHVybiBleHBvcnRzLm5vcm1hbGl6ZShmaWx0ZXIocGF0aHMsIGZ1bmN0aW9uKHAsIGluZGV4KSB7XG4gICAgaWYgKHR5cGVvZiBwICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnRzIHRvIHBhdGguam9pbiBtdXN0IGJlIHN0cmluZ3MnKTtcbiAgICB9XG4gICAgcmV0dXJuIHA7XG4gIH0pLmpvaW4oJy8nKSk7XG59O1xuXG5cbi8vIHBhdGgucmVsYXRpdmUoZnJvbSwgdG8pXG4vLyBwb3NpeCB2ZXJzaW9uXG5leHBvcnRzLnJlbGF0aXZlID0gZnVuY3Rpb24oZnJvbSwgdG8pIHtcbiAgZnJvbSA9IGV4cG9ydHMucmVzb2x2ZShmcm9tKS5zdWJzdHIoMSk7XG4gIHRvID0gZXhwb3J0cy5yZXNvbHZlKHRvKS5zdWJzdHIoMSk7XG5cbiAgZnVuY3Rpb24gdHJpbShhcnIpIHtcbiAgICB2YXIgc3RhcnQgPSAwO1xuICAgIGZvciAoOyBzdGFydCA8IGFyci5sZW5ndGg7IHN0YXJ0KyspIHtcbiAgICAgIGlmIChhcnJbc3RhcnRdICE9PSAnJykgYnJlYWs7XG4gICAgfVxuXG4gICAgdmFyIGVuZCA9IGFyci5sZW5ndGggLSAxO1xuICAgIGZvciAoOyBlbmQgPj0gMDsgZW5kLS0pIHtcbiAgICAgIGlmIChhcnJbZW5kXSAhPT0gJycpIGJyZWFrO1xuICAgIH1cblxuICAgIGlmIChzdGFydCA+IGVuZCkgcmV0dXJuIFtdO1xuICAgIHJldHVybiBhcnIuc2xpY2Uoc3RhcnQsIGVuZCAtIHN0YXJ0ICsgMSk7XG4gIH1cblxuICB2YXIgZnJvbVBhcnRzID0gdHJpbShmcm9tLnNwbGl0KCcvJykpO1xuICB2YXIgdG9QYXJ0cyA9IHRyaW0odG8uc3BsaXQoJy8nKSk7XG5cbiAgdmFyIGxlbmd0aCA9IE1hdGgubWluKGZyb21QYXJ0cy5sZW5ndGgsIHRvUGFydHMubGVuZ3RoKTtcbiAgdmFyIHNhbWVQYXJ0c0xlbmd0aCA9IGxlbmd0aDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgIGlmIChmcm9tUGFydHNbaV0gIT09IHRvUGFydHNbaV0pIHtcbiAgICAgIHNhbWVQYXJ0c0xlbmd0aCA9IGk7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICB2YXIgb3V0cHV0UGFydHMgPSBbXTtcbiAgZm9yICh2YXIgaSA9IHNhbWVQYXJ0c0xlbmd0aDsgaSA8IGZyb21QYXJ0cy5sZW5ndGg7IGkrKykge1xuICAgIG91dHB1dFBhcnRzLnB1c2goJy4uJyk7XG4gIH1cblxuICBvdXRwdXRQYXJ0cyA9IG91dHB1dFBhcnRzLmNvbmNhdCh0b1BhcnRzLnNsaWNlKHNhbWVQYXJ0c0xlbmd0aCkpO1xuXG4gIHJldHVybiBvdXRwdXRQYXJ0cy5qb2luKCcvJyk7XG59O1xuXG5leHBvcnRzLnNlcCA9ICcvJztcbmV4cG9ydHMuZGVsaW1pdGVyID0gJzonO1xuXG5leHBvcnRzLmRpcm5hbWUgPSBmdW5jdGlvbihwYXRoKSB7XG4gIHZhciByZXN1bHQgPSBzcGxpdFBhdGgocGF0aCksXG4gICAgICByb290ID0gcmVzdWx0WzBdLFxuICAgICAgZGlyID0gcmVzdWx0WzFdO1xuXG4gIGlmICghcm9vdCAmJiAhZGlyKSB7XG4gICAgLy8gTm8gZGlybmFtZSB3aGF0c29ldmVyXG4gICAgcmV0dXJuICcuJztcbiAgfVxuXG4gIGlmIChkaXIpIHtcbiAgICAvLyBJdCBoYXMgYSBkaXJuYW1lLCBzdHJpcCB0cmFpbGluZyBzbGFzaFxuICAgIGRpciA9IGRpci5zdWJzdHIoMCwgZGlyLmxlbmd0aCAtIDEpO1xuICB9XG5cbiAgcmV0dXJuIHJvb3QgKyBkaXI7XG59O1xuXG5cbmV4cG9ydHMuYmFzZW5hbWUgPSBmdW5jdGlvbihwYXRoLCBleHQpIHtcbiAgdmFyIGYgPSBzcGxpdFBhdGgocGF0aClbMl07XG4gIC8vIFRPRE86IG1ha2UgdGhpcyBjb21wYXJpc29uIGNhc2UtaW5zZW5zaXRpdmUgb24gd2luZG93cz9cbiAgaWYgKGV4dCAmJiBmLnN1YnN0cigtMSAqIGV4dC5sZW5ndGgpID09PSBleHQpIHtcbiAgICBmID0gZi5zdWJzdHIoMCwgZi5sZW5ndGggLSBleHQubGVuZ3RoKTtcbiAgfVxuICByZXR1cm4gZjtcbn07XG5cblxuZXhwb3J0cy5leHRuYW1lID0gZnVuY3Rpb24ocGF0aCkge1xuICByZXR1cm4gc3BsaXRQYXRoKHBhdGgpWzNdO1xufTtcblxuZnVuY3Rpb24gZmlsdGVyICh4cywgZikge1xuICAgIGlmICh4cy5maWx0ZXIpIHJldHVybiB4cy5maWx0ZXIoZik7XG4gICAgdmFyIHJlcyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgeHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGYoeHNbaV0sIGksIHhzKSkgcmVzLnB1c2goeHNbaV0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xufVxuXG4vLyBTdHJpbmcucHJvdG90eXBlLnN1YnN0ciAtIG5lZ2F0aXZlIGluZGV4IGRvbid0IHdvcmsgaW4gSUU4XG52YXIgc3Vic3RyID0gJ2FiJy5zdWJzdHIoLTEpID09PSAnYidcbiAgICA/IGZ1bmN0aW9uIChzdHIsIHN0YXJ0LCBsZW4pIHsgcmV0dXJuIHN0ci5zdWJzdHIoc3RhcnQsIGxlbikgfVxuICAgIDogZnVuY3Rpb24gKHN0ciwgc3RhcnQsIGxlbikge1xuICAgICAgICBpZiAoc3RhcnQgPCAwKSBzdGFydCA9IHN0ci5sZW5ndGggKyBzdGFydDtcbiAgICAgICAgcmV0dXJuIHN0ci5zdWJzdHIoc3RhcnQsIGxlbik7XG4gICAgfVxuO1xuIiwidmFyIGNyZWF0ZUhtYWMgPSByZXF1aXJlKCdjcmVhdGUtaG1hYycpXG52YXIgTUFYX0FMTE9DID0gTWF0aC5wb3coMiwgMzApIC0gMSAvLyBkZWZhdWx0IGluIGlvanNcblxuZXhwb3J0cy5wYmtkZjIgPSBwYmtkZjJcbmZ1bmN0aW9uIHBia2RmMiAocGFzc3dvcmQsIHNhbHQsIGl0ZXJhdGlvbnMsIGtleWxlbiwgZGlnZXN0LCBjYWxsYmFjaykge1xuICBpZiAodHlwZW9mIGRpZ2VzdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNhbGxiYWNrID0gZGlnZXN0XG4gICAgZGlnZXN0ID0gdW5kZWZpbmVkXG4gIH1cblxuICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdObyBjYWxsYmFjayBwcm92aWRlZCB0byBwYmtkZjInKVxuICB9XG5cbiAgdmFyIHJlc3VsdCA9IHBia2RmMlN5bmMocGFzc3dvcmQsIHNhbHQsIGl0ZXJhdGlvbnMsIGtleWxlbiwgZGlnZXN0KVxuICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICBjYWxsYmFjayh1bmRlZmluZWQsIHJlc3VsdClcbiAgfSlcbn1cblxuZXhwb3J0cy5wYmtkZjJTeW5jID0gcGJrZGYyU3luY1xuZnVuY3Rpb24gcGJrZGYyU3luYyAocGFzc3dvcmQsIHNhbHQsIGl0ZXJhdGlvbnMsIGtleWxlbiwgZGlnZXN0KSB7XG4gIGlmICh0eXBlb2YgaXRlcmF0aW9ucyAhPT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJdGVyYXRpb25zIG5vdCBhIG51bWJlcicpXG4gIH1cblxuICBpZiAoaXRlcmF0aW9ucyA8IDApIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdCYWQgaXRlcmF0aW9ucycpXG4gIH1cblxuICBpZiAodHlwZW9mIGtleWxlbiAhPT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdLZXkgbGVuZ3RoIG5vdCBhIG51bWJlcicpXG4gIH1cblxuICBpZiAoa2V5bGVuIDwgMCB8fCBrZXlsZW4gPiBNQVhfQUxMT0MpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdCYWQga2V5IGxlbmd0aCcpXG4gIH1cblxuICBkaWdlc3QgPSBkaWdlc3QgfHwgJ3NoYTEnXG5cbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIocGFzc3dvcmQpKSBwYXNzd29yZCA9IG5ldyBCdWZmZXIocGFzc3dvcmQsICdiaW5hcnknKVxuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihzYWx0KSkgc2FsdCA9IG5ldyBCdWZmZXIoc2FsdCwgJ2JpbmFyeScpXG5cbiAgdmFyIGhMZW5cbiAgdmFyIGwgPSAxXG4gIHZhciBESyA9IG5ldyBCdWZmZXIoa2V5bGVuKVxuICB2YXIgYmxvY2sxID0gbmV3IEJ1ZmZlcihzYWx0Lmxlbmd0aCArIDQpXG4gIHNhbHQuY29weShibG9jazEsIDAsIDAsIHNhbHQubGVuZ3RoKVxuXG4gIHZhciByXG4gIHZhciBUXG5cbiAgZm9yICh2YXIgaSA9IDE7IGkgPD0gbDsgaSsrKSB7XG4gICAgYmxvY2sxLndyaXRlVUludDMyQkUoaSwgc2FsdC5sZW5ndGgpXG4gICAgdmFyIFUgPSBjcmVhdGVIbWFjKGRpZ2VzdCwgcGFzc3dvcmQpLnVwZGF0ZShibG9jazEpLmRpZ2VzdCgpXG5cbiAgICBpZiAoIWhMZW4pIHtcbiAgICAgIGhMZW4gPSBVLmxlbmd0aFxuICAgICAgVCA9IG5ldyBCdWZmZXIoaExlbilcbiAgICAgIGwgPSBNYXRoLmNlaWwoa2V5bGVuIC8gaExlbilcbiAgICAgIHIgPSBrZXlsZW4gLSAobCAtIDEpICogaExlblxuICAgIH1cblxuICAgIFUuY29weShULCAwLCAwLCBoTGVuKVxuXG4gICAgZm9yICh2YXIgaiA9IDE7IGogPCBpdGVyYXRpb25zOyBqKyspIHtcbiAgICAgIFUgPSBjcmVhdGVIbWFjKGRpZ2VzdCwgcGFzc3dvcmQpLnVwZGF0ZShVKS5kaWdlc3QoKVxuXG4gICAgICBmb3IgKHZhciBrID0gMDsgayA8IGhMZW47IGsrKykge1xuICAgICAgICBUW2tdIF49IFVba11cbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgZGVzdFBvcyA9IChpIC0gMSkgKiBoTGVuXG4gICAgdmFyIGxlbiA9IChpID09PSBsID8gciA6IGhMZW4pXG4gICAgVC5jb3B5KERLLCBkZXN0UG9zLCAwLCBsZW4pXG4gIH1cblxuICByZXR1cm4gREtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuaWYgKCFwcm9jZXNzLnZlcnNpb24gfHxcbiAgICBwcm9jZXNzLnZlcnNpb24uaW5kZXhPZigndjAuJykgPT09IDAgfHxcbiAgICBwcm9jZXNzLnZlcnNpb24uaW5kZXhPZigndjEuJykgPT09IDAgJiYgcHJvY2Vzcy52ZXJzaW9uLmluZGV4T2YoJ3YxLjguJykgIT09IDApIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSBuZXh0VGljaztcbn0gZWxzZSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcHJvY2Vzcy5uZXh0VGljaztcbn1cblxuZnVuY3Rpb24gbmV4dFRpY2soZm4pIHtcbiAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCAtIDEpO1xuICB2YXIgaSA9IDA7XG4gIHdoaWxlIChpIDwgYXJncy5sZW5ndGgpIHtcbiAgICBhcmdzW2krK10gPSBhcmd1bWVudHNbaV07XG4gIH1cbiAgcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiBhZnRlclRpY2soKSB7XG4gICAgZm4uYXBwbHkobnVsbCwgYXJncyk7XG4gIH0pO1xufVxuIiwiLy8gc2hpbSBmb3IgdXNpbmcgcHJvY2VzcyBpbiBicm93c2VyXG5cbnZhciBwcm9jZXNzID0gbW9kdWxlLmV4cG9ydHMgPSB7fTtcbnZhciBxdWV1ZSA9IFtdO1xudmFyIGRyYWluaW5nID0gZmFsc2U7XG52YXIgY3VycmVudFF1ZXVlO1xudmFyIHF1ZXVlSW5kZXggPSAtMTtcblxuZnVuY3Rpb24gY2xlYW5VcE5leHRUaWNrKCkge1xuICAgIGRyYWluaW5nID0gZmFsc2U7XG4gICAgaWYgKGN1cnJlbnRRdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgcXVldWUgPSBjdXJyZW50UXVldWUuY29uY2F0KHF1ZXVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgfVxuICAgIGlmIChxdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgZHJhaW5RdWV1ZSgpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZHJhaW5RdWV1ZSgpIHtcbiAgICBpZiAoZHJhaW5pbmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgdGltZW91dCA9IHNldFRpbWVvdXQoY2xlYW5VcE5leHRUaWNrKTtcbiAgICBkcmFpbmluZyA9IHRydWU7XG5cbiAgICB2YXIgbGVuID0gcXVldWUubGVuZ3RoO1xuICAgIHdoaWxlKGxlbikge1xuICAgICAgICBjdXJyZW50UXVldWUgPSBxdWV1ZTtcbiAgICAgICAgcXVldWUgPSBbXTtcbiAgICAgICAgd2hpbGUgKCsrcXVldWVJbmRleCA8IGxlbikge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRRdWV1ZSkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRRdWV1ZVtxdWV1ZUluZGV4XS5ydW4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgICAgIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB9XG4gICAgY3VycmVudFF1ZXVlID0gbnVsbDtcbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbn1cblxucHJvY2Vzcy5uZXh0VGljayA9IGZ1bmN0aW9uIChmdW4pIHtcbiAgICB2YXIgYXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoIC0gMSk7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBhcmdzW2kgLSAxXSA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBxdWV1ZS5wdXNoKG5ldyBJdGVtKGZ1biwgYXJncykpO1xuICAgIGlmIChxdWV1ZS5sZW5ndGggPT09IDEgJiYgIWRyYWluaW5nKSB7XG4gICAgICAgIHNldFRpbWVvdXQoZHJhaW5RdWV1ZSwgMCk7XG4gICAgfVxufTtcblxuLy8gdjggbGlrZXMgcHJlZGljdGlibGUgb2JqZWN0c1xuZnVuY3Rpb24gSXRlbShmdW4sIGFycmF5KSB7XG4gICAgdGhpcy5mdW4gPSBmdW47XG4gICAgdGhpcy5hcnJheSA9IGFycmF5O1xufVxuSXRlbS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuZnVuLmFwcGx5KG51bGwsIHRoaXMuYXJyYXkpO1xufTtcbnByb2Nlc3MudGl0bGUgPSAnYnJvd3Nlcic7XG5wcm9jZXNzLmJyb3dzZXIgPSB0cnVlO1xucHJvY2Vzcy5lbnYgPSB7fTtcbnByb2Nlc3MuYXJndiA9IFtdO1xucHJvY2Vzcy52ZXJzaW9uID0gJyc7IC8vIGVtcHR5IHN0cmluZyB0byBhdm9pZCByZWdleHAgaXNzdWVzXG5wcm9jZXNzLnZlcnNpb25zID0ge307XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuXG5wcm9jZXNzLm9uID0gbm9vcDtcbnByb2Nlc3MuYWRkTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5vbmNlID0gbm9vcDtcbnByb2Nlc3Mub2ZmID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVBbGxMaXN0ZW5lcnMgPSBub29wO1xucHJvY2Vzcy5lbWl0ID0gbm9vcDtcblxucHJvY2Vzcy5iaW5kaW5nID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuYmluZGluZyBpcyBub3Qgc3VwcG9ydGVkJyk7XG59O1xuXG5wcm9jZXNzLmN3ZCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuICcvJyB9O1xucHJvY2Vzcy5jaGRpciA9IGZ1bmN0aW9uIChkaXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcbnByb2Nlc3MudW1hc2sgPSBmdW5jdGlvbigpIHsgcmV0dXJuIDA7IH07XG4iLCJleHBvcnRzLnB1YmxpY0VuY3J5cHQgPSByZXF1aXJlKCcuL3B1YmxpY0VuY3J5cHQnKTtcbmV4cG9ydHMucHJpdmF0ZURlY3J5cHQgPSByZXF1aXJlKCcuL3ByaXZhdGVEZWNyeXB0Jyk7XG5cbmV4cG9ydHMucHJpdmF0ZUVuY3J5cHQgPSBmdW5jdGlvbiBwcml2YXRlRW5jcnlwdChrZXksIGJ1Zikge1xuICByZXR1cm4gZXhwb3J0cy5wdWJsaWNFbmNyeXB0KGtleSwgYnVmLCB0cnVlKTtcbn07XG5cbmV4cG9ydHMucHVibGljRGVjcnlwdCA9IGZ1bmN0aW9uIHB1YmxpY0RlY3J5cHQoa2V5LCBidWYpIHtcbiAgcmV0dXJuIGV4cG9ydHMucHJpdmF0ZURlY3J5cHQoa2V5LCBidWYsIHRydWUpO1xufTsiLCJ2YXIgY3JlYXRlSGFzaCA9IHJlcXVpcmUoJ2NyZWF0ZS1oYXNoJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChzZWVkLCBsZW4pIHtcbiAgdmFyIHQgPSBuZXcgQnVmZmVyKCcnKTtcbiAgdmFyICBpID0gMCwgYztcbiAgd2hpbGUgKHQubGVuZ3RoIDwgbGVuKSB7XG4gICAgYyA9IGkyb3BzKGkrKyk7XG4gICAgdCA9IEJ1ZmZlci5jb25jYXQoW3QsIGNyZWF0ZUhhc2goJ3NoYTEnKS51cGRhdGUoc2VlZCkudXBkYXRlKGMpLmRpZ2VzdCgpXSk7XG4gIH1cbiAgcmV0dXJuIHQuc2xpY2UoMCwgbGVuKTtcbn07XG5cbmZ1bmN0aW9uIGkyb3BzKGMpIHtcbiAgdmFyIG91dCA9IG5ldyBCdWZmZXIoNCk7XG4gIG91dC53cml0ZVVJbnQzMkJFKGMsMCk7XG4gIHJldHVybiBvdXQ7XG59IiwidmFyIHBhcnNlS2V5cyA9IHJlcXVpcmUoJ3BhcnNlLWFzbjEnKTtcbnZhciBtZ2YgPSByZXF1aXJlKCcuL21nZicpO1xudmFyIHhvciA9IHJlcXVpcmUoJy4veG9yJyk7XG52YXIgYm4gPSByZXF1aXJlKCdibi5qcycpO1xudmFyIGNydCA9IHJlcXVpcmUoJ2Jyb3dzZXJpZnktcnNhJyk7XG52YXIgY3JlYXRlSGFzaCA9IHJlcXVpcmUoJ2NyZWF0ZS1oYXNoJyk7XG52YXIgd2l0aFB1YmxpYyA9IHJlcXVpcmUoJy4vd2l0aFB1YmxpYycpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBwcml2YXRlRGVjcnlwdChwcml2YXRlX2tleSwgZW5jLCByZXZlcnNlKSB7XG4gIHZhciBwYWRkaW5nO1xuICBpZiAocHJpdmF0ZV9rZXkucGFkZGluZykge1xuICAgIHBhZGRpbmcgPSBwcml2YXRlX2tleS5wYWRkaW5nO1xuICB9IGVsc2UgaWYgKHJldmVyc2UpIHtcbiAgICBwYWRkaW5nID0gMTtcbiAgfSBlbHNlIHtcbiAgICBwYWRkaW5nID0gNDtcbiAgfVxuICBcbiAgdmFyIGtleSA9IHBhcnNlS2V5cyhwcml2YXRlX2tleSk7XG4gIHZhciBrID0ga2V5Lm1vZHVsdXMuYnl0ZUxlbmd0aCgpO1xuICBpZiAoZW5jLmxlbmd0aCA+IGsgfHwgbmV3IGJuKGVuYykuY21wKGtleS5tb2R1bHVzKSA+PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdkZWNyeXB0aW9uIGVycm9yJyk7XG4gIH1cbiAgdmFyIG1zZztcbiAgaWYgKHJldmVyc2UpIHtcbiAgICBtc2cgPSB3aXRoUHVibGljKG5ldyBibihlbmMpLCBrZXkpO1xuICB9IGVsc2Uge1xuICAgIG1zZyA9IGNydChlbmMsIGtleSk7XG4gIH1cbiAgdmFyIHpCdWZmZXIgPSBuZXcgQnVmZmVyKGsgLSBtc2cubGVuZ3RoKTtcbiAgekJ1ZmZlci5maWxsKDApO1xuICBtc2cgPSBCdWZmZXIuY29uY2F0KFt6QnVmZmVyLCBtc2ddLCBrKTtcbiAgaWYgKHBhZGRpbmcgPT09IDQpIHtcbiAgICByZXR1cm4gb2FlcChrZXksIG1zZyk7XG4gIH0gZWxzZSBpZiAocGFkZGluZyA9PT0gMSkge1xuICAgIHJldHVybiBwa2NzMShrZXksIG1zZywgcmV2ZXJzZSk7XG4gIH0gZWxzZSBpZiAocGFkZGluZyA9PT0gMykge1xuICAgIHJldHVybiBtc2c7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd1bmtub3duIHBhZGRpbmcnKTtcbiAgfVxufTtcblxuZnVuY3Rpb24gb2FlcChrZXksIG1zZyl7XG4gIHZhciBuID0ga2V5Lm1vZHVsdXM7XG4gIHZhciBrID0ga2V5Lm1vZHVsdXMuYnl0ZUxlbmd0aCgpO1xuICB2YXIgbUxlbiA9IG1zZy5sZW5ndGg7XG4gIHZhciBpSGFzaCA9IGNyZWF0ZUhhc2goJ3NoYTEnKS51cGRhdGUobmV3IEJ1ZmZlcignJykpLmRpZ2VzdCgpO1xuICB2YXIgaExlbiA9IGlIYXNoLmxlbmd0aDtcbiAgdmFyIGhMZW4yID0gMiAqIGhMZW47XG4gIGlmIChtc2dbMF0gIT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2RlY3J5cHRpb24gZXJyb3InKTtcbiAgfVxuICB2YXIgbWFza2VkU2VlZCA9IG1zZy5zbGljZSgxLCBoTGVuICsgMSk7XG4gIHZhciBtYXNrZWREYiA9ICBtc2cuc2xpY2UoaExlbiArIDEpO1xuICB2YXIgc2VlZCA9IHhvcihtYXNrZWRTZWVkLCBtZ2YobWFza2VkRGIsIGhMZW4pKTtcbiAgdmFyIGRiID0geG9yKG1hc2tlZERiLCBtZ2Yoc2VlZCwgayAtIGhMZW4gLSAxKSk7XG4gIGlmIChjb21wYXJlKGlIYXNoLCBkYi5zbGljZSgwLCBoTGVuKSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2RlY3J5cHRpb24gZXJyb3InKTtcbiAgfVxuICB2YXIgaSA9IGhMZW47XG4gIHdoaWxlIChkYltpXSA9PT0gMCkge1xuICAgIGkrKztcbiAgfVxuICBpZiAoZGJbaSsrXSAhPT0gMSkge1xuICAgIHRocm93IG5ldyBFcnJvcignZGVjcnlwdGlvbiBlcnJvcicpO1xuICB9XG4gIHJldHVybiBkYi5zbGljZShpKTtcbn1cblxuZnVuY3Rpb24gcGtjczEoa2V5LCBtc2csIHJldmVyc2Upe1xuICB2YXIgcDEgPSBtc2cuc2xpY2UoMCwgMik7XG4gIHZhciBpID0gMjtcbiAgdmFyIHN0YXR1cyA9IDA7XG4gIHdoaWxlIChtc2dbaSsrXSAhPT0gMCkge1xuICAgIGlmIChpID49IG1zZy5sZW5ndGgpIHtcbiAgICAgIHN0YXR1cysrO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHZhciBwcyA9IG1zZy5zbGljZSgyLCBpIC0gMSk7XG4gIHZhciBwMiA9IG1zZy5zbGljZShpIC0gMSwgaSk7XG5cbiAgaWYgKChwMS50b1N0cmluZygnaGV4JykgIT09ICcwMDAyJyAmJiAhcmV2ZXJzZSkgfHwgKHAxLnRvU3RyaW5nKCdoZXgnKSAhPT0gJzAwMDEnICYmIHJldmVyc2UpKXtcbiAgICBzdGF0dXMrKztcbiAgfVxuICBpZiAocHMubGVuZ3RoIDwgOCkge1xuICAgIHN0YXR1cysrO1xuICB9XG4gIGlmIChzdGF0dXMpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2RlY3J5cHRpb24gZXJyb3InKTtcbiAgfVxuICByZXR1cm4gIG1zZy5zbGljZShpKTtcbn1cbmZ1bmN0aW9uIGNvbXBhcmUoYSwgYil7XG4gIGEgPSBuZXcgQnVmZmVyKGEpO1xuICBiID0gbmV3IEJ1ZmZlcihiKTtcbiAgdmFyIGRpZiA9IDA7XG4gIHZhciBsZW4gPSBhLmxlbmd0aDtcbiAgaWYgKGEubGVuZ3RoICE9PSBiLmxlbmd0aCkge1xuICAgIGRpZisrO1xuICAgIGxlbiA9IE1hdGgubWluKGEubGVuZ3RoLCBiLmxlbmd0aCk7XG4gIH1cbiAgdmFyIGkgPSAtMTtcbiAgd2hpbGUgKCsraSA8IGxlbikge1xuICAgIGRpZiArPSAoYVtpXSBeIGJbaV0pO1xuICB9XG4gIHJldHVybiBkaWY7XG59IiwidmFyIHBhcnNlS2V5cyA9IHJlcXVpcmUoJ3BhcnNlLWFzbjEnKTtcbnZhciByYW5kb21CeXRlcyA9IHJlcXVpcmUoJ3JhbmRvbWJ5dGVzJyk7XG52YXIgY3JlYXRlSGFzaCA9IHJlcXVpcmUoJ2NyZWF0ZS1oYXNoJyk7XG52YXIgbWdmID0gcmVxdWlyZSgnLi9tZ2YnKTtcbnZhciB4b3IgPSByZXF1aXJlKCcuL3hvcicpO1xudmFyIGJuID0gcmVxdWlyZSgnYm4uanMnKTtcbnZhciB3aXRoUHVibGljID0gcmVxdWlyZSgnLi93aXRoUHVibGljJyk7XG52YXIgY3J0ID0gcmVxdWlyZSgnYnJvd3NlcmlmeS1yc2EnKTtcblxudmFyIGNvbnN0YW50cyA9IHtcbiAgUlNBX1BLQ1MxX09BRVBfUEFERElORzogNCxcbiAgUlNBX1BLQ1MxX1BBRERJTjogMSxcbiAgUlNBX05PX1BBRERJTkc6IDNcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gcHVibGljRW5jcnlwdChwdWJsaWNfa2V5LCBtc2csIHJldmVyc2UpIHtcbiAgdmFyIHBhZGRpbmc7XG4gIGlmIChwdWJsaWNfa2V5LnBhZGRpbmcpIHtcbiAgICBwYWRkaW5nID0gcHVibGljX2tleS5wYWRkaW5nO1xuICB9IGVsc2UgaWYgKHJldmVyc2UpIHtcbiAgICBwYWRkaW5nID0gMTtcbiAgfSBlbHNlIHtcbiAgICBwYWRkaW5nID0gNDtcbiAgfVxuICB2YXIga2V5ID0gcGFyc2VLZXlzKHB1YmxpY19rZXkpO1xuICB2YXIgcGFkZGVkTXNnO1xuICBpZiAocGFkZGluZyA9PT0gNCkge1xuICAgIHBhZGRlZE1zZyA9IG9hZXAoa2V5LCBtc2cpO1xuICB9IGVsc2UgaWYgKHBhZGRpbmcgPT09IDEpIHtcbiAgICBwYWRkZWRNc2cgPSBwa2NzMShrZXksIG1zZywgcmV2ZXJzZSk7XG4gIH0gZWxzZSBpZiAocGFkZGluZyA9PT0gMykge1xuICAgIHBhZGRlZE1zZyA9IG5ldyBibihtc2cpO1xuICAgIGlmIChwYWRkZWRNc2cuY21wKGtleS5tb2R1bHVzKSA+PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2RhdGEgdG9vIGxvbmcgZm9yIG1vZHVsdXMnKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd1bmtub3duIHBhZGRpbmcnKTtcbiAgfVxuICBpZiAocmV2ZXJzZSkge1xuICAgIHJldHVybiBjcnQocGFkZGVkTXNnLCBrZXkpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB3aXRoUHVibGljKHBhZGRlZE1zZywga2V5KTtcbiAgfVxufTtcblxuZnVuY3Rpb24gb2FlcChrZXksIG1zZyl7XG4gIHZhciBrID0ga2V5Lm1vZHVsdXMuYnl0ZUxlbmd0aCgpO1xuICB2YXIgbUxlbiA9IG1zZy5sZW5ndGg7XG4gIHZhciBpSGFzaCA9IGNyZWF0ZUhhc2goJ3NoYTEnKS51cGRhdGUobmV3IEJ1ZmZlcignJykpLmRpZ2VzdCgpO1xuICB2YXIgaExlbiA9IGlIYXNoLmxlbmd0aDtcbiAgdmFyIGhMZW4yID0gMiAqIGhMZW47XG4gIGlmIChtTGVuID4gayAtIGhMZW4yIC0gMikge1xuICAgIHRocm93IG5ldyBFcnJvcignbWVzc2FnZSB0b28gbG9uZycpO1xuICB9XG4gIHZhciBwcyA9IG5ldyBCdWZmZXIoayAtIG1MZW4gLSBoTGVuMiAtIDIpO1xuICBwcy5maWxsKDApO1xuICB2YXIgZGJsZW4gPSBrIC0gaExlbiAtIDE7XG4gIHZhciBzZWVkID0gcmFuZG9tQnl0ZXMoaExlbik7XG4gIHZhciBtYXNrZWREYiA9IHhvcihCdWZmZXIuY29uY2F0KFtpSGFzaCwgcHMsIG5ldyBCdWZmZXIoWzFdKSwgbXNnXSwgZGJsZW4pLCBtZ2Yoc2VlZCwgZGJsZW4pKTtcbiAgdmFyIG1hc2tlZFNlZWQgPSB4b3Ioc2VlZCwgbWdmKG1hc2tlZERiLCBoTGVuKSk7XG4gIHJldHVybiBuZXcgYm4oQnVmZmVyLmNvbmNhdChbbmV3IEJ1ZmZlcihbMF0pLCBtYXNrZWRTZWVkLCBtYXNrZWREYl0sIGspKTtcbn1cbmZ1bmN0aW9uIHBrY3MxKGtleSwgbXNnLCByZXZlcnNlKXtcbiAgdmFyIG1MZW4gPSBtc2cubGVuZ3RoO1xuICB2YXIgayA9IGtleS5tb2R1bHVzLmJ5dGVMZW5ndGgoKTtcbiAgaWYgKG1MZW4gPiBrIC0gMTEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ21lc3NhZ2UgdG9vIGxvbmcnKTtcbiAgfVxuICB2YXIgcHM7XG4gIGlmIChyZXZlcnNlKSB7XG4gICAgcHMgPSBuZXcgQnVmZmVyKGsgLSBtTGVuIC0gMyk7XG4gICAgcHMuZmlsbCgweGZmKTtcbiAgfSBlbHNlIHtcbiAgICBwcyA9IG5vblplcm8oayAtIG1MZW4gLSAzKTtcbiAgfVxuICByZXR1cm4gbmV3IGJuKEJ1ZmZlci5jb25jYXQoW25ldyBCdWZmZXIoWzAsIHJldmVyc2U/MToyXSksIHBzLCBuZXcgQnVmZmVyKFswXSksIG1zZ10sIGspKTtcbn1cbmZ1bmN0aW9uIG5vblplcm8obGVuLCBjcnlwdG8pIHtcbiAgdmFyIG91dCA9IG5ldyBCdWZmZXIobGVuKTtcbiAgdmFyIGkgPSAwO1xuICB2YXIgY2FjaGUgPSByYW5kb21CeXRlcyhsZW4qMik7XG4gIHZhciBjdXIgPSAwO1xuICB2YXIgbnVtO1xuICB3aGlsZSAoaSA8IGxlbikge1xuICAgIGlmIChjdXIgPT09IGNhY2hlLmxlbmd0aCkge1xuICAgICAgY2FjaGUgPSByYW5kb21CeXRlcyhsZW4qMik7XG4gICAgICBjdXIgPSAwO1xuICAgIH1cbiAgICBudW0gPSBjYWNoZVtjdXIrK107XG4gICAgaWYgKG51bSkge1xuICAgICAgb3V0W2krK10gPSBudW07XG4gICAgfVxuICB9XG4gIHJldHVybiBvdXQ7XG59IiwidmFyIGJuID0gcmVxdWlyZSgnYm4uanMnKTtcbmZ1bmN0aW9uIHdpdGhQdWJsaWMocGFkZGVkTXNnLCBrZXkpIHtcbiAgcmV0dXJuIG5ldyBCdWZmZXIocGFkZGVkTXNnXG4gICAgLnRvUmVkKGJuLm1vbnQoa2V5Lm1vZHVsdXMpKVxuICAgIC5yZWRQb3cobmV3IGJuKGtleS5wdWJsaWNFeHBvbmVudCkpXG4gICAgLmZyb21SZWQoKVxuICAgIC50b0FycmF5KCkpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHdpdGhQdWJsaWM7IiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiB4b3IoYSwgYikge1xuICB2YXIgbGVuID0gYS5sZW5ndGg7XG4gIHZhciBpID0gLTE7XG4gIHdoaWxlICgrK2kgPCBsZW4pIHtcbiAgICBhW2ldIF49IGJbaV07XG4gIH1cbiAgcmV0dXJuIGFcbn07IiwiJ3VzZSBzdHJpY3QnXG5cbmZ1bmN0aW9uIG9sZEJyb3dzZXIgKCkge1xuICB0aHJvdyBuZXcgRXJyb3IoJ3NlY3VyZSByYW5kb20gbnVtYmVyIGdlbmVyYXRpb24gbm90IHN1cHBvcnRlZCBieSB0aGlzIGJyb3dzZXJcXG51c2UgY2hyb21lLCBGaXJlRm94IG9yIEludGVybmV0IEV4cGxvcmVyIDExJylcbn1cblxudmFyIGNyeXB0byA9IGdsb2JhbC5jcnlwdG8gfHwgZ2xvYmFsLm1zQ3J5cHRvXG5cbmlmIChjcnlwdG8gJiYgY3J5cHRvLmdldFJhbmRvbVZhbHVlcykge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJhbmRvbUJ5dGVzXG59IGVsc2Uge1xuICBtb2R1bGUuZXhwb3J0cyA9IG9sZEJyb3dzZXJcbn1cblxuZnVuY3Rpb24gcmFuZG9tQnl0ZXMgKHNpemUsIGNiKSB7XG4gIC8vIHBoYW50b21qcyBuZWVkcyB0byB0aHJvd1xuICBpZiAoc2l6ZSA+IDY1NTM2KSB0aHJvdyBuZXcgRXJyb3IoJ3JlcXVlc3RlZCB0b28gbWFueSByYW5kb20gYnl0ZXMnKVxuICAvLyBpbiBjYXNlIGJyb3dzZXJpZnkgIGlzbid0IHVzaW5nIHRoZSBVaW50OEFycmF5IHZlcnNpb25cbiAgdmFyIHJhd0J5dGVzID0gbmV3IGdsb2JhbC5VaW50OEFycmF5KHNpemUpXG5cbiAgLy8gVGhpcyB3aWxsIG5vdCB3b3JrIGluIG9sZGVyIGJyb3dzZXJzLlxuICAvLyBTZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL3dpbmRvdy5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzXG4gIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMocmF3Qnl0ZXMpXG5cbiAgLy8gcGhhbnRvbWpzIGRvZXNuJ3QgbGlrZSBhIGJ1ZmZlciBiZWluZyBwYXNzZWQgaGVyZVxuICB2YXIgYnl0ZXMgPSBuZXcgQnVmZmVyKHJhd0J5dGVzLmJ1ZmZlcilcblxuICBpZiAodHlwZW9mIGNiID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24gKCkge1xuICAgICAgY2IobnVsbCwgYnl0ZXMpXG4gICAgfSlcbiAgfVxuXG4gIHJldHVybiBieXRlc1xufVxuIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiLi9saWIvX3N0cmVhbV9kdXBsZXguanNcIilcbiIsIi8vIGEgZHVwbGV4IHN0cmVhbSBpcyBqdXN0IGEgc3RyZWFtIHRoYXQgaXMgYm90aCByZWFkYWJsZSBhbmQgd3JpdGFibGUuXG4vLyBTaW5jZSBKUyBkb2Vzbid0IGhhdmUgbXVsdGlwbGUgcHJvdG90eXBhbCBpbmhlcml0YW5jZSwgdGhpcyBjbGFzc1xuLy8gcHJvdG90eXBhbGx5IGluaGVyaXRzIGZyb20gUmVhZGFibGUsIGFuZCB0aGVuIHBhcmFzaXRpY2FsbHkgZnJvbVxuLy8gV3JpdGFibGUuXG5cbid1c2Ugc3RyaWN0JztcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBvYmplY3RLZXlzID0gT2JqZWN0LmtleXMgfHwgZnVuY3Rpb24gKG9iaikge1xuICB2YXIga2V5cyA9IFtdO1xuICBmb3IgKHZhciBrZXkgaW4gb2JqKSBrZXlzLnB1c2goa2V5KTtcbiAgcmV0dXJuIGtleXM7XG59XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuXG5tb2R1bGUuZXhwb3J0cyA9IER1cGxleDtcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBwcm9jZXNzTmV4dFRpY2sgPSByZXF1aXJlKCdwcm9jZXNzLW5leHRpY2stYXJncycpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cblxuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIHV0aWwgPSByZXF1aXJlKCdjb3JlLXV0aWwtaXMnKTtcbnV0aWwuaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbnZhciBSZWFkYWJsZSA9IHJlcXVpcmUoJy4vX3N0cmVhbV9yZWFkYWJsZScpO1xudmFyIFdyaXRhYmxlID0gcmVxdWlyZSgnLi9fc3RyZWFtX3dyaXRhYmxlJyk7XG5cbnV0aWwuaW5oZXJpdHMoRHVwbGV4LCBSZWFkYWJsZSk7XG5cbnZhciBrZXlzID0gb2JqZWN0S2V5cyhXcml0YWJsZS5wcm90b3R5cGUpO1xuZm9yICh2YXIgdiA9IDA7IHYgPCBrZXlzLmxlbmd0aDsgdisrKSB7XG4gIHZhciBtZXRob2QgPSBrZXlzW3ZdO1xuICBpZiAoIUR1cGxleC5wcm90b3R5cGVbbWV0aG9kXSlcbiAgICBEdXBsZXgucHJvdG90eXBlW21ldGhvZF0gPSBXcml0YWJsZS5wcm90b3R5cGVbbWV0aG9kXTtcbn1cblxuZnVuY3Rpb24gRHVwbGV4KG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIER1cGxleCkpXG4gICAgcmV0dXJuIG5ldyBEdXBsZXgob3B0aW9ucyk7XG5cbiAgUmVhZGFibGUuY2FsbCh0aGlzLCBvcHRpb25zKTtcbiAgV3JpdGFibGUuY2FsbCh0aGlzLCBvcHRpb25zKTtcblxuICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLnJlYWRhYmxlID09PSBmYWxzZSlcbiAgICB0aGlzLnJlYWRhYmxlID0gZmFsc2U7XG5cbiAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy53cml0YWJsZSA9PT0gZmFsc2UpXG4gICAgdGhpcy53cml0YWJsZSA9IGZhbHNlO1xuXG4gIHRoaXMuYWxsb3dIYWxmT3BlbiA9IHRydWU7XG4gIGlmIChvcHRpb25zICYmIG9wdGlvbnMuYWxsb3dIYWxmT3BlbiA9PT0gZmFsc2UpXG4gICAgdGhpcy5hbGxvd0hhbGZPcGVuID0gZmFsc2U7XG5cbiAgdGhpcy5vbmNlKCdlbmQnLCBvbmVuZCk7XG59XG5cbi8vIHRoZSBuby1oYWxmLW9wZW4gZW5mb3JjZXJcbmZ1bmN0aW9uIG9uZW5kKCkge1xuICAvLyBpZiB3ZSBhbGxvdyBoYWxmLW9wZW4gc3RhdGUsIG9yIGlmIHRoZSB3cml0YWJsZSBzaWRlIGVuZGVkLFxuICAvLyB0aGVuIHdlJ3JlIG9rLlxuICBpZiAodGhpcy5hbGxvd0hhbGZPcGVuIHx8IHRoaXMuX3dyaXRhYmxlU3RhdGUuZW5kZWQpXG4gICAgcmV0dXJuO1xuXG4gIC8vIG5vIG1vcmUgZGF0YSBjYW4gYmUgd3JpdHRlbi5cbiAgLy8gQnV0IGFsbG93IG1vcmUgd3JpdGVzIHRvIGhhcHBlbiBpbiB0aGlzIHRpY2suXG4gIHByb2Nlc3NOZXh0VGljayhvbkVuZE5ULCB0aGlzKTtcbn1cblxuZnVuY3Rpb24gb25FbmROVChzZWxmKSB7XG4gIHNlbGYuZW5kKCk7XG59XG5cbmZ1bmN0aW9uIGZvckVhY2ggKHhzLCBmKSB7XG4gIGZvciAodmFyIGkgPSAwLCBsID0geHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgZih4c1tpXSwgaSk7XG4gIH1cbn1cbiIsIi8vIGEgcGFzc3Rocm91Z2ggc3RyZWFtLlxuLy8gYmFzaWNhbGx5IGp1c3QgdGhlIG1vc3QgbWluaW1hbCBzb3J0IG9mIFRyYW5zZm9ybSBzdHJlYW0uXG4vLyBFdmVyeSB3cml0dGVuIGNodW5rIGdldHMgb3V0cHV0IGFzLWlzLlxuXG4ndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gUGFzc1Rocm91Z2g7XG5cbnZhciBUcmFuc2Zvcm0gPSByZXF1aXJlKCcuL19zdHJlYW1fdHJhbnNmb3JtJyk7XG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgdXRpbCA9IHJlcXVpcmUoJ2NvcmUtdXRpbC1pcycpO1xudXRpbC5pbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxudXRpbC5pbmhlcml0cyhQYXNzVGhyb3VnaCwgVHJhbnNmb3JtKTtcblxuZnVuY3Rpb24gUGFzc1Rocm91Z2gob3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgUGFzc1Rocm91Z2gpKVxuICAgIHJldHVybiBuZXcgUGFzc1Rocm91Z2gob3B0aW9ucyk7XG5cbiAgVHJhbnNmb3JtLmNhbGwodGhpcywgb3B0aW9ucyk7XG59XG5cblBhc3NUaHJvdWdoLnByb3RvdHlwZS5fdHJhbnNmb3JtID0gZnVuY3Rpb24oY2h1bmssIGVuY29kaW5nLCBjYikge1xuICBjYihudWxsLCBjaHVuayk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWRhYmxlO1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIHByb2Nlc3NOZXh0VGljayA9IHJlcXVpcmUoJ3Byb2Nlc3MtbmV4dGljay1hcmdzJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIGlzQXJyYXkgPSByZXF1aXJlKCdpc2FycmF5Jyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ2J1ZmZlcicpLkJ1ZmZlcjtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG5SZWFkYWJsZS5SZWFkYWJsZVN0YXRlID0gUmVhZGFibGVTdGF0ZTtcblxudmFyIEVFID0gcmVxdWlyZSgnZXZlbnRzJyk7XG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgRUVsaXN0ZW5lckNvdW50ID0gZnVuY3Rpb24oZW1pdHRlciwgdHlwZSkge1xuICByZXR1cm4gZW1pdHRlci5saXN0ZW5lcnModHlwZSkubGVuZ3RoO1xufTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG5cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBTdHJlYW07XG4oZnVuY3Rpb24gKCl7dHJ5e1xuICBTdHJlYW0gPSByZXF1aXJlKCdzdCcgKyAncmVhbScpO1xufWNhdGNoKF8pe31maW5hbGx5e1xuICBpZiAoIVN0cmVhbSlcbiAgICBTdHJlYW0gPSByZXF1aXJlKCdldmVudHMnKS5FdmVudEVtaXR0ZXI7XG59fSgpKVxuLyo8L3JlcGxhY2VtZW50PiovXG5cbnZhciBCdWZmZXIgPSByZXF1aXJlKCdidWZmZXInKS5CdWZmZXI7XG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgdXRpbCA9IHJlcXVpcmUoJ2NvcmUtdXRpbC1pcycpO1xudXRpbC5pbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgZGVidWdVdGlsID0gcmVxdWlyZSgndXRpbCcpO1xudmFyIGRlYnVnO1xuaWYgKGRlYnVnVXRpbCAmJiBkZWJ1Z1V0aWwuZGVidWdsb2cpIHtcbiAgZGVidWcgPSBkZWJ1Z1V0aWwuZGVidWdsb2coJ3N0cmVhbScpO1xufSBlbHNlIHtcbiAgZGVidWcgPSBmdW5jdGlvbiAoKSB7fTtcbn1cbi8qPC9yZXBsYWNlbWVudD4qL1xuXG52YXIgU3RyaW5nRGVjb2RlcjtcblxudXRpbC5pbmhlcml0cyhSZWFkYWJsZSwgU3RyZWFtKTtcblxudmFyIER1cGxleDtcbmZ1bmN0aW9uIFJlYWRhYmxlU3RhdGUob3B0aW9ucywgc3RyZWFtKSB7XG4gIER1cGxleCA9IER1cGxleCB8fCByZXF1aXJlKCcuL19zdHJlYW1fZHVwbGV4Jyk7XG5cbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgLy8gb2JqZWN0IHN0cmVhbSBmbGFnLiBVc2VkIHRvIG1ha2UgcmVhZChuKSBpZ25vcmUgbiBhbmQgdG9cbiAgLy8gbWFrZSBhbGwgdGhlIGJ1ZmZlciBtZXJnaW5nIGFuZCBsZW5ndGggY2hlY2tzIGdvIGF3YXlcbiAgdGhpcy5vYmplY3RNb2RlID0gISFvcHRpb25zLm9iamVjdE1vZGU7XG5cbiAgaWYgKHN0cmVhbSBpbnN0YW5jZW9mIER1cGxleClcbiAgICB0aGlzLm9iamVjdE1vZGUgPSB0aGlzLm9iamVjdE1vZGUgfHwgISFvcHRpb25zLnJlYWRhYmxlT2JqZWN0TW9kZTtcblxuICAvLyB0aGUgcG9pbnQgYXQgd2hpY2ggaXQgc3RvcHMgY2FsbGluZyBfcmVhZCgpIHRvIGZpbGwgdGhlIGJ1ZmZlclxuICAvLyBOb3RlOiAwIGlzIGEgdmFsaWQgdmFsdWUsIG1lYW5zIFwiZG9uJ3QgY2FsbCBfcmVhZCBwcmVlbXB0aXZlbHkgZXZlclwiXG4gIHZhciBod20gPSBvcHRpb25zLmhpZ2hXYXRlck1hcms7XG4gIHZhciBkZWZhdWx0SHdtID0gdGhpcy5vYmplY3RNb2RlID8gMTYgOiAxNiAqIDEwMjQ7XG4gIHRoaXMuaGlnaFdhdGVyTWFyayA9IChod20gfHwgaHdtID09PSAwKSA/IGh3bSA6IGRlZmF1bHRId207XG5cbiAgLy8gY2FzdCB0byBpbnRzLlxuICB0aGlzLmhpZ2hXYXRlck1hcmsgPSB+fnRoaXMuaGlnaFdhdGVyTWFyaztcblxuICB0aGlzLmJ1ZmZlciA9IFtdO1xuICB0aGlzLmxlbmd0aCA9IDA7XG4gIHRoaXMucGlwZXMgPSBudWxsO1xuICB0aGlzLnBpcGVzQ291bnQgPSAwO1xuICB0aGlzLmZsb3dpbmcgPSBudWxsO1xuICB0aGlzLmVuZGVkID0gZmFsc2U7XG4gIHRoaXMuZW5kRW1pdHRlZCA9IGZhbHNlO1xuICB0aGlzLnJlYWRpbmcgPSBmYWxzZTtcblxuICAvLyBhIGZsYWcgdG8gYmUgYWJsZSB0byB0ZWxsIGlmIHRoZSBvbndyaXRlIGNiIGlzIGNhbGxlZCBpbW1lZGlhdGVseSxcbiAgLy8gb3Igb24gYSBsYXRlciB0aWNrLiAgV2Ugc2V0IHRoaXMgdG8gdHJ1ZSBhdCBmaXJzdCwgYmVjYXVzZSBhbnlcbiAgLy8gYWN0aW9ucyB0aGF0IHNob3VsZG4ndCBoYXBwZW4gdW50aWwgXCJsYXRlclwiIHNob3VsZCBnZW5lcmFsbHkgYWxzb1xuICAvLyBub3QgaGFwcGVuIGJlZm9yZSB0aGUgZmlyc3Qgd3JpdGUgY2FsbC5cbiAgdGhpcy5zeW5jID0gdHJ1ZTtcblxuICAvLyB3aGVuZXZlciB3ZSByZXR1cm4gbnVsbCwgdGhlbiB3ZSBzZXQgYSBmbGFnIHRvIHNheVxuICAvLyB0aGF0IHdlJ3JlIGF3YWl0aW5nIGEgJ3JlYWRhYmxlJyBldmVudCBlbWlzc2lvbi5cbiAgdGhpcy5uZWVkUmVhZGFibGUgPSBmYWxzZTtcbiAgdGhpcy5lbWl0dGVkUmVhZGFibGUgPSBmYWxzZTtcbiAgdGhpcy5yZWFkYWJsZUxpc3RlbmluZyA9IGZhbHNlO1xuXG4gIC8vIENyeXB0byBpcyBraW5kIG9mIG9sZCBhbmQgY3J1c3R5LiAgSGlzdG9yaWNhbGx5LCBpdHMgZGVmYXVsdCBzdHJpbmdcbiAgLy8gZW5jb2RpbmcgaXMgJ2JpbmFyeScgc28gd2UgaGF2ZSB0byBtYWtlIHRoaXMgY29uZmlndXJhYmxlLlxuICAvLyBFdmVyeXRoaW5nIGVsc2UgaW4gdGhlIHVuaXZlcnNlIHVzZXMgJ3V0ZjgnLCB0aG91Z2guXG4gIHRoaXMuZGVmYXVsdEVuY29kaW5nID0gb3B0aW9ucy5kZWZhdWx0RW5jb2RpbmcgfHwgJ3V0ZjgnO1xuXG4gIC8vIHdoZW4gcGlwaW5nLCB3ZSBvbmx5IGNhcmUgYWJvdXQgJ3JlYWRhYmxlJyBldmVudHMgdGhhdCBoYXBwZW5cbiAgLy8gYWZ0ZXIgcmVhZCgpaW5nIGFsbCB0aGUgYnl0ZXMgYW5kIG5vdCBnZXR0aW5nIGFueSBwdXNoYmFjay5cbiAgdGhpcy5yYW5PdXQgPSBmYWxzZTtcblxuICAvLyB0aGUgbnVtYmVyIG9mIHdyaXRlcnMgdGhhdCBhcmUgYXdhaXRpbmcgYSBkcmFpbiBldmVudCBpbiAucGlwZSgpc1xuICB0aGlzLmF3YWl0RHJhaW4gPSAwO1xuXG4gIC8vIGlmIHRydWUsIGEgbWF5YmVSZWFkTW9yZSBoYXMgYmVlbiBzY2hlZHVsZWRcbiAgdGhpcy5yZWFkaW5nTW9yZSA9IGZhbHNlO1xuXG4gIHRoaXMuZGVjb2RlciA9IG51bGw7XG4gIHRoaXMuZW5jb2RpbmcgPSBudWxsO1xuICBpZiAob3B0aW9ucy5lbmNvZGluZykge1xuICAgIGlmICghU3RyaW5nRGVjb2RlcilcbiAgICAgIFN0cmluZ0RlY29kZXIgPSByZXF1aXJlKCdzdHJpbmdfZGVjb2Rlci8nKS5TdHJpbmdEZWNvZGVyO1xuICAgIHRoaXMuZGVjb2RlciA9IG5ldyBTdHJpbmdEZWNvZGVyKG9wdGlvbnMuZW5jb2RpbmcpO1xuICAgIHRoaXMuZW5jb2RpbmcgPSBvcHRpb25zLmVuY29kaW5nO1xuICB9XG59XG5cbnZhciBEdXBsZXg7XG5mdW5jdGlvbiBSZWFkYWJsZShvcHRpb25zKSB7XG4gIER1cGxleCA9IER1cGxleCB8fCByZXF1aXJlKCcuL19zdHJlYW1fZHVwbGV4Jyk7XG5cbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFJlYWRhYmxlKSlcbiAgICByZXR1cm4gbmV3IFJlYWRhYmxlKG9wdGlvbnMpO1xuXG4gIHRoaXMuX3JlYWRhYmxlU3RhdGUgPSBuZXcgUmVhZGFibGVTdGF0ZShvcHRpb25zLCB0aGlzKTtcblxuICAvLyBsZWdhY3lcbiAgdGhpcy5yZWFkYWJsZSA9IHRydWU7XG5cbiAgaWYgKG9wdGlvbnMgJiYgdHlwZW9mIG9wdGlvbnMucmVhZCA9PT0gJ2Z1bmN0aW9uJylcbiAgICB0aGlzLl9yZWFkID0gb3B0aW9ucy5yZWFkO1xuXG4gIFN0cmVhbS5jYWxsKHRoaXMpO1xufVxuXG4vLyBNYW51YWxseSBzaG92ZSBzb21ldGhpbmcgaW50byB0aGUgcmVhZCgpIGJ1ZmZlci5cbi8vIFRoaXMgcmV0dXJucyB0cnVlIGlmIHRoZSBoaWdoV2F0ZXJNYXJrIGhhcyBub3QgYmVlbiBoaXQgeWV0LFxuLy8gc2ltaWxhciB0byBob3cgV3JpdGFibGUud3JpdGUoKSByZXR1cm5zIHRydWUgaWYgeW91IHNob3VsZFxuLy8gd3JpdGUoKSBzb21lIG1vcmUuXG5SZWFkYWJsZS5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uKGNodW5rLCBlbmNvZGluZykge1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuXG4gIGlmICghc3RhdGUub2JqZWN0TW9kZSAmJiB0eXBlb2YgY2h1bmsgPT09ICdzdHJpbmcnKSB7XG4gICAgZW5jb2RpbmcgPSBlbmNvZGluZyB8fCBzdGF0ZS5kZWZhdWx0RW5jb2Rpbmc7XG4gICAgaWYgKGVuY29kaW5nICE9PSBzdGF0ZS5lbmNvZGluZykge1xuICAgICAgY2h1bmsgPSBuZXcgQnVmZmVyKGNodW5rLCBlbmNvZGluZyk7XG4gICAgICBlbmNvZGluZyA9ICcnO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZWFkYWJsZUFkZENodW5rKHRoaXMsIHN0YXRlLCBjaHVuaywgZW5jb2RpbmcsIGZhbHNlKTtcbn07XG5cbi8vIFVuc2hpZnQgc2hvdWxkICphbHdheXMqIGJlIHNvbWV0aGluZyBkaXJlY3RseSBvdXQgb2YgcmVhZCgpXG5SZWFkYWJsZS5wcm90b3R5cGUudW5zaGlmdCA9IGZ1bmN0aW9uKGNodW5rKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gIHJldHVybiByZWFkYWJsZUFkZENodW5rKHRoaXMsIHN0YXRlLCBjaHVuaywgJycsIHRydWUpO1xufTtcblxuUmVhZGFibGUucHJvdG90eXBlLmlzUGF1c2VkID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcgPT09IGZhbHNlO1xufTtcblxuZnVuY3Rpb24gcmVhZGFibGVBZGRDaHVuayhzdHJlYW0sIHN0YXRlLCBjaHVuaywgZW5jb2RpbmcsIGFkZFRvRnJvbnQpIHtcbiAgdmFyIGVyID0gY2h1bmtJbnZhbGlkKHN0YXRlLCBjaHVuayk7XG4gIGlmIChlcikge1xuICAgIHN0cmVhbS5lbWl0KCdlcnJvcicsIGVyKTtcbiAgfSBlbHNlIGlmIChjaHVuayA9PT0gbnVsbCkge1xuICAgIHN0YXRlLnJlYWRpbmcgPSBmYWxzZTtcbiAgICBvbkVvZkNodW5rKHN0cmVhbSwgc3RhdGUpO1xuICB9IGVsc2UgaWYgKHN0YXRlLm9iamVjdE1vZGUgfHwgY2h1bmsgJiYgY2h1bmsubGVuZ3RoID4gMCkge1xuICAgIGlmIChzdGF0ZS5lbmRlZCAmJiAhYWRkVG9Gcm9udCkge1xuICAgICAgdmFyIGUgPSBuZXcgRXJyb3IoJ3N0cmVhbS5wdXNoKCkgYWZ0ZXIgRU9GJyk7XG4gICAgICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlKTtcbiAgICB9IGVsc2UgaWYgKHN0YXRlLmVuZEVtaXR0ZWQgJiYgYWRkVG9Gcm9udCkge1xuICAgICAgdmFyIGUgPSBuZXcgRXJyb3IoJ3N0cmVhbS51bnNoaWZ0KCkgYWZ0ZXIgZW5kIGV2ZW50Jyk7XG4gICAgICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHN0YXRlLmRlY29kZXIgJiYgIWFkZFRvRnJvbnQgJiYgIWVuY29kaW5nKVxuICAgICAgICBjaHVuayA9IHN0YXRlLmRlY29kZXIud3JpdGUoY2h1bmspO1xuXG4gICAgICBpZiAoIWFkZFRvRnJvbnQpXG4gICAgICAgIHN0YXRlLnJlYWRpbmcgPSBmYWxzZTtcblxuICAgICAgLy8gaWYgd2Ugd2FudCB0aGUgZGF0YSBub3csIGp1c3QgZW1pdCBpdC5cbiAgICAgIGlmIChzdGF0ZS5mbG93aW5nICYmIHN0YXRlLmxlbmd0aCA9PT0gMCAmJiAhc3RhdGUuc3luYykge1xuICAgICAgICBzdHJlYW0uZW1pdCgnZGF0YScsIGNodW5rKTtcbiAgICAgICAgc3RyZWFtLnJlYWQoMCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyB1cGRhdGUgdGhlIGJ1ZmZlciBpbmZvLlxuICAgICAgICBzdGF0ZS5sZW5ndGggKz0gc3RhdGUub2JqZWN0TW9kZSA/IDEgOiBjaHVuay5sZW5ndGg7XG4gICAgICAgIGlmIChhZGRUb0Zyb250KVxuICAgICAgICAgIHN0YXRlLmJ1ZmZlci51bnNoaWZ0KGNodW5rKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgIHN0YXRlLmJ1ZmZlci5wdXNoKGNodW5rKTtcblxuICAgICAgICBpZiAoc3RhdGUubmVlZFJlYWRhYmxlKVxuICAgICAgICAgIGVtaXRSZWFkYWJsZShzdHJlYW0pO1xuICAgICAgfVxuXG4gICAgICBtYXliZVJlYWRNb3JlKHN0cmVhbSwgc3RhdGUpO1xuICAgIH1cbiAgfSBlbHNlIGlmICghYWRkVG9Gcm9udCkge1xuICAgIHN0YXRlLnJlYWRpbmcgPSBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBuZWVkTW9yZURhdGEoc3RhdGUpO1xufVxuXG5cbi8vIGlmIGl0J3MgcGFzdCB0aGUgaGlnaCB3YXRlciBtYXJrLCB3ZSBjYW4gcHVzaCBpbiBzb21lIG1vcmUuXG4vLyBBbHNvLCBpZiB3ZSBoYXZlIG5vIGRhdGEgeWV0LCB3ZSBjYW4gc3RhbmQgc29tZVxuLy8gbW9yZSBieXRlcy4gIFRoaXMgaXMgdG8gd29yayBhcm91bmQgY2FzZXMgd2hlcmUgaHdtPTAsXG4vLyBzdWNoIGFzIHRoZSByZXBsLiAgQWxzbywgaWYgdGhlIHB1c2goKSB0cmlnZ2VyZWQgYVxuLy8gcmVhZGFibGUgZXZlbnQsIGFuZCB0aGUgdXNlciBjYWxsZWQgcmVhZChsYXJnZU51bWJlcikgc3VjaCB0aGF0XG4vLyBuZWVkUmVhZGFibGUgd2FzIHNldCwgdGhlbiB3ZSBvdWdodCB0byBwdXNoIG1vcmUsIHNvIHRoYXQgYW5vdGhlclxuLy8gJ3JlYWRhYmxlJyBldmVudCB3aWxsIGJlIHRyaWdnZXJlZC5cbmZ1bmN0aW9uIG5lZWRNb3JlRGF0YShzdGF0ZSkge1xuICByZXR1cm4gIXN0YXRlLmVuZGVkICYmXG4gICAgICAgICAoc3RhdGUubmVlZFJlYWRhYmxlIHx8XG4gICAgICAgICAgc3RhdGUubGVuZ3RoIDwgc3RhdGUuaGlnaFdhdGVyTWFyayB8fFxuICAgICAgICAgIHN0YXRlLmxlbmd0aCA9PT0gMCk7XG59XG5cbi8vIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LlxuUmVhZGFibGUucHJvdG90eXBlLnNldEVuY29kaW5nID0gZnVuY3Rpb24oZW5jKSB7XG4gIGlmICghU3RyaW5nRGVjb2RlcilcbiAgICBTdHJpbmdEZWNvZGVyID0gcmVxdWlyZSgnc3RyaW5nX2RlY29kZXIvJykuU3RyaW5nRGVjb2RlcjtcbiAgdGhpcy5fcmVhZGFibGVTdGF0ZS5kZWNvZGVyID0gbmV3IFN0cmluZ0RlY29kZXIoZW5jKTtcbiAgdGhpcy5fcmVhZGFibGVTdGF0ZS5lbmNvZGluZyA9IGVuYztcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vLyBEb24ndCByYWlzZSB0aGUgaHdtID4gOE1CXG52YXIgTUFYX0hXTSA9IDB4ODAwMDAwO1xuZnVuY3Rpb24gY29tcHV0ZU5ld0hpZ2hXYXRlck1hcmsobikge1xuICBpZiAobiA+PSBNQVhfSFdNKSB7XG4gICAgbiA9IE1BWF9IV007XG4gIH0gZWxzZSB7XG4gICAgLy8gR2V0IHRoZSBuZXh0IGhpZ2hlc3QgcG93ZXIgb2YgMlxuICAgIG4tLTtcbiAgICBuIHw9IG4gPj4+IDE7XG4gICAgbiB8PSBuID4+PiAyO1xuICAgIG4gfD0gbiA+Pj4gNDtcbiAgICBuIHw9IG4gPj4+IDg7XG4gICAgbiB8PSBuID4+PiAxNjtcbiAgICBuKys7XG4gIH1cbiAgcmV0dXJuIG47XG59XG5cbmZ1bmN0aW9uIGhvd011Y2hUb1JlYWQobiwgc3RhdGUpIHtcbiAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCAmJiBzdGF0ZS5lbmRlZClcbiAgICByZXR1cm4gMDtcblxuICBpZiAoc3RhdGUub2JqZWN0TW9kZSlcbiAgICByZXR1cm4gbiA9PT0gMCA/IDAgOiAxO1xuXG4gIGlmIChuID09PSBudWxsIHx8IGlzTmFOKG4pKSB7XG4gICAgLy8gb25seSBmbG93IG9uZSBidWZmZXIgYXQgYSB0aW1lXG4gICAgaWYgKHN0YXRlLmZsb3dpbmcgJiYgc3RhdGUuYnVmZmVyLmxlbmd0aClcbiAgICAgIHJldHVybiBzdGF0ZS5idWZmZXJbMF0ubGVuZ3RoO1xuICAgIGVsc2VcbiAgICAgIHJldHVybiBzdGF0ZS5sZW5ndGg7XG4gIH1cblxuICBpZiAobiA8PSAwKVxuICAgIHJldHVybiAwO1xuXG4gIC8vIElmIHdlJ3JlIGFza2luZyBmb3IgbW9yZSB0aGFuIHRoZSB0YXJnZXQgYnVmZmVyIGxldmVsLFxuICAvLyB0aGVuIHJhaXNlIHRoZSB3YXRlciBtYXJrLiAgQnVtcCB1cCB0byB0aGUgbmV4dCBoaWdoZXN0XG4gIC8vIHBvd2VyIG9mIDIsIHRvIHByZXZlbnQgaW5jcmVhc2luZyBpdCBleGNlc3NpdmVseSBpbiB0aW55XG4gIC8vIGFtb3VudHMuXG4gIGlmIChuID4gc3RhdGUuaGlnaFdhdGVyTWFyaylcbiAgICBzdGF0ZS5oaWdoV2F0ZXJNYXJrID0gY29tcHV0ZU5ld0hpZ2hXYXRlck1hcmsobik7XG5cbiAgLy8gZG9uJ3QgaGF2ZSB0aGF0IG11Y2guICByZXR1cm4gbnVsbCwgdW5sZXNzIHdlJ3ZlIGVuZGVkLlxuICBpZiAobiA+IHN0YXRlLmxlbmd0aCkge1xuICAgIGlmICghc3RhdGUuZW5kZWQpIHtcbiAgICAgIHN0YXRlLm5lZWRSZWFkYWJsZSA9IHRydWU7XG4gICAgICByZXR1cm4gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHN0YXRlLmxlbmd0aDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbjtcbn1cblxuLy8geW91IGNhbiBvdmVycmlkZSBlaXRoZXIgdGhpcyBtZXRob2QsIG9yIHRoZSBhc3luYyBfcmVhZChuKSBiZWxvdy5cblJlYWRhYmxlLnByb3RvdHlwZS5yZWFkID0gZnVuY3Rpb24obikge1xuICBkZWJ1ZygncmVhZCcsIG4pO1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICB2YXIgbk9yaWcgPSBuO1xuXG4gIGlmICh0eXBlb2YgbiAhPT0gJ251bWJlcicgfHwgbiA+IDApXG4gICAgc3RhdGUuZW1pdHRlZFJlYWRhYmxlID0gZmFsc2U7XG5cbiAgLy8gaWYgd2UncmUgZG9pbmcgcmVhZCgwKSB0byB0cmlnZ2VyIGEgcmVhZGFibGUgZXZlbnQsIGJ1dCB3ZVxuICAvLyBhbHJlYWR5IGhhdmUgYSBidW5jaCBvZiBkYXRhIGluIHRoZSBidWZmZXIsIHRoZW4ganVzdCB0cmlnZ2VyXG4gIC8vIHRoZSAncmVhZGFibGUnIGV2ZW50IGFuZCBtb3ZlIG9uLlxuICBpZiAobiA9PT0gMCAmJlxuICAgICAgc3RhdGUubmVlZFJlYWRhYmxlICYmXG4gICAgICAoc3RhdGUubGVuZ3RoID49IHN0YXRlLmhpZ2hXYXRlck1hcmsgfHwgc3RhdGUuZW5kZWQpKSB7XG4gICAgZGVidWcoJ3JlYWQ6IGVtaXRSZWFkYWJsZScsIHN0YXRlLmxlbmd0aCwgc3RhdGUuZW5kZWQpO1xuICAgIGlmIChzdGF0ZS5sZW5ndGggPT09IDAgJiYgc3RhdGUuZW5kZWQpXG4gICAgICBlbmRSZWFkYWJsZSh0aGlzKTtcbiAgICBlbHNlXG4gICAgICBlbWl0UmVhZGFibGUodGhpcyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBuID0gaG93TXVjaFRvUmVhZChuLCBzdGF0ZSk7XG5cbiAgLy8gaWYgd2UndmUgZW5kZWQsIGFuZCB3ZSdyZSBub3cgY2xlYXIsIHRoZW4gZmluaXNoIGl0IHVwLlxuICBpZiAobiA9PT0gMCAmJiBzdGF0ZS5lbmRlZCkge1xuICAgIGlmIChzdGF0ZS5sZW5ndGggPT09IDApXG4gICAgICBlbmRSZWFkYWJsZSh0aGlzKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8vIEFsbCB0aGUgYWN0dWFsIGNodW5rIGdlbmVyYXRpb24gbG9naWMgbmVlZHMgdG8gYmVcbiAgLy8gKmJlbG93KiB0aGUgY2FsbCB0byBfcmVhZC4gIFRoZSByZWFzb24gaXMgdGhhdCBpbiBjZXJ0YWluXG4gIC8vIHN5bnRoZXRpYyBzdHJlYW0gY2FzZXMsIHN1Y2ggYXMgcGFzc3Rocm91Z2ggc3RyZWFtcywgX3JlYWRcbiAgLy8gbWF5IGJlIGEgY29tcGxldGVseSBzeW5jaHJvbm91cyBvcGVyYXRpb24gd2hpY2ggbWF5IGNoYW5nZVxuICAvLyB0aGUgc3RhdGUgb2YgdGhlIHJlYWQgYnVmZmVyLCBwcm92aWRpbmcgZW5vdWdoIGRhdGEgd2hlblxuICAvLyBiZWZvcmUgdGhlcmUgd2FzICpub3QqIGVub3VnaC5cbiAgLy9cbiAgLy8gU28sIHRoZSBzdGVwcyBhcmU6XG4gIC8vIDEuIEZpZ3VyZSBvdXQgd2hhdCB0aGUgc3RhdGUgb2YgdGhpbmdzIHdpbGwgYmUgYWZ0ZXIgd2UgZG9cbiAgLy8gYSByZWFkIGZyb20gdGhlIGJ1ZmZlci5cbiAgLy9cbiAgLy8gMi4gSWYgdGhhdCByZXN1bHRpbmcgc3RhdGUgd2lsbCB0cmlnZ2VyIGEgX3JlYWQsIHRoZW4gY2FsbCBfcmVhZC5cbiAgLy8gTm90ZSB0aGF0IHRoaXMgbWF5IGJlIGFzeW5jaHJvbm91cywgb3Igc3luY2hyb25vdXMuICBZZXMsIGl0IGlzXG4gIC8vIGRlZXBseSB1Z2x5IHRvIHdyaXRlIEFQSXMgdGhpcyB3YXksIGJ1dCB0aGF0IHN0aWxsIGRvZXNuJ3QgbWVhblxuICAvLyB0aGF0IHRoZSBSZWFkYWJsZSBjbGFzcyBzaG91bGQgYmVoYXZlIGltcHJvcGVybHksIGFzIHN0cmVhbXMgYXJlXG4gIC8vIGRlc2lnbmVkIHRvIGJlIHN5bmMvYXN5bmMgYWdub3N0aWMuXG4gIC8vIFRha2Ugbm90ZSBpZiB0aGUgX3JlYWQgY2FsbCBpcyBzeW5jIG9yIGFzeW5jIChpZSwgaWYgdGhlIHJlYWQgY2FsbFxuICAvLyBoYXMgcmV0dXJuZWQgeWV0KSwgc28gdGhhdCB3ZSBrbm93IHdoZXRoZXIgb3Igbm90IGl0J3Mgc2FmZSB0byBlbWl0XG4gIC8vICdyZWFkYWJsZScgZXRjLlxuICAvL1xuICAvLyAzLiBBY3R1YWxseSBwdWxsIHRoZSByZXF1ZXN0ZWQgY2h1bmtzIG91dCBvZiB0aGUgYnVmZmVyIGFuZCByZXR1cm4uXG5cbiAgLy8gaWYgd2UgbmVlZCBhIHJlYWRhYmxlIGV2ZW50LCB0aGVuIHdlIG5lZWQgdG8gZG8gc29tZSByZWFkaW5nLlxuICB2YXIgZG9SZWFkID0gc3RhdGUubmVlZFJlYWRhYmxlO1xuICBkZWJ1ZygnbmVlZCByZWFkYWJsZScsIGRvUmVhZCk7XG5cbiAgLy8gaWYgd2UgY3VycmVudGx5IGhhdmUgbGVzcyB0aGFuIHRoZSBoaWdoV2F0ZXJNYXJrLCB0aGVuIGFsc28gcmVhZCBzb21lXG4gIGlmIChzdGF0ZS5sZW5ndGggPT09IDAgfHwgc3RhdGUubGVuZ3RoIC0gbiA8IHN0YXRlLmhpZ2hXYXRlck1hcmspIHtcbiAgICBkb1JlYWQgPSB0cnVlO1xuICAgIGRlYnVnKCdsZW5ndGggbGVzcyB0aGFuIHdhdGVybWFyaycsIGRvUmVhZCk7XG4gIH1cblxuICAvLyBob3dldmVyLCBpZiB3ZSd2ZSBlbmRlZCwgdGhlbiB0aGVyZSdzIG5vIHBvaW50LCBhbmQgaWYgd2UncmUgYWxyZWFkeVxuICAvLyByZWFkaW5nLCB0aGVuIGl0J3MgdW5uZWNlc3NhcnkuXG4gIGlmIChzdGF0ZS5lbmRlZCB8fCBzdGF0ZS5yZWFkaW5nKSB7XG4gICAgZG9SZWFkID0gZmFsc2U7XG4gICAgZGVidWcoJ3JlYWRpbmcgb3IgZW5kZWQnLCBkb1JlYWQpO1xuICB9XG5cbiAgaWYgKGRvUmVhZCkge1xuICAgIGRlYnVnKCdkbyByZWFkJyk7XG4gICAgc3RhdGUucmVhZGluZyA9IHRydWU7XG4gICAgc3RhdGUuc3luYyA9IHRydWU7XG4gICAgLy8gaWYgdGhlIGxlbmd0aCBpcyBjdXJyZW50bHkgemVybywgdGhlbiB3ZSAqbmVlZCogYSByZWFkYWJsZSBldmVudC5cbiAgICBpZiAoc3RhdGUubGVuZ3RoID09PSAwKVxuICAgICAgc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICAvLyBjYWxsIGludGVybmFsIHJlYWQgbWV0aG9kXG4gICAgdGhpcy5fcmVhZChzdGF0ZS5oaWdoV2F0ZXJNYXJrKTtcbiAgICBzdGF0ZS5zeW5jID0gZmFsc2U7XG4gIH1cblxuICAvLyBJZiBfcmVhZCBwdXNoZWQgZGF0YSBzeW5jaHJvbm91c2x5LCB0aGVuIGByZWFkaW5nYCB3aWxsIGJlIGZhbHNlLFxuICAvLyBhbmQgd2UgbmVlZCB0byByZS1ldmFsdWF0ZSBob3cgbXVjaCBkYXRhIHdlIGNhbiByZXR1cm4gdG8gdGhlIHVzZXIuXG4gIGlmIChkb1JlYWQgJiYgIXN0YXRlLnJlYWRpbmcpXG4gICAgbiA9IGhvd011Y2hUb1JlYWQobk9yaWcsIHN0YXRlKTtcblxuICB2YXIgcmV0O1xuICBpZiAobiA+IDApXG4gICAgcmV0ID0gZnJvbUxpc3Qobiwgc3RhdGUpO1xuICBlbHNlXG4gICAgcmV0ID0gbnVsbDtcblxuICBpZiAocmV0ID09PSBudWxsKSB7XG4gICAgc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICBuID0gMDtcbiAgfVxuXG4gIHN0YXRlLmxlbmd0aCAtPSBuO1xuXG4gIC8vIElmIHdlIGhhdmUgbm90aGluZyBpbiB0aGUgYnVmZmVyLCB0aGVuIHdlIHdhbnQgdG8ga25vd1xuICAvLyBhcyBzb29uIGFzIHdlICpkbyogZ2V0IHNvbWV0aGluZyBpbnRvIHRoZSBidWZmZXIuXG4gIGlmIChzdGF0ZS5sZW5ndGggPT09IDAgJiYgIXN0YXRlLmVuZGVkKVxuICAgIHN0YXRlLm5lZWRSZWFkYWJsZSA9IHRydWU7XG5cbiAgLy8gSWYgd2UgdHJpZWQgdG8gcmVhZCgpIHBhc3QgdGhlIEVPRiwgdGhlbiBlbWl0IGVuZCBvbiB0aGUgbmV4dCB0aWNrLlxuICBpZiAobk9yaWcgIT09IG4gJiYgc3RhdGUuZW5kZWQgJiYgc3RhdGUubGVuZ3RoID09PSAwKVxuICAgIGVuZFJlYWRhYmxlKHRoaXMpO1xuXG4gIGlmIChyZXQgIT09IG51bGwpXG4gICAgdGhpcy5lbWl0KCdkYXRhJywgcmV0KTtcblxuICByZXR1cm4gcmV0O1xufTtcblxuZnVuY3Rpb24gY2h1bmtJbnZhbGlkKHN0YXRlLCBjaHVuaykge1xuICB2YXIgZXIgPSBudWxsO1xuICBpZiAoIShCdWZmZXIuaXNCdWZmZXIoY2h1bmspKSAmJlxuICAgICAgdHlwZW9mIGNodW5rICE9PSAnc3RyaW5nJyAmJlxuICAgICAgY2h1bmsgIT09IG51bGwgJiZcbiAgICAgIGNodW5rICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICFzdGF0ZS5vYmplY3RNb2RlKSB7XG4gICAgZXIgPSBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIG5vbi1zdHJpbmcvYnVmZmVyIGNodW5rJyk7XG4gIH1cbiAgcmV0dXJuIGVyO1xufVxuXG5cbmZ1bmN0aW9uIG9uRW9mQ2h1bmsoc3RyZWFtLCBzdGF0ZSkge1xuICBpZiAoc3RhdGUuZW5kZWQpIHJldHVybjtcbiAgaWYgKHN0YXRlLmRlY29kZXIpIHtcbiAgICB2YXIgY2h1bmsgPSBzdGF0ZS5kZWNvZGVyLmVuZCgpO1xuICAgIGlmIChjaHVuayAmJiBjaHVuay5sZW5ndGgpIHtcbiAgICAgIHN0YXRlLmJ1ZmZlci5wdXNoKGNodW5rKTtcbiAgICAgIHN0YXRlLmxlbmd0aCArPSBzdGF0ZS5vYmplY3RNb2RlID8gMSA6IGNodW5rLmxlbmd0aDtcbiAgICB9XG4gIH1cbiAgc3RhdGUuZW5kZWQgPSB0cnVlO1xuXG4gIC8vIGVtaXQgJ3JlYWRhYmxlJyBub3cgdG8gbWFrZSBzdXJlIGl0IGdldHMgcGlja2VkIHVwLlxuICBlbWl0UmVhZGFibGUoc3RyZWFtKTtcbn1cblxuLy8gRG9uJ3QgZW1pdCByZWFkYWJsZSByaWdodCBhd2F5IGluIHN5bmMgbW9kZSwgYmVjYXVzZSB0aGlzIGNhbiB0cmlnZ2VyXG4vLyBhbm90aGVyIHJlYWQoKSBjYWxsID0+IHN0YWNrIG92ZXJmbG93LiAgVGhpcyB3YXksIGl0IG1pZ2h0IHRyaWdnZXJcbi8vIGEgbmV4dFRpY2sgcmVjdXJzaW9uIHdhcm5pbmcsIGJ1dCB0aGF0J3Mgbm90IHNvIGJhZC5cbmZ1bmN0aW9uIGVtaXRSZWFkYWJsZShzdHJlYW0pIHtcbiAgdmFyIHN0YXRlID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlO1xuICBzdGF0ZS5uZWVkUmVhZGFibGUgPSBmYWxzZTtcbiAgaWYgKCFzdGF0ZS5lbWl0dGVkUmVhZGFibGUpIHtcbiAgICBkZWJ1ZygnZW1pdFJlYWRhYmxlJywgc3RhdGUuZmxvd2luZyk7XG4gICAgc3RhdGUuZW1pdHRlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICBpZiAoc3RhdGUuc3luYylcbiAgICAgIHByb2Nlc3NOZXh0VGljayhlbWl0UmVhZGFibGVfLCBzdHJlYW0pO1xuICAgIGVsc2VcbiAgICAgIGVtaXRSZWFkYWJsZV8oc3RyZWFtKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBlbWl0UmVhZGFibGVfKHN0cmVhbSkge1xuICBkZWJ1ZygnZW1pdCByZWFkYWJsZScpO1xuICBzdHJlYW0uZW1pdCgncmVhZGFibGUnKTtcbiAgZmxvdyhzdHJlYW0pO1xufVxuXG5cbi8vIGF0IHRoaXMgcG9pbnQsIHRoZSB1c2VyIGhhcyBwcmVzdW1hYmx5IHNlZW4gdGhlICdyZWFkYWJsZScgZXZlbnQsXG4vLyBhbmQgY2FsbGVkIHJlYWQoKSB0byBjb25zdW1lIHNvbWUgZGF0YS4gIHRoYXQgbWF5IGhhdmUgdHJpZ2dlcmVkXG4vLyBpbiB0dXJuIGFub3RoZXIgX3JlYWQobikgY2FsbCwgaW4gd2hpY2ggY2FzZSByZWFkaW5nID0gdHJ1ZSBpZlxuLy8gaXQncyBpbiBwcm9ncmVzcy5cbi8vIEhvd2V2ZXIsIGlmIHdlJ3JlIG5vdCBlbmRlZCwgb3IgcmVhZGluZywgYW5kIHRoZSBsZW5ndGggPCBod20sXG4vLyB0aGVuIGdvIGFoZWFkIGFuZCB0cnkgdG8gcmVhZCBzb21lIG1vcmUgcHJlZW1wdGl2ZWx5LlxuZnVuY3Rpb24gbWF5YmVSZWFkTW9yZShzdHJlYW0sIHN0YXRlKSB7XG4gIGlmICghc3RhdGUucmVhZGluZ01vcmUpIHtcbiAgICBzdGF0ZS5yZWFkaW5nTW9yZSA9IHRydWU7XG4gICAgcHJvY2Vzc05leHRUaWNrKG1heWJlUmVhZE1vcmVfLCBzdHJlYW0sIHN0YXRlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBtYXliZVJlYWRNb3JlXyhzdHJlYW0sIHN0YXRlKSB7XG4gIHZhciBsZW4gPSBzdGF0ZS5sZW5ndGg7XG4gIHdoaWxlICghc3RhdGUucmVhZGluZyAmJiAhc3RhdGUuZmxvd2luZyAmJiAhc3RhdGUuZW5kZWQgJiZcbiAgICAgICAgIHN0YXRlLmxlbmd0aCA8IHN0YXRlLmhpZ2hXYXRlck1hcmspIHtcbiAgICBkZWJ1ZygnbWF5YmVSZWFkTW9yZSByZWFkIDAnKTtcbiAgICBzdHJlYW0ucmVhZCgwKTtcbiAgICBpZiAobGVuID09PSBzdGF0ZS5sZW5ndGgpXG4gICAgICAvLyBkaWRuJ3QgZ2V0IGFueSBkYXRhLCBzdG9wIHNwaW5uaW5nLlxuICAgICAgYnJlYWs7XG4gICAgZWxzZVxuICAgICAgbGVuID0gc3RhdGUubGVuZ3RoO1xuICB9XG4gIHN0YXRlLnJlYWRpbmdNb3JlID0gZmFsc2U7XG59XG5cbi8vIGFic3RyYWN0IG1ldGhvZC4gIHRvIGJlIG92ZXJyaWRkZW4gaW4gc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gY2xhc3Nlcy5cbi8vIGNhbGwgY2IoZXIsIGRhdGEpIHdoZXJlIGRhdGEgaXMgPD0gbiBpbiBsZW5ndGguXG4vLyBmb3IgdmlydHVhbCAobm9uLXN0cmluZywgbm9uLWJ1ZmZlcikgc3RyZWFtcywgXCJsZW5ndGhcIiBpcyBzb21ld2hhdFxuLy8gYXJiaXRyYXJ5LCBhbmQgcGVyaGFwcyBub3QgdmVyeSBtZWFuaW5nZnVsLlxuUmVhZGFibGUucHJvdG90eXBlLl9yZWFkID0gZnVuY3Rpb24obikge1xuICB0aGlzLmVtaXQoJ2Vycm9yJywgbmV3IEVycm9yKCdub3QgaW1wbGVtZW50ZWQnKSk7XG59O1xuXG5SZWFkYWJsZS5wcm90b3R5cGUucGlwZSA9IGZ1bmN0aW9uKGRlc3QsIHBpcGVPcHRzKSB7XG4gIHZhciBzcmMgPSB0aGlzO1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuXG4gIHN3aXRjaCAoc3RhdGUucGlwZXNDb3VudCkge1xuICAgIGNhc2UgMDpcbiAgICAgIHN0YXRlLnBpcGVzID0gZGVzdDtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMTpcbiAgICAgIHN0YXRlLnBpcGVzID0gW3N0YXRlLnBpcGVzLCBkZXN0XTtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICBzdGF0ZS5waXBlcy5wdXNoKGRlc3QpO1xuICAgICAgYnJlYWs7XG4gIH1cbiAgc3RhdGUucGlwZXNDb3VudCArPSAxO1xuICBkZWJ1ZygncGlwZSBjb3VudD0lZCBvcHRzPSVqJywgc3RhdGUucGlwZXNDb3VudCwgcGlwZU9wdHMpO1xuXG4gIHZhciBkb0VuZCA9ICghcGlwZU9wdHMgfHwgcGlwZU9wdHMuZW5kICE9PSBmYWxzZSkgJiZcbiAgICAgICAgICAgICAgZGVzdCAhPT0gcHJvY2Vzcy5zdGRvdXQgJiZcbiAgICAgICAgICAgICAgZGVzdCAhPT0gcHJvY2Vzcy5zdGRlcnI7XG5cbiAgdmFyIGVuZEZuID0gZG9FbmQgPyBvbmVuZCA6IGNsZWFudXA7XG4gIGlmIChzdGF0ZS5lbmRFbWl0dGVkKVxuICAgIHByb2Nlc3NOZXh0VGljayhlbmRGbik7XG4gIGVsc2VcbiAgICBzcmMub25jZSgnZW5kJywgZW5kRm4pO1xuXG4gIGRlc3Qub24oJ3VucGlwZScsIG9udW5waXBlKTtcbiAgZnVuY3Rpb24gb251bnBpcGUocmVhZGFibGUpIHtcbiAgICBkZWJ1Zygnb251bnBpcGUnKTtcbiAgICBpZiAocmVhZGFibGUgPT09IHNyYykge1xuICAgICAgY2xlYW51cCgpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG9uZW5kKCkge1xuICAgIGRlYnVnKCdvbmVuZCcpO1xuICAgIGRlc3QuZW5kKCk7XG4gIH1cblxuICAvLyB3aGVuIHRoZSBkZXN0IGRyYWlucywgaXQgcmVkdWNlcyB0aGUgYXdhaXREcmFpbiBjb3VudGVyXG4gIC8vIG9uIHRoZSBzb3VyY2UuICBUaGlzIHdvdWxkIGJlIG1vcmUgZWxlZ2FudCB3aXRoIGEgLm9uY2UoKVxuICAvLyBoYW5kbGVyIGluIGZsb3coKSwgYnV0IGFkZGluZyBhbmQgcmVtb3ZpbmcgcmVwZWF0ZWRseSBpc1xuICAvLyB0b28gc2xvdy5cbiAgdmFyIG9uZHJhaW4gPSBwaXBlT25EcmFpbihzcmMpO1xuICBkZXN0Lm9uKCdkcmFpbicsIG9uZHJhaW4pO1xuXG4gIHZhciBjbGVhbmVkVXAgPSBmYWxzZTtcbiAgZnVuY3Rpb24gY2xlYW51cCgpIHtcbiAgICBkZWJ1ZygnY2xlYW51cCcpO1xuICAgIC8vIGNsZWFudXAgZXZlbnQgaGFuZGxlcnMgb25jZSB0aGUgcGlwZSBpcyBicm9rZW5cbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdjbG9zZScsIG9uY2xvc2UpO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2ZpbmlzaCcsIG9uZmluaXNoKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdkcmFpbicsIG9uZHJhaW4pO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgb25lcnJvcik7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcigndW5waXBlJywgb251bnBpcGUpO1xuICAgIHNyYy5yZW1vdmVMaXN0ZW5lcignZW5kJywgb25lbmQpO1xuICAgIHNyYy5yZW1vdmVMaXN0ZW5lcignZW5kJywgY2xlYW51cCk7XG4gICAgc3JjLnJlbW92ZUxpc3RlbmVyKCdkYXRhJywgb25kYXRhKTtcblxuICAgIGNsZWFuZWRVcCA9IHRydWU7XG5cbiAgICAvLyBpZiB0aGUgcmVhZGVyIGlzIHdhaXRpbmcgZm9yIGEgZHJhaW4gZXZlbnQgZnJvbSB0aGlzXG4gICAgLy8gc3BlY2lmaWMgd3JpdGVyLCB0aGVuIGl0IHdvdWxkIGNhdXNlIGl0IHRvIG5ldmVyIHN0YXJ0XG4gICAgLy8gZmxvd2luZyBhZ2Fpbi5cbiAgICAvLyBTbywgaWYgdGhpcyBpcyBhd2FpdGluZyBhIGRyYWluLCB0aGVuIHdlIGp1c3QgY2FsbCBpdCBub3cuXG4gICAgLy8gSWYgd2UgZG9uJ3Qga25vdywgdGhlbiBhc3N1bWUgdGhhdCB3ZSBhcmUgd2FpdGluZyBmb3Igb25lLlxuICAgIGlmIChzdGF0ZS5hd2FpdERyYWluICYmXG4gICAgICAgICghZGVzdC5fd3JpdGFibGVTdGF0ZSB8fCBkZXN0Ll93cml0YWJsZVN0YXRlLm5lZWREcmFpbikpXG4gICAgICBvbmRyYWluKCk7XG4gIH1cblxuICBzcmMub24oJ2RhdGEnLCBvbmRhdGEpO1xuICBmdW5jdGlvbiBvbmRhdGEoY2h1bmspIHtcbiAgICBkZWJ1Zygnb25kYXRhJyk7XG4gICAgdmFyIHJldCA9IGRlc3Qud3JpdGUoY2h1bmspO1xuICAgIGlmIChmYWxzZSA9PT0gcmV0KSB7XG4gICAgICAvLyBJZiB0aGUgdXNlciB1bnBpcGVkIGR1cmluZyBgZGVzdC53cml0ZSgpYCwgaXQgaXMgcG9zc2libGVcbiAgICAgIC8vIHRvIGdldCBzdHVjayBpbiBhIHBlcm1hbmVudGx5IHBhdXNlZCBzdGF0ZSBpZiB0aGF0IHdyaXRlXG4gICAgICAvLyBhbHNvIHJldHVybmVkIGZhbHNlLlxuICAgICAgaWYgKHN0YXRlLnBpcGVzQ291bnQgPT09IDEgJiZcbiAgICAgICAgICBzdGF0ZS5waXBlc1swXSA9PT0gZGVzdCAmJlxuICAgICAgICAgIHNyYy5saXN0ZW5lckNvdW50KCdkYXRhJykgPT09IDEgJiZcbiAgICAgICAgICAhY2xlYW5lZFVwKSB7XG4gICAgICAgIGRlYnVnKCdmYWxzZSB3cml0ZSByZXNwb25zZSwgcGF1c2UnLCBzcmMuX3JlYWRhYmxlU3RhdGUuYXdhaXREcmFpbik7XG4gICAgICAgIHNyYy5fcmVhZGFibGVTdGF0ZS5hd2FpdERyYWluKys7XG4gICAgICB9XG4gICAgICBzcmMucGF1c2UoKTtcbiAgICB9XG4gIH1cblxuICAvLyBpZiB0aGUgZGVzdCBoYXMgYW4gZXJyb3IsIHRoZW4gc3RvcCBwaXBpbmcgaW50byBpdC5cbiAgLy8gaG93ZXZlciwgZG9uJ3Qgc3VwcHJlc3MgdGhlIHRocm93aW5nIGJlaGF2aW9yIGZvciB0aGlzLlxuICBmdW5jdGlvbiBvbmVycm9yKGVyKSB7XG4gICAgZGVidWcoJ29uZXJyb3InLCBlcik7XG4gICAgdW5waXBlKCk7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBvbmVycm9yKTtcbiAgICBpZiAoRUVsaXN0ZW5lckNvdW50KGRlc3QsICdlcnJvcicpID09PSAwKVxuICAgICAgZGVzdC5lbWl0KCdlcnJvcicsIGVyKTtcbiAgfVxuICAvLyBUaGlzIGlzIGEgYnJ1dGFsbHkgdWdseSBoYWNrIHRvIG1ha2Ugc3VyZSB0aGF0IG91ciBlcnJvciBoYW5kbGVyXG4gIC8vIGlzIGF0dGFjaGVkIGJlZm9yZSBhbnkgdXNlcmxhbmQgb25lcy4gIE5FVkVSIERPIFRISVMuXG4gIGlmICghZGVzdC5fZXZlbnRzIHx8ICFkZXN0Ll9ldmVudHMuZXJyb3IpXG4gICAgZGVzdC5vbignZXJyb3InLCBvbmVycm9yKTtcbiAgZWxzZSBpZiAoaXNBcnJheShkZXN0Ll9ldmVudHMuZXJyb3IpKVxuICAgIGRlc3QuX2V2ZW50cy5lcnJvci51bnNoaWZ0KG9uZXJyb3IpO1xuICBlbHNlXG4gICAgZGVzdC5fZXZlbnRzLmVycm9yID0gW29uZXJyb3IsIGRlc3QuX2V2ZW50cy5lcnJvcl07XG5cblxuICAvLyBCb3RoIGNsb3NlIGFuZCBmaW5pc2ggc2hvdWxkIHRyaWdnZXIgdW5waXBlLCBidXQgb25seSBvbmNlLlxuICBmdW5jdGlvbiBvbmNsb3NlKCkge1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2ZpbmlzaCcsIG9uZmluaXNoKTtcbiAgICB1bnBpcGUoKTtcbiAgfVxuICBkZXN0Lm9uY2UoJ2Nsb3NlJywgb25jbG9zZSk7XG4gIGZ1bmN0aW9uIG9uZmluaXNoKCkge1xuICAgIGRlYnVnKCdvbmZpbmlzaCcpO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2Nsb3NlJywgb25jbG9zZSk7XG4gICAgdW5waXBlKCk7XG4gIH1cbiAgZGVzdC5vbmNlKCdmaW5pc2gnLCBvbmZpbmlzaCk7XG5cbiAgZnVuY3Rpb24gdW5waXBlKCkge1xuICAgIGRlYnVnKCd1bnBpcGUnKTtcbiAgICBzcmMudW5waXBlKGRlc3QpO1xuICB9XG5cbiAgLy8gdGVsbCB0aGUgZGVzdCB0aGF0IGl0J3MgYmVpbmcgcGlwZWQgdG9cbiAgZGVzdC5lbWl0KCdwaXBlJywgc3JjKTtcblxuICAvLyBzdGFydCB0aGUgZmxvdyBpZiBpdCBoYXNuJ3QgYmVlbiBzdGFydGVkIGFscmVhZHkuXG4gIGlmICghc3RhdGUuZmxvd2luZykge1xuICAgIGRlYnVnKCdwaXBlIHJlc3VtZScpO1xuICAgIHNyYy5yZXN1bWUoKTtcbiAgfVxuXG4gIHJldHVybiBkZXN0O1xufTtcblxuZnVuY3Rpb24gcGlwZU9uRHJhaW4oc3JjKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc3RhdGUgPSBzcmMuX3JlYWRhYmxlU3RhdGU7XG4gICAgZGVidWcoJ3BpcGVPbkRyYWluJywgc3RhdGUuYXdhaXREcmFpbik7XG4gICAgaWYgKHN0YXRlLmF3YWl0RHJhaW4pXG4gICAgICBzdGF0ZS5hd2FpdERyYWluLS07XG4gICAgaWYgKHN0YXRlLmF3YWl0RHJhaW4gPT09IDAgJiYgRUVsaXN0ZW5lckNvdW50KHNyYywgJ2RhdGEnKSkge1xuICAgICAgc3RhdGUuZmxvd2luZyA9IHRydWU7XG4gICAgICBmbG93KHNyYyk7XG4gICAgfVxuICB9O1xufVxuXG5cblJlYWRhYmxlLnByb3RvdHlwZS51bnBpcGUgPSBmdW5jdGlvbihkZXN0KSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG5cbiAgLy8gaWYgd2UncmUgbm90IHBpcGluZyBhbnl3aGVyZSwgdGhlbiBkbyBub3RoaW5nLlxuICBpZiAoc3RhdGUucGlwZXNDb3VudCA9PT0gMClcbiAgICByZXR1cm4gdGhpcztcblxuICAvLyBqdXN0IG9uZSBkZXN0aW5hdGlvbi4gIG1vc3QgY29tbW9uIGNhc2UuXG4gIGlmIChzdGF0ZS5waXBlc0NvdW50ID09PSAxKSB7XG4gICAgLy8gcGFzc2VkIGluIG9uZSwgYnV0IGl0J3Mgbm90IHRoZSByaWdodCBvbmUuXG4gICAgaWYgKGRlc3QgJiYgZGVzdCAhPT0gc3RhdGUucGlwZXMpXG4gICAgICByZXR1cm4gdGhpcztcblxuICAgIGlmICghZGVzdClcbiAgICAgIGRlc3QgPSBzdGF0ZS5waXBlcztcblxuICAgIC8vIGdvdCBhIG1hdGNoLlxuICAgIHN0YXRlLnBpcGVzID0gbnVsbDtcbiAgICBzdGF0ZS5waXBlc0NvdW50ID0gMDtcbiAgICBzdGF0ZS5mbG93aW5nID0gZmFsc2U7XG4gICAgaWYgKGRlc3QpXG4gICAgICBkZXN0LmVtaXQoJ3VucGlwZScsIHRoaXMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gc2xvdyBjYXNlLiBtdWx0aXBsZSBwaXBlIGRlc3RpbmF0aW9ucy5cblxuICBpZiAoIWRlc3QpIHtcbiAgICAvLyByZW1vdmUgYWxsLlxuICAgIHZhciBkZXN0cyA9IHN0YXRlLnBpcGVzO1xuICAgIHZhciBsZW4gPSBzdGF0ZS5waXBlc0NvdW50O1xuICAgIHN0YXRlLnBpcGVzID0gbnVsbDtcbiAgICBzdGF0ZS5waXBlc0NvdW50ID0gMDtcbiAgICBzdGF0ZS5mbG93aW5nID0gZmFsc2U7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKVxuICAgICAgZGVzdHNbaV0uZW1pdCgndW5waXBlJywgdGhpcyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyB0cnkgdG8gZmluZCB0aGUgcmlnaHQgb25lLlxuICB2YXIgaSA9IGluZGV4T2Yoc3RhdGUucGlwZXMsIGRlc3QpO1xuICBpZiAoaSA9PT0gLTEpXG4gICAgcmV0dXJuIHRoaXM7XG5cbiAgc3RhdGUucGlwZXMuc3BsaWNlKGksIDEpO1xuICBzdGF0ZS5waXBlc0NvdW50IC09IDE7XG4gIGlmIChzdGF0ZS5waXBlc0NvdW50ID09PSAxKVxuICAgIHN0YXRlLnBpcGVzID0gc3RhdGUucGlwZXNbMF07XG5cbiAgZGVzdC5lbWl0KCd1bnBpcGUnLCB0aGlzKTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbi8vIHNldCB1cCBkYXRhIGV2ZW50cyBpZiB0aGV5IGFyZSBhc2tlZCBmb3Jcbi8vIEVuc3VyZSByZWFkYWJsZSBsaXN0ZW5lcnMgZXZlbnR1YWxseSBnZXQgc29tZXRoaW5nXG5SZWFkYWJsZS5wcm90b3R5cGUub24gPSBmdW5jdGlvbihldiwgZm4pIHtcbiAgdmFyIHJlcyA9IFN0cmVhbS5wcm90b3R5cGUub24uY2FsbCh0aGlzLCBldiwgZm4pO1xuXG4gIC8vIElmIGxpc3RlbmluZyB0byBkYXRhLCBhbmQgaXQgaGFzIG5vdCBleHBsaWNpdGx5IGJlZW4gcGF1c2VkLFxuICAvLyB0aGVuIGNhbGwgcmVzdW1lIHRvIHN0YXJ0IHRoZSBmbG93IG9mIGRhdGEgb24gdGhlIG5leHQgdGljay5cbiAgaWYgKGV2ID09PSAnZGF0YScgJiYgZmFsc2UgIT09IHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZykge1xuICAgIHRoaXMucmVzdW1lKCk7XG4gIH1cblxuICBpZiAoZXYgPT09ICdyZWFkYWJsZScgJiYgdGhpcy5yZWFkYWJsZSkge1xuICAgIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gICAgaWYgKCFzdGF0ZS5yZWFkYWJsZUxpc3RlbmluZykge1xuICAgICAgc3RhdGUucmVhZGFibGVMaXN0ZW5pbmcgPSB0cnVlO1xuICAgICAgc3RhdGUuZW1pdHRlZFJlYWRhYmxlID0gZmFsc2U7XG4gICAgICBzdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlO1xuICAgICAgaWYgKCFzdGF0ZS5yZWFkaW5nKSB7XG4gICAgICAgIHByb2Nlc3NOZXh0VGljayhuUmVhZGluZ05leHRUaWNrLCB0aGlzKTtcbiAgICAgIH0gZWxzZSBpZiAoc3RhdGUubGVuZ3RoKSB7XG4gICAgICAgIGVtaXRSZWFkYWJsZSh0aGlzLCBzdGF0ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlcztcbn07XG5SZWFkYWJsZS5wcm90b3R5cGUuYWRkTGlzdGVuZXIgPSBSZWFkYWJsZS5wcm90b3R5cGUub247XG5cbmZ1bmN0aW9uIG5SZWFkaW5nTmV4dFRpY2soc2VsZikge1xuICBkZWJ1ZygncmVhZGFibGUgbmV4dHRpY2sgcmVhZCAwJyk7XG4gIHNlbGYucmVhZCgwKTtcbn1cblxuLy8gcGF1c2UoKSBhbmQgcmVzdW1lKCkgYXJlIHJlbW5hbnRzIG9mIHRoZSBsZWdhY3kgcmVhZGFibGUgc3RyZWFtIEFQSVxuLy8gSWYgdGhlIHVzZXIgdXNlcyB0aGVtLCB0aGVuIHN3aXRjaCBpbnRvIG9sZCBtb2RlLlxuUmVhZGFibGUucHJvdG90eXBlLnJlc3VtZSA9IGZ1bmN0aW9uKCkge1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICBpZiAoIXN0YXRlLmZsb3dpbmcpIHtcbiAgICBkZWJ1ZygncmVzdW1lJyk7XG4gICAgc3RhdGUuZmxvd2luZyA9IHRydWU7XG4gICAgcmVzdW1lKHRoaXMsIHN0YXRlKTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG5cbmZ1bmN0aW9uIHJlc3VtZShzdHJlYW0sIHN0YXRlKSB7XG4gIGlmICghc3RhdGUucmVzdW1lU2NoZWR1bGVkKSB7XG4gICAgc3RhdGUucmVzdW1lU2NoZWR1bGVkID0gdHJ1ZTtcbiAgICBwcm9jZXNzTmV4dFRpY2socmVzdW1lXywgc3RyZWFtLCBzdGF0ZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzdW1lXyhzdHJlYW0sIHN0YXRlKSB7XG4gIGlmICghc3RhdGUucmVhZGluZykge1xuICAgIGRlYnVnKCdyZXN1bWUgcmVhZCAwJyk7XG4gICAgc3RyZWFtLnJlYWQoMCk7XG4gIH1cblxuICBzdGF0ZS5yZXN1bWVTY2hlZHVsZWQgPSBmYWxzZTtcbiAgc3RyZWFtLmVtaXQoJ3Jlc3VtZScpO1xuICBmbG93KHN0cmVhbSk7XG4gIGlmIChzdGF0ZS5mbG93aW5nICYmICFzdGF0ZS5yZWFkaW5nKVxuICAgIHN0cmVhbS5yZWFkKDApO1xufVxuXG5SZWFkYWJsZS5wcm90b3R5cGUucGF1c2UgPSBmdW5jdGlvbigpIHtcbiAgZGVidWcoJ2NhbGwgcGF1c2UgZmxvd2luZz0laicsIHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyk7XG4gIGlmIChmYWxzZSAhPT0gdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nKSB7XG4gICAgZGVidWcoJ3BhdXNlJyk7XG4gICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nID0gZmFsc2U7XG4gICAgdGhpcy5lbWl0KCdwYXVzZScpO1xuICB9XG4gIHJldHVybiB0aGlzO1xufTtcblxuZnVuY3Rpb24gZmxvdyhzdHJlYW0pIHtcbiAgdmFyIHN0YXRlID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlO1xuICBkZWJ1ZygnZmxvdycsIHN0YXRlLmZsb3dpbmcpO1xuICBpZiAoc3RhdGUuZmxvd2luZykge1xuICAgIGRvIHtcbiAgICAgIHZhciBjaHVuayA9IHN0cmVhbS5yZWFkKCk7XG4gICAgfSB3aGlsZSAobnVsbCAhPT0gY2h1bmsgJiYgc3RhdGUuZmxvd2luZyk7XG4gIH1cbn1cblxuLy8gd3JhcCBhbiBvbGQtc3R5bGUgc3RyZWFtIGFzIHRoZSBhc3luYyBkYXRhIHNvdXJjZS5cbi8vIFRoaXMgaXMgKm5vdCogcGFydCBvZiB0aGUgcmVhZGFibGUgc3RyZWFtIGludGVyZmFjZS5cbi8vIEl0IGlzIGFuIHVnbHkgdW5mb3J0dW5hdGUgbWVzcyBvZiBoaXN0b3J5LlxuUmVhZGFibGUucHJvdG90eXBlLndyYXAgPSBmdW5jdGlvbihzdHJlYW0pIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgdmFyIHBhdXNlZCA9IGZhbHNlO1xuXG4gIHZhciBzZWxmID0gdGhpcztcbiAgc3RyZWFtLm9uKCdlbmQnLCBmdW5jdGlvbigpIHtcbiAgICBkZWJ1Zygnd3JhcHBlZCBlbmQnKTtcbiAgICBpZiAoc3RhdGUuZGVjb2RlciAmJiAhc3RhdGUuZW5kZWQpIHtcbiAgICAgIHZhciBjaHVuayA9IHN0YXRlLmRlY29kZXIuZW5kKCk7XG4gICAgICBpZiAoY2h1bmsgJiYgY2h1bmsubGVuZ3RoKVxuICAgICAgICBzZWxmLnB1c2goY2h1bmspO1xuICAgIH1cblxuICAgIHNlbGYucHVzaChudWxsKTtcbiAgfSk7XG5cbiAgc3RyZWFtLm9uKCdkYXRhJywgZnVuY3Rpb24oY2h1bmspIHtcbiAgICBkZWJ1Zygnd3JhcHBlZCBkYXRhJyk7XG4gICAgaWYgKHN0YXRlLmRlY29kZXIpXG4gICAgICBjaHVuayA9IHN0YXRlLmRlY29kZXIud3JpdGUoY2h1bmspO1xuXG4gICAgLy8gZG9uJ3Qgc2tpcCBvdmVyIGZhbHN5IHZhbHVlcyBpbiBvYmplY3RNb2RlXG4gICAgaWYgKHN0YXRlLm9iamVjdE1vZGUgJiYgKGNodW5rID09PSBudWxsIHx8IGNodW5rID09PSB1bmRlZmluZWQpKVxuICAgICAgcmV0dXJuO1xuICAgIGVsc2UgaWYgKCFzdGF0ZS5vYmplY3RNb2RlICYmICghY2h1bmsgfHwgIWNodW5rLmxlbmd0aCkpXG4gICAgICByZXR1cm47XG5cbiAgICB2YXIgcmV0ID0gc2VsZi5wdXNoKGNodW5rKTtcbiAgICBpZiAoIXJldCkge1xuICAgICAgcGF1c2VkID0gdHJ1ZTtcbiAgICAgIHN0cmVhbS5wYXVzZSgpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gcHJveHkgYWxsIHRoZSBvdGhlciBtZXRob2RzLlxuICAvLyBpbXBvcnRhbnQgd2hlbiB3cmFwcGluZyBmaWx0ZXJzIGFuZCBkdXBsZXhlcy5cbiAgZm9yICh2YXIgaSBpbiBzdHJlYW0pIHtcbiAgICBpZiAodGhpc1tpXSA9PT0gdW5kZWZpbmVkICYmIHR5cGVvZiBzdHJlYW1baV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRoaXNbaV0gPSBmdW5jdGlvbihtZXRob2QpIHsgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gc3RyZWFtW21ldGhvZF0uYXBwbHkoc3RyZWFtLCBhcmd1bWVudHMpO1xuICAgICAgfTsgfShpKTtcbiAgICB9XG4gIH1cblxuICAvLyBwcm94eSBjZXJ0YWluIGltcG9ydGFudCBldmVudHMuXG4gIHZhciBldmVudHMgPSBbJ2Vycm9yJywgJ2Nsb3NlJywgJ2Rlc3Ryb3knLCAncGF1c2UnLCAncmVzdW1lJ107XG4gIGZvckVhY2goZXZlbnRzLCBmdW5jdGlvbihldikge1xuICAgIHN0cmVhbS5vbihldiwgc2VsZi5lbWl0LmJpbmQoc2VsZiwgZXYpKTtcbiAgfSk7XG5cbiAgLy8gd2hlbiB3ZSB0cnkgdG8gY29uc3VtZSBzb21lIG1vcmUgYnl0ZXMsIHNpbXBseSB1bnBhdXNlIHRoZVxuICAvLyB1bmRlcmx5aW5nIHN0cmVhbS5cbiAgc2VsZi5fcmVhZCA9IGZ1bmN0aW9uKG4pIHtcbiAgICBkZWJ1Zygnd3JhcHBlZCBfcmVhZCcsIG4pO1xuICAgIGlmIChwYXVzZWQpIHtcbiAgICAgIHBhdXNlZCA9IGZhbHNlO1xuICAgICAgc3RyZWFtLnJlc3VtZSgpO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gc2VsZjtcbn07XG5cblxuLy8gZXhwb3NlZCBmb3IgdGVzdGluZyBwdXJwb3NlcyBvbmx5LlxuUmVhZGFibGUuX2Zyb21MaXN0ID0gZnJvbUxpc3Q7XG5cbi8vIFBsdWNrIG9mZiBuIGJ5dGVzIGZyb20gYW4gYXJyYXkgb2YgYnVmZmVycy5cbi8vIExlbmd0aCBpcyB0aGUgY29tYmluZWQgbGVuZ3RocyBvZiBhbGwgdGhlIGJ1ZmZlcnMgaW4gdGhlIGxpc3QuXG5mdW5jdGlvbiBmcm9tTGlzdChuLCBzdGF0ZSkge1xuICB2YXIgbGlzdCA9IHN0YXRlLmJ1ZmZlcjtcbiAgdmFyIGxlbmd0aCA9IHN0YXRlLmxlbmd0aDtcbiAgdmFyIHN0cmluZ01vZGUgPSAhIXN0YXRlLmRlY29kZXI7XG4gIHZhciBvYmplY3RNb2RlID0gISFzdGF0ZS5vYmplY3RNb2RlO1xuICB2YXIgcmV0O1xuXG4gIC8vIG5vdGhpbmcgaW4gdGhlIGxpc3QsIGRlZmluaXRlbHkgZW1wdHkuXG4gIGlmIChsaXN0Lmxlbmd0aCA9PT0gMClcbiAgICByZXR1cm4gbnVsbDtcblxuICBpZiAobGVuZ3RoID09PSAwKVxuICAgIHJldCA9IG51bGw7XG4gIGVsc2UgaWYgKG9iamVjdE1vZGUpXG4gICAgcmV0ID0gbGlzdC5zaGlmdCgpO1xuICBlbHNlIGlmICghbiB8fCBuID49IGxlbmd0aCkge1xuICAgIC8vIHJlYWQgaXQgYWxsLCB0cnVuY2F0ZSB0aGUgYXJyYXkuXG4gICAgaWYgKHN0cmluZ01vZGUpXG4gICAgICByZXQgPSBsaXN0LmpvaW4oJycpO1xuICAgIGVsc2UgaWYgKGxpc3QubGVuZ3RoID09PSAxKVxuICAgICAgcmV0ID0gbGlzdFswXTtcbiAgICBlbHNlXG4gICAgICByZXQgPSBCdWZmZXIuY29uY2F0KGxpc3QsIGxlbmd0aCk7XG4gICAgbGlzdC5sZW5ndGggPSAwO1xuICB9IGVsc2Uge1xuICAgIC8vIHJlYWQganVzdCBzb21lIG9mIGl0LlxuICAgIGlmIChuIDwgbGlzdFswXS5sZW5ndGgpIHtcbiAgICAgIC8vIGp1c3QgdGFrZSBhIHBhcnQgb2YgdGhlIGZpcnN0IGxpc3QgaXRlbS5cbiAgICAgIC8vIHNsaWNlIGlzIHRoZSBzYW1lIGZvciBidWZmZXJzIGFuZCBzdHJpbmdzLlxuICAgICAgdmFyIGJ1ZiA9IGxpc3RbMF07XG4gICAgICByZXQgPSBidWYuc2xpY2UoMCwgbik7XG4gICAgICBsaXN0WzBdID0gYnVmLnNsaWNlKG4pO1xuICAgIH0gZWxzZSBpZiAobiA9PT0gbGlzdFswXS5sZW5ndGgpIHtcbiAgICAgIC8vIGZpcnN0IGxpc3QgaXMgYSBwZXJmZWN0IG1hdGNoXG4gICAgICByZXQgPSBsaXN0LnNoaWZ0KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGNvbXBsZXggY2FzZS5cbiAgICAgIC8vIHdlIGhhdmUgZW5vdWdoIHRvIGNvdmVyIGl0LCBidXQgaXQgc3BhbnMgcGFzdCB0aGUgZmlyc3QgYnVmZmVyLlxuICAgICAgaWYgKHN0cmluZ01vZGUpXG4gICAgICAgIHJldCA9ICcnO1xuICAgICAgZWxzZVxuICAgICAgICByZXQgPSBuZXcgQnVmZmVyKG4pO1xuXG4gICAgICB2YXIgYyA9IDA7XG4gICAgICBmb3IgKHZhciBpID0gMCwgbCA9IGxpc3QubGVuZ3RoOyBpIDwgbCAmJiBjIDwgbjsgaSsrKSB7XG4gICAgICAgIHZhciBidWYgPSBsaXN0WzBdO1xuICAgICAgICB2YXIgY3B5ID0gTWF0aC5taW4obiAtIGMsIGJ1Zi5sZW5ndGgpO1xuXG4gICAgICAgIGlmIChzdHJpbmdNb2RlKVxuICAgICAgICAgIHJldCArPSBidWYuc2xpY2UoMCwgY3B5KTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgIGJ1Zi5jb3B5KHJldCwgYywgMCwgY3B5KTtcblxuICAgICAgICBpZiAoY3B5IDwgYnVmLmxlbmd0aClcbiAgICAgICAgICBsaXN0WzBdID0gYnVmLnNsaWNlKGNweSk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICBsaXN0LnNoaWZ0KCk7XG5cbiAgICAgICAgYyArPSBjcHk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gZW5kUmVhZGFibGUoc3RyZWFtKSB7XG4gIHZhciBzdGF0ZSA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZTtcblxuICAvLyBJZiB3ZSBnZXQgaGVyZSBiZWZvcmUgY29uc3VtaW5nIGFsbCB0aGUgYnl0ZXMsIHRoZW4gdGhhdCBpcyBhXG4gIC8vIGJ1ZyBpbiBub2RlLiAgU2hvdWxkIG5ldmVyIGhhcHBlbi5cbiAgaWYgKHN0YXRlLmxlbmd0aCA+IDApXG4gICAgdGhyb3cgbmV3IEVycm9yKCdlbmRSZWFkYWJsZSBjYWxsZWQgb24gbm9uLWVtcHR5IHN0cmVhbScpO1xuXG4gIGlmICghc3RhdGUuZW5kRW1pdHRlZCkge1xuICAgIHN0YXRlLmVuZGVkID0gdHJ1ZTtcbiAgICBwcm9jZXNzTmV4dFRpY2soZW5kUmVhZGFibGVOVCwgc3RhdGUsIHN0cmVhbSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZW5kUmVhZGFibGVOVChzdGF0ZSwgc3RyZWFtKSB7XG4gIC8vIENoZWNrIHRoYXQgd2UgZGlkbid0IGdldCBvbmUgbGFzdCB1bnNoaWZ0LlxuICBpZiAoIXN0YXRlLmVuZEVtaXR0ZWQgJiYgc3RhdGUubGVuZ3RoID09PSAwKSB7XG4gICAgc3RhdGUuZW5kRW1pdHRlZCA9IHRydWU7XG4gICAgc3RyZWFtLnJlYWRhYmxlID0gZmFsc2U7XG4gICAgc3RyZWFtLmVtaXQoJ2VuZCcpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZvckVhY2ggKHhzLCBmKSB7XG4gIGZvciAodmFyIGkgPSAwLCBsID0geHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgZih4c1tpXSwgaSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaW5kZXhPZiAoeHMsIHgpIHtcbiAgZm9yICh2YXIgaSA9IDAsIGwgPSB4cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBpZiAoeHNbaV0gPT09IHgpIHJldHVybiBpO1xuICB9XG4gIHJldHVybiAtMTtcbn1cbiIsIi8vIGEgdHJhbnNmb3JtIHN0cmVhbSBpcyBhIHJlYWRhYmxlL3dyaXRhYmxlIHN0cmVhbSB3aGVyZSB5b3UgZG9cbi8vIHNvbWV0aGluZyB3aXRoIHRoZSBkYXRhLiAgU29tZXRpbWVzIGl0J3MgY2FsbGVkIGEgXCJmaWx0ZXJcIixcbi8vIGJ1dCB0aGF0J3Mgbm90IGEgZ3JlYXQgbmFtZSBmb3IgaXQsIHNpbmNlIHRoYXQgaW1wbGllcyBhIHRoaW5nIHdoZXJlXG4vLyBzb21lIGJpdHMgcGFzcyB0aHJvdWdoLCBhbmQgb3RoZXJzIGFyZSBzaW1wbHkgaWdub3JlZC4gIChUaGF0IHdvdWxkXG4vLyBiZSBhIHZhbGlkIGV4YW1wbGUgb2YgYSB0cmFuc2Zvcm0sIG9mIGNvdXJzZS4pXG4vL1xuLy8gV2hpbGUgdGhlIG91dHB1dCBpcyBjYXVzYWxseSByZWxhdGVkIHRvIHRoZSBpbnB1dCwgaXQncyBub3QgYVxuLy8gbmVjZXNzYXJpbHkgc3ltbWV0cmljIG9yIHN5bmNocm9ub3VzIHRyYW5zZm9ybWF0aW9uLiAgRm9yIGV4YW1wbGUsXG4vLyBhIHpsaWIgc3RyZWFtIG1pZ2h0IHRha2UgbXVsdGlwbGUgcGxhaW4tdGV4dCB3cml0ZXMoKSwgYW5kIHRoZW5cbi8vIGVtaXQgYSBzaW5nbGUgY29tcHJlc3NlZCBjaHVuayBzb21lIHRpbWUgaW4gdGhlIGZ1dHVyZS5cbi8vXG4vLyBIZXJlJ3MgaG93IHRoaXMgd29ya3M6XG4vL1xuLy8gVGhlIFRyYW5zZm9ybSBzdHJlYW0gaGFzIGFsbCB0aGUgYXNwZWN0cyBvZiB0aGUgcmVhZGFibGUgYW5kIHdyaXRhYmxlXG4vLyBzdHJlYW0gY2xhc3Nlcy4gIFdoZW4geW91IHdyaXRlKGNodW5rKSwgdGhhdCBjYWxscyBfd3JpdGUoY2h1bmssY2IpXG4vLyBpbnRlcm5hbGx5LCBhbmQgcmV0dXJucyBmYWxzZSBpZiB0aGVyZSdzIGEgbG90IG9mIHBlbmRpbmcgd3JpdGVzXG4vLyBidWZmZXJlZCB1cC4gIFdoZW4geW91IGNhbGwgcmVhZCgpLCB0aGF0IGNhbGxzIF9yZWFkKG4pIHVudGlsXG4vLyB0aGVyZSdzIGVub3VnaCBwZW5kaW5nIHJlYWRhYmxlIGRhdGEgYnVmZmVyZWQgdXAuXG4vL1xuLy8gSW4gYSB0cmFuc2Zvcm0gc3RyZWFtLCB0aGUgd3JpdHRlbiBkYXRhIGlzIHBsYWNlZCBpbiBhIGJ1ZmZlci4gIFdoZW5cbi8vIF9yZWFkKG4pIGlzIGNhbGxlZCwgaXQgdHJhbnNmb3JtcyB0aGUgcXVldWVkIHVwIGRhdGEsIGNhbGxpbmcgdGhlXG4vLyBidWZmZXJlZCBfd3JpdGUgY2IncyBhcyBpdCBjb25zdW1lcyBjaHVua3MuICBJZiBjb25zdW1pbmcgYSBzaW5nbGVcbi8vIHdyaXR0ZW4gY2h1bmsgd291bGQgcmVzdWx0IGluIG11bHRpcGxlIG91dHB1dCBjaHVua3MsIHRoZW4gdGhlIGZpcnN0XG4vLyBvdXRwdXR0ZWQgYml0IGNhbGxzIHRoZSByZWFkY2IsIGFuZCBzdWJzZXF1ZW50IGNodW5rcyBqdXN0IGdvIGludG9cbi8vIHRoZSByZWFkIGJ1ZmZlciwgYW5kIHdpbGwgY2F1c2UgaXQgdG8gZW1pdCAncmVhZGFibGUnIGlmIG5lY2Vzc2FyeS5cbi8vXG4vLyBUaGlzIHdheSwgYmFjay1wcmVzc3VyZSBpcyBhY3R1YWxseSBkZXRlcm1pbmVkIGJ5IHRoZSByZWFkaW5nIHNpZGUsXG4vLyBzaW5jZSBfcmVhZCBoYXMgdG8gYmUgY2FsbGVkIHRvIHN0YXJ0IHByb2Nlc3NpbmcgYSBuZXcgY2h1bmsuICBIb3dldmVyLFxuLy8gYSBwYXRob2xvZ2ljYWwgaW5mbGF0ZSB0eXBlIG9mIHRyYW5zZm9ybSBjYW4gY2F1c2UgZXhjZXNzaXZlIGJ1ZmZlcmluZ1xuLy8gaGVyZS4gIEZvciBleGFtcGxlLCBpbWFnaW5lIGEgc3RyZWFtIHdoZXJlIGV2ZXJ5IGJ5dGUgb2YgaW5wdXQgaXNcbi8vIGludGVycHJldGVkIGFzIGFuIGludGVnZXIgZnJvbSAwLTI1NSwgYW5kIHRoZW4gcmVzdWx0cyBpbiB0aGF0IG1hbnlcbi8vIGJ5dGVzIG9mIG91dHB1dC4gIFdyaXRpbmcgdGhlIDQgYnl0ZXMge2ZmLGZmLGZmLGZmfSB3b3VsZCByZXN1bHQgaW5cbi8vIDFrYiBvZiBkYXRhIGJlaW5nIG91dHB1dC4gIEluIHRoaXMgY2FzZSwgeW91IGNvdWxkIHdyaXRlIGEgdmVyeSBzbWFsbFxuLy8gYW1vdW50IG9mIGlucHV0LCBhbmQgZW5kIHVwIHdpdGggYSB2ZXJ5IGxhcmdlIGFtb3VudCBvZiBvdXRwdXQuICBJblxuLy8gc3VjaCBhIHBhdGhvbG9naWNhbCBpbmZsYXRpbmcgbWVjaGFuaXNtLCB0aGVyZSdkIGJlIG5vIHdheSB0byB0ZWxsXG4vLyB0aGUgc3lzdGVtIHRvIHN0b3AgZG9pbmcgdGhlIHRyYW5zZm9ybS4gIEEgc2luZ2xlIDRNQiB3cml0ZSBjb3VsZFxuLy8gY2F1c2UgdGhlIHN5c3RlbSB0byBydW4gb3V0IG9mIG1lbW9yeS5cbi8vXG4vLyBIb3dldmVyLCBldmVuIGluIHN1Y2ggYSBwYXRob2xvZ2ljYWwgY2FzZSwgb25seSBhIHNpbmdsZSB3cml0dGVuIGNodW5rXG4vLyB3b3VsZCBiZSBjb25zdW1lZCwgYW5kIHRoZW4gdGhlIHJlc3Qgd291bGQgd2FpdCAodW4tdHJhbnNmb3JtZWQpIHVudGlsXG4vLyB0aGUgcmVzdWx0cyBvZiB0aGUgcHJldmlvdXMgdHJhbnNmb3JtZWQgY2h1bmsgd2VyZSBjb25zdW1lZC5cblxuJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFRyYW5zZm9ybTtcblxudmFyIER1cGxleCA9IHJlcXVpcmUoJy4vX3N0cmVhbV9kdXBsZXgnKTtcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciB1dGlsID0gcmVxdWlyZSgnY29yZS11dGlsLWlzJyk7XG51dGlsLmluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG51dGlsLmluaGVyaXRzKFRyYW5zZm9ybSwgRHVwbGV4KTtcblxuXG5mdW5jdGlvbiBUcmFuc2Zvcm1TdGF0ZShzdHJlYW0pIHtcbiAgdGhpcy5hZnRlclRyYW5zZm9ybSA9IGZ1bmN0aW9uKGVyLCBkYXRhKSB7XG4gICAgcmV0dXJuIGFmdGVyVHJhbnNmb3JtKHN0cmVhbSwgZXIsIGRhdGEpO1xuICB9O1xuXG4gIHRoaXMubmVlZFRyYW5zZm9ybSA9IGZhbHNlO1xuICB0aGlzLnRyYW5zZm9ybWluZyA9IGZhbHNlO1xuICB0aGlzLndyaXRlY2IgPSBudWxsO1xuICB0aGlzLndyaXRlY2h1bmsgPSBudWxsO1xufVxuXG5mdW5jdGlvbiBhZnRlclRyYW5zZm9ybShzdHJlYW0sIGVyLCBkYXRhKSB7XG4gIHZhciB0cyA9IHN0cmVhbS5fdHJhbnNmb3JtU3RhdGU7XG4gIHRzLnRyYW5zZm9ybWluZyA9IGZhbHNlO1xuXG4gIHZhciBjYiA9IHRzLndyaXRlY2I7XG5cbiAgaWYgKCFjYilcbiAgICByZXR1cm4gc3RyZWFtLmVtaXQoJ2Vycm9yJywgbmV3IEVycm9yKCdubyB3cml0ZWNiIGluIFRyYW5zZm9ybSBjbGFzcycpKTtcblxuICB0cy53cml0ZWNodW5rID0gbnVsbDtcbiAgdHMud3JpdGVjYiA9IG51bGw7XG5cbiAgaWYgKGRhdGEgIT09IG51bGwgJiYgZGF0YSAhPT0gdW5kZWZpbmVkKVxuICAgIHN0cmVhbS5wdXNoKGRhdGEpO1xuXG4gIGlmIChjYilcbiAgICBjYihlcik7XG5cbiAgdmFyIHJzID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlO1xuICBycy5yZWFkaW5nID0gZmFsc2U7XG4gIGlmIChycy5uZWVkUmVhZGFibGUgfHwgcnMubGVuZ3RoIDwgcnMuaGlnaFdhdGVyTWFyaykge1xuICAgIHN0cmVhbS5fcmVhZChycy5oaWdoV2F0ZXJNYXJrKTtcbiAgfVxufVxuXG5cbmZ1bmN0aW9uIFRyYW5zZm9ybShvcHRpb25zKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBUcmFuc2Zvcm0pKVxuICAgIHJldHVybiBuZXcgVHJhbnNmb3JtKG9wdGlvbnMpO1xuXG4gIER1cGxleC5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuXG4gIHRoaXMuX3RyYW5zZm9ybVN0YXRlID0gbmV3IFRyYW5zZm9ybVN0YXRlKHRoaXMpO1xuXG4gIC8vIHdoZW4gdGhlIHdyaXRhYmxlIHNpZGUgZmluaXNoZXMsIHRoZW4gZmx1c2ggb3V0IGFueXRoaW5nIHJlbWFpbmluZy5cbiAgdmFyIHN0cmVhbSA9IHRoaXM7XG5cbiAgLy8gc3RhcnQgb3V0IGFza2luZyBmb3IgYSByZWFkYWJsZSBldmVudCBvbmNlIGRhdGEgaXMgdHJhbnNmb3JtZWQuXG4gIHRoaXMuX3JlYWRhYmxlU3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcblxuICAvLyB3ZSBoYXZlIGltcGxlbWVudGVkIHRoZSBfcmVhZCBtZXRob2QsIGFuZCBkb25lIHRoZSBvdGhlciB0aGluZ3NcbiAgLy8gdGhhdCBSZWFkYWJsZSB3YW50cyBiZWZvcmUgdGhlIGZpcnN0IF9yZWFkIGNhbGwsIHNvIHVuc2V0IHRoZVxuICAvLyBzeW5jIGd1YXJkIGZsYWcuXG4gIHRoaXMuX3JlYWRhYmxlU3RhdGUuc3luYyA9IGZhbHNlO1xuXG4gIGlmIChvcHRpb25zKSB7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLnRyYW5zZm9ybSA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgIHRoaXMuX3RyYW5zZm9ybSA9IG9wdGlvbnMudHJhbnNmb3JtO1xuXG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLmZsdXNoID09PSAnZnVuY3Rpb24nKVxuICAgICAgdGhpcy5fZmx1c2ggPSBvcHRpb25zLmZsdXNoO1xuICB9XG5cbiAgdGhpcy5vbmNlKCdwcmVmaW5pc2gnLCBmdW5jdGlvbigpIHtcbiAgICBpZiAodHlwZW9mIHRoaXMuX2ZsdXNoID09PSAnZnVuY3Rpb24nKVxuICAgICAgdGhpcy5fZmx1c2goZnVuY3Rpb24oZXIpIHtcbiAgICAgICAgZG9uZShzdHJlYW0sIGVyKTtcbiAgICAgIH0pO1xuICAgIGVsc2VcbiAgICAgIGRvbmUoc3RyZWFtKTtcbiAgfSk7XG59XG5cblRyYW5zZm9ybS5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uKGNodW5rLCBlbmNvZGluZykge1xuICB0aGlzLl90cmFuc2Zvcm1TdGF0ZS5uZWVkVHJhbnNmb3JtID0gZmFsc2U7XG4gIHJldHVybiBEdXBsZXgucHJvdG90eXBlLnB1c2guY2FsbCh0aGlzLCBjaHVuaywgZW5jb2RpbmcpO1xufTtcblxuLy8gVGhpcyBpcyB0aGUgcGFydCB3aGVyZSB5b3UgZG8gc3R1ZmYhXG4vLyBvdmVycmlkZSB0aGlzIGZ1bmN0aW9uIGluIGltcGxlbWVudGF0aW9uIGNsYXNzZXMuXG4vLyAnY2h1bmsnIGlzIGFuIGlucHV0IGNodW5rLlxuLy9cbi8vIENhbGwgYHB1c2gobmV3Q2h1bmspYCB0byBwYXNzIGFsb25nIHRyYW5zZm9ybWVkIG91dHB1dFxuLy8gdG8gdGhlIHJlYWRhYmxlIHNpZGUuICBZb3UgbWF5IGNhbGwgJ3B1c2gnIHplcm8gb3IgbW9yZSB0aW1lcy5cbi8vXG4vLyBDYWxsIGBjYihlcnIpYCB3aGVuIHlvdSBhcmUgZG9uZSB3aXRoIHRoaXMgY2h1bmsuICBJZiB5b3UgcGFzc1xuLy8gYW4gZXJyb3IsIHRoZW4gdGhhdCdsbCBwdXQgdGhlIGh1cnQgb24gdGhlIHdob2xlIG9wZXJhdGlvbi4gIElmIHlvdVxuLy8gbmV2ZXIgY2FsbCBjYigpLCB0aGVuIHlvdSdsbCBuZXZlciBnZXQgYW5vdGhlciBjaHVuay5cblRyYW5zZm9ybS5wcm90b3R5cGUuX3RyYW5zZm9ybSA9IGZ1bmN0aW9uKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgdGhyb3cgbmV3IEVycm9yKCdub3QgaW1wbGVtZW50ZWQnKTtcbn07XG5cblRyYW5zZm9ybS5wcm90b3R5cGUuX3dyaXRlID0gZnVuY3Rpb24oY2h1bmssIGVuY29kaW5nLCBjYikge1xuICB2YXIgdHMgPSB0aGlzLl90cmFuc2Zvcm1TdGF0ZTtcbiAgdHMud3JpdGVjYiA9IGNiO1xuICB0cy53cml0ZWNodW5rID0gY2h1bms7XG4gIHRzLndyaXRlZW5jb2RpbmcgPSBlbmNvZGluZztcbiAgaWYgKCF0cy50cmFuc2Zvcm1pbmcpIHtcbiAgICB2YXIgcnMgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICAgIGlmICh0cy5uZWVkVHJhbnNmb3JtIHx8XG4gICAgICAgIHJzLm5lZWRSZWFkYWJsZSB8fFxuICAgICAgICBycy5sZW5ndGggPCBycy5oaWdoV2F0ZXJNYXJrKVxuICAgICAgdGhpcy5fcmVhZChycy5oaWdoV2F0ZXJNYXJrKTtcbiAgfVxufTtcblxuLy8gRG9lc24ndCBtYXR0ZXIgd2hhdCB0aGUgYXJncyBhcmUgaGVyZS5cbi8vIF90cmFuc2Zvcm0gZG9lcyBhbGwgdGhlIHdvcmsuXG4vLyBUaGF0IHdlIGdvdCBoZXJlIG1lYW5zIHRoYXQgdGhlIHJlYWRhYmxlIHNpZGUgd2FudHMgbW9yZSBkYXRhLlxuVHJhbnNmb3JtLnByb3RvdHlwZS5fcmVhZCA9IGZ1bmN0aW9uKG4pIHtcbiAgdmFyIHRzID0gdGhpcy5fdHJhbnNmb3JtU3RhdGU7XG5cbiAgaWYgKHRzLndyaXRlY2h1bmsgIT09IG51bGwgJiYgdHMud3JpdGVjYiAmJiAhdHMudHJhbnNmb3JtaW5nKSB7XG4gICAgdHMudHJhbnNmb3JtaW5nID0gdHJ1ZTtcbiAgICB0aGlzLl90cmFuc2Zvcm0odHMud3JpdGVjaHVuaywgdHMud3JpdGVlbmNvZGluZywgdHMuYWZ0ZXJUcmFuc2Zvcm0pO1xuICB9IGVsc2Uge1xuICAgIC8vIG1hcmsgdGhhdCB3ZSBuZWVkIGEgdHJhbnNmb3JtLCBzbyB0aGF0IGFueSBkYXRhIHRoYXQgY29tZXMgaW5cbiAgICAvLyB3aWxsIGdldCBwcm9jZXNzZWQsIG5vdyB0aGF0IHdlJ3ZlIGFza2VkIGZvciBpdC5cbiAgICB0cy5uZWVkVHJhbnNmb3JtID0gdHJ1ZTtcbiAgfVxufTtcblxuXG5mdW5jdGlvbiBkb25lKHN0cmVhbSwgZXIpIHtcbiAgaWYgKGVyKVxuICAgIHJldHVybiBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcik7XG5cbiAgLy8gaWYgdGhlcmUncyBub3RoaW5nIGluIHRoZSB3cml0ZSBidWZmZXIsIHRoZW4gdGhhdCBtZWFuc1xuICAvLyB0aGF0IG5vdGhpbmcgbW9yZSB3aWxsIGV2ZXIgYmUgcHJvdmlkZWRcbiAgdmFyIHdzID0gc3RyZWFtLl93cml0YWJsZVN0YXRlO1xuICB2YXIgdHMgPSBzdHJlYW0uX3RyYW5zZm9ybVN0YXRlO1xuXG4gIGlmICh3cy5sZW5ndGgpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdjYWxsaW5nIHRyYW5zZm9ybSBkb25lIHdoZW4gd3MubGVuZ3RoICE9IDAnKTtcblxuICBpZiAodHMudHJhbnNmb3JtaW5nKVxuICAgIHRocm93IG5ldyBFcnJvcignY2FsbGluZyB0cmFuc2Zvcm0gZG9uZSB3aGVuIHN0aWxsIHRyYW5zZm9ybWluZycpO1xuXG4gIHJldHVybiBzdHJlYW0ucHVzaChudWxsKTtcbn1cbiIsIi8vIEEgYml0IHNpbXBsZXIgdGhhbiByZWFkYWJsZSBzdHJlYW1zLlxuLy8gSW1wbGVtZW50IGFuIGFzeW5jIC5fd3JpdGUoY2h1bmssIGVuY29kaW5nLCBjYiksIGFuZCBpdCdsbCBoYW5kbGUgYWxsXG4vLyB0aGUgZHJhaW4gZXZlbnQgZW1pc3Npb24gYW5kIGJ1ZmZlcmluZy5cblxuJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFdyaXRhYmxlO1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIHByb2Nlc3NOZXh0VGljayA9IHJlcXVpcmUoJ3Byb2Nlc3MtbmV4dGljay1hcmdzJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ2J1ZmZlcicpLkJ1ZmZlcjtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG5Xcml0YWJsZS5Xcml0YWJsZVN0YXRlID0gV3JpdGFibGVTdGF0ZTtcblxuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIHV0aWwgPSByZXF1aXJlKCdjb3JlLXV0aWwtaXMnKTtcbnV0aWwuaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBpbnRlcm5hbFV0aWwgPSB7XG4gIGRlcHJlY2F0ZTogcmVxdWlyZSgndXRpbC1kZXByZWNhdGUnKVxufTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG5cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBTdHJlYW07XG4oZnVuY3Rpb24gKCl7dHJ5e1xuICBTdHJlYW0gPSByZXF1aXJlKCdzdCcgKyAncmVhbScpO1xufWNhdGNoKF8pe31maW5hbGx5e1xuICBpZiAoIVN0cmVhbSlcbiAgICBTdHJlYW0gPSByZXF1aXJlKCdldmVudHMnKS5FdmVudEVtaXR0ZXI7XG59fSgpKVxuLyo8L3JlcGxhY2VtZW50PiovXG5cbnZhciBCdWZmZXIgPSByZXF1aXJlKCdidWZmZXInKS5CdWZmZXI7XG5cbnV0aWwuaW5oZXJpdHMoV3JpdGFibGUsIFN0cmVhbSk7XG5cbmZ1bmN0aW9uIG5vcCgpIHt9XG5cbmZ1bmN0aW9uIFdyaXRlUmVxKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgdGhpcy5jaHVuayA9IGNodW5rO1xuICB0aGlzLmVuY29kaW5nID0gZW5jb2Rpbmc7XG4gIHRoaXMuY2FsbGJhY2sgPSBjYjtcbiAgdGhpcy5uZXh0ID0gbnVsbDtcbn1cblxudmFyIER1cGxleDtcbmZ1bmN0aW9uIFdyaXRhYmxlU3RhdGUob3B0aW9ucywgc3RyZWFtKSB7XG4gIER1cGxleCA9IER1cGxleCB8fCByZXF1aXJlKCcuL19zdHJlYW1fZHVwbGV4Jyk7XG5cbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgLy8gb2JqZWN0IHN0cmVhbSBmbGFnIHRvIGluZGljYXRlIHdoZXRoZXIgb3Igbm90IHRoaXMgc3RyZWFtXG4gIC8vIGNvbnRhaW5zIGJ1ZmZlcnMgb3Igb2JqZWN0cy5cbiAgdGhpcy5vYmplY3RNb2RlID0gISFvcHRpb25zLm9iamVjdE1vZGU7XG5cbiAgaWYgKHN0cmVhbSBpbnN0YW5jZW9mIER1cGxleClcbiAgICB0aGlzLm9iamVjdE1vZGUgPSB0aGlzLm9iamVjdE1vZGUgfHwgISFvcHRpb25zLndyaXRhYmxlT2JqZWN0TW9kZTtcblxuICAvLyB0aGUgcG9pbnQgYXQgd2hpY2ggd3JpdGUoKSBzdGFydHMgcmV0dXJuaW5nIGZhbHNlXG4gIC8vIE5vdGU6IDAgaXMgYSB2YWxpZCB2YWx1ZSwgbWVhbnMgdGhhdCB3ZSBhbHdheXMgcmV0dXJuIGZhbHNlIGlmXG4gIC8vIHRoZSBlbnRpcmUgYnVmZmVyIGlzIG5vdCBmbHVzaGVkIGltbWVkaWF0ZWx5IG9uIHdyaXRlKClcbiAgdmFyIGh3bSA9IG9wdGlvbnMuaGlnaFdhdGVyTWFyaztcbiAgdmFyIGRlZmF1bHRId20gPSB0aGlzLm9iamVjdE1vZGUgPyAxNiA6IDE2ICogMTAyNDtcbiAgdGhpcy5oaWdoV2F0ZXJNYXJrID0gKGh3bSB8fCBod20gPT09IDApID8gaHdtIDogZGVmYXVsdEh3bTtcblxuICAvLyBjYXN0IHRvIGludHMuXG4gIHRoaXMuaGlnaFdhdGVyTWFyayA9IH5+dGhpcy5oaWdoV2F0ZXJNYXJrO1xuXG4gIHRoaXMubmVlZERyYWluID0gZmFsc2U7XG4gIC8vIGF0IHRoZSBzdGFydCBvZiBjYWxsaW5nIGVuZCgpXG4gIHRoaXMuZW5kaW5nID0gZmFsc2U7XG4gIC8vIHdoZW4gZW5kKCkgaGFzIGJlZW4gY2FsbGVkLCBhbmQgcmV0dXJuZWRcbiAgdGhpcy5lbmRlZCA9IGZhbHNlO1xuICAvLyB3aGVuICdmaW5pc2gnIGlzIGVtaXR0ZWRcbiAgdGhpcy5maW5pc2hlZCA9IGZhbHNlO1xuXG4gIC8vIHNob3VsZCB3ZSBkZWNvZGUgc3RyaW5ncyBpbnRvIGJ1ZmZlcnMgYmVmb3JlIHBhc3NpbmcgdG8gX3dyaXRlP1xuICAvLyB0aGlzIGlzIGhlcmUgc28gdGhhdCBzb21lIG5vZGUtY29yZSBzdHJlYW1zIGNhbiBvcHRpbWl6ZSBzdHJpbmdcbiAgLy8gaGFuZGxpbmcgYXQgYSBsb3dlciBsZXZlbC5cbiAgdmFyIG5vRGVjb2RlID0gb3B0aW9ucy5kZWNvZGVTdHJpbmdzID09PSBmYWxzZTtcbiAgdGhpcy5kZWNvZGVTdHJpbmdzID0gIW5vRGVjb2RlO1xuXG4gIC8vIENyeXB0byBpcyBraW5kIG9mIG9sZCBhbmQgY3J1c3R5LiAgSGlzdG9yaWNhbGx5LCBpdHMgZGVmYXVsdCBzdHJpbmdcbiAgLy8gZW5jb2RpbmcgaXMgJ2JpbmFyeScgc28gd2UgaGF2ZSB0byBtYWtlIHRoaXMgY29uZmlndXJhYmxlLlxuICAvLyBFdmVyeXRoaW5nIGVsc2UgaW4gdGhlIHVuaXZlcnNlIHVzZXMgJ3V0ZjgnLCB0aG91Z2guXG4gIHRoaXMuZGVmYXVsdEVuY29kaW5nID0gb3B0aW9ucy5kZWZhdWx0RW5jb2RpbmcgfHwgJ3V0ZjgnO1xuXG4gIC8vIG5vdCBhbiBhY3R1YWwgYnVmZmVyIHdlIGtlZXAgdHJhY2sgb2YsIGJ1dCBhIG1lYXN1cmVtZW50XG4gIC8vIG9mIGhvdyBtdWNoIHdlJ3JlIHdhaXRpbmcgdG8gZ2V0IHB1c2hlZCB0byBzb21lIHVuZGVybHlpbmdcbiAgLy8gc29ja2V0IG9yIGZpbGUuXG4gIHRoaXMubGVuZ3RoID0gMDtcblxuICAvLyBhIGZsYWcgdG8gc2VlIHdoZW4gd2UncmUgaW4gdGhlIG1pZGRsZSBvZiBhIHdyaXRlLlxuICB0aGlzLndyaXRpbmcgPSBmYWxzZTtcblxuICAvLyB3aGVuIHRydWUgYWxsIHdyaXRlcyB3aWxsIGJlIGJ1ZmZlcmVkIHVudGlsIC51bmNvcmsoKSBjYWxsXG4gIHRoaXMuY29ya2VkID0gMDtcblxuICAvLyBhIGZsYWcgdG8gYmUgYWJsZSB0byB0ZWxsIGlmIHRoZSBvbndyaXRlIGNiIGlzIGNhbGxlZCBpbW1lZGlhdGVseSxcbiAgLy8gb3Igb24gYSBsYXRlciB0aWNrLiAgV2Ugc2V0IHRoaXMgdG8gdHJ1ZSBhdCBmaXJzdCwgYmVjYXVzZSBhbnlcbiAgLy8gYWN0aW9ucyB0aGF0IHNob3VsZG4ndCBoYXBwZW4gdW50aWwgXCJsYXRlclwiIHNob3VsZCBnZW5lcmFsbHkgYWxzb1xuICAvLyBub3QgaGFwcGVuIGJlZm9yZSB0aGUgZmlyc3Qgd3JpdGUgY2FsbC5cbiAgdGhpcy5zeW5jID0gdHJ1ZTtcblxuICAvLyBhIGZsYWcgdG8ga25vdyBpZiB3ZSdyZSBwcm9jZXNzaW5nIHByZXZpb3VzbHkgYnVmZmVyZWQgaXRlbXMsIHdoaWNoXG4gIC8vIG1heSBjYWxsIHRoZSBfd3JpdGUoKSBjYWxsYmFjayBpbiB0aGUgc2FtZSB0aWNrLCBzbyB0aGF0IHdlIGRvbid0XG4gIC8vIGVuZCB1cCBpbiBhbiBvdmVybGFwcGVkIG9ud3JpdGUgc2l0dWF0aW9uLlxuICB0aGlzLmJ1ZmZlclByb2Nlc3NpbmcgPSBmYWxzZTtcblxuICAvLyB0aGUgY2FsbGJhY2sgdGhhdCdzIHBhc3NlZCB0byBfd3JpdGUoY2h1bmssY2IpXG4gIHRoaXMub253cml0ZSA9IGZ1bmN0aW9uKGVyKSB7XG4gICAgb253cml0ZShzdHJlYW0sIGVyKTtcbiAgfTtcblxuICAvLyB0aGUgY2FsbGJhY2sgdGhhdCB0aGUgdXNlciBzdXBwbGllcyB0byB3cml0ZShjaHVuayxlbmNvZGluZyxjYilcbiAgdGhpcy53cml0ZWNiID0gbnVsbDtcblxuICAvLyB0aGUgYW1vdW50IHRoYXQgaXMgYmVpbmcgd3JpdHRlbiB3aGVuIF93cml0ZSBpcyBjYWxsZWQuXG4gIHRoaXMud3JpdGVsZW4gPSAwO1xuXG4gIHRoaXMuYnVmZmVyZWRSZXF1ZXN0ID0gbnVsbDtcbiAgdGhpcy5sYXN0QnVmZmVyZWRSZXF1ZXN0ID0gbnVsbDtcblxuICAvLyBudW1iZXIgb2YgcGVuZGluZyB1c2VyLXN1cHBsaWVkIHdyaXRlIGNhbGxiYWNrc1xuICAvLyB0aGlzIG11c3QgYmUgMCBiZWZvcmUgJ2ZpbmlzaCcgY2FuIGJlIGVtaXR0ZWRcbiAgdGhpcy5wZW5kaW5nY2IgPSAwO1xuXG4gIC8vIGVtaXQgcHJlZmluaXNoIGlmIHRoZSBvbmx5IHRoaW5nIHdlJ3JlIHdhaXRpbmcgZm9yIGlzIF93cml0ZSBjYnNcbiAgLy8gVGhpcyBpcyByZWxldmFudCBmb3Igc3luY2hyb25vdXMgVHJhbnNmb3JtIHN0cmVhbXNcbiAgdGhpcy5wcmVmaW5pc2hlZCA9IGZhbHNlO1xuXG4gIC8vIFRydWUgaWYgdGhlIGVycm9yIHdhcyBhbHJlYWR5IGVtaXR0ZWQgYW5kIHNob3VsZCBub3QgYmUgdGhyb3duIGFnYWluXG4gIHRoaXMuZXJyb3JFbWl0dGVkID0gZmFsc2U7XG59XG5cbldyaXRhYmxlU3RhdGUucHJvdG90eXBlLmdldEJ1ZmZlciA9IGZ1bmN0aW9uIHdyaXRhYmxlU3RhdGVHZXRCdWZmZXIoKSB7XG4gIHZhciBjdXJyZW50ID0gdGhpcy5idWZmZXJlZFJlcXVlc3Q7XG4gIHZhciBvdXQgPSBbXTtcbiAgd2hpbGUgKGN1cnJlbnQpIHtcbiAgICBvdXQucHVzaChjdXJyZW50KTtcbiAgICBjdXJyZW50ID0gY3VycmVudC5uZXh0O1xuICB9XG4gIHJldHVybiBvdXQ7XG59O1xuXG4oZnVuY3Rpb24gKCl7dHJ5IHtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShXcml0YWJsZVN0YXRlLnByb3RvdHlwZSwgJ2J1ZmZlcicsIHtcbiAgZ2V0OiBpbnRlcm5hbFV0aWwuZGVwcmVjYXRlKGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLmdldEJ1ZmZlcigpO1xuICB9LCAnX3dyaXRhYmxlU3RhdGUuYnVmZmVyIGlzIGRlcHJlY2F0ZWQuIFVzZSBfd3JpdGFibGVTdGF0ZS5nZXRCdWZmZXIgJyArXG4gICAgICdpbnN0ZWFkLicpXG59KTtcbn1jYXRjaChfKXt9fSgpKTtcblxuXG52YXIgRHVwbGV4O1xuZnVuY3Rpb24gV3JpdGFibGUob3B0aW9ucykge1xuICBEdXBsZXggPSBEdXBsZXggfHwgcmVxdWlyZSgnLi9fc3RyZWFtX2R1cGxleCcpO1xuXG4gIC8vIFdyaXRhYmxlIGN0b3IgaXMgYXBwbGllZCB0byBEdXBsZXhlcywgdGhvdWdoIHRoZXkncmUgbm90XG4gIC8vIGluc3RhbmNlb2YgV3JpdGFibGUsIHRoZXkncmUgaW5zdGFuY2VvZiBSZWFkYWJsZS5cbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFdyaXRhYmxlKSAmJiAhKHRoaXMgaW5zdGFuY2VvZiBEdXBsZXgpKVxuICAgIHJldHVybiBuZXcgV3JpdGFibGUob3B0aW9ucyk7XG5cbiAgdGhpcy5fd3JpdGFibGVTdGF0ZSA9IG5ldyBXcml0YWJsZVN0YXRlKG9wdGlvbnMsIHRoaXMpO1xuXG4gIC8vIGxlZ2FjeS5cbiAgdGhpcy53cml0YWJsZSA9IHRydWU7XG5cbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMud3JpdGUgPT09ICdmdW5jdGlvbicpXG4gICAgICB0aGlzLl93cml0ZSA9IG9wdGlvbnMud3JpdGU7XG5cbiAgICBpZiAodHlwZW9mIG9wdGlvbnMud3JpdGV2ID09PSAnZnVuY3Rpb24nKVxuICAgICAgdGhpcy5fd3JpdGV2ID0gb3B0aW9ucy53cml0ZXY7XG4gIH1cblxuICBTdHJlYW0uY2FsbCh0aGlzKTtcbn1cblxuLy8gT3RoZXJ3aXNlIHBlb3BsZSBjYW4gcGlwZSBXcml0YWJsZSBzdHJlYW1zLCB3aGljaCBpcyBqdXN0IHdyb25nLlxuV3JpdGFibGUucHJvdG90eXBlLnBpcGUgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5lbWl0KCdlcnJvcicsIG5ldyBFcnJvcignQ2Fubm90IHBpcGUuIE5vdCByZWFkYWJsZS4nKSk7XG59O1xuXG5cbmZ1bmN0aW9uIHdyaXRlQWZ0ZXJFbmQoc3RyZWFtLCBjYikge1xuICB2YXIgZXIgPSBuZXcgRXJyb3IoJ3dyaXRlIGFmdGVyIGVuZCcpO1xuICAvLyBUT0RPOiBkZWZlciBlcnJvciBldmVudHMgY29uc2lzdGVudGx5IGV2ZXJ5d2hlcmUsIG5vdCBqdXN0IHRoZSBjYlxuICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcik7XG4gIHByb2Nlc3NOZXh0VGljayhjYiwgZXIpO1xufVxuXG4vLyBJZiB3ZSBnZXQgc29tZXRoaW5nIHRoYXQgaXMgbm90IGEgYnVmZmVyLCBzdHJpbmcsIG51bGwsIG9yIHVuZGVmaW5lZCxcbi8vIGFuZCB3ZSdyZSBub3QgaW4gb2JqZWN0TW9kZSwgdGhlbiB0aGF0J3MgYW4gZXJyb3IuXG4vLyBPdGhlcndpc2Ugc3RyZWFtIGNodW5rcyBhcmUgYWxsIGNvbnNpZGVyZWQgdG8gYmUgb2YgbGVuZ3RoPTEsIGFuZCB0aGVcbi8vIHdhdGVybWFya3MgZGV0ZXJtaW5lIGhvdyBtYW55IG9iamVjdHMgdG8ga2VlcCBpbiB0aGUgYnVmZmVyLCByYXRoZXIgdGhhblxuLy8gaG93IG1hbnkgYnl0ZXMgb3IgY2hhcmFjdGVycy5cbmZ1bmN0aW9uIHZhbGlkQ2h1bmsoc3RyZWFtLCBzdGF0ZSwgY2h1bmssIGNiKSB7XG4gIHZhciB2YWxpZCA9IHRydWU7XG5cbiAgaWYgKCEoQnVmZmVyLmlzQnVmZmVyKGNodW5rKSkgJiZcbiAgICAgIHR5cGVvZiBjaHVuayAhPT0gJ3N0cmluZycgJiZcbiAgICAgIGNodW5rICE9PSBudWxsICYmXG4gICAgICBjaHVuayAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAhc3RhdGUub2JqZWN0TW9kZSkge1xuICAgIHZhciBlciA9IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgbm9uLXN0cmluZy9idWZmZXIgY2h1bmsnKTtcbiAgICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcik7XG4gICAgcHJvY2Vzc05leHRUaWNrKGNiLCBlcik7XG4gICAgdmFsaWQgPSBmYWxzZTtcbiAgfVxuICByZXR1cm4gdmFsaWQ7XG59XG5cbldyaXRhYmxlLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fd3JpdGFibGVTdGF0ZTtcbiAgdmFyIHJldCA9IGZhbHNlO1xuXG4gIGlmICh0eXBlb2YgZW5jb2RpbmcgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYiA9IGVuY29kaW5nO1xuICAgIGVuY29kaW5nID0gbnVsbDtcbiAgfVxuXG4gIGlmIChCdWZmZXIuaXNCdWZmZXIoY2h1bmspKVxuICAgIGVuY29kaW5nID0gJ2J1ZmZlcic7XG4gIGVsc2UgaWYgKCFlbmNvZGluZylcbiAgICBlbmNvZGluZyA9IHN0YXRlLmRlZmF1bHRFbmNvZGluZztcblxuICBpZiAodHlwZW9mIGNiICE9PSAnZnVuY3Rpb24nKVxuICAgIGNiID0gbm9wO1xuXG4gIGlmIChzdGF0ZS5lbmRlZClcbiAgICB3cml0ZUFmdGVyRW5kKHRoaXMsIGNiKTtcbiAgZWxzZSBpZiAodmFsaWRDaHVuayh0aGlzLCBzdGF0ZSwgY2h1bmssIGNiKSkge1xuICAgIHN0YXRlLnBlbmRpbmdjYisrO1xuICAgIHJldCA9IHdyaXRlT3JCdWZmZXIodGhpcywgc3RhdGUsIGNodW5rLCBlbmNvZGluZywgY2IpO1xuICB9XG5cbiAgcmV0dXJuIHJldDtcbn07XG5cbldyaXRhYmxlLnByb3RvdHlwZS5jb3JrID0gZnVuY3Rpb24oKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3dyaXRhYmxlU3RhdGU7XG5cbiAgc3RhdGUuY29ya2VkKys7XG59O1xuXG5Xcml0YWJsZS5wcm90b3R5cGUudW5jb3JrID0gZnVuY3Rpb24oKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3dyaXRhYmxlU3RhdGU7XG5cbiAgaWYgKHN0YXRlLmNvcmtlZCkge1xuICAgIHN0YXRlLmNvcmtlZC0tO1xuXG4gICAgaWYgKCFzdGF0ZS53cml0aW5nICYmXG4gICAgICAgICFzdGF0ZS5jb3JrZWQgJiZcbiAgICAgICAgIXN0YXRlLmZpbmlzaGVkICYmXG4gICAgICAgICFzdGF0ZS5idWZmZXJQcm9jZXNzaW5nICYmXG4gICAgICAgIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdClcbiAgICAgIGNsZWFyQnVmZmVyKHRoaXMsIHN0YXRlKTtcbiAgfVxufTtcblxuV3JpdGFibGUucHJvdG90eXBlLnNldERlZmF1bHRFbmNvZGluZyA9IGZ1bmN0aW9uIHNldERlZmF1bHRFbmNvZGluZyhlbmNvZGluZykge1xuICAvLyBub2RlOjpQYXJzZUVuY29kaW5nKCkgcmVxdWlyZXMgbG93ZXIgY2FzZS5cbiAgaWYgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ3N0cmluZycpXG4gICAgZW5jb2RpbmcgPSBlbmNvZGluZy50b0xvd2VyQ2FzZSgpO1xuICBpZiAoIShbJ2hleCcsICd1dGY4JywgJ3V0Zi04JywgJ2FzY2lpJywgJ2JpbmFyeScsICdiYXNlNjQnLFxuJ3VjczInLCAndWNzLTInLCd1dGYxNmxlJywgJ3V0Zi0xNmxlJywgJ3JhdyddXG4uaW5kZXhPZigoZW5jb2RpbmcgKyAnJykudG9Mb3dlckNhc2UoKSkgPiAtMSkpXG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKTtcbiAgdGhpcy5fd3JpdGFibGVTdGF0ZS5kZWZhdWx0RW5jb2RpbmcgPSBlbmNvZGluZztcbn07XG5cbmZ1bmN0aW9uIGRlY29kZUNodW5rKHN0YXRlLCBjaHVuaywgZW5jb2RpbmcpIHtcbiAgaWYgKCFzdGF0ZS5vYmplY3RNb2RlICYmXG4gICAgICBzdGF0ZS5kZWNvZGVTdHJpbmdzICE9PSBmYWxzZSAmJlxuICAgICAgdHlwZW9mIGNodW5rID09PSAnc3RyaW5nJykge1xuICAgIGNodW5rID0gbmV3IEJ1ZmZlcihjaHVuaywgZW5jb2RpbmcpO1xuICB9XG4gIHJldHVybiBjaHVuaztcbn1cblxuLy8gaWYgd2UncmUgYWxyZWFkeSB3cml0aW5nIHNvbWV0aGluZywgdGhlbiBqdXN0IHB1dCB0aGlzXG4vLyBpbiB0aGUgcXVldWUsIGFuZCB3YWl0IG91ciB0dXJuLiAgT3RoZXJ3aXNlLCBjYWxsIF93cml0ZVxuLy8gSWYgd2UgcmV0dXJuIGZhbHNlLCB0aGVuIHdlIG5lZWQgYSBkcmFpbiBldmVudCwgc28gc2V0IHRoYXQgZmxhZy5cbmZ1bmN0aW9uIHdyaXRlT3JCdWZmZXIoc3RyZWFtLCBzdGF0ZSwgY2h1bmssIGVuY29kaW5nLCBjYikge1xuICBjaHVuayA9IGRlY29kZUNodW5rKHN0YXRlLCBjaHVuaywgZW5jb2RpbmcpO1xuXG4gIGlmIChCdWZmZXIuaXNCdWZmZXIoY2h1bmspKVxuICAgIGVuY29kaW5nID0gJ2J1ZmZlcic7XG4gIHZhciBsZW4gPSBzdGF0ZS5vYmplY3RNb2RlID8gMSA6IGNodW5rLmxlbmd0aDtcblxuICBzdGF0ZS5sZW5ndGggKz0gbGVuO1xuXG4gIHZhciByZXQgPSBzdGF0ZS5sZW5ndGggPCBzdGF0ZS5oaWdoV2F0ZXJNYXJrO1xuICAvLyB3ZSBtdXN0IGVuc3VyZSB0aGF0IHByZXZpb3VzIG5lZWREcmFpbiB3aWxsIG5vdCBiZSByZXNldCB0byBmYWxzZS5cbiAgaWYgKCFyZXQpXG4gICAgc3RhdGUubmVlZERyYWluID0gdHJ1ZTtcblxuICBpZiAoc3RhdGUud3JpdGluZyB8fCBzdGF0ZS5jb3JrZWQpIHtcbiAgICB2YXIgbGFzdCA9IHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3Q7XG4gICAgc3RhdGUubGFzdEJ1ZmZlcmVkUmVxdWVzdCA9IG5ldyBXcml0ZVJlcShjaHVuaywgZW5jb2RpbmcsIGNiKTtcbiAgICBpZiAobGFzdCkge1xuICAgICAgbGFzdC5uZXh0ID0gc3RhdGUubGFzdEJ1ZmZlcmVkUmVxdWVzdDtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhdGUuYnVmZmVyZWRSZXF1ZXN0ID0gc3RhdGUubGFzdEJ1ZmZlcmVkUmVxdWVzdDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZG9Xcml0ZShzdHJlYW0sIHN0YXRlLCBmYWxzZSwgbGVuLCBjaHVuaywgZW5jb2RpbmcsIGNiKTtcbiAgfVxuXG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIGRvV3JpdGUoc3RyZWFtLCBzdGF0ZSwgd3JpdGV2LCBsZW4sIGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgc3RhdGUud3JpdGVsZW4gPSBsZW47XG4gIHN0YXRlLndyaXRlY2IgPSBjYjtcbiAgc3RhdGUud3JpdGluZyA9IHRydWU7XG4gIHN0YXRlLnN5bmMgPSB0cnVlO1xuICBpZiAod3JpdGV2KVxuICAgIHN0cmVhbS5fd3JpdGV2KGNodW5rLCBzdGF0ZS5vbndyaXRlKTtcbiAgZWxzZVxuICAgIHN0cmVhbS5fd3JpdGUoY2h1bmssIGVuY29kaW5nLCBzdGF0ZS5vbndyaXRlKTtcbiAgc3RhdGUuc3luYyA9IGZhbHNlO1xufVxuXG5mdW5jdGlvbiBvbndyaXRlRXJyb3Ioc3RyZWFtLCBzdGF0ZSwgc3luYywgZXIsIGNiKSB7XG4gIC0tc3RhdGUucGVuZGluZ2NiO1xuICBpZiAoc3luYylcbiAgICBwcm9jZXNzTmV4dFRpY2soY2IsIGVyKTtcbiAgZWxzZVxuICAgIGNiKGVyKTtcblxuICBzdHJlYW0uX3dyaXRhYmxlU3RhdGUuZXJyb3JFbWl0dGVkID0gdHJ1ZTtcbiAgc3RyZWFtLmVtaXQoJ2Vycm9yJywgZXIpO1xufVxuXG5mdW5jdGlvbiBvbndyaXRlU3RhdGVVcGRhdGUoc3RhdGUpIHtcbiAgc3RhdGUud3JpdGluZyA9IGZhbHNlO1xuICBzdGF0ZS53cml0ZWNiID0gbnVsbDtcbiAgc3RhdGUubGVuZ3RoIC09IHN0YXRlLndyaXRlbGVuO1xuICBzdGF0ZS53cml0ZWxlbiA9IDA7XG59XG5cbmZ1bmN0aW9uIG9ud3JpdGUoc3RyZWFtLCBlcikge1xuICB2YXIgc3RhdGUgPSBzdHJlYW0uX3dyaXRhYmxlU3RhdGU7XG4gIHZhciBzeW5jID0gc3RhdGUuc3luYztcbiAgdmFyIGNiID0gc3RhdGUud3JpdGVjYjtcblxuICBvbndyaXRlU3RhdGVVcGRhdGUoc3RhdGUpO1xuXG4gIGlmIChlcilcbiAgICBvbndyaXRlRXJyb3Ioc3RyZWFtLCBzdGF0ZSwgc3luYywgZXIsIGNiKTtcbiAgZWxzZSB7XG4gICAgLy8gQ2hlY2sgaWYgd2UncmUgYWN0dWFsbHkgcmVhZHkgdG8gZmluaXNoLCBidXQgZG9uJ3QgZW1pdCB5ZXRcbiAgICB2YXIgZmluaXNoZWQgPSBuZWVkRmluaXNoKHN0YXRlKTtcblxuICAgIGlmICghZmluaXNoZWQgJiZcbiAgICAgICAgIXN0YXRlLmNvcmtlZCAmJlxuICAgICAgICAhc3RhdGUuYnVmZmVyUHJvY2Vzc2luZyAmJlxuICAgICAgICBzdGF0ZS5idWZmZXJlZFJlcXVlc3QpIHtcbiAgICAgIGNsZWFyQnVmZmVyKHN0cmVhbSwgc3RhdGUpO1xuICAgIH1cblxuICAgIGlmIChzeW5jKSB7XG4gICAgICBwcm9jZXNzTmV4dFRpY2soYWZ0ZXJXcml0ZSwgc3RyZWFtLCBzdGF0ZSwgZmluaXNoZWQsIGNiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYWZ0ZXJXcml0ZShzdHJlYW0sIHN0YXRlLCBmaW5pc2hlZCwgY2IpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBhZnRlcldyaXRlKHN0cmVhbSwgc3RhdGUsIGZpbmlzaGVkLCBjYikge1xuICBpZiAoIWZpbmlzaGVkKVxuICAgIG9ud3JpdGVEcmFpbihzdHJlYW0sIHN0YXRlKTtcbiAgc3RhdGUucGVuZGluZ2NiLS07XG4gIGNiKCk7XG4gIGZpbmlzaE1heWJlKHN0cmVhbSwgc3RhdGUpO1xufVxuXG4vLyBNdXN0IGZvcmNlIGNhbGxiYWNrIHRvIGJlIGNhbGxlZCBvbiBuZXh0VGljaywgc28gdGhhdCB3ZSBkb24ndFxuLy8gZW1pdCAnZHJhaW4nIGJlZm9yZSB0aGUgd3JpdGUoKSBjb25zdW1lciBnZXRzIHRoZSAnZmFsc2UnIHJldHVyblxuLy8gdmFsdWUsIGFuZCBoYXMgYSBjaGFuY2UgdG8gYXR0YWNoIGEgJ2RyYWluJyBsaXN0ZW5lci5cbmZ1bmN0aW9uIG9ud3JpdGVEcmFpbihzdHJlYW0sIHN0YXRlKSB7XG4gIGlmIChzdGF0ZS5sZW5ndGggPT09IDAgJiYgc3RhdGUubmVlZERyYWluKSB7XG4gICAgc3RhdGUubmVlZERyYWluID0gZmFsc2U7XG4gICAgc3RyZWFtLmVtaXQoJ2RyYWluJyk7XG4gIH1cbn1cblxuXG4vLyBpZiB0aGVyZSdzIHNvbWV0aGluZyBpbiB0aGUgYnVmZmVyIHdhaXRpbmcsIHRoZW4gcHJvY2VzcyBpdFxuZnVuY3Rpb24gY2xlYXJCdWZmZXIoc3RyZWFtLCBzdGF0ZSkge1xuICBzdGF0ZS5idWZmZXJQcm9jZXNzaW5nID0gdHJ1ZTtcbiAgdmFyIGVudHJ5ID0gc3RhdGUuYnVmZmVyZWRSZXF1ZXN0O1xuXG4gIGlmIChzdHJlYW0uX3dyaXRldiAmJiBlbnRyeSAmJiBlbnRyeS5uZXh0KSB7XG4gICAgLy8gRmFzdCBjYXNlLCB3cml0ZSBldmVyeXRoaW5nIHVzaW5nIF93cml0ZXYoKVxuICAgIHZhciBidWZmZXIgPSBbXTtcbiAgICB2YXIgY2JzID0gW107XG4gICAgd2hpbGUgKGVudHJ5KSB7XG4gICAgICBjYnMucHVzaChlbnRyeS5jYWxsYmFjayk7XG4gICAgICBidWZmZXIucHVzaChlbnRyeSk7XG4gICAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7XG4gICAgfVxuXG4gICAgLy8gY291bnQgdGhlIG9uZSB3ZSBhcmUgYWRkaW5nLCBhcyB3ZWxsLlxuICAgIC8vIFRPRE8oaXNhYWNzKSBjbGVhbiB0aGlzIHVwXG4gICAgc3RhdGUucGVuZGluZ2NiKys7XG4gICAgc3RhdGUubGFzdEJ1ZmZlcmVkUmVxdWVzdCA9IG51bGw7XG4gICAgZG9Xcml0ZShzdHJlYW0sIHN0YXRlLCB0cnVlLCBzdGF0ZS5sZW5ndGgsIGJ1ZmZlciwgJycsIGZ1bmN0aW9uKGVycikge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjYnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgc3RhdGUucGVuZGluZ2NiLS07XG4gICAgICAgIGNic1tpXShlcnIpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gQ2xlYXIgYnVmZmVyXG4gIH0gZWxzZSB7XG4gICAgLy8gU2xvdyBjYXNlLCB3cml0ZSBjaHVua3Mgb25lLWJ5LW9uZVxuICAgIHdoaWxlIChlbnRyeSkge1xuICAgICAgdmFyIGNodW5rID0gZW50cnkuY2h1bms7XG4gICAgICB2YXIgZW5jb2RpbmcgPSBlbnRyeS5lbmNvZGluZztcbiAgICAgIHZhciBjYiA9IGVudHJ5LmNhbGxiYWNrO1xuICAgICAgdmFyIGxlbiA9IHN0YXRlLm9iamVjdE1vZGUgPyAxIDogY2h1bmsubGVuZ3RoO1xuXG4gICAgICBkb1dyaXRlKHN0cmVhbSwgc3RhdGUsIGZhbHNlLCBsZW4sIGNodW5rLCBlbmNvZGluZywgY2IpO1xuICAgICAgZW50cnkgPSBlbnRyeS5uZXh0O1xuICAgICAgLy8gaWYgd2UgZGlkbid0IGNhbGwgdGhlIG9ud3JpdGUgaW1tZWRpYXRlbHksIHRoZW5cbiAgICAgIC8vIGl0IG1lYW5zIHRoYXQgd2UgbmVlZCB0byB3YWl0IHVudGlsIGl0IGRvZXMuXG4gICAgICAvLyBhbHNvLCB0aGF0IG1lYW5zIHRoYXQgdGhlIGNodW5rIGFuZCBjYiBhcmUgY3VycmVudGx5XG4gICAgICAvLyBiZWluZyBwcm9jZXNzZWQsIHNvIG1vdmUgdGhlIGJ1ZmZlciBjb3VudGVyIHBhc3QgdGhlbS5cbiAgICAgIGlmIChzdGF0ZS53cml0aW5nKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChlbnRyeSA9PT0gbnVsbClcbiAgICAgIHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3QgPSBudWxsO1xuICB9XG4gIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdCA9IGVudHJ5O1xuICBzdGF0ZS5idWZmZXJQcm9jZXNzaW5nID0gZmFsc2U7XG59XG5cbldyaXRhYmxlLnByb3RvdHlwZS5fd3JpdGUgPSBmdW5jdGlvbihjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIGNiKG5ldyBFcnJvcignbm90IGltcGxlbWVudGVkJykpO1xufTtcblxuV3JpdGFibGUucHJvdG90eXBlLl93cml0ZXYgPSBudWxsO1xuXG5Xcml0YWJsZS5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24oY2h1bmssIGVuY29kaW5nLCBjYikge1xuICB2YXIgc3RhdGUgPSB0aGlzLl93cml0YWJsZVN0YXRlO1xuXG4gIGlmICh0eXBlb2YgY2h1bmsgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYiA9IGNodW5rO1xuICAgIGNodW5rID0gbnVsbDtcbiAgICBlbmNvZGluZyA9IG51bGw7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2IgPSBlbmNvZGluZztcbiAgICBlbmNvZGluZyA9IG51bGw7XG4gIH1cblxuICBpZiAoY2h1bmsgIT09IG51bGwgJiYgY2h1bmsgIT09IHVuZGVmaW5lZClcbiAgICB0aGlzLndyaXRlKGNodW5rLCBlbmNvZGluZyk7XG5cbiAgLy8gLmVuZCgpIGZ1bGx5IHVuY29ya3NcbiAgaWYgKHN0YXRlLmNvcmtlZCkge1xuICAgIHN0YXRlLmNvcmtlZCA9IDE7XG4gICAgdGhpcy51bmNvcmsoKTtcbiAgfVxuXG4gIC8vIGlnbm9yZSB1bm5lY2Vzc2FyeSBlbmQoKSBjYWxscy5cbiAgaWYgKCFzdGF0ZS5lbmRpbmcgJiYgIXN0YXRlLmZpbmlzaGVkKVxuICAgIGVuZFdyaXRhYmxlKHRoaXMsIHN0YXRlLCBjYik7XG59O1xuXG5cbmZ1bmN0aW9uIG5lZWRGaW5pc2goc3RhdGUpIHtcbiAgcmV0dXJuIChzdGF0ZS5lbmRpbmcgJiZcbiAgICAgICAgICBzdGF0ZS5sZW5ndGggPT09IDAgJiZcbiAgICAgICAgICBzdGF0ZS5idWZmZXJlZFJlcXVlc3QgPT09IG51bGwgJiZcbiAgICAgICAgICAhc3RhdGUuZmluaXNoZWQgJiZcbiAgICAgICAgICAhc3RhdGUud3JpdGluZyk7XG59XG5cbmZ1bmN0aW9uIHByZWZpbmlzaChzdHJlYW0sIHN0YXRlKSB7XG4gIGlmICghc3RhdGUucHJlZmluaXNoZWQpIHtcbiAgICBzdGF0ZS5wcmVmaW5pc2hlZCA9IHRydWU7XG4gICAgc3RyZWFtLmVtaXQoJ3ByZWZpbmlzaCcpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmlzaE1heWJlKHN0cmVhbSwgc3RhdGUpIHtcbiAgdmFyIG5lZWQgPSBuZWVkRmluaXNoKHN0YXRlKTtcbiAgaWYgKG5lZWQpIHtcbiAgICBpZiAoc3RhdGUucGVuZGluZ2NiID09PSAwKSB7XG4gICAgICBwcmVmaW5pc2goc3RyZWFtLCBzdGF0ZSk7XG4gICAgICBzdGF0ZS5maW5pc2hlZCA9IHRydWU7XG4gICAgICBzdHJlYW0uZW1pdCgnZmluaXNoJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByZWZpbmlzaChzdHJlYW0sIHN0YXRlKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG5lZWQ7XG59XG5cbmZ1bmN0aW9uIGVuZFdyaXRhYmxlKHN0cmVhbSwgc3RhdGUsIGNiKSB7XG4gIHN0YXRlLmVuZGluZyA9IHRydWU7XG4gIGZpbmlzaE1heWJlKHN0cmVhbSwgc3RhdGUpO1xuICBpZiAoY2IpIHtcbiAgICBpZiAoc3RhdGUuZmluaXNoZWQpXG4gICAgICBwcm9jZXNzTmV4dFRpY2soY2IpO1xuICAgIGVsc2VcbiAgICAgIHN0cmVhbS5vbmNlKCdmaW5pc2gnLCBjYik7XG4gIH1cbiAgc3RhdGUuZW5kZWQgPSB0cnVlO1xufVxuIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiLi9saWIvX3N0cmVhbV9wYXNzdGhyb3VnaC5qc1wiKVxuIiwidmFyIFN0cmVhbSA9IChmdW5jdGlvbiAoKXtcbiAgdHJ5IHtcbiAgICByZXR1cm4gcmVxdWlyZSgnc3QnICsgJ3JlYW0nKTsgLy8gaGFjayB0byBmaXggYSBjaXJjdWxhciBkZXBlbmRlbmN5IGlzc3VlIHdoZW4gdXNlZCB3aXRoIGJyb3dzZXJpZnlcbiAgfSBjYXRjaChfKXt9XG59KCkpO1xuZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9saWIvX3N0cmVhbV9yZWFkYWJsZS5qcycpO1xuZXhwb3J0cy5TdHJlYW0gPSBTdHJlYW0gfHwgZXhwb3J0cztcbmV4cG9ydHMuUmVhZGFibGUgPSBleHBvcnRzO1xuZXhwb3J0cy5Xcml0YWJsZSA9IHJlcXVpcmUoJy4vbGliL19zdHJlYW1fd3JpdGFibGUuanMnKTtcbmV4cG9ydHMuRHVwbGV4ID0gcmVxdWlyZSgnLi9saWIvX3N0cmVhbV9kdXBsZXguanMnKTtcbmV4cG9ydHMuVHJhbnNmb3JtID0gcmVxdWlyZSgnLi9saWIvX3N0cmVhbV90cmFuc2Zvcm0uanMnKTtcbmV4cG9ydHMuUGFzc1Rocm91Z2ggPSByZXF1aXJlKCcuL2xpYi9fc3RyZWFtX3Bhc3N0aHJvdWdoLmpzJyk7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCIuL2xpYi9fc3RyZWFtX3RyYW5zZm9ybS5qc1wiKVxuIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiLi9saWIvX3N0cmVhbV93cml0YWJsZS5qc1wiKVxuIiwiLypcbkNyeXB0b0pTIHYzLjEuMlxuY29kZS5nb29nbGUuY29tL3AvY3J5cHRvLWpzXG4oYykgMjAwOS0yMDEzIGJ5IEplZmYgTW90dC4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbmNvZGUuZ29vZ2xlLmNvbS9wL2NyeXB0by1qcy93aWtpL0xpY2Vuc2VcbiovXG4vKiogQHByZXNlcnZlXG4oYykgMjAxMiBieSBDw6lkcmljIE1lc25pbC4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cblxuUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuXG4gICAgLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4gICAgLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uXG5cblRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbi8vIGNvbnN0YW50cyB0YWJsZVxudmFyIHpsID0gW1xuICAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LFxuICA3LCA0LCAxMywgMSwgMTAsIDYsIDE1LCAzLCAxMiwgMCwgOSwgNSwgMiwgMTQsIDExLCA4LFxuICAzLCAxMCwgMTQsIDQsIDksIDE1LCA4LCAxLCAyLCA3LCAwLCA2LCAxMywgMTEsIDUsIDEyLFxuICAxLCA5LCAxMSwgMTAsIDAsIDgsIDEyLCA0LCAxMywgMywgNywgMTUsIDE0LCA1LCA2LCAyLFxuICA0LCAwLCA1LCA5LCA3LCAxMiwgMiwgMTAsIDE0LCAxLCAzLCA4LCAxMSwgNiwgMTUsIDEzXG5dXG5cbnZhciB6ciA9IFtcbiAgNSwgMTQsIDcsIDAsIDksIDIsIDExLCA0LCAxMywgNiwgMTUsIDgsIDEsIDEwLCAzLCAxMixcbiAgNiwgMTEsIDMsIDcsIDAsIDEzLCA1LCAxMCwgMTQsIDE1LCA4LCAxMiwgNCwgOSwgMSwgMixcbiAgMTUsIDUsIDEsIDMsIDcsIDE0LCA2LCA5LCAxMSwgOCwgMTIsIDIsIDEwLCAwLCA0LCAxMyxcbiAgOCwgNiwgNCwgMSwgMywgMTEsIDE1LCAwLCA1LCAxMiwgMiwgMTMsIDksIDcsIDEwLCAxNCxcbiAgMTIsIDE1LCAxMCwgNCwgMSwgNSwgOCwgNywgNiwgMiwgMTMsIDE0LCAwLCAzLCA5LCAxMVxuXVxuXG52YXIgc2wgPSBbXG4gIDExLCAxNCwgMTUsIDEyLCA1LCA4LCA3LCA5LCAxMSwgMTMsIDE0LCAxNSwgNiwgNywgOSwgOCxcbiAgNywgNiwgOCwgMTMsIDExLCA5LCA3LCAxNSwgNywgMTIsIDE1LCA5LCAxMSwgNywgMTMsIDEyLFxuICAxMSwgMTMsIDYsIDcsIDE0LCA5LCAxMywgMTUsIDE0LCA4LCAxMywgNiwgNSwgMTIsIDcsIDUsXG4gIDExLCAxMiwgMTQsIDE1LCAxNCwgMTUsIDksIDgsIDksIDE0LCA1LCA2LCA4LCA2LCA1LCAxMixcbiAgOSwgMTUsIDUsIDExLCA2LCA4LCAxMywgMTIsIDUsIDEyLCAxMywgMTQsIDExLCA4LCA1LCA2XG5dXG5cbnZhciBzciA9IFtcbiAgOCwgOSwgOSwgMTEsIDEzLCAxNSwgMTUsIDUsIDcsIDcsIDgsIDExLCAxNCwgMTQsIDEyLCA2LFxuICA5LCAxMywgMTUsIDcsIDEyLCA4LCA5LCAxMSwgNywgNywgMTIsIDcsIDYsIDE1LCAxMywgMTEsXG4gIDksIDcsIDE1LCAxMSwgOCwgNiwgNiwgMTQsIDEyLCAxMywgNSwgMTQsIDEzLCAxMywgNywgNSxcbiAgMTUsIDUsIDgsIDExLCAxNCwgMTQsIDYsIDE0LCA2LCA5LCAxMiwgOSwgMTIsIDUsIDE1LCA4LFxuICA4LCA1LCAxMiwgOSwgMTIsIDUsIDE0LCA2LCA4LCAxMywgNiwgNSwgMTUsIDEzLCAxMSwgMTFcbl1cblxudmFyIGhsID0gWzB4MDAwMDAwMDAsIDB4NUE4Mjc5OTksIDB4NkVEOUVCQTEsIDB4OEYxQkJDREMsIDB4QTk1M0ZENEVdXG52YXIgaHIgPSBbMHg1MEEyOEJFNiwgMHg1QzRERDEyNCwgMHg2RDcwM0VGMywgMHg3QTZENzZFOSwgMHgwMDAwMDAwMF1cblxuZnVuY3Rpb24gYnl0ZXNUb1dvcmRzIChieXRlcykge1xuICB2YXIgd29yZHMgPSBbXVxuICBmb3IgKHZhciBpID0gMCwgYiA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkrKywgYiArPSA4KSB7XG4gICAgd29yZHNbYiA+Pj4gNV0gfD0gYnl0ZXNbaV0gPDwgKDI0IC0gYiAlIDMyKVxuICB9XG4gIHJldHVybiB3b3Jkc1xufVxuXG5mdW5jdGlvbiB3b3Jkc1RvQnl0ZXMgKHdvcmRzKSB7XG4gIHZhciBieXRlcyA9IFtdXG4gIGZvciAodmFyIGIgPSAwOyBiIDwgd29yZHMubGVuZ3RoICogMzI7IGIgKz0gOCkge1xuICAgIGJ5dGVzLnB1c2goKHdvcmRzW2IgPj4+IDVdID4+PiAoMjQgLSBiICUgMzIpKSAmIDB4RkYpXG4gIH1cbiAgcmV0dXJuIGJ5dGVzXG59XG5cbmZ1bmN0aW9uIHByb2Nlc3NCbG9jayAoSCwgTSwgb2Zmc2V0KSB7XG4gIC8vIHN3YXAgZW5kaWFuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgMTY7IGkrKykge1xuICAgIHZhciBvZmZzZXRfaSA9IG9mZnNldCArIGlcbiAgICB2YXIgTV9vZmZzZXRfaSA9IE1bb2Zmc2V0X2ldXG5cbiAgICAvLyBTd2FwXG4gICAgTVtvZmZzZXRfaV0gPSAoXG4gICAgICAoKChNX29mZnNldF9pIDw8IDgpIHwgKE1fb2Zmc2V0X2kgPj4+IDI0KSkgJiAweDAwZmYwMGZmKSB8XG4gICAgICAoKChNX29mZnNldF9pIDw8IDI0KSB8IChNX29mZnNldF9pID4+PiA4KSkgJiAweGZmMDBmZjAwKVxuICAgIClcbiAgfVxuXG4gIC8vIFdvcmtpbmcgdmFyaWFibGVzXG4gIHZhciBhbCwgYmwsIGNsLCBkbCwgZWxcbiAgdmFyIGFyLCBiciwgY3IsIGRyLCBlclxuXG4gIGFyID0gYWwgPSBIWzBdXG4gIGJyID0gYmwgPSBIWzFdXG4gIGNyID0gY2wgPSBIWzJdXG4gIGRyID0gZGwgPSBIWzNdXG4gIGVyID0gZWwgPSBIWzRdXG5cbiAgLy8gY29tcHV0YXRpb25cbiAgdmFyIHRcbiAgZm9yIChpID0gMDsgaSA8IDgwOyBpICs9IDEpIHtcbiAgICB0ID0gKGFsICsgTVtvZmZzZXQgKyB6bFtpXV0pIHwgMFxuICAgIGlmIChpIDwgMTYpIHtcbiAgICAgIHQgKz0gZjEoYmwsIGNsLCBkbCkgKyBobFswXVxuICAgIH0gZWxzZSBpZiAoaSA8IDMyKSB7XG4gICAgICB0ICs9IGYyKGJsLCBjbCwgZGwpICsgaGxbMV1cbiAgICB9IGVsc2UgaWYgKGkgPCA0OCkge1xuICAgICAgdCArPSBmMyhibCwgY2wsIGRsKSArIGhsWzJdXG4gICAgfSBlbHNlIGlmIChpIDwgNjQpIHtcbiAgICAgIHQgKz0gZjQoYmwsIGNsLCBkbCkgKyBobFszXVxuICAgIH0gZWxzZSB7Ly8gaWYgKGk8ODApIHtcbiAgICAgIHQgKz0gZjUoYmwsIGNsLCBkbCkgKyBobFs0XVxuICAgIH1cbiAgICB0ID0gdCB8IDBcbiAgICB0ID0gcm90bCh0LCBzbFtpXSlcbiAgICB0ID0gKHQgKyBlbCkgfCAwXG4gICAgYWwgPSBlbFxuICAgIGVsID0gZGxcbiAgICBkbCA9IHJvdGwoY2wsIDEwKVxuICAgIGNsID0gYmxcbiAgICBibCA9IHRcblxuICAgIHQgPSAoYXIgKyBNW29mZnNldCArIHpyW2ldXSkgfCAwXG4gICAgaWYgKGkgPCAxNikge1xuICAgICAgdCArPSBmNShiciwgY3IsIGRyKSArIGhyWzBdXG4gICAgfSBlbHNlIGlmIChpIDwgMzIpIHtcbiAgICAgIHQgKz0gZjQoYnIsIGNyLCBkcikgKyBoclsxXVxuICAgIH0gZWxzZSBpZiAoaSA8IDQ4KSB7XG4gICAgICB0ICs9IGYzKGJyLCBjciwgZHIpICsgaHJbMl1cbiAgICB9IGVsc2UgaWYgKGkgPCA2NCkge1xuICAgICAgdCArPSBmMihiciwgY3IsIGRyKSArIGhyWzNdXG4gICAgfSBlbHNlIHsvLyBpZiAoaTw4MCkge1xuICAgICAgdCArPSBmMShiciwgY3IsIGRyKSArIGhyWzRdXG4gICAgfVxuXG4gICAgdCA9IHQgfCAwXG4gICAgdCA9IHJvdGwodCwgc3JbaV0pXG4gICAgdCA9ICh0ICsgZXIpIHwgMFxuICAgIGFyID0gZXJcbiAgICBlciA9IGRyXG4gICAgZHIgPSByb3RsKGNyLCAxMClcbiAgICBjciA9IGJyXG4gICAgYnIgPSB0XG4gIH1cblxuICAvLyBpbnRlcm1lZGlhdGUgaGFzaCB2YWx1ZVxuICB0ID0gKEhbMV0gKyBjbCArIGRyKSB8IDBcbiAgSFsxXSA9IChIWzJdICsgZGwgKyBlcikgfCAwXG4gIEhbMl0gPSAoSFszXSArIGVsICsgYXIpIHwgMFxuICBIWzNdID0gKEhbNF0gKyBhbCArIGJyKSB8IDBcbiAgSFs0XSA9IChIWzBdICsgYmwgKyBjcikgfCAwXG4gIEhbMF0gPSB0XG59XG5cbmZ1bmN0aW9uIGYxICh4LCB5LCB6KSB7XG4gIHJldHVybiAoKHgpIF4gKHkpIF4gKHopKVxufVxuXG5mdW5jdGlvbiBmMiAoeCwgeSwgeikge1xuICByZXR1cm4gKCgoeCkgJiAoeSkpIHwgKCh+eCkgJiAoeikpKVxufVxuXG5mdW5jdGlvbiBmMyAoeCwgeSwgeikge1xuICByZXR1cm4gKCgoeCkgfCAofih5KSkpIF4gKHopKVxufVxuXG5mdW5jdGlvbiBmNCAoeCwgeSwgeikge1xuICByZXR1cm4gKCgoeCkgJiAoeikpIHwgKCh5KSAmICh+KHopKSkpXG59XG5cbmZ1bmN0aW9uIGY1ICh4LCB5LCB6KSB7XG4gIHJldHVybiAoKHgpIF4gKCh5KSB8ICh+KHopKSkpXG59XG5cbmZ1bmN0aW9uIHJvdGwgKHgsIG4pIHtcbiAgcmV0dXJuICh4IDw8IG4pIHwgKHggPj4+ICgzMiAtIG4pKVxufVxuXG5mdW5jdGlvbiByaXBlbWQxNjAgKG1lc3NhZ2UpIHtcbiAgdmFyIEggPSBbMHg2NzQ1MjMwMSwgMHhFRkNEQUI4OSwgMHg5OEJBRENGRSwgMHgxMDMyNTQ3NiwgMHhDM0QyRTFGMF1cblxuICBpZiAodHlwZW9mIG1lc3NhZ2UgPT09ICdzdHJpbmcnKSB7XG4gICAgbWVzc2FnZSA9IG5ldyBCdWZmZXIobWVzc2FnZSwgJ3V0ZjgnKVxuICB9XG5cbiAgdmFyIG0gPSBieXRlc1RvV29yZHMobWVzc2FnZSlcblxuICB2YXIgbkJpdHNMZWZ0ID0gbWVzc2FnZS5sZW5ndGggKiA4XG4gIHZhciBuQml0c1RvdGFsID0gbWVzc2FnZS5sZW5ndGggKiA4XG5cbiAgLy8gQWRkIHBhZGRpbmdcbiAgbVtuQml0c0xlZnQgPj4+IDVdIHw9IDB4ODAgPDwgKDI0IC0gbkJpdHNMZWZ0ICUgMzIpXG4gIG1bKCgobkJpdHNMZWZ0ICsgNjQpID4+PiA5KSA8PCA0KSArIDE0XSA9IChcbiAgICAoKChuQml0c1RvdGFsIDw8IDgpIHwgKG5CaXRzVG90YWwgPj4+IDI0KSkgJiAweDAwZmYwMGZmKSB8XG4gICAgKCgobkJpdHNUb3RhbCA8PCAyNCkgfCAobkJpdHNUb3RhbCA+Pj4gOCkpICYgMHhmZjAwZmYwMClcbiAgKVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbS5sZW5ndGg7IGkgKz0gMTYpIHtcbiAgICBwcm9jZXNzQmxvY2soSCwgbSwgaSlcbiAgfVxuXG4gIC8vIHN3YXAgZW5kaWFuXG4gIGZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHtcbiAgICAvLyBzaG9ydGN1dFxuICAgIHZhciBIX2kgPSBIW2ldXG5cbiAgICAvLyBTd2FwXG4gICAgSFtpXSA9ICgoKEhfaSA8PCA4KSB8IChIX2kgPj4+IDI0KSkgJiAweDAwZmYwMGZmKSB8XG4gICAgICAoKChIX2kgPDwgMjQpIHwgKEhfaSA+Pj4gOCkpICYgMHhmZjAwZmYwMClcbiAgfVxuXG4gIHZhciBkaWdlc3RieXRlcyA9IHdvcmRzVG9CeXRlcyhIKVxuICByZXR1cm4gbmV3IEJ1ZmZlcihkaWdlc3RieXRlcylcbn1cblxubW9kdWxlLmV4cG9ydHMgPSByaXBlbWQxNjBcbiIsIi8vIHByb3RvdHlwZSBjbGFzcyBmb3IgaGFzaCBmdW5jdGlvbnNcbmZ1bmN0aW9uIEhhc2ggKGJsb2NrU2l6ZSwgZmluYWxTaXplKSB7XG4gIHRoaXMuX2Jsb2NrID0gbmV3IEJ1ZmZlcihibG9ja1NpemUpXG4gIHRoaXMuX2ZpbmFsU2l6ZSA9IGZpbmFsU2l6ZVxuICB0aGlzLl9ibG9ja1NpemUgPSBibG9ja1NpemVcbiAgdGhpcy5fbGVuID0gMFxuICB0aGlzLl9zID0gMFxufVxuXG5IYXNoLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiAoZGF0YSwgZW5jKSB7XG4gIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICBlbmMgPSBlbmMgfHwgJ3V0ZjgnXG4gICAgZGF0YSA9IG5ldyBCdWZmZXIoZGF0YSwgZW5jKVxuICB9XG5cbiAgdmFyIGwgPSB0aGlzLl9sZW4gKz0gZGF0YS5sZW5ndGhcbiAgdmFyIHMgPSB0aGlzLl9zIHx8IDBcbiAgdmFyIGYgPSAwXG4gIHZhciBidWZmZXIgPSB0aGlzLl9ibG9ja1xuXG4gIHdoaWxlIChzIDwgbCkge1xuICAgIHZhciB0ID0gTWF0aC5taW4oZGF0YS5sZW5ndGgsIGYgKyB0aGlzLl9ibG9ja1NpemUgLSAocyAlIHRoaXMuX2Jsb2NrU2l6ZSkpXG4gICAgdmFyIGNoID0gKHQgLSBmKVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaDsgaSsrKSB7XG4gICAgICBidWZmZXJbKHMgJSB0aGlzLl9ibG9ja1NpemUpICsgaV0gPSBkYXRhW2kgKyBmXVxuICAgIH1cblxuICAgIHMgKz0gY2hcbiAgICBmICs9IGNoXG5cbiAgICBpZiAoKHMgJSB0aGlzLl9ibG9ja1NpemUpID09PSAwKSB7XG4gICAgICB0aGlzLl91cGRhdGUoYnVmZmVyKVxuICAgIH1cbiAgfVxuICB0aGlzLl9zID0gc1xuXG4gIHJldHVybiB0aGlzXG59XG5cbkhhc2gucHJvdG90eXBlLmRpZ2VzdCA9IGZ1bmN0aW9uIChlbmMpIHtcbiAgLy8gU3VwcG9zZSB0aGUgbGVuZ3RoIG9mIHRoZSBtZXNzYWdlIE0sIGluIGJpdHMsIGlzIGxcbiAgdmFyIGwgPSB0aGlzLl9sZW4gKiA4XG5cbiAgLy8gQXBwZW5kIHRoZSBiaXQgMSB0byB0aGUgZW5kIG9mIHRoZSBtZXNzYWdlXG4gIHRoaXMuX2Jsb2NrW3RoaXMuX2xlbiAlIHRoaXMuX2Jsb2NrU2l6ZV0gPSAweDgwXG5cbiAgLy8gYW5kIHRoZW4gayB6ZXJvIGJpdHMsIHdoZXJlIGsgaXMgdGhlIHNtYWxsZXN0IG5vbi1uZWdhdGl2ZSBzb2x1dGlvbiB0byB0aGUgZXF1YXRpb24gKGwgKyAxICsgaykgPT09IGZpbmFsU2l6ZSBtb2QgYmxvY2tTaXplXG4gIHRoaXMuX2Jsb2NrLmZpbGwoMCwgdGhpcy5fbGVuICUgdGhpcy5fYmxvY2tTaXplICsgMSlcblxuICBpZiAobCAlICh0aGlzLl9ibG9ja1NpemUgKiA4KSA+PSB0aGlzLl9maW5hbFNpemUgKiA4KSB7XG4gICAgdGhpcy5fdXBkYXRlKHRoaXMuX2Jsb2NrKVxuICAgIHRoaXMuX2Jsb2NrLmZpbGwoMClcbiAgfVxuXG4gIC8vIHRvIHRoaXMgYXBwZW5kIHRoZSBibG9jayB3aGljaCBpcyBlcXVhbCB0byB0aGUgbnVtYmVyIGwgd3JpdHRlbiBpbiBiaW5hcnlcbiAgLy8gVE9ETzogaGFuZGxlIGNhc2Ugd2hlcmUgbCBpcyA+IE1hdGgucG93KDIsIDI5KVxuICB0aGlzLl9ibG9jay53cml0ZUludDMyQkUobCwgdGhpcy5fYmxvY2tTaXplIC0gNClcblxuICB2YXIgaGFzaCA9IHRoaXMuX3VwZGF0ZSh0aGlzLl9ibG9jaykgfHwgdGhpcy5faGFzaCgpXG5cbiAgcmV0dXJuIGVuYyA/IGhhc2gudG9TdHJpbmcoZW5jKSA6IGhhc2hcbn1cblxuSGFzaC5wcm90b3R5cGUuX3VwZGF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgdGhyb3cgbmV3IEVycm9yKCdfdXBkYXRlIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3MnKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IEhhc2hcbiIsInZhciBleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBTSEEgKGFsZ29yaXRobSkge1xuICBhbGdvcml0aG0gPSBhbGdvcml0aG0udG9Mb3dlckNhc2UoKVxuXG4gIHZhciBBbGdvcml0aG0gPSBleHBvcnRzW2FsZ29yaXRobV1cbiAgaWYgKCFBbGdvcml0aG0pIHRocm93IG5ldyBFcnJvcihhbGdvcml0aG0gKyAnIGlzIG5vdCBzdXBwb3J0ZWQgKHdlIGFjY2VwdCBwdWxsIHJlcXVlc3RzKScpXG5cbiAgcmV0dXJuIG5ldyBBbGdvcml0aG0oKVxufVxuXG5leHBvcnRzLnNoYSA9IHJlcXVpcmUoJy4vc2hhJylcbmV4cG9ydHMuc2hhMSA9IHJlcXVpcmUoJy4vc2hhMScpXG5leHBvcnRzLnNoYTIyNCA9IHJlcXVpcmUoJy4vc2hhMjI0JylcbmV4cG9ydHMuc2hhMjU2ID0gcmVxdWlyZSgnLi9zaGEyNTYnKVxuZXhwb3J0cy5zaGEzODQgPSByZXF1aXJlKCcuL3NoYTM4NCcpXG5leHBvcnRzLnNoYTUxMiA9IHJlcXVpcmUoJy4vc2hhNTEyJylcbiIsIi8qXG4gKiBBIEphdmFTY3JpcHQgaW1wbGVtZW50YXRpb24gb2YgdGhlIFNlY3VyZSBIYXNoIEFsZ29yaXRobSwgU0hBLTAsIGFzIGRlZmluZWRcbiAqIGluIEZJUFMgUFVCIDE4MC0xXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGRlcml2ZWQgZnJvbSBzaGExLmpzIG9mIHRoZSBzYW1lIHJlcG9zaXRvcnkuXG4gKiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIFNIQS0wIGFuZCBTSEEtMSBpcyBqdXN0IGEgYml0d2lzZSByb3RhdGUgbGVmdFxuICogb3BlcmF0aW9uIHdhcyBhZGRlZC5cbiAqL1xuXG52YXIgaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpXG52YXIgSGFzaCA9IHJlcXVpcmUoJy4vaGFzaCcpXG5cbnZhciBXID0gbmV3IEFycmF5KDgwKVxuXG5mdW5jdGlvbiBTaGEgKCkge1xuICB0aGlzLmluaXQoKVxuICB0aGlzLl93ID0gV1xuXG4gIEhhc2guY2FsbCh0aGlzLCA2NCwgNTYpXG59XG5cbmluaGVyaXRzKFNoYSwgSGFzaClcblxuU2hhLnByb3RvdHlwZS5pbml0ID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLl9hID0gMHg2NzQ1MjMwMSB8IDBcbiAgdGhpcy5fYiA9IDB4ZWZjZGFiODkgfCAwXG4gIHRoaXMuX2MgPSAweDk4YmFkY2ZlIHwgMFxuICB0aGlzLl9kID0gMHgxMDMyNTQ3NiB8IDBcbiAgdGhpcy5fZSA9IDB4YzNkMmUxZjAgfCAwXG5cbiAgcmV0dXJuIHRoaXNcbn1cblxuLypcbiAqIEJpdHdpc2Ugcm90YXRlIGEgMzItYml0IG51bWJlciB0byB0aGUgbGVmdC5cbiAqL1xuZnVuY3Rpb24gcm9sIChudW0sIGNudCkge1xuICByZXR1cm4gKG51bSA8PCBjbnQpIHwgKG51bSA+Pj4gKDMyIC0gY250KSlcbn1cblxuU2hhLnByb3RvdHlwZS5fdXBkYXRlID0gZnVuY3Rpb24gKE0pIHtcbiAgdmFyIFcgPSB0aGlzLl93XG5cbiAgdmFyIGEgPSB0aGlzLl9hXG4gIHZhciBiID0gdGhpcy5fYlxuICB2YXIgYyA9IHRoaXMuX2NcbiAgdmFyIGQgPSB0aGlzLl9kXG4gIHZhciBlID0gdGhpcy5fZVxuXG4gIHZhciBqID0gMFxuICB2YXIga1xuXG4gIC8qXG4gICAqIFNIQS0xIGhhcyBhIGJpdHdpc2Ugcm90YXRlIGxlZnQgb3BlcmF0aW9uLiBCdXQsIFNIQSBpcyBub3RcbiAgICogZnVuY3Rpb24gY2FsY1coKSB7IHJldHVybiByb2woV1tqIC0gM10gXiBXW2ogLSAgOF0gXiBXW2ogLSAxNF0gXiBXW2ogLSAxNl0sIDEpIH1cbiAgICovXG4gIGZ1bmN0aW9uIGNhbGNXICgpIHsgcmV0dXJuIFdbaiAtIDNdIF4gV1tqIC0gOF0gXiBXW2ogLSAxNF0gXiBXW2ogLSAxNl0gfVxuICBmdW5jdGlvbiBsb29wICh3LCBmKSB7XG4gICAgV1tqXSA9IHdcblxuICAgIHZhciB0ID0gcm9sKGEsIDUpICsgZiArIGUgKyB3ICsga1xuXG4gICAgZSA9IGRcbiAgICBkID0gY1xuICAgIGMgPSByb2woYiwgMzApXG4gICAgYiA9IGFcbiAgICBhID0gdFxuICAgIGorK1xuICB9XG5cbiAgayA9IDE1MTg1MDAyNDlcbiAgd2hpbGUgKGogPCAxNikgbG9vcChNLnJlYWRJbnQzMkJFKGogKiA0KSwgKGIgJiBjKSB8ICgofmIpICYgZCkpXG4gIHdoaWxlIChqIDwgMjApIGxvb3AoY2FsY1coKSwgKGIgJiBjKSB8ICgofmIpICYgZCkpXG4gIGsgPSAxODU5Nzc1MzkzXG4gIHdoaWxlIChqIDwgNDApIGxvb3AoY2FsY1coKSwgYiBeIGMgXiBkKVxuICBrID0gLTE4OTQwMDc1ODhcbiAgd2hpbGUgKGogPCA2MCkgbG9vcChjYWxjVygpLCAoYiAmIGMpIHwgKGIgJiBkKSB8IChjICYgZCkpXG4gIGsgPSAtODk5NDk3NTE0XG4gIHdoaWxlIChqIDwgODApIGxvb3AoY2FsY1coKSwgYiBeIGMgXiBkKVxuXG4gIHRoaXMuX2EgPSAoYSArIHRoaXMuX2EpIHwgMFxuICB0aGlzLl9iID0gKGIgKyB0aGlzLl9iKSB8IDBcbiAgdGhpcy5fYyA9IChjICsgdGhpcy5fYykgfCAwXG4gIHRoaXMuX2QgPSAoZCArIHRoaXMuX2QpIHwgMFxuICB0aGlzLl9lID0gKGUgKyB0aGlzLl9lKSB8IDBcbn1cblxuU2hhLnByb3RvdHlwZS5faGFzaCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIEggPSBuZXcgQnVmZmVyKDIwKVxuXG4gIEgud3JpdGVJbnQzMkJFKHRoaXMuX2EgfCAwLCAwKVxuICBILndyaXRlSW50MzJCRSh0aGlzLl9iIHwgMCwgNClcbiAgSC53cml0ZUludDMyQkUodGhpcy5fYyB8IDAsIDgpXG4gIEgud3JpdGVJbnQzMkJFKHRoaXMuX2QgfCAwLCAxMilcbiAgSC53cml0ZUludDMyQkUodGhpcy5fZSB8IDAsIDE2KVxuXG4gIHJldHVybiBIXG59XG5cbm1vZHVsZS5leHBvcnRzID0gU2hhXG5cbiIsIi8qXG4gKiBBIEphdmFTY3JpcHQgaW1wbGVtZW50YXRpb24gb2YgdGhlIFNlY3VyZSBIYXNoIEFsZ29yaXRobSwgU0hBLTEsIGFzIGRlZmluZWRcbiAqIGluIEZJUFMgUFVCIDE4MC0xXG4gKiBWZXJzaW9uIDIuMWEgQ29weXJpZ2h0IFBhdWwgSm9obnN0b24gMjAwMCAtIDIwMDIuXG4gKiBPdGhlciBjb250cmlidXRvcnM6IEdyZWcgSG9sdCwgQW5kcmV3IEtlcGVydCwgWWRuYXIsIExvc3RpbmV0XG4gKiBEaXN0cmlidXRlZCB1bmRlciB0aGUgQlNEIExpY2Vuc2VcbiAqIFNlZSBodHRwOi8vcGFqaG9tZS5vcmcudWsvY3J5cHQvbWQ1IGZvciBkZXRhaWxzLlxuICovXG5cbnZhciBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJylcbnZhciBIYXNoID0gcmVxdWlyZSgnLi9oYXNoJylcblxudmFyIFcgPSBuZXcgQXJyYXkoODApXG5cbmZ1bmN0aW9uIFNoYTEgKCkge1xuICB0aGlzLmluaXQoKVxuICB0aGlzLl93ID0gV1xuXG4gIEhhc2guY2FsbCh0aGlzLCA2NCwgNTYpXG59XG5cbmluaGVyaXRzKFNoYTEsIEhhc2gpXG5cblNoYTEucHJvdG90eXBlLmluaXQgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuX2EgPSAweDY3NDUyMzAxIHwgMFxuICB0aGlzLl9iID0gMHhlZmNkYWI4OSB8IDBcbiAgdGhpcy5fYyA9IDB4OThiYWRjZmUgfCAwXG4gIHRoaXMuX2QgPSAweDEwMzI1NDc2IHwgMFxuICB0aGlzLl9lID0gMHhjM2QyZTFmMCB8IDBcblxuICByZXR1cm4gdGhpc1xufVxuXG4vKlxuICogQml0d2lzZSByb3RhdGUgYSAzMi1iaXQgbnVtYmVyIHRvIHRoZSBsZWZ0LlxuICovXG5mdW5jdGlvbiByb2wgKG51bSwgY250KSB7XG4gIHJldHVybiAobnVtIDw8IGNudCkgfCAobnVtID4+PiAoMzIgLSBjbnQpKVxufVxuXG5TaGExLnByb3RvdHlwZS5fdXBkYXRlID0gZnVuY3Rpb24gKE0pIHtcbiAgdmFyIFcgPSB0aGlzLl93XG5cbiAgdmFyIGEgPSB0aGlzLl9hXG4gIHZhciBiID0gdGhpcy5fYlxuICB2YXIgYyA9IHRoaXMuX2NcbiAgdmFyIGQgPSB0aGlzLl9kXG4gIHZhciBlID0gdGhpcy5fZVxuXG4gIHZhciBqID0gMFxuICB2YXIga1xuXG4gIGZ1bmN0aW9uIGNhbGNXICgpIHsgcmV0dXJuIHJvbChXW2ogLSAzXSBeIFdbaiAtIDhdIF4gV1tqIC0gMTRdIF4gV1tqIC0gMTZdLCAxKSB9XG4gIGZ1bmN0aW9uIGxvb3AgKHcsIGYpIHtcbiAgICBXW2pdID0gd1xuXG4gICAgdmFyIHQgPSByb2woYSwgNSkgKyBmICsgZSArIHcgKyBrXG5cbiAgICBlID0gZFxuICAgIGQgPSBjXG4gICAgYyA9IHJvbChiLCAzMClcbiAgICBiID0gYVxuICAgIGEgPSB0XG4gICAgaisrXG4gIH1cblxuICBrID0gMTUxODUwMDI0OVxuICB3aGlsZSAoaiA8IDE2KSBsb29wKE0ucmVhZEludDMyQkUoaiAqIDQpLCAoYiAmIGMpIHwgKCh+YikgJiBkKSlcbiAgd2hpbGUgKGogPCAyMCkgbG9vcChjYWxjVygpLCAoYiAmIGMpIHwgKCh+YikgJiBkKSlcbiAgayA9IDE4NTk3NzUzOTNcbiAgd2hpbGUgKGogPCA0MCkgbG9vcChjYWxjVygpLCBiIF4gYyBeIGQpXG4gIGsgPSAtMTg5NDAwNzU4OFxuICB3aGlsZSAoaiA8IDYwKSBsb29wKGNhbGNXKCksIChiICYgYykgfCAoYiAmIGQpIHwgKGMgJiBkKSlcbiAgayA9IC04OTk0OTc1MTRcbiAgd2hpbGUgKGogPCA4MCkgbG9vcChjYWxjVygpLCBiIF4gYyBeIGQpXG5cbiAgdGhpcy5fYSA9IChhICsgdGhpcy5fYSkgfCAwXG4gIHRoaXMuX2IgPSAoYiArIHRoaXMuX2IpIHwgMFxuICB0aGlzLl9jID0gKGMgKyB0aGlzLl9jKSB8IDBcbiAgdGhpcy5fZCA9IChkICsgdGhpcy5fZCkgfCAwXG4gIHRoaXMuX2UgPSAoZSArIHRoaXMuX2UpIHwgMFxufVxuXG5TaGExLnByb3RvdHlwZS5faGFzaCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIEggPSBuZXcgQnVmZmVyKDIwKVxuXG4gIEgud3JpdGVJbnQzMkJFKHRoaXMuX2EgfCAwLCAwKVxuICBILndyaXRlSW50MzJCRSh0aGlzLl9iIHwgMCwgNClcbiAgSC53cml0ZUludDMyQkUodGhpcy5fYyB8IDAsIDgpXG4gIEgud3JpdGVJbnQzMkJFKHRoaXMuX2QgfCAwLCAxMilcbiAgSC53cml0ZUludDMyQkUodGhpcy5fZSB8IDAsIDE2KVxuXG4gIHJldHVybiBIXG59XG5cbm1vZHVsZS5leHBvcnRzID0gU2hhMVxuIiwiLyoqXG4gKiBBIEphdmFTY3JpcHQgaW1wbGVtZW50YXRpb24gb2YgdGhlIFNlY3VyZSBIYXNoIEFsZ29yaXRobSwgU0hBLTI1NiwgYXMgZGVmaW5lZFxuICogaW4gRklQUyAxODAtMlxuICogVmVyc2lvbiAyLjItYmV0YSBDb3B5cmlnaHQgQW5nZWwgTWFyaW4sIFBhdWwgSm9obnN0b24gMjAwMCAtIDIwMDkuXG4gKiBPdGhlciBjb250cmlidXRvcnM6IEdyZWcgSG9sdCwgQW5kcmV3IEtlcGVydCwgWWRuYXIsIExvc3RpbmV0XG4gKlxuICovXG5cbnZhciBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJylcbnZhciBTaGEyNTYgPSByZXF1aXJlKCcuL3NoYTI1NicpXG52YXIgSGFzaCA9IHJlcXVpcmUoJy4vaGFzaCcpXG5cbnZhciBXID0gbmV3IEFycmF5KDY0KVxuXG5mdW5jdGlvbiBTaGEyMjQgKCkge1xuICB0aGlzLmluaXQoKVxuXG4gIHRoaXMuX3cgPSBXIC8vIG5ldyBBcnJheSg2NClcblxuICBIYXNoLmNhbGwodGhpcywgNjQsIDU2KVxufVxuXG5pbmhlcml0cyhTaGEyMjQsIFNoYTI1NilcblxuU2hhMjI0LnByb3RvdHlwZS5pbml0ID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLl9hID0gMHhjMTA1OWVkOCB8IDBcbiAgdGhpcy5fYiA9IDB4MzY3Y2Q1MDcgfCAwXG4gIHRoaXMuX2MgPSAweDMwNzBkZDE3IHwgMFxuICB0aGlzLl9kID0gMHhmNzBlNTkzOSB8IDBcbiAgdGhpcy5fZSA9IDB4ZmZjMDBiMzEgfCAwXG4gIHRoaXMuX2YgPSAweDY4NTgxNTExIHwgMFxuICB0aGlzLl9nID0gMHg2NGY5OGZhNyB8IDBcbiAgdGhpcy5faCA9IDB4YmVmYTRmYTQgfCAwXG5cbiAgcmV0dXJuIHRoaXNcbn1cblxuU2hhMjI0LnByb3RvdHlwZS5faGFzaCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIEggPSBuZXcgQnVmZmVyKDI4KVxuXG4gIEgud3JpdGVJbnQzMkJFKHRoaXMuX2EsIDApXG4gIEgud3JpdGVJbnQzMkJFKHRoaXMuX2IsIDQpXG4gIEgud3JpdGVJbnQzMkJFKHRoaXMuX2MsIDgpXG4gIEgud3JpdGVJbnQzMkJFKHRoaXMuX2QsIDEyKVxuICBILndyaXRlSW50MzJCRSh0aGlzLl9lLCAxNilcbiAgSC53cml0ZUludDMyQkUodGhpcy5fZiwgMjApXG4gIEgud3JpdGVJbnQzMkJFKHRoaXMuX2csIDI0KVxuXG4gIHJldHVybiBIXG59XG5cbm1vZHVsZS5leHBvcnRzID0gU2hhMjI0XG4iLCIvKipcbiAqIEEgSmF2YVNjcmlwdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgU2VjdXJlIEhhc2ggQWxnb3JpdGhtLCBTSEEtMjU2LCBhcyBkZWZpbmVkXG4gKiBpbiBGSVBTIDE4MC0yXG4gKiBWZXJzaW9uIDIuMi1iZXRhIENvcHlyaWdodCBBbmdlbCBNYXJpbiwgUGF1bCBKb2huc3RvbiAyMDAwIC0gMjAwOS5cbiAqIE90aGVyIGNvbnRyaWJ1dG9yczogR3JlZyBIb2x0LCBBbmRyZXcgS2VwZXJ0LCBZZG5hciwgTG9zdGluZXRcbiAqXG4gKi9cblxudmFyIGluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKVxudmFyIEhhc2ggPSByZXF1aXJlKCcuL2hhc2gnKVxuXG52YXIgSyA9IFtcbiAgMHg0MjhBMkY5OCwgMHg3MTM3NDQ5MSwgMHhCNUMwRkJDRiwgMHhFOUI1REJBNSxcbiAgMHgzOTU2QzI1QiwgMHg1OUYxMTFGMSwgMHg5MjNGODJBNCwgMHhBQjFDNUVENSxcbiAgMHhEODA3QUE5OCwgMHgxMjgzNUIwMSwgMHgyNDMxODVCRSwgMHg1NTBDN0RDMyxcbiAgMHg3MkJFNUQ3NCwgMHg4MERFQjFGRSwgMHg5QkRDMDZBNywgMHhDMTlCRjE3NCxcbiAgMHhFNDlCNjlDMSwgMHhFRkJFNDc4NiwgMHgwRkMxOURDNiwgMHgyNDBDQTFDQyxcbiAgMHgyREU5MkM2RiwgMHg0QTc0ODRBQSwgMHg1Q0IwQTlEQywgMHg3NkY5ODhEQSxcbiAgMHg5ODNFNTE1MiwgMHhBODMxQzY2RCwgMHhCMDAzMjdDOCwgMHhCRjU5N0ZDNyxcbiAgMHhDNkUwMEJGMywgMHhENUE3OTE0NywgMHgwNkNBNjM1MSwgMHgxNDI5Mjk2NyxcbiAgMHgyN0I3MEE4NSwgMHgyRTFCMjEzOCwgMHg0RDJDNkRGQywgMHg1MzM4MEQxMyxcbiAgMHg2NTBBNzM1NCwgMHg3NjZBMEFCQiwgMHg4MUMyQzkyRSwgMHg5MjcyMkM4NSxcbiAgMHhBMkJGRThBMSwgMHhBODFBNjY0QiwgMHhDMjRCOEI3MCwgMHhDNzZDNTFBMyxcbiAgMHhEMTkyRTgxOSwgMHhENjk5MDYyNCwgMHhGNDBFMzU4NSwgMHgxMDZBQTA3MCxcbiAgMHgxOUE0QzExNiwgMHgxRTM3NkMwOCwgMHgyNzQ4Nzc0QywgMHgzNEIwQkNCNSxcbiAgMHgzOTFDMENCMywgMHg0RUQ4QUE0QSwgMHg1QjlDQ0E0RiwgMHg2ODJFNkZGMyxcbiAgMHg3NDhGODJFRSwgMHg3OEE1NjM2RiwgMHg4NEM4NzgxNCwgMHg4Q0M3MDIwOCxcbiAgMHg5MEJFRkZGQSwgMHhBNDUwNkNFQiwgMHhCRUY5QTNGNywgMHhDNjcxNzhGMlxuXVxuXG52YXIgVyA9IG5ldyBBcnJheSg2NClcblxuZnVuY3Rpb24gU2hhMjU2ICgpIHtcbiAgdGhpcy5pbml0KClcblxuICB0aGlzLl93ID0gVyAvLyBuZXcgQXJyYXkoNjQpXG5cbiAgSGFzaC5jYWxsKHRoaXMsIDY0LCA1Nilcbn1cblxuaW5oZXJpdHMoU2hhMjU2LCBIYXNoKVxuXG5TaGEyNTYucHJvdG90eXBlLmluaXQgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuX2EgPSAweDZhMDllNjY3IHwgMFxuICB0aGlzLl9iID0gMHhiYjY3YWU4NSB8IDBcbiAgdGhpcy5fYyA9IDB4M2M2ZWYzNzIgfCAwXG4gIHRoaXMuX2QgPSAweGE1NGZmNTNhIHwgMFxuICB0aGlzLl9lID0gMHg1MTBlNTI3ZiB8IDBcbiAgdGhpcy5fZiA9IDB4OWIwNTY4OGMgfCAwXG4gIHRoaXMuX2cgPSAweDFmODNkOWFiIHwgMFxuICB0aGlzLl9oID0gMHg1YmUwY2QxOSB8IDBcblxuICByZXR1cm4gdGhpc1xufVxuXG5mdW5jdGlvbiBDaCAoeCwgeSwgeikge1xuICByZXR1cm4geiBeICh4ICYgKHkgXiB6KSlcbn1cblxuZnVuY3Rpb24gTWFqICh4LCB5LCB6KSB7XG4gIHJldHVybiAoeCAmIHkpIHwgKHogJiAoeCB8IHkpKVxufVxuXG5mdW5jdGlvbiBTaWdtYTAgKHgpIHtcbiAgcmV0dXJuICh4ID4+PiAyIHwgeCA8PCAzMCkgXiAoeCA+Pj4gMTMgfCB4IDw8IDE5KSBeICh4ID4+PiAyMiB8IHggPDwgMTApXG59XG5cbmZ1bmN0aW9uIFNpZ21hMSAoeCkge1xuICByZXR1cm4gKHggPj4+IDYgfCB4IDw8IDI2KSBeICh4ID4+PiAxMSB8IHggPDwgMjEpIF4gKHggPj4+IDI1IHwgeCA8PCA3KVxufVxuXG5mdW5jdGlvbiBHYW1tYTAgKHgpIHtcbiAgcmV0dXJuICh4ID4+PiA3IHwgeCA8PCAyNSkgXiAoeCA+Pj4gMTggfCB4IDw8IDE0KSBeICh4ID4+PiAzKVxufVxuXG5mdW5jdGlvbiBHYW1tYTEgKHgpIHtcbiAgcmV0dXJuICh4ID4+PiAxNyB8IHggPDwgMTUpIF4gKHggPj4+IDE5IHwgeCA8PCAxMykgXiAoeCA+Pj4gMTApXG59XG5cblNoYTI1Ni5wcm90b3R5cGUuX3VwZGF0ZSA9IGZ1bmN0aW9uIChNKSB7XG4gIHZhciBXID0gdGhpcy5fd1xuXG4gIHZhciBhID0gdGhpcy5fYSB8IDBcbiAgdmFyIGIgPSB0aGlzLl9iIHwgMFxuICB2YXIgYyA9IHRoaXMuX2MgfCAwXG4gIHZhciBkID0gdGhpcy5fZCB8IDBcbiAgdmFyIGUgPSB0aGlzLl9lIHwgMFxuICB2YXIgZiA9IHRoaXMuX2YgfCAwXG4gIHZhciBnID0gdGhpcy5fZyB8IDBcbiAgdmFyIGggPSB0aGlzLl9oIHwgMFxuXG4gIHZhciBqID0gMFxuXG4gIGZ1bmN0aW9uIGNhbGNXICgpIHsgcmV0dXJuIEdhbW1hMShXW2ogLSAyXSkgKyBXW2ogLSA3XSArIEdhbW1hMChXW2ogLSAxNV0pICsgV1tqIC0gMTZdIH1cbiAgZnVuY3Rpb24gbG9vcCAodykge1xuICAgIFdbal0gPSB3XG5cbiAgICB2YXIgVDEgPSBoICsgU2lnbWExKGUpICsgQ2goZSwgZiwgZykgKyBLW2pdICsgd1xuICAgIHZhciBUMiA9IFNpZ21hMChhKSArIE1haihhLCBiLCBjKVxuXG4gICAgaCA9IGdcbiAgICBnID0gZlxuICAgIGYgPSBlXG4gICAgZSA9IGQgKyBUMVxuICAgIGQgPSBjXG4gICAgYyA9IGJcbiAgICBiID0gYVxuICAgIGEgPSBUMSArIFQyXG5cbiAgICBqKytcbiAgfVxuXG4gIHdoaWxlIChqIDwgMTYpIGxvb3AoTS5yZWFkSW50MzJCRShqICogNCkpXG4gIHdoaWxlIChqIDwgNjQpIGxvb3AoY2FsY1coKSlcblxuICB0aGlzLl9hID0gKGEgKyB0aGlzLl9hKSB8IDBcbiAgdGhpcy5fYiA9IChiICsgdGhpcy5fYikgfCAwXG4gIHRoaXMuX2MgPSAoYyArIHRoaXMuX2MpIHwgMFxuICB0aGlzLl9kID0gKGQgKyB0aGlzLl9kKSB8IDBcbiAgdGhpcy5fZSA9IChlICsgdGhpcy5fZSkgfCAwXG4gIHRoaXMuX2YgPSAoZiArIHRoaXMuX2YpIHwgMFxuICB0aGlzLl9nID0gKGcgKyB0aGlzLl9nKSB8IDBcbiAgdGhpcy5faCA9IChoICsgdGhpcy5faCkgfCAwXG59XG5cblNoYTI1Ni5wcm90b3R5cGUuX2hhc2ggPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBIID0gbmV3IEJ1ZmZlcigzMilcblxuICBILndyaXRlSW50MzJCRSh0aGlzLl9hLCAwKVxuICBILndyaXRlSW50MzJCRSh0aGlzLl9iLCA0KVxuICBILndyaXRlSW50MzJCRSh0aGlzLl9jLCA4KVxuICBILndyaXRlSW50MzJCRSh0aGlzLl9kLCAxMilcbiAgSC53cml0ZUludDMyQkUodGhpcy5fZSwgMTYpXG4gIEgud3JpdGVJbnQzMkJFKHRoaXMuX2YsIDIwKVxuICBILndyaXRlSW50MzJCRSh0aGlzLl9nLCAyNClcbiAgSC53cml0ZUludDMyQkUodGhpcy5faCwgMjgpXG5cbiAgcmV0dXJuIEhcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBTaGEyNTZcbiIsInZhciBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJylcbnZhciBTSEE1MTIgPSByZXF1aXJlKCcuL3NoYTUxMicpXG52YXIgSGFzaCA9IHJlcXVpcmUoJy4vaGFzaCcpXG5cbnZhciBXID0gbmV3IEFycmF5KDE2MClcblxuZnVuY3Rpb24gU2hhMzg0ICgpIHtcbiAgdGhpcy5pbml0KClcbiAgdGhpcy5fdyA9IFdcblxuICBIYXNoLmNhbGwodGhpcywgMTI4LCAxMTIpXG59XG5cbmluaGVyaXRzKFNoYTM4NCwgU0hBNTEyKVxuXG5TaGEzODQucHJvdG90eXBlLmluaXQgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuX2EgPSAweGNiYmI5ZDVkIHwgMFxuICB0aGlzLl9iID0gMHg2MjlhMjkyYSB8IDBcbiAgdGhpcy5fYyA9IDB4OTE1OTAxNWEgfCAwXG4gIHRoaXMuX2QgPSAweDE1MmZlY2Q4IHwgMFxuICB0aGlzLl9lID0gMHg2NzMzMjY2NyB8IDBcbiAgdGhpcy5fZiA9IDB4OGViNDRhODcgfCAwXG4gIHRoaXMuX2cgPSAweGRiMGMyZTBkIHwgMFxuICB0aGlzLl9oID0gMHg0N2I1NDgxZCB8IDBcblxuICB0aGlzLl9hbCA9IDB4YzEwNTllZDggfCAwXG4gIHRoaXMuX2JsID0gMHgzNjdjZDUwNyB8IDBcbiAgdGhpcy5fY2wgPSAweDMwNzBkZDE3IHwgMFxuICB0aGlzLl9kbCA9IDB4ZjcwZTU5MzkgfCAwXG4gIHRoaXMuX2VsID0gMHhmZmMwMGIzMSB8IDBcbiAgdGhpcy5fZmwgPSAweDY4NTgxNTExIHwgMFxuICB0aGlzLl9nbCA9IDB4NjRmOThmYTcgfCAwXG4gIHRoaXMuX2hsID0gMHhiZWZhNGZhNCB8IDBcblxuICByZXR1cm4gdGhpc1xufVxuXG5TaGEzODQucHJvdG90eXBlLl9oYXNoID0gZnVuY3Rpb24gKCkge1xuICB2YXIgSCA9IG5ldyBCdWZmZXIoNDgpXG5cbiAgZnVuY3Rpb24gd3JpdGVJbnQ2NEJFIChoLCBsLCBvZmZzZXQpIHtcbiAgICBILndyaXRlSW50MzJCRShoLCBvZmZzZXQpXG4gICAgSC53cml0ZUludDMyQkUobCwgb2Zmc2V0ICsgNClcbiAgfVxuXG4gIHdyaXRlSW50NjRCRSh0aGlzLl9hLCB0aGlzLl9hbCwgMClcbiAgd3JpdGVJbnQ2NEJFKHRoaXMuX2IsIHRoaXMuX2JsLCA4KVxuICB3cml0ZUludDY0QkUodGhpcy5fYywgdGhpcy5fY2wsIDE2KVxuICB3cml0ZUludDY0QkUodGhpcy5fZCwgdGhpcy5fZGwsIDI0KVxuICB3cml0ZUludDY0QkUodGhpcy5fZSwgdGhpcy5fZWwsIDMyKVxuICB3cml0ZUludDY0QkUodGhpcy5fZiwgdGhpcy5fZmwsIDQwKVxuXG4gIHJldHVybiBIXG59XG5cbm1vZHVsZS5leHBvcnRzID0gU2hhMzg0XG4iLCJ2YXIgaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpXG52YXIgSGFzaCA9IHJlcXVpcmUoJy4vaGFzaCcpXG5cbnZhciBLID0gW1xuICAweDQyOGEyZjk4LCAweGQ3MjhhZTIyLCAweDcxMzc0NDkxLCAweDIzZWY2NWNkLFxuICAweGI1YzBmYmNmLCAweGVjNGQzYjJmLCAweGU5YjVkYmE1LCAweDgxODlkYmJjLFxuICAweDM5NTZjMjViLCAweGYzNDhiNTM4LCAweDU5ZjExMWYxLCAweGI2MDVkMDE5LFxuICAweDkyM2Y4MmE0LCAweGFmMTk0ZjliLCAweGFiMWM1ZWQ1LCAweGRhNmQ4MTE4LFxuICAweGQ4MDdhYTk4LCAweGEzMDMwMjQyLCAweDEyODM1YjAxLCAweDQ1NzA2ZmJlLFxuICAweDI0MzE4NWJlLCAweDRlZTRiMjhjLCAweDU1MGM3ZGMzLCAweGQ1ZmZiNGUyLFxuICAweDcyYmU1ZDc0LCAweGYyN2I4OTZmLCAweDgwZGViMWZlLCAweDNiMTY5NmIxLFxuICAweDliZGMwNmE3LCAweDI1YzcxMjM1LCAweGMxOWJmMTc0LCAweGNmNjkyNjk0LFxuICAweGU0OWI2OWMxLCAweDllZjE0YWQyLCAweGVmYmU0Nzg2LCAweDM4NGYyNWUzLFxuICAweDBmYzE5ZGM2LCAweDhiOGNkNWI1LCAweDI0MGNhMWNjLCAweDc3YWM5YzY1LFxuICAweDJkZTkyYzZmLCAweDU5MmIwMjc1LCAweDRhNzQ4NGFhLCAweDZlYTZlNDgzLFxuICAweDVjYjBhOWRjLCAweGJkNDFmYmQ0LCAweDc2Zjk4OGRhLCAweDgzMTE1M2I1LFxuICAweDk4M2U1MTUyLCAweGVlNjZkZmFiLCAweGE4MzFjNjZkLCAweDJkYjQzMjEwLFxuICAweGIwMDMyN2M4LCAweDk4ZmIyMTNmLCAweGJmNTk3ZmM3LCAweGJlZWYwZWU0LFxuICAweGM2ZTAwYmYzLCAweDNkYTg4ZmMyLCAweGQ1YTc5MTQ3LCAweDkzMGFhNzI1LFxuICAweDA2Y2E2MzUxLCAweGUwMDM4MjZmLCAweDE0MjkyOTY3LCAweDBhMGU2ZTcwLFxuICAweDI3YjcwYTg1LCAweDQ2ZDIyZmZjLCAweDJlMWIyMTM4LCAweDVjMjZjOTI2LFxuICAweDRkMmM2ZGZjLCAweDVhYzQyYWVkLCAweDUzMzgwZDEzLCAweDlkOTViM2RmLFxuICAweDY1MGE3MzU0LCAweDhiYWY2M2RlLCAweDc2NmEwYWJiLCAweDNjNzdiMmE4LFxuICAweDgxYzJjOTJlLCAweDQ3ZWRhZWU2LCAweDkyNzIyYzg1LCAweDE0ODIzNTNiLFxuICAweGEyYmZlOGExLCAweDRjZjEwMzY0LCAweGE4MWE2NjRiLCAweGJjNDIzMDAxLFxuICAweGMyNGI4YjcwLCAweGQwZjg5NzkxLCAweGM3NmM1MWEzLCAweDA2NTRiZTMwLFxuICAweGQxOTJlODE5LCAweGQ2ZWY1MjE4LCAweGQ2OTkwNjI0LCAweDU1NjVhOTEwLFxuICAweGY0MGUzNTg1LCAweDU3NzEyMDJhLCAweDEwNmFhMDcwLCAweDMyYmJkMWI4LFxuICAweDE5YTRjMTE2LCAweGI4ZDJkMGM4LCAweDFlMzc2YzA4LCAweDUxNDFhYjUzLFxuICAweDI3NDg3NzRjLCAweGRmOGVlYjk5LCAweDM0YjBiY2I1LCAweGUxOWI0OGE4LFxuICAweDM5MWMwY2IzLCAweGM1Yzk1YTYzLCAweDRlZDhhYTRhLCAweGUzNDE4YWNiLFxuICAweDViOWNjYTRmLCAweDc3NjNlMzczLCAweDY4MmU2ZmYzLCAweGQ2YjJiOGEzLFxuICAweDc0OGY4MmVlLCAweDVkZWZiMmZjLCAweDc4YTU2MzZmLCAweDQzMTcyZjYwLFxuICAweDg0Yzg3ODE0LCAweGExZjBhYjcyLCAweDhjYzcwMjA4LCAweDFhNjQzOWVjLFxuICAweDkwYmVmZmZhLCAweDIzNjMxZTI4LCAweGE0NTA2Y2ViLCAweGRlODJiZGU5LFxuICAweGJlZjlhM2Y3LCAweGIyYzY3OTE1LCAweGM2NzE3OGYyLCAweGUzNzI1MzJiLFxuICAweGNhMjczZWNlLCAweGVhMjY2MTljLCAweGQxODZiOGM3LCAweDIxYzBjMjA3LFxuICAweGVhZGE3ZGQ2LCAweGNkZTBlYjFlLCAweGY1N2Q0ZjdmLCAweGVlNmVkMTc4LFxuICAweDA2ZjA2N2FhLCAweDcyMTc2ZmJhLCAweDBhNjM3ZGM1LCAweGEyYzg5OGE2LFxuICAweDExM2Y5ODA0LCAweGJlZjkwZGFlLCAweDFiNzEwYjM1LCAweDEzMWM0NzFiLFxuICAweDI4ZGI3N2Y1LCAweDIzMDQ3ZDg0LCAweDMyY2FhYjdiLCAweDQwYzcyNDkzLFxuICAweDNjOWViZTBhLCAweDE1YzliZWJjLCAweDQzMWQ2N2M0LCAweDljMTAwZDRjLFxuICAweDRjYzVkNGJlLCAweGNiM2U0MmI2LCAweDU5N2YyOTljLCAweGZjNjU3ZTJhLFxuICAweDVmY2I2ZmFiLCAweDNhZDZmYWVjLCAweDZjNDQxOThjLCAweDRhNDc1ODE3XG5dXG5cbnZhciBXID0gbmV3IEFycmF5KDE2MClcblxuZnVuY3Rpb24gU2hhNTEyICgpIHtcbiAgdGhpcy5pbml0KClcbiAgdGhpcy5fdyA9IFdcblxuICBIYXNoLmNhbGwodGhpcywgMTI4LCAxMTIpXG59XG5cbmluaGVyaXRzKFNoYTUxMiwgSGFzaClcblxuU2hhNTEyLnByb3RvdHlwZS5pbml0ID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLl9hID0gMHg2YTA5ZTY2NyB8IDBcbiAgdGhpcy5fYiA9IDB4YmI2N2FlODUgfCAwXG4gIHRoaXMuX2MgPSAweDNjNmVmMzcyIHwgMFxuICB0aGlzLl9kID0gMHhhNTRmZjUzYSB8IDBcbiAgdGhpcy5fZSA9IDB4NTEwZTUyN2YgfCAwXG4gIHRoaXMuX2YgPSAweDliMDU2ODhjIHwgMFxuICB0aGlzLl9nID0gMHgxZjgzZDlhYiB8IDBcbiAgdGhpcy5faCA9IDB4NWJlMGNkMTkgfCAwXG5cbiAgdGhpcy5fYWwgPSAweGYzYmNjOTA4IHwgMFxuICB0aGlzLl9ibCA9IDB4ODRjYWE3M2IgfCAwXG4gIHRoaXMuX2NsID0gMHhmZTk0ZjgyYiB8IDBcbiAgdGhpcy5fZGwgPSAweDVmMWQzNmYxIHwgMFxuICB0aGlzLl9lbCA9IDB4YWRlNjgyZDEgfCAwXG4gIHRoaXMuX2ZsID0gMHgyYjNlNmMxZiB8IDBcbiAgdGhpcy5fZ2wgPSAweGZiNDFiZDZiIHwgMFxuICB0aGlzLl9obCA9IDB4MTM3ZTIxNzkgfCAwXG5cbiAgcmV0dXJuIHRoaXNcbn1cblxuZnVuY3Rpb24gQ2ggKHgsIHksIHopIHtcbiAgcmV0dXJuIHogXiAoeCAmICh5IF4geikpXG59XG5cbmZ1bmN0aW9uIE1haiAoeCwgeSwgeikge1xuICByZXR1cm4gKHggJiB5KSB8ICh6ICYgKHggfCB5KSlcbn1cblxuZnVuY3Rpb24gU2lnbWEwICh4LCB4bCkge1xuICByZXR1cm4gKHggPj4+IDI4IHwgeGwgPDwgNCkgXiAoeGwgPj4+IDIgfCB4IDw8IDMwKSBeICh4bCA+Pj4gNyB8IHggPDwgMjUpXG59XG5cbmZ1bmN0aW9uIFNpZ21hMSAoeCwgeGwpIHtcbiAgcmV0dXJuICh4ID4+PiAxNCB8IHhsIDw8IDE4KSBeICh4ID4+PiAxOCB8IHhsIDw8IDE0KSBeICh4bCA+Pj4gOSB8IHggPDwgMjMpXG59XG5cbmZ1bmN0aW9uIEdhbW1hMCAoeCwgeGwpIHtcbiAgcmV0dXJuICh4ID4+PiAxIHwgeGwgPDwgMzEpIF4gKHggPj4+IDggfCB4bCA8PCAyNCkgXiAoeCA+Pj4gNylcbn1cblxuZnVuY3Rpb24gR2FtbWEwbCAoeCwgeGwpIHtcbiAgcmV0dXJuICh4ID4+PiAxIHwgeGwgPDwgMzEpIF4gKHggPj4+IDggfCB4bCA8PCAyNCkgXiAoeCA+Pj4gNyB8IHhsIDw8IDI1KVxufVxuXG5mdW5jdGlvbiBHYW1tYTEgKHgsIHhsKSB7XG4gIHJldHVybiAoeCA+Pj4gMTkgfCB4bCA8PCAxMykgXiAoeGwgPj4+IDI5IHwgeCA8PCAzKSBeICh4ID4+PiA2KVxufVxuXG5mdW5jdGlvbiBHYW1tYTFsICh4LCB4bCkge1xuICByZXR1cm4gKHggPj4+IDE5IHwgeGwgPDwgMTMpIF4gKHhsID4+PiAyOSB8IHggPDwgMykgXiAoeCA+Pj4gNiB8IHhsIDw8IDI2KVxufVxuXG5TaGE1MTIucHJvdG90eXBlLl91cGRhdGUgPSBmdW5jdGlvbiAoTSkge1xuICB2YXIgVyA9IHRoaXMuX3dcblxuICB2YXIgYSA9IHRoaXMuX2EgfCAwXG4gIHZhciBiID0gdGhpcy5fYiB8IDBcbiAgdmFyIGMgPSB0aGlzLl9jIHwgMFxuICB2YXIgZCA9IHRoaXMuX2QgfCAwXG4gIHZhciBlID0gdGhpcy5fZSB8IDBcbiAgdmFyIGYgPSB0aGlzLl9mIHwgMFxuICB2YXIgZyA9IHRoaXMuX2cgfCAwXG4gIHZhciBoID0gdGhpcy5faCB8IDBcblxuICB2YXIgYWwgPSB0aGlzLl9hbCB8IDBcbiAgdmFyIGJsID0gdGhpcy5fYmwgfCAwXG4gIHZhciBjbCA9IHRoaXMuX2NsIHwgMFxuICB2YXIgZGwgPSB0aGlzLl9kbCB8IDBcbiAgdmFyIGVsID0gdGhpcy5fZWwgfCAwXG4gIHZhciBmbCA9IHRoaXMuX2ZsIHwgMFxuICB2YXIgZ2wgPSB0aGlzLl9nbCB8IDBcbiAgdmFyIGhsID0gdGhpcy5faGwgfCAwXG5cbiAgdmFyIGkgPSAwXG4gIHZhciBqID0gMFxuICB2YXIgV2ksIFdpbFxuICBmdW5jdGlvbiBjYWxjVyAoKSB7XG4gICAgdmFyIHggPSBXW2ogLSAxNSAqIDJdXG4gICAgdmFyIHhsID0gV1tqIC0gMTUgKiAyICsgMV1cbiAgICB2YXIgZ2FtbWEwID0gR2FtbWEwKHgsIHhsKVxuICAgIHZhciBnYW1tYTBsID0gR2FtbWEwbCh4bCwgeClcblxuICAgIHggPSBXW2ogLSAyICogMl1cbiAgICB4bCA9IFdbaiAtIDIgKiAyICsgMV1cbiAgICB2YXIgZ2FtbWExID0gR2FtbWExKHgsIHhsKVxuICAgIHZhciBnYW1tYTFsID0gR2FtbWExbCh4bCwgeClcblxuICAgIC8vIFdbaV0gPSBnYW1tYTAgKyBXW2kgLSA3XSArIGdhbW1hMSArIFdbaSAtIDE2XVxuICAgIHZhciBXaTcgPSBXW2ogLSA3ICogMl1cbiAgICB2YXIgV2k3bCA9IFdbaiAtIDcgKiAyICsgMV1cblxuICAgIHZhciBXaTE2ID0gV1tqIC0gMTYgKiAyXVxuICAgIHZhciBXaTE2bCA9IFdbaiAtIDE2ICogMiArIDFdXG5cbiAgICBXaWwgPSBnYW1tYTBsICsgV2k3bFxuICAgIFdpID0gZ2FtbWEwICsgV2k3ICsgKChXaWwgPj4+IDApIDwgKGdhbW1hMGwgPj4+IDApID8gMSA6IDApXG4gICAgV2lsID0gV2lsICsgZ2FtbWExbFxuICAgIFdpID0gV2kgKyBnYW1tYTEgKyAoKFdpbCA+Pj4gMCkgPCAoZ2FtbWExbCA+Pj4gMCkgPyAxIDogMClcbiAgICBXaWwgPSBXaWwgKyBXaTE2bFxuICAgIFdpID0gV2kgKyBXaTE2ICsgKChXaWwgPj4+IDApIDwgKFdpMTZsID4+PiAwKSA/IDEgOiAwKVxuICB9XG5cbiAgZnVuY3Rpb24gbG9vcCAoKSB7XG4gICAgV1tqXSA9IFdpXG4gICAgV1tqICsgMV0gPSBXaWxcblxuICAgIHZhciBtYWogPSBNYWooYSwgYiwgYylcbiAgICB2YXIgbWFqbCA9IE1haihhbCwgYmwsIGNsKVxuXG4gICAgdmFyIHNpZ21hMGggPSBTaWdtYTAoYSwgYWwpXG4gICAgdmFyIHNpZ21hMGwgPSBTaWdtYTAoYWwsIGEpXG4gICAgdmFyIHNpZ21hMWggPSBTaWdtYTEoZSwgZWwpXG4gICAgdmFyIHNpZ21hMWwgPSBTaWdtYTEoZWwsIGUpXG5cbiAgICAvLyB0MSA9IGggKyBzaWdtYTEgKyBjaCArIEtbaV0gKyBXW2ldXG4gICAgdmFyIEtpID0gS1tqXVxuICAgIHZhciBLaWwgPSBLW2ogKyAxXVxuXG4gICAgdmFyIGNoID0gQ2goZSwgZiwgZylcbiAgICB2YXIgY2hsID0gQ2goZWwsIGZsLCBnbClcblxuICAgIHZhciB0MWwgPSBobCArIHNpZ21hMWxcbiAgICB2YXIgdDEgPSBoICsgc2lnbWExaCArICgodDFsID4+PiAwKSA8IChobCA+Pj4gMCkgPyAxIDogMClcbiAgICB0MWwgPSB0MWwgKyBjaGxcbiAgICB0MSA9IHQxICsgY2ggKyAoKHQxbCA+Pj4gMCkgPCAoY2hsID4+PiAwKSA/IDEgOiAwKVxuICAgIHQxbCA9IHQxbCArIEtpbFxuICAgIHQxID0gdDEgKyBLaSArICgodDFsID4+PiAwKSA8IChLaWwgPj4+IDApID8gMSA6IDApXG4gICAgdDFsID0gdDFsICsgV2lsXG4gICAgdDEgPSB0MSArIFdpICsgKCh0MWwgPj4+IDApIDwgKFdpbCA+Pj4gMCkgPyAxIDogMClcblxuICAgIC8vIHQyID0gc2lnbWEwICsgbWFqXG4gICAgdmFyIHQybCA9IHNpZ21hMGwgKyBtYWpsXG4gICAgdmFyIHQyID0gc2lnbWEwaCArIG1haiArICgodDJsID4+PiAwKSA8IChzaWdtYTBsID4+PiAwKSA/IDEgOiAwKVxuXG4gICAgaCA9IGdcbiAgICBobCA9IGdsXG4gICAgZyA9IGZcbiAgICBnbCA9IGZsXG4gICAgZiA9IGVcbiAgICBmbCA9IGVsXG4gICAgZWwgPSAoZGwgKyB0MWwpIHwgMFxuICAgIGUgPSAoZCArIHQxICsgKChlbCA+Pj4gMCkgPCAoZGwgPj4+IDApID8gMSA6IDApKSB8IDBcbiAgICBkID0gY1xuICAgIGRsID0gY2xcbiAgICBjID0gYlxuICAgIGNsID0gYmxcbiAgICBiID0gYVxuICAgIGJsID0gYWxcbiAgICBhbCA9ICh0MWwgKyB0MmwpIHwgMFxuICAgIGEgPSAodDEgKyB0MiArICgoYWwgPj4+IDApIDwgKHQxbCA+Pj4gMCkgPyAxIDogMCkpIHwgMFxuXG4gICAgaSsrXG4gICAgaiArPSAyXG4gIH1cblxuICB3aGlsZSAoaSA8IDE2KSB7XG4gICAgV2kgPSBNLnJlYWRJbnQzMkJFKGogKiA0KVxuICAgIFdpbCA9IE0ucmVhZEludDMyQkUoaiAqIDQgKyA0KVxuXG4gICAgbG9vcCgpXG4gIH1cblxuICB3aGlsZSAoaSA8IDgwKSB7XG4gICAgY2FsY1coKVxuICAgIGxvb3AoKVxuICB9XG5cbiAgdGhpcy5fYWwgPSAodGhpcy5fYWwgKyBhbCkgfCAwXG4gIHRoaXMuX2JsID0gKHRoaXMuX2JsICsgYmwpIHwgMFxuICB0aGlzLl9jbCA9ICh0aGlzLl9jbCArIGNsKSB8IDBcbiAgdGhpcy5fZGwgPSAodGhpcy5fZGwgKyBkbCkgfCAwXG4gIHRoaXMuX2VsID0gKHRoaXMuX2VsICsgZWwpIHwgMFxuICB0aGlzLl9mbCA9ICh0aGlzLl9mbCArIGZsKSB8IDBcbiAgdGhpcy5fZ2wgPSAodGhpcy5fZ2wgKyBnbCkgfCAwXG4gIHRoaXMuX2hsID0gKHRoaXMuX2hsICsgaGwpIHwgMFxuXG4gIHRoaXMuX2EgPSAodGhpcy5fYSArIGEgKyAoKHRoaXMuX2FsID4+PiAwKSA8IChhbCA+Pj4gMCkgPyAxIDogMCkpIHwgMFxuICB0aGlzLl9iID0gKHRoaXMuX2IgKyBiICsgKCh0aGlzLl9ibCA+Pj4gMCkgPCAoYmwgPj4+IDApID8gMSA6IDApKSB8IDBcbiAgdGhpcy5fYyA9ICh0aGlzLl9jICsgYyArICgodGhpcy5fY2wgPj4+IDApIDwgKGNsID4+PiAwKSA/IDEgOiAwKSkgfCAwXG4gIHRoaXMuX2QgPSAodGhpcy5fZCArIGQgKyAoKHRoaXMuX2RsID4+PiAwKSA8IChkbCA+Pj4gMCkgPyAxIDogMCkpIHwgMFxuICB0aGlzLl9lID0gKHRoaXMuX2UgKyBlICsgKCh0aGlzLl9lbCA+Pj4gMCkgPCAoZWwgPj4+IDApID8gMSA6IDApKSB8IDBcbiAgdGhpcy5fZiA9ICh0aGlzLl9mICsgZiArICgodGhpcy5fZmwgPj4+IDApIDwgKGZsID4+PiAwKSA/IDEgOiAwKSkgfCAwXG4gIHRoaXMuX2cgPSAodGhpcy5fZyArIGcgKyAoKHRoaXMuX2dsID4+PiAwKSA8IChnbCA+Pj4gMCkgPyAxIDogMCkpIHwgMFxuICB0aGlzLl9oID0gKHRoaXMuX2ggKyBoICsgKCh0aGlzLl9obCA+Pj4gMCkgPCAoaGwgPj4+IDApID8gMSA6IDApKSB8IDBcbn1cblxuU2hhNTEyLnByb3RvdHlwZS5faGFzaCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIEggPSBuZXcgQnVmZmVyKDY0KVxuXG4gIGZ1bmN0aW9uIHdyaXRlSW50NjRCRSAoaCwgbCwgb2Zmc2V0KSB7XG4gICAgSC53cml0ZUludDMyQkUoaCwgb2Zmc2V0KVxuICAgIEgud3JpdGVJbnQzMkJFKGwsIG9mZnNldCArIDQpXG4gIH1cblxuICB3cml0ZUludDY0QkUodGhpcy5fYSwgdGhpcy5fYWwsIDApXG4gIHdyaXRlSW50NjRCRSh0aGlzLl9iLCB0aGlzLl9ibCwgOClcbiAgd3JpdGVJbnQ2NEJFKHRoaXMuX2MsIHRoaXMuX2NsLCAxNilcbiAgd3JpdGVJbnQ2NEJFKHRoaXMuX2QsIHRoaXMuX2RsLCAyNClcbiAgd3JpdGVJbnQ2NEJFKHRoaXMuX2UsIHRoaXMuX2VsLCAzMilcbiAgd3JpdGVJbnQ2NEJFKHRoaXMuX2YsIHRoaXMuX2ZsLCA0MClcbiAgd3JpdGVJbnQ2NEJFKHRoaXMuX2csIHRoaXMuX2dsLCA0OClcbiAgd3JpdGVJbnQ2NEJFKHRoaXMuX2gsIHRoaXMuX2hsLCA1NilcblxuICByZXR1cm4gSFxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFNoYTUxMlxuIiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbm1vZHVsZS5leHBvcnRzID0gU3RyZWFtO1xuXG52YXIgRUUgPSByZXF1aXJlKCdldmVudHMnKS5FdmVudEVtaXR0ZXI7XG52YXIgaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xuXG5pbmhlcml0cyhTdHJlYW0sIEVFKTtcblN0cmVhbS5SZWFkYWJsZSA9IHJlcXVpcmUoJ3JlYWRhYmxlLXN0cmVhbS9yZWFkYWJsZS5qcycpO1xuU3RyZWFtLldyaXRhYmxlID0gcmVxdWlyZSgncmVhZGFibGUtc3RyZWFtL3dyaXRhYmxlLmpzJyk7XG5TdHJlYW0uRHVwbGV4ID0gcmVxdWlyZSgncmVhZGFibGUtc3RyZWFtL2R1cGxleC5qcycpO1xuU3RyZWFtLlRyYW5zZm9ybSA9IHJlcXVpcmUoJ3JlYWRhYmxlLXN0cmVhbS90cmFuc2Zvcm0uanMnKTtcblN0cmVhbS5QYXNzVGhyb3VnaCA9IHJlcXVpcmUoJ3JlYWRhYmxlLXN0cmVhbS9wYXNzdGhyb3VnaC5qcycpO1xuXG4vLyBCYWNrd2FyZHMtY29tcGF0IHdpdGggbm9kZSAwLjQueFxuU3RyZWFtLlN0cmVhbSA9IFN0cmVhbTtcblxuXG5cbi8vIG9sZC1zdHlsZSBzdHJlYW1zLiAgTm90ZSB0aGF0IHRoZSBwaXBlIG1ldGhvZCAodGhlIG9ubHkgcmVsZXZhbnRcbi8vIHBhcnQgb2YgdGhpcyBjbGFzcykgaXMgb3ZlcnJpZGRlbiBpbiB0aGUgUmVhZGFibGUgY2xhc3MuXG5cbmZ1bmN0aW9uIFN0cmVhbSgpIHtcbiAgRUUuY2FsbCh0aGlzKTtcbn1cblxuU3RyZWFtLnByb3RvdHlwZS5waXBlID0gZnVuY3Rpb24oZGVzdCwgb3B0aW9ucykge1xuICB2YXIgc291cmNlID0gdGhpcztcblxuICBmdW5jdGlvbiBvbmRhdGEoY2h1bmspIHtcbiAgICBpZiAoZGVzdC53cml0YWJsZSkge1xuICAgICAgaWYgKGZhbHNlID09PSBkZXN0LndyaXRlKGNodW5rKSAmJiBzb3VyY2UucGF1c2UpIHtcbiAgICAgICAgc291cmNlLnBhdXNlKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc291cmNlLm9uKCdkYXRhJywgb25kYXRhKTtcblxuICBmdW5jdGlvbiBvbmRyYWluKCkge1xuICAgIGlmIChzb3VyY2UucmVhZGFibGUgJiYgc291cmNlLnJlc3VtZSkge1xuICAgICAgc291cmNlLnJlc3VtZSgpO1xuICAgIH1cbiAgfVxuXG4gIGRlc3Qub24oJ2RyYWluJywgb25kcmFpbik7XG5cbiAgLy8gSWYgdGhlICdlbmQnIG9wdGlvbiBpcyBub3Qgc3VwcGxpZWQsIGRlc3QuZW5kKCkgd2lsbCBiZSBjYWxsZWQgd2hlblxuICAvLyBzb3VyY2UgZ2V0cyB0aGUgJ2VuZCcgb3IgJ2Nsb3NlJyBldmVudHMuICBPbmx5IGRlc3QuZW5kKCkgb25jZS5cbiAgaWYgKCFkZXN0Ll9pc1N0ZGlvICYmICghb3B0aW9ucyB8fCBvcHRpb25zLmVuZCAhPT0gZmFsc2UpKSB7XG4gICAgc291cmNlLm9uKCdlbmQnLCBvbmVuZCk7XG4gICAgc291cmNlLm9uKCdjbG9zZScsIG9uY2xvc2UpO1xuICB9XG5cbiAgdmFyIGRpZE9uRW5kID0gZmFsc2U7XG4gIGZ1bmN0aW9uIG9uZW5kKCkge1xuICAgIGlmIChkaWRPbkVuZCkgcmV0dXJuO1xuICAgIGRpZE9uRW5kID0gdHJ1ZTtcblxuICAgIGRlc3QuZW5kKCk7XG4gIH1cblxuXG4gIGZ1bmN0aW9uIG9uY2xvc2UoKSB7XG4gICAgaWYgKGRpZE9uRW5kKSByZXR1cm47XG4gICAgZGlkT25FbmQgPSB0cnVlO1xuXG4gICAgaWYgKHR5cGVvZiBkZXN0LmRlc3Ryb3kgPT09ICdmdW5jdGlvbicpIGRlc3QuZGVzdHJveSgpO1xuICB9XG5cbiAgLy8gZG9uJ3QgbGVhdmUgZGFuZ2xpbmcgcGlwZXMgd2hlbiB0aGVyZSBhcmUgZXJyb3JzLlxuICBmdW5jdGlvbiBvbmVycm9yKGVyKSB7XG4gICAgY2xlYW51cCgpO1xuICAgIGlmIChFRS5saXN0ZW5lckNvdW50KHRoaXMsICdlcnJvcicpID09PSAwKSB7XG4gICAgICB0aHJvdyBlcjsgLy8gVW5oYW5kbGVkIHN0cmVhbSBlcnJvciBpbiBwaXBlLlxuICAgIH1cbiAgfVxuXG4gIHNvdXJjZS5vbignZXJyb3InLCBvbmVycm9yKTtcbiAgZGVzdC5vbignZXJyb3InLCBvbmVycm9yKTtcblxuICAvLyByZW1vdmUgYWxsIHRoZSBldmVudCBsaXN0ZW5lcnMgdGhhdCB3ZXJlIGFkZGVkLlxuICBmdW5jdGlvbiBjbGVhbnVwKCkge1xuICAgIHNvdXJjZS5yZW1vdmVMaXN0ZW5lcignZGF0YScsIG9uZGF0YSk7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZHJhaW4nLCBvbmRyYWluKTtcblxuICAgIHNvdXJjZS5yZW1vdmVMaXN0ZW5lcignZW5kJywgb25lbmQpO1xuICAgIHNvdXJjZS5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLCBvbmNsb3NlKTtcblxuICAgIHNvdXJjZS5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBvbmVycm9yKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdlcnJvcicsIG9uZXJyb3IpO1xuXG4gICAgc291cmNlLnJlbW92ZUxpc3RlbmVyKCdlbmQnLCBjbGVhbnVwKTtcbiAgICBzb3VyY2UucmVtb3ZlTGlzdGVuZXIoJ2Nsb3NlJywgY2xlYW51cCk7XG5cbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdjbG9zZScsIGNsZWFudXApO1xuICB9XG5cbiAgc291cmNlLm9uKCdlbmQnLCBjbGVhbnVwKTtcbiAgc291cmNlLm9uKCdjbG9zZScsIGNsZWFudXApO1xuXG4gIGRlc3Qub24oJ2Nsb3NlJywgY2xlYW51cCk7XG5cbiAgZGVzdC5lbWl0KCdwaXBlJywgc291cmNlKTtcblxuICAvLyBBbGxvdyBmb3IgdW5peC1saWtlIHVzYWdlOiBBLnBpcGUoQikucGlwZShDKVxuICByZXR1cm4gZGVzdDtcbn07XG4iLCIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ2J1ZmZlcicpLkJ1ZmZlcjtcblxudmFyIGlzQnVmZmVyRW5jb2RpbmcgPSBCdWZmZXIuaXNFbmNvZGluZ1xuICB8fCBmdW5jdGlvbihlbmNvZGluZykge1xuICAgICAgIHN3aXRjaCAoZW5jb2RpbmcgJiYgZW5jb2RpbmcudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICAgY2FzZSAnaGV4JzogY2FzZSAndXRmOCc6IGNhc2UgJ3V0Zi04JzogY2FzZSAnYXNjaWknOiBjYXNlICdiaW5hcnknOiBjYXNlICdiYXNlNjQnOiBjYXNlICd1Y3MyJzogY2FzZSAndWNzLTInOiBjYXNlICd1dGYxNmxlJzogY2FzZSAndXRmLTE2bGUnOiBjYXNlICdyYXcnOiByZXR1cm4gdHJ1ZTtcbiAgICAgICAgIGRlZmF1bHQ6IHJldHVybiBmYWxzZTtcbiAgICAgICB9XG4gICAgIH1cblxuXG5mdW5jdGlvbiBhc3NlcnRFbmNvZGluZyhlbmNvZGluZykge1xuICBpZiAoZW5jb2RpbmcgJiYgIWlzQnVmZmVyRW5jb2RpbmcoZW5jb2RpbmcpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpO1xuICB9XG59XG5cbi8vIFN0cmluZ0RlY29kZXIgcHJvdmlkZXMgYW4gaW50ZXJmYWNlIGZvciBlZmZpY2llbnRseSBzcGxpdHRpbmcgYSBzZXJpZXMgb2Zcbi8vIGJ1ZmZlcnMgaW50byBhIHNlcmllcyBvZiBKUyBzdHJpbmdzIHdpdGhvdXQgYnJlYWtpbmcgYXBhcnQgbXVsdGktYnl0ZVxuLy8gY2hhcmFjdGVycy4gQ0VTVS04IGlzIGhhbmRsZWQgYXMgcGFydCBvZiB0aGUgVVRGLTggZW5jb2RpbmcuXG4vL1xuLy8gQFRPRE8gSGFuZGxpbmcgYWxsIGVuY29kaW5ncyBpbnNpZGUgYSBzaW5nbGUgb2JqZWN0IG1ha2VzIGl0IHZlcnkgZGlmZmljdWx0XG4vLyB0byByZWFzb24gYWJvdXQgdGhpcyBjb2RlLCBzbyBpdCBzaG91bGQgYmUgc3BsaXQgdXAgaW4gdGhlIGZ1dHVyZS5cbi8vIEBUT0RPIFRoZXJlIHNob3VsZCBiZSBhIHV0Zjgtc3RyaWN0IGVuY29kaW5nIHRoYXQgcmVqZWN0cyBpbnZhbGlkIFVURi04IGNvZGVcbi8vIHBvaW50cyBhcyB1c2VkIGJ5IENFU1UtOC5cbnZhciBTdHJpbmdEZWNvZGVyID0gZXhwb3J0cy5TdHJpbmdEZWNvZGVyID0gZnVuY3Rpb24oZW5jb2RpbmcpIHtcbiAgdGhpcy5lbmNvZGluZyA9IChlbmNvZGluZyB8fCAndXRmOCcpLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvWy1fXS8sICcnKTtcbiAgYXNzZXJ0RW5jb2RpbmcoZW5jb2RpbmcpO1xuICBzd2l0Y2ggKHRoaXMuZW5jb2RpbmcpIHtcbiAgICBjYXNlICd1dGY4JzpcbiAgICAgIC8vIENFU1UtOCByZXByZXNlbnRzIGVhY2ggb2YgU3Vycm9nYXRlIFBhaXIgYnkgMy1ieXRlc1xuICAgICAgdGhpcy5zdXJyb2dhdGVTaXplID0gMztcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3VjczInOlxuICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgLy8gVVRGLTE2IHJlcHJlc2VudHMgZWFjaCBvZiBTdXJyb2dhdGUgUGFpciBieSAyLWJ5dGVzXG4gICAgICB0aGlzLnN1cnJvZ2F0ZVNpemUgPSAyO1xuICAgICAgdGhpcy5kZXRlY3RJbmNvbXBsZXRlQ2hhciA9IHV0ZjE2RGV0ZWN0SW5jb21wbGV0ZUNoYXI7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgLy8gQmFzZS02NCBzdG9yZXMgMyBieXRlcyBpbiA0IGNoYXJzLCBhbmQgcGFkcyB0aGUgcmVtYWluZGVyLlxuICAgICAgdGhpcy5zdXJyb2dhdGVTaXplID0gMztcbiAgICAgIHRoaXMuZGV0ZWN0SW5jb21wbGV0ZUNoYXIgPSBiYXNlNjREZXRlY3RJbmNvbXBsZXRlQ2hhcjtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aGlzLndyaXRlID0gcGFzc1Rocm91Z2hXcml0ZTtcbiAgICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIEVub3VnaCBzcGFjZSB0byBzdG9yZSBhbGwgYnl0ZXMgb2YgYSBzaW5nbGUgY2hhcmFjdGVyLiBVVEYtOCBuZWVkcyA0XG4gIC8vIGJ5dGVzLCBidXQgQ0VTVS04IG1heSByZXF1aXJlIHVwIHRvIDYgKDMgYnl0ZXMgcGVyIHN1cnJvZ2F0ZSkuXG4gIHRoaXMuY2hhckJ1ZmZlciA9IG5ldyBCdWZmZXIoNik7XG4gIC8vIE51bWJlciBvZiBieXRlcyByZWNlaXZlZCBmb3IgdGhlIGN1cnJlbnQgaW5jb21wbGV0ZSBtdWx0aS1ieXRlIGNoYXJhY3Rlci5cbiAgdGhpcy5jaGFyUmVjZWl2ZWQgPSAwO1xuICAvLyBOdW1iZXIgb2YgYnl0ZXMgZXhwZWN0ZWQgZm9yIHRoZSBjdXJyZW50IGluY29tcGxldGUgbXVsdGktYnl0ZSBjaGFyYWN0ZXIuXG4gIHRoaXMuY2hhckxlbmd0aCA9IDA7XG59O1xuXG5cbi8vIHdyaXRlIGRlY29kZXMgdGhlIGdpdmVuIGJ1ZmZlciBhbmQgcmV0dXJucyBpdCBhcyBKUyBzdHJpbmcgdGhhdCBpc1xuLy8gZ3VhcmFudGVlZCB0byBub3QgY29udGFpbiBhbnkgcGFydGlhbCBtdWx0aS1ieXRlIGNoYXJhY3RlcnMuIEFueSBwYXJ0aWFsXG4vLyBjaGFyYWN0ZXIgZm91bmQgYXQgdGhlIGVuZCBvZiB0aGUgYnVmZmVyIGlzIGJ1ZmZlcmVkIHVwLCBhbmQgd2lsbCBiZVxuLy8gcmV0dXJuZWQgd2hlbiBjYWxsaW5nIHdyaXRlIGFnYWluIHdpdGggdGhlIHJlbWFpbmluZyBieXRlcy5cbi8vXG4vLyBOb3RlOiBDb252ZXJ0aW5nIGEgQnVmZmVyIGNvbnRhaW5pbmcgYW4gb3JwaGFuIHN1cnJvZ2F0ZSB0byBhIFN0cmluZ1xuLy8gY3VycmVudGx5IHdvcmtzLCBidXQgY29udmVydGluZyBhIFN0cmluZyB0byBhIEJ1ZmZlciAodmlhIGBuZXcgQnVmZmVyYCwgb3Jcbi8vIEJ1ZmZlciN3cml0ZSkgd2lsbCByZXBsYWNlIGluY29tcGxldGUgc3Vycm9nYXRlcyB3aXRoIHRoZSB1bmljb2RlXG4vLyByZXBsYWNlbWVudCBjaGFyYWN0ZXIuIFNlZSBodHRwczovL2NvZGVyZXZpZXcuY2hyb21pdW0ub3JnLzEyMTE3MzAwOS8gLlxuU3RyaW5nRGVjb2Rlci5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbihidWZmZXIpIHtcbiAgdmFyIGNoYXJTdHIgPSAnJztcbiAgLy8gaWYgb3VyIGxhc3Qgd3JpdGUgZW5kZWQgd2l0aCBhbiBpbmNvbXBsZXRlIG11bHRpYnl0ZSBjaGFyYWN0ZXJcbiAgd2hpbGUgKHRoaXMuY2hhckxlbmd0aCkge1xuICAgIC8vIGRldGVybWluZSBob3cgbWFueSByZW1haW5pbmcgYnl0ZXMgdGhpcyBidWZmZXIgaGFzIHRvIG9mZmVyIGZvciB0aGlzIGNoYXJcbiAgICB2YXIgYXZhaWxhYmxlID0gKGJ1ZmZlci5sZW5ndGggPj0gdGhpcy5jaGFyTGVuZ3RoIC0gdGhpcy5jaGFyUmVjZWl2ZWQpID9cbiAgICAgICAgdGhpcy5jaGFyTGVuZ3RoIC0gdGhpcy5jaGFyUmVjZWl2ZWQgOlxuICAgICAgICBidWZmZXIubGVuZ3RoO1xuXG4gICAgLy8gYWRkIHRoZSBuZXcgYnl0ZXMgdG8gdGhlIGNoYXIgYnVmZmVyXG4gICAgYnVmZmVyLmNvcHkodGhpcy5jaGFyQnVmZmVyLCB0aGlzLmNoYXJSZWNlaXZlZCwgMCwgYXZhaWxhYmxlKTtcbiAgICB0aGlzLmNoYXJSZWNlaXZlZCArPSBhdmFpbGFibGU7XG5cbiAgICBpZiAodGhpcy5jaGFyUmVjZWl2ZWQgPCB0aGlzLmNoYXJMZW5ndGgpIHtcbiAgICAgIC8vIHN0aWxsIG5vdCBlbm91Z2ggY2hhcnMgaW4gdGhpcyBidWZmZXI/IHdhaXQgZm9yIG1vcmUgLi4uXG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgLy8gcmVtb3ZlIGJ5dGVzIGJlbG9uZ2luZyB0byB0aGUgY3VycmVudCBjaGFyYWN0ZXIgZnJvbSB0aGUgYnVmZmVyXG4gICAgYnVmZmVyID0gYnVmZmVyLnNsaWNlKGF2YWlsYWJsZSwgYnVmZmVyLmxlbmd0aCk7XG5cbiAgICAvLyBnZXQgdGhlIGNoYXJhY3RlciB0aGF0IHdhcyBzcGxpdFxuICAgIGNoYXJTdHIgPSB0aGlzLmNoYXJCdWZmZXIuc2xpY2UoMCwgdGhpcy5jaGFyTGVuZ3RoKS50b1N0cmluZyh0aGlzLmVuY29kaW5nKTtcblxuICAgIC8vIENFU1UtODogbGVhZCBzdXJyb2dhdGUgKEQ4MDAtREJGRikgaXMgYWxzbyB0aGUgaW5jb21wbGV0ZSBjaGFyYWN0ZXJcbiAgICB2YXIgY2hhckNvZGUgPSBjaGFyU3RyLmNoYXJDb2RlQXQoY2hhclN0ci5sZW5ndGggLSAxKTtcbiAgICBpZiAoY2hhckNvZGUgPj0gMHhEODAwICYmIGNoYXJDb2RlIDw9IDB4REJGRikge1xuICAgICAgdGhpcy5jaGFyTGVuZ3RoICs9IHRoaXMuc3Vycm9nYXRlU2l6ZTtcbiAgICAgIGNoYXJTdHIgPSAnJztcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICB0aGlzLmNoYXJSZWNlaXZlZCA9IHRoaXMuY2hhckxlbmd0aCA9IDA7XG5cbiAgICAvLyBpZiB0aGVyZSBhcmUgbm8gbW9yZSBieXRlcyBpbiB0aGlzIGJ1ZmZlciwganVzdCBlbWl0IG91ciBjaGFyXG4gICAgaWYgKGJ1ZmZlci5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBjaGFyU3RyO1xuICAgIH1cbiAgICBicmVhaztcbiAgfVxuXG4gIC8vIGRldGVybWluZSBhbmQgc2V0IGNoYXJMZW5ndGggLyBjaGFyUmVjZWl2ZWRcbiAgdGhpcy5kZXRlY3RJbmNvbXBsZXRlQ2hhcihidWZmZXIpO1xuXG4gIHZhciBlbmQgPSBidWZmZXIubGVuZ3RoO1xuICBpZiAodGhpcy5jaGFyTGVuZ3RoKSB7XG4gICAgLy8gYnVmZmVyIHRoZSBpbmNvbXBsZXRlIGNoYXJhY3RlciBieXRlcyB3ZSBnb3RcbiAgICBidWZmZXIuY29weSh0aGlzLmNoYXJCdWZmZXIsIDAsIGJ1ZmZlci5sZW5ndGggLSB0aGlzLmNoYXJSZWNlaXZlZCwgZW5kKTtcbiAgICBlbmQgLT0gdGhpcy5jaGFyUmVjZWl2ZWQ7XG4gIH1cblxuICBjaGFyU3RyICs9IGJ1ZmZlci50b1N0cmluZyh0aGlzLmVuY29kaW5nLCAwLCBlbmQpO1xuXG4gIHZhciBlbmQgPSBjaGFyU3RyLmxlbmd0aCAtIDE7XG4gIHZhciBjaGFyQ29kZSA9IGNoYXJTdHIuY2hhckNvZGVBdChlbmQpO1xuICAvLyBDRVNVLTg6IGxlYWQgc3Vycm9nYXRlIChEODAwLURCRkYpIGlzIGFsc28gdGhlIGluY29tcGxldGUgY2hhcmFjdGVyXG4gIGlmIChjaGFyQ29kZSA+PSAweEQ4MDAgJiYgY2hhckNvZGUgPD0gMHhEQkZGKSB7XG4gICAgdmFyIHNpemUgPSB0aGlzLnN1cnJvZ2F0ZVNpemU7XG4gICAgdGhpcy5jaGFyTGVuZ3RoICs9IHNpemU7XG4gICAgdGhpcy5jaGFyUmVjZWl2ZWQgKz0gc2l6ZTtcbiAgICB0aGlzLmNoYXJCdWZmZXIuY29weSh0aGlzLmNoYXJCdWZmZXIsIHNpemUsIDAsIHNpemUpO1xuICAgIGJ1ZmZlci5jb3B5KHRoaXMuY2hhckJ1ZmZlciwgMCwgMCwgc2l6ZSk7XG4gICAgcmV0dXJuIGNoYXJTdHIuc3Vic3RyaW5nKDAsIGVuZCk7XG4gIH1cblxuICAvLyBvciBqdXN0IGVtaXQgdGhlIGNoYXJTdHJcbiAgcmV0dXJuIGNoYXJTdHI7XG59O1xuXG4vLyBkZXRlY3RJbmNvbXBsZXRlQ2hhciBkZXRlcm1pbmVzIGlmIHRoZXJlIGlzIGFuIGluY29tcGxldGUgVVRGLTggY2hhcmFjdGVyIGF0XG4vLyB0aGUgZW5kIG9mIHRoZSBnaXZlbiBidWZmZXIuIElmIHNvLCBpdCBzZXRzIHRoaXMuY2hhckxlbmd0aCB0byB0aGUgYnl0ZVxuLy8gbGVuZ3RoIHRoYXQgY2hhcmFjdGVyLCBhbmQgc2V0cyB0aGlzLmNoYXJSZWNlaXZlZCB0byB0aGUgbnVtYmVyIG9mIGJ5dGVzXG4vLyB0aGF0IGFyZSBhdmFpbGFibGUgZm9yIHRoaXMgY2hhcmFjdGVyLlxuU3RyaW5nRGVjb2Rlci5wcm90b3R5cGUuZGV0ZWN0SW5jb21wbGV0ZUNoYXIgPSBmdW5jdGlvbihidWZmZXIpIHtcbiAgLy8gZGV0ZXJtaW5lIGhvdyBtYW55IGJ5dGVzIHdlIGhhdmUgdG8gY2hlY2sgYXQgdGhlIGVuZCBvZiB0aGlzIGJ1ZmZlclxuICB2YXIgaSA9IChidWZmZXIubGVuZ3RoID49IDMpID8gMyA6IGJ1ZmZlci5sZW5ndGg7XG5cbiAgLy8gRmlndXJlIG91dCBpZiBvbmUgb2YgdGhlIGxhc3QgaSBieXRlcyBvZiBvdXIgYnVmZmVyIGFubm91bmNlcyBhblxuICAvLyBpbmNvbXBsZXRlIGNoYXIuXG4gIGZvciAoOyBpID4gMDsgaS0tKSB7XG4gICAgdmFyIGMgPSBidWZmZXJbYnVmZmVyLmxlbmd0aCAtIGldO1xuXG4gICAgLy8gU2VlIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVVRGLTgjRGVzY3JpcHRpb25cblxuICAgIC8vIDExMFhYWFhYXG4gICAgaWYgKGkgPT0gMSAmJiBjID4+IDUgPT0gMHgwNikge1xuICAgICAgdGhpcy5jaGFyTGVuZ3RoID0gMjtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIC8vIDExMTBYWFhYXG4gICAgaWYgKGkgPD0gMiAmJiBjID4+IDQgPT0gMHgwRSkge1xuICAgICAgdGhpcy5jaGFyTGVuZ3RoID0gMztcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIC8vIDExMTEwWFhYXG4gICAgaWYgKGkgPD0gMyAmJiBjID4+IDMgPT0gMHgxRSkge1xuICAgICAgdGhpcy5jaGFyTGVuZ3RoID0gNDtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICB0aGlzLmNoYXJSZWNlaXZlZCA9IGk7XG59O1xuXG5TdHJpbmdEZWNvZGVyLnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbihidWZmZXIpIHtcbiAgdmFyIHJlcyA9ICcnO1xuICBpZiAoYnVmZmVyICYmIGJ1ZmZlci5sZW5ndGgpXG4gICAgcmVzID0gdGhpcy53cml0ZShidWZmZXIpO1xuXG4gIGlmICh0aGlzLmNoYXJSZWNlaXZlZCkge1xuICAgIHZhciBjciA9IHRoaXMuY2hhclJlY2VpdmVkO1xuICAgIHZhciBidWYgPSB0aGlzLmNoYXJCdWZmZXI7XG4gICAgdmFyIGVuYyA9IHRoaXMuZW5jb2Rpbmc7XG4gICAgcmVzICs9IGJ1Zi5zbGljZSgwLCBjcikudG9TdHJpbmcoZW5jKTtcbiAgfVxuXG4gIHJldHVybiByZXM7XG59O1xuXG5mdW5jdGlvbiBwYXNzVGhyb3VnaFdyaXRlKGJ1ZmZlcikge1xuICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKHRoaXMuZW5jb2RpbmcpO1xufVxuXG5mdW5jdGlvbiB1dGYxNkRldGVjdEluY29tcGxldGVDaGFyKGJ1ZmZlcikge1xuICB0aGlzLmNoYXJSZWNlaXZlZCA9IGJ1ZmZlci5sZW5ndGggJSAyO1xuICB0aGlzLmNoYXJMZW5ndGggPSB0aGlzLmNoYXJSZWNlaXZlZCA/IDIgOiAwO1xufVxuXG5mdW5jdGlvbiBiYXNlNjREZXRlY3RJbmNvbXBsZXRlQ2hhcihidWZmZXIpIHtcbiAgdGhpcy5jaGFyUmVjZWl2ZWQgPSBidWZmZXIubGVuZ3RoICUgMztcbiAgdGhpcy5jaGFyTGVuZ3RoID0gdGhpcy5jaGFyUmVjZWl2ZWQgPyAzIDogMDtcbn1cbiIsIlxuLyoqXG4gKiBNb2R1bGUgZXhwb3J0cy5cbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGRlcHJlY2F0ZTtcblxuLyoqXG4gKiBNYXJrIHRoYXQgYSBtZXRob2Qgc2hvdWxkIG5vdCBiZSB1c2VkLlxuICogUmV0dXJucyBhIG1vZGlmaWVkIGZ1bmN0aW9uIHdoaWNoIHdhcm5zIG9uY2UgYnkgZGVmYXVsdC5cbiAqXG4gKiBJZiBgbG9jYWxTdG9yYWdlLm5vRGVwcmVjYXRpb24gPSB0cnVlYCBpcyBzZXQsIHRoZW4gaXQgaXMgYSBuby1vcC5cbiAqXG4gKiBJZiBgbG9jYWxTdG9yYWdlLnRocm93RGVwcmVjYXRpb24gPSB0cnVlYCBpcyBzZXQsIHRoZW4gZGVwcmVjYXRlZCBmdW5jdGlvbnNcbiAqIHdpbGwgdGhyb3cgYW4gRXJyb3Igd2hlbiBpbnZva2VkLlxuICpcbiAqIElmIGBsb2NhbFN0b3JhZ2UudHJhY2VEZXByZWNhdGlvbiA9IHRydWVgIGlzIHNldCwgdGhlbiBkZXByZWNhdGVkIGZ1bmN0aW9uc1xuICogd2lsbCBpbnZva2UgYGNvbnNvbGUudHJhY2UoKWAgaW5zdGVhZCBvZiBgY29uc29sZS5lcnJvcigpYC5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiAtIHRoZSBmdW5jdGlvbiB0byBkZXByZWNhdGVcbiAqIEBwYXJhbSB7U3RyaW5nfSBtc2cgLSB0aGUgc3RyaW5nIHRvIHByaW50IHRvIHRoZSBjb25zb2xlIHdoZW4gYGZuYCBpcyBpbnZva2VkXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IGEgbmV3IFwiZGVwcmVjYXRlZFwiIHZlcnNpb24gb2YgYGZuYFxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBkZXByZWNhdGUgKGZuLCBtc2cpIHtcbiAgaWYgKGNvbmZpZygnbm9EZXByZWNhdGlvbicpKSB7XG4gICAgcmV0dXJuIGZuO1xuICB9XG5cbiAgdmFyIHdhcm5lZCA9IGZhbHNlO1xuICBmdW5jdGlvbiBkZXByZWNhdGVkKCkge1xuICAgIGlmICghd2FybmVkKSB7XG4gICAgICBpZiAoY29uZmlnKCd0aHJvd0RlcHJlY2F0aW9uJykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1zZyk7XG4gICAgICB9IGVsc2UgaWYgKGNvbmZpZygndHJhY2VEZXByZWNhdGlvbicpKSB7XG4gICAgICAgIGNvbnNvbGUudHJhY2UobXNnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUud2Fybihtc2cpO1xuICAgICAgfVxuICAgICAgd2FybmVkID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cblxuICByZXR1cm4gZGVwcmVjYXRlZDtcbn1cblxuLyoqXG4gKiBDaGVja3MgYGxvY2FsU3RvcmFnZWAgZm9yIGJvb2xlYW4gdmFsdWVzIGZvciB0aGUgZ2l2ZW4gYG5hbWVgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGNvbmZpZyAobmFtZSkge1xuICAvLyBhY2Nlc3NpbmcgZ2xvYmFsLmxvY2FsU3RvcmFnZSBjYW4gdHJpZ2dlciBhIERPTUV4Y2VwdGlvbiBpbiBzYW5kYm94ZWQgaWZyYW1lc1xuICB0cnkge1xuICAgIGlmICghZ2xvYmFsLmxvY2FsU3RvcmFnZSkgcmV0dXJuIGZhbHNlO1xuICB9IGNhdGNoIChfKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciB2YWwgPSBnbG9iYWwubG9jYWxTdG9yYWdlW25hbWVdO1xuICBpZiAobnVsbCA9PSB2YWwpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIFN0cmluZyh2YWwpLnRvTG93ZXJDYXNlKCkgPT09ICd0cnVlJztcbn1cbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaXNCdWZmZXIoYXJnKSB7XG4gIHJldHVybiBhcmcgJiYgdHlwZW9mIGFyZyA9PT0gJ29iamVjdCdcbiAgICAmJiB0eXBlb2YgYXJnLmNvcHkgPT09ICdmdW5jdGlvbidcbiAgICAmJiB0eXBlb2YgYXJnLmZpbGwgPT09ICdmdW5jdGlvbidcbiAgICAmJiB0eXBlb2YgYXJnLnJlYWRVSW50OCA9PT0gJ2Z1bmN0aW9uJztcbn0iLCIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxudmFyIGZvcm1hdFJlZ0V4cCA9IC8lW3NkaiVdL2c7XG5leHBvcnRzLmZvcm1hdCA9IGZ1bmN0aW9uKGYpIHtcbiAgaWYgKCFpc1N0cmluZyhmKSkge1xuICAgIHZhciBvYmplY3RzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIG9iamVjdHMucHVzaChpbnNwZWN0KGFyZ3VtZW50c1tpXSkpO1xuICAgIH1cbiAgICByZXR1cm4gb2JqZWN0cy5qb2luKCcgJyk7XG4gIH1cblxuICB2YXIgaSA9IDE7XG4gIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICB2YXIgbGVuID0gYXJncy5sZW5ndGg7XG4gIHZhciBzdHIgPSBTdHJpbmcoZikucmVwbGFjZShmb3JtYXRSZWdFeHAsIGZ1bmN0aW9uKHgpIHtcbiAgICBpZiAoeCA9PT0gJyUlJykgcmV0dXJuICclJztcbiAgICBpZiAoaSA+PSBsZW4pIHJldHVybiB4O1xuICAgIHN3aXRjaCAoeCkge1xuICAgICAgY2FzZSAnJXMnOiByZXR1cm4gU3RyaW5nKGFyZ3NbaSsrXSk7XG4gICAgICBjYXNlICclZCc6IHJldHVybiBOdW1iZXIoYXJnc1tpKytdKTtcbiAgICAgIGNhc2UgJyVqJzpcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoYXJnc1tpKytdKTtcbiAgICAgICAgfSBjYXRjaCAoXykge1xuICAgICAgICAgIHJldHVybiAnW0NpcmN1bGFyXSc7XG4gICAgICAgIH1cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB4O1xuICAgIH1cbiAgfSk7XG4gIGZvciAodmFyIHggPSBhcmdzW2ldOyBpIDwgbGVuOyB4ID0gYXJnc1srK2ldKSB7XG4gICAgaWYgKGlzTnVsbCh4KSB8fCAhaXNPYmplY3QoeCkpIHtcbiAgICAgIHN0ciArPSAnICcgKyB4O1xuICAgIH0gZWxzZSB7XG4gICAgICBzdHIgKz0gJyAnICsgaW5zcGVjdCh4KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHN0cjtcbn07XG5cblxuLy8gTWFyayB0aGF0IGEgbWV0aG9kIHNob3VsZCBub3QgYmUgdXNlZC5cbi8vIFJldHVybnMgYSBtb2RpZmllZCBmdW5jdGlvbiB3aGljaCB3YXJucyBvbmNlIGJ5IGRlZmF1bHQuXG4vLyBJZiAtLW5vLWRlcHJlY2F0aW9uIGlzIHNldCwgdGhlbiBpdCBpcyBhIG5vLW9wLlxuZXhwb3J0cy5kZXByZWNhdGUgPSBmdW5jdGlvbihmbiwgbXNnKSB7XG4gIC8vIEFsbG93IGZvciBkZXByZWNhdGluZyB0aGluZ3MgaW4gdGhlIHByb2Nlc3Mgb2Ygc3RhcnRpbmcgdXAuXG4gIGlmIChpc1VuZGVmaW5lZChnbG9iYWwucHJvY2VzcykpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gZXhwb3J0cy5kZXByZWNhdGUoZm4sIG1zZykuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9O1xuICB9XG5cbiAgaWYgKHByb2Nlc3Mubm9EZXByZWNhdGlvbiA9PT0gdHJ1ZSkge1xuICAgIHJldHVybiBmbjtcbiAgfVxuXG4gIHZhciB3YXJuZWQgPSBmYWxzZTtcbiAgZnVuY3Rpb24gZGVwcmVjYXRlZCgpIHtcbiAgICBpZiAoIXdhcm5lZCkge1xuICAgICAgaWYgKHByb2Nlc3MudGhyb3dEZXByZWNhdGlvbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcbiAgICAgIH0gZWxzZSBpZiAocHJvY2Vzcy50cmFjZURlcHJlY2F0aW9uKSB7XG4gICAgICAgIGNvbnNvbGUudHJhY2UobXNnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IobXNnKTtcbiAgICAgIH1cbiAgICAgIHdhcm5lZCA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgcmV0dXJuIGRlcHJlY2F0ZWQ7XG59O1xuXG5cbnZhciBkZWJ1Z3MgPSB7fTtcbnZhciBkZWJ1Z0Vudmlyb247XG5leHBvcnRzLmRlYnVnbG9nID0gZnVuY3Rpb24oc2V0KSB7XG4gIGlmIChpc1VuZGVmaW5lZChkZWJ1Z0Vudmlyb24pKVxuICAgIGRlYnVnRW52aXJvbiA9IHByb2Nlc3MuZW52Lk5PREVfREVCVUcgfHwgJyc7XG4gIHNldCA9IHNldC50b1VwcGVyQ2FzZSgpO1xuICBpZiAoIWRlYnVnc1tzZXRdKSB7XG4gICAgaWYgKG5ldyBSZWdFeHAoJ1xcXFxiJyArIHNldCArICdcXFxcYicsICdpJykudGVzdChkZWJ1Z0Vudmlyb24pKSB7XG4gICAgICB2YXIgcGlkID0gcHJvY2Vzcy5waWQ7XG4gICAgICBkZWJ1Z3Nbc2V0XSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgbXNnID0gZXhwb3J0cy5mb3JtYXQuYXBwbHkoZXhwb3J0cywgYXJndW1lbnRzKTtcbiAgICAgICAgY29uc29sZS5lcnJvcignJXMgJWQ6ICVzJywgc2V0LCBwaWQsIG1zZyk7XG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWJ1Z3Nbc2V0XSA9IGZ1bmN0aW9uKCkge307XG4gICAgfVxuICB9XG4gIHJldHVybiBkZWJ1Z3Nbc2V0XTtcbn07XG5cblxuLyoqXG4gKiBFY2hvcyB0aGUgdmFsdWUgb2YgYSB2YWx1ZS4gVHJ5cyB0byBwcmludCB0aGUgdmFsdWUgb3V0XG4gKiBpbiB0aGUgYmVzdCB3YXkgcG9zc2libGUgZ2l2ZW4gdGhlIGRpZmZlcmVudCB0eXBlcy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gcHJpbnQgb3V0LlxuICogQHBhcmFtIHtPYmplY3R9IG9wdHMgT3B0aW9uYWwgb3B0aW9ucyBvYmplY3QgdGhhdCBhbHRlcnMgdGhlIG91dHB1dC5cbiAqL1xuLyogbGVnYWN5OiBvYmosIHNob3dIaWRkZW4sIGRlcHRoLCBjb2xvcnMqL1xuZnVuY3Rpb24gaW5zcGVjdChvYmosIG9wdHMpIHtcbiAgLy8gZGVmYXVsdCBvcHRpb25zXG4gIHZhciBjdHggPSB7XG4gICAgc2VlbjogW10sXG4gICAgc3R5bGl6ZTogc3R5bGl6ZU5vQ29sb3JcbiAgfTtcbiAgLy8gbGVnYWN5Li4uXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID49IDMpIGN0eC5kZXB0aCA9IGFyZ3VtZW50c1syXTtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPj0gNCkgY3R4LmNvbG9ycyA9IGFyZ3VtZW50c1szXTtcbiAgaWYgKGlzQm9vbGVhbihvcHRzKSkge1xuICAgIC8vIGxlZ2FjeS4uLlxuICAgIGN0eC5zaG93SGlkZGVuID0gb3B0cztcbiAgfSBlbHNlIGlmIChvcHRzKSB7XG4gICAgLy8gZ290IGFuIFwib3B0aW9uc1wiIG9iamVjdFxuICAgIGV4cG9ydHMuX2V4dGVuZChjdHgsIG9wdHMpO1xuICB9XG4gIC8vIHNldCBkZWZhdWx0IG9wdGlvbnNcbiAgaWYgKGlzVW5kZWZpbmVkKGN0eC5zaG93SGlkZGVuKSkgY3R4LnNob3dIaWRkZW4gPSBmYWxzZTtcbiAgaWYgKGlzVW5kZWZpbmVkKGN0eC5kZXB0aCkpIGN0eC5kZXB0aCA9IDI7XG4gIGlmIChpc1VuZGVmaW5lZChjdHguY29sb3JzKSkgY3R4LmNvbG9ycyA9IGZhbHNlO1xuICBpZiAoaXNVbmRlZmluZWQoY3R4LmN1c3RvbUluc3BlY3QpKSBjdHguY3VzdG9tSW5zcGVjdCA9IHRydWU7XG4gIGlmIChjdHguY29sb3JzKSBjdHguc3R5bGl6ZSA9IHN0eWxpemVXaXRoQ29sb3I7XG4gIHJldHVybiBmb3JtYXRWYWx1ZShjdHgsIG9iaiwgY3R4LmRlcHRoKTtcbn1cbmV4cG9ydHMuaW5zcGVjdCA9IGluc3BlY3Q7XG5cblxuLy8gaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9BTlNJX2VzY2FwZV9jb2RlI2dyYXBoaWNzXG5pbnNwZWN0LmNvbG9ycyA9IHtcbiAgJ2JvbGQnIDogWzEsIDIyXSxcbiAgJ2l0YWxpYycgOiBbMywgMjNdLFxuICAndW5kZXJsaW5lJyA6IFs0LCAyNF0sXG4gICdpbnZlcnNlJyA6IFs3LCAyN10sXG4gICd3aGl0ZScgOiBbMzcsIDM5XSxcbiAgJ2dyZXknIDogWzkwLCAzOV0sXG4gICdibGFjaycgOiBbMzAsIDM5XSxcbiAgJ2JsdWUnIDogWzM0LCAzOV0sXG4gICdjeWFuJyA6IFszNiwgMzldLFxuICAnZ3JlZW4nIDogWzMyLCAzOV0sXG4gICdtYWdlbnRhJyA6IFszNSwgMzldLFxuICAncmVkJyA6IFszMSwgMzldLFxuICAneWVsbG93JyA6IFszMywgMzldXG59O1xuXG4vLyBEb24ndCB1c2UgJ2JsdWUnIG5vdCB2aXNpYmxlIG9uIGNtZC5leGVcbmluc3BlY3Quc3R5bGVzID0ge1xuICAnc3BlY2lhbCc6ICdjeWFuJyxcbiAgJ251bWJlcic6ICd5ZWxsb3cnLFxuICAnYm9vbGVhbic6ICd5ZWxsb3cnLFxuICAndW5kZWZpbmVkJzogJ2dyZXknLFxuICAnbnVsbCc6ICdib2xkJyxcbiAgJ3N0cmluZyc6ICdncmVlbicsXG4gICdkYXRlJzogJ21hZ2VudGEnLFxuICAvLyBcIm5hbWVcIjogaW50ZW50aW9uYWxseSBub3Qgc3R5bGluZ1xuICAncmVnZXhwJzogJ3JlZCdcbn07XG5cblxuZnVuY3Rpb24gc3R5bGl6ZVdpdGhDb2xvcihzdHIsIHN0eWxlVHlwZSkge1xuICB2YXIgc3R5bGUgPSBpbnNwZWN0LnN0eWxlc1tzdHlsZVR5cGVdO1xuXG4gIGlmIChzdHlsZSkge1xuICAgIHJldHVybiAnXFx1MDAxYlsnICsgaW5zcGVjdC5jb2xvcnNbc3R5bGVdWzBdICsgJ20nICsgc3RyICtcbiAgICAgICAgICAgJ1xcdTAwMWJbJyArIGluc3BlY3QuY29sb3JzW3N0eWxlXVsxXSArICdtJztcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gc3RyO1xuICB9XG59XG5cblxuZnVuY3Rpb24gc3R5bGl6ZU5vQ29sb3Ioc3RyLCBzdHlsZVR5cGUpIHtcbiAgcmV0dXJuIHN0cjtcbn1cblxuXG5mdW5jdGlvbiBhcnJheVRvSGFzaChhcnJheSkge1xuICB2YXIgaGFzaCA9IHt9O1xuXG4gIGFycmF5LmZvckVhY2goZnVuY3Rpb24odmFsLCBpZHgpIHtcbiAgICBoYXNoW3ZhbF0gPSB0cnVlO1xuICB9KTtcblxuICByZXR1cm4gaGFzaDtcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRWYWx1ZShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMpIHtcbiAgLy8gUHJvdmlkZSBhIGhvb2sgZm9yIHVzZXItc3BlY2lmaWVkIGluc3BlY3QgZnVuY3Rpb25zLlxuICAvLyBDaGVjayB0aGF0IHZhbHVlIGlzIGFuIG9iamVjdCB3aXRoIGFuIGluc3BlY3QgZnVuY3Rpb24gb24gaXRcbiAgaWYgKGN0eC5jdXN0b21JbnNwZWN0ICYmXG4gICAgICB2YWx1ZSAmJlxuICAgICAgaXNGdW5jdGlvbih2YWx1ZS5pbnNwZWN0KSAmJlxuICAgICAgLy8gRmlsdGVyIG91dCB0aGUgdXRpbCBtb2R1bGUsIGl0J3MgaW5zcGVjdCBmdW5jdGlvbiBpcyBzcGVjaWFsXG4gICAgICB2YWx1ZS5pbnNwZWN0ICE9PSBleHBvcnRzLmluc3BlY3QgJiZcbiAgICAgIC8vIEFsc28gZmlsdGVyIG91dCBhbnkgcHJvdG90eXBlIG9iamVjdHMgdXNpbmcgdGhlIGNpcmN1bGFyIGNoZWNrLlxuICAgICAgISh2YWx1ZS5jb25zdHJ1Y3RvciAmJiB2YWx1ZS5jb25zdHJ1Y3Rvci5wcm90b3R5cGUgPT09IHZhbHVlKSkge1xuICAgIHZhciByZXQgPSB2YWx1ZS5pbnNwZWN0KHJlY3Vyc2VUaW1lcywgY3R4KTtcbiAgICBpZiAoIWlzU3RyaW5nKHJldCkpIHtcbiAgICAgIHJldCA9IGZvcm1hdFZhbHVlKGN0eCwgcmV0LCByZWN1cnNlVGltZXMpO1xuICAgIH1cbiAgICByZXR1cm4gcmV0O1xuICB9XG5cbiAgLy8gUHJpbWl0aXZlIHR5cGVzIGNhbm5vdCBoYXZlIHByb3BlcnRpZXNcbiAgdmFyIHByaW1pdGl2ZSA9IGZvcm1hdFByaW1pdGl2ZShjdHgsIHZhbHVlKTtcbiAgaWYgKHByaW1pdGl2ZSkge1xuICAgIHJldHVybiBwcmltaXRpdmU7XG4gIH1cblxuICAvLyBMb29rIHVwIHRoZSBrZXlzIG9mIHRoZSBvYmplY3QuXG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXModmFsdWUpO1xuICB2YXIgdmlzaWJsZUtleXMgPSBhcnJheVRvSGFzaChrZXlzKTtcblxuICBpZiAoY3R4LnNob3dIaWRkZW4pIHtcbiAgICBrZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModmFsdWUpO1xuICB9XG5cbiAgLy8gSUUgZG9lc24ndCBtYWtlIGVycm9yIGZpZWxkcyBub24tZW51bWVyYWJsZVxuICAvLyBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvaWUvZHd3NTJzYnQodj12cy45NCkuYXNweFxuICBpZiAoaXNFcnJvcih2YWx1ZSlcbiAgICAgICYmIChrZXlzLmluZGV4T2YoJ21lc3NhZ2UnKSA+PSAwIHx8IGtleXMuaW5kZXhPZignZGVzY3JpcHRpb24nKSA+PSAwKSkge1xuICAgIHJldHVybiBmb3JtYXRFcnJvcih2YWx1ZSk7XG4gIH1cblxuICAvLyBTb21lIHR5cGUgb2Ygb2JqZWN0IHdpdGhvdXQgcHJvcGVydGllcyBjYW4gYmUgc2hvcnRjdXR0ZWQuXG4gIGlmIChrZXlzLmxlbmd0aCA9PT0gMCkge1xuICAgIGlmIChpc0Z1bmN0aW9uKHZhbHVlKSkge1xuICAgICAgdmFyIG5hbWUgPSB2YWx1ZS5uYW1lID8gJzogJyArIHZhbHVlLm5hbWUgOiAnJztcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZSgnW0Z1bmN0aW9uJyArIG5hbWUgKyAnXScsICdzcGVjaWFsJyk7XG4gICAgfVxuICAgIGlmIChpc1JlZ0V4cCh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZShSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpLCAncmVnZXhwJyk7XG4gICAgfVxuICAgIGlmIChpc0RhdGUodmFsdWUpKSB7XG4gICAgICByZXR1cm4gY3R4LnN0eWxpemUoRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSksICdkYXRlJyk7XG4gICAgfVxuICAgIGlmIChpc0Vycm9yKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGZvcm1hdEVycm9yKHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICB2YXIgYmFzZSA9ICcnLCBhcnJheSA9IGZhbHNlLCBicmFjZXMgPSBbJ3snLCAnfSddO1xuXG4gIC8vIE1ha2UgQXJyYXkgc2F5IHRoYXQgdGhleSBhcmUgQXJyYXlcbiAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgYXJyYXkgPSB0cnVlO1xuICAgIGJyYWNlcyA9IFsnWycsICddJ107XG4gIH1cblxuICAvLyBNYWtlIGZ1bmN0aW9ucyBzYXkgdGhhdCB0aGV5IGFyZSBmdW5jdGlvbnNcbiAgaWYgKGlzRnVuY3Rpb24odmFsdWUpKSB7XG4gICAgdmFyIG4gPSB2YWx1ZS5uYW1lID8gJzogJyArIHZhbHVlLm5hbWUgOiAnJztcbiAgICBiYXNlID0gJyBbRnVuY3Rpb24nICsgbiArICddJztcbiAgfVxuXG4gIC8vIE1ha2UgUmVnRXhwcyBzYXkgdGhhdCB0aGV5IGFyZSBSZWdFeHBzXG4gIGlmIChpc1JlZ0V4cCh2YWx1ZSkpIHtcbiAgICBiYXNlID0gJyAnICsgUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKTtcbiAgfVxuXG4gIC8vIE1ha2UgZGF0ZXMgd2l0aCBwcm9wZXJ0aWVzIGZpcnN0IHNheSB0aGUgZGF0ZVxuICBpZiAoaXNEYXRlKHZhbHVlKSkge1xuICAgIGJhc2UgPSAnICcgKyBEYXRlLnByb3RvdHlwZS50b1VUQ1N0cmluZy5jYWxsKHZhbHVlKTtcbiAgfVxuXG4gIC8vIE1ha2UgZXJyb3Igd2l0aCBtZXNzYWdlIGZpcnN0IHNheSB0aGUgZXJyb3JcbiAgaWYgKGlzRXJyb3IodmFsdWUpKSB7XG4gICAgYmFzZSA9ICcgJyArIGZvcm1hdEVycm9yKHZhbHVlKTtcbiAgfVxuXG4gIGlmIChrZXlzLmxlbmd0aCA9PT0gMCAmJiAoIWFycmF5IHx8IHZhbHVlLmxlbmd0aCA9PSAwKSkge1xuICAgIHJldHVybiBicmFjZXNbMF0gKyBiYXNlICsgYnJhY2VzWzFdO1xuICB9XG5cbiAgaWYgKHJlY3Vyc2VUaW1lcyA8IDApIHtcbiAgICBpZiAoaXNSZWdFeHAodmFsdWUpKSB7XG4gICAgICByZXR1cm4gY3R4LnN0eWxpemUoUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSwgJ3JlZ2V4cCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gY3R4LnN0eWxpemUoJ1tPYmplY3RdJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gIH1cblxuICBjdHguc2Vlbi5wdXNoKHZhbHVlKTtcblxuICB2YXIgb3V0cHV0O1xuICBpZiAoYXJyYXkpIHtcbiAgICBvdXRwdXQgPSBmb3JtYXRBcnJheShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLCBrZXlzKTtcbiAgfSBlbHNlIHtcbiAgICBvdXRwdXQgPSBrZXlzLm1hcChmdW5jdGlvbihrZXkpIHtcbiAgICAgIHJldHVybiBmb3JtYXRQcm9wZXJ0eShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLCBrZXksIGFycmF5KTtcbiAgICB9KTtcbiAgfVxuXG4gIGN0eC5zZWVuLnBvcCgpO1xuXG4gIHJldHVybiByZWR1Y2VUb1NpbmdsZVN0cmluZyhvdXRwdXQsIGJhc2UsIGJyYWNlcyk7XG59XG5cblxuZnVuY3Rpb24gZm9ybWF0UHJpbWl0aXZlKGN0eCwgdmFsdWUpIHtcbiAgaWYgKGlzVW5kZWZpbmVkKHZhbHVlKSlcbiAgICByZXR1cm4gY3R4LnN0eWxpemUoJ3VuZGVmaW5lZCcsICd1bmRlZmluZWQnKTtcbiAgaWYgKGlzU3RyaW5nKHZhbHVlKSkge1xuICAgIHZhciBzaW1wbGUgPSAnXFwnJyArIEpTT04uc3RyaW5naWZ5KHZhbHVlKS5yZXBsYWNlKC9eXCJ8XCIkL2csICcnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoLycvZywgXCJcXFxcJ1wiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcXFxcIi9nLCAnXCInKSArICdcXCcnO1xuICAgIHJldHVybiBjdHguc3R5bGl6ZShzaW1wbGUsICdzdHJpbmcnKTtcbiAgfVxuICBpZiAoaXNOdW1iZXIodmFsdWUpKVxuICAgIHJldHVybiBjdHguc3R5bGl6ZSgnJyArIHZhbHVlLCAnbnVtYmVyJyk7XG4gIGlmIChpc0Jvb2xlYW4odmFsdWUpKVxuICAgIHJldHVybiBjdHguc3R5bGl6ZSgnJyArIHZhbHVlLCAnYm9vbGVhbicpO1xuICAvLyBGb3Igc29tZSByZWFzb24gdHlwZW9mIG51bGwgaXMgXCJvYmplY3RcIiwgc28gc3BlY2lhbCBjYXNlIGhlcmUuXG4gIGlmIChpc051bGwodmFsdWUpKVxuICAgIHJldHVybiBjdHguc3R5bGl6ZSgnbnVsbCcsICdudWxsJyk7XG59XG5cblxuZnVuY3Rpb24gZm9ybWF0RXJyb3IodmFsdWUpIHtcbiAgcmV0dXJuICdbJyArIEVycm9yLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSArICddJztcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRBcnJheShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLCBrZXlzKSB7XG4gIHZhciBvdXRwdXQgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDAsIGwgPSB2YWx1ZS5sZW5ndGg7IGkgPCBsOyArK2kpIHtcbiAgICBpZiAoaGFzT3duUHJvcGVydHkodmFsdWUsIFN0cmluZyhpKSkpIHtcbiAgICAgIG91dHB1dC5wdXNoKGZvcm1hdFByb3BlcnR5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsXG4gICAgICAgICAgU3RyaW5nKGkpLCB0cnVlKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dHB1dC5wdXNoKCcnKTtcbiAgICB9XG4gIH1cbiAga2V5cy5mb3JFYWNoKGZ1bmN0aW9uKGtleSkge1xuICAgIGlmICgha2V5Lm1hdGNoKC9eXFxkKyQvKSkge1xuICAgICAgb3V0cHV0LnB1c2goZm9ybWF0UHJvcGVydHkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cyxcbiAgICAgICAgICBrZXksIHRydWUpKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gb3V0cHV0O1xufVxuXG5cbmZ1bmN0aW9uIGZvcm1hdFByb3BlcnR5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleSwgYXJyYXkpIHtcbiAgdmFyIG5hbWUsIHN0ciwgZGVzYztcbiAgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodmFsdWUsIGtleSkgfHwgeyB2YWx1ZTogdmFsdWVba2V5XSB9O1xuICBpZiAoZGVzYy5nZXQpIHtcbiAgICBpZiAoZGVzYy5zZXQpIHtcbiAgICAgIHN0ciA9IGN0eC5zdHlsaXplKCdbR2V0dGVyL1NldHRlcl0nLCAnc3BlY2lhbCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdHIgPSBjdHguc3R5bGl6ZSgnW0dldHRlcl0nLCAnc3BlY2lhbCcpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoZGVzYy5zZXQpIHtcbiAgICAgIHN0ciA9IGN0eC5zdHlsaXplKCdbU2V0dGVyXScsICdzcGVjaWFsJyk7XG4gICAgfVxuICB9XG4gIGlmICghaGFzT3duUHJvcGVydHkodmlzaWJsZUtleXMsIGtleSkpIHtcbiAgICBuYW1lID0gJ1snICsga2V5ICsgJ10nO1xuICB9XG4gIGlmICghc3RyKSB7XG4gICAgaWYgKGN0eC5zZWVuLmluZGV4T2YoZGVzYy52YWx1ZSkgPCAwKSB7XG4gICAgICBpZiAoaXNOdWxsKHJlY3Vyc2VUaW1lcykpIHtcbiAgICAgICAgc3RyID0gZm9ybWF0VmFsdWUoY3R4LCBkZXNjLnZhbHVlLCBudWxsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0ciA9IGZvcm1hdFZhbHVlKGN0eCwgZGVzYy52YWx1ZSwgcmVjdXJzZVRpbWVzIC0gMSk7XG4gICAgICB9XG4gICAgICBpZiAoc3RyLmluZGV4T2YoJ1xcbicpID4gLTEpIHtcbiAgICAgICAgaWYgKGFycmF5KSB7XG4gICAgICAgICAgc3RyID0gc3RyLnNwbGl0KCdcXG4nKS5tYXAoZnVuY3Rpb24obGluZSkge1xuICAgICAgICAgICAgcmV0dXJuICcgICcgKyBsaW5lO1xuICAgICAgICAgIH0pLmpvaW4oJ1xcbicpLnN1YnN0cigyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdHIgPSAnXFxuJyArIHN0ci5zcGxpdCgnXFxuJykubWFwKGZ1bmN0aW9uKGxpbmUpIHtcbiAgICAgICAgICAgIHJldHVybiAnICAgJyArIGxpbmU7XG4gICAgICAgICAgfSkuam9pbignXFxuJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc3RyID0gY3R4LnN0eWxpemUoJ1tDaXJjdWxhcl0nLCAnc3BlY2lhbCcpO1xuICAgIH1cbiAgfVxuICBpZiAoaXNVbmRlZmluZWQobmFtZSkpIHtcbiAgICBpZiAoYXJyYXkgJiYga2V5Lm1hdGNoKC9eXFxkKyQvKSkge1xuICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG4gICAgbmFtZSA9IEpTT04uc3RyaW5naWZ5KCcnICsga2V5KTtcbiAgICBpZiAobmFtZS5tYXRjaCgvXlwiKFthLXpBLVpfXVthLXpBLVpfMC05XSopXCIkLykpIHtcbiAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cigxLCBuYW1lLmxlbmd0aCAtIDIpO1xuICAgICAgbmFtZSA9IGN0eC5zdHlsaXplKG5hbWUsICduYW1lJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UoLycvZywgXCJcXFxcJ1wiKVxuICAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxcXFwiL2csICdcIicpXG4gICAgICAgICAgICAgICAgIC5yZXBsYWNlKC8oXlwifFwiJCkvZywgXCInXCIpO1xuICAgICAgbmFtZSA9IGN0eC5zdHlsaXplKG5hbWUsICdzdHJpbmcnKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmFtZSArICc6ICcgKyBzdHI7XG59XG5cblxuZnVuY3Rpb24gcmVkdWNlVG9TaW5nbGVTdHJpbmcob3V0cHV0LCBiYXNlLCBicmFjZXMpIHtcbiAgdmFyIG51bUxpbmVzRXN0ID0gMDtcbiAgdmFyIGxlbmd0aCA9IG91dHB1dC5yZWR1Y2UoZnVuY3Rpb24ocHJldiwgY3VyKSB7XG4gICAgbnVtTGluZXNFc3QrKztcbiAgICBpZiAoY3VyLmluZGV4T2YoJ1xcbicpID49IDApIG51bUxpbmVzRXN0Kys7XG4gICAgcmV0dXJuIHByZXYgKyBjdXIucmVwbGFjZSgvXFx1MDAxYlxcW1xcZFxcZD9tL2csICcnKS5sZW5ndGggKyAxO1xuICB9LCAwKTtcblxuICBpZiAobGVuZ3RoID4gNjApIHtcbiAgICByZXR1cm4gYnJhY2VzWzBdICtcbiAgICAgICAgICAgKGJhc2UgPT09ICcnID8gJycgOiBiYXNlICsgJ1xcbiAnKSArXG4gICAgICAgICAgICcgJyArXG4gICAgICAgICAgIG91dHB1dC5qb2luKCcsXFxuICAnKSArXG4gICAgICAgICAgICcgJyArXG4gICAgICAgICAgIGJyYWNlc1sxXTtcbiAgfVxuXG4gIHJldHVybiBicmFjZXNbMF0gKyBiYXNlICsgJyAnICsgb3V0cHV0LmpvaW4oJywgJykgKyAnICcgKyBicmFjZXNbMV07XG59XG5cblxuLy8gTk9URTogVGhlc2UgdHlwZSBjaGVja2luZyBmdW5jdGlvbnMgaW50ZW50aW9uYWxseSBkb24ndCB1c2UgYGluc3RhbmNlb2ZgXG4vLyBiZWNhdXNlIGl0IGlzIGZyYWdpbGUgYW5kIGNhbiBiZSBlYXNpbHkgZmFrZWQgd2l0aCBgT2JqZWN0LmNyZWF0ZSgpYC5cbmZ1bmN0aW9uIGlzQXJyYXkoYXIpIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkoYXIpO1xufVxuZXhwb3J0cy5pc0FycmF5ID0gaXNBcnJheTtcblxuZnVuY3Rpb24gaXNCb29sZWFuKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ2Jvb2xlYW4nO1xufVxuZXhwb3J0cy5pc0Jvb2xlYW4gPSBpc0Jvb2xlYW47XG5cbmZ1bmN0aW9uIGlzTnVsbChhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gbnVsbDtcbn1cbmV4cG9ydHMuaXNOdWxsID0gaXNOdWxsO1xuXG5mdW5jdGlvbiBpc051bGxPclVuZGVmaW5lZChhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PSBudWxsO1xufVxuZXhwb3J0cy5pc051bGxPclVuZGVmaW5lZCA9IGlzTnVsbE9yVW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBpc051bWJlcihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdudW1iZXInO1xufVxuZXhwb3J0cy5pc051bWJlciA9IGlzTnVtYmVyO1xuXG5mdW5jdGlvbiBpc1N0cmluZyhhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnO1xufVxuZXhwb3J0cy5pc1N0cmluZyA9IGlzU3RyaW5nO1xuXG5mdW5jdGlvbiBpc1N5bWJvbChhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdzeW1ib2wnO1xufVxuZXhwb3J0cy5pc1N5bWJvbCA9IGlzU3ltYm9sO1xuXG5mdW5jdGlvbiBpc1VuZGVmaW5lZChhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gdm9pZCAwO1xufVxuZXhwb3J0cy5pc1VuZGVmaW5lZCA9IGlzVW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBpc1JlZ0V4cChyZSkge1xuICByZXR1cm4gaXNPYmplY3QocmUpICYmIG9iamVjdFRvU3RyaW5nKHJlKSA9PT0gJ1tvYmplY3QgUmVnRXhwXSc7XG59XG5leHBvcnRzLmlzUmVnRXhwID0gaXNSZWdFeHA7XG5cbmZ1bmN0aW9uIGlzT2JqZWN0KGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ29iamVjdCcgJiYgYXJnICE9PSBudWxsO1xufVxuZXhwb3J0cy5pc09iamVjdCA9IGlzT2JqZWN0O1xuXG5mdW5jdGlvbiBpc0RhdGUoZCkge1xuICByZXR1cm4gaXNPYmplY3QoZCkgJiYgb2JqZWN0VG9TdHJpbmcoZCkgPT09ICdbb2JqZWN0IERhdGVdJztcbn1cbmV4cG9ydHMuaXNEYXRlID0gaXNEYXRlO1xuXG5mdW5jdGlvbiBpc0Vycm9yKGUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0KGUpICYmXG4gICAgICAob2JqZWN0VG9TdHJpbmcoZSkgPT09ICdbb2JqZWN0IEVycm9yXScgfHwgZSBpbnN0YW5jZW9mIEVycm9yKTtcbn1cbmV4cG9ydHMuaXNFcnJvciA9IGlzRXJyb3I7XG5cbmZ1bmN0aW9uIGlzRnVuY3Rpb24oYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnZnVuY3Rpb24nO1xufVxuZXhwb3J0cy5pc0Z1bmN0aW9uID0gaXNGdW5jdGlvbjtcblxuZnVuY3Rpb24gaXNQcmltaXRpdmUoYXJnKSB7XG4gIHJldHVybiBhcmcgPT09IG51bGwgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdib29sZWFuJyB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ251bWJlcicgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnc3ltYm9sJyB8fCAgLy8gRVM2IHN5bWJvbFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ3VuZGVmaW5lZCc7XG59XG5leHBvcnRzLmlzUHJpbWl0aXZlID0gaXNQcmltaXRpdmU7XG5cbmV4cG9ydHMuaXNCdWZmZXIgPSByZXF1aXJlKCcuL3N1cHBvcnQvaXNCdWZmZXInKTtcblxuZnVuY3Rpb24gb2JqZWN0VG9TdHJpbmcobykge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pO1xufVxuXG5cbmZ1bmN0aW9uIHBhZChuKSB7XG4gIHJldHVybiBuIDwgMTAgPyAnMCcgKyBuLnRvU3RyaW5nKDEwKSA6IG4udG9TdHJpbmcoMTApO1xufVxuXG5cbnZhciBtb250aHMgPSBbJ0phbicsICdGZWInLCAnTWFyJywgJ0FwcicsICdNYXknLCAnSnVuJywgJ0p1bCcsICdBdWcnLCAnU2VwJyxcbiAgICAgICAgICAgICAgJ09jdCcsICdOb3YnLCAnRGVjJ107XG5cbi8vIDI2IEZlYiAxNjoxOTozNFxuZnVuY3Rpb24gdGltZXN0YW1wKCkge1xuICB2YXIgZCA9IG5ldyBEYXRlKCk7XG4gIHZhciB0aW1lID0gW3BhZChkLmdldEhvdXJzKCkpLFxuICAgICAgICAgICAgICBwYWQoZC5nZXRNaW51dGVzKCkpLFxuICAgICAgICAgICAgICBwYWQoZC5nZXRTZWNvbmRzKCkpXS5qb2luKCc6Jyk7XG4gIHJldHVybiBbZC5nZXREYXRlKCksIG1vbnRoc1tkLmdldE1vbnRoKCldLCB0aW1lXS5qb2luKCcgJyk7XG59XG5cblxuLy8gbG9nIGlzIGp1c3QgYSB0aGluIHdyYXBwZXIgdG8gY29uc29sZS5sb2cgdGhhdCBwcmVwZW5kcyBhIHRpbWVzdGFtcFxuZXhwb3J0cy5sb2cgPSBmdW5jdGlvbigpIHtcbiAgY29uc29sZS5sb2coJyVzIC0gJXMnLCB0aW1lc3RhbXAoKSwgZXhwb3J0cy5mb3JtYXQuYXBwbHkoZXhwb3J0cywgYXJndW1lbnRzKSk7XG59O1xuXG5cbi8qKlxuICogSW5oZXJpdCB0aGUgcHJvdG90eXBlIG1ldGhvZHMgZnJvbSBvbmUgY29uc3RydWN0b3IgaW50byBhbm90aGVyLlxuICpcbiAqIFRoZSBGdW5jdGlvbi5wcm90b3R5cGUuaW5oZXJpdHMgZnJvbSBsYW5nLmpzIHJld3JpdHRlbiBhcyBhIHN0YW5kYWxvbmVcbiAqIGZ1bmN0aW9uIChub3Qgb24gRnVuY3Rpb24ucHJvdG90eXBlKS4gTk9URTogSWYgdGhpcyBmaWxlIGlzIHRvIGJlIGxvYWRlZFxuICogZHVyaW5nIGJvb3RzdHJhcHBpbmcgdGhpcyBmdW5jdGlvbiBuZWVkcyB0byBiZSByZXdyaXR0ZW4gdXNpbmcgc29tZSBuYXRpdmVcbiAqIGZ1bmN0aW9ucyBhcyBwcm90b3R5cGUgc2V0dXAgdXNpbmcgbm9ybWFsIEphdmFTY3JpcHQgZG9lcyBub3Qgd29yayBhc1xuICogZXhwZWN0ZWQgZHVyaW5nIGJvb3RzdHJhcHBpbmcgKHNlZSBtaXJyb3IuanMgaW4gcjExNDkwMykuXG4gKlxuICogQHBhcmFtIHtmdW5jdGlvbn0gY3RvciBDb25zdHJ1Y3RvciBmdW5jdGlvbiB3aGljaCBuZWVkcyB0byBpbmhlcml0IHRoZVxuICogICAgIHByb3RvdHlwZS5cbiAqIEBwYXJhbSB7ZnVuY3Rpb259IHN1cGVyQ3RvciBDb25zdHJ1Y3RvciBmdW5jdGlvbiB0byBpbmhlcml0IHByb3RvdHlwZSBmcm9tLlxuICovXG5leHBvcnRzLmluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcblxuZXhwb3J0cy5fZXh0ZW5kID0gZnVuY3Rpb24ob3JpZ2luLCBhZGQpIHtcbiAgLy8gRG9uJ3QgZG8gYW55dGhpbmcgaWYgYWRkIGlzbid0IGFuIG9iamVjdFxuICBpZiAoIWFkZCB8fCAhaXNPYmplY3QoYWRkKSkgcmV0dXJuIG9yaWdpbjtcblxuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGFkZCk7XG4gIHZhciBpID0ga2V5cy5sZW5ndGg7XG4gIHdoaWxlIChpLS0pIHtcbiAgICBvcmlnaW5ba2V5c1tpXV0gPSBhZGRba2V5c1tpXV07XG4gIH1cbiAgcmV0dXJuIG9yaWdpbjtcbn07XG5cbmZ1bmN0aW9uIGhhc093blByb3BlcnR5KG9iaiwgcHJvcCkge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCk7XG59XG4iLCJ2YXIgaW5kZXhPZiA9IHJlcXVpcmUoJ2luZGV4b2YnKTtcblxudmFyIE9iamVjdF9rZXlzID0gZnVuY3Rpb24gKG9iaikge1xuICAgIGlmIChPYmplY3Qua2V5cykgcmV0dXJuIE9iamVjdC5rZXlzKG9iailcbiAgICBlbHNlIHtcbiAgICAgICAgdmFyIHJlcyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBrZXkgaW4gb2JqKSByZXMucHVzaChrZXkpXG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxufTtcblxudmFyIGZvckVhY2ggPSBmdW5jdGlvbiAoeHMsIGZuKSB7XG4gICAgaWYgKHhzLmZvckVhY2gpIHJldHVybiB4cy5mb3JFYWNoKGZuKVxuICAgIGVsc2UgZm9yICh2YXIgaSA9IDA7IGkgPCB4cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBmbih4c1tpXSwgaSwgeHMpO1xuICAgIH1cbn07XG5cbnZhciBkZWZpbmVQcm9wID0gKGZ1bmN0aW9uKCkge1xuICAgIHRyeSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwgJ18nLCB7fSk7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbihvYmosIG5hbWUsIHZhbHVlKSB7XG4gICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBuYW1lLCB7XG4gICAgICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcbiAgICB9IGNhdGNoKGUpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKG9iaiwgbmFtZSwgdmFsdWUpIHtcbiAgICAgICAgICAgIG9ialtuYW1lXSA9IHZhbHVlO1xuICAgICAgICB9O1xuICAgIH1cbn0oKSk7XG5cbnZhciBnbG9iYWxzID0gWydBcnJheScsICdCb29sZWFuJywgJ0RhdGUnLCAnRXJyb3InLCAnRXZhbEVycm9yJywgJ0Z1bmN0aW9uJyxcbidJbmZpbml0eScsICdKU09OJywgJ01hdGgnLCAnTmFOJywgJ051bWJlcicsICdPYmplY3QnLCAnUmFuZ2VFcnJvcicsXG4nUmVmZXJlbmNlRXJyb3InLCAnUmVnRXhwJywgJ1N0cmluZycsICdTeW50YXhFcnJvcicsICdUeXBlRXJyb3InLCAnVVJJRXJyb3InLFxuJ2RlY29kZVVSSScsICdkZWNvZGVVUklDb21wb25lbnQnLCAnZW5jb2RlVVJJJywgJ2VuY29kZVVSSUNvbXBvbmVudCcsICdlc2NhcGUnLFxuJ2V2YWwnLCAnaXNGaW5pdGUnLCAnaXNOYU4nLCAncGFyc2VGbG9hdCcsICdwYXJzZUludCcsICd1bmRlZmluZWQnLCAndW5lc2NhcGUnXTtcblxuZnVuY3Rpb24gQ29udGV4dCgpIHt9XG5Db250ZXh0LnByb3RvdHlwZSA9IHt9O1xuXG52YXIgU2NyaXB0ID0gZXhwb3J0cy5TY3JpcHQgPSBmdW5jdGlvbiBOb2RlU2NyaXB0IChjb2RlKSB7XG4gICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFNjcmlwdCkpIHJldHVybiBuZXcgU2NyaXB0KGNvZGUpO1xuICAgIHRoaXMuY29kZSA9IGNvZGU7XG59O1xuXG5TY3JpcHQucHJvdG90eXBlLnJ1bkluQ29udGV4dCA9IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgaWYgKCEoY29udGV4dCBpbnN0YW5jZW9mIENvbnRleHQpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJuZWVkcyBhICdjb250ZXh0JyBhcmd1bWVudC5cIik7XG4gICAgfVxuICAgIFxuICAgIHZhciBpZnJhbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpZnJhbWUnKTtcbiAgICBpZiAoIWlmcmFtZS5zdHlsZSkgaWZyYW1lLnN0eWxlID0ge307XG4gICAgaWZyYW1lLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgXG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChpZnJhbWUpO1xuICAgIFxuICAgIHZhciB3aW4gPSBpZnJhbWUuY29udGVudFdpbmRvdztcbiAgICB2YXIgd0V2YWwgPSB3aW4uZXZhbCwgd0V4ZWNTY3JpcHQgPSB3aW4uZXhlY1NjcmlwdDtcblxuICAgIGlmICghd0V2YWwgJiYgd0V4ZWNTY3JpcHQpIHtcbiAgICAgICAgLy8gd2luLmV2YWwoKSBtYWdpY2FsbHkgYXBwZWFycyB3aGVuIHRoaXMgaXMgY2FsbGVkIGluIElFOlxuICAgICAgICB3RXhlY1NjcmlwdC5jYWxsKHdpbiwgJ251bGwnKTtcbiAgICAgICAgd0V2YWwgPSB3aW4uZXZhbDtcbiAgICB9XG4gICAgXG4gICAgZm9yRWFjaChPYmplY3Rfa2V5cyhjb250ZXh0KSwgZnVuY3Rpb24gKGtleSkge1xuICAgICAgICB3aW5ba2V5XSA9IGNvbnRleHRba2V5XTtcbiAgICB9KTtcbiAgICBmb3JFYWNoKGdsb2JhbHMsIGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgaWYgKGNvbnRleHRba2V5XSkge1xuICAgICAgICAgICAgd2luW2tleV0gPSBjb250ZXh0W2tleV07XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBcbiAgICB2YXIgd2luS2V5cyA9IE9iamVjdF9rZXlzKHdpbik7XG5cbiAgICB2YXIgcmVzID0gd0V2YWwuY2FsbCh3aW4sIHRoaXMuY29kZSk7XG4gICAgXG4gICAgZm9yRWFjaChPYmplY3Rfa2V5cyh3aW4pLCBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIC8vIEF2b2lkIGNvcHlpbmcgY2lyY3VsYXIgb2JqZWN0cyBsaWtlIGB0b3BgIGFuZCBgd2luZG93YCBieSBvbmx5XG4gICAgICAgIC8vIHVwZGF0aW5nIGV4aXN0aW5nIGNvbnRleHQgcHJvcGVydGllcyBvciBuZXcgcHJvcGVydGllcyBpbiB0aGUgYHdpbmBcbiAgICAgICAgLy8gdGhhdCB3YXMgb25seSBpbnRyb2R1Y2VkIGFmdGVyIHRoZSBldmFsLlxuICAgICAgICBpZiAoa2V5IGluIGNvbnRleHQgfHwgaW5kZXhPZih3aW5LZXlzLCBrZXkpID09PSAtMSkge1xuICAgICAgICAgICAgY29udGV4dFtrZXldID0gd2luW2tleV07XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIGZvckVhY2goZ2xvYmFscywgZnVuY3Rpb24gKGtleSkge1xuICAgICAgICBpZiAoIShrZXkgaW4gY29udGV4dCkpIHtcbiAgICAgICAgICAgIGRlZmluZVByb3AoY29udGV4dCwga2V5LCB3aW5ba2V5XSk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBcbiAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGlmcmFtZSk7XG4gICAgXG4gICAgcmV0dXJuIHJlcztcbn07XG5cblNjcmlwdC5wcm90b3R5cGUucnVuSW5UaGlzQ29udGV4dCA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZXZhbCh0aGlzLmNvZGUpOyAvLyBtYXliZS4uLlxufTtcblxuU2NyaXB0LnByb3RvdHlwZS5ydW5Jbk5ld0NvbnRleHQgPSBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgIHZhciBjdHggPSBTY3JpcHQuY3JlYXRlQ29udGV4dChjb250ZXh0KTtcbiAgICB2YXIgcmVzID0gdGhpcy5ydW5JbkNvbnRleHQoY3R4KTtcblxuICAgIGZvckVhY2goT2JqZWN0X2tleXMoY3R4KSwgZnVuY3Rpb24gKGtleSkge1xuICAgICAgICBjb250ZXh0W2tleV0gPSBjdHhba2V5XTtcbiAgICB9KTtcblxuICAgIHJldHVybiByZXM7XG59O1xuXG5mb3JFYWNoKE9iamVjdF9rZXlzKFNjcmlwdC5wcm90b3R5cGUpLCBmdW5jdGlvbiAobmFtZSkge1xuICAgIGV4cG9ydHNbbmFtZV0gPSBTY3JpcHRbbmFtZV0gPSBmdW5jdGlvbiAoY29kZSkge1xuICAgICAgICB2YXIgcyA9IFNjcmlwdChjb2RlKTtcbiAgICAgICAgcmV0dXJuIHNbbmFtZV0uYXBwbHkocywgW10uc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpKTtcbiAgICB9O1xufSk7XG5cbmV4cG9ydHMuY3JlYXRlU2NyaXB0ID0gZnVuY3Rpb24gKGNvZGUpIHtcbiAgICByZXR1cm4gZXhwb3J0cy5TY3JpcHQoY29kZSk7XG59O1xuXG5leHBvcnRzLmNyZWF0ZUNvbnRleHQgPSBTY3JpcHQuY3JlYXRlQ29udGV4dCA9IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgdmFyIGNvcHkgPSBuZXcgQ29udGV4dCgpO1xuICAgIGlmKHR5cGVvZiBjb250ZXh0ID09PSAnb2JqZWN0Jykge1xuICAgICAgICBmb3JFYWNoKE9iamVjdF9rZXlzKGNvbnRleHQpLCBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICBjb3B5W2tleV0gPSBjb250ZXh0W2tleV07XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gY29weTtcbn07XG4iLCJ2YXIgaCA9IHJlcXVpcmUoJ3ZpcnR1YWwtZG9tL2gnKVxudmFyIHZkb20gPSByZXF1aXJlKCd2aXJ0dWFsLWRvbScpXG5cbnZhciBtYWluID0gcmVxdWlyZSgnbWFpbi1sb29wJylcbnZhciBsb29wID0gbWFpbih7IG1zZzogXCJub3RoaW5nIHlldFwiIH0sIHJlbmRlciwgdmRvbSlcbmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNjb250ZW50JykuYXBwZW5kQ2hpbGQobG9vcC50YXJnZXQpXG5cblxuZnVuY3Rpb24gcmVuZGVyIChzdGF0ZSkge1xuICByZXR1cm4gaCgnZGl2JywgW1xuICAgIGgoJ2gxJywgJ2RhdGEgZnJvbSBzd2FybWxvZzogJyArIHN0YXRlLm1zZyB8fCBcIm5vIG1lc3NhZ2VzXCIpXG4gLy8gICBoKCdidXR0b24nLCB7IG9uY2xpY2s6IG9uY2xpY2sgfSwgJ2dldCBkYXRhIScpXG4gIF0pXG4vLyAgIGZ1bmN0aW9uIG9uY2xpY2sgKCkge1xuLy8gICAgIGxvb3AudXBkYXRlKHsgdGltZXM6IHN0YXRlLnRpbWVzICsgMSB9KVxuLy8gICB9XG59XG5cbnZhciBzd2FybWxvZyA9IHJlcXVpcmUoJ3N3YXJtbG9nJylcbnZhciBtZW1kYiA9IHJlcXVpcmUoJ21lbWRiJylcblxudmFyIGxvZyA9IHN3YXJtbG9nKHtcbiAgcHVibGljS2V5OiByZXF1aXJlKCcuL2tleXMuanNvbicpLnB1YmxpYyxcbiAgc29kaXVtOiByZXF1aXJlKCdjaGxvcmlkZS9icm93c2VyJyksXG4gIGRiOiBtZW1kYigpLFxuICB2YWx1ZUVuY29kaW5nOiAnanNvbicsXG4gIGh1YnM6IFsgJ2h0dHBzOi8vc2lnbmFsaHViLm1hZmludG9zaC5jb20nIF1cbn0pXG5cbmxvZy5jcmVhdGVSZWFkU3RyZWFtKHsgbGl2ZTogdHJ1ZSB9KS5vbignZGF0YScsIGZ1bmN0aW9uIChkYXRhKSB7XG4gIGNvbnNvbGUubG9nKCdSRUNFSVZFRCcsIGRhdGEudmFsdWUpXG4gIGlmIChkYXRhLnZhbHVlLmhhc093blByb3BlcnR5KCdtc2cnKSkge1xuICAgIGxvb3AudXBkYXRlKHsgbXNnOiBkYXRhLnZhbHVlLm1zZyB9KVxuICB9XG59KSIsIm1vZHVsZS5leHBvcnRzPXtcImN1cnZlXCI6XCJlZDI1NTE5XCIsXCJwdWJsaWNcIjpcInNJc01XWmphQ21qbkhPMldDQXB1RVBYWjRoNmdxb3IxVm45aGxpZXdpSms9LmVkMjU1MTlcIixcInByaXZhdGVcIjpcIkFvbGd5R3VpT0swNUZQenN6MU1pME1pWWJVNzBNYWhobytFZDd3bk5FTkt3aXd4Wm1Ob0thT2NjN1pZSUNtNFE5ZG5pSHFDcWl2VldmMkdXSjdDSW1RPT0uZWQyNTUxOVwiLFwiaWRcIjpcIkBzSXNNV1pqYUNtam5ITzJXQ0FwdUVQWFo0aDZncW9yMVZuOWhsaWV3aUprPS5lZDI1NTE5XCJ9XG4iLCIvKiBDb3B5cmlnaHQgKGMpIDIwMTMgUm9kIFZhZ2csIE1JVCBMaWNlbnNlICovXG5cbmZ1bmN0aW9uIEFic3RyYWN0Q2hhaW5lZEJhdGNoIChkYikge1xuICB0aGlzLl9kYiAgICAgICAgID0gZGJcbiAgdGhpcy5fb3BlcmF0aW9ucyA9IFtdXG4gIHRoaXMuX3dyaXR0ZW4gICAgPSBmYWxzZVxufVxuXG5BYnN0cmFjdENoYWluZWRCYXRjaC5wcm90b3R5cGUuX2NoZWNrV3JpdHRlbiA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMuX3dyaXR0ZW4pXG4gICAgdGhyb3cgbmV3IEVycm9yKCd3cml0ZSgpIGFscmVhZHkgY2FsbGVkIG9uIHRoaXMgYmF0Y2gnKVxufVxuXG5BYnN0cmFjdENoYWluZWRCYXRjaC5wcm90b3R5cGUucHV0ID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgdGhpcy5fY2hlY2tXcml0dGVuKClcblxuICB2YXIgZXJyID0gdGhpcy5fZGIuX2NoZWNrS2V5KGtleSwgJ2tleScsIHRoaXMuX2RiLl9pc0J1ZmZlcilcbiAgaWYgKGVycilcbiAgICB0aHJvdyBlcnJcblxuICBpZiAoIXRoaXMuX2RiLl9pc0J1ZmZlcihrZXkpKSBrZXkgPSBTdHJpbmcoa2V5KVxuICBpZiAoIXRoaXMuX2RiLl9pc0J1ZmZlcih2YWx1ZSkpIHZhbHVlID0gU3RyaW5nKHZhbHVlKVxuXG4gIGlmICh0eXBlb2YgdGhpcy5fcHV0ID09ICdmdW5jdGlvbicgKVxuICAgIHRoaXMuX3B1dChrZXksIHZhbHVlKVxuICBlbHNlXG4gICAgdGhpcy5fb3BlcmF0aW9ucy5wdXNoKHsgdHlwZTogJ3B1dCcsIGtleToga2V5LCB2YWx1ZTogdmFsdWUgfSlcblxuICByZXR1cm4gdGhpc1xufVxuXG5BYnN0cmFjdENoYWluZWRCYXRjaC5wcm90b3R5cGUuZGVsID0gZnVuY3Rpb24gKGtleSkge1xuICB0aGlzLl9jaGVja1dyaXR0ZW4oKVxuXG4gIHZhciBlcnIgPSB0aGlzLl9kYi5fY2hlY2tLZXkoa2V5LCAna2V5JywgdGhpcy5fZGIuX2lzQnVmZmVyKVxuICBpZiAoZXJyKSB0aHJvdyBlcnJcblxuICBpZiAoIXRoaXMuX2RiLl9pc0J1ZmZlcihrZXkpKSBrZXkgPSBTdHJpbmcoa2V5KVxuXG4gIGlmICh0eXBlb2YgdGhpcy5fZGVsID09ICdmdW5jdGlvbicgKVxuICAgIHRoaXMuX2RlbChrZXkpXG4gIGVsc2VcbiAgICB0aGlzLl9vcGVyYXRpb25zLnB1c2goeyB0eXBlOiAnZGVsJywga2V5OiBrZXkgfSlcblxuICByZXR1cm4gdGhpc1xufVxuXG5BYnN0cmFjdENoYWluZWRCYXRjaC5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuX2NoZWNrV3JpdHRlbigpXG5cbiAgdGhpcy5fb3BlcmF0aW9ucyA9IFtdXG5cbiAgaWYgKHR5cGVvZiB0aGlzLl9jbGVhciA9PSAnZnVuY3Rpb24nIClcbiAgICB0aGlzLl9jbGVhcigpXG5cbiAgcmV0dXJuIHRoaXNcbn1cblxuQWJzdHJhY3RDaGFpbmVkQmF0Y2gucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gKG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gIHRoaXMuX2NoZWNrV3JpdHRlbigpXG5cbiAgaWYgKHR5cGVvZiBvcHRpb25zID09ICdmdW5jdGlvbicpXG4gICAgY2FsbGJhY2sgPSBvcHRpb25zXG4gIGlmICh0eXBlb2YgY2FsbGJhY2sgIT0gJ2Z1bmN0aW9uJylcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3dyaXRlKCkgcmVxdWlyZXMgYSBjYWxsYmFjayBhcmd1bWVudCcpXG4gIGlmICh0eXBlb2Ygb3B0aW9ucyAhPSAnb2JqZWN0JylcbiAgICBvcHRpb25zID0ge31cblxuICB0aGlzLl93cml0dGVuID0gdHJ1ZVxuXG4gIGlmICh0eXBlb2YgdGhpcy5fd3JpdGUgPT0gJ2Z1bmN0aW9uJyApXG4gICAgcmV0dXJuIHRoaXMuX3dyaXRlKGNhbGxiYWNrKVxuXG4gIGlmICh0eXBlb2YgdGhpcy5fZGIuX2JhdGNoID09ICdmdW5jdGlvbicpXG4gICAgcmV0dXJuIHRoaXMuX2RiLl9iYXRjaCh0aGlzLl9vcGVyYXRpb25zLCBvcHRpb25zLCBjYWxsYmFjaylcblxuICBwcm9jZXNzLm5leHRUaWNrKGNhbGxiYWNrKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IEFic3RyYWN0Q2hhaW5lZEJhdGNoIiwiLyogQ29weXJpZ2h0IChjKSAyMDEzIFJvZCBWYWdnLCBNSVQgTGljZW5zZSAqL1xuXG5mdW5jdGlvbiBBYnN0cmFjdEl0ZXJhdG9yIChkYikge1xuICB0aGlzLmRiID0gZGJcbiAgdGhpcy5fZW5kZWQgPSBmYWxzZVxuICB0aGlzLl9uZXh0aW5nID0gZmFsc2Vcbn1cblxuQWJzdHJhY3RJdGVyYXRvci5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICB2YXIgc2VsZiA9IHRoaXNcblxuICBpZiAodHlwZW9mIGNhbGxiYWNrICE9ICdmdW5jdGlvbicpXG4gICAgdGhyb3cgbmV3IEVycm9yKCduZXh0KCkgcmVxdWlyZXMgYSBjYWxsYmFjayBhcmd1bWVudCcpXG5cbiAgaWYgKHNlbGYuX2VuZGVkKVxuICAgIHJldHVybiBjYWxsYmFjayhuZXcgRXJyb3IoJ2Nhbm5vdCBjYWxsIG5leHQoKSBhZnRlciBlbmQoKScpKVxuICBpZiAoc2VsZi5fbmV4dGluZylcbiAgICByZXR1cm4gY2FsbGJhY2sobmV3IEVycm9yKCdjYW5ub3QgY2FsbCBuZXh0KCkgYmVmb3JlIHByZXZpb3VzIG5leHQoKSBoYXMgY29tcGxldGVkJykpXG5cbiAgc2VsZi5fbmV4dGluZyA9IHRydWVcbiAgaWYgKHR5cGVvZiBzZWxmLl9uZXh0ID09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gc2VsZi5fbmV4dChmdW5jdGlvbiAoKSB7XG4gICAgICBzZWxmLl9uZXh0aW5nID0gZmFsc2VcbiAgICAgIGNhbGxiYWNrLmFwcGx5KG51bGwsIGFyZ3VtZW50cylcbiAgICB9KVxuICB9XG5cbiAgcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgc2VsZi5fbmV4dGluZyA9IGZhbHNlXG4gICAgY2FsbGJhY2soKVxuICB9KVxufVxuXG5BYnN0cmFjdEl0ZXJhdG9yLnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPSAnZnVuY3Rpb24nKVxuICAgIHRocm93IG5ldyBFcnJvcignZW5kKCkgcmVxdWlyZXMgYSBjYWxsYmFjayBhcmd1bWVudCcpXG5cbiAgaWYgKHRoaXMuX2VuZGVkKVxuICAgIHJldHVybiBjYWxsYmFjayhuZXcgRXJyb3IoJ2VuZCgpIGFscmVhZHkgY2FsbGVkIG9uIGl0ZXJhdG9yJykpXG5cbiAgdGhpcy5fZW5kZWQgPSB0cnVlXG5cbiAgaWYgKHR5cGVvZiB0aGlzLl9lbmQgPT0gJ2Z1bmN0aW9uJylcbiAgICByZXR1cm4gdGhpcy5fZW5kKGNhbGxiYWNrKVxuXG4gIHByb2Nlc3MubmV4dFRpY2soY2FsbGJhY2spXG59XG5cbm1vZHVsZS5leHBvcnRzID0gQWJzdHJhY3RJdGVyYXRvclxuIiwiLyogQ29weXJpZ2h0IChjKSAyMDEzIFJvZCBWYWdnLCBNSVQgTGljZW5zZSAqL1xuXG52YXIgeHRlbmQgICAgICAgICAgICAgICAgPSByZXF1aXJlKCd4dGVuZCcpXG4gICwgQWJzdHJhY3RJdGVyYXRvciAgICAgPSByZXF1aXJlKCcuL2Fic3RyYWN0LWl0ZXJhdG9yJylcbiAgLCBBYnN0cmFjdENoYWluZWRCYXRjaCA9IHJlcXVpcmUoJy4vYWJzdHJhY3QtY2hhaW5lZC1iYXRjaCcpXG5cbmZ1bmN0aW9uIEFic3RyYWN0TGV2ZWxET1dOIChsb2NhdGlvbikge1xuICBpZiAoIWFyZ3VtZW50cy5sZW5ndGggfHwgbG9jYXRpb24gPT09IHVuZGVmaW5lZClcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvbnN0cnVjdG9yIHJlcXVpcmVzIGF0IGxlYXN0IGEgbG9jYXRpb24gYXJndW1lbnQnKVxuXG4gIGlmICh0eXBlb2YgbG9jYXRpb24gIT0gJ3N0cmluZycpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdjb25zdHJ1Y3RvciByZXF1aXJlcyBhIGxvY2F0aW9uIHN0cmluZyBhcmd1bWVudCcpXG5cbiAgdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uXG4gIHRoaXMuc3RhdHVzID0gJ25ldydcbn1cblxuQWJzdHJhY3RMZXZlbERPV04ucHJvdG90eXBlLm9wZW4gPSBmdW5jdGlvbiAob3B0aW9ucywgY2FsbGJhY2spIHtcbiAgdmFyIHNlbGYgICAgICA9IHRoaXNcbiAgICAsIG9sZFN0YXR1cyA9IHRoaXMuc3RhdHVzXG5cbiAgaWYgKHR5cGVvZiBvcHRpb25zID09ICdmdW5jdGlvbicpXG4gICAgY2FsbGJhY2sgPSBvcHRpb25zXG5cbiAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPSAnZnVuY3Rpb24nKVxuICAgIHRocm93IG5ldyBFcnJvcignb3BlbigpIHJlcXVpcmVzIGEgY2FsbGJhY2sgYXJndW1lbnQnKVxuXG4gIGlmICh0eXBlb2Ygb3B0aW9ucyAhPSAnb2JqZWN0JylcbiAgICBvcHRpb25zID0ge31cblxuICBvcHRpb25zLmNyZWF0ZUlmTWlzc2luZyA9IG9wdGlvbnMuY3JlYXRlSWZNaXNzaW5nICE9IGZhbHNlXG4gIG9wdGlvbnMuZXJyb3JJZkV4aXN0cyA9ICEhb3B0aW9ucy5lcnJvcklmRXhpc3RzXG5cbiAgaWYgKHR5cGVvZiB0aGlzLl9vcGVuID09ICdmdW5jdGlvbicpIHtcbiAgICB0aGlzLnN0YXR1cyA9ICdvcGVuaW5nJ1xuICAgIHRoaXMuX29wZW4ob3B0aW9ucywgZnVuY3Rpb24gKGVycikge1xuICAgICAgaWYgKGVycikge1xuICAgICAgICBzZWxmLnN0YXR1cyA9IG9sZFN0YXR1c1xuICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKVxuICAgICAgfVxuICAgICAgc2VsZi5zdGF0dXMgPSAnb3BlbidcbiAgICAgIGNhbGxiYWNrKClcbiAgICB9KVxuICB9IGVsc2Uge1xuICAgIHRoaXMuc3RhdHVzID0gJ29wZW4nXG4gICAgcHJvY2Vzcy5uZXh0VGljayhjYWxsYmFjaylcbiAgfVxufVxuXG5BYnN0cmFjdExldmVsRE9XTi5wcm90b3R5cGUuY2xvc2UgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgdmFyIHNlbGYgICAgICA9IHRoaXNcbiAgICAsIG9sZFN0YXR1cyA9IHRoaXMuc3RhdHVzXG5cbiAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPSAnZnVuY3Rpb24nKVxuICAgIHRocm93IG5ldyBFcnJvcignY2xvc2UoKSByZXF1aXJlcyBhIGNhbGxiYWNrIGFyZ3VtZW50JylcblxuICBpZiAodHlwZW9mIHRoaXMuX2Nsb3NlID09ICdmdW5jdGlvbicpIHtcbiAgICB0aGlzLnN0YXR1cyA9ICdjbG9zaW5nJ1xuICAgIHRoaXMuX2Nsb3NlKGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgc2VsZi5zdGF0dXMgPSBvbGRTdGF0dXNcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycilcbiAgICAgIH1cbiAgICAgIHNlbGYuc3RhdHVzID0gJ2Nsb3NlZCdcbiAgICAgIGNhbGxiYWNrKClcbiAgICB9KVxuICB9IGVsc2Uge1xuICAgIHRoaXMuc3RhdHVzID0gJ2Nsb3NlZCdcbiAgICBwcm9jZXNzLm5leHRUaWNrKGNhbGxiYWNrKVxuICB9XG59XG5cbkFic3RyYWN0TGV2ZWxET1dOLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAoa2V5LCBvcHRpb25zLCBjYWxsYmFjaykge1xuICB2YXIgZXJyXG5cbiAgaWYgKHR5cGVvZiBvcHRpb25zID09ICdmdW5jdGlvbicpXG4gICAgY2FsbGJhY2sgPSBvcHRpb25zXG5cbiAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPSAnZnVuY3Rpb24nKVxuICAgIHRocm93IG5ldyBFcnJvcignZ2V0KCkgcmVxdWlyZXMgYSBjYWxsYmFjayBhcmd1bWVudCcpXG5cbiAgaWYgKGVyciA9IHRoaXMuX2NoZWNrS2V5KGtleSwgJ2tleScsIHRoaXMuX2lzQnVmZmVyKSlcbiAgICByZXR1cm4gY2FsbGJhY2soZXJyKVxuXG4gIGlmICghdGhpcy5faXNCdWZmZXIoa2V5KSlcbiAgICBrZXkgPSBTdHJpbmcoa2V5KVxuXG4gIGlmICh0eXBlb2Ygb3B0aW9ucyAhPSAnb2JqZWN0JylcbiAgICBvcHRpb25zID0ge31cblxuICBvcHRpb25zLmFzQnVmZmVyID0gb3B0aW9ucy5hc0J1ZmZlciAhPSBmYWxzZVxuXG4gIGlmICh0eXBlb2YgdGhpcy5fZ2V0ID09ICdmdW5jdGlvbicpXG4gICAgcmV0dXJuIHRoaXMuX2dldChrZXksIG9wdGlvbnMsIGNhbGxiYWNrKVxuXG4gIHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24gKCkgeyBjYWxsYmFjayhuZXcgRXJyb3IoJ05vdEZvdW5kJykpIH0pXG59XG5cbkFic3RyYWN0TGV2ZWxET1dOLnByb3RvdHlwZS5wdXQgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSwgb3B0aW9ucywgY2FsbGJhY2spIHtcbiAgdmFyIGVyclxuXG4gIGlmICh0eXBlb2Ygb3B0aW9ucyA9PSAnZnVuY3Rpb24nKVxuICAgIGNhbGxiYWNrID0gb3B0aW9uc1xuXG4gIGlmICh0eXBlb2YgY2FsbGJhY2sgIT0gJ2Z1bmN0aW9uJylcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3B1dCgpIHJlcXVpcmVzIGEgY2FsbGJhY2sgYXJndW1lbnQnKVxuXG4gIGlmIChlcnIgPSB0aGlzLl9jaGVja0tleShrZXksICdrZXknLCB0aGlzLl9pc0J1ZmZlcikpXG4gICAgcmV0dXJuIGNhbGxiYWNrKGVycilcblxuICBpZiAoIXRoaXMuX2lzQnVmZmVyKGtleSkpXG4gICAga2V5ID0gU3RyaW5nKGtleSlcblxuICAvLyBjb2VyY2UgdmFsdWUgdG8gc3RyaW5nIGluIG5vZGUsIGRvbid0IHRvdWNoIGl0IGluIGJyb3dzZXJcbiAgLy8gKGluZGV4ZWRkYiBjYW4gc3RvcmUgYW55IEpTIHR5cGUpXG4gIGlmICh2YWx1ZSAhPSBudWxsICYmICF0aGlzLl9pc0J1ZmZlcih2YWx1ZSkgJiYgIXByb2Nlc3MuYnJvd3NlcilcbiAgICB2YWx1ZSA9IFN0cmluZyh2YWx1ZSlcblxuICBpZiAodHlwZW9mIG9wdGlvbnMgIT0gJ29iamVjdCcpXG4gICAgb3B0aW9ucyA9IHt9XG5cbiAgaWYgKHR5cGVvZiB0aGlzLl9wdXQgPT0gJ2Z1bmN0aW9uJylcbiAgICByZXR1cm4gdGhpcy5fcHV0KGtleSwgdmFsdWUsIG9wdGlvbnMsIGNhbGxiYWNrKVxuXG4gIHByb2Nlc3MubmV4dFRpY2soY2FsbGJhY2spXG59XG5cbkFic3RyYWN0TGV2ZWxET1dOLnByb3RvdHlwZS5kZWwgPSBmdW5jdGlvbiAoa2V5LCBvcHRpb25zLCBjYWxsYmFjaykge1xuICB2YXIgZXJyXG5cbiAgaWYgKHR5cGVvZiBvcHRpb25zID09ICdmdW5jdGlvbicpXG4gICAgY2FsbGJhY2sgPSBvcHRpb25zXG5cbiAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPSAnZnVuY3Rpb24nKVxuICAgIHRocm93IG5ldyBFcnJvcignZGVsKCkgcmVxdWlyZXMgYSBjYWxsYmFjayBhcmd1bWVudCcpXG5cbiAgaWYgKGVyciA9IHRoaXMuX2NoZWNrS2V5KGtleSwgJ2tleScsIHRoaXMuX2lzQnVmZmVyKSlcbiAgICByZXR1cm4gY2FsbGJhY2soZXJyKVxuXG4gIGlmICghdGhpcy5faXNCdWZmZXIoa2V5KSlcbiAgICBrZXkgPSBTdHJpbmcoa2V5KVxuXG4gIGlmICh0eXBlb2Ygb3B0aW9ucyAhPSAnb2JqZWN0JylcbiAgICBvcHRpb25zID0ge31cblxuICBpZiAodHlwZW9mIHRoaXMuX2RlbCA9PSAnZnVuY3Rpb24nKVxuICAgIHJldHVybiB0aGlzLl9kZWwoa2V5LCBvcHRpb25zLCBjYWxsYmFjaylcblxuICBwcm9jZXNzLm5leHRUaWNrKGNhbGxiYWNrKVxufVxuXG5BYnN0cmFjdExldmVsRE9XTi5wcm90b3R5cGUuYmF0Y2ggPSBmdW5jdGlvbiAoYXJyYXksIG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gIGlmICghYXJndW1lbnRzLmxlbmd0aClcbiAgICByZXR1cm4gdGhpcy5fY2hhaW5lZEJhdGNoKClcblxuICBpZiAodHlwZW9mIG9wdGlvbnMgPT0gJ2Z1bmN0aW9uJylcbiAgICBjYWxsYmFjayA9IG9wdGlvbnNcblxuICBpZiAodHlwZW9mIGFycmF5ID09ICdmdW5jdGlvbicpXG4gICAgY2FsbGJhY2sgPSBhcnJheVxuXG4gIGlmICh0eXBlb2YgY2FsbGJhY2sgIT0gJ2Z1bmN0aW9uJylcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2JhdGNoKGFycmF5KSByZXF1aXJlcyBhIGNhbGxiYWNrIGFyZ3VtZW50JylcblxuICBpZiAoIUFycmF5LmlzQXJyYXkoYXJyYXkpKVxuICAgIHJldHVybiBjYWxsYmFjayhuZXcgRXJyb3IoJ2JhdGNoKGFycmF5KSByZXF1aXJlcyBhbiBhcnJheSBhcmd1bWVudCcpKVxuXG4gIGlmICghb3B0aW9ucyB8fCB0eXBlb2Ygb3B0aW9ucyAhPSAnb2JqZWN0JylcbiAgICBvcHRpb25zID0ge31cblxuICB2YXIgaSA9IDBcbiAgICAsIGwgPSBhcnJheS5sZW5ndGhcbiAgICAsIGVcbiAgICAsIGVyclxuXG4gIGZvciAoOyBpIDwgbDsgaSsrKSB7XG4gICAgZSA9IGFycmF5W2ldXG4gICAgaWYgKHR5cGVvZiBlICE9ICdvYmplY3QnKVxuICAgICAgY29udGludWVcblxuICAgIGlmIChlcnIgPSB0aGlzLl9jaGVja0tleShlLnR5cGUsICd0eXBlJywgdGhpcy5faXNCdWZmZXIpKVxuICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycilcblxuICAgIGlmIChlcnIgPSB0aGlzLl9jaGVja0tleShlLmtleSwgJ2tleScsIHRoaXMuX2lzQnVmZmVyKSlcbiAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpXG4gIH1cblxuICBpZiAodHlwZW9mIHRoaXMuX2JhdGNoID09ICdmdW5jdGlvbicpXG4gICAgcmV0dXJuIHRoaXMuX2JhdGNoKGFycmF5LCBvcHRpb25zLCBjYWxsYmFjaylcblxuICBwcm9jZXNzLm5leHRUaWNrKGNhbGxiYWNrKVxufVxuXG4vL1RPRE86IHJlbW92ZSBmcm9tIGhlcmUsIG5vdCBhIG5lY2Vzc2FyeSBwcmltaXRpdmVcbkFic3RyYWN0TGV2ZWxET1dOLnByb3RvdHlwZS5hcHByb3hpbWF0ZVNpemUgPSBmdW5jdGlvbiAoc3RhcnQsIGVuZCwgY2FsbGJhY2spIHtcbiAgaWYgKCAgIHN0YXJ0ID09IG51bGxcbiAgICAgIHx8IGVuZCA9PSBudWxsXG4gICAgICB8fCB0eXBlb2Ygc3RhcnQgPT0gJ2Z1bmN0aW9uJ1xuICAgICAgfHwgdHlwZW9mIGVuZCA9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdhcHByb3hpbWF0ZVNpemUoKSByZXF1aXJlcyB2YWxpZCBgc3RhcnRgLCBgZW5kYCBhbmQgYGNhbGxiYWNrYCBhcmd1bWVudHMnKVxuICB9XG5cbiAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPSAnZnVuY3Rpb24nKVxuICAgIHRocm93IG5ldyBFcnJvcignYXBwcm94aW1hdGVTaXplKCkgcmVxdWlyZXMgYSBjYWxsYmFjayBhcmd1bWVudCcpXG5cbiAgaWYgKCF0aGlzLl9pc0J1ZmZlcihzdGFydCkpXG4gICAgc3RhcnQgPSBTdHJpbmcoc3RhcnQpXG5cbiAgaWYgKCF0aGlzLl9pc0J1ZmZlcihlbmQpKVxuICAgIGVuZCA9IFN0cmluZyhlbmQpXG5cbiAgaWYgKHR5cGVvZiB0aGlzLl9hcHByb3hpbWF0ZVNpemUgPT0gJ2Z1bmN0aW9uJylcbiAgICByZXR1cm4gdGhpcy5fYXBwcm94aW1hdGVTaXplKHN0YXJ0LCBlbmQsIGNhbGxiYWNrKVxuXG4gIHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24gKCkge1xuICAgIGNhbGxiYWNrKG51bGwsIDApXG4gIH0pXG59XG5cbkFic3RyYWN0TGV2ZWxET1dOLnByb3RvdHlwZS5fc2V0dXBJdGVyYXRvck9wdGlvbnMgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICB2YXIgc2VsZiA9IHRoaXNcblxuICBvcHRpb25zID0geHRlbmQob3B0aW9ucylcblxuICA7WyAnc3RhcnQnLCAnZW5kJywgJ2d0JywgJ2d0ZScsICdsdCcsICdsdGUnIF0uZm9yRWFjaChmdW5jdGlvbiAobykge1xuICAgIGlmIChvcHRpb25zW29dICYmIHNlbGYuX2lzQnVmZmVyKG9wdGlvbnNbb10pICYmIG9wdGlvbnNbb10ubGVuZ3RoID09PSAwKVxuICAgICAgZGVsZXRlIG9wdGlvbnNbb11cbiAgfSlcblxuICBvcHRpb25zLnJldmVyc2UgPSAhIW9wdGlvbnMucmV2ZXJzZVxuICBvcHRpb25zLmtleXMgPSBvcHRpb25zLmtleXMgIT0gZmFsc2VcbiAgb3B0aW9ucy52YWx1ZXMgPSBvcHRpb25zLnZhbHVlcyAhPSBmYWxzZVxuICBvcHRpb25zLmxpbWl0ID0gJ2xpbWl0JyBpbiBvcHRpb25zID8gb3B0aW9ucy5saW1pdCA6IC0xXG4gIG9wdGlvbnMua2V5QXNCdWZmZXIgPSBvcHRpb25zLmtleUFzQnVmZmVyICE9IGZhbHNlXG4gIG9wdGlvbnMudmFsdWVBc0J1ZmZlciA9IG9wdGlvbnMudmFsdWVBc0J1ZmZlciAhPSBmYWxzZVxuXG4gIHJldHVybiBvcHRpb25zXG59XG5cbkFic3RyYWN0TGV2ZWxET1dOLnByb3RvdHlwZS5pdGVyYXRvciA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gIGlmICh0eXBlb2Ygb3B0aW9ucyAhPSAnb2JqZWN0JylcbiAgICBvcHRpb25zID0ge31cblxuICBvcHRpb25zID0gdGhpcy5fc2V0dXBJdGVyYXRvck9wdGlvbnMob3B0aW9ucylcblxuICBpZiAodHlwZW9mIHRoaXMuX2l0ZXJhdG9yID09ICdmdW5jdGlvbicpXG4gICAgcmV0dXJuIHRoaXMuX2l0ZXJhdG9yKG9wdGlvbnMpXG5cbiAgcmV0dXJuIG5ldyBBYnN0cmFjdEl0ZXJhdG9yKHRoaXMpXG59XG5cbkFic3RyYWN0TGV2ZWxET1dOLnByb3RvdHlwZS5fY2hhaW5lZEJhdGNoID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gbmV3IEFic3RyYWN0Q2hhaW5lZEJhdGNoKHRoaXMpXG59XG5cbkFic3RyYWN0TGV2ZWxET1dOLnByb3RvdHlwZS5faXNCdWZmZXIgPSBmdW5jdGlvbiAob2JqKSB7XG4gIHJldHVybiBCdWZmZXIuaXNCdWZmZXIob2JqKVxufVxuXG5BYnN0cmFjdExldmVsRE9XTi5wcm90b3R5cGUuX2NoZWNrS2V5ID0gZnVuY3Rpb24gKG9iaiwgdHlwZSkge1xuXG4gIGlmIChvYmogPT09IG51bGwgfHwgb2JqID09PSB1bmRlZmluZWQpXG4gICAgcmV0dXJuIG5ldyBFcnJvcih0eXBlICsgJyBjYW5ub3QgYmUgYG51bGxgIG9yIGB1bmRlZmluZWRgJylcblxuICBpZiAodGhpcy5faXNCdWZmZXIob2JqKSkge1xuICAgIGlmIChvYmoubGVuZ3RoID09PSAwKVxuICAgICAgcmV0dXJuIG5ldyBFcnJvcih0eXBlICsgJyBjYW5ub3QgYmUgYW4gZW1wdHkgQnVmZmVyJylcbiAgfSBlbHNlIGlmIChTdHJpbmcob2JqKSA9PT0gJycpXG4gICAgcmV0dXJuIG5ldyBFcnJvcih0eXBlICsgJyBjYW5ub3QgYmUgYW4gZW1wdHkgU3RyaW5nJylcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBBYnN0cmFjdExldmVsRE9XTlxuIiwiZXhwb3J0cy5BYnN0cmFjdExldmVsRE9XTiAgICA9IHJlcXVpcmUoJy4vYWJzdHJhY3QtbGV2ZWxkb3duJylcbmV4cG9ydHMuQWJzdHJhY3RJdGVyYXRvciAgICAgPSByZXF1aXJlKCcuL2Fic3RyYWN0LWl0ZXJhdG9yJylcbmV4cG9ydHMuQWJzdHJhY3RDaGFpbmVkQmF0Y2ggPSByZXF1aXJlKCcuL2Fic3RyYWN0LWNoYWluZWQtYmF0Y2gnKVxuZXhwb3J0cy5pc0xldmVsRE9XTiAgICAgICAgICA9IHJlcXVpcmUoJy4vaXMtbGV2ZWxkb3duJylcbiIsInZhciBBYnN0cmFjdExldmVsRE9XTiA9IHJlcXVpcmUoJy4vYWJzdHJhY3QtbGV2ZWxkb3duJylcblxuZnVuY3Rpb24gaXNMZXZlbERPV04gKGRiKSB7XG4gIGlmICghZGIgfHwgdHlwZW9mIGRiICE9PSAnb2JqZWN0JylcbiAgICByZXR1cm4gZmFsc2VcbiAgcmV0dXJuIE9iamVjdC5rZXlzKEFic3RyYWN0TGV2ZWxET1dOLnByb3RvdHlwZSkuZmlsdGVyKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgLy8gVE9ETyByZW1vdmUgYXBwcm94aW1hdGVTaXplIGNoZWNrIHdoZW4gbWV0aG9kIGlzIGdvbmVcbiAgICByZXR1cm4gbmFtZVswXSAhPSAnXycgJiYgbmFtZSAhPSAnYXBwcm94aW1hdGVTaXplJ1xuICB9KS5ldmVyeShmdW5jdGlvbiAobmFtZSkge1xuICAgIHJldHVybiB0eXBlb2YgZGJbbmFtZV0gPT0gJ2Z1bmN0aW9uJ1xuICB9KVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzTGV2ZWxET1dOXG4iLCJ2YXIgb25jZSA9IHJlcXVpcmUoJ29uY2UnKTtcblxudmFyIGlzRXJyb3IgPSBmdW5jdGlvbihlKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSkgPT09ICdbb2JqZWN0IEVycm9yXScgfHwgZSBpbnN0YW5jZW9mIEVycm9yO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihhZnRlckFsbENiKSB7XG5cbiAgYWZ0ZXJBbGxDYiA9IG9uY2UoYWZ0ZXJBbGxDYiB8fCBmdW5jdGlvbigpIHt9KTtcbiAgXG4gIHZhciBlcnJvck1lc3NhZ2UgPSdcIm5leHRcIiBmdW5jdGlvbiBjYWxsZWQgYWZ0ZXIgdGhlIGZpbmFsIGNhbGxiYWNrLicrXG4gICAgJyBNYWtlIHN1cmUgYWxsIHRoZSBjYWxscyB0byBcIm5leHRcIiBhcmUgb24gdGhlIHNhbWUgdGljayc7XG4gIHZhciBjYWxscyA9IDA7XG4gIHZhciBkb25lID0gZmFsc2U7XG4gIHZhciBmaW5hbEVycm9yID0gbnVsbDtcblxuICBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uKCkge1xuICAgIGlmIChjYWxscyA9PT0gMCkge1xuICAgICAgZG9uZSA9IHRydWU7XG4gICAgICBhZnRlckFsbENiKCk7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gZnVuY3Rpb24gbmV4dChjYikge1xuICAgIGlmIChkb25lKSB0aHJvdyBuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKTtcbiAgICBjYWxscysrO1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIHRoZWNhbGxiYWNrKGVycikge1xuICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgICBpZiAoaXNFcnJvcihlcnIpICYmICFmaW5hbEVycm9yKSBmaW5hbEVycm9yID0gZXJyO1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKGNiKSBjYi5hcHBseShudWxsLCBhcmdzKTtcbiAgICAgICAgaWYgKC0tY2FsbHMgPT09IDApIHtcbiAgICAgICAgICBkb25lID0gdHJ1ZTtcbiAgICAgICAgICBhZnRlckFsbENiKGZpbmFsRXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuICB9O1xufTtcbiIsInZhciBDb250YWluZXIgPSB0eXBlb2YgQnVmZmVyICE9PSBcInVuZGVmaW5lZFwiID8gQnVmZmVyIC8vaW4gbm9kZSwgdXNlIGJ1ZmZlcnNcclxuXHRcdDogdHlwZW9mIEludDhBcnJheSAhPT0gXCJ1bmRlZmluZWRcIiA/IEludDhBcnJheSAvL2luIG5ld2VyIGJyb3dzZXJzLCB1c2Ugd2ViZ2wgaW50OGFycmF5c1xyXG5cdFx0OiBmdW5jdGlvbihsKXsgdmFyIGEgPSBuZXcgQXJyYXkobCk7IGZvcih2YXIgaSA9IDA7IGkgPCBsOyBpKyspIGFbaV09MDsgfTsgLy9lbHNlLCBkbyBzb21ldGhpbmcgc2ltaWxhclxyXG5cclxuZnVuY3Rpb24gQml0RmllbGQoZGF0YSwgb3B0cyl7XHJcblx0aWYoISh0aGlzIGluc3RhbmNlb2YgQml0RmllbGQpKSB7XHJcblx0XHRyZXR1cm4gbmV3IEJpdEZpZWxkKGRhdGEsIG9wdHMpO1xyXG5cdH1cclxuXHJcblx0aWYoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCl7XHJcblx0XHRkYXRhID0gMDtcclxuXHR9XHJcblxyXG5cdHRoaXMuZ3JvdyA9IG9wdHMgJiYgKGlzRmluaXRlKG9wdHMuZ3JvdykgJiYgZ2V0Qnl0ZVNpemUob3B0cy5ncm93KSB8fCBvcHRzLmdyb3cpIHx8IDA7XHJcblxyXG5cdGlmKHR5cGVvZiBkYXRhID09PSBcIm51bWJlclwiIHx8IGRhdGEgPT09IHVuZGVmaW5lZCl7XHJcblx0XHRkYXRhID0gbmV3IENvbnRhaW5lcihnZXRCeXRlU2l6ZShkYXRhKSk7XHJcblx0XHRpZihkYXRhLmZpbGwgJiYgIWRhdGEuX2lzQnVmZmVyKSBkYXRhLmZpbGwoMCk7IC8vIGNsZWFyIG5vZGUgYnVmZmVycyBvZiBnYXJiYWdlXHJcblx0fVxyXG5cdHRoaXMuYnVmZmVyID0gZGF0YTtcclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0Qnl0ZVNpemUobnVtKXtcclxuXHR2YXIgb3V0ID0gbnVtID4+IDM7XHJcblx0aWYobnVtICUgOCAhPT0gMCkgb3V0Kys7XHJcblx0cmV0dXJuIG91dDtcclxufVxyXG5cclxuQml0RmllbGQucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uKGkpe1xyXG5cdHZhciBqID0gaSA+PiAzO1xyXG5cdHJldHVybiAoaiA8IHRoaXMuYnVmZmVyLmxlbmd0aCkgJiZcclxuXHRcdCEhKHRoaXMuYnVmZmVyW2pdICYgKDEyOCA+PiAoaSAlIDgpKSk7XHJcbn07XHJcblxyXG5CaXRGaWVsZC5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24oaSwgYil7XHJcblx0dmFyIGogPSBpID4+IDM7XHJcblx0aWYgKGIgfHwgYXJndW1lbnRzLmxlbmd0aCA9PT0gMSl7XHJcblx0XHRpZiAodGhpcy5idWZmZXIubGVuZ3RoIDwgaiArIDEpIHRoaXMuX2dyb3coTWF0aC5tYXgoaiArIDEsIE1hdGgubWluKDIgKiB0aGlzLmJ1ZmZlci5sZW5ndGgsIHRoaXMuZ3JvdykpKTtcclxuXHRcdC8vIFNldFxyXG5cdFx0dGhpcy5idWZmZXJbal0gfD0gMTI4ID4+IChpICUgOCk7XHJcblx0fSBlbHNlIGlmIChqIDwgdGhpcy5idWZmZXIubGVuZ3RoKSB7XHJcblx0XHQvLy8gQ2xlYXJcclxuXHRcdHRoaXMuYnVmZmVyW2pdICY9IH4oMTI4ID4+IChpICUgOCkpO1xyXG5cdH1cclxufTtcclxuXHJcbkJpdEZpZWxkLnByb3RvdHlwZS5fZ3JvdyA9IGZ1bmN0aW9uKGxlbmd0aCkge1xyXG5cdGlmICh0aGlzLmJ1ZmZlci5sZW5ndGggPCBsZW5ndGggJiYgbGVuZ3RoIDw9IHRoaXMuZ3Jvdykge1xyXG5cdFx0dmFyIG5ld0J1ZmZlciA9IG5ldyBDb250YWluZXIobGVuZ3RoKTtcclxuXHRcdGlmIChuZXdCdWZmZXIuZmlsbCkgbmV3QnVmZmVyLmZpbGwoMCk7XHJcblx0XHRpZiAodGhpcy5idWZmZXIuY29weSkgdGhpcy5idWZmZXIuY29weShuZXdCdWZmZXIsIDApO1xyXG5cdFx0ZWxzZSB7XHJcblx0XHRcdGZvcih2YXIgaSA9IDA7IGkgPCB0aGlzLmJ1ZmZlci5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRcdG5ld0J1ZmZlcltpXSA9IHRoaXMuYnVmZmVyW2ldO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHR0aGlzLmJ1ZmZlciA9IG5ld0J1ZmZlcjtcclxuXHR9XHJcbn07XHJcblxyXG5pZih0eXBlb2YgbW9kdWxlICE9PSBcInVuZGVmaW5lZFwiKSBtb2R1bGUuZXhwb3J0cyA9IEJpdEZpZWxkO1xyXG4iLCIvKiFcbiAqIENyb3NzLUJyb3dzZXIgU3BsaXQgMS4xLjFcbiAqIENvcHlyaWdodCAyMDA3LTIwMTIgU3RldmVuIExldml0aGFuIDxzdGV2ZW5sZXZpdGhhbi5jb20+XG4gKiBBdmFpbGFibGUgdW5kZXIgdGhlIE1JVCBMaWNlbnNlXG4gKiBFQ01BU2NyaXB0IGNvbXBsaWFudCwgdW5pZm9ybSBjcm9zcy1icm93c2VyIHNwbGl0IG1ldGhvZFxuICovXG5cbi8qKlxuICogU3BsaXRzIGEgc3RyaW5nIGludG8gYW4gYXJyYXkgb2Ygc3RyaW5ncyB1c2luZyBhIHJlZ2V4IG9yIHN0cmluZyBzZXBhcmF0b3IuIE1hdGNoZXMgb2YgdGhlXG4gKiBzZXBhcmF0b3IgYXJlIG5vdCBpbmNsdWRlZCBpbiB0aGUgcmVzdWx0IGFycmF5LiBIb3dldmVyLCBpZiBgc2VwYXJhdG9yYCBpcyBhIHJlZ2V4IHRoYXQgY29udGFpbnNcbiAqIGNhcHR1cmluZyBncm91cHMsIGJhY2tyZWZlcmVuY2VzIGFyZSBzcGxpY2VkIGludG8gdGhlIHJlc3VsdCBlYWNoIHRpbWUgYHNlcGFyYXRvcmAgaXMgbWF0Y2hlZC5cbiAqIEZpeGVzIGJyb3dzZXIgYnVncyBjb21wYXJlZCB0byB0aGUgbmF0aXZlIGBTdHJpbmcucHJvdG90eXBlLnNwbGl0YCBhbmQgY2FuIGJlIHVzZWQgcmVsaWFibHlcbiAqIGNyb3NzLWJyb3dzZXIuXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyIFN0cmluZyB0byBzcGxpdC5cbiAqIEBwYXJhbSB7UmVnRXhwfFN0cmluZ30gc2VwYXJhdG9yIFJlZ2V4IG9yIHN0cmluZyB0byB1c2UgZm9yIHNlcGFyYXRpbmcgdGhlIHN0cmluZy5cbiAqIEBwYXJhbSB7TnVtYmVyfSBbbGltaXRdIE1heGltdW0gbnVtYmVyIG9mIGl0ZW1zIHRvIGluY2x1ZGUgaW4gdGhlIHJlc3VsdCBhcnJheS5cbiAqIEByZXR1cm5zIHtBcnJheX0gQXJyYXkgb2Ygc3Vic3RyaW5ncy5cbiAqIEBleGFtcGxlXG4gKlxuICogLy8gQmFzaWMgdXNlXG4gKiBzcGxpdCgnYSBiIGMgZCcsICcgJyk7XG4gKiAvLyAtPiBbJ2EnLCAnYicsICdjJywgJ2QnXVxuICpcbiAqIC8vIFdpdGggbGltaXRcbiAqIHNwbGl0KCdhIGIgYyBkJywgJyAnLCAyKTtcbiAqIC8vIC0+IFsnYScsICdiJ11cbiAqXG4gKiAvLyBCYWNrcmVmZXJlbmNlcyBpbiByZXN1bHQgYXJyYXlcbiAqIHNwbGl0KCcuLndvcmQxIHdvcmQyLi4nLCAvKFthLXpdKykoXFxkKykvaSk7XG4gKiAvLyAtPiBbJy4uJywgJ3dvcmQnLCAnMScsICcgJywgJ3dvcmQnLCAnMicsICcuLiddXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gKGZ1bmN0aW9uIHNwbGl0KHVuZGVmKSB7XG5cbiAgdmFyIG5hdGl2ZVNwbGl0ID0gU3RyaW5nLnByb3RvdHlwZS5zcGxpdCxcbiAgICBjb21wbGlhbnRFeGVjTnBjZyA9IC8oKT8/Ly5leGVjKFwiXCIpWzFdID09PSB1bmRlZixcbiAgICAvLyBOUENHOiBub25wYXJ0aWNpcGF0aW5nIGNhcHR1cmluZyBncm91cFxuICAgIHNlbGY7XG5cbiAgc2VsZiA9IGZ1bmN0aW9uKHN0ciwgc2VwYXJhdG9yLCBsaW1pdCkge1xuICAgIC8vIElmIGBzZXBhcmF0b3JgIGlzIG5vdCBhIHJlZ2V4LCB1c2UgYG5hdGl2ZVNwbGl0YFxuICAgIGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoc2VwYXJhdG9yKSAhPT0gXCJbb2JqZWN0IFJlZ0V4cF1cIikge1xuICAgICAgcmV0dXJuIG5hdGl2ZVNwbGl0LmNhbGwoc3RyLCBzZXBhcmF0b3IsIGxpbWl0KTtcbiAgICB9XG4gICAgdmFyIG91dHB1dCA9IFtdLFxuICAgICAgZmxhZ3MgPSAoc2VwYXJhdG9yLmlnbm9yZUNhc2UgPyBcImlcIiA6IFwiXCIpICsgKHNlcGFyYXRvci5tdWx0aWxpbmUgPyBcIm1cIiA6IFwiXCIpICsgKHNlcGFyYXRvci5leHRlbmRlZCA/IFwieFwiIDogXCJcIikgKyAvLyBQcm9wb3NlZCBmb3IgRVM2XG4gICAgICAoc2VwYXJhdG9yLnN0aWNreSA/IFwieVwiIDogXCJcIiksXG4gICAgICAvLyBGaXJlZm94IDMrXG4gICAgICBsYXN0TGFzdEluZGV4ID0gMCxcbiAgICAgIC8vIE1ha2UgYGdsb2JhbGAgYW5kIGF2b2lkIGBsYXN0SW5kZXhgIGlzc3VlcyBieSB3b3JraW5nIHdpdGggYSBjb3B5XG4gICAgICBzZXBhcmF0b3IgPSBuZXcgUmVnRXhwKHNlcGFyYXRvci5zb3VyY2UsIGZsYWdzICsgXCJnXCIpLFxuICAgICAgc2VwYXJhdG9yMiwgbWF0Y2gsIGxhc3RJbmRleCwgbGFzdExlbmd0aDtcbiAgICBzdHIgKz0gXCJcIjsgLy8gVHlwZS1jb252ZXJ0XG4gICAgaWYgKCFjb21wbGlhbnRFeGVjTnBjZykge1xuICAgICAgLy8gRG9lc24ndCBuZWVkIGZsYWdzIGd5LCBidXQgdGhleSBkb24ndCBodXJ0XG4gICAgICBzZXBhcmF0b3IyID0gbmV3IFJlZ0V4cChcIl5cIiArIHNlcGFyYXRvci5zb3VyY2UgKyBcIiQoPyFcXFxccylcIiwgZmxhZ3MpO1xuICAgIH1cbiAgICAvKiBWYWx1ZXMgZm9yIGBsaW1pdGAsIHBlciB0aGUgc3BlYzpcbiAgICAgKiBJZiB1bmRlZmluZWQ6IDQyOTQ5NjcyOTUgLy8gTWF0aC5wb3coMiwgMzIpIC0gMVxuICAgICAqIElmIDAsIEluZmluaXR5LCBvciBOYU46IDBcbiAgICAgKiBJZiBwb3NpdGl2ZSBudW1iZXI6IGxpbWl0ID0gTWF0aC5mbG9vcihsaW1pdCk7IGlmIChsaW1pdCA+IDQyOTQ5NjcyOTUpIGxpbWl0IC09IDQyOTQ5NjcyOTY7XG4gICAgICogSWYgbmVnYXRpdmUgbnVtYmVyOiA0Mjk0OTY3Mjk2IC0gTWF0aC5mbG9vcihNYXRoLmFicyhsaW1pdCkpXG4gICAgICogSWYgb3RoZXI6IFR5cGUtY29udmVydCwgdGhlbiB1c2UgdGhlIGFib3ZlIHJ1bGVzXG4gICAgICovXG4gICAgbGltaXQgPSBsaW1pdCA9PT0gdW5kZWYgPyAtMSA+Pj4gMCA6IC8vIE1hdGgucG93KDIsIDMyKSAtIDFcbiAgICBsaW1pdCA+Pj4gMDsgLy8gVG9VaW50MzIobGltaXQpXG4gICAgd2hpbGUgKG1hdGNoID0gc2VwYXJhdG9yLmV4ZWMoc3RyKSkge1xuICAgICAgLy8gYHNlcGFyYXRvci5sYXN0SW5kZXhgIGlzIG5vdCByZWxpYWJsZSBjcm9zcy1icm93c2VyXG4gICAgICBsYXN0SW5kZXggPSBtYXRjaC5pbmRleCArIG1hdGNoWzBdLmxlbmd0aDtcbiAgICAgIGlmIChsYXN0SW5kZXggPiBsYXN0TGFzdEluZGV4KSB7XG4gICAgICAgIG91dHB1dC5wdXNoKHN0ci5zbGljZShsYXN0TGFzdEluZGV4LCBtYXRjaC5pbmRleCkpO1xuICAgICAgICAvLyBGaXggYnJvd3NlcnMgd2hvc2UgYGV4ZWNgIG1ldGhvZHMgZG9uJ3QgY29uc2lzdGVudGx5IHJldHVybiBgdW5kZWZpbmVkYCBmb3JcbiAgICAgICAgLy8gbm9ucGFydGljaXBhdGluZyBjYXB0dXJpbmcgZ3JvdXBzXG4gICAgICAgIGlmICghY29tcGxpYW50RXhlY05wY2cgJiYgbWF0Y2gubGVuZ3RoID4gMSkge1xuICAgICAgICAgIG1hdGNoWzBdLnJlcGxhY2Uoc2VwYXJhdG9yMiwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGggLSAyOyBpKyspIHtcbiAgICAgICAgICAgICAgaWYgKGFyZ3VtZW50c1tpXSA9PT0gdW5kZWYpIHtcbiAgICAgICAgICAgICAgICBtYXRjaFtpXSA9IHVuZGVmO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1hdGNoLmxlbmd0aCA+IDEgJiYgbWF0Y2guaW5kZXggPCBzdHIubGVuZ3RoKSB7XG4gICAgICAgICAgQXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkob3V0cHV0LCBtYXRjaC5zbGljZSgxKSk7XG4gICAgICAgIH1cbiAgICAgICAgbGFzdExlbmd0aCA9IG1hdGNoWzBdLmxlbmd0aDtcbiAgICAgICAgbGFzdExhc3RJbmRleCA9IGxhc3RJbmRleDtcbiAgICAgICAgaWYgKG91dHB1dC5sZW5ndGggPj0gbGltaXQpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHNlcGFyYXRvci5sYXN0SW5kZXggPT09IG1hdGNoLmluZGV4KSB7XG4gICAgICAgIHNlcGFyYXRvci5sYXN0SW5kZXgrKzsgLy8gQXZvaWQgYW4gaW5maW5pdGUgbG9vcFxuICAgICAgfVxuICAgIH1cbiAgICBpZiAobGFzdExhc3RJbmRleCA9PT0gc3RyLmxlbmd0aCkge1xuICAgICAgaWYgKGxhc3RMZW5ndGggfHwgIXNlcGFyYXRvci50ZXN0KFwiXCIpKSB7XG4gICAgICAgIG91dHB1dC5wdXNoKFwiXCIpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBvdXRwdXQucHVzaChzdHIuc2xpY2UobGFzdExhc3RJbmRleCkpO1xuICAgIH1cbiAgICByZXR1cm4gb3V0cHV0Lmxlbmd0aCA+IGxpbWl0ID8gb3V0cHV0LnNsaWNlKDAsIGxpbWl0KSA6IG91dHB1dDtcbiAgfTtcblxuICByZXR1cm4gc2VsZjtcbn0pKCk7XG4iLCIndXNlIHN0cmljdCc7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhLCBiKSB7XG5cdGlmICghQnVmZmVyLmlzQnVmZmVyKGEpIHx8ICFCdWZmZXIuaXNCdWZmZXIoYikpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudHMgbXVzdCBiZSBCdWZmZXJzJyk7XG5cdH1cblxuXHRpZiAoYSA9PT0gYikge1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0aWYgKHR5cGVvZiBhLmVxdWFscyA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdHJldHVybiBhLmVxdWFscyhiKTtcblx0fVxuXG5cdGlmIChhLmxlbmd0aCAhPT0gYi5sZW5ndGgpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRmb3IgKHZhciBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHtcblx0XHRpZiAoYVtpXSAhPT0gYltpXSkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiB0cnVlO1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24ob2JqKSB7XG4gICAgaWYgKHR5cGVvZiBvYmogPT09ICdzdHJpbmcnKSByZXR1cm4gY2FtZWxDYXNlKG9iaik7XG4gICAgcmV0dXJuIHdhbGsob2JqKTtcbn07XG5cbmZ1bmN0aW9uIHdhbGsgKG9iaikge1xuICAgIGlmICghb2JqIHx8IHR5cGVvZiBvYmogIT09ICdvYmplY3QnKSByZXR1cm4gb2JqO1xuICAgIGlmIChpc0RhdGUob2JqKSB8fCBpc1JlZ2V4KG9iaikpIHJldHVybiBvYmo7XG4gICAgaWYgKGlzQXJyYXkob2JqKSkgcmV0dXJuIG1hcChvYmosIHdhbGspO1xuICAgIHJldHVybiByZWR1Y2Uob2JqZWN0S2V5cyhvYmopLCBmdW5jdGlvbiAoYWNjLCBrZXkpIHtcbiAgICAgICAgdmFyIGNhbWVsID0gY2FtZWxDYXNlKGtleSk7XG4gICAgICAgIGFjY1tjYW1lbF0gPSB3YWxrKG9ialtrZXldKTtcbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB7fSk7XG59XG5cbmZ1bmN0aW9uIGNhbWVsQ2FzZShzdHIpIHtcbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoL1tfLi1dKFxcd3wkKS9nLCBmdW5jdGlvbiAoXyx4KSB7XG4gICAgICAgIHJldHVybiB4LnRvVXBwZXJDYXNlKCk7XG4gICAgfSk7XG59XG5cbnZhciBpc0FycmF5ID0gQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbiAob2JqKSB7XG4gICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopID09PSAnW29iamVjdCBBcnJheV0nO1xufTtcblxudmFyIGlzRGF0ZSA9IGZ1bmN0aW9uIChvYmopIHtcbiAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iaikgPT09ICdbb2JqZWN0IERhdGVdJztcbn07XG5cbnZhciBpc1JlZ2V4ID0gZnVuY3Rpb24gKG9iaikge1xuICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKSA9PT0gJ1tvYmplY3QgUmVnRXhwXSc7XG59O1xuXG52YXIgaGFzID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbnZhciBvYmplY3RLZXlzID0gT2JqZWN0LmtleXMgfHwgZnVuY3Rpb24gKG9iaikge1xuICAgIHZhciBrZXlzID0gW107XG4gICAgZm9yICh2YXIga2V5IGluIG9iaikge1xuICAgICAgICBpZiAoaGFzLmNhbGwob2JqLCBrZXkpKSBrZXlzLnB1c2goa2V5KTtcbiAgICB9XG4gICAgcmV0dXJuIGtleXM7XG59O1xuXG5mdW5jdGlvbiBtYXAgKHhzLCBmKSB7XG4gICAgaWYgKHhzLm1hcCkgcmV0dXJuIHhzLm1hcChmKTtcbiAgICB2YXIgcmVzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB4cy5sZW5ndGg7IGkrKykge1xuICAgICAgICByZXMucHVzaChmKHhzW2ldLCBpKSk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG59XG5cbmZ1bmN0aW9uIHJlZHVjZSAoeHMsIGYsIGFjYykge1xuICAgIGlmICh4cy5yZWR1Y2UpIHJldHVybiB4cy5yZWR1Y2UoZiwgYWNjKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHhzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGFjYyA9IGYoYWNjLCB4c1tpXSwgaSk7XG4gICAgfVxuICAgIHJldHVybiBhY2M7XG59XG4iLCJcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnc29kaXVtLWJyb3dzZXJpZnkvYnJvd3NlcicpXG4iLCIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuLy8gTk9URTogVGhlc2UgdHlwZSBjaGVja2luZyBmdW5jdGlvbnMgaW50ZW50aW9uYWxseSBkb24ndCB1c2UgYGluc3RhbmNlb2ZgXG4vLyBiZWNhdXNlIGl0IGlzIGZyYWdpbGUgYW5kIGNhbiBiZSBlYXNpbHkgZmFrZWQgd2l0aCBgT2JqZWN0LmNyZWF0ZSgpYC5cblxuZnVuY3Rpb24gaXNBcnJheShhcmcpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkpIHtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheShhcmcpO1xuICB9XG4gIHJldHVybiBvYmplY3RUb1N0cmluZyhhcmcpID09PSAnW29iamVjdCBBcnJheV0nO1xufVxuZXhwb3J0cy5pc0FycmF5ID0gaXNBcnJheTtcblxuZnVuY3Rpb24gaXNCb29sZWFuKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ2Jvb2xlYW4nO1xufVxuZXhwb3J0cy5pc0Jvb2xlYW4gPSBpc0Jvb2xlYW47XG5cbmZ1bmN0aW9uIGlzTnVsbChhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gbnVsbDtcbn1cbmV4cG9ydHMuaXNOdWxsID0gaXNOdWxsO1xuXG5mdW5jdGlvbiBpc051bGxPclVuZGVmaW5lZChhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PSBudWxsO1xufVxuZXhwb3J0cy5pc051bGxPclVuZGVmaW5lZCA9IGlzTnVsbE9yVW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBpc051bWJlcihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdudW1iZXInO1xufVxuZXhwb3J0cy5pc051bWJlciA9IGlzTnVtYmVyO1xuXG5mdW5jdGlvbiBpc1N0cmluZyhhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnO1xufVxuZXhwb3J0cy5pc1N0cmluZyA9IGlzU3RyaW5nO1xuXG5mdW5jdGlvbiBpc1N5bWJvbChhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdzeW1ib2wnO1xufVxuZXhwb3J0cy5pc1N5bWJvbCA9IGlzU3ltYm9sO1xuXG5mdW5jdGlvbiBpc1VuZGVmaW5lZChhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gdm9pZCAwO1xufVxuZXhwb3J0cy5pc1VuZGVmaW5lZCA9IGlzVW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBpc1JlZ0V4cChyZSkge1xuICByZXR1cm4gb2JqZWN0VG9TdHJpbmcocmUpID09PSAnW29iamVjdCBSZWdFeHBdJztcbn1cbmV4cG9ydHMuaXNSZWdFeHAgPSBpc1JlZ0V4cDtcblxuZnVuY3Rpb24gaXNPYmplY3QoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnb2JqZWN0JyAmJiBhcmcgIT09IG51bGw7XG59XG5leHBvcnRzLmlzT2JqZWN0ID0gaXNPYmplY3Q7XG5cbmZ1bmN0aW9uIGlzRGF0ZShkKSB7XG4gIHJldHVybiBvYmplY3RUb1N0cmluZyhkKSA9PT0gJ1tvYmplY3QgRGF0ZV0nO1xufVxuZXhwb3J0cy5pc0RhdGUgPSBpc0RhdGU7XG5cbmZ1bmN0aW9uIGlzRXJyb3IoZSkge1xuICByZXR1cm4gKG9iamVjdFRvU3RyaW5nKGUpID09PSAnW29iamVjdCBFcnJvcl0nIHx8IGUgaW5zdGFuY2VvZiBFcnJvcik7XG59XG5leHBvcnRzLmlzRXJyb3IgPSBpc0Vycm9yO1xuXG5mdW5jdGlvbiBpc0Z1bmN0aW9uKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ2Z1bmN0aW9uJztcbn1cbmV4cG9ydHMuaXNGdW5jdGlvbiA9IGlzRnVuY3Rpb247XG5cbmZ1bmN0aW9uIGlzUHJpbWl0aXZlKGFyZykge1xuICByZXR1cm4gYXJnID09PSBudWxsIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnYm9vbGVhbicgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdudW1iZXInIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ3N5bWJvbCcgfHwgIC8vIEVTNiBzeW1ib2xcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICd1bmRlZmluZWQnO1xufVxuZXhwb3J0cy5pc1ByaW1pdGl2ZSA9IGlzUHJpbWl0aXZlO1xuXG5leHBvcnRzLmlzQnVmZmVyID0gQnVmZmVyLmlzQnVmZmVyO1xuXG5mdW5jdGlvbiBvYmplY3RUb1N0cmluZyhvKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobyk7XG59XG4iLCIvKipcbiAqIGN1aWQuanNcbiAqIENvbGxpc2lvbi1yZXNpc3RhbnQgVUlEIGdlbmVyYXRvciBmb3IgYnJvd3NlcnMgYW5kIG5vZGUuXG4gKiBTZXF1ZW50aWFsIGZvciBmYXN0IGRiIGxvb2t1cHMgYW5kIHJlY2VuY3kgc29ydGluZy5cbiAqIFNhZmUgZm9yIGVsZW1lbnQgSURzIGFuZCBzZXJ2ZXItc2lkZSBsb29rdXBzLlxuICpcbiAqIEV4dHJhY3RlZCBmcm9tIENMQ1RSXG4gKlxuICogQ29weXJpZ2h0IChjKSBFcmljIEVsbGlvdHQgMjAxMlxuICogTUlUIExpY2Vuc2VcbiAqL1xuXG4vKmdsb2JhbCB3aW5kb3csIG5hdmlnYXRvciwgZG9jdW1lbnQsIHJlcXVpcmUsIHByb2Nlc3MsIG1vZHVsZSAqL1xuKGZ1bmN0aW9uIChhcHApIHtcbiAgJ3VzZSBzdHJpY3QnO1xuICB2YXIgbmFtZXNwYWNlID0gJ2N1aWQnLFxuICAgIGMgPSAwLFxuICAgIGJsb2NrU2l6ZSA9IDQsXG4gICAgYmFzZSA9IDM2LFxuICAgIGRpc2NyZXRlVmFsdWVzID0gTWF0aC5wb3coYmFzZSwgYmxvY2tTaXplKSxcblxuICAgIHBhZCA9IGZ1bmN0aW9uIHBhZChudW0sIHNpemUpIHtcbiAgICAgIHZhciBzID0gXCIwMDAwMDAwMDBcIiArIG51bTtcbiAgICAgIHJldHVybiBzLnN1YnN0cihzLmxlbmd0aC1zaXplKTtcbiAgICB9LFxuXG4gICAgcmFuZG9tQmxvY2sgPSBmdW5jdGlvbiByYW5kb21CbG9jaygpIHtcbiAgICAgIHJldHVybiBwYWQoKE1hdGgucmFuZG9tKCkgKlxuICAgICAgICAgICAgZGlzY3JldGVWYWx1ZXMgPDwgMClcbiAgICAgICAgICAgIC50b1N0cmluZyhiYXNlKSwgYmxvY2tTaXplKTtcbiAgICB9LFxuXG4gICAgc2FmZUNvdW50ZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBjID0gKGMgPCBkaXNjcmV0ZVZhbHVlcykgPyBjIDogMDtcbiAgICAgIGMrKzsgLy8gdGhpcyBpcyBub3Qgc3VibGltaW5hbFxuICAgICAgcmV0dXJuIGMgLSAxO1xuICAgIH0sXG5cbiAgICBhcGkgPSBmdW5jdGlvbiBjdWlkKCkge1xuICAgICAgLy8gU3RhcnRpbmcgd2l0aCBhIGxvd2VyY2FzZSBsZXR0ZXIgbWFrZXNcbiAgICAgIC8vIGl0IEhUTUwgZWxlbWVudCBJRCBmcmllbmRseS5cbiAgICAgIHZhciBsZXR0ZXIgPSAnYycsIC8vIGhhcmQtY29kZWQgYWxsb3dzIGZvciBzZXF1ZW50aWFsIGFjY2Vzc1xuXG4gICAgICAgIC8vIHRpbWVzdGFtcFxuICAgICAgICAvLyB3YXJuaW5nOiB0aGlzIGV4cG9zZXMgdGhlIGV4YWN0IGRhdGUgYW5kIHRpbWVcbiAgICAgICAgLy8gdGhhdCB0aGUgdWlkIHdhcyBjcmVhdGVkLlxuICAgICAgICB0aW1lc3RhbXAgPSAobmV3IERhdGUoKS5nZXRUaW1lKCkpLnRvU3RyaW5nKGJhc2UpLFxuXG4gICAgICAgIC8vIFByZXZlbnQgc2FtZS1tYWNoaW5lIGNvbGxpc2lvbnMuXG4gICAgICAgIGNvdW50ZXIsXG5cbiAgICAgICAgLy8gQSBmZXcgY2hhcnMgdG8gZ2VuZXJhdGUgZGlzdGluY3QgaWRzIGZvciBkaWZmZXJlbnRcbiAgICAgICAgLy8gY2xpZW50cyAoc28gZGlmZmVyZW50IGNvbXB1dGVycyBhcmUgZmFyIGxlc3NcbiAgICAgICAgLy8gbGlrZWx5IHRvIGdlbmVyYXRlIHRoZSBzYW1lIGlkKVxuICAgICAgICBmaW5nZXJwcmludCA9IGFwaS5maW5nZXJwcmludCgpLFxuXG4gICAgICAgIC8vIEdyYWIgc29tZSBtb3JlIGNoYXJzIGZyb20gTWF0aC5yYW5kb20oKVxuICAgICAgICByYW5kb20gPSByYW5kb21CbG9jaygpICsgcmFuZG9tQmxvY2soKTtcblxuICAgICAgICBjb3VudGVyID0gcGFkKHNhZmVDb3VudGVyKCkudG9TdHJpbmcoYmFzZSksIGJsb2NrU2l6ZSk7XG5cbiAgICAgIHJldHVybiAgKGxldHRlciArIHRpbWVzdGFtcCArIGNvdW50ZXIgKyBmaW5nZXJwcmludCArIHJhbmRvbSk7XG4gICAgfTtcblxuICBhcGkuc2x1ZyA9IGZ1bmN0aW9uIHNsdWcoKSB7XG4gICAgdmFyIGRhdGUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKS50b1N0cmluZygzNiksXG4gICAgICBjb3VudGVyLFxuICAgICAgcHJpbnQgPSBhcGkuZmluZ2VycHJpbnQoKS5zbGljZSgwLDEpICtcbiAgICAgICAgYXBpLmZpbmdlcnByaW50KCkuc2xpY2UoLTEpLFxuICAgICAgcmFuZG9tID0gcmFuZG9tQmxvY2soKS5zbGljZSgtMik7XG5cbiAgICAgIGNvdW50ZXIgPSBzYWZlQ291bnRlcigpLnRvU3RyaW5nKDM2KS5zbGljZSgtNCk7XG5cbiAgICByZXR1cm4gZGF0ZS5zbGljZSgtMikgK1xuICAgICAgY291bnRlciArIHByaW50ICsgcmFuZG9tO1xuICB9O1xuXG4gIGFwaS5nbG9iYWxDb3VudCA9IGZ1bmN0aW9uIGdsb2JhbENvdW50KCkge1xuICAgIC8vIFdlIHdhbnQgdG8gY2FjaGUgdGhlIHJlc3VsdHMgb2YgdGhpc1xuICAgIHZhciBjYWNoZSA9IChmdW5jdGlvbiBjYWxjKCkge1xuICAgICAgICB2YXIgaSxcbiAgICAgICAgICBjb3VudCA9IDA7XG5cbiAgICAgICAgZm9yIChpIGluIHdpbmRvdykge1xuICAgICAgICAgIGNvdW50Kys7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY291bnQ7XG4gICAgICB9KCkpO1xuXG4gICAgYXBpLmdsb2JhbENvdW50ID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gY2FjaGU7IH07XG4gICAgcmV0dXJuIGNhY2hlO1xuICB9O1xuXG4gIGFwaS5maW5nZXJwcmludCA9IGZ1bmN0aW9uIGJyb3dzZXJQcmludCgpIHtcbiAgICByZXR1cm4gcGFkKChuYXZpZ2F0b3IubWltZVR5cGVzLmxlbmd0aCArXG4gICAgICBuYXZpZ2F0b3IudXNlckFnZW50Lmxlbmd0aCkudG9TdHJpbmcoMzYpICtcbiAgICAgIGFwaS5nbG9iYWxDb3VudCgpLnRvU3RyaW5nKDM2KSwgNCk7XG4gIH07XG5cbiAgLy8gZG9uJ3QgY2hhbmdlIGFueXRoaW5nIGZyb20gaGVyZSBkb3duLlxuICBpZiAoYXBwLnJlZ2lzdGVyKSB7XG4gICAgYXBwLnJlZ2lzdGVyKG5hbWVzcGFjZSwgYXBpKTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJykge1xuICAgIG1vZHVsZS5leHBvcnRzID0gYXBpO1xuICB9IGVsc2Uge1xuICAgIGFwcFtuYW1lc3BhY2VdID0gYXBpO1xuICB9XG5cbn0odGhpcy5hcHBsaXR1ZGUgfHwgdGhpcykpO1xuIiwiXG4vKipcbiAqIFRoaXMgaXMgdGhlIHdlYiBicm93c2VyIGltcGxlbWVudGF0aW9uIG9mIGBkZWJ1ZygpYC5cbiAqXG4gKiBFeHBvc2UgYGRlYnVnKClgIGFzIHRoZSBtb2R1bGUuXG4gKi9cblxuZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9kZWJ1ZycpO1xuZXhwb3J0cy5sb2cgPSBsb2c7XG5leHBvcnRzLmZvcm1hdEFyZ3MgPSBmb3JtYXRBcmdzO1xuZXhwb3J0cy5zYXZlID0gc2F2ZTtcbmV4cG9ydHMubG9hZCA9IGxvYWQ7XG5leHBvcnRzLnVzZUNvbG9ycyA9IHVzZUNvbG9ycztcbmV4cG9ydHMuc3RvcmFnZSA9ICd1bmRlZmluZWQnICE9IHR5cGVvZiBjaHJvbWVcbiAgICAgICAgICAgICAgICYmICd1bmRlZmluZWQnICE9IHR5cGVvZiBjaHJvbWUuc3RvcmFnZVxuICAgICAgICAgICAgICAgICAgPyBjaHJvbWUuc3RvcmFnZS5sb2NhbFxuICAgICAgICAgICAgICAgICAgOiBsb2NhbHN0b3JhZ2UoKTtcblxuLyoqXG4gKiBDb2xvcnMuXG4gKi9cblxuZXhwb3J0cy5jb2xvcnMgPSBbXG4gICdsaWdodHNlYWdyZWVuJyxcbiAgJ2ZvcmVzdGdyZWVuJyxcbiAgJ2dvbGRlbnJvZCcsXG4gICdkb2RnZXJibHVlJyxcbiAgJ2RhcmtvcmNoaWQnLFxuICAnY3JpbXNvbidcbl07XG5cbi8qKlxuICogQ3VycmVudGx5IG9ubHkgV2ViS2l0LWJhc2VkIFdlYiBJbnNwZWN0b3JzLCBGaXJlZm94ID49IHYzMSxcbiAqIGFuZCB0aGUgRmlyZWJ1ZyBleHRlbnNpb24gKGFueSBGaXJlZm94IHZlcnNpb24pIGFyZSBrbm93blxuICogdG8gc3VwcG9ydCBcIiVjXCIgQ1NTIGN1c3RvbWl6YXRpb25zLlxuICpcbiAqIFRPRE86IGFkZCBhIGBsb2NhbFN0b3JhZ2VgIHZhcmlhYmxlIHRvIGV4cGxpY2l0bHkgZW5hYmxlL2Rpc2FibGUgY29sb3JzXG4gKi9cblxuZnVuY3Rpb24gdXNlQ29sb3JzKCkge1xuICAvLyBpcyB3ZWJraXQ/IGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzE2NDU5NjA2LzM3Njc3M1xuICByZXR1cm4gKCdXZWJraXRBcHBlYXJhbmNlJyBpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUpIHx8XG4gICAgLy8gaXMgZmlyZWJ1Zz8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMzk4MTIwLzM3Njc3M1xuICAgICh3aW5kb3cuY29uc29sZSAmJiAoY29uc29sZS5maXJlYnVnIHx8IChjb25zb2xlLmV4Y2VwdGlvbiAmJiBjb25zb2xlLnRhYmxlKSkpIHx8XG4gICAgLy8gaXMgZmlyZWZveCA+PSB2MzE/XG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9Ub29scy9XZWJfQ29uc29sZSNTdHlsaW5nX21lc3NhZ2VzXG4gICAgKG5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKS5tYXRjaCgvZmlyZWZveFxcLyhcXGQrKS8pICYmIHBhcnNlSW50KFJlZ0V4cC4kMSwgMTApID49IDMxKTtcbn1cblxuLyoqXG4gKiBNYXAgJWogdG8gYEpTT04uc3RyaW5naWZ5KClgLCBzaW5jZSBubyBXZWIgSW5zcGVjdG9ycyBkbyB0aGF0IGJ5IGRlZmF1bHQuXG4gKi9cblxuZXhwb3J0cy5mb3JtYXR0ZXJzLmogPSBmdW5jdGlvbih2KSB7XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeSh2KTtcbn07XG5cblxuLyoqXG4gKiBDb2xvcml6ZSBsb2cgYXJndW1lbnRzIGlmIGVuYWJsZWQuXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBmb3JtYXRBcmdzKCkge1xuICB2YXIgYXJncyA9IGFyZ3VtZW50cztcbiAgdmFyIHVzZUNvbG9ycyA9IHRoaXMudXNlQ29sb3JzO1xuXG4gIGFyZ3NbMF0gPSAodXNlQ29sb3JzID8gJyVjJyA6ICcnKVxuICAgICsgdGhpcy5uYW1lc3BhY2VcbiAgICArICh1c2VDb2xvcnMgPyAnICVjJyA6ICcgJylcbiAgICArIGFyZ3NbMF1cbiAgICArICh1c2VDb2xvcnMgPyAnJWMgJyA6ICcgJylcbiAgICArICcrJyArIGV4cG9ydHMuaHVtYW5pemUodGhpcy5kaWZmKTtcblxuICBpZiAoIXVzZUNvbG9ycykgcmV0dXJuIGFyZ3M7XG5cbiAgdmFyIGMgPSAnY29sb3I6ICcgKyB0aGlzLmNvbG9yO1xuICBhcmdzID0gW2FyZ3NbMF0sIGMsICdjb2xvcjogaW5oZXJpdCddLmNvbmNhdChBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmdzLCAxKSk7XG5cbiAgLy8gdGhlIGZpbmFsIFwiJWNcIiBpcyBzb21ld2hhdCB0cmlja3ksIGJlY2F1c2UgdGhlcmUgY291bGQgYmUgb3RoZXJcbiAgLy8gYXJndW1lbnRzIHBhc3NlZCBlaXRoZXIgYmVmb3JlIG9yIGFmdGVyIHRoZSAlYywgc28gd2UgbmVlZCB0b1xuICAvLyBmaWd1cmUgb3V0IHRoZSBjb3JyZWN0IGluZGV4IHRvIGluc2VydCB0aGUgQ1NTIGludG9cbiAgdmFyIGluZGV4ID0gMDtcbiAgdmFyIGxhc3RDID0gMDtcbiAgYXJnc1swXS5yZXBsYWNlKC8lW2EteiVdL2csIGZ1bmN0aW9uKG1hdGNoKSB7XG4gICAgaWYgKCclJScgPT09IG1hdGNoKSByZXR1cm47XG4gICAgaW5kZXgrKztcbiAgICBpZiAoJyVjJyA9PT0gbWF0Y2gpIHtcbiAgICAgIC8vIHdlIG9ubHkgYXJlIGludGVyZXN0ZWQgaW4gdGhlICpsYXN0KiAlY1xuICAgICAgLy8gKHRoZSB1c2VyIG1heSBoYXZlIHByb3ZpZGVkIHRoZWlyIG93bilcbiAgICAgIGxhc3RDID0gaW5kZXg7XG4gICAgfVxuICB9KTtcblxuICBhcmdzLnNwbGljZShsYXN0QywgMCwgYyk7XG4gIHJldHVybiBhcmdzO1xufVxuXG4vKipcbiAqIEludm9rZXMgYGNvbnNvbGUubG9nKClgIHdoZW4gYXZhaWxhYmxlLlxuICogTm8tb3Agd2hlbiBgY29uc29sZS5sb2dgIGlzIG5vdCBhIFwiZnVuY3Rpb25cIi5cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGxvZygpIHtcbiAgLy8gdGhpcyBoYWNrZXJ5IGlzIHJlcXVpcmVkIGZvciBJRTgvOSwgd2hlcmVcbiAgLy8gdGhlIGBjb25zb2xlLmxvZ2AgZnVuY3Rpb24gZG9lc24ndCBoYXZlICdhcHBseSdcbiAgcmV0dXJuICdvYmplY3QnID09PSB0eXBlb2YgY29uc29sZVxuICAgICYmIGNvbnNvbGUubG9nXG4gICAgJiYgRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5LmNhbGwoY29uc29sZS5sb2csIGNvbnNvbGUsIGFyZ3VtZW50cyk7XG59XG5cbi8qKlxuICogU2F2ZSBgbmFtZXNwYWNlc2AuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVzcGFjZXNcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHNhdmUobmFtZXNwYWNlcykge1xuICB0cnkge1xuICAgIGlmIChudWxsID09IG5hbWVzcGFjZXMpIHtcbiAgICAgIGV4cG9ydHMuc3RvcmFnZS5yZW1vdmVJdGVtKCdkZWJ1ZycpO1xuICAgIH0gZWxzZSB7XG4gICAgICBleHBvcnRzLnN0b3JhZ2UuZGVidWcgPSBuYW1lc3BhY2VzO1xuICAgIH1cbiAgfSBjYXRjaChlKSB7fVxufVxuXG4vKipcbiAqIExvYWQgYG5hbWVzcGFjZXNgLlxuICpcbiAqIEByZXR1cm4ge1N0cmluZ30gcmV0dXJucyB0aGUgcHJldmlvdXNseSBwZXJzaXN0ZWQgZGVidWcgbW9kZXNcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGxvYWQoKSB7XG4gIHZhciByO1xuICB0cnkge1xuICAgIHIgPSBleHBvcnRzLnN0b3JhZ2UuZGVidWc7XG4gIH0gY2F0Y2goZSkge31cbiAgcmV0dXJuIHI7XG59XG5cbi8qKlxuICogRW5hYmxlIG5hbWVzcGFjZXMgbGlzdGVkIGluIGBsb2NhbFN0b3JhZ2UuZGVidWdgIGluaXRpYWxseS5cbiAqL1xuXG5leHBvcnRzLmVuYWJsZShsb2FkKCkpO1xuXG4vKipcbiAqIExvY2Fsc3RvcmFnZSBhdHRlbXB0cyB0byByZXR1cm4gdGhlIGxvY2Fsc3RvcmFnZS5cbiAqXG4gKiBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHNhZmFyaSB0aHJvd3NcbiAqIHdoZW4gYSB1c2VyIGRpc2FibGVzIGNvb2tpZXMvbG9jYWxzdG9yYWdlXG4gKiBhbmQgeW91IGF0dGVtcHQgdG8gYWNjZXNzIGl0LlxuICpcbiAqIEByZXR1cm4ge0xvY2FsU3RvcmFnZX1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGxvY2Fsc3RvcmFnZSgpe1xuICB0cnkge1xuICAgIHJldHVybiB3aW5kb3cubG9jYWxTdG9yYWdlO1xuICB9IGNhdGNoIChlKSB7fVxufVxuIiwiXG4vKipcbiAqIFRoaXMgaXMgdGhlIGNvbW1vbiBsb2dpYyBmb3IgYm90aCB0aGUgTm9kZS5qcyBhbmQgd2ViIGJyb3dzZXJcbiAqIGltcGxlbWVudGF0aW9ucyBvZiBgZGVidWcoKWAuXG4gKlxuICogRXhwb3NlIGBkZWJ1ZygpYCBhcyB0aGUgbW9kdWxlLlxuICovXG5cbmV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IGRlYnVnO1xuZXhwb3J0cy5jb2VyY2UgPSBjb2VyY2U7XG5leHBvcnRzLmRpc2FibGUgPSBkaXNhYmxlO1xuZXhwb3J0cy5lbmFibGUgPSBlbmFibGU7XG5leHBvcnRzLmVuYWJsZWQgPSBlbmFibGVkO1xuZXhwb3J0cy5odW1hbml6ZSA9IHJlcXVpcmUoJ21zJyk7XG5cbi8qKlxuICogVGhlIGN1cnJlbnRseSBhY3RpdmUgZGVidWcgbW9kZSBuYW1lcywgYW5kIG5hbWVzIHRvIHNraXAuXG4gKi9cblxuZXhwb3J0cy5uYW1lcyA9IFtdO1xuZXhwb3J0cy5za2lwcyA9IFtdO1xuXG4vKipcbiAqIE1hcCBvZiBzcGVjaWFsIFwiJW5cIiBoYW5kbGluZyBmdW5jdGlvbnMsIGZvciB0aGUgZGVidWcgXCJmb3JtYXRcIiBhcmd1bWVudC5cbiAqXG4gKiBWYWxpZCBrZXkgbmFtZXMgYXJlIGEgc2luZ2xlLCBsb3dlcmNhc2VkIGxldHRlciwgaS5lLiBcIm5cIi5cbiAqL1xuXG5leHBvcnRzLmZvcm1hdHRlcnMgPSB7fTtcblxuLyoqXG4gKiBQcmV2aW91c2x5IGFzc2lnbmVkIGNvbG9yLlxuICovXG5cbnZhciBwcmV2Q29sb3IgPSAwO1xuXG4vKipcbiAqIFByZXZpb3VzIGxvZyB0aW1lc3RhbXAuXG4gKi9cblxudmFyIHByZXZUaW1lO1xuXG4vKipcbiAqIFNlbGVjdCBhIGNvbG9yLlxuICpcbiAqIEByZXR1cm4ge051bWJlcn1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHNlbGVjdENvbG9yKCkge1xuICByZXR1cm4gZXhwb3J0cy5jb2xvcnNbcHJldkNvbG9yKysgJSBleHBvcnRzLmNvbG9ycy5sZW5ndGhdO1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIGRlYnVnZ2VyIHdpdGggdGhlIGdpdmVuIGBuYW1lc3BhY2VgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lc3BhY2VcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBkZWJ1ZyhuYW1lc3BhY2UpIHtcblxuICAvLyBkZWZpbmUgdGhlIGBkaXNhYmxlZGAgdmVyc2lvblxuICBmdW5jdGlvbiBkaXNhYmxlZCgpIHtcbiAgfVxuICBkaXNhYmxlZC5lbmFibGVkID0gZmFsc2U7XG5cbiAgLy8gZGVmaW5lIHRoZSBgZW5hYmxlZGAgdmVyc2lvblxuICBmdW5jdGlvbiBlbmFibGVkKCkge1xuXG4gICAgdmFyIHNlbGYgPSBlbmFibGVkO1xuXG4gICAgLy8gc2V0IGBkaWZmYCB0aW1lc3RhbXBcbiAgICB2YXIgY3VyciA9ICtuZXcgRGF0ZSgpO1xuICAgIHZhciBtcyA9IGN1cnIgLSAocHJldlRpbWUgfHwgY3Vycik7XG4gICAgc2VsZi5kaWZmID0gbXM7XG4gICAgc2VsZi5wcmV2ID0gcHJldlRpbWU7XG4gICAgc2VsZi5jdXJyID0gY3VycjtcbiAgICBwcmV2VGltZSA9IGN1cnI7XG5cbiAgICAvLyBhZGQgdGhlIGBjb2xvcmAgaWYgbm90IHNldFxuICAgIGlmIChudWxsID09IHNlbGYudXNlQ29sb3JzKSBzZWxmLnVzZUNvbG9ycyA9IGV4cG9ydHMudXNlQ29sb3JzKCk7XG4gICAgaWYgKG51bGwgPT0gc2VsZi5jb2xvciAmJiBzZWxmLnVzZUNvbG9ycykgc2VsZi5jb2xvciA9IHNlbGVjdENvbG9yKCk7XG5cbiAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7XG5cbiAgICBhcmdzWzBdID0gZXhwb3J0cy5jb2VyY2UoYXJnc1swXSk7XG5cbiAgICBpZiAoJ3N0cmluZycgIT09IHR5cGVvZiBhcmdzWzBdKSB7XG4gICAgICAvLyBhbnl0aGluZyBlbHNlIGxldCdzIGluc3BlY3Qgd2l0aCAlb1xuICAgICAgYXJncyA9IFsnJW8nXS5jb25jYXQoYXJncyk7XG4gICAgfVxuXG4gICAgLy8gYXBwbHkgYW55IGBmb3JtYXR0ZXJzYCB0cmFuc2Zvcm1hdGlvbnNcbiAgICB2YXIgaW5kZXggPSAwO1xuICAgIGFyZ3NbMF0gPSBhcmdzWzBdLnJlcGxhY2UoLyUoW2EteiVdKS9nLCBmdW5jdGlvbihtYXRjaCwgZm9ybWF0KSB7XG4gICAgICAvLyBpZiB3ZSBlbmNvdW50ZXIgYW4gZXNjYXBlZCAlIHRoZW4gZG9uJ3QgaW5jcmVhc2UgdGhlIGFycmF5IGluZGV4XG4gICAgICBpZiAobWF0Y2ggPT09ICclJScpIHJldHVybiBtYXRjaDtcbiAgICAgIGluZGV4Kys7XG4gICAgICB2YXIgZm9ybWF0dGVyID0gZXhwb3J0cy5mb3JtYXR0ZXJzW2Zvcm1hdF07XG4gICAgICBpZiAoJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIGZvcm1hdHRlcikge1xuICAgICAgICB2YXIgdmFsID0gYXJnc1tpbmRleF07XG4gICAgICAgIG1hdGNoID0gZm9ybWF0dGVyLmNhbGwoc2VsZiwgdmFsKTtcblxuICAgICAgICAvLyBub3cgd2UgbmVlZCB0byByZW1vdmUgYGFyZ3NbaW5kZXhdYCBzaW5jZSBpdCdzIGlubGluZWQgaW4gdGhlIGBmb3JtYXRgXG4gICAgICAgIGFyZ3Muc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgaW5kZXgtLTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBtYXRjaDtcbiAgICB9KTtcblxuICAgIGlmICgnZnVuY3Rpb24nID09PSB0eXBlb2YgZXhwb3J0cy5mb3JtYXRBcmdzKSB7XG4gICAgICBhcmdzID0gZXhwb3J0cy5mb3JtYXRBcmdzLmFwcGx5KHNlbGYsIGFyZ3MpO1xuICAgIH1cbiAgICB2YXIgbG9nRm4gPSBlbmFibGVkLmxvZyB8fCBleHBvcnRzLmxvZyB8fCBjb25zb2xlLmxvZy5iaW5kKGNvbnNvbGUpO1xuICAgIGxvZ0ZuLmFwcGx5KHNlbGYsIGFyZ3MpO1xuICB9XG4gIGVuYWJsZWQuZW5hYmxlZCA9IHRydWU7XG5cbiAgdmFyIGZuID0gZXhwb3J0cy5lbmFibGVkKG5hbWVzcGFjZSkgPyBlbmFibGVkIDogZGlzYWJsZWQ7XG5cbiAgZm4ubmFtZXNwYWNlID0gbmFtZXNwYWNlO1xuXG4gIHJldHVybiBmbjtcbn1cblxuLyoqXG4gKiBFbmFibGVzIGEgZGVidWcgbW9kZSBieSBuYW1lc3BhY2VzLiBUaGlzIGNhbiBpbmNsdWRlIG1vZGVzXG4gKiBzZXBhcmF0ZWQgYnkgYSBjb2xvbiBhbmQgd2lsZGNhcmRzLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lc3BhY2VzXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGVuYWJsZShuYW1lc3BhY2VzKSB7XG4gIGV4cG9ydHMuc2F2ZShuYW1lc3BhY2VzKTtcblxuICB2YXIgc3BsaXQgPSAobmFtZXNwYWNlcyB8fCAnJykuc3BsaXQoL1tcXHMsXSsvKTtcbiAgdmFyIGxlbiA9IHNwbGl0Lmxlbmd0aDtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgaWYgKCFzcGxpdFtpXSkgY29udGludWU7IC8vIGlnbm9yZSBlbXB0eSBzdHJpbmdzXG4gICAgbmFtZXNwYWNlcyA9IHNwbGl0W2ldLnJlcGxhY2UoL1xcKi9nLCAnLio/Jyk7XG4gICAgaWYgKG5hbWVzcGFjZXNbMF0gPT09ICctJykge1xuICAgICAgZXhwb3J0cy5za2lwcy5wdXNoKG5ldyBSZWdFeHAoJ14nICsgbmFtZXNwYWNlcy5zdWJzdHIoMSkgKyAnJCcpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZXhwb3J0cy5uYW1lcy5wdXNoKG5ldyBSZWdFeHAoJ14nICsgbmFtZXNwYWNlcyArICckJykpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIERpc2FibGUgZGVidWcgb3V0cHV0LlxuICpcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gZGlzYWJsZSgpIHtcbiAgZXhwb3J0cy5lbmFibGUoJycpO1xufVxuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gbW9kZSBuYW1lIGlzIGVuYWJsZWQsIGZhbHNlIG90aGVyd2lzZS5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZVxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gZW5hYmxlZChuYW1lKSB7XG4gIHZhciBpLCBsZW47XG4gIGZvciAoaSA9IDAsIGxlbiA9IGV4cG9ydHMuc2tpcHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICBpZiAoZXhwb3J0cy5za2lwc1tpXS50ZXN0KG5hbWUpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIGZvciAoaSA9IDAsIGxlbiA9IGV4cG9ydHMubmFtZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICBpZiAoZXhwb3J0cy5uYW1lc1tpXS50ZXN0KG5hbWUpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIENvZXJjZSBgdmFsYC5cbiAqXG4gKiBAcGFyYW0ge01peGVkfSB2YWxcbiAqIEByZXR1cm4ge01peGVkfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gY29lcmNlKHZhbCkge1xuICBpZiAodmFsIGluc3RhbmNlb2YgRXJyb3IpIHJldHVybiB2YWwuc3RhY2sgfHwgdmFsLm1lc3NhZ2U7XG4gIHJldHVybiB2YWw7XG59XG4iLCJ2YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKVxuICAsIEFic3RyYWN0SXRlcmF0b3IgPSByZXF1aXJlKCdhYnN0cmFjdC1sZXZlbGRvd24nKS5BYnN0cmFjdEl0ZXJhdG9yXG5cblxuZnVuY3Rpb24gRGVmZXJyZWRJdGVyYXRvciAob3B0aW9ucykge1xuICBBYnN0cmFjdEl0ZXJhdG9yLmNhbGwodGhpcywgb3B0aW9ucylcblxuICB0aGlzLl9vcHRpb25zID0gb3B0aW9uc1xuICB0aGlzLl9pdGVyYXRvciA9IG51bGxcbiAgdGhpcy5fb3BlcmF0aW9ucyA9IFtdXG59XG5cbnV0aWwuaW5oZXJpdHMoRGVmZXJyZWRJdGVyYXRvciwgQWJzdHJhY3RJdGVyYXRvcilcblxuRGVmZXJyZWRJdGVyYXRvci5wcm90b3R5cGUuc2V0RGIgPSBmdW5jdGlvbiAoZGIpIHtcbiAgdmFyIGl0ID0gdGhpcy5faXRlcmF0b3IgPSBkYi5pdGVyYXRvcih0aGlzLl9vcHRpb25zKVxuICB0aGlzLl9vcGVyYXRpb25zLmZvckVhY2goZnVuY3Rpb24gKG9wKSB7XG4gICAgaXRbb3AubWV0aG9kXS5hcHBseShpdCwgb3AuYXJncylcbiAgfSlcbn1cblxuRGVmZXJyZWRJdGVyYXRvci5wcm90b3R5cGUuX29wZXJhdGlvbiA9IGZ1bmN0aW9uIChtZXRob2QsIGFyZ3MpIHtcbiAgaWYgKHRoaXMuX2l0ZXJhdG9yKVxuICAgIHJldHVybiB0aGlzLl9pdGVyYXRvclttZXRob2RdLmFwcGx5KHRoaXMuX2l0ZXJhdG9yLCBhcmdzKVxuICB0aGlzLl9vcGVyYXRpb25zLnB1c2goeyBtZXRob2Q6IG1ldGhvZCwgYXJnczogYXJncyB9KVxufVxuXG4nbmV4dCBlbmQnLnNwbGl0KCcgJykuZm9yRWFjaChmdW5jdGlvbiAobSkge1xuICBEZWZlcnJlZEl0ZXJhdG9yLnByb3RvdHlwZVsnXycgKyBtXSA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLl9vcGVyYXRpb24obSwgYXJndW1lbnRzKVxuICB9XG59KVxuXG5tb2R1bGUuZXhwb3J0cyA9IERlZmVycmVkSXRlcmF0b3I7XG4iLCJ2YXIgdXRpbCAgICAgICAgICAgICAgPSByZXF1aXJlKCd1dGlsJylcbiAgLCBBYnN0cmFjdExldmVsRE9XTiA9IHJlcXVpcmUoJ2Fic3RyYWN0LWxldmVsZG93bicpLkFic3RyYWN0TGV2ZWxET1dOXG4gICwgRGVmZXJyZWRJdGVyYXRvciAgPSByZXF1aXJlKCcuL2RlZmVycmVkLWl0ZXJhdG9yJylcblxuZnVuY3Rpb24gRGVmZXJyZWRMZXZlbERPV04gKGxvY2F0aW9uKSB7XG4gIEFic3RyYWN0TGV2ZWxET1dOLmNhbGwodGhpcywgdHlwZW9mIGxvY2F0aW9uID09ICdzdHJpbmcnID8gbG9jYXRpb24gOiAnJykgLy8gb3B0aW9uYWwgbG9jYXRpb24sIHdobyBjYXJlcz9cbiAgdGhpcy5fZGIgICAgICAgICA9IHVuZGVmaW5lZFxuICB0aGlzLl9vcGVyYXRpb25zID0gW11cbiAgdGhpcy5faXRlcmF0b3JzICA9IFtdXG59XG5cbnV0aWwuaW5oZXJpdHMoRGVmZXJyZWRMZXZlbERPV04sIEFic3RyYWN0TGV2ZWxET1dOKVxuXG4vLyBjYWxsZWQgYnkgTGV2ZWxVUCB3aGVuIHdlIGhhdmUgYSByZWFsIERCIHRvIHRha2UgaXRzIHBsYWNlXG5EZWZlcnJlZExldmVsRE9XTi5wcm90b3R5cGUuc2V0RGIgPSBmdW5jdGlvbiAoZGIpIHtcbiAgdGhpcy5fZGIgPSBkYlxuICB0aGlzLl9vcGVyYXRpb25zLmZvckVhY2goZnVuY3Rpb24gKG9wKSB7XG4gICAgZGJbb3AubWV0aG9kXS5hcHBseShkYiwgb3AuYXJncylcbiAgfSlcbiAgdGhpcy5faXRlcmF0b3JzLmZvckVhY2goZnVuY3Rpb24gKGl0KSB7XG4gICAgaXQuc2V0RGIoZGIpXG4gIH0pXG59XG5cbkRlZmVycmVkTGV2ZWxET1dOLnByb3RvdHlwZS5fb3BlbiA9IGZ1bmN0aW9uIChvcHRpb25zLCBjYWxsYmFjaykge1xuICByZXR1cm4gcHJvY2Vzcy5uZXh0VGljayhjYWxsYmFjaylcbn1cblxuLy8gcXVldWUgYSBuZXcgZGVmZXJyZWQgb3BlcmF0aW9uXG5EZWZlcnJlZExldmVsRE9XTi5wcm90b3R5cGUuX29wZXJhdGlvbiA9IGZ1bmN0aW9uIChtZXRob2QsIGFyZ3MpIHtcbiAgaWYgKHRoaXMuX2RiKVxuICAgIHJldHVybiB0aGlzLl9kYlttZXRob2RdLmFwcGx5KHRoaXMuX2RiLCBhcmdzKVxuICB0aGlzLl9vcGVyYXRpb25zLnB1c2goeyBtZXRob2Q6IG1ldGhvZCwgYXJnczogYXJncyB9KVxufVxuXG4vLyBkZWZlcnJhYmxlc1xuJ3B1dCBnZXQgZGVsIGJhdGNoIGFwcHJveGltYXRlU2l6ZScuc3BsaXQoJyAnKS5mb3JFYWNoKGZ1bmN0aW9uIChtKSB7XG4gIERlZmVycmVkTGV2ZWxET1dOLnByb3RvdHlwZVsnXycgKyBtXSA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLl9vcGVyYXRpb24obSwgYXJndW1lbnRzKVxuICB9XG59KVxuXG5EZWZlcnJlZExldmVsRE9XTi5wcm90b3R5cGUuX2lzQnVmZmVyID0gZnVuY3Rpb24gKG9iaikge1xuICByZXR1cm4gQnVmZmVyLmlzQnVmZmVyKG9iailcbn1cblxuRGVmZXJyZWRMZXZlbERPV04ucHJvdG90eXBlLl9pdGVyYXRvciA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gIGlmICh0aGlzLl9kYilcbiAgICByZXR1cm4gdGhpcy5fZGIuaXRlcmF0b3IuYXBwbHkodGhpcy5fZGIsIGFyZ3VtZW50cylcbiAgdmFyIGl0ID0gbmV3IERlZmVycmVkSXRlcmF0b3Iob3B0aW9ucylcbiAgdGhpcy5faXRlcmF0b3JzLnB1c2goaXQpXG4gIHJldHVybiBpdFxufVxuXG5tb2R1bGUuZXhwb3J0cyAgICAgICAgICAgICAgICAgID0gRGVmZXJyZWRMZXZlbERPV05cbm1vZHVsZS5leHBvcnRzLkRlZmVycmVkSXRlcmF0b3IgPSBEZWZlcnJlZEl0ZXJhdG9yXG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoYXJndW1lbnRzW2ldICE9PSB1bmRlZmluZWQpIHJldHVybiBhcmd1bWVudHNbaV07XG4gICAgfVxufTtcbiIsInZhciBzdHJlYW0gPSByZXF1aXJlKCdyZWFkYWJsZS1zdHJlYW0nKVxudmFyIGVvcyA9IHJlcXVpcmUoJ2VuZC1vZi1zdHJlYW0nKVxudmFyIHV0aWwgPSByZXF1aXJlKCd1dGlsJylcblxudmFyIFNJR05BTF9GTFVTSCA9IG5ldyBCdWZmZXIoWzBdKVxuXG52YXIgb251bmNvcmsgPSBmdW5jdGlvbihzZWxmLCBmbikge1xuICBpZiAoc2VsZi5fY29ya2VkKSBzZWxmLm9uY2UoJ3VuY29yaycsIGZuKVxuICBlbHNlIGZuKClcbn1cblxudmFyIGRlc3Ryb3llciA9IGZ1bmN0aW9uKHNlbGYsIGVuZCkge1xuICByZXR1cm4gZnVuY3Rpb24oZXJyKSB7XG4gICAgaWYgKGVycikgc2VsZi5kZXN0cm95KGVyci5tZXNzYWdlID09PSAncHJlbWF0dXJlIGNsb3NlJyA/IG51bGwgOiBlcnIpXG4gICAgZWxzZSBpZiAoZW5kICYmICFzZWxmLl9lbmRlZCkgc2VsZi5lbmQoKVxuICB9XG59XG5cbnZhciBlbmQgPSBmdW5jdGlvbih3cywgZm4pIHtcbiAgaWYgKCF3cykgcmV0dXJuIGZuKClcbiAgaWYgKHdzLl93cml0YWJsZVN0YXRlICYmIHdzLl93cml0YWJsZVN0YXRlLmZpbmlzaGVkKSByZXR1cm4gZm4oKVxuICBpZiAod3MuX3dyaXRhYmxlU3RhdGUpIHJldHVybiB3cy5lbmQoZm4pXG4gIHdzLmVuZCgpXG4gIGZuKClcbn1cblxudmFyIHRvU3RyZWFtczIgPSBmdW5jdGlvbihycykge1xuICByZXR1cm4gbmV3IChzdHJlYW0uUmVhZGFibGUpKHtvYmplY3RNb2RlOnRydWUsIGhpZ2hXYXRlck1hcms6MTZ9KS53cmFwKHJzKVxufVxuXG52YXIgRHVwbGV4aWZ5ID0gZnVuY3Rpb24od3JpdGFibGUsIHJlYWRhYmxlLCBvcHRzKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBEdXBsZXhpZnkpKSByZXR1cm4gbmV3IER1cGxleGlmeSh3cml0YWJsZSwgcmVhZGFibGUsIG9wdHMpXG4gIHN0cmVhbS5EdXBsZXguY2FsbCh0aGlzLCBvcHRzKVxuXG4gIHRoaXMuX3dyaXRhYmxlID0gbnVsbFxuICB0aGlzLl9yZWFkYWJsZSA9IG51bGxcbiAgdGhpcy5fcmVhZGFibGUyID0gbnVsbFxuXG4gIHRoaXMuX2ZvcndhcmREZXN0cm95ID0gIW9wdHMgfHwgb3B0cy5kZXN0cm95ICE9PSBmYWxzZVxuICB0aGlzLl9mb3J3YXJkRW5kID0gIW9wdHMgfHwgb3B0cy5lbmQgIT09IGZhbHNlXG4gIHRoaXMuX2NvcmtlZCA9IDEgLy8gc3RhcnQgY29ya2VkXG4gIHRoaXMuX29uZHJhaW4gPSBudWxsXG4gIHRoaXMuX2RyYWluZWQgPSBmYWxzZVxuICB0aGlzLl9mb3J3YXJkaW5nID0gZmFsc2VcbiAgdGhpcy5fdW53cml0ZSA9IG51bGxcbiAgdGhpcy5fdW5yZWFkID0gbnVsbFxuICB0aGlzLl9lbmRlZCA9IGZhbHNlXG5cbiAgdGhpcy5kZXN0cm95ZWQgPSBmYWxzZVxuXG4gIGlmICh3cml0YWJsZSkgdGhpcy5zZXRXcml0YWJsZSh3cml0YWJsZSlcbiAgaWYgKHJlYWRhYmxlKSB0aGlzLnNldFJlYWRhYmxlKHJlYWRhYmxlKVxufVxuXG51dGlsLmluaGVyaXRzKER1cGxleGlmeSwgc3RyZWFtLkR1cGxleClcblxuRHVwbGV4aWZ5Lm9iaiA9IGZ1bmN0aW9uKHdyaXRhYmxlLCByZWFkYWJsZSwgb3B0cykge1xuICBpZiAoIW9wdHMpIG9wdHMgPSB7fVxuICBvcHRzLm9iamVjdE1vZGUgPSB0cnVlXG4gIG9wdHMuaGlnaFdhdGVyTWFyayA9IDE2XG4gIHJldHVybiBuZXcgRHVwbGV4aWZ5KHdyaXRhYmxlLCByZWFkYWJsZSwgb3B0cylcbn1cblxuRHVwbGV4aWZ5LnByb3RvdHlwZS5jb3JrID0gZnVuY3Rpb24oKSB7XG4gIGlmICgrK3RoaXMuX2NvcmtlZCA9PT0gMSkgdGhpcy5lbWl0KCdjb3JrJylcbn1cblxuRHVwbGV4aWZ5LnByb3RvdHlwZS51bmNvcmsgPSBmdW5jdGlvbigpIHtcbiAgaWYgKHRoaXMuX2NvcmtlZCAmJiAtLXRoaXMuX2NvcmtlZCA9PT0gMCkgdGhpcy5lbWl0KCd1bmNvcmsnKVxufVxuXG5EdXBsZXhpZnkucHJvdG90eXBlLnNldFdyaXRhYmxlID0gZnVuY3Rpb24od3JpdGFibGUpIHtcbiAgaWYgKHRoaXMuX3Vud3JpdGUpIHRoaXMuX3Vud3JpdGUoKVxuXG4gIGlmICh0aGlzLmRlc3Ryb3llZCkge1xuICAgIGlmICh3cml0YWJsZSAmJiB3cml0YWJsZS5kZXN0cm95KSB3cml0YWJsZS5kZXN0cm95KClcbiAgICByZXR1cm5cbiAgfVxuXG4gIGlmICh3cml0YWJsZSA9PT0gbnVsbCB8fCB3cml0YWJsZSA9PT0gZmFsc2UpIHtcbiAgICB0aGlzLmVuZCgpXG4gICAgcmV0dXJuXG4gIH1cblxuICB2YXIgc2VsZiA9IHRoaXNcbiAgdmFyIHVuZW5kID0gZW9zKHdyaXRhYmxlLCB7d3JpdGFibGU6dHJ1ZSwgcmVhZGFibGU6ZmFsc2V9LCBkZXN0cm95ZXIodGhpcywgdGhpcy5fZm9yd2FyZEVuZCkpXG5cbiAgdmFyIG9uZHJhaW4gPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgb25kcmFpbiA9IHNlbGYuX29uZHJhaW5cbiAgICBzZWxmLl9vbmRyYWluID0gbnVsbFxuICAgIGlmIChvbmRyYWluKSBvbmRyYWluKClcbiAgfVxuXG4gIHZhciBjbGVhciA9IGZ1bmN0aW9uKCkge1xuICAgIHNlbGYuX3dyaXRhYmxlLnJlbW92ZUxpc3RlbmVyKCdkcmFpbicsIG9uZHJhaW4pXG4gICAgdW5lbmQoKVxuICB9XG5cbiAgaWYgKHRoaXMuX3Vud3JpdGUpIHByb2Nlc3MubmV4dFRpY2sob25kcmFpbikgLy8gZm9yY2UgYSBkcmFpbiBvbiBzdHJlYW0gcmVzZXQgdG8gYXZvaWQgbGl2ZWxvY2tzXG5cbiAgdGhpcy5fd3JpdGFibGUgPSB3cml0YWJsZVxuICB0aGlzLl93cml0YWJsZS5vbignZHJhaW4nLCBvbmRyYWluKVxuICB0aGlzLl91bndyaXRlID0gY2xlYXJcblxuICB0aGlzLnVuY29yaygpIC8vIGFsd2F5cyB1bmNvcmsgc2V0V3JpdGFibGVcbn1cblxuRHVwbGV4aWZ5LnByb3RvdHlwZS5zZXRSZWFkYWJsZSA9IGZ1bmN0aW9uKHJlYWRhYmxlKSB7XG4gIGlmICh0aGlzLl91bnJlYWQpIHRoaXMuX3VucmVhZCgpXG5cbiAgaWYgKHRoaXMuZGVzdHJveWVkKSB7XG4gICAgaWYgKHJlYWRhYmxlICYmIHJlYWRhYmxlLmRlc3Ryb3kpIHJlYWRhYmxlLmRlc3Ryb3koKVxuICAgIHJldHVyblxuICB9XG5cbiAgaWYgKHJlYWRhYmxlID09PSBudWxsIHx8IHJlYWRhYmxlID09PSBmYWxzZSkge1xuICAgIHRoaXMucHVzaChudWxsKVxuICAgIHRoaXMucmVzdW1lKClcbiAgICByZXR1cm5cbiAgfVxuXG4gIHZhciBzZWxmID0gdGhpc1xuICB2YXIgdW5lbmQgPSBlb3MocmVhZGFibGUsIHt3cml0YWJsZTpmYWxzZSwgcmVhZGFibGU6dHJ1ZX0sIGRlc3Ryb3llcih0aGlzKSlcblxuICB2YXIgb25yZWFkYWJsZSA9IGZ1bmN0aW9uKCkge1xuICAgIHNlbGYuX2ZvcndhcmQoKVxuICB9XG5cbiAgdmFyIG9uZW5kID0gZnVuY3Rpb24oKSB7XG4gICAgc2VsZi5wdXNoKG51bGwpXG4gIH1cblxuICB2YXIgY2xlYXIgPSBmdW5jdGlvbigpIHtcbiAgICBzZWxmLl9yZWFkYWJsZTIucmVtb3ZlTGlzdGVuZXIoJ3JlYWRhYmxlJywgb25yZWFkYWJsZSlcbiAgICBzZWxmLl9yZWFkYWJsZTIucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIG9uZW5kKVxuICAgIHVuZW5kKClcbiAgfVxuXG4gIHRoaXMuX2RyYWluZWQgPSB0cnVlXG4gIHRoaXMuX3JlYWRhYmxlID0gcmVhZGFibGVcbiAgdGhpcy5fcmVhZGFibGUyID0gcmVhZGFibGUuX3JlYWRhYmxlU3RhdGUgPyByZWFkYWJsZSA6IHRvU3RyZWFtczIocmVhZGFibGUpXG4gIHRoaXMuX3JlYWRhYmxlMi5vbigncmVhZGFibGUnLCBvbnJlYWRhYmxlKVxuICB0aGlzLl9yZWFkYWJsZTIub24oJ2VuZCcsIG9uZW5kKVxuICB0aGlzLl91bnJlYWQgPSBjbGVhclxuXG4gIHRoaXMuX2ZvcndhcmQoKVxufVxuXG5EdXBsZXhpZnkucHJvdG90eXBlLl9yZWFkID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuX2RyYWluZWQgPSB0cnVlXG4gIHRoaXMuX2ZvcndhcmQoKVxufVxuXG5EdXBsZXhpZnkucHJvdG90eXBlLl9mb3J3YXJkID0gZnVuY3Rpb24oKSB7XG4gIGlmICh0aGlzLl9mb3J3YXJkaW5nIHx8ICF0aGlzLl9yZWFkYWJsZTIgfHwgIXRoaXMuX2RyYWluZWQpIHJldHVyblxuICB0aGlzLl9mb3J3YXJkaW5nID0gdHJ1ZVxuXG4gIHZhciBkYXRhXG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlMi5fcmVhZGFibGVTdGF0ZVxuXG4gIHdoaWxlICgoZGF0YSA9IHRoaXMuX3JlYWRhYmxlMi5yZWFkKHN0YXRlLmJ1ZmZlci5sZW5ndGggPyBzdGF0ZS5idWZmZXJbMF0ubGVuZ3RoIDogc3RhdGUubGVuZ3RoKSkgIT09IG51bGwpIHtcbiAgICB0aGlzLl9kcmFpbmVkID0gdGhpcy5wdXNoKGRhdGEpXG4gIH1cblxuICB0aGlzLl9mb3J3YXJkaW5nID0gZmFsc2Vcbn1cblxuRHVwbGV4aWZ5LnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24oZXJyKSB7XG4gIGlmICh0aGlzLmRlc3Ryb3llZCkgcmV0dXJuXG4gIHRoaXMuZGVzdHJveWVkID0gdHJ1ZVxuXG4gIHZhciBzZWxmID0gdGhpc1xuICBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uKCkge1xuICAgIHNlbGYuX2Rlc3Ryb3koZXJyKVxuICB9KVxufVxuXG5EdXBsZXhpZnkucHJvdG90eXBlLl9kZXN0cm95ID0gZnVuY3Rpb24oZXJyKSB7XG4gIGlmIChlcnIpIHtcbiAgICB2YXIgb25kcmFpbiA9IHRoaXMuX29uZHJhaW5cbiAgICB0aGlzLl9vbmRyYWluID0gbnVsbFxuICAgIGlmIChvbmRyYWluKSBvbmRyYWluKGVycilcbiAgICBlbHNlIHRoaXMuZW1pdCgnZXJyb3InLCBlcnIpXG4gIH1cblxuICBpZiAodGhpcy5fZm9yd2FyZERlc3Ryb3kpIHtcbiAgICBpZiAodGhpcy5fcmVhZGFibGUgJiYgdGhpcy5fcmVhZGFibGUuZGVzdHJveSkgdGhpcy5fcmVhZGFibGUuZGVzdHJveSgpXG4gICAgaWYgKHRoaXMuX3dyaXRhYmxlICYmIHRoaXMuX3dyaXRhYmxlLmRlc3Ryb3kpIHRoaXMuX3dyaXRhYmxlLmRlc3Ryb3koKVxuICB9XG5cbiAgdGhpcy5lbWl0KCdjbG9zZScpXG59XG5cbkR1cGxleGlmeS5wcm90b3R5cGUuX3dyaXRlID0gZnVuY3Rpb24oZGF0YSwgZW5jLCBjYikge1xuICBpZiAodGhpcy5kZXN0cm95ZWQpIHJldHVybiBjYigpXG4gIGlmICh0aGlzLl9jb3JrZWQpIHJldHVybiBvbnVuY29yayh0aGlzLCB0aGlzLl93cml0ZS5iaW5kKHRoaXMsIGRhdGEsIGVuYywgY2IpKVxuICBpZiAoZGF0YSA9PT0gU0lHTkFMX0ZMVVNIKSByZXR1cm4gdGhpcy5fZmluaXNoKGNiKVxuICBpZiAoIXRoaXMuX3dyaXRhYmxlKSByZXR1cm4gY2IoKVxuXG4gIGlmICh0aGlzLl93cml0YWJsZS53cml0ZShkYXRhKSA9PT0gZmFsc2UpIHRoaXMuX29uZHJhaW4gPSBjYlxuICBlbHNlIGNiKClcbn1cblxuXG5EdXBsZXhpZnkucHJvdG90eXBlLl9maW5pc2ggPSBmdW5jdGlvbihjYikge1xuICB2YXIgc2VsZiA9IHRoaXNcbiAgdGhpcy5lbWl0KCdwcmVlbmQnKVxuICBvbnVuY29yayh0aGlzLCBmdW5jdGlvbigpIHtcbiAgICBlbmQoc2VsZi5fZm9yd2FyZEVuZCAmJiBzZWxmLl93cml0YWJsZSwgZnVuY3Rpb24oKSB7XG4gICAgICAvLyBoYXh4IHRvIG5vdCBlbWl0IHByZWZpbmlzaCB0d2ljZVxuICAgICAgaWYgKHNlbGYuX3dyaXRhYmxlU3RhdGUucHJlZmluaXNoZWQgPT09IGZhbHNlKSBzZWxmLl93cml0YWJsZVN0YXRlLnByZWZpbmlzaGVkID0gdHJ1ZVxuICAgICAgc2VsZi5lbWl0KCdwcmVmaW5pc2gnKVxuICAgICAgb251bmNvcmsoc2VsZiwgY2IpXG4gICAgfSlcbiAgfSlcbn1cblxuRHVwbGV4aWZ5LnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbihkYXRhLCBlbmMsIGNiKSB7XG4gIGlmICh0eXBlb2YgZGF0YSA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIHRoaXMuZW5kKG51bGwsIG51bGwsIGRhdGEpXG4gIGlmICh0eXBlb2YgZW5jID09PSAnZnVuY3Rpb24nKSByZXR1cm4gdGhpcy5lbmQoZGF0YSwgbnVsbCwgZW5jKVxuICB0aGlzLl9lbmRlZCA9IHRydWVcbiAgaWYgKGRhdGEpIHRoaXMud3JpdGUoZGF0YSlcbiAgaWYgKCF0aGlzLl93cml0YWJsZVN0YXRlLmVuZGluZykgdGhpcy53cml0ZShTSUdOQUxfRkxVU0gpXG4gIHJldHVybiBzdHJlYW0uV3JpdGFibGUucHJvdG90eXBlLmVuZC5jYWxsKHRoaXMsIGNiKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IER1cGxleGlmeSIsInZhciBvbmNlID0gcmVxdWlyZSgnb25jZScpO1xuXG52YXIgbm9vcCA9IGZ1bmN0aW9uKCkge307XG5cbnZhciBpc1JlcXVlc3QgPSBmdW5jdGlvbihzdHJlYW0pIHtcblx0cmV0dXJuIHN0cmVhbS5zZXRIZWFkZXIgJiYgdHlwZW9mIHN0cmVhbS5hYm9ydCA9PT0gJ2Z1bmN0aW9uJztcbn07XG5cbnZhciBlb3MgPSBmdW5jdGlvbihzdHJlYW0sIG9wdHMsIGNhbGxiYWNrKSB7XG5cdGlmICh0eXBlb2Ygb3B0cyA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIGVvcyhzdHJlYW0sIG51bGwsIG9wdHMpO1xuXHRpZiAoIW9wdHMpIG9wdHMgPSB7fTtcblxuXHRjYWxsYmFjayA9IG9uY2UoY2FsbGJhY2sgfHwgbm9vcCk7XG5cblx0dmFyIHdzID0gc3RyZWFtLl93cml0YWJsZVN0YXRlO1xuXHR2YXIgcnMgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGU7XG5cdHZhciByZWFkYWJsZSA9IG9wdHMucmVhZGFibGUgfHwgKG9wdHMucmVhZGFibGUgIT09IGZhbHNlICYmIHN0cmVhbS5yZWFkYWJsZSk7XG5cdHZhciB3cml0YWJsZSA9IG9wdHMud3JpdGFibGUgfHwgKG9wdHMud3JpdGFibGUgIT09IGZhbHNlICYmIHN0cmVhbS53cml0YWJsZSk7XG5cblx0dmFyIG9ubGVnYWN5ZmluaXNoID0gZnVuY3Rpb24oKSB7XG5cdFx0aWYgKCFzdHJlYW0ud3JpdGFibGUpIG9uZmluaXNoKCk7XG5cdH07XG5cblx0dmFyIG9uZmluaXNoID0gZnVuY3Rpb24oKSB7XG5cdFx0d3JpdGFibGUgPSBmYWxzZTtcblx0XHRpZiAoIXJlYWRhYmxlKSBjYWxsYmFjaygpO1xuXHR9O1xuXG5cdHZhciBvbmVuZCA9IGZ1bmN0aW9uKCkge1xuXHRcdHJlYWRhYmxlID0gZmFsc2U7XG5cdFx0aWYgKCF3cml0YWJsZSkgY2FsbGJhY2soKTtcblx0fTtcblxuXHR2YXIgb25jbG9zZSA9IGZ1bmN0aW9uKCkge1xuXHRcdGlmIChyZWFkYWJsZSAmJiAhKHJzICYmIHJzLmVuZGVkKSkgcmV0dXJuIGNhbGxiYWNrKG5ldyBFcnJvcigncHJlbWF0dXJlIGNsb3NlJykpO1xuXHRcdGlmICh3cml0YWJsZSAmJiAhKHdzICYmIHdzLmVuZGVkKSkgcmV0dXJuIGNhbGxiYWNrKG5ldyBFcnJvcigncHJlbWF0dXJlIGNsb3NlJykpO1xuXHR9O1xuXG5cdHZhciBvbnJlcXVlc3QgPSBmdW5jdGlvbigpIHtcblx0XHRzdHJlYW0ucmVxLm9uKCdmaW5pc2gnLCBvbmZpbmlzaCk7XG5cdH07XG5cblx0aWYgKGlzUmVxdWVzdChzdHJlYW0pKSB7XG5cdFx0c3RyZWFtLm9uKCdjb21wbGV0ZScsIG9uZmluaXNoKTtcblx0XHRzdHJlYW0ub24oJ2Fib3J0Jywgb25jbG9zZSk7XG5cdFx0aWYgKHN0cmVhbS5yZXEpIG9ucmVxdWVzdCgpO1xuXHRcdGVsc2Ugc3RyZWFtLm9uKCdyZXF1ZXN0Jywgb25yZXF1ZXN0KTtcblx0fSBlbHNlIGlmICh3cml0YWJsZSAmJiAhd3MpIHsgLy8gbGVnYWN5IHN0cmVhbXNcblx0XHRzdHJlYW0ub24oJ2VuZCcsIG9ubGVnYWN5ZmluaXNoKTtcblx0XHRzdHJlYW0ub24oJ2Nsb3NlJywgb25sZWdhY3lmaW5pc2gpO1xuXHR9XG5cblx0c3RyZWFtLm9uKCdlbmQnLCBvbmVuZCk7XG5cdHN0cmVhbS5vbignZmluaXNoJywgb25maW5pc2gpO1xuXHRpZiAob3B0cy5lcnJvciAhPT0gZmFsc2UpIHN0cmVhbS5vbignZXJyb3InLCBjYWxsYmFjayk7XG5cdHN0cmVhbS5vbignY2xvc2UnLCBvbmNsb3NlKTtcblxuXHRyZXR1cm4gZnVuY3Rpb24oKSB7XG5cdFx0c3RyZWFtLnJlbW92ZUxpc3RlbmVyKCdjb21wbGV0ZScsIG9uZmluaXNoKTtcblx0XHRzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoJ2Fib3J0Jywgb25jbG9zZSk7XG5cdFx0c3RyZWFtLnJlbW92ZUxpc3RlbmVyKCdyZXF1ZXN0Jywgb25yZXF1ZXN0KTtcblx0XHRpZiAoc3RyZWFtLnJlcSkgc3RyZWFtLnJlcS5yZW1vdmVMaXN0ZW5lcignZmluaXNoJywgb25maW5pc2gpO1xuXHRcdHN0cmVhbS5yZW1vdmVMaXN0ZW5lcignZW5kJywgb25sZWdhY3lmaW5pc2gpO1xuXHRcdHN0cmVhbS5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLCBvbmxlZ2FjeWZpbmlzaCk7XG5cdFx0c3RyZWFtLnJlbW92ZUxpc3RlbmVyKCdmaW5pc2gnLCBvbmZpbmlzaCk7XG5cdFx0c3RyZWFtLnJlbW92ZUxpc3RlbmVyKCdlbmQnLCBvbmVuZCk7XG5cdFx0c3RyZWFtLnJlbW92ZUxpc3RlbmVyKCdlcnJvcicsIGNhbGxiYWNrKTtcblx0XHRzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoJ2Nsb3NlJywgb25jbG9zZSk7XG5cdH07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGVvczsiLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhZGFibGU7XG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgcHJvY2Vzc05leHRUaWNrID0gcmVxdWlyZSgncHJvY2Vzcy1uZXh0aWNrLWFyZ3MnKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgaXNBcnJheSA9IHJlcXVpcmUoJ2lzYXJyYXknKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgQnVmZmVyID0gcmVxdWlyZSgnYnVmZmVyJykuQnVmZmVyO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cblJlYWRhYmxlLlJlYWRhYmxlU3RhdGUgPSBSZWFkYWJsZVN0YXRlO1xuXG52YXIgRUUgPSByZXF1aXJlKCdldmVudHMnKTtcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBFRWxpc3RlbmVyQ291bnQgPSBmdW5jdGlvbihlbWl0dGVyLCB0eXBlKSB7XG4gIHJldHVybiBlbWl0dGVyLmxpc3RlbmVycyh0eXBlKS5sZW5ndGg7XG59O1xuLyo8L3JlcGxhY2VtZW50PiovXG5cblxuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIFN0cmVhbTtcbihmdW5jdGlvbiAoKXt0cnl7XG4gIFN0cmVhbSA9IHJlcXVpcmUoJ3N0JyArICdyZWFtJyk7XG59Y2F0Y2goXyl7fWZpbmFsbHl7XG4gIGlmICghU3RyZWFtKVxuICAgIFN0cmVhbSA9IHJlcXVpcmUoJ2V2ZW50cycpLkV2ZW50RW1pdHRlcjtcbn19KCkpXG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ2J1ZmZlcicpLkJ1ZmZlcjtcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciB1dGlsID0gcmVxdWlyZSgnY29yZS11dGlsLWlzJyk7XG51dGlsLmluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG5cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBkZWJ1Z1V0aWwgPSByZXF1aXJlKCd1dGlsJyk7XG52YXIgZGVidWc7XG5pZiAoZGVidWdVdGlsICYmIGRlYnVnVXRpbC5kZWJ1Z2xvZykge1xuICBkZWJ1ZyA9IGRlYnVnVXRpbC5kZWJ1Z2xvZygnc3RyZWFtJyk7XG59IGVsc2Uge1xuICBkZWJ1ZyA9IGZ1bmN0aW9uICgpIHt9O1xufVxuLyo8L3JlcGxhY2VtZW50PiovXG5cbnZhciBTdHJpbmdEZWNvZGVyO1xuXG51dGlsLmluaGVyaXRzKFJlYWRhYmxlLCBTdHJlYW0pO1xuXG52YXIgRHVwbGV4O1xuZnVuY3Rpb24gUmVhZGFibGVTdGF0ZShvcHRpb25zLCBzdHJlYW0pIHtcbiAgRHVwbGV4ID0gRHVwbGV4IHx8IHJlcXVpcmUoJy4vX3N0cmVhbV9kdXBsZXgnKTtcblxuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAvLyBvYmplY3Qgc3RyZWFtIGZsYWcuIFVzZWQgdG8gbWFrZSByZWFkKG4pIGlnbm9yZSBuIGFuZCB0b1xuICAvLyBtYWtlIGFsbCB0aGUgYnVmZmVyIG1lcmdpbmcgYW5kIGxlbmd0aCBjaGVja3MgZ28gYXdheVxuICB0aGlzLm9iamVjdE1vZGUgPSAhIW9wdGlvbnMub2JqZWN0TW9kZTtcblxuICBpZiAoc3RyZWFtIGluc3RhbmNlb2YgRHVwbGV4KVxuICAgIHRoaXMub2JqZWN0TW9kZSA9IHRoaXMub2JqZWN0TW9kZSB8fCAhIW9wdGlvbnMucmVhZGFibGVPYmplY3RNb2RlO1xuXG4gIC8vIHRoZSBwb2ludCBhdCB3aGljaCBpdCBzdG9wcyBjYWxsaW5nIF9yZWFkKCkgdG8gZmlsbCB0aGUgYnVmZmVyXG4gIC8vIE5vdGU6IDAgaXMgYSB2YWxpZCB2YWx1ZSwgbWVhbnMgXCJkb24ndCBjYWxsIF9yZWFkIHByZWVtcHRpdmVseSBldmVyXCJcbiAgdmFyIGh3bSA9IG9wdGlvbnMuaGlnaFdhdGVyTWFyaztcbiAgdmFyIGRlZmF1bHRId20gPSB0aGlzLm9iamVjdE1vZGUgPyAxNiA6IDE2ICogMTAyNDtcbiAgdGhpcy5oaWdoV2F0ZXJNYXJrID0gKGh3bSB8fCBod20gPT09IDApID8gaHdtIDogZGVmYXVsdEh3bTtcblxuICAvLyBjYXN0IHRvIGludHMuXG4gIHRoaXMuaGlnaFdhdGVyTWFyayA9IH5+dGhpcy5oaWdoV2F0ZXJNYXJrO1xuXG4gIHRoaXMuYnVmZmVyID0gW107XG4gIHRoaXMubGVuZ3RoID0gMDtcbiAgdGhpcy5waXBlcyA9IG51bGw7XG4gIHRoaXMucGlwZXNDb3VudCA9IDA7XG4gIHRoaXMuZmxvd2luZyA9IG51bGw7XG4gIHRoaXMuZW5kZWQgPSBmYWxzZTtcbiAgdGhpcy5lbmRFbWl0dGVkID0gZmFsc2U7XG4gIHRoaXMucmVhZGluZyA9IGZhbHNlO1xuXG4gIC8vIGEgZmxhZyB0byBiZSBhYmxlIHRvIHRlbGwgaWYgdGhlIG9ud3JpdGUgY2IgaXMgY2FsbGVkIGltbWVkaWF0ZWx5LFxuICAvLyBvciBvbiBhIGxhdGVyIHRpY2suICBXZSBzZXQgdGhpcyB0byB0cnVlIGF0IGZpcnN0LCBiZWNhdXNlIGFueVxuICAvLyBhY3Rpb25zIHRoYXQgc2hvdWxkbid0IGhhcHBlbiB1bnRpbCBcImxhdGVyXCIgc2hvdWxkIGdlbmVyYWxseSBhbHNvXG4gIC8vIG5vdCBoYXBwZW4gYmVmb3JlIHRoZSBmaXJzdCB3cml0ZSBjYWxsLlxuICB0aGlzLnN5bmMgPSB0cnVlO1xuXG4gIC8vIHdoZW5ldmVyIHdlIHJldHVybiBudWxsLCB0aGVuIHdlIHNldCBhIGZsYWcgdG8gc2F5XG4gIC8vIHRoYXQgd2UncmUgYXdhaXRpbmcgYSAncmVhZGFibGUnIGV2ZW50IGVtaXNzaW9uLlxuICB0aGlzLm5lZWRSZWFkYWJsZSA9IGZhbHNlO1xuICB0aGlzLmVtaXR0ZWRSZWFkYWJsZSA9IGZhbHNlO1xuICB0aGlzLnJlYWRhYmxlTGlzdGVuaW5nID0gZmFsc2U7XG5cbiAgLy8gQ3J5cHRvIGlzIGtpbmQgb2Ygb2xkIGFuZCBjcnVzdHkuICBIaXN0b3JpY2FsbHksIGl0cyBkZWZhdWx0IHN0cmluZ1xuICAvLyBlbmNvZGluZyBpcyAnYmluYXJ5JyBzbyB3ZSBoYXZlIHRvIG1ha2UgdGhpcyBjb25maWd1cmFibGUuXG4gIC8vIEV2ZXJ5dGhpbmcgZWxzZSBpbiB0aGUgdW5pdmVyc2UgdXNlcyAndXRmOCcsIHRob3VnaC5cbiAgdGhpcy5kZWZhdWx0RW5jb2RpbmcgPSBvcHRpb25zLmRlZmF1bHRFbmNvZGluZyB8fCAndXRmOCc7XG5cbiAgLy8gd2hlbiBwaXBpbmcsIHdlIG9ubHkgY2FyZSBhYm91dCAncmVhZGFibGUnIGV2ZW50cyB0aGF0IGhhcHBlblxuICAvLyBhZnRlciByZWFkKClpbmcgYWxsIHRoZSBieXRlcyBhbmQgbm90IGdldHRpbmcgYW55IHB1c2hiYWNrLlxuICB0aGlzLnJhbk91dCA9IGZhbHNlO1xuXG4gIC8vIHRoZSBudW1iZXIgb2Ygd3JpdGVycyB0aGF0IGFyZSBhd2FpdGluZyBhIGRyYWluIGV2ZW50IGluIC5waXBlKClzXG4gIHRoaXMuYXdhaXREcmFpbiA9IDA7XG5cbiAgLy8gaWYgdHJ1ZSwgYSBtYXliZVJlYWRNb3JlIGhhcyBiZWVuIHNjaGVkdWxlZFxuICB0aGlzLnJlYWRpbmdNb3JlID0gZmFsc2U7XG5cbiAgdGhpcy5kZWNvZGVyID0gbnVsbDtcbiAgdGhpcy5lbmNvZGluZyA9IG51bGw7XG4gIGlmIChvcHRpb25zLmVuY29kaW5nKSB7XG4gICAgaWYgKCFTdHJpbmdEZWNvZGVyKVxuICAgICAgU3RyaW5nRGVjb2RlciA9IHJlcXVpcmUoJ3N0cmluZ19kZWNvZGVyLycpLlN0cmluZ0RlY29kZXI7XG4gICAgdGhpcy5kZWNvZGVyID0gbmV3IFN0cmluZ0RlY29kZXIob3B0aW9ucy5lbmNvZGluZyk7XG4gICAgdGhpcy5lbmNvZGluZyA9IG9wdGlvbnMuZW5jb2Rpbmc7XG4gIH1cbn1cblxudmFyIER1cGxleDtcbmZ1bmN0aW9uIFJlYWRhYmxlKG9wdGlvbnMpIHtcbiAgRHVwbGV4ID0gRHVwbGV4IHx8IHJlcXVpcmUoJy4vX3N0cmVhbV9kdXBsZXgnKTtcblxuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgUmVhZGFibGUpKVxuICAgIHJldHVybiBuZXcgUmVhZGFibGUob3B0aW9ucyk7XG5cbiAgdGhpcy5fcmVhZGFibGVTdGF0ZSA9IG5ldyBSZWFkYWJsZVN0YXRlKG9wdGlvbnMsIHRoaXMpO1xuXG4gIC8vIGxlZ2FjeVxuICB0aGlzLnJlYWRhYmxlID0gdHJ1ZTtcblxuICBpZiAob3B0aW9ucyAmJiB0eXBlb2Ygb3B0aW9ucy5yZWFkID09PSAnZnVuY3Rpb24nKVxuICAgIHRoaXMuX3JlYWQgPSBvcHRpb25zLnJlYWQ7XG5cbiAgU3RyZWFtLmNhbGwodGhpcyk7XG59XG5cbi8vIE1hbnVhbGx5IHNob3ZlIHNvbWV0aGluZyBpbnRvIHRoZSByZWFkKCkgYnVmZmVyLlxuLy8gVGhpcyByZXR1cm5zIHRydWUgaWYgdGhlIGhpZ2hXYXRlck1hcmsgaGFzIG5vdCBiZWVuIGhpdCB5ZXQsXG4vLyBzaW1pbGFyIHRvIGhvdyBXcml0YWJsZS53cml0ZSgpIHJldHVybnMgdHJ1ZSBpZiB5b3Ugc2hvdWxkXG4vLyB3cml0ZSgpIHNvbWUgbW9yZS5cblJlYWRhYmxlLnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24oY2h1bmssIGVuY29kaW5nKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG5cbiAgaWYgKCFzdGF0ZS5vYmplY3RNb2RlICYmIHR5cGVvZiBjaHVuayA9PT0gJ3N0cmluZycpIHtcbiAgICBlbmNvZGluZyA9IGVuY29kaW5nIHx8IHN0YXRlLmRlZmF1bHRFbmNvZGluZztcbiAgICBpZiAoZW5jb2RpbmcgIT09IHN0YXRlLmVuY29kaW5nKSB7XG4gICAgICBjaHVuayA9IG5ldyBCdWZmZXIoY2h1bmssIGVuY29kaW5nKTtcbiAgICAgIGVuY29kaW5nID0gJyc7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlYWRhYmxlQWRkQ2h1bmsodGhpcywgc3RhdGUsIGNodW5rLCBlbmNvZGluZywgZmFsc2UpO1xufTtcblxuLy8gVW5zaGlmdCBzaG91bGQgKmFsd2F5cyogYmUgc29tZXRoaW5nIGRpcmVjdGx5IG91dCBvZiByZWFkKClcblJlYWRhYmxlLnByb3RvdHlwZS51bnNoaWZ0ID0gZnVuY3Rpb24oY2h1bmspIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgcmV0dXJuIHJlYWRhYmxlQWRkQ2h1bmsodGhpcywgc3RhdGUsIGNodW5rLCAnJywgdHJ1ZSk7XG59O1xuXG5SZWFkYWJsZS5wcm90b3R5cGUuaXNQYXVzZWQgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyA9PT0gZmFsc2U7XG59O1xuXG5mdW5jdGlvbiByZWFkYWJsZUFkZENodW5rKHN0cmVhbSwgc3RhdGUsIGNodW5rLCBlbmNvZGluZywgYWRkVG9Gcm9udCkge1xuICB2YXIgZXIgPSBjaHVua0ludmFsaWQoc3RhdGUsIGNodW5rKTtcbiAgaWYgKGVyKSB7XG4gICAgc3RyZWFtLmVtaXQoJ2Vycm9yJywgZXIpO1xuICB9IGVsc2UgaWYgKGNodW5rID09PSBudWxsKSB7XG4gICAgc3RhdGUucmVhZGluZyA9IGZhbHNlO1xuICAgIG9uRW9mQ2h1bmsoc3RyZWFtLCBzdGF0ZSk7XG4gIH0gZWxzZSBpZiAoc3RhdGUub2JqZWN0TW9kZSB8fCBjaHVuayAmJiBjaHVuay5sZW5ndGggPiAwKSB7XG4gICAgaWYgKHN0YXRlLmVuZGVkICYmICFhZGRUb0Zyb250KSB7XG4gICAgICB2YXIgZSA9IG5ldyBFcnJvcignc3RyZWFtLnB1c2goKSBhZnRlciBFT0YnKTtcbiAgICAgIHN0cmVhbS5lbWl0KCdlcnJvcicsIGUpO1xuICAgIH0gZWxzZSBpZiAoc3RhdGUuZW5kRW1pdHRlZCAmJiBhZGRUb0Zyb250KSB7XG4gICAgICB2YXIgZSA9IG5ldyBFcnJvcignc3RyZWFtLnVuc2hpZnQoKSBhZnRlciBlbmQgZXZlbnQnKTtcbiAgICAgIHN0cmVhbS5lbWl0KCdlcnJvcicsIGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoc3RhdGUuZGVjb2RlciAmJiAhYWRkVG9Gcm9udCAmJiAhZW5jb2RpbmcpXG4gICAgICAgIGNodW5rID0gc3RhdGUuZGVjb2Rlci53cml0ZShjaHVuayk7XG5cbiAgICAgIGlmICghYWRkVG9Gcm9udClcbiAgICAgICAgc3RhdGUucmVhZGluZyA9IGZhbHNlO1xuXG4gICAgICAvLyBpZiB3ZSB3YW50IHRoZSBkYXRhIG5vdywganVzdCBlbWl0IGl0LlxuICAgICAgaWYgKHN0YXRlLmZsb3dpbmcgJiYgc3RhdGUubGVuZ3RoID09PSAwICYmICFzdGF0ZS5zeW5jKSB7XG4gICAgICAgIHN0cmVhbS5lbWl0KCdkYXRhJywgY2h1bmspO1xuICAgICAgICBzdHJlYW0ucmVhZCgwKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHVwZGF0ZSB0aGUgYnVmZmVyIGluZm8uXG4gICAgICAgIHN0YXRlLmxlbmd0aCArPSBzdGF0ZS5vYmplY3RNb2RlID8gMSA6IGNodW5rLmxlbmd0aDtcbiAgICAgICAgaWYgKGFkZFRvRnJvbnQpXG4gICAgICAgICAgc3RhdGUuYnVmZmVyLnVuc2hpZnQoY2h1bmspO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgc3RhdGUuYnVmZmVyLnB1c2goY2h1bmspO1xuXG4gICAgICAgIGlmIChzdGF0ZS5uZWVkUmVhZGFibGUpXG4gICAgICAgICAgZW1pdFJlYWRhYmxlKHN0cmVhbSk7XG4gICAgICB9XG5cbiAgICAgIG1heWJlUmVhZE1vcmUoc3RyZWFtLCBzdGF0ZSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKCFhZGRUb0Zyb250KSB7XG4gICAgc3RhdGUucmVhZGluZyA9IGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIG5lZWRNb3JlRGF0YShzdGF0ZSk7XG59XG5cblxuLy8gaWYgaXQncyBwYXN0IHRoZSBoaWdoIHdhdGVyIG1hcmssIHdlIGNhbiBwdXNoIGluIHNvbWUgbW9yZS5cbi8vIEFsc28sIGlmIHdlIGhhdmUgbm8gZGF0YSB5ZXQsIHdlIGNhbiBzdGFuZCBzb21lXG4vLyBtb3JlIGJ5dGVzLiAgVGhpcyBpcyB0byB3b3JrIGFyb3VuZCBjYXNlcyB3aGVyZSBod209MCxcbi8vIHN1Y2ggYXMgdGhlIHJlcGwuICBBbHNvLCBpZiB0aGUgcHVzaCgpIHRyaWdnZXJlZCBhXG4vLyByZWFkYWJsZSBldmVudCwgYW5kIHRoZSB1c2VyIGNhbGxlZCByZWFkKGxhcmdlTnVtYmVyKSBzdWNoIHRoYXRcbi8vIG5lZWRSZWFkYWJsZSB3YXMgc2V0LCB0aGVuIHdlIG91Z2h0IHRvIHB1c2ggbW9yZSwgc28gdGhhdCBhbm90aGVyXG4vLyAncmVhZGFibGUnIGV2ZW50IHdpbGwgYmUgdHJpZ2dlcmVkLlxuZnVuY3Rpb24gbmVlZE1vcmVEYXRhKHN0YXRlKSB7XG4gIHJldHVybiAhc3RhdGUuZW5kZWQgJiZcbiAgICAgICAgIChzdGF0ZS5uZWVkUmVhZGFibGUgfHxcbiAgICAgICAgICBzdGF0ZS5sZW5ndGggPCBzdGF0ZS5oaWdoV2F0ZXJNYXJrIHx8XG4gICAgICAgICAgc3RhdGUubGVuZ3RoID09PSAwKTtcbn1cblxuLy8gYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuXG5SZWFkYWJsZS5wcm90b3R5cGUuc2V0RW5jb2RpbmcgPSBmdW5jdGlvbihlbmMpIHtcbiAgaWYgKCFTdHJpbmdEZWNvZGVyKVxuICAgIFN0cmluZ0RlY29kZXIgPSByZXF1aXJlKCdzdHJpbmdfZGVjb2Rlci8nKS5TdHJpbmdEZWNvZGVyO1xuICB0aGlzLl9yZWFkYWJsZVN0YXRlLmRlY29kZXIgPSBuZXcgU3RyaW5nRGVjb2RlcihlbmMpO1xuICB0aGlzLl9yZWFkYWJsZVN0YXRlLmVuY29kaW5nID0gZW5jO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8vIERvbid0IHJhaXNlIHRoZSBod20gPiA4TUJcbnZhciBNQVhfSFdNID0gMHg4MDAwMDA7XG5mdW5jdGlvbiBjb21wdXRlTmV3SGlnaFdhdGVyTWFyayhuKSB7XG4gIGlmIChuID49IE1BWF9IV00pIHtcbiAgICBuID0gTUFYX0hXTTtcbiAgfSBlbHNlIHtcbiAgICAvLyBHZXQgdGhlIG5leHQgaGlnaGVzdCBwb3dlciBvZiAyXG4gICAgbi0tO1xuICAgIG4gfD0gbiA+Pj4gMTtcbiAgICBuIHw9IG4gPj4+IDI7XG4gICAgbiB8PSBuID4+PiA0O1xuICAgIG4gfD0gbiA+Pj4gODtcbiAgICBuIHw9IG4gPj4+IDE2O1xuICAgIG4rKztcbiAgfVxuICByZXR1cm4gbjtcbn1cblxuZnVuY3Rpb24gaG93TXVjaFRvUmVhZChuLCBzdGF0ZSkge1xuICBpZiAoc3RhdGUubGVuZ3RoID09PSAwICYmIHN0YXRlLmVuZGVkKVxuICAgIHJldHVybiAwO1xuXG4gIGlmIChzdGF0ZS5vYmplY3RNb2RlKVxuICAgIHJldHVybiBuID09PSAwID8gMCA6IDE7XG5cbiAgaWYgKG4gPT09IG51bGwgfHwgaXNOYU4obikpIHtcbiAgICAvLyBvbmx5IGZsb3cgb25lIGJ1ZmZlciBhdCBhIHRpbWVcbiAgICBpZiAoc3RhdGUuZmxvd2luZyAmJiBzdGF0ZS5idWZmZXIubGVuZ3RoKVxuICAgICAgcmV0dXJuIHN0YXRlLmJ1ZmZlclswXS5sZW5ndGg7XG4gICAgZWxzZVxuICAgICAgcmV0dXJuIHN0YXRlLmxlbmd0aDtcbiAgfVxuXG4gIGlmIChuIDw9IDApXG4gICAgcmV0dXJuIDA7XG5cbiAgLy8gSWYgd2UncmUgYXNraW5nIGZvciBtb3JlIHRoYW4gdGhlIHRhcmdldCBidWZmZXIgbGV2ZWwsXG4gIC8vIHRoZW4gcmFpc2UgdGhlIHdhdGVyIG1hcmsuICBCdW1wIHVwIHRvIHRoZSBuZXh0IGhpZ2hlc3RcbiAgLy8gcG93ZXIgb2YgMiwgdG8gcHJldmVudCBpbmNyZWFzaW5nIGl0IGV4Y2Vzc2l2ZWx5IGluIHRpbnlcbiAgLy8gYW1vdW50cy5cbiAgaWYgKG4gPiBzdGF0ZS5oaWdoV2F0ZXJNYXJrKVxuICAgIHN0YXRlLmhpZ2hXYXRlck1hcmsgPSBjb21wdXRlTmV3SGlnaFdhdGVyTWFyayhuKTtcblxuICAvLyBkb24ndCBoYXZlIHRoYXQgbXVjaC4gIHJldHVybiBudWxsLCB1bmxlc3Mgd2UndmUgZW5kZWQuXG4gIGlmIChuID4gc3RhdGUubGVuZ3RoKSB7XG4gICAgaWYgKCFzdGF0ZS5lbmRlZCkge1xuICAgICAgc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICAgIHJldHVybiAwO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gc3RhdGUubGVuZ3RoO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuO1xufVxuXG4vLyB5b3UgY2FuIG92ZXJyaWRlIGVpdGhlciB0aGlzIG1ldGhvZCwgb3IgdGhlIGFzeW5jIF9yZWFkKG4pIGJlbG93LlxuUmVhZGFibGUucHJvdG90eXBlLnJlYWQgPSBmdW5jdGlvbihuKSB7XG4gIGRlYnVnKCdyZWFkJywgbik7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gIHZhciBuT3JpZyA9IG47XG5cbiAgaWYgKHR5cGVvZiBuICE9PSAnbnVtYmVyJyB8fCBuID4gMClcbiAgICBzdGF0ZS5lbWl0dGVkUmVhZGFibGUgPSBmYWxzZTtcblxuICAvLyBpZiB3ZSdyZSBkb2luZyByZWFkKDApIHRvIHRyaWdnZXIgYSByZWFkYWJsZSBldmVudCwgYnV0IHdlXG4gIC8vIGFscmVhZHkgaGF2ZSBhIGJ1bmNoIG9mIGRhdGEgaW4gdGhlIGJ1ZmZlciwgdGhlbiBqdXN0IHRyaWdnZXJcbiAgLy8gdGhlICdyZWFkYWJsZScgZXZlbnQgYW5kIG1vdmUgb24uXG4gIGlmIChuID09PSAwICYmXG4gICAgICBzdGF0ZS5uZWVkUmVhZGFibGUgJiZcbiAgICAgIChzdGF0ZS5sZW5ndGggPj0gc3RhdGUuaGlnaFdhdGVyTWFyayB8fCBzdGF0ZS5lbmRlZCkpIHtcbiAgICBkZWJ1ZygncmVhZDogZW1pdFJlYWRhYmxlJywgc3RhdGUubGVuZ3RoLCBzdGF0ZS5lbmRlZCk7XG4gICAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCAmJiBzdGF0ZS5lbmRlZClcbiAgICAgIGVuZFJlYWRhYmxlKHRoaXMpO1xuICAgIGVsc2VcbiAgICAgIGVtaXRSZWFkYWJsZSh0aGlzKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIG4gPSBob3dNdWNoVG9SZWFkKG4sIHN0YXRlKTtcblxuICAvLyBpZiB3ZSd2ZSBlbmRlZCwgYW5kIHdlJ3JlIG5vdyBjbGVhciwgdGhlbiBmaW5pc2ggaXQgdXAuXG4gIGlmIChuID09PSAwICYmIHN0YXRlLmVuZGVkKSB7XG4gICAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMClcbiAgICAgIGVuZFJlYWRhYmxlKHRoaXMpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLy8gQWxsIHRoZSBhY3R1YWwgY2h1bmsgZ2VuZXJhdGlvbiBsb2dpYyBuZWVkcyB0byBiZVxuICAvLyAqYmVsb3cqIHRoZSBjYWxsIHRvIF9yZWFkLiAgVGhlIHJlYXNvbiBpcyB0aGF0IGluIGNlcnRhaW5cbiAgLy8gc3ludGhldGljIHN0cmVhbSBjYXNlcywgc3VjaCBhcyBwYXNzdGhyb3VnaCBzdHJlYW1zLCBfcmVhZFxuICAvLyBtYXkgYmUgYSBjb21wbGV0ZWx5IHN5bmNocm9ub3VzIG9wZXJhdGlvbiB3aGljaCBtYXkgY2hhbmdlXG4gIC8vIHRoZSBzdGF0ZSBvZiB0aGUgcmVhZCBidWZmZXIsIHByb3ZpZGluZyBlbm91Z2ggZGF0YSB3aGVuXG4gIC8vIGJlZm9yZSB0aGVyZSB3YXMgKm5vdCogZW5vdWdoLlxuICAvL1xuICAvLyBTbywgdGhlIHN0ZXBzIGFyZTpcbiAgLy8gMS4gRmlndXJlIG91dCB3aGF0IHRoZSBzdGF0ZSBvZiB0aGluZ3Mgd2lsbCBiZSBhZnRlciB3ZSBkb1xuICAvLyBhIHJlYWQgZnJvbSB0aGUgYnVmZmVyLlxuICAvL1xuICAvLyAyLiBJZiB0aGF0IHJlc3VsdGluZyBzdGF0ZSB3aWxsIHRyaWdnZXIgYSBfcmVhZCwgdGhlbiBjYWxsIF9yZWFkLlxuICAvLyBOb3RlIHRoYXQgdGhpcyBtYXkgYmUgYXN5bmNocm9ub3VzLCBvciBzeW5jaHJvbm91cy4gIFllcywgaXQgaXNcbiAgLy8gZGVlcGx5IHVnbHkgdG8gd3JpdGUgQVBJcyB0aGlzIHdheSwgYnV0IHRoYXQgc3RpbGwgZG9lc24ndCBtZWFuXG4gIC8vIHRoYXQgdGhlIFJlYWRhYmxlIGNsYXNzIHNob3VsZCBiZWhhdmUgaW1wcm9wZXJseSwgYXMgc3RyZWFtcyBhcmVcbiAgLy8gZGVzaWduZWQgdG8gYmUgc3luYy9hc3luYyBhZ25vc3RpYy5cbiAgLy8gVGFrZSBub3RlIGlmIHRoZSBfcmVhZCBjYWxsIGlzIHN5bmMgb3IgYXN5bmMgKGllLCBpZiB0aGUgcmVhZCBjYWxsXG4gIC8vIGhhcyByZXR1cm5lZCB5ZXQpLCBzbyB0aGF0IHdlIGtub3cgd2hldGhlciBvciBub3QgaXQncyBzYWZlIHRvIGVtaXRcbiAgLy8gJ3JlYWRhYmxlJyBldGMuXG4gIC8vXG4gIC8vIDMuIEFjdHVhbGx5IHB1bGwgdGhlIHJlcXVlc3RlZCBjaHVua3Mgb3V0IG9mIHRoZSBidWZmZXIgYW5kIHJldHVybi5cblxuICAvLyBpZiB3ZSBuZWVkIGEgcmVhZGFibGUgZXZlbnQsIHRoZW4gd2UgbmVlZCB0byBkbyBzb21lIHJlYWRpbmcuXG4gIHZhciBkb1JlYWQgPSBzdGF0ZS5uZWVkUmVhZGFibGU7XG4gIGRlYnVnKCduZWVkIHJlYWRhYmxlJywgZG9SZWFkKTtcblxuICAvLyBpZiB3ZSBjdXJyZW50bHkgaGF2ZSBsZXNzIHRoYW4gdGhlIGhpZ2hXYXRlck1hcmssIHRoZW4gYWxzbyByZWFkIHNvbWVcbiAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCB8fCBzdGF0ZS5sZW5ndGggLSBuIDwgc3RhdGUuaGlnaFdhdGVyTWFyaykge1xuICAgIGRvUmVhZCA9IHRydWU7XG4gICAgZGVidWcoJ2xlbmd0aCBsZXNzIHRoYW4gd2F0ZXJtYXJrJywgZG9SZWFkKTtcbiAgfVxuXG4gIC8vIGhvd2V2ZXIsIGlmIHdlJ3ZlIGVuZGVkLCB0aGVuIHRoZXJlJ3Mgbm8gcG9pbnQsIGFuZCBpZiB3ZSdyZSBhbHJlYWR5XG4gIC8vIHJlYWRpbmcsIHRoZW4gaXQncyB1bm5lY2Vzc2FyeS5cbiAgaWYgKHN0YXRlLmVuZGVkIHx8IHN0YXRlLnJlYWRpbmcpIHtcbiAgICBkb1JlYWQgPSBmYWxzZTtcbiAgICBkZWJ1ZygncmVhZGluZyBvciBlbmRlZCcsIGRvUmVhZCk7XG4gIH1cblxuICBpZiAoZG9SZWFkKSB7XG4gICAgZGVidWcoJ2RvIHJlYWQnKTtcbiAgICBzdGF0ZS5yZWFkaW5nID0gdHJ1ZTtcbiAgICBzdGF0ZS5zeW5jID0gdHJ1ZTtcbiAgICAvLyBpZiB0aGUgbGVuZ3RoIGlzIGN1cnJlbnRseSB6ZXJvLCB0aGVuIHdlICpuZWVkKiBhIHJlYWRhYmxlIGV2ZW50LlxuICAgIGlmIChzdGF0ZS5sZW5ndGggPT09IDApXG4gICAgICBzdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlO1xuICAgIC8vIGNhbGwgaW50ZXJuYWwgcmVhZCBtZXRob2RcbiAgICB0aGlzLl9yZWFkKHN0YXRlLmhpZ2hXYXRlck1hcmspO1xuICAgIHN0YXRlLnN5bmMgPSBmYWxzZTtcbiAgfVxuXG4gIC8vIElmIF9yZWFkIHB1c2hlZCBkYXRhIHN5bmNocm9ub3VzbHksIHRoZW4gYHJlYWRpbmdgIHdpbGwgYmUgZmFsc2UsXG4gIC8vIGFuZCB3ZSBuZWVkIHRvIHJlLWV2YWx1YXRlIGhvdyBtdWNoIGRhdGEgd2UgY2FuIHJldHVybiB0byB0aGUgdXNlci5cbiAgaWYgKGRvUmVhZCAmJiAhc3RhdGUucmVhZGluZylcbiAgICBuID0gaG93TXVjaFRvUmVhZChuT3JpZywgc3RhdGUpO1xuXG4gIHZhciByZXQ7XG4gIGlmIChuID4gMClcbiAgICByZXQgPSBmcm9tTGlzdChuLCBzdGF0ZSk7XG4gIGVsc2VcbiAgICByZXQgPSBudWxsO1xuXG4gIGlmIChyZXQgPT09IG51bGwpIHtcbiAgICBzdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlO1xuICAgIG4gPSAwO1xuICB9XG5cbiAgc3RhdGUubGVuZ3RoIC09IG47XG5cbiAgLy8gSWYgd2UgaGF2ZSBub3RoaW5nIGluIHRoZSBidWZmZXIsIHRoZW4gd2Ugd2FudCB0byBrbm93XG4gIC8vIGFzIHNvb24gYXMgd2UgKmRvKiBnZXQgc29tZXRoaW5nIGludG8gdGhlIGJ1ZmZlci5cbiAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCAmJiAhc3RhdGUuZW5kZWQpXG4gICAgc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcblxuICAvLyBJZiB3ZSB0cmllZCB0byByZWFkKCkgcGFzdCB0aGUgRU9GLCB0aGVuIGVtaXQgZW5kIG9uIHRoZSBuZXh0IHRpY2suXG4gIGlmIChuT3JpZyAhPT0gbiAmJiBzdGF0ZS5lbmRlZCAmJiBzdGF0ZS5sZW5ndGggPT09IDApXG4gICAgZW5kUmVhZGFibGUodGhpcyk7XG5cbiAgaWYgKHJldCAhPT0gbnVsbClcbiAgICB0aGlzLmVtaXQoJ2RhdGEnLCByZXQpO1xuXG4gIHJldHVybiByZXQ7XG59O1xuXG5mdW5jdGlvbiBjaHVua0ludmFsaWQoc3RhdGUsIGNodW5rKSB7XG4gIHZhciBlciA9IG51bGw7XG4gIGlmICghKEJ1ZmZlci5pc0J1ZmZlcihjaHVuaykpICYmXG4gICAgICB0eXBlb2YgY2h1bmsgIT09ICdzdHJpbmcnICYmXG4gICAgICBjaHVuayAhPT0gbnVsbCAmJlxuICAgICAgY2h1bmsgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgIXN0YXRlLm9iamVjdE1vZGUpIHtcbiAgICBlciA9IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgbm9uLXN0cmluZy9idWZmZXIgY2h1bmsnKTtcbiAgfVxuICByZXR1cm4gZXI7XG59XG5cblxuZnVuY3Rpb24gb25Fb2ZDaHVuayhzdHJlYW0sIHN0YXRlKSB7XG4gIGlmIChzdGF0ZS5lbmRlZCkgcmV0dXJuO1xuICBpZiAoc3RhdGUuZGVjb2Rlcikge1xuICAgIHZhciBjaHVuayA9IHN0YXRlLmRlY29kZXIuZW5kKCk7XG4gICAgaWYgKGNodW5rICYmIGNodW5rLmxlbmd0aCkge1xuICAgICAgc3RhdGUuYnVmZmVyLnB1c2goY2h1bmspO1xuICAgICAgc3RhdGUubGVuZ3RoICs9IHN0YXRlLm9iamVjdE1vZGUgPyAxIDogY2h1bmsubGVuZ3RoO1xuICAgIH1cbiAgfVxuICBzdGF0ZS5lbmRlZCA9IHRydWU7XG5cbiAgLy8gZW1pdCAncmVhZGFibGUnIG5vdyB0byBtYWtlIHN1cmUgaXQgZ2V0cyBwaWNrZWQgdXAuXG4gIGVtaXRSZWFkYWJsZShzdHJlYW0pO1xufVxuXG4vLyBEb24ndCBlbWl0IHJlYWRhYmxlIHJpZ2h0IGF3YXkgaW4gc3luYyBtb2RlLCBiZWNhdXNlIHRoaXMgY2FuIHRyaWdnZXJcbi8vIGFub3RoZXIgcmVhZCgpIGNhbGwgPT4gc3RhY2sgb3ZlcmZsb3cuICBUaGlzIHdheSwgaXQgbWlnaHQgdHJpZ2dlclxuLy8gYSBuZXh0VGljayByZWN1cnNpb24gd2FybmluZywgYnV0IHRoYXQncyBub3Qgc28gYmFkLlxuZnVuY3Rpb24gZW1pdFJlYWRhYmxlKHN0cmVhbSkge1xuICB2YXIgc3RhdGUgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGU7XG4gIHN0YXRlLm5lZWRSZWFkYWJsZSA9IGZhbHNlO1xuICBpZiAoIXN0YXRlLmVtaXR0ZWRSZWFkYWJsZSkge1xuICAgIGRlYnVnKCdlbWl0UmVhZGFibGUnLCBzdGF0ZS5mbG93aW5nKTtcbiAgICBzdGF0ZS5lbWl0dGVkUmVhZGFibGUgPSB0cnVlO1xuICAgIGlmIChzdGF0ZS5zeW5jKVxuICAgICAgcHJvY2Vzc05leHRUaWNrKGVtaXRSZWFkYWJsZV8sIHN0cmVhbSk7XG4gICAgZWxzZVxuICAgICAgZW1pdFJlYWRhYmxlXyhzdHJlYW0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGVtaXRSZWFkYWJsZV8oc3RyZWFtKSB7XG4gIGRlYnVnKCdlbWl0IHJlYWRhYmxlJyk7XG4gIHN0cmVhbS5lbWl0KCdyZWFkYWJsZScpO1xuICBmbG93KHN0cmVhbSk7XG59XG5cblxuLy8gYXQgdGhpcyBwb2ludCwgdGhlIHVzZXIgaGFzIHByZXN1bWFibHkgc2VlbiB0aGUgJ3JlYWRhYmxlJyBldmVudCxcbi8vIGFuZCBjYWxsZWQgcmVhZCgpIHRvIGNvbnN1bWUgc29tZSBkYXRhLiAgdGhhdCBtYXkgaGF2ZSB0cmlnZ2VyZWRcbi8vIGluIHR1cm4gYW5vdGhlciBfcmVhZChuKSBjYWxsLCBpbiB3aGljaCBjYXNlIHJlYWRpbmcgPSB0cnVlIGlmXG4vLyBpdCdzIGluIHByb2dyZXNzLlxuLy8gSG93ZXZlciwgaWYgd2UncmUgbm90IGVuZGVkLCBvciByZWFkaW5nLCBhbmQgdGhlIGxlbmd0aCA8IGh3bSxcbi8vIHRoZW4gZ28gYWhlYWQgYW5kIHRyeSB0byByZWFkIHNvbWUgbW9yZSBwcmVlbXB0aXZlbHkuXG5mdW5jdGlvbiBtYXliZVJlYWRNb3JlKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKCFzdGF0ZS5yZWFkaW5nTW9yZSkge1xuICAgIHN0YXRlLnJlYWRpbmdNb3JlID0gdHJ1ZTtcbiAgICBwcm9jZXNzTmV4dFRpY2sobWF5YmVSZWFkTW9yZV8sIHN0cmVhbSwgc3RhdGUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1heWJlUmVhZE1vcmVfKHN0cmVhbSwgc3RhdGUpIHtcbiAgdmFyIGxlbiA9IHN0YXRlLmxlbmd0aDtcbiAgd2hpbGUgKCFzdGF0ZS5yZWFkaW5nICYmICFzdGF0ZS5mbG93aW5nICYmICFzdGF0ZS5lbmRlZCAmJlxuICAgICAgICAgc3RhdGUubGVuZ3RoIDwgc3RhdGUuaGlnaFdhdGVyTWFyaykge1xuICAgIGRlYnVnKCdtYXliZVJlYWRNb3JlIHJlYWQgMCcpO1xuICAgIHN0cmVhbS5yZWFkKDApO1xuICAgIGlmIChsZW4gPT09IHN0YXRlLmxlbmd0aClcbiAgICAgIC8vIGRpZG4ndCBnZXQgYW55IGRhdGEsIHN0b3Agc3Bpbm5pbmcuXG4gICAgICBicmVhaztcbiAgICBlbHNlXG4gICAgICBsZW4gPSBzdGF0ZS5sZW5ndGg7XG4gIH1cbiAgc3RhdGUucmVhZGluZ01vcmUgPSBmYWxzZTtcbn1cblxuLy8gYWJzdHJhY3QgbWV0aG9kLiAgdG8gYmUgb3ZlcnJpZGRlbiBpbiBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBjbGFzc2VzLlxuLy8gY2FsbCBjYihlciwgZGF0YSkgd2hlcmUgZGF0YSBpcyA8PSBuIGluIGxlbmd0aC5cbi8vIGZvciB2aXJ0dWFsIChub24tc3RyaW5nLCBub24tYnVmZmVyKSBzdHJlYW1zLCBcImxlbmd0aFwiIGlzIHNvbWV3aGF0XG4vLyBhcmJpdHJhcnksIGFuZCBwZXJoYXBzIG5vdCB2ZXJ5IG1lYW5pbmdmdWwuXG5SZWFkYWJsZS5wcm90b3R5cGUuX3JlYWQgPSBmdW5jdGlvbihuKSB7XG4gIHRoaXMuZW1pdCgnZXJyb3InLCBuZXcgRXJyb3IoJ25vdCBpbXBsZW1lbnRlZCcpKTtcbn07XG5cblJlYWRhYmxlLnByb3RvdHlwZS5waXBlID0gZnVuY3Rpb24oZGVzdCwgcGlwZU9wdHMpIHtcbiAgdmFyIHNyYyA9IHRoaXM7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG5cbiAgc3dpdGNoIChzdGF0ZS5waXBlc0NvdW50KSB7XG4gICAgY2FzZSAwOlxuICAgICAgc3RhdGUucGlwZXMgPSBkZXN0O1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAxOlxuICAgICAgc3RhdGUucGlwZXMgPSBbc3RhdGUucGlwZXMsIGRlc3RdO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHN0YXRlLnBpcGVzLnB1c2goZGVzdCk7XG4gICAgICBicmVhaztcbiAgfVxuICBzdGF0ZS5waXBlc0NvdW50ICs9IDE7XG4gIGRlYnVnKCdwaXBlIGNvdW50PSVkIG9wdHM9JWonLCBzdGF0ZS5waXBlc0NvdW50LCBwaXBlT3B0cyk7XG5cbiAgdmFyIGRvRW5kID0gKCFwaXBlT3B0cyB8fCBwaXBlT3B0cy5lbmQgIT09IGZhbHNlKSAmJlxuICAgICAgICAgICAgICBkZXN0ICE9PSBwcm9jZXNzLnN0ZG91dCAmJlxuICAgICAgICAgICAgICBkZXN0ICE9PSBwcm9jZXNzLnN0ZGVycjtcblxuICB2YXIgZW5kRm4gPSBkb0VuZCA/IG9uZW5kIDogY2xlYW51cDtcbiAgaWYgKHN0YXRlLmVuZEVtaXR0ZWQpXG4gICAgcHJvY2Vzc05leHRUaWNrKGVuZEZuKTtcbiAgZWxzZVxuICAgIHNyYy5vbmNlKCdlbmQnLCBlbmRGbik7XG5cbiAgZGVzdC5vbigndW5waXBlJywgb251bnBpcGUpO1xuICBmdW5jdGlvbiBvbnVucGlwZShyZWFkYWJsZSkge1xuICAgIGRlYnVnKCdvbnVucGlwZScpO1xuICAgIGlmIChyZWFkYWJsZSA9PT0gc3JjKSB7XG4gICAgICBjbGVhbnVwKCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gb25lbmQoKSB7XG4gICAgZGVidWcoJ29uZW5kJyk7XG4gICAgZGVzdC5lbmQoKTtcbiAgfVxuXG4gIC8vIHdoZW4gdGhlIGRlc3QgZHJhaW5zLCBpdCByZWR1Y2VzIHRoZSBhd2FpdERyYWluIGNvdW50ZXJcbiAgLy8gb24gdGhlIHNvdXJjZS4gIFRoaXMgd291bGQgYmUgbW9yZSBlbGVnYW50IHdpdGggYSAub25jZSgpXG4gIC8vIGhhbmRsZXIgaW4gZmxvdygpLCBidXQgYWRkaW5nIGFuZCByZW1vdmluZyByZXBlYXRlZGx5IGlzXG4gIC8vIHRvbyBzbG93LlxuICB2YXIgb25kcmFpbiA9IHBpcGVPbkRyYWluKHNyYyk7XG4gIGRlc3Qub24oJ2RyYWluJywgb25kcmFpbik7XG5cbiAgdmFyIGNsZWFuZWRVcCA9IGZhbHNlO1xuICBmdW5jdGlvbiBjbGVhbnVwKCkge1xuICAgIGRlYnVnKCdjbGVhbnVwJyk7XG4gICAgLy8gY2xlYW51cCBldmVudCBoYW5kbGVycyBvbmNlIHRoZSBwaXBlIGlzIGJyb2tlblxuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2Nsb3NlJywgb25jbG9zZSk7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZmluaXNoJywgb25maW5pc2gpO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2RyYWluJywgb25kcmFpbik7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBvbmVycm9yKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCd1bnBpcGUnLCBvbnVucGlwZSk7XG4gICAgc3JjLnJlbW92ZUxpc3RlbmVyKCdlbmQnLCBvbmVuZCk7XG4gICAgc3JjLnJlbW92ZUxpc3RlbmVyKCdlbmQnLCBjbGVhbnVwKTtcbiAgICBzcmMucmVtb3ZlTGlzdGVuZXIoJ2RhdGEnLCBvbmRhdGEpO1xuXG4gICAgY2xlYW5lZFVwID0gdHJ1ZTtcblxuICAgIC8vIGlmIHRoZSByZWFkZXIgaXMgd2FpdGluZyBmb3IgYSBkcmFpbiBldmVudCBmcm9tIHRoaXNcbiAgICAvLyBzcGVjaWZpYyB3cml0ZXIsIHRoZW4gaXQgd291bGQgY2F1c2UgaXQgdG8gbmV2ZXIgc3RhcnRcbiAgICAvLyBmbG93aW5nIGFnYWluLlxuICAgIC8vIFNvLCBpZiB0aGlzIGlzIGF3YWl0aW5nIGEgZHJhaW4sIHRoZW4gd2UganVzdCBjYWxsIGl0IG5vdy5cbiAgICAvLyBJZiB3ZSBkb24ndCBrbm93LCB0aGVuIGFzc3VtZSB0aGF0IHdlIGFyZSB3YWl0aW5nIGZvciBvbmUuXG4gICAgaWYgKHN0YXRlLmF3YWl0RHJhaW4gJiZcbiAgICAgICAgKCFkZXN0Ll93cml0YWJsZVN0YXRlIHx8IGRlc3QuX3dyaXRhYmxlU3RhdGUubmVlZERyYWluKSlcbiAgICAgIG9uZHJhaW4oKTtcbiAgfVxuXG4gIHNyYy5vbignZGF0YScsIG9uZGF0YSk7XG4gIGZ1bmN0aW9uIG9uZGF0YShjaHVuaykge1xuICAgIGRlYnVnKCdvbmRhdGEnKTtcbiAgICB2YXIgcmV0ID0gZGVzdC53cml0ZShjaHVuayk7XG4gICAgaWYgKGZhbHNlID09PSByZXQpIHtcbiAgICAgIC8vIElmIHRoZSB1c2VyIHVucGlwZWQgZHVyaW5nIGBkZXN0LndyaXRlKClgLCBpdCBpcyBwb3NzaWJsZVxuICAgICAgLy8gdG8gZ2V0IHN0dWNrIGluIGEgcGVybWFuZW50bHkgcGF1c2VkIHN0YXRlIGlmIHRoYXQgd3JpdGVcbiAgICAgIC8vIGFsc28gcmV0dXJuZWQgZmFsc2UuXG4gICAgICBpZiAoc3RhdGUucGlwZXNDb3VudCA9PT0gMSAmJlxuICAgICAgICAgIHN0YXRlLnBpcGVzWzBdID09PSBkZXN0ICYmXG4gICAgICAgICAgc3JjLmxpc3RlbmVyQ291bnQoJ2RhdGEnKSA9PT0gMSAmJlxuICAgICAgICAgICFjbGVhbmVkVXApIHtcbiAgICAgICAgZGVidWcoJ2ZhbHNlIHdyaXRlIHJlc3BvbnNlLCBwYXVzZScsIHNyYy5fcmVhZGFibGVTdGF0ZS5hd2FpdERyYWluKTtcbiAgICAgICAgc3JjLl9yZWFkYWJsZVN0YXRlLmF3YWl0RHJhaW4rKztcbiAgICAgIH1cbiAgICAgIHNyYy5wYXVzZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8vIGlmIHRoZSBkZXN0IGhhcyBhbiBlcnJvciwgdGhlbiBzdG9wIHBpcGluZyBpbnRvIGl0LlxuICAvLyBob3dldmVyLCBkb24ndCBzdXBwcmVzcyB0aGUgdGhyb3dpbmcgYmVoYXZpb3IgZm9yIHRoaXMuXG4gIGZ1bmN0aW9uIG9uZXJyb3IoZXIpIHtcbiAgICBkZWJ1Zygnb25lcnJvcicsIGVyKTtcbiAgICB1bnBpcGUoKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdlcnJvcicsIG9uZXJyb3IpO1xuICAgIGlmIChFRWxpc3RlbmVyQ291bnQoZGVzdCwgJ2Vycm9yJykgPT09IDApXG4gICAgICBkZXN0LmVtaXQoJ2Vycm9yJywgZXIpO1xuICB9XG4gIC8vIFRoaXMgaXMgYSBicnV0YWxseSB1Z2x5IGhhY2sgdG8gbWFrZSBzdXJlIHRoYXQgb3VyIGVycm9yIGhhbmRsZXJcbiAgLy8gaXMgYXR0YWNoZWQgYmVmb3JlIGFueSB1c2VybGFuZCBvbmVzLiAgTkVWRVIgRE8gVEhJUy5cbiAgaWYgKCFkZXN0Ll9ldmVudHMgfHwgIWRlc3QuX2V2ZW50cy5lcnJvcilcbiAgICBkZXN0Lm9uKCdlcnJvcicsIG9uZXJyb3IpO1xuICBlbHNlIGlmIChpc0FycmF5KGRlc3QuX2V2ZW50cy5lcnJvcikpXG4gICAgZGVzdC5fZXZlbnRzLmVycm9yLnVuc2hpZnQob25lcnJvcik7XG4gIGVsc2VcbiAgICBkZXN0Ll9ldmVudHMuZXJyb3IgPSBbb25lcnJvciwgZGVzdC5fZXZlbnRzLmVycm9yXTtcblxuXG4gIC8vIEJvdGggY2xvc2UgYW5kIGZpbmlzaCBzaG91bGQgdHJpZ2dlciB1bnBpcGUsIGJ1dCBvbmx5IG9uY2UuXG4gIGZ1bmN0aW9uIG9uY2xvc2UoKSB7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZmluaXNoJywgb25maW5pc2gpO1xuICAgIHVucGlwZSgpO1xuICB9XG4gIGRlc3Qub25jZSgnY2xvc2UnLCBvbmNsb3NlKTtcbiAgZnVuY3Rpb24gb25maW5pc2goKSB7XG4gICAgZGVidWcoJ29uZmluaXNoJyk7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLCBvbmNsb3NlKTtcbiAgICB1bnBpcGUoKTtcbiAgfVxuICBkZXN0Lm9uY2UoJ2ZpbmlzaCcsIG9uZmluaXNoKTtcblxuICBmdW5jdGlvbiB1bnBpcGUoKSB7XG4gICAgZGVidWcoJ3VucGlwZScpO1xuICAgIHNyYy51bnBpcGUoZGVzdCk7XG4gIH1cblxuICAvLyB0ZWxsIHRoZSBkZXN0IHRoYXQgaXQncyBiZWluZyBwaXBlZCB0b1xuICBkZXN0LmVtaXQoJ3BpcGUnLCBzcmMpO1xuXG4gIC8vIHN0YXJ0IHRoZSBmbG93IGlmIGl0IGhhc24ndCBiZWVuIHN0YXJ0ZWQgYWxyZWFkeS5cbiAgaWYgKCFzdGF0ZS5mbG93aW5nKSB7XG4gICAgZGVidWcoJ3BpcGUgcmVzdW1lJyk7XG4gICAgc3JjLnJlc3VtZSgpO1xuICB9XG5cbiAgcmV0dXJuIGRlc3Q7XG59O1xuXG5mdW5jdGlvbiBwaXBlT25EcmFpbihzcmMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBzdGF0ZSA9IHNyYy5fcmVhZGFibGVTdGF0ZTtcbiAgICBkZWJ1ZygncGlwZU9uRHJhaW4nLCBzdGF0ZS5hd2FpdERyYWluKTtcbiAgICBpZiAoc3RhdGUuYXdhaXREcmFpbilcbiAgICAgIHN0YXRlLmF3YWl0RHJhaW4tLTtcbiAgICBpZiAoc3RhdGUuYXdhaXREcmFpbiA9PT0gMCAmJiBFRWxpc3RlbmVyQ291bnQoc3JjLCAnZGF0YScpKSB7XG4gICAgICBzdGF0ZS5mbG93aW5nID0gdHJ1ZTtcbiAgICAgIGZsb3coc3JjKTtcbiAgICB9XG4gIH07XG59XG5cblxuUmVhZGFibGUucHJvdG90eXBlLnVucGlwZSA9IGZ1bmN0aW9uKGRlc3QpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcblxuICAvLyBpZiB3ZSdyZSBub3QgcGlwaW5nIGFueXdoZXJlLCB0aGVuIGRvIG5vdGhpbmcuXG4gIGlmIChzdGF0ZS5waXBlc0NvdW50ID09PSAwKVxuICAgIHJldHVybiB0aGlzO1xuXG4gIC8vIGp1c3Qgb25lIGRlc3RpbmF0aW9uLiAgbW9zdCBjb21tb24gY2FzZS5cbiAgaWYgKHN0YXRlLnBpcGVzQ291bnQgPT09IDEpIHtcbiAgICAvLyBwYXNzZWQgaW4gb25lLCBidXQgaXQncyBub3QgdGhlIHJpZ2h0IG9uZS5cbiAgICBpZiAoZGVzdCAmJiBkZXN0ICE9PSBzdGF0ZS5waXBlcylcbiAgICAgIHJldHVybiB0aGlzO1xuXG4gICAgaWYgKCFkZXN0KVxuICAgICAgZGVzdCA9IHN0YXRlLnBpcGVzO1xuXG4gICAgLy8gZ290IGEgbWF0Y2guXG4gICAgc3RhdGUucGlwZXMgPSBudWxsO1xuICAgIHN0YXRlLnBpcGVzQ291bnQgPSAwO1xuICAgIHN0YXRlLmZsb3dpbmcgPSBmYWxzZTtcbiAgICBpZiAoZGVzdClcbiAgICAgIGRlc3QuZW1pdCgndW5waXBlJywgdGhpcyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBzbG93IGNhc2UuIG11bHRpcGxlIHBpcGUgZGVzdGluYXRpb25zLlxuXG4gIGlmICghZGVzdCkge1xuICAgIC8vIHJlbW92ZSBhbGwuXG4gICAgdmFyIGRlc3RzID0gc3RhdGUucGlwZXM7XG4gICAgdmFyIGxlbiA9IHN0YXRlLnBpcGVzQ291bnQ7XG4gICAgc3RhdGUucGlwZXMgPSBudWxsO1xuICAgIHN0YXRlLnBpcGVzQ291bnQgPSAwO1xuICAgIHN0YXRlLmZsb3dpbmcgPSBmYWxzZTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspXG4gICAgICBkZXN0c1tpXS5lbWl0KCd1bnBpcGUnLCB0aGlzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIHRyeSB0byBmaW5kIHRoZSByaWdodCBvbmUuXG4gIHZhciBpID0gaW5kZXhPZihzdGF0ZS5waXBlcywgZGVzdCk7XG4gIGlmIChpID09PSAtMSlcbiAgICByZXR1cm4gdGhpcztcblxuICBzdGF0ZS5waXBlcy5zcGxpY2UoaSwgMSk7XG4gIHN0YXRlLnBpcGVzQ291bnQgLT0gMTtcbiAgaWYgKHN0YXRlLnBpcGVzQ291bnQgPT09IDEpXG4gICAgc3RhdGUucGlwZXMgPSBzdGF0ZS5waXBlc1swXTtcblxuICBkZXN0LmVtaXQoJ3VucGlwZScsIHRoaXMpO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLy8gc2V0IHVwIGRhdGEgZXZlbnRzIGlmIHRoZXkgYXJlIGFza2VkIGZvclxuLy8gRW5zdXJlIHJlYWRhYmxlIGxpc3RlbmVycyBldmVudHVhbGx5IGdldCBzb21ldGhpbmdcblJlYWRhYmxlLnByb3RvdHlwZS5vbiA9IGZ1bmN0aW9uKGV2LCBmbikge1xuICB2YXIgcmVzID0gU3RyZWFtLnByb3RvdHlwZS5vbi5jYWxsKHRoaXMsIGV2LCBmbik7XG5cbiAgLy8gSWYgbGlzdGVuaW5nIHRvIGRhdGEsIGFuZCBpdCBoYXMgbm90IGV4cGxpY2l0bHkgYmVlbiBwYXVzZWQsXG4gIC8vIHRoZW4gY2FsbCByZXN1bWUgdG8gc3RhcnQgdGhlIGZsb3cgb2YgZGF0YSBvbiB0aGUgbmV4dCB0aWNrLlxuICBpZiAoZXYgPT09ICdkYXRhJyAmJiBmYWxzZSAhPT0gdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nKSB7XG4gICAgdGhpcy5yZXN1bWUoKTtcbiAgfVxuXG4gIGlmIChldiA9PT0gJ3JlYWRhYmxlJyAmJiB0aGlzLnJlYWRhYmxlKSB7XG4gICAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgICBpZiAoIXN0YXRlLnJlYWRhYmxlTGlzdGVuaW5nKSB7XG4gICAgICBzdGF0ZS5yZWFkYWJsZUxpc3RlbmluZyA9IHRydWU7XG4gICAgICBzdGF0ZS5lbWl0dGVkUmVhZGFibGUgPSBmYWxzZTtcbiAgICAgIHN0YXRlLm5lZWRSZWFkYWJsZSA9IHRydWU7XG4gICAgICBpZiAoIXN0YXRlLnJlYWRpbmcpIHtcbiAgICAgICAgcHJvY2Vzc05leHRUaWNrKG5SZWFkaW5nTmV4dFRpY2ssIHRoaXMpO1xuICAgICAgfSBlbHNlIGlmIChzdGF0ZS5sZW5ndGgpIHtcbiAgICAgICAgZW1pdFJlYWRhYmxlKHRoaXMsIHN0YXRlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzO1xufTtcblJlYWRhYmxlLnByb3RvdHlwZS5hZGRMaXN0ZW5lciA9IFJlYWRhYmxlLnByb3RvdHlwZS5vbjtcblxuZnVuY3Rpb24gblJlYWRpbmdOZXh0VGljayhzZWxmKSB7XG4gIGRlYnVnKCdyZWFkYWJsZSBuZXh0dGljayByZWFkIDAnKTtcbiAgc2VsZi5yZWFkKDApO1xufVxuXG4vLyBwYXVzZSgpIGFuZCByZXN1bWUoKSBhcmUgcmVtbmFudHMgb2YgdGhlIGxlZ2FjeSByZWFkYWJsZSBzdHJlYW0gQVBJXG4vLyBJZiB0aGUgdXNlciB1c2VzIHRoZW0sIHRoZW4gc3dpdGNoIGludG8gb2xkIG1vZGUuXG5SZWFkYWJsZS5wcm90b3R5cGUucmVzdW1lID0gZnVuY3Rpb24oKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gIGlmICghc3RhdGUuZmxvd2luZykge1xuICAgIGRlYnVnKCdyZXN1bWUnKTtcbiAgICBzdGF0ZS5mbG93aW5nID0gdHJ1ZTtcbiAgICByZXN1bWUodGhpcywgc3RhdGUpO1xuICB9XG4gIHJldHVybiB0aGlzO1xufTtcblxuZnVuY3Rpb24gcmVzdW1lKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKCFzdGF0ZS5yZXN1bWVTY2hlZHVsZWQpIHtcbiAgICBzdGF0ZS5yZXN1bWVTY2hlZHVsZWQgPSB0cnVlO1xuICAgIHByb2Nlc3NOZXh0VGljayhyZXN1bWVfLCBzdHJlYW0sIHN0YXRlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXN1bWVfKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKCFzdGF0ZS5yZWFkaW5nKSB7XG4gICAgZGVidWcoJ3Jlc3VtZSByZWFkIDAnKTtcbiAgICBzdHJlYW0ucmVhZCgwKTtcbiAgfVxuXG4gIHN0YXRlLnJlc3VtZVNjaGVkdWxlZCA9IGZhbHNlO1xuICBzdHJlYW0uZW1pdCgncmVzdW1lJyk7XG4gIGZsb3coc3RyZWFtKTtcbiAgaWYgKHN0YXRlLmZsb3dpbmcgJiYgIXN0YXRlLnJlYWRpbmcpXG4gICAgc3RyZWFtLnJlYWQoMCk7XG59XG5cblJlYWRhYmxlLnByb3RvdHlwZS5wYXVzZSA9IGZ1bmN0aW9uKCkge1xuICBkZWJ1ZygnY2FsbCBwYXVzZSBmbG93aW5nPSVqJywgdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nKTtcbiAgaWYgKGZhbHNlICE9PSB0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcpIHtcbiAgICBkZWJ1ZygncGF1c2UnKTtcbiAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcgPSBmYWxzZTtcbiAgICB0aGlzLmVtaXQoJ3BhdXNlJyk7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5mdW5jdGlvbiBmbG93KHN0cmVhbSkge1xuICB2YXIgc3RhdGUgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGU7XG4gIGRlYnVnKCdmbG93Jywgc3RhdGUuZmxvd2luZyk7XG4gIGlmIChzdGF0ZS5mbG93aW5nKSB7XG4gICAgZG8ge1xuICAgICAgdmFyIGNodW5rID0gc3RyZWFtLnJlYWQoKTtcbiAgICB9IHdoaWxlIChudWxsICE9PSBjaHVuayAmJiBzdGF0ZS5mbG93aW5nKTtcbiAgfVxufVxuXG4vLyB3cmFwIGFuIG9sZC1zdHlsZSBzdHJlYW0gYXMgdGhlIGFzeW5jIGRhdGEgc291cmNlLlxuLy8gVGhpcyBpcyAqbm90KiBwYXJ0IG9mIHRoZSByZWFkYWJsZSBzdHJlYW0gaW50ZXJmYWNlLlxuLy8gSXQgaXMgYW4gdWdseSB1bmZvcnR1bmF0ZSBtZXNzIG9mIGhpc3RvcnkuXG5SZWFkYWJsZS5wcm90b3R5cGUud3JhcCA9IGZ1bmN0aW9uKHN0cmVhbSkge1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICB2YXIgcGF1c2VkID0gZmFsc2U7XG5cbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBzdHJlYW0ub24oJ2VuZCcsIGZ1bmN0aW9uKCkge1xuICAgIGRlYnVnKCd3cmFwcGVkIGVuZCcpO1xuICAgIGlmIChzdGF0ZS5kZWNvZGVyICYmICFzdGF0ZS5lbmRlZCkge1xuICAgICAgdmFyIGNodW5rID0gc3RhdGUuZGVjb2Rlci5lbmQoKTtcbiAgICAgIGlmIChjaHVuayAmJiBjaHVuay5sZW5ndGgpXG4gICAgICAgIHNlbGYucHVzaChjaHVuayk7XG4gICAgfVxuXG4gICAgc2VsZi5wdXNoKG51bGwpO1xuICB9KTtcblxuICBzdHJlYW0ub24oJ2RhdGEnLCBmdW5jdGlvbihjaHVuaykge1xuICAgIGRlYnVnKCd3cmFwcGVkIGRhdGEnKTtcbiAgICBpZiAoc3RhdGUuZGVjb2RlcilcbiAgICAgIGNodW5rID0gc3RhdGUuZGVjb2Rlci53cml0ZShjaHVuayk7XG5cbiAgICAvLyBkb24ndCBza2lwIG92ZXIgZmFsc3kgdmFsdWVzIGluIG9iamVjdE1vZGVcbiAgICBpZiAoc3RhdGUub2JqZWN0TW9kZSAmJiAoY2h1bmsgPT09IG51bGwgfHwgY2h1bmsgPT09IHVuZGVmaW5lZCkpXG4gICAgICByZXR1cm47XG4gICAgZWxzZSBpZiAoIXN0YXRlLm9iamVjdE1vZGUgJiYgKCFjaHVuayB8fCAhY2h1bmsubGVuZ3RoKSlcbiAgICAgIHJldHVybjtcblxuICAgIHZhciByZXQgPSBzZWxmLnB1c2goY2h1bmspO1xuICAgIGlmICghcmV0KSB7XG4gICAgICBwYXVzZWQgPSB0cnVlO1xuICAgICAgc3RyZWFtLnBhdXNlKCk7XG4gICAgfVxuICB9KTtcblxuICAvLyBwcm94eSBhbGwgdGhlIG90aGVyIG1ldGhvZHMuXG4gIC8vIGltcG9ydGFudCB3aGVuIHdyYXBwaW5nIGZpbHRlcnMgYW5kIGR1cGxleGVzLlxuICBmb3IgKHZhciBpIGluIHN0cmVhbSkge1xuICAgIGlmICh0aGlzW2ldID09PSB1bmRlZmluZWQgJiYgdHlwZW9mIHN0cmVhbVtpXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhpc1tpXSA9IGZ1bmN0aW9uKG1ldGhvZCkgeyByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBzdHJlYW1bbWV0aG9kXS5hcHBseShzdHJlYW0sIGFyZ3VtZW50cyk7XG4gICAgICB9OyB9KGkpO1xuICAgIH1cbiAgfVxuXG4gIC8vIHByb3h5IGNlcnRhaW4gaW1wb3J0YW50IGV2ZW50cy5cbiAgdmFyIGV2ZW50cyA9IFsnZXJyb3InLCAnY2xvc2UnLCAnZGVzdHJveScsICdwYXVzZScsICdyZXN1bWUnXTtcbiAgZm9yRWFjaChldmVudHMsIGZ1bmN0aW9uKGV2KSB7XG4gICAgc3RyZWFtLm9uKGV2LCBzZWxmLmVtaXQuYmluZChzZWxmLCBldikpO1xuICB9KTtcblxuICAvLyB3aGVuIHdlIHRyeSB0byBjb25zdW1lIHNvbWUgbW9yZSBieXRlcywgc2ltcGx5IHVucGF1c2UgdGhlXG4gIC8vIHVuZGVybHlpbmcgc3RyZWFtLlxuICBzZWxmLl9yZWFkID0gZnVuY3Rpb24obikge1xuICAgIGRlYnVnKCd3cmFwcGVkIF9yZWFkJywgbik7XG4gICAgaWYgKHBhdXNlZCkge1xuICAgICAgcGF1c2VkID0gZmFsc2U7XG4gICAgICBzdHJlYW0ucmVzdW1lKCk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBzZWxmO1xufTtcblxuXG4vLyBleHBvc2VkIGZvciB0ZXN0aW5nIHB1cnBvc2VzIG9ubHkuXG5SZWFkYWJsZS5fZnJvbUxpc3QgPSBmcm9tTGlzdDtcblxuLy8gUGx1Y2sgb2ZmIG4gYnl0ZXMgZnJvbSBhbiBhcnJheSBvZiBidWZmZXJzLlxuLy8gTGVuZ3RoIGlzIHRoZSBjb21iaW5lZCBsZW5ndGhzIG9mIGFsbCB0aGUgYnVmZmVycyBpbiB0aGUgbGlzdC5cbmZ1bmN0aW9uIGZyb21MaXN0KG4sIHN0YXRlKSB7XG4gIHZhciBsaXN0ID0gc3RhdGUuYnVmZmVyO1xuICB2YXIgbGVuZ3RoID0gc3RhdGUubGVuZ3RoO1xuICB2YXIgc3RyaW5nTW9kZSA9ICEhc3RhdGUuZGVjb2RlcjtcbiAgdmFyIG9iamVjdE1vZGUgPSAhIXN0YXRlLm9iamVjdE1vZGU7XG4gIHZhciByZXQ7XG5cbiAgLy8gbm90aGluZyBpbiB0aGUgbGlzdCwgZGVmaW5pdGVseSBlbXB0eS5cbiAgaWYgKGxpc3QubGVuZ3RoID09PSAwKVxuICAgIHJldHVybiBudWxsO1xuXG4gIGlmIChsZW5ndGggPT09IDApXG4gICAgcmV0ID0gbnVsbDtcbiAgZWxzZSBpZiAob2JqZWN0TW9kZSlcbiAgICByZXQgPSBsaXN0LnNoaWZ0KCk7XG4gIGVsc2UgaWYgKCFuIHx8IG4gPj0gbGVuZ3RoKSB7XG4gICAgLy8gcmVhZCBpdCBhbGwsIHRydW5jYXRlIHRoZSBhcnJheS5cbiAgICBpZiAoc3RyaW5nTW9kZSlcbiAgICAgIHJldCA9IGxpc3Quam9pbignJyk7XG4gICAgZWxzZSBpZiAobGlzdC5sZW5ndGggPT09IDEpXG4gICAgICByZXQgPSBsaXN0WzBdO1xuICAgIGVsc2VcbiAgICAgIHJldCA9IEJ1ZmZlci5jb25jYXQobGlzdCwgbGVuZ3RoKTtcbiAgICBsaXN0Lmxlbmd0aCA9IDA7XG4gIH0gZWxzZSB7XG4gICAgLy8gcmVhZCBqdXN0IHNvbWUgb2YgaXQuXG4gICAgaWYgKG4gPCBsaXN0WzBdLmxlbmd0aCkge1xuICAgICAgLy8ganVzdCB0YWtlIGEgcGFydCBvZiB0aGUgZmlyc3QgbGlzdCBpdGVtLlxuICAgICAgLy8gc2xpY2UgaXMgdGhlIHNhbWUgZm9yIGJ1ZmZlcnMgYW5kIHN0cmluZ3MuXG4gICAgICB2YXIgYnVmID0gbGlzdFswXTtcbiAgICAgIHJldCA9IGJ1Zi5zbGljZSgwLCBuKTtcbiAgICAgIGxpc3RbMF0gPSBidWYuc2xpY2Uobik7XG4gICAgfSBlbHNlIGlmIChuID09PSBsaXN0WzBdLmxlbmd0aCkge1xuICAgICAgLy8gZmlyc3QgbGlzdCBpcyBhIHBlcmZlY3QgbWF0Y2hcbiAgICAgIHJldCA9IGxpc3Quc2hpZnQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gY29tcGxleCBjYXNlLlxuICAgICAgLy8gd2UgaGF2ZSBlbm91Z2ggdG8gY292ZXIgaXQsIGJ1dCBpdCBzcGFucyBwYXN0IHRoZSBmaXJzdCBidWZmZXIuXG4gICAgICBpZiAoc3RyaW5nTW9kZSlcbiAgICAgICAgcmV0ID0gJyc7XG4gICAgICBlbHNlXG4gICAgICAgIHJldCA9IG5ldyBCdWZmZXIobik7XG5cbiAgICAgIHZhciBjID0gMDtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gbGlzdC5sZW5ndGg7IGkgPCBsICYmIGMgPCBuOyBpKyspIHtcbiAgICAgICAgdmFyIGJ1ZiA9IGxpc3RbMF07XG4gICAgICAgIHZhciBjcHkgPSBNYXRoLm1pbihuIC0gYywgYnVmLmxlbmd0aCk7XG5cbiAgICAgICAgaWYgKHN0cmluZ01vZGUpXG4gICAgICAgICAgcmV0ICs9IGJ1Zi5zbGljZSgwLCBjcHkpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgYnVmLmNvcHkocmV0LCBjLCAwLCBjcHkpO1xuXG4gICAgICAgIGlmIChjcHkgPCBidWYubGVuZ3RoKVxuICAgICAgICAgIGxpc3RbMF0gPSBidWYuc2xpY2UoY3B5KTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgIGxpc3Quc2hpZnQoKTtcblxuICAgICAgICBjICs9IGNweTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmV0O1xufVxuXG5mdW5jdGlvbiBlbmRSZWFkYWJsZShzdHJlYW0pIHtcbiAgdmFyIHN0YXRlID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlO1xuXG4gIC8vIElmIHdlIGdldCBoZXJlIGJlZm9yZSBjb25zdW1pbmcgYWxsIHRoZSBieXRlcywgdGhlbiB0aGF0IGlzIGFcbiAgLy8gYnVnIGluIG5vZGUuICBTaG91bGQgbmV2ZXIgaGFwcGVuLlxuICBpZiAoc3RhdGUubGVuZ3RoID4gMClcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2VuZFJlYWRhYmxlIGNhbGxlZCBvbiBub24tZW1wdHkgc3RyZWFtJyk7XG5cbiAgaWYgKCFzdGF0ZS5lbmRFbWl0dGVkKSB7XG4gICAgc3RhdGUuZW5kZWQgPSB0cnVlO1xuICAgIHByb2Nlc3NOZXh0VGljayhlbmRSZWFkYWJsZU5ULCBzdGF0ZSwgc3RyZWFtKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBlbmRSZWFkYWJsZU5UKHN0YXRlLCBzdHJlYW0pIHtcbiAgLy8gQ2hlY2sgdGhhdCB3ZSBkaWRuJ3QgZ2V0IG9uZSBsYXN0IHVuc2hpZnQuXG4gIGlmICghc3RhdGUuZW5kRW1pdHRlZCAmJiBzdGF0ZS5sZW5ndGggPT09IDApIHtcbiAgICBzdGF0ZS5lbmRFbWl0dGVkID0gdHJ1ZTtcbiAgICBzdHJlYW0ucmVhZGFibGUgPSBmYWxzZTtcbiAgICBzdHJlYW0uZW1pdCgnZW5kJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZm9yRWFjaCAoeHMsIGYpIHtcbiAgZm9yICh2YXIgaSA9IDAsIGwgPSB4cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBmKHhzW2ldLCBpKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpbmRleE9mICh4cywgeCkge1xuICBmb3IgKHZhciBpID0gMCwgbCA9IHhzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGlmICh4c1tpXSA9PT0geCkgcmV0dXJuIGk7XG4gIH1cbiAgcmV0dXJuIC0xO1xufVxuIiwidmFyIG9uY2UgPSByZXF1aXJlKCdvbmNlJyk7XG5cbnZhciBub29wID0gZnVuY3Rpb24oKSB7fTtcblxudmFyIGlzUmVxdWVzdCA9IGZ1bmN0aW9uKHN0cmVhbSkge1xuXHRyZXR1cm4gc3RyZWFtLnNldEhlYWRlciAmJiB0eXBlb2Ygc3RyZWFtLmFib3J0ID09PSAnZnVuY3Rpb24nO1xufTtcblxudmFyIGlzQ2hpbGRQcm9jZXNzID0gZnVuY3Rpb24oc3RyZWFtKSB7XG5cdHJldHVybiBzdHJlYW0uc3RkaW8gJiYgQXJyYXkuaXNBcnJheShzdHJlYW0uc3RkaW8pICYmIHN0cmVhbS5zdGRpby5sZW5ndGggPT09IDNcbn07XG5cbnZhciBlb3MgPSBmdW5jdGlvbihzdHJlYW0sIG9wdHMsIGNhbGxiYWNrKSB7XG5cdGlmICh0eXBlb2Ygb3B0cyA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIGVvcyhzdHJlYW0sIG51bGwsIG9wdHMpO1xuXHRpZiAoIW9wdHMpIG9wdHMgPSB7fTtcblxuXHRjYWxsYmFjayA9IG9uY2UoY2FsbGJhY2sgfHwgbm9vcCk7XG5cblx0dmFyIHdzID0gc3RyZWFtLl93cml0YWJsZVN0YXRlO1xuXHR2YXIgcnMgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGU7XG5cdHZhciByZWFkYWJsZSA9IG9wdHMucmVhZGFibGUgfHwgKG9wdHMucmVhZGFibGUgIT09IGZhbHNlICYmIHN0cmVhbS5yZWFkYWJsZSk7XG5cdHZhciB3cml0YWJsZSA9IG9wdHMud3JpdGFibGUgfHwgKG9wdHMud3JpdGFibGUgIT09IGZhbHNlICYmIHN0cmVhbS53cml0YWJsZSk7XG5cblx0dmFyIG9ubGVnYWN5ZmluaXNoID0gZnVuY3Rpb24oKSB7XG5cdFx0aWYgKCFzdHJlYW0ud3JpdGFibGUpIG9uZmluaXNoKCk7XG5cdH07XG5cblx0dmFyIG9uZmluaXNoID0gZnVuY3Rpb24oKSB7XG5cdFx0d3JpdGFibGUgPSBmYWxzZTtcblx0XHRpZiAoIXJlYWRhYmxlKSBjYWxsYmFjaygpO1xuXHR9O1xuXG5cdHZhciBvbmVuZCA9IGZ1bmN0aW9uKCkge1xuXHRcdHJlYWRhYmxlID0gZmFsc2U7XG5cdFx0aWYgKCF3cml0YWJsZSkgY2FsbGJhY2soKTtcblx0fTtcblxuXHR2YXIgb25leGl0ID0gZnVuY3Rpb24oZXhpdENvZGUpIHtcblx0XHRjYWxsYmFjayhleGl0Q29kZSA/IG5ldyBFcnJvcignZXhpdGVkIHdpdGggZXJyb3IgY29kZTogJyArIGV4aXRDb2RlKSA6IG51bGwpO1xuXHR9O1xuXG5cdHZhciBvbmNsb3NlID0gZnVuY3Rpb24oKSB7XG5cdFx0aWYgKHJlYWRhYmxlICYmICEocnMgJiYgcnMuZW5kZWQpKSByZXR1cm4gY2FsbGJhY2sobmV3IEVycm9yKCdwcmVtYXR1cmUgY2xvc2UnKSk7XG5cdFx0aWYgKHdyaXRhYmxlICYmICEod3MgJiYgd3MuZW5kZWQpKSByZXR1cm4gY2FsbGJhY2sobmV3IEVycm9yKCdwcmVtYXR1cmUgY2xvc2UnKSk7XG5cdH07XG5cblx0dmFyIG9ucmVxdWVzdCA9IGZ1bmN0aW9uKCkge1xuXHRcdHN0cmVhbS5yZXEub24oJ2ZpbmlzaCcsIG9uZmluaXNoKTtcblx0fTtcblxuXHRpZiAoaXNSZXF1ZXN0KHN0cmVhbSkpIHtcblx0XHRzdHJlYW0ub24oJ2NvbXBsZXRlJywgb25maW5pc2gpO1xuXHRcdHN0cmVhbS5vbignYWJvcnQnLCBvbmNsb3NlKTtcblx0XHRpZiAoc3RyZWFtLnJlcSkgb25yZXF1ZXN0KCk7XG5cdFx0ZWxzZSBzdHJlYW0ub24oJ3JlcXVlc3QnLCBvbnJlcXVlc3QpO1xuXHR9IGVsc2UgaWYgKHdyaXRhYmxlICYmICF3cykgeyAvLyBsZWdhY3kgc3RyZWFtc1xuXHRcdHN0cmVhbS5vbignZW5kJywgb25sZWdhY3lmaW5pc2gpO1xuXHRcdHN0cmVhbS5vbignY2xvc2UnLCBvbmxlZ2FjeWZpbmlzaCk7XG5cdH1cblxuXHRpZiAoaXNDaGlsZFByb2Nlc3Moc3RyZWFtKSkgc3RyZWFtLm9uKCdleGl0Jywgb25leGl0KTtcblxuXHRzdHJlYW0ub24oJ2VuZCcsIG9uZW5kKTtcblx0c3RyZWFtLm9uKCdmaW5pc2gnLCBvbmZpbmlzaCk7XG5cdGlmIChvcHRzLmVycm9yICE9PSBmYWxzZSkgc3RyZWFtLm9uKCdlcnJvcicsIGNhbGxiYWNrKTtcblx0c3RyZWFtLm9uKCdjbG9zZScsIG9uY2xvc2UpO1xuXG5cdHJldHVybiBmdW5jdGlvbigpIHtcblx0XHRzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoJ2NvbXBsZXRlJywgb25maW5pc2gpO1xuXHRcdHN0cmVhbS5yZW1vdmVMaXN0ZW5lcignYWJvcnQnLCBvbmNsb3NlKTtcblx0XHRzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoJ3JlcXVlc3QnLCBvbnJlcXVlc3QpO1xuXHRcdGlmIChzdHJlYW0ucmVxKSBzdHJlYW0ucmVxLnJlbW92ZUxpc3RlbmVyKCdmaW5pc2gnLCBvbmZpbmlzaCk7XG5cdFx0c3RyZWFtLnJlbW92ZUxpc3RlbmVyKCdlbmQnLCBvbmxlZ2FjeWZpbmlzaCk7XG5cdFx0c3RyZWFtLnJlbW92ZUxpc3RlbmVyKCdjbG9zZScsIG9ubGVnYWN5ZmluaXNoKTtcblx0XHRzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoJ2ZpbmlzaCcsIG9uZmluaXNoKTtcblx0XHRzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoJ2V4aXQnLCBvbmV4aXQpO1xuXHRcdHN0cmVhbS5yZW1vdmVMaXN0ZW5lcignZW5kJywgb25lbmQpO1xuXHRcdHN0cmVhbS5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBjYWxsYmFjayk7XG5cdFx0c3RyZWFtLnJlbW92ZUxpc3RlbmVyKCdjbG9zZScsIG9uY2xvc2UpO1xuXHR9O1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBlb3M7IiwidmFyIHByciA9IHJlcXVpcmUoJ3BycicpXG5cbmZ1bmN0aW9uIGluaXQgKHR5cGUsIG1lc3NhZ2UsIGNhdXNlKSB7XG4gIHBycih0aGlzLCB7XG4gICAgICB0eXBlICAgIDogdHlwZVxuICAgICwgbmFtZSAgICA6IHR5cGVcbiAgICAgIC8vIGNhbiBiZSBwYXNzZWQganVzdCBhICdjYXVzZSdcbiAgICAsIGNhdXNlICAgOiB0eXBlb2YgbWVzc2FnZSAhPSAnc3RyaW5nJyA/IG1lc3NhZ2UgOiBjYXVzZVxuICAgICwgbWVzc2FnZSA6ICEhbWVzc2FnZSAmJiB0eXBlb2YgbWVzc2FnZSAhPSAnc3RyaW5nJyA/IG1lc3NhZ2UubWVzc2FnZSA6IG1lc3NhZ2VcblxuICB9LCAnZXdyJylcbn1cblxuLy8gZ2VuZXJpYyBwcm90b3R5cGUsIG5vdCBpbnRlbmRlZCB0byBiZSBhY3R1YWxseSB1c2VkIC0gaGVscGZ1bCBmb3IgYGluc3RhbmNlb2ZgXG5mdW5jdGlvbiBDdXN0b21FcnJvciAobWVzc2FnZSwgY2F1c2UpIHtcbiAgRXJyb3IuY2FsbCh0aGlzKVxuICBpZiAoRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UpXG4gICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgYXJndW1lbnRzLmNhbGxlZSlcbiAgaW5pdC5jYWxsKHRoaXMsICdDdXN0b21FcnJvcicsIG1lc3NhZ2UsIGNhdXNlKVxufVxuXG5DdXN0b21FcnJvci5wcm90b3R5cGUgPSBuZXcgRXJyb3IoKVxuXG5mdW5jdGlvbiBjcmVhdGVFcnJvciAoZXJybm8sIHR5cGUsIHByb3RvKSB7XG4gIHZhciBlcnIgPSBmdW5jdGlvbiAobWVzc2FnZSwgY2F1c2UpIHtcbiAgICBpbml0LmNhbGwodGhpcywgdHlwZSwgbWVzc2FnZSwgY2F1c2UpXG4gICAgLy9UT0RPOiB0aGUgc3BlY2lmaWNpdHkgaGVyZSBpcyBzdHVwaWQsIGVycm5vIHNob3VsZCBiZSBhdmFpbGFibGUgZXZlcnl3aGVyZVxuICAgIGlmICh0eXBlID09ICdGaWxlc3lzdGVtRXJyb3InKSB7XG4gICAgICB0aGlzLmNvZGUgICAgPSB0aGlzLmNhdXNlLmNvZGVcbiAgICAgIHRoaXMucGF0aCAgICA9IHRoaXMuY2F1c2UucGF0aFxuICAgICAgdGhpcy5lcnJubyAgID0gdGhpcy5jYXVzZS5lcnJub1xuICAgICAgdGhpcy5tZXNzYWdlID1cbiAgICAgICAgKGVycm5vLmVycm5vW3RoaXMuY2F1c2UuZXJybm9dXG4gICAgICAgICAgPyBlcnJuby5lcnJub1t0aGlzLmNhdXNlLmVycm5vXS5kZXNjcmlwdGlvblxuICAgICAgICAgIDogdGhpcy5jYXVzZS5tZXNzYWdlKVxuICAgICAgICArICh0aGlzLmNhdXNlLnBhdGggPyAnIFsnICsgdGhpcy5jYXVzZS5wYXRoICsgJ10nIDogJycpXG4gICAgfVxuICAgIEVycm9yLmNhbGwodGhpcylcbiAgICBpZiAoRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UpXG4gICAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBhcmd1bWVudHMuY2FsbGVlKVxuICB9XG4gIGVyci5wcm90b3R5cGUgPSAhIXByb3RvID8gbmV3IHByb3RvKCkgOiBuZXcgQ3VzdG9tRXJyb3IoKVxuICByZXR1cm4gZXJyXG59XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGVycm5vKSB7XG4gIHZhciBjZSA9IGZ1bmN0aW9uICh0eXBlLCBwcm90bykge1xuICAgIHJldHVybiBjcmVhdGVFcnJvcihlcnJubywgdHlwZSwgcHJvdG8pXG4gIH1cbiAgcmV0dXJuIHtcbiAgICAgIEN1c3RvbUVycm9yICAgICA6IEN1c3RvbUVycm9yXG4gICAgLCBGaWxlc3lzdGVtRXJyb3IgOiBjZSgnRmlsZXN5c3RlbUVycm9yJylcbiAgICAsIGNyZWF0ZUVycm9yICAgICA6IGNlXG4gIH1cbn1cbiIsInZhciBhbGwgPSBtb2R1bGUuZXhwb3J0cy5hbGwgPSBbXG4gIHtcbiAgICBlcnJubzogLTIsXG4gICAgY29kZTogJ0VOT0VOVCcsXG4gICAgZGVzY3JpcHRpb246ICdubyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5J1xuICB9LFxuICB7XG4gICAgZXJybm86IC0xLFxuICAgIGNvZGU6ICdVTktOT1dOJyxcbiAgICBkZXNjcmlwdGlvbjogJ3Vua25vd24gZXJyb3InXG4gIH0sXG4gIHtcbiAgICBlcnJubzogMCxcbiAgICBjb2RlOiAnT0snLFxuICAgIGRlc2NyaXB0aW9uOiAnc3VjY2VzcydcbiAgfSxcbiAge1xuICAgIGVycm5vOiAxLFxuICAgIGNvZGU6ICdFT0YnLFxuICAgIGRlc2NyaXB0aW9uOiAnZW5kIG9mIGZpbGUnXG4gIH0sXG4gIHtcbiAgICBlcnJubzogMixcbiAgICBjb2RlOiAnRUFERFJJTkZPJyxcbiAgICBkZXNjcmlwdGlvbjogJ2dldGFkZHJpbmZvIGVycm9yJ1xuICB9LFxuICB7XG4gICAgZXJybm86IDMsXG4gICAgY29kZTogJ0VBQ0NFUycsXG4gICAgZGVzY3JpcHRpb246ICdwZXJtaXNzaW9uIGRlbmllZCdcbiAgfSxcbiAge1xuICAgIGVycm5vOiA0LFxuICAgIGNvZGU6ICdFQUdBSU4nLFxuICAgIGRlc2NyaXB0aW9uOiAncmVzb3VyY2UgdGVtcG9yYXJpbHkgdW5hdmFpbGFibGUnXG4gIH0sXG4gIHtcbiAgICBlcnJubzogNSxcbiAgICBjb2RlOiAnRUFERFJJTlVTRScsXG4gICAgZGVzY3JpcHRpb246ICdhZGRyZXNzIGFscmVhZHkgaW4gdXNlJ1xuICB9LFxuICB7XG4gICAgZXJybm86IDYsXG4gICAgY29kZTogJ0VBRERSTk9UQVZBSUwnLFxuICAgIGRlc2NyaXB0aW9uOiAnYWRkcmVzcyBub3QgYXZhaWxhYmxlJ1xuICB9LFxuICB7XG4gICAgZXJybm86IDcsXG4gICAgY29kZTogJ0VBRk5PU1VQUE9SVCcsXG4gICAgZGVzY3JpcHRpb246ICdhZGRyZXNzIGZhbWlseSBub3Qgc3VwcG9ydGVkJ1xuICB9LFxuICB7XG4gICAgZXJybm86IDgsXG4gICAgY29kZTogJ0VBTFJFQURZJyxcbiAgICBkZXNjcmlwdGlvbjogJ2Nvbm5lY3Rpb24gYWxyZWFkeSBpbiBwcm9ncmVzcydcbiAgfSxcbiAge1xuICAgIGVycm5vOiA5LFxuICAgIGNvZGU6ICdFQkFERicsXG4gICAgZGVzY3JpcHRpb246ICdiYWQgZmlsZSBkZXNjcmlwdG9yJ1xuICB9LFxuICB7XG4gICAgZXJybm86IDEwLFxuICAgIGNvZGU6ICdFQlVTWScsXG4gICAgZGVzY3JpcHRpb246ICdyZXNvdXJjZSBidXN5IG9yIGxvY2tlZCdcbiAgfSxcbiAge1xuICAgIGVycm5vOiAxMSxcbiAgICBjb2RlOiAnRUNPTk5BQk9SVEVEJyxcbiAgICBkZXNjcmlwdGlvbjogJ3NvZnR3YXJlIGNhdXNlZCBjb25uZWN0aW9uIGFib3J0J1xuICB9LFxuICB7XG4gICAgZXJybm86IDEyLFxuICAgIGNvZGU6ICdFQ09OTlJFRlVTRUQnLFxuICAgIGRlc2NyaXB0aW9uOiAnY29ubmVjdGlvbiByZWZ1c2VkJ1xuICB9LFxuICB7XG4gICAgZXJybm86IDEzLFxuICAgIGNvZGU6ICdFQ09OTlJFU0VUJyxcbiAgICBkZXNjcmlwdGlvbjogJ2Nvbm5lY3Rpb24gcmVzZXQgYnkgcGVlcidcbiAgfSxcbiAge1xuICAgIGVycm5vOiAxNCxcbiAgICBjb2RlOiAnRURFU1RBRERSUkVRJyxcbiAgICBkZXNjcmlwdGlvbjogJ2Rlc3RpbmF0aW9uIGFkZHJlc3MgcmVxdWlyZWQnXG4gIH0sXG4gIHtcbiAgICBlcnJubzogMTUsXG4gICAgY29kZTogJ0VGQVVMVCcsXG4gICAgZGVzY3JpcHRpb246ICdiYWQgYWRkcmVzcyBpbiBzeXN0ZW0gY2FsbCBhcmd1bWVudCdcbiAgfSxcbiAge1xuICAgIGVycm5vOiAxNixcbiAgICBjb2RlOiAnRUhPU1RVTlJFQUNIJyxcbiAgICBkZXNjcmlwdGlvbjogJ2hvc3QgaXMgdW5yZWFjaGFibGUnXG4gIH0sXG4gIHtcbiAgICBlcnJubzogMTcsXG4gICAgY29kZTogJ0VJTlRSJyxcbiAgICBkZXNjcmlwdGlvbjogJ2ludGVycnVwdGVkIHN5c3RlbSBjYWxsJ1xuICB9LFxuICB7XG4gICAgZXJybm86IDE4LFxuICAgIGNvZGU6ICdFSU5WQUwnLFxuICAgIGRlc2NyaXB0aW9uOiAnaW52YWxpZCBhcmd1bWVudCdcbiAgfSxcbiAge1xuICAgIGVycm5vOiAxOSxcbiAgICBjb2RlOiAnRUlTQ09OTicsXG4gICAgZGVzY3JpcHRpb246ICdzb2NrZXQgaXMgYWxyZWFkeSBjb25uZWN0ZWQnXG4gIH0sXG4gIHtcbiAgICBlcnJubzogMjAsXG4gICAgY29kZTogJ0VNRklMRScsXG4gICAgZGVzY3JpcHRpb246ICd0b28gbWFueSBvcGVuIGZpbGVzJ1xuICB9LFxuICB7XG4gICAgZXJybm86IDIxLFxuICAgIGNvZGU6ICdFTVNHU0laRScsXG4gICAgZGVzY3JpcHRpb246ICdtZXNzYWdlIHRvbyBsb25nJ1xuICB9LFxuICB7XG4gICAgZXJybm86IDIyLFxuICAgIGNvZGU6ICdFTkVURE9XTicsXG4gICAgZGVzY3JpcHRpb246ICduZXR3b3JrIGlzIGRvd24nXG4gIH0sXG4gIHtcbiAgICBlcnJubzogMjMsXG4gICAgY29kZTogJ0VORVRVTlJFQUNIJyxcbiAgICBkZXNjcmlwdGlvbjogJ25ldHdvcmsgaXMgdW5yZWFjaGFibGUnXG4gIH0sXG4gIHtcbiAgICBlcnJubzogMjQsXG4gICAgY29kZTogJ0VORklMRScsXG4gICAgZGVzY3JpcHRpb246ICdmaWxlIHRhYmxlIG92ZXJmbG93J1xuICB9LFxuICB7XG4gICAgZXJybm86IDI1LFxuICAgIGNvZGU6ICdFTk9CVUZTJyxcbiAgICBkZXNjcmlwdGlvbjogJ25vIGJ1ZmZlciBzcGFjZSBhdmFpbGFibGUnXG4gIH0sXG4gIHtcbiAgICBlcnJubzogMjYsXG4gICAgY29kZTogJ0VOT01FTScsXG4gICAgZGVzY3JpcHRpb246ICdub3QgZW5vdWdoIG1lbW9yeSdcbiAgfSxcbiAge1xuICAgIGVycm5vOiAyNyxcbiAgICBjb2RlOiAnRU5PVERJUicsXG4gICAgZGVzY3JpcHRpb246ICdub3QgYSBkaXJlY3RvcnknXG4gIH0sXG4gIHtcbiAgICBlcnJubzogMjgsXG4gICAgY29kZTogJ0VJU0RJUicsXG4gICAgZGVzY3JpcHRpb246ICdpbGxlZ2FsIG9wZXJhdGlvbiBvbiBhIGRpcmVjdG9yeSdcbiAgfSxcbiAge1xuICAgIGVycm5vOiAyOSxcbiAgICBjb2RlOiAnRU5PTkVUJyxcbiAgICBkZXNjcmlwdGlvbjogJ21hY2hpbmUgaXMgbm90IG9uIHRoZSBuZXR3b3JrJ1xuICB9LFxuICB7XG4gICAgZXJybm86IDMxLFxuICAgIGNvZGU6ICdFTk9UQ09OTicsXG4gICAgZGVzY3JpcHRpb246ICdzb2NrZXQgaXMgbm90IGNvbm5lY3RlZCdcbiAgfSxcbiAge1xuICAgIGVycm5vOiAzMixcbiAgICBjb2RlOiAnRU5PVFNPQ0snLFxuICAgIGRlc2NyaXB0aW9uOiAnc29ja2V0IG9wZXJhdGlvbiBvbiBub24tc29ja2V0J1xuICB9LFxuICB7XG4gICAgZXJybm86IDMzLFxuICAgIGNvZGU6ICdFTk9UU1VQJyxcbiAgICBkZXNjcmlwdGlvbjogJ29wZXJhdGlvbiBub3Qgc3VwcG9ydGVkIG9uIHNvY2tldCdcbiAgfSxcbiAge1xuICAgIGVycm5vOiAzNCxcbiAgICBjb2RlOiAnRU5PRU5UJyxcbiAgICBkZXNjcmlwdGlvbjogJ25vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnknXG4gIH0sXG4gIHtcbiAgICBlcnJubzogMzUsXG4gICAgY29kZTogJ0VOT1NZUycsXG4gICAgZGVzY3JpcHRpb246ICdmdW5jdGlvbiBub3QgaW1wbGVtZW50ZWQnXG4gIH0sXG4gIHtcbiAgICBlcnJubzogMzYsXG4gICAgY29kZTogJ0VQSVBFJyxcbiAgICBkZXNjcmlwdGlvbjogJ2Jyb2tlbiBwaXBlJ1xuICB9LFxuICB7XG4gICAgZXJybm86IDM3LFxuICAgIGNvZGU6ICdFUFJPVE8nLFxuICAgIGRlc2NyaXB0aW9uOiAncHJvdG9jb2wgZXJyb3InXG4gIH0sXG4gIHtcbiAgICBlcnJubzogMzgsXG4gICAgY29kZTogJ0VQUk9UT05PU1VQUE9SVCcsXG4gICAgZGVzY3JpcHRpb246ICdwcm90b2NvbCBub3Qgc3VwcG9ydGVkJ1xuICB9LFxuICB7XG4gICAgZXJybm86IDM5LFxuICAgIGNvZGU6ICdFUFJPVE9UWVBFJyxcbiAgICBkZXNjcmlwdGlvbjogJ3Byb3RvY29sIHdyb25nIHR5cGUgZm9yIHNvY2tldCdcbiAgfSxcbiAge1xuICAgIGVycm5vOiA0MCxcbiAgICBjb2RlOiAnRVRJTUVET1VUJyxcbiAgICBkZXNjcmlwdGlvbjogJ2Nvbm5lY3Rpb24gdGltZWQgb3V0J1xuICB9LFxuICB7XG4gICAgZXJybm86IDQxLFxuICAgIGNvZGU6ICdFQ0hBUlNFVCcsXG4gICAgZGVzY3JpcHRpb246ICdpbnZhbGlkIFVuaWNvZGUgY2hhcmFjdGVyJ1xuICB9LFxuICB7XG4gICAgZXJybm86IDQyLFxuICAgIGNvZGU6ICdFQUlGQU1OT1NVUFBPUlQnLFxuICAgIGRlc2NyaXB0aW9uOiAnYWRkcmVzcyBmYW1pbHkgZm9yIGhvc3RuYW1lIG5vdCBzdXBwb3J0ZWQnXG4gIH0sXG4gIHtcbiAgICBlcnJubzogNDQsXG4gICAgY29kZTogJ0VBSVNFUlZJQ0UnLFxuICAgIGRlc2NyaXB0aW9uOiAnc2Vydm5hbWUgbm90IHN1cHBvcnRlZCBmb3IgYWlfc29ja3R5cGUnXG4gIH0sXG4gIHtcbiAgICBlcnJubzogNDUsXG4gICAgY29kZTogJ0VBSVNPQ0tUWVBFJyxcbiAgICBkZXNjcmlwdGlvbjogJ2FpX3NvY2t0eXBlIG5vdCBzdXBwb3J0ZWQnXG4gIH0sXG4gIHtcbiAgICBlcnJubzogNDYsXG4gICAgY29kZTogJ0VTSFVURE9XTicsXG4gICAgZGVzY3JpcHRpb246ICdjYW5ub3Qgc2VuZCBhZnRlciB0cmFuc3BvcnQgZW5kcG9pbnQgc2h1dGRvd24nXG4gIH0sXG4gIHtcbiAgICBlcnJubzogNDcsXG4gICAgY29kZTogJ0VFWElTVCcsXG4gICAgZGVzY3JpcHRpb246ICdmaWxlIGFscmVhZHkgZXhpc3RzJ1xuICB9LFxuICB7XG4gICAgZXJybm86IDQ4LFxuICAgIGNvZGU6ICdFU1JDSCcsXG4gICAgZGVzY3JpcHRpb246ICdubyBzdWNoIHByb2Nlc3MnXG4gIH0sXG4gIHtcbiAgICBlcnJubzogNDksXG4gICAgY29kZTogJ0VOQU1FVE9PTE9ORycsXG4gICAgZGVzY3JpcHRpb246ICduYW1lIHRvbyBsb25nJ1xuICB9LFxuICB7XG4gICAgZXJybm86IDUwLFxuICAgIGNvZGU6ICdFUEVSTScsXG4gICAgZGVzY3JpcHRpb246ICdvcGVyYXRpb24gbm90IHBlcm1pdHRlZCdcbiAgfSxcbiAge1xuICAgIGVycm5vOiA1MSxcbiAgICBjb2RlOiAnRUxPT1AnLFxuICAgIGRlc2NyaXB0aW9uOiAndG9vIG1hbnkgc3ltYm9saWMgbGlua3MgZW5jb3VudGVyZWQnXG4gIH0sXG4gIHtcbiAgICBlcnJubzogNTIsXG4gICAgY29kZTogJ0VYREVWJyxcbiAgICBkZXNjcmlwdGlvbjogJ2Nyb3NzLWRldmljZSBsaW5rIG5vdCBwZXJtaXR0ZWQnXG4gIH0sXG4gIHtcbiAgICBlcnJubzogNTMsXG4gICAgY29kZTogJ0VOT1RFTVBUWScsXG4gICAgZGVzY3JpcHRpb246ICdkaXJlY3Rvcnkgbm90IGVtcHR5J1xuICB9LFxuICB7XG4gICAgZXJybm86IDU0LFxuICAgIGNvZGU6ICdFTk9TUEMnLFxuICAgIGRlc2NyaXB0aW9uOiAnbm8gc3BhY2UgbGVmdCBvbiBkZXZpY2UnXG4gIH0sXG4gIHtcbiAgICBlcnJubzogNTUsXG4gICAgY29kZTogJ0VJTycsXG4gICAgZGVzY3JpcHRpb246ICdpL28gZXJyb3InXG4gIH0sXG4gIHtcbiAgICBlcnJubzogNTYsXG4gICAgY29kZTogJ0VST0ZTJyxcbiAgICBkZXNjcmlwdGlvbjogJ3JlYWQtb25seSBmaWxlIHN5c3RlbSdcbiAgfSxcbiAge1xuICAgIGVycm5vOiA1NyxcbiAgICBjb2RlOiAnRU5PREVWJyxcbiAgICBkZXNjcmlwdGlvbjogJ25vIHN1Y2ggZGV2aWNlJ1xuICB9LFxuICB7XG4gICAgZXJybm86IDU4LFxuICAgIGNvZGU6ICdFU1BJUEUnLFxuICAgIGRlc2NyaXB0aW9uOiAnaW52YWxpZCBzZWVrJ1xuICB9LFxuICB7XG4gICAgZXJybm86IDU5LFxuICAgIGNvZGU6ICdFQ0FOQ0VMRUQnLFxuICAgIGRlc2NyaXB0aW9uOiAnb3BlcmF0aW9uIGNhbmNlbGVkJ1xuICB9XG5dXG5cbm1vZHVsZS5leHBvcnRzLmVycm5vID0ge31cbm1vZHVsZS5leHBvcnRzLmNvZGUgPSB7fVxuXG5hbGwuZm9yRWFjaChmdW5jdGlvbiAoZXJyb3IpIHtcbiAgbW9kdWxlLmV4cG9ydHMuZXJybm9bZXJyb3IuZXJybm9dID0gZXJyb3JcbiAgbW9kdWxlLmV4cG9ydHMuY29kZVtlcnJvci5jb2RlXSA9IGVycm9yXG59KVxuXG5tb2R1bGUuZXhwb3J0cy5jdXN0b20gPSByZXF1aXJlKCcuL2N1c3RvbScpKG1vZHVsZS5leHBvcnRzKVxubW9kdWxlLmV4cG9ydHMuY3JlYXRlID0gbW9kdWxlLmV4cG9ydHMuY3VzdG9tLmNyZWF0ZUVycm9yXG4iLCIvKiFcbiAgKiBwcnJcbiAgKiAoYykgMjAxMyBSb2QgVmFnZyA8cm9kQHZhZ2cub3JnPlxuICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9ydmFnZy9wcnJcbiAgKiBMaWNlbnNlOiBNSVRcbiAgKi9cblxuKGZ1bmN0aW9uIChuYW1lLCBjb250ZXh0LCBkZWZpbml0aW9uKSB7XG4gIGlmICh0eXBlb2YgbW9kdWxlICE9ICd1bmRlZmluZWQnICYmIG1vZHVsZS5leHBvcnRzKVxuICAgIG1vZHVsZS5leHBvcnRzID0gZGVmaW5pdGlvbigpXG4gIGVsc2VcbiAgICBjb250ZXh0W25hbWVdID0gZGVmaW5pdGlvbigpXG59KSgncHJyJywgdGhpcywgZnVuY3Rpb24oKSB7XG5cbiAgdmFyIHNldFByb3BlcnR5ID0gdHlwZW9mIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSA9PSAnZnVuY3Rpb24nXG4gICAgICA/IGZ1bmN0aW9uIChvYmosIGtleSwgb3B0aW9ucykge1xuICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgb3B0aW9ucylcbiAgICAgICAgICByZXR1cm4gb2JqXG4gICAgICAgIH1cbiAgICAgIDogZnVuY3Rpb24gKG9iaiwga2V5LCBvcHRpb25zKSB7IC8vIDwgZXM1XG4gICAgICAgICAgb2JqW2tleV0gPSBvcHRpb25zLnZhbHVlXG4gICAgICAgICAgcmV0dXJuIG9ialxuICAgICAgICB9XG5cbiAgICAsIG1ha2VPcHRpb25zID0gZnVuY3Rpb24gKHZhbHVlLCBvcHRpb25zKSB7XG4gICAgICAgIHZhciBvbyA9IHR5cGVvZiBvcHRpb25zID09ICdvYmplY3QnXG4gICAgICAgICAgLCBvcyA9ICFvbyAmJiB0eXBlb2Ygb3B0aW9ucyA9PSAnc3RyaW5nJ1xuICAgICAgICAgICwgb3AgPSBmdW5jdGlvbiAocCkge1xuICAgICAgICAgICAgICByZXR1cm4gb29cbiAgICAgICAgICAgICAgICA/ICEhb3B0aW9uc1twXVxuICAgICAgICAgICAgICAgIDogb3NcbiAgICAgICAgICAgICAgICAgID8gb3B0aW9ucy5pbmRleE9mKHBbMF0pID4gLTFcbiAgICAgICAgICAgICAgICAgIDogZmFsc2VcbiAgICAgICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZW51bWVyYWJsZSAgIDogb3AoJ2VudW1lcmFibGUnKVxuICAgICAgICAgICwgY29uZmlndXJhYmxlIDogb3AoJ2NvbmZpZ3VyYWJsZScpXG4gICAgICAgICAgLCB3cml0YWJsZSAgICAgOiBvcCgnd3JpdGFibGUnKVxuICAgICAgICAgICwgdmFsdWUgICAgICAgIDogdmFsdWVcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgLCBwcnIgPSBmdW5jdGlvbiAob2JqLCBrZXksIHZhbHVlLCBvcHRpb25zKSB7XG4gICAgICAgIHZhciBrXG5cbiAgICAgICAgb3B0aW9ucyA9IG1ha2VPcHRpb25zKHZhbHVlLCBvcHRpb25zKVxuXG4gICAgICAgIGlmICh0eXBlb2Yga2V5ID09ICdvYmplY3QnKSB7XG4gICAgICAgICAgZm9yIChrIGluIGtleSkge1xuICAgICAgICAgICAgaWYgKE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGtleSwgaykpIHtcbiAgICAgICAgICAgICAgb3B0aW9ucy52YWx1ZSA9IGtleVtrXVxuICAgICAgICAgICAgICBzZXRQcm9wZXJ0eShvYmosIGssIG9wdGlvbnMpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBvYmpcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzZXRQcm9wZXJ0eShvYmosIGtleSwgb3B0aW9ucylcbiAgICAgIH1cblxuICByZXR1cm4gcHJyXG59KSIsInZhciBjYW1lbGl6ZSA9IHJlcXVpcmUoXCJjYW1lbGl6ZVwiKVxudmFyIHRlbXBsYXRlID0gcmVxdWlyZShcInN0cmluZy10ZW1wbGF0ZVwiKVxudmFyIGV4dGVuZCA9IHJlcXVpcmUoXCJ4dGVuZC9tdXRhYmxlXCIpXG5cbm1vZHVsZS5leHBvcnRzID0gVHlwZWRFcnJvclxuXG5mdW5jdGlvbiBUeXBlZEVycm9yKGFyZ3MpIHtcbiAgICBpZiAoIWFyZ3MpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiYXJncyBpcyByZXF1aXJlZFwiKTtcbiAgICB9XG4gICAgaWYgKCFhcmdzLnR5cGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiYXJncy50eXBlIGlzIHJlcXVpcmVkXCIpO1xuICAgIH1cbiAgICBpZiAoIWFyZ3MubWVzc2FnZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJhcmdzLm1lc3NhZ2UgaXMgcmVxdWlyZWRcIik7XG4gICAgfVxuXG4gICAgdmFyIG1lc3NhZ2UgPSBhcmdzLm1lc3NhZ2VcblxuICAgIGlmIChhcmdzLnR5cGUgJiYgIWFyZ3MubmFtZSkge1xuICAgICAgICB2YXIgZXJyb3JOYW1lID0gY2FtZWxpemUoYXJncy50eXBlKSArIFwiRXJyb3JcIlxuICAgICAgICBhcmdzLm5hbWUgPSBlcnJvck5hbWVbMF0udG9VcHBlckNhc2UoKSArIGVycm9yTmFtZS5zdWJzdHIoMSlcbiAgICB9XG5cbiAgICBleHRlbmQoY3JlYXRlRXJyb3IsIGFyZ3MpO1xuICAgIGNyZWF0ZUVycm9yLl9uYW1lID0gYXJncy5uYW1lO1xuXG4gICAgcmV0dXJuIGNyZWF0ZUVycm9yO1xuXG4gICAgZnVuY3Rpb24gY3JlYXRlRXJyb3Iob3B0cykge1xuICAgICAgICB2YXIgcmVzdWx0ID0gbmV3IEVycm9yKClcblxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocmVzdWx0LCBcInR5cGVcIiwge1xuICAgICAgICAgICAgdmFsdWU6IHJlc3VsdC50eXBlLFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgIH0pXG5cbiAgICAgICAgdmFyIG9wdGlvbnMgPSBleHRlbmQoe30sIGFyZ3MsIG9wdHMpXG5cbiAgICAgICAgZXh0ZW5kKHJlc3VsdCwgb3B0aW9ucylcbiAgICAgICAgcmVzdWx0Lm1lc3NhZ2UgPSB0ZW1wbGF0ZShtZXNzYWdlLCBvcHRpb25zKVxuXG4gICAgICAgIHJldHVybiByZXN1bHRcbiAgICB9XG59XG5cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIE9uZVZlcnNpb25Db25zdHJhaW50ID0gcmVxdWlyZSgnaW5kaXZpZHVhbC9vbmUtdmVyc2lvbicpO1xuXG52YXIgTVlfVkVSU0lPTiA9ICc3Jztcbk9uZVZlcnNpb25Db25zdHJhaW50KCdldi1zdG9yZScsIE1ZX1ZFUlNJT04pO1xuXG52YXIgaGFzaEtleSA9ICdfX0VWX1NUT1JFX0tFWUAnICsgTVlfVkVSU0lPTjtcblxubW9kdWxlLmV4cG9ydHMgPSBFdlN0b3JlO1xuXG5mdW5jdGlvbiBFdlN0b3JlKGVsZW0pIHtcbiAgICB2YXIgaGFzaCA9IGVsZW1baGFzaEtleV07XG5cbiAgICBpZiAoIWhhc2gpIHtcbiAgICAgICAgaGFzaCA9IGVsZW1baGFzaEtleV0gPSB7fTtcbiAgICB9XG5cbiAgICByZXR1cm4gaGFzaDtcbn1cbiIsInZhciBzdHJlYW0gPSByZXF1aXJlKCdzdHJlYW0nKVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKHVybCwgb3B0cykge1xuICBpZiAoIW9wdHMpIG9wdHMgPSB7fVxuXG4gIHZhciBlcyA9IG5ldyBFdmVudFNvdXJjZSh1cmwpXG4gIHZhciBycyA9IG5ldyBzdHJlYW0uUmVhZGFibGUoe29iamVjdE1vZGU6dHJ1ZX0pXG5cbiAgdmFyIGpzb24gPSAhIW9wdHMuanNvblxuICB2YXIgZGVjb2RlID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgICB0cnkge1xuICAgICAgaWYgKGpzb24pIHJldHVybiBKU09OLnBhcnNlKGRhdGEpXG4gICAgICByZXR1cm4gZGF0YVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgIH1cbiAgfVxuXG4gIHJzLl9yZWFkID0gZnVuY3Rpb24oKSB7fVxuXG4gIGVzLm9ubWVzc2FnZSA9IGZ1bmN0aW9uKGUpIHtcbiAgICBycy5wdXNoKGRlY29kZShlLmRhdGEpKVxuICB9XG5cbiAgZXMub25lcnJvciA9IGZ1bmN0aW9uKGVycikge1xuICAgIGlmIChycy5saXN0ZW5lcnMoJ2Vycm9yJykubGVuZ3RoKSBycy5lbWl0KCdlcnJvcicsIGVycilcbiAgfVxuXG4gIGVzLm9ub3BlbiA9IGZ1bmN0aW9uICgpIHtcbiAgICBycy5lbWl0KCdvcGVuJylcbiAgfVxuXG4gIHZhciBkZXN0cm95ZWQgPSBmYWxzZVxuICBycy5kZXN0cm95ID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKGRlc3Ryb3llZCkgcmV0dXJuXG4gICAgZGVzdHJveWVkID0gdHJ1ZVxuICAgIGVzLmNsb3NlKClcbiAgICBycy5lbWl0KCdjbG9zZScpXG4gIH1cblxuICByZXR1cm4gcnNcbn0iLCJ2YXIgaXNGdW5jdGlvbiA9IHJlcXVpcmUoJ2lzLWZ1bmN0aW9uJylcblxubW9kdWxlLmV4cG9ydHMgPSBmb3JFYWNoXG5cbnZhciB0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdcbnZhciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHlcblxuZnVuY3Rpb24gZm9yRWFjaChsaXN0LCBpdGVyYXRvciwgY29udGV4dCkge1xuICAgIGlmICghaXNGdW5jdGlvbihpdGVyYXRvcikpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignaXRlcmF0b3IgbXVzdCBiZSBhIGZ1bmN0aW9uJylcbiAgICB9XG5cbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDMpIHtcbiAgICAgICAgY29udGV4dCA9IHRoaXNcbiAgICB9XG4gICAgXG4gICAgaWYgKHRvU3RyaW5nLmNhbGwobGlzdCkgPT09ICdbb2JqZWN0IEFycmF5XScpXG4gICAgICAgIGZvckVhY2hBcnJheShsaXN0LCBpdGVyYXRvciwgY29udGV4dClcbiAgICBlbHNlIGlmICh0eXBlb2YgbGlzdCA9PT0gJ3N0cmluZycpXG4gICAgICAgIGZvckVhY2hTdHJpbmcobGlzdCwgaXRlcmF0b3IsIGNvbnRleHQpXG4gICAgZWxzZVxuICAgICAgICBmb3JFYWNoT2JqZWN0KGxpc3QsIGl0ZXJhdG9yLCBjb250ZXh0KVxufVxuXG5mdW5jdGlvbiBmb3JFYWNoQXJyYXkoYXJyYXksIGl0ZXJhdG9yLCBjb250ZXh0KSB7XG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGFycmF5Lmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGFycmF5LCBpKSkge1xuICAgICAgICAgICAgaXRlcmF0b3IuY2FsbChjb250ZXh0LCBhcnJheVtpXSwgaSwgYXJyYXkpXG4gICAgICAgIH1cbiAgICB9XG59XG5cbmZ1bmN0aW9uIGZvckVhY2hTdHJpbmcoc3RyaW5nLCBpdGVyYXRvciwgY29udGV4dCkge1xuICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBzdHJpbmcubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgLy8gbm8gc3VjaCB0aGluZyBhcyBhIHNwYXJzZSBzdHJpbmcuXG4gICAgICAgIGl0ZXJhdG9yLmNhbGwoY29udGV4dCwgc3RyaW5nLmNoYXJBdChpKSwgaSwgc3RyaW5nKVxuICAgIH1cbn1cblxuZnVuY3Rpb24gZm9yRWFjaE9iamVjdChvYmplY3QsIGl0ZXJhdG9yLCBjb250ZXh0KSB7XG4gICAgZm9yICh2YXIgayBpbiBvYmplY3QpIHtcbiAgICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrKSkge1xuICAgICAgICAgICAgaXRlcmF0b3IuY2FsbChjb250ZXh0LCBvYmplY3Rba10sIGssIG9iamVjdClcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsInZhciBjcnlwdG8gPSByZXF1aXJlKCdjcnlwdG8nKVxuXG52YXIgRnJhbWVkSGFzaCA9IGZ1bmN0aW9uIChhbGdvKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBGcmFtZWRIYXNoKSkgcmV0dXJuIG5ldyBGcmFtZWRIYXNoKGFsZ28pXG4gIHRoaXMuaGFzaCA9IGNyeXB0by5jcmVhdGVIYXNoKGFsZ28pXG59XG5cbkZyYW1lZEhhc2gucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uIChkYXRhKSB7XG4gIHRoaXMuaGFzaC51cGRhdGUoKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJyA/IEJ1ZmZlci5ieXRlTGVuZ3RoKGRhdGEpIDogZGF0YS5sZW5ndGgpICsgJ1xcbicpXG4gIHRoaXMuaGFzaC51cGRhdGUoZGF0YSlcbiAgcmV0dXJuIHRoaXNcbn1cblxuRnJhbWVkSGFzaC5wcm90b3R5cGUuZGlnZXN0ID0gZnVuY3Rpb24gKGVuYykge1xuICByZXR1cm4gdGhpcy5oYXNoLmRpZ2VzdChlbmMpXG59XG5cbm1vZHVsZS5leHBvcnRzID0gRnJhbWVkSGFzaFxuIiwidmFyIFJlYWRhYmxlID0gcmVxdWlyZSgncmVhZGFibGUtc3RyZWFtJykuUmVhZGFibGVcbnZhciBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJylcblxubW9kdWxlLmV4cG9ydHMgPSBmcm9tMlxuXG5mcm9tMi5jdG9yID0gY3RvclxuZnJvbTIub2JqID0gb2JqXG5cbnZhciBQcm90byA9IGN0b3IoKVxuXG5mdW5jdGlvbiB0b0Z1bmN0aW9uKGxpc3QpIHtcbiAgbGlzdCA9IGxpc3Quc2xpY2UoKVxuICByZXR1cm4gZnVuY3Rpb24gKF8sIGNiKSB7XG4gICAgdmFyIGVyciA9IG51bGxcbiAgICB2YXIgaXRlbSA9IGxpc3QubGVuZ3RoID8gbGlzdC5zaGlmdCgpIDogbnVsbFxuICAgIGlmIChpdGVtIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIGVyciA9IGl0ZW1cbiAgICAgIGl0ZW0gPSBudWxsXG4gICAgfVxuXG4gICAgY2IoZXJyLCBpdGVtKVxuICB9XG59XG5cbmZ1bmN0aW9uIGZyb20yKG9wdHMsIHJlYWQpIHtcbiAgaWYgKHR5cGVvZiBvcHRzICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KG9wdHMpKSB7XG4gICAgcmVhZCA9IG9wdHNcbiAgICBvcHRzID0ge31cbiAgfVxuXG4gIHZhciBycyA9IG5ldyBQcm90byhvcHRzKVxuICBycy5fZnJvbSA9IEFycmF5LmlzQXJyYXkocmVhZCkgPyB0b0Z1bmN0aW9uKHJlYWQpIDogcmVhZFxuICByZXR1cm4gcnNcbn1cblxuZnVuY3Rpb24gY3RvcihvcHRzLCByZWFkKSB7XG4gIGlmICh0eXBlb2Ygb3B0cyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJlYWQgPSBvcHRzXG4gICAgb3B0cyA9IHt9XG4gIH1cblxuICBvcHRzID0gZGVmYXVsdHMob3B0cylcblxuICBpbmhlcml0cyhDbGFzcywgUmVhZGFibGUpXG4gIGZ1bmN0aW9uIENsYXNzKG92ZXJyaWRlKSB7XG4gICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIENsYXNzKSkgcmV0dXJuIG5ldyBDbGFzcyhvdmVycmlkZSlcbiAgICB0aGlzLl9yZWFkaW5nID0gZmFsc2VcbiAgICB0aGlzLl9jYWxsYmFjayA9IGNoZWNrXG4gICAgdGhpcy5kZXN0cm95ZWQgPSBmYWxzZVxuICAgIFJlYWRhYmxlLmNhbGwodGhpcywgb3ZlcnJpZGUgfHwgb3B0cylcblxuICAgIHZhciBzZWxmID0gdGhpc1xuICAgIHZhciBod20gPSB0aGlzLl9yZWFkYWJsZVN0YXRlLmhpZ2hXYXRlck1hcmtcblxuICAgIGZ1bmN0aW9uIGNoZWNrKGVyciwgZGF0YSkge1xuICAgICAgaWYgKHNlbGYuZGVzdHJveWVkKSByZXR1cm5cbiAgICAgIGlmIChlcnIpIHJldHVybiBzZWxmLmRlc3Ryb3koZXJyKVxuICAgICAgaWYgKGRhdGEgPT09IG51bGwpIHJldHVybiBzZWxmLnB1c2gobnVsbClcbiAgICAgIHNlbGYuX3JlYWRpbmcgPSBmYWxzZVxuICAgICAgaWYgKHNlbGYucHVzaChkYXRhKSkgc2VsZi5fcmVhZChod20pXG4gICAgfVxuICB9XG5cbiAgQ2xhc3MucHJvdG90eXBlLl9mcm9tID0gcmVhZFxuICBDbGFzcy5wcm90b3R5cGUuX3JlYWQgPSBmdW5jdGlvbihzaXplKSB7XG4gICAgaWYgKHRoaXMuX3JlYWRpbmcgfHwgdGhpcy5kZXN0cm95ZWQpIHJldHVyblxuICAgIHRoaXMuX3JlYWRpbmcgPSB0cnVlXG4gICAgdGhpcy5fZnJvbShzaXplLCB0aGlzLl9jYWxsYmFjaylcbiAgfVxuXG4gIENsYXNzLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24oZXJyKSB7XG4gICAgaWYgKHRoaXMuZGVzdHJveWVkKSByZXR1cm5cbiAgICB0aGlzLmRlc3Ryb3llZCA9IHRydWVcblxuICAgIHZhciBzZWxmID0gdGhpc1xuICAgIHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoZXJyKSBzZWxmLmVtaXQoJ2Vycm9yJywgZXJyKVxuICAgICAgc2VsZi5lbWl0KCdjbG9zZScpXG4gICAgfSlcbiAgfVxuXG4gIHJldHVybiBDbGFzc1xufVxuXG5mdW5jdGlvbiBvYmoob3B0cywgcmVhZCkge1xuICBpZiAodHlwZW9mIG9wdHMgPT09ICdmdW5jdGlvbicgfHwgQXJyYXkuaXNBcnJheShvcHRzKSkge1xuICAgIHJlYWQgPSBvcHRzXG4gICAgb3B0cyA9IHt9XG4gIH1cblxuICBvcHRzID0gZGVmYXVsdHMob3B0cylcbiAgb3B0cy5vYmplY3RNb2RlID0gdHJ1ZVxuICBvcHRzLmhpZ2hXYXRlck1hcmsgPSAxNlxuXG4gIHJldHVybiBmcm9tMihvcHRzLCByZWFkKVxufVxuXG5mdW5jdGlvbiBkZWZhdWx0cyhvcHRzKSB7XG4gIG9wdHMgPSBvcHRzIHx8IHt9XG4gIHJldHVybiBvcHRzXG59XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhZGFibGU7XG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgcHJvY2Vzc05leHRUaWNrID0gcmVxdWlyZSgncHJvY2Vzcy1uZXh0aWNrLWFyZ3MnKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgaXNBcnJheSA9IHJlcXVpcmUoJ2lzYXJyYXknKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgQnVmZmVyID0gcmVxdWlyZSgnYnVmZmVyJykuQnVmZmVyO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cblJlYWRhYmxlLlJlYWRhYmxlU3RhdGUgPSBSZWFkYWJsZVN0YXRlO1xuXG52YXIgRUUgPSByZXF1aXJlKCdldmVudHMnKTtcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBFRWxpc3RlbmVyQ291bnQgPSBmdW5jdGlvbihlbWl0dGVyLCB0eXBlKSB7XG4gIHJldHVybiBlbWl0dGVyLmxpc3RlbmVycyh0eXBlKS5sZW5ndGg7XG59O1xuLyo8L3JlcGxhY2VtZW50PiovXG5cblxuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIFN0cmVhbTtcbihmdW5jdGlvbiAoKXt0cnl7XG4gIFN0cmVhbSA9IHJlcXVpcmUoJ3N0JyArICdyZWFtJyk7XG59Y2F0Y2goXyl7fWZpbmFsbHl7XG4gIGlmICghU3RyZWFtKVxuICAgIFN0cmVhbSA9IHJlcXVpcmUoJ2V2ZW50cycpLkV2ZW50RW1pdHRlcjtcbn19KCkpXG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ2J1ZmZlcicpLkJ1ZmZlcjtcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciB1dGlsID0gcmVxdWlyZSgnY29yZS11dGlsLWlzJyk7XG51dGlsLmluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG5cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBkZWJ1Z1V0aWwgPSByZXF1aXJlKCd1dGlsJyk7XG52YXIgZGVidWc7XG5pZiAoZGVidWdVdGlsICYmIGRlYnVnVXRpbC5kZWJ1Z2xvZykge1xuICBkZWJ1ZyA9IGRlYnVnVXRpbC5kZWJ1Z2xvZygnc3RyZWFtJyk7XG59IGVsc2Uge1xuICBkZWJ1ZyA9IGZ1bmN0aW9uICgpIHt9O1xufVxuLyo8L3JlcGxhY2VtZW50PiovXG5cbnZhciBTdHJpbmdEZWNvZGVyO1xuXG51dGlsLmluaGVyaXRzKFJlYWRhYmxlLCBTdHJlYW0pO1xuXG52YXIgRHVwbGV4O1xuZnVuY3Rpb24gUmVhZGFibGVTdGF0ZShvcHRpb25zLCBzdHJlYW0pIHtcbiAgRHVwbGV4ID0gRHVwbGV4IHx8IHJlcXVpcmUoJy4vX3N0cmVhbV9kdXBsZXgnKTtcblxuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAvLyBvYmplY3Qgc3RyZWFtIGZsYWcuIFVzZWQgdG8gbWFrZSByZWFkKG4pIGlnbm9yZSBuIGFuZCB0b1xuICAvLyBtYWtlIGFsbCB0aGUgYnVmZmVyIG1lcmdpbmcgYW5kIGxlbmd0aCBjaGVja3MgZ28gYXdheVxuICB0aGlzLm9iamVjdE1vZGUgPSAhIW9wdGlvbnMub2JqZWN0TW9kZTtcblxuICBpZiAoc3RyZWFtIGluc3RhbmNlb2YgRHVwbGV4KVxuICAgIHRoaXMub2JqZWN0TW9kZSA9IHRoaXMub2JqZWN0TW9kZSB8fCAhIW9wdGlvbnMucmVhZGFibGVPYmplY3RNb2RlO1xuXG4gIC8vIHRoZSBwb2ludCBhdCB3aGljaCBpdCBzdG9wcyBjYWxsaW5nIF9yZWFkKCkgdG8gZmlsbCB0aGUgYnVmZmVyXG4gIC8vIE5vdGU6IDAgaXMgYSB2YWxpZCB2YWx1ZSwgbWVhbnMgXCJkb24ndCBjYWxsIF9yZWFkIHByZWVtcHRpdmVseSBldmVyXCJcbiAgdmFyIGh3bSA9IG9wdGlvbnMuaGlnaFdhdGVyTWFyaztcbiAgdmFyIGRlZmF1bHRId20gPSB0aGlzLm9iamVjdE1vZGUgPyAxNiA6IDE2ICogMTAyNDtcbiAgdGhpcy5oaWdoV2F0ZXJNYXJrID0gKGh3bSB8fCBod20gPT09IDApID8gaHdtIDogZGVmYXVsdEh3bTtcblxuICAvLyBjYXN0IHRvIGludHMuXG4gIHRoaXMuaGlnaFdhdGVyTWFyayA9IH5+dGhpcy5oaWdoV2F0ZXJNYXJrO1xuXG4gIHRoaXMuYnVmZmVyID0gW107XG4gIHRoaXMubGVuZ3RoID0gMDtcbiAgdGhpcy5waXBlcyA9IG51bGw7XG4gIHRoaXMucGlwZXNDb3VudCA9IDA7XG4gIHRoaXMuZmxvd2luZyA9IG51bGw7XG4gIHRoaXMuZW5kZWQgPSBmYWxzZTtcbiAgdGhpcy5lbmRFbWl0dGVkID0gZmFsc2U7XG4gIHRoaXMucmVhZGluZyA9IGZhbHNlO1xuXG4gIC8vIGEgZmxhZyB0byBiZSBhYmxlIHRvIHRlbGwgaWYgdGhlIG9ud3JpdGUgY2IgaXMgY2FsbGVkIGltbWVkaWF0ZWx5LFxuICAvLyBvciBvbiBhIGxhdGVyIHRpY2suICBXZSBzZXQgdGhpcyB0byB0cnVlIGF0IGZpcnN0LCBiZWNhdXNlIGFueVxuICAvLyBhY3Rpb25zIHRoYXQgc2hvdWxkbid0IGhhcHBlbiB1bnRpbCBcImxhdGVyXCIgc2hvdWxkIGdlbmVyYWxseSBhbHNvXG4gIC8vIG5vdCBoYXBwZW4gYmVmb3JlIHRoZSBmaXJzdCB3cml0ZSBjYWxsLlxuICB0aGlzLnN5bmMgPSB0cnVlO1xuXG4gIC8vIHdoZW5ldmVyIHdlIHJldHVybiBudWxsLCB0aGVuIHdlIHNldCBhIGZsYWcgdG8gc2F5XG4gIC8vIHRoYXQgd2UncmUgYXdhaXRpbmcgYSAncmVhZGFibGUnIGV2ZW50IGVtaXNzaW9uLlxuICB0aGlzLm5lZWRSZWFkYWJsZSA9IGZhbHNlO1xuICB0aGlzLmVtaXR0ZWRSZWFkYWJsZSA9IGZhbHNlO1xuICB0aGlzLnJlYWRhYmxlTGlzdGVuaW5nID0gZmFsc2U7XG5cbiAgLy8gQ3J5cHRvIGlzIGtpbmQgb2Ygb2xkIGFuZCBjcnVzdHkuICBIaXN0b3JpY2FsbHksIGl0cyBkZWZhdWx0IHN0cmluZ1xuICAvLyBlbmNvZGluZyBpcyAnYmluYXJ5JyBzbyB3ZSBoYXZlIHRvIG1ha2UgdGhpcyBjb25maWd1cmFibGUuXG4gIC8vIEV2ZXJ5dGhpbmcgZWxzZSBpbiB0aGUgdW5pdmVyc2UgdXNlcyAndXRmOCcsIHRob3VnaC5cbiAgdGhpcy5kZWZhdWx0RW5jb2RpbmcgPSBvcHRpb25zLmRlZmF1bHRFbmNvZGluZyB8fCAndXRmOCc7XG5cbiAgLy8gd2hlbiBwaXBpbmcsIHdlIG9ubHkgY2FyZSBhYm91dCAncmVhZGFibGUnIGV2ZW50cyB0aGF0IGhhcHBlblxuICAvLyBhZnRlciByZWFkKClpbmcgYWxsIHRoZSBieXRlcyBhbmQgbm90IGdldHRpbmcgYW55IHB1c2hiYWNrLlxuICB0aGlzLnJhbk91dCA9IGZhbHNlO1xuXG4gIC8vIHRoZSBudW1iZXIgb2Ygd3JpdGVycyB0aGF0IGFyZSBhd2FpdGluZyBhIGRyYWluIGV2ZW50IGluIC5waXBlKClzXG4gIHRoaXMuYXdhaXREcmFpbiA9IDA7XG5cbiAgLy8gaWYgdHJ1ZSwgYSBtYXliZVJlYWRNb3JlIGhhcyBiZWVuIHNjaGVkdWxlZFxuICB0aGlzLnJlYWRpbmdNb3JlID0gZmFsc2U7XG5cbiAgdGhpcy5kZWNvZGVyID0gbnVsbDtcbiAgdGhpcy5lbmNvZGluZyA9IG51bGw7XG4gIGlmIChvcHRpb25zLmVuY29kaW5nKSB7XG4gICAgaWYgKCFTdHJpbmdEZWNvZGVyKVxuICAgICAgU3RyaW5nRGVjb2RlciA9IHJlcXVpcmUoJ3N0cmluZ19kZWNvZGVyLycpLlN0cmluZ0RlY29kZXI7XG4gICAgdGhpcy5kZWNvZGVyID0gbmV3IFN0cmluZ0RlY29kZXIob3B0aW9ucy5lbmNvZGluZyk7XG4gICAgdGhpcy5lbmNvZGluZyA9IG9wdGlvbnMuZW5jb2Rpbmc7XG4gIH1cbn1cblxudmFyIER1cGxleDtcbmZ1bmN0aW9uIFJlYWRhYmxlKG9wdGlvbnMpIHtcbiAgRHVwbGV4ID0gRHVwbGV4IHx8IHJlcXVpcmUoJy4vX3N0cmVhbV9kdXBsZXgnKTtcblxuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgUmVhZGFibGUpKVxuICAgIHJldHVybiBuZXcgUmVhZGFibGUob3B0aW9ucyk7XG5cbiAgdGhpcy5fcmVhZGFibGVTdGF0ZSA9IG5ldyBSZWFkYWJsZVN0YXRlKG9wdGlvbnMsIHRoaXMpO1xuXG4gIC8vIGxlZ2FjeVxuICB0aGlzLnJlYWRhYmxlID0gdHJ1ZTtcblxuICBpZiAob3B0aW9ucyAmJiB0eXBlb2Ygb3B0aW9ucy5yZWFkID09PSAnZnVuY3Rpb24nKVxuICAgIHRoaXMuX3JlYWQgPSBvcHRpb25zLnJlYWQ7XG5cbiAgU3RyZWFtLmNhbGwodGhpcyk7XG59XG5cbi8vIE1hbnVhbGx5IHNob3ZlIHNvbWV0aGluZyBpbnRvIHRoZSByZWFkKCkgYnVmZmVyLlxuLy8gVGhpcyByZXR1cm5zIHRydWUgaWYgdGhlIGhpZ2hXYXRlck1hcmsgaGFzIG5vdCBiZWVuIGhpdCB5ZXQsXG4vLyBzaW1pbGFyIHRvIGhvdyBXcml0YWJsZS53cml0ZSgpIHJldHVybnMgdHJ1ZSBpZiB5b3Ugc2hvdWxkXG4vLyB3cml0ZSgpIHNvbWUgbW9yZS5cblJlYWRhYmxlLnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24oY2h1bmssIGVuY29kaW5nKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG5cbiAgaWYgKCFzdGF0ZS5vYmplY3RNb2RlICYmIHR5cGVvZiBjaHVuayA9PT0gJ3N0cmluZycpIHtcbiAgICBlbmNvZGluZyA9IGVuY29kaW5nIHx8IHN0YXRlLmRlZmF1bHRFbmNvZGluZztcbiAgICBpZiAoZW5jb2RpbmcgIT09IHN0YXRlLmVuY29kaW5nKSB7XG4gICAgICBjaHVuayA9IG5ldyBCdWZmZXIoY2h1bmssIGVuY29kaW5nKTtcbiAgICAgIGVuY29kaW5nID0gJyc7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlYWRhYmxlQWRkQ2h1bmsodGhpcywgc3RhdGUsIGNodW5rLCBlbmNvZGluZywgZmFsc2UpO1xufTtcblxuLy8gVW5zaGlmdCBzaG91bGQgKmFsd2F5cyogYmUgc29tZXRoaW5nIGRpcmVjdGx5IG91dCBvZiByZWFkKClcblJlYWRhYmxlLnByb3RvdHlwZS51bnNoaWZ0ID0gZnVuY3Rpb24oY2h1bmspIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgcmV0dXJuIHJlYWRhYmxlQWRkQ2h1bmsodGhpcywgc3RhdGUsIGNodW5rLCAnJywgdHJ1ZSk7XG59O1xuXG5SZWFkYWJsZS5wcm90b3R5cGUuaXNQYXVzZWQgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyA9PT0gZmFsc2U7XG59O1xuXG5mdW5jdGlvbiByZWFkYWJsZUFkZENodW5rKHN0cmVhbSwgc3RhdGUsIGNodW5rLCBlbmNvZGluZywgYWRkVG9Gcm9udCkge1xuICB2YXIgZXIgPSBjaHVua0ludmFsaWQoc3RhdGUsIGNodW5rKTtcbiAgaWYgKGVyKSB7XG4gICAgc3RyZWFtLmVtaXQoJ2Vycm9yJywgZXIpO1xuICB9IGVsc2UgaWYgKGNodW5rID09PSBudWxsKSB7XG4gICAgc3RhdGUucmVhZGluZyA9IGZhbHNlO1xuICAgIG9uRW9mQ2h1bmsoc3RyZWFtLCBzdGF0ZSk7XG4gIH0gZWxzZSBpZiAoc3RhdGUub2JqZWN0TW9kZSB8fCBjaHVuayAmJiBjaHVuay5sZW5ndGggPiAwKSB7XG4gICAgaWYgKHN0YXRlLmVuZGVkICYmICFhZGRUb0Zyb250KSB7XG4gICAgICB2YXIgZSA9IG5ldyBFcnJvcignc3RyZWFtLnB1c2goKSBhZnRlciBFT0YnKTtcbiAgICAgIHN0cmVhbS5lbWl0KCdlcnJvcicsIGUpO1xuICAgIH0gZWxzZSBpZiAoc3RhdGUuZW5kRW1pdHRlZCAmJiBhZGRUb0Zyb250KSB7XG4gICAgICB2YXIgZSA9IG5ldyBFcnJvcignc3RyZWFtLnVuc2hpZnQoKSBhZnRlciBlbmQgZXZlbnQnKTtcbiAgICAgIHN0cmVhbS5lbWl0KCdlcnJvcicsIGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoc3RhdGUuZGVjb2RlciAmJiAhYWRkVG9Gcm9udCAmJiAhZW5jb2RpbmcpXG4gICAgICAgIGNodW5rID0gc3RhdGUuZGVjb2Rlci53cml0ZShjaHVuayk7XG5cbiAgICAgIGlmICghYWRkVG9Gcm9udClcbiAgICAgICAgc3RhdGUucmVhZGluZyA9IGZhbHNlO1xuXG4gICAgICAvLyBpZiB3ZSB3YW50IHRoZSBkYXRhIG5vdywganVzdCBlbWl0IGl0LlxuICAgICAgaWYgKHN0YXRlLmZsb3dpbmcgJiYgc3RhdGUubGVuZ3RoID09PSAwICYmICFzdGF0ZS5zeW5jKSB7XG4gICAgICAgIHN0cmVhbS5lbWl0KCdkYXRhJywgY2h1bmspO1xuICAgICAgICBzdHJlYW0ucmVhZCgwKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHVwZGF0ZSB0aGUgYnVmZmVyIGluZm8uXG4gICAgICAgIHN0YXRlLmxlbmd0aCArPSBzdGF0ZS5vYmplY3RNb2RlID8gMSA6IGNodW5rLmxlbmd0aDtcbiAgICAgICAgaWYgKGFkZFRvRnJvbnQpXG4gICAgICAgICAgc3RhdGUuYnVmZmVyLnVuc2hpZnQoY2h1bmspO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgc3RhdGUuYnVmZmVyLnB1c2goY2h1bmspO1xuXG4gICAgICAgIGlmIChzdGF0ZS5uZWVkUmVhZGFibGUpXG4gICAgICAgICAgZW1pdFJlYWRhYmxlKHN0cmVhbSk7XG4gICAgICB9XG5cbiAgICAgIG1heWJlUmVhZE1vcmUoc3RyZWFtLCBzdGF0ZSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKCFhZGRUb0Zyb250KSB7XG4gICAgc3RhdGUucmVhZGluZyA9IGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIG5lZWRNb3JlRGF0YShzdGF0ZSk7XG59XG5cblxuLy8gaWYgaXQncyBwYXN0IHRoZSBoaWdoIHdhdGVyIG1hcmssIHdlIGNhbiBwdXNoIGluIHNvbWUgbW9yZS5cbi8vIEFsc28sIGlmIHdlIGhhdmUgbm8gZGF0YSB5ZXQsIHdlIGNhbiBzdGFuZCBzb21lXG4vLyBtb3JlIGJ5dGVzLiAgVGhpcyBpcyB0byB3b3JrIGFyb3VuZCBjYXNlcyB3aGVyZSBod209MCxcbi8vIHN1Y2ggYXMgdGhlIHJlcGwuICBBbHNvLCBpZiB0aGUgcHVzaCgpIHRyaWdnZXJlZCBhXG4vLyByZWFkYWJsZSBldmVudCwgYW5kIHRoZSB1c2VyIGNhbGxlZCByZWFkKGxhcmdlTnVtYmVyKSBzdWNoIHRoYXRcbi8vIG5lZWRSZWFkYWJsZSB3YXMgc2V0LCB0aGVuIHdlIG91Z2h0IHRvIHB1c2ggbW9yZSwgc28gdGhhdCBhbm90aGVyXG4vLyAncmVhZGFibGUnIGV2ZW50IHdpbGwgYmUgdHJpZ2dlcmVkLlxuZnVuY3Rpb24gbmVlZE1vcmVEYXRhKHN0YXRlKSB7XG4gIHJldHVybiAhc3RhdGUuZW5kZWQgJiZcbiAgICAgICAgIChzdGF0ZS5uZWVkUmVhZGFibGUgfHxcbiAgICAgICAgICBzdGF0ZS5sZW5ndGggPCBzdGF0ZS5oaWdoV2F0ZXJNYXJrIHx8XG4gICAgICAgICAgc3RhdGUubGVuZ3RoID09PSAwKTtcbn1cblxuLy8gYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuXG5SZWFkYWJsZS5wcm90b3R5cGUuc2V0RW5jb2RpbmcgPSBmdW5jdGlvbihlbmMpIHtcbiAgaWYgKCFTdHJpbmdEZWNvZGVyKVxuICAgIFN0cmluZ0RlY29kZXIgPSByZXF1aXJlKCdzdHJpbmdfZGVjb2Rlci8nKS5TdHJpbmdEZWNvZGVyO1xuICB0aGlzLl9yZWFkYWJsZVN0YXRlLmRlY29kZXIgPSBuZXcgU3RyaW5nRGVjb2RlcihlbmMpO1xuICB0aGlzLl9yZWFkYWJsZVN0YXRlLmVuY29kaW5nID0gZW5jO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8vIERvbid0IHJhaXNlIHRoZSBod20gPiA4TUJcbnZhciBNQVhfSFdNID0gMHg4MDAwMDA7XG5mdW5jdGlvbiBjb21wdXRlTmV3SGlnaFdhdGVyTWFyayhuKSB7XG4gIGlmIChuID49IE1BWF9IV00pIHtcbiAgICBuID0gTUFYX0hXTTtcbiAgfSBlbHNlIHtcbiAgICAvLyBHZXQgdGhlIG5leHQgaGlnaGVzdCBwb3dlciBvZiAyXG4gICAgbi0tO1xuICAgIG4gfD0gbiA+Pj4gMTtcbiAgICBuIHw9IG4gPj4+IDI7XG4gICAgbiB8PSBuID4+PiA0O1xuICAgIG4gfD0gbiA+Pj4gODtcbiAgICBuIHw9IG4gPj4+IDE2O1xuICAgIG4rKztcbiAgfVxuICByZXR1cm4gbjtcbn1cblxuZnVuY3Rpb24gaG93TXVjaFRvUmVhZChuLCBzdGF0ZSkge1xuICBpZiAoc3RhdGUubGVuZ3RoID09PSAwICYmIHN0YXRlLmVuZGVkKVxuICAgIHJldHVybiAwO1xuXG4gIGlmIChzdGF0ZS5vYmplY3RNb2RlKVxuICAgIHJldHVybiBuID09PSAwID8gMCA6IDE7XG5cbiAgaWYgKG4gPT09IG51bGwgfHwgaXNOYU4obikpIHtcbiAgICAvLyBvbmx5IGZsb3cgb25lIGJ1ZmZlciBhdCBhIHRpbWVcbiAgICBpZiAoc3RhdGUuZmxvd2luZyAmJiBzdGF0ZS5idWZmZXIubGVuZ3RoKVxuICAgICAgcmV0dXJuIHN0YXRlLmJ1ZmZlclswXS5sZW5ndGg7XG4gICAgZWxzZVxuICAgICAgcmV0dXJuIHN0YXRlLmxlbmd0aDtcbiAgfVxuXG4gIGlmIChuIDw9IDApXG4gICAgcmV0dXJuIDA7XG5cbiAgLy8gSWYgd2UncmUgYXNraW5nIGZvciBtb3JlIHRoYW4gdGhlIHRhcmdldCBidWZmZXIgbGV2ZWwsXG4gIC8vIHRoZW4gcmFpc2UgdGhlIHdhdGVyIG1hcmsuICBCdW1wIHVwIHRvIHRoZSBuZXh0IGhpZ2hlc3RcbiAgLy8gcG93ZXIgb2YgMiwgdG8gcHJldmVudCBpbmNyZWFzaW5nIGl0IGV4Y2Vzc2l2ZWx5IGluIHRpbnlcbiAgLy8gYW1vdW50cy5cbiAgaWYgKG4gPiBzdGF0ZS5oaWdoV2F0ZXJNYXJrKVxuICAgIHN0YXRlLmhpZ2hXYXRlck1hcmsgPSBjb21wdXRlTmV3SGlnaFdhdGVyTWFyayhuKTtcblxuICAvLyBkb24ndCBoYXZlIHRoYXQgbXVjaC4gIHJldHVybiBudWxsLCB1bmxlc3Mgd2UndmUgZW5kZWQuXG4gIGlmIChuID4gc3RhdGUubGVuZ3RoKSB7XG4gICAgaWYgKCFzdGF0ZS5lbmRlZCkge1xuICAgICAgc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICAgIHJldHVybiAwO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gc3RhdGUubGVuZ3RoO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuO1xufVxuXG4vLyB5b3UgY2FuIG92ZXJyaWRlIGVpdGhlciB0aGlzIG1ldGhvZCwgb3IgdGhlIGFzeW5jIF9yZWFkKG4pIGJlbG93LlxuUmVhZGFibGUucHJvdG90eXBlLnJlYWQgPSBmdW5jdGlvbihuKSB7XG4gIGRlYnVnKCdyZWFkJywgbik7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gIHZhciBuT3JpZyA9IG47XG5cbiAgaWYgKHR5cGVvZiBuICE9PSAnbnVtYmVyJyB8fCBuID4gMClcbiAgICBzdGF0ZS5lbWl0dGVkUmVhZGFibGUgPSBmYWxzZTtcblxuICAvLyBpZiB3ZSdyZSBkb2luZyByZWFkKDApIHRvIHRyaWdnZXIgYSByZWFkYWJsZSBldmVudCwgYnV0IHdlXG4gIC8vIGFscmVhZHkgaGF2ZSBhIGJ1bmNoIG9mIGRhdGEgaW4gdGhlIGJ1ZmZlciwgdGhlbiBqdXN0IHRyaWdnZXJcbiAgLy8gdGhlICdyZWFkYWJsZScgZXZlbnQgYW5kIG1vdmUgb24uXG4gIGlmIChuID09PSAwICYmXG4gICAgICBzdGF0ZS5uZWVkUmVhZGFibGUgJiZcbiAgICAgIChzdGF0ZS5sZW5ndGggPj0gc3RhdGUuaGlnaFdhdGVyTWFyayB8fCBzdGF0ZS5lbmRlZCkpIHtcbiAgICBkZWJ1ZygncmVhZDogZW1pdFJlYWRhYmxlJywgc3RhdGUubGVuZ3RoLCBzdGF0ZS5lbmRlZCk7XG4gICAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCAmJiBzdGF0ZS5lbmRlZClcbiAgICAgIGVuZFJlYWRhYmxlKHRoaXMpO1xuICAgIGVsc2VcbiAgICAgIGVtaXRSZWFkYWJsZSh0aGlzKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIG4gPSBob3dNdWNoVG9SZWFkKG4sIHN0YXRlKTtcblxuICAvLyBpZiB3ZSd2ZSBlbmRlZCwgYW5kIHdlJ3JlIG5vdyBjbGVhciwgdGhlbiBmaW5pc2ggaXQgdXAuXG4gIGlmIChuID09PSAwICYmIHN0YXRlLmVuZGVkKSB7XG4gICAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMClcbiAgICAgIGVuZFJlYWRhYmxlKHRoaXMpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLy8gQWxsIHRoZSBhY3R1YWwgY2h1bmsgZ2VuZXJhdGlvbiBsb2dpYyBuZWVkcyB0byBiZVxuICAvLyAqYmVsb3cqIHRoZSBjYWxsIHRvIF9yZWFkLiAgVGhlIHJlYXNvbiBpcyB0aGF0IGluIGNlcnRhaW5cbiAgLy8gc3ludGhldGljIHN0cmVhbSBjYXNlcywgc3VjaCBhcyBwYXNzdGhyb3VnaCBzdHJlYW1zLCBfcmVhZFxuICAvLyBtYXkgYmUgYSBjb21wbGV0ZWx5IHN5bmNocm9ub3VzIG9wZXJhdGlvbiB3aGljaCBtYXkgY2hhbmdlXG4gIC8vIHRoZSBzdGF0ZSBvZiB0aGUgcmVhZCBidWZmZXIsIHByb3ZpZGluZyBlbm91Z2ggZGF0YSB3aGVuXG4gIC8vIGJlZm9yZSB0aGVyZSB3YXMgKm5vdCogZW5vdWdoLlxuICAvL1xuICAvLyBTbywgdGhlIHN0ZXBzIGFyZTpcbiAgLy8gMS4gRmlndXJlIG91dCB3aGF0IHRoZSBzdGF0ZSBvZiB0aGluZ3Mgd2lsbCBiZSBhZnRlciB3ZSBkb1xuICAvLyBhIHJlYWQgZnJvbSB0aGUgYnVmZmVyLlxuICAvL1xuICAvLyAyLiBJZiB0aGF0IHJlc3VsdGluZyBzdGF0ZSB3aWxsIHRyaWdnZXIgYSBfcmVhZCwgdGhlbiBjYWxsIF9yZWFkLlxuICAvLyBOb3RlIHRoYXQgdGhpcyBtYXkgYmUgYXN5bmNocm9ub3VzLCBvciBzeW5jaHJvbm91cy4gIFllcywgaXQgaXNcbiAgLy8gZGVlcGx5IHVnbHkgdG8gd3JpdGUgQVBJcyB0aGlzIHdheSwgYnV0IHRoYXQgc3RpbGwgZG9lc24ndCBtZWFuXG4gIC8vIHRoYXQgdGhlIFJlYWRhYmxlIGNsYXNzIHNob3VsZCBiZWhhdmUgaW1wcm9wZXJseSwgYXMgc3RyZWFtcyBhcmVcbiAgLy8gZGVzaWduZWQgdG8gYmUgc3luYy9hc3luYyBhZ25vc3RpYy5cbiAgLy8gVGFrZSBub3RlIGlmIHRoZSBfcmVhZCBjYWxsIGlzIHN5bmMgb3IgYXN5bmMgKGllLCBpZiB0aGUgcmVhZCBjYWxsXG4gIC8vIGhhcyByZXR1cm5lZCB5ZXQpLCBzbyB0aGF0IHdlIGtub3cgd2hldGhlciBvciBub3QgaXQncyBzYWZlIHRvIGVtaXRcbiAgLy8gJ3JlYWRhYmxlJyBldGMuXG4gIC8vXG4gIC8vIDMuIEFjdHVhbGx5IHB1bGwgdGhlIHJlcXVlc3RlZCBjaHVua3Mgb3V0IG9mIHRoZSBidWZmZXIgYW5kIHJldHVybi5cblxuICAvLyBpZiB3ZSBuZWVkIGEgcmVhZGFibGUgZXZlbnQsIHRoZW4gd2UgbmVlZCB0byBkbyBzb21lIHJlYWRpbmcuXG4gIHZhciBkb1JlYWQgPSBzdGF0ZS5uZWVkUmVhZGFibGU7XG4gIGRlYnVnKCduZWVkIHJlYWRhYmxlJywgZG9SZWFkKTtcblxuICAvLyBpZiB3ZSBjdXJyZW50bHkgaGF2ZSBsZXNzIHRoYW4gdGhlIGhpZ2hXYXRlck1hcmssIHRoZW4gYWxzbyByZWFkIHNvbWVcbiAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCB8fCBzdGF0ZS5sZW5ndGggLSBuIDwgc3RhdGUuaGlnaFdhdGVyTWFyaykge1xuICAgIGRvUmVhZCA9IHRydWU7XG4gICAgZGVidWcoJ2xlbmd0aCBsZXNzIHRoYW4gd2F0ZXJtYXJrJywgZG9SZWFkKTtcbiAgfVxuXG4gIC8vIGhvd2V2ZXIsIGlmIHdlJ3ZlIGVuZGVkLCB0aGVuIHRoZXJlJ3Mgbm8gcG9pbnQsIGFuZCBpZiB3ZSdyZSBhbHJlYWR5XG4gIC8vIHJlYWRpbmcsIHRoZW4gaXQncyB1bm5lY2Vzc2FyeS5cbiAgaWYgKHN0YXRlLmVuZGVkIHx8IHN0YXRlLnJlYWRpbmcpIHtcbiAgICBkb1JlYWQgPSBmYWxzZTtcbiAgICBkZWJ1ZygncmVhZGluZyBvciBlbmRlZCcsIGRvUmVhZCk7XG4gIH1cblxuICBpZiAoZG9SZWFkKSB7XG4gICAgZGVidWcoJ2RvIHJlYWQnKTtcbiAgICBzdGF0ZS5yZWFkaW5nID0gdHJ1ZTtcbiAgICBzdGF0ZS5zeW5jID0gdHJ1ZTtcbiAgICAvLyBpZiB0aGUgbGVuZ3RoIGlzIGN1cnJlbnRseSB6ZXJvLCB0aGVuIHdlICpuZWVkKiBhIHJlYWRhYmxlIGV2ZW50LlxuICAgIGlmIChzdGF0ZS5sZW5ndGggPT09IDApXG4gICAgICBzdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlO1xuICAgIC8vIGNhbGwgaW50ZXJuYWwgcmVhZCBtZXRob2RcbiAgICB0aGlzLl9yZWFkKHN0YXRlLmhpZ2hXYXRlck1hcmspO1xuICAgIHN0YXRlLnN5bmMgPSBmYWxzZTtcbiAgfVxuXG4gIC8vIElmIF9yZWFkIHB1c2hlZCBkYXRhIHN5bmNocm9ub3VzbHksIHRoZW4gYHJlYWRpbmdgIHdpbGwgYmUgZmFsc2UsXG4gIC8vIGFuZCB3ZSBuZWVkIHRvIHJlLWV2YWx1YXRlIGhvdyBtdWNoIGRhdGEgd2UgY2FuIHJldHVybiB0byB0aGUgdXNlci5cbiAgaWYgKGRvUmVhZCAmJiAhc3RhdGUucmVhZGluZylcbiAgICBuID0gaG93TXVjaFRvUmVhZChuT3JpZywgc3RhdGUpO1xuXG4gIHZhciByZXQ7XG4gIGlmIChuID4gMClcbiAgICByZXQgPSBmcm9tTGlzdChuLCBzdGF0ZSk7XG4gIGVsc2VcbiAgICByZXQgPSBudWxsO1xuXG4gIGlmIChyZXQgPT09IG51bGwpIHtcbiAgICBzdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlO1xuICAgIG4gPSAwO1xuICB9XG5cbiAgc3RhdGUubGVuZ3RoIC09IG47XG5cbiAgLy8gSWYgd2UgaGF2ZSBub3RoaW5nIGluIHRoZSBidWZmZXIsIHRoZW4gd2Ugd2FudCB0byBrbm93XG4gIC8vIGFzIHNvb24gYXMgd2UgKmRvKiBnZXQgc29tZXRoaW5nIGludG8gdGhlIGJ1ZmZlci5cbiAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCAmJiAhc3RhdGUuZW5kZWQpXG4gICAgc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcblxuICAvLyBJZiB3ZSB0cmllZCB0byByZWFkKCkgcGFzdCB0aGUgRU9GLCB0aGVuIGVtaXQgZW5kIG9uIHRoZSBuZXh0IHRpY2suXG4gIGlmIChuT3JpZyAhPT0gbiAmJiBzdGF0ZS5lbmRlZCAmJiBzdGF0ZS5sZW5ndGggPT09IDApXG4gICAgZW5kUmVhZGFibGUodGhpcyk7XG5cbiAgaWYgKHJldCAhPT0gbnVsbClcbiAgICB0aGlzLmVtaXQoJ2RhdGEnLCByZXQpO1xuXG4gIHJldHVybiByZXQ7XG59O1xuXG5mdW5jdGlvbiBjaHVua0ludmFsaWQoc3RhdGUsIGNodW5rKSB7XG4gIHZhciBlciA9IG51bGw7XG4gIGlmICghKEJ1ZmZlci5pc0J1ZmZlcihjaHVuaykpICYmXG4gICAgICB0eXBlb2YgY2h1bmsgIT09ICdzdHJpbmcnICYmXG4gICAgICBjaHVuayAhPT0gbnVsbCAmJlxuICAgICAgY2h1bmsgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgIXN0YXRlLm9iamVjdE1vZGUpIHtcbiAgICBlciA9IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgbm9uLXN0cmluZy9idWZmZXIgY2h1bmsnKTtcbiAgfVxuICByZXR1cm4gZXI7XG59XG5cblxuZnVuY3Rpb24gb25Fb2ZDaHVuayhzdHJlYW0sIHN0YXRlKSB7XG4gIGlmIChzdGF0ZS5lbmRlZCkgcmV0dXJuO1xuICBpZiAoc3RhdGUuZGVjb2Rlcikge1xuICAgIHZhciBjaHVuayA9IHN0YXRlLmRlY29kZXIuZW5kKCk7XG4gICAgaWYgKGNodW5rICYmIGNodW5rLmxlbmd0aCkge1xuICAgICAgc3RhdGUuYnVmZmVyLnB1c2goY2h1bmspO1xuICAgICAgc3RhdGUubGVuZ3RoICs9IHN0YXRlLm9iamVjdE1vZGUgPyAxIDogY2h1bmsubGVuZ3RoO1xuICAgIH1cbiAgfVxuICBzdGF0ZS5lbmRlZCA9IHRydWU7XG5cbiAgLy8gZW1pdCAncmVhZGFibGUnIG5vdyB0byBtYWtlIHN1cmUgaXQgZ2V0cyBwaWNrZWQgdXAuXG4gIGVtaXRSZWFkYWJsZShzdHJlYW0pO1xufVxuXG4vLyBEb24ndCBlbWl0IHJlYWRhYmxlIHJpZ2h0IGF3YXkgaW4gc3luYyBtb2RlLCBiZWNhdXNlIHRoaXMgY2FuIHRyaWdnZXJcbi8vIGFub3RoZXIgcmVhZCgpIGNhbGwgPT4gc3RhY2sgb3ZlcmZsb3cuICBUaGlzIHdheSwgaXQgbWlnaHQgdHJpZ2dlclxuLy8gYSBuZXh0VGljayByZWN1cnNpb24gd2FybmluZywgYnV0IHRoYXQncyBub3Qgc28gYmFkLlxuZnVuY3Rpb24gZW1pdFJlYWRhYmxlKHN0cmVhbSkge1xuICB2YXIgc3RhdGUgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGU7XG4gIHN0YXRlLm5lZWRSZWFkYWJsZSA9IGZhbHNlO1xuICBpZiAoIXN0YXRlLmVtaXR0ZWRSZWFkYWJsZSkge1xuICAgIGRlYnVnKCdlbWl0UmVhZGFibGUnLCBzdGF0ZS5mbG93aW5nKTtcbiAgICBzdGF0ZS5lbWl0dGVkUmVhZGFibGUgPSB0cnVlO1xuICAgIGlmIChzdGF0ZS5zeW5jKVxuICAgICAgcHJvY2Vzc05leHRUaWNrKGVtaXRSZWFkYWJsZV8sIHN0cmVhbSk7XG4gICAgZWxzZVxuICAgICAgZW1pdFJlYWRhYmxlXyhzdHJlYW0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGVtaXRSZWFkYWJsZV8oc3RyZWFtKSB7XG4gIGRlYnVnKCdlbWl0IHJlYWRhYmxlJyk7XG4gIHN0cmVhbS5lbWl0KCdyZWFkYWJsZScpO1xuICBmbG93KHN0cmVhbSk7XG59XG5cblxuLy8gYXQgdGhpcyBwb2ludCwgdGhlIHVzZXIgaGFzIHByZXN1bWFibHkgc2VlbiB0aGUgJ3JlYWRhYmxlJyBldmVudCxcbi8vIGFuZCBjYWxsZWQgcmVhZCgpIHRvIGNvbnN1bWUgc29tZSBkYXRhLiAgdGhhdCBtYXkgaGF2ZSB0cmlnZ2VyZWRcbi8vIGluIHR1cm4gYW5vdGhlciBfcmVhZChuKSBjYWxsLCBpbiB3aGljaCBjYXNlIHJlYWRpbmcgPSB0cnVlIGlmXG4vLyBpdCdzIGluIHByb2dyZXNzLlxuLy8gSG93ZXZlciwgaWYgd2UncmUgbm90IGVuZGVkLCBvciByZWFkaW5nLCBhbmQgdGhlIGxlbmd0aCA8IGh3bSxcbi8vIHRoZW4gZ28gYWhlYWQgYW5kIHRyeSB0byByZWFkIHNvbWUgbW9yZSBwcmVlbXB0aXZlbHkuXG5mdW5jdGlvbiBtYXliZVJlYWRNb3JlKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKCFzdGF0ZS5yZWFkaW5nTW9yZSkge1xuICAgIHN0YXRlLnJlYWRpbmdNb3JlID0gdHJ1ZTtcbiAgICBwcm9jZXNzTmV4dFRpY2sobWF5YmVSZWFkTW9yZV8sIHN0cmVhbSwgc3RhdGUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1heWJlUmVhZE1vcmVfKHN0cmVhbSwgc3RhdGUpIHtcbiAgdmFyIGxlbiA9IHN0YXRlLmxlbmd0aDtcbiAgd2hpbGUgKCFzdGF0ZS5yZWFkaW5nICYmICFzdGF0ZS5mbG93aW5nICYmICFzdGF0ZS5lbmRlZCAmJlxuICAgICAgICAgc3RhdGUubGVuZ3RoIDwgc3RhdGUuaGlnaFdhdGVyTWFyaykge1xuICAgIGRlYnVnKCdtYXliZVJlYWRNb3JlIHJlYWQgMCcpO1xuICAgIHN0cmVhbS5yZWFkKDApO1xuICAgIGlmIChsZW4gPT09IHN0YXRlLmxlbmd0aClcbiAgICAgIC8vIGRpZG4ndCBnZXQgYW55IGRhdGEsIHN0b3Agc3Bpbm5pbmcuXG4gICAgICBicmVhaztcbiAgICBlbHNlXG4gICAgICBsZW4gPSBzdGF0ZS5sZW5ndGg7XG4gIH1cbiAgc3RhdGUucmVhZGluZ01vcmUgPSBmYWxzZTtcbn1cblxuLy8gYWJzdHJhY3QgbWV0aG9kLiAgdG8gYmUgb3ZlcnJpZGRlbiBpbiBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBjbGFzc2VzLlxuLy8gY2FsbCBjYihlciwgZGF0YSkgd2hlcmUgZGF0YSBpcyA8PSBuIGluIGxlbmd0aC5cbi8vIGZvciB2aXJ0dWFsIChub24tc3RyaW5nLCBub24tYnVmZmVyKSBzdHJlYW1zLCBcImxlbmd0aFwiIGlzIHNvbWV3aGF0XG4vLyBhcmJpdHJhcnksIGFuZCBwZXJoYXBzIG5vdCB2ZXJ5IG1lYW5pbmdmdWwuXG5SZWFkYWJsZS5wcm90b3R5cGUuX3JlYWQgPSBmdW5jdGlvbihuKSB7XG4gIHRoaXMuZW1pdCgnZXJyb3InLCBuZXcgRXJyb3IoJ25vdCBpbXBsZW1lbnRlZCcpKTtcbn07XG5cblJlYWRhYmxlLnByb3RvdHlwZS5waXBlID0gZnVuY3Rpb24oZGVzdCwgcGlwZU9wdHMpIHtcbiAgdmFyIHNyYyA9IHRoaXM7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG5cbiAgc3dpdGNoIChzdGF0ZS5waXBlc0NvdW50KSB7XG4gICAgY2FzZSAwOlxuICAgICAgc3RhdGUucGlwZXMgPSBkZXN0O1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAxOlxuICAgICAgc3RhdGUucGlwZXMgPSBbc3RhdGUucGlwZXMsIGRlc3RdO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHN0YXRlLnBpcGVzLnB1c2goZGVzdCk7XG4gICAgICBicmVhaztcbiAgfVxuICBzdGF0ZS5waXBlc0NvdW50ICs9IDE7XG4gIGRlYnVnKCdwaXBlIGNvdW50PSVkIG9wdHM9JWonLCBzdGF0ZS5waXBlc0NvdW50LCBwaXBlT3B0cyk7XG5cbiAgdmFyIGRvRW5kID0gKCFwaXBlT3B0cyB8fCBwaXBlT3B0cy5lbmQgIT09IGZhbHNlKSAmJlxuICAgICAgICAgICAgICBkZXN0ICE9PSBwcm9jZXNzLnN0ZG91dCAmJlxuICAgICAgICAgICAgICBkZXN0ICE9PSBwcm9jZXNzLnN0ZGVycjtcblxuICB2YXIgZW5kRm4gPSBkb0VuZCA/IG9uZW5kIDogY2xlYW51cDtcbiAgaWYgKHN0YXRlLmVuZEVtaXR0ZWQpXG4gICAgcHJvY2Vzc05leHRUaWNrKGVuZEZuKTtcbiAgZWxzZVxuICAgIHNyYy5vbmNlKCdlbmQnLCBlbmRGbik7XG5cbiAgZGVzdC5vbigndW5waXBlJywgb251bnBpcGUpO1xuICBmdW5jdGlvbiBvbnVucGlwZShyZWFkYWJsZSkge1xuICAgIGRlYnVnKCdvbnVucGlwZScpO1xuICAgIGlmIChyZWFkYWJsZSA9PT0gc3JjKSB7XG4gICAgICBjbGVhbnVwKCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gb25lbmQoKSB7XG4gICAgZGVidWcoJ29uZW5kJyk7XG4gICAgZGVzdC5lbmQoKTtcbiAgfVxuXG4gIC8vIHdoZW4gdGhlIGRlc3QgZHJhaW5zLCBpdCByZWR1Y2VzIHRoZSBhd2FpdERyYWluIGNvdW50ZXJcbiAgLy8gb24gdGhlIHNvdXJjZS4gIFRoaXMgd291bGQgYmUgbW9yZSBlbGVnYW50IHdpdGggYSAub25jZSgpXG4gIC8vIGhhbmRsZXIgaW4gZmxvdygpLCBidXQgYWRkaW5nIGFuZCByZW1vdmluZyByZXBlYXRlZGx5IGlzXG4gIC8vIHRvbyBzbG93LlxuICB2YXIgb25kcmFpbiA9IHBpcGVPbkRyYWluKHNyYyk7XG4gIGRlc3Qub24oJ2RyYWluJywgb25kcmFpbik7XG5cbiAgdmFyIGNsZWFuZWRVcCA9IGZhbHNlO1xuICBmdW5jdGlvbiBjbGVhbnVwKCkge1xuICAgIGRlYnVnKCdjbGVhbnVwJyk7XG4gICAgLy8gY2xlYW51cCBldmVudCBoYW5kbGVycyBvbmNlIHRoZSBwaXBlIGlzIGJyb2tlblxuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2Nsb3NlJywgb25jbG9zZSk7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZmluaXNoJywgb25maW5pc2gpO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2RyYWluJywgb25kcmFpbik7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBvbmVycm9yKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCd1bnBpcGUnLCBvbnVucGlwZSk7XG4gICAgc3JjLnJlbW92ZUxpc3RlbmVyKCdlbmQnLCBvbmVuZCk7XG4gICAgc3JjLnJlbW92ZUxpc3RlbmVyKCdlbmQnLCBjbGVhbnVwKTtcbiAgICBzcmMucmVtb3ZlTGlzdGVuZXIoJ2RhdGEnLCBvbmRhdGEpO1xuXG4gICAgY2xlYW5lZFVwID0gdHJ1ZTtcblxuICAgIC8vIGlmIHRoZSByZWFkZXIgaXMgd2FpdGluZyBmb3IgYSBkcmFpbiBldmVudCBmcm9tIHRoaXNcbiAgICAvLyBzcGVjaWZpYyB3cml0ZXIsIHRoZW4gaXQgd291bGQgY2F1c2UgaXQgdG8gbmV2ZXIgc3RhcnRcbiAgICAvLyBmbG93aW5nIGFnYWluLlxuICAgIC8vIFNvLCBpZiB0aGlzIGlzIGF3YWl0aW5nIGEgZHJhaW4sIHRoZW4gd2UganVzdCBjYWxsIGl0IG5vdy5cbiAgICAvLyBJZiB3ZSBkb24ndCBrbm93LCB0aGVuIGFzc3VtZSB0aGF0IHdlIGFyZSB3YWl0aW5nIGZvciBvbmUuXG4gICAgaWYgKHN0YXRlLmF3YWl0RHJhaW4gJiZcbiAgICAgICAgKCFkZXN0Ll93cml0YWJsZVN0YXRlIHx8IGRlc3QuX3dyaXRhYmxlU3RhdGUubmVlZERyYWluKSlcbiAgICAgIG9uZHJhaW4oKTtcbiAgfVxuXG4gIHNyYy5vbignZGF0YScsIG9uZGF0YSk7XG4gIGZ1bmN0aW9uIG9uZGF0YShjaHVuaykge1xuICAgIGRlYnVnKCdvbmRhdGEnKTtcbiAgICB2YXIgcmV0ID0gZGVzdC53cml0ZShjaHVuayk7XG4gICAgaWYgKGZhbHNlID09PSByZXQpIHtcbiAgICAgIC8vIElmIHRoZSB1c2VyIHVucGlwZWQgZHVyaW5nIGBkZXN0LndyaXRlKClgLCBpdCBpcyBwb3NzaWJsZVxuICAgICAgLy8gdG8gZ2V0IHN0dWNrIGluIGEgcGVybWFuZW50bHkgcGF1c2VkIHN0YXRlIGlmIHRoYXQgd3JpdGVcbiAgICAgIC8vIGFsc28gcmV0dXJuZWQgZmFsc2UuXG4gICAgICBpZiAoc3RhdGUucGlwZXNDb3VudCA9PT0gMSAmJlxuICAgICAgICAgIHN0YXRlLnBpcGVzWzBdID09PSBkZXN0ICYmXG4gICAgICAgICAgc3JjLmxpc3RlbmVyQ291bnQoJ2RhdGEnKSA9PT0gMSAmJlxuICAgICAgICAgICFjbGVhbmVkVXApIHtcbiAgICAgICAgZGVidWcoJ2ZhbHNlIHdyaXRlIHJlc3BvbnNlLCBwYXVzZScsIHNyYy5fcmVhZGFibGVTdGF0ZS5hd2FpdERyYWluKTtcbiAgICAgICAgc3JjLl9yZWFkYWJsZVN0YXRlLmF3YWl0RHJhaW4rKztcbiAgICAgIH1cbiAgICAgIHNyYy5wYXVzZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8vIGlmIHRoZSBkZXN0IGhhcyBhbiBlcnJvciwgdGhlbiBzdG9wIHBpcGluZyBpbnRvIGl0LlxuICAvLyBob3dldmVyLCBkb24ndCBzdXBwcmVzcyB0aGUgdGhyb3dpbmcgYmVoYXZpb3IgZm9yIHRoaXMuXG4gIGZ1bmN0aW9uIG9uZXJyb3IoZXIpIHtcbiAgICBkZWJ1Zygnb25lcnJvcicsIGVyKTtcbiAgICB1bnBpcGUoKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdlcnJvcicsIG9uZXJyb3IpO1xuICAgIGlmIChFRWxpc3RlbmVyQ291bnQoZGVzdCwgJ2Vycm9yJykgPT09IDApXG4gICAgICBkZXN0LmVtaXQoJ2Vycm9yJywgZXIpO1xuICB9XG4gIC8vIFRoaXMgaXMgYSBicnV0YWxseSB1Z2x5IGhhY2sgdG8gbWFrZSBzdXJlIHRoYXQgb3VyIGVycm9yIGhhbmRsZXJcbiAgLy8gaXMgYXR0YWNoZWQgYmVmb3JlIGFueSB1c2VybGFuZCBvbmVzLiAgTkVWRVIgRE8gVEhJUy5cbiAgaWYgKCFkZXN0Ll9ldmVudHMgfHwgIWRlc3QuX2V2ZW50cy5lcnJvcilcbiAgICBkZXN0Lm9uKCdlcnJvcicsIG9uZXJyb3IpO1xuICBlbHNlIGlmIChpc0FycmF5KGRlc3QuX2V2ZW50cy5lcnJvcikpXG4gICAgZGVzdC5fZXZlbnRzLmVycm9yLnVuc2hpZnQob25lcnJvcik7XG4gIGVsc2VcbiAgICBkZXN0Ll9ldmVudHMuZXJyb3IgPSBbb25lcnJvciwgZGVzdC5fZXZlbnRzLmVycm9yXTtcblxuXG4gIC8vIEJvdGggY2xvc2UgYW5kIGZpbmlzaCBzaG91bGQgdHJpZ2dlciB1bnBpcGUsIGJ1dCBvbmx5IG9uY2UuXG4gIGZ1bmN0aW9uIG9uY2xvc2UoKSB7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZmluaXNoJywgb25maW5pc2gpO1xuICAgIHVucGlwZSgpO1xuICB9XG4gIGRlc3Qub25jZSgnY2xvc2UnLCBvbmNsb3NlKTtcbiAgZnVuY3Rpb24gb25maW5pc2goKSB7XG4gICAgZGVidWcoJ29uZmluaXNoJyk7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLCBvbmNsb3NlKTtcbiAgICB1bnBpcGUoKTtcbiAgfVxuICBkZXN0Lm9uY2UoJ2ZpbmlzaCcsIG9uZmluaXNoKTtcblxuICBmdW5jdGlvbiB1bnBpcGUoKSB7XG4gICAgZGVidWcoJ3VucGlwZScpO1xuICAgIHNyYy51bnBpcGUoZGVzdCk7XG4gIH1cblxuICAvLyB0ZWxsIHRoZSBkZXN0IHRoYXQgaXQncyBiZWluZyBwaXBlZCB0b1xuICBkZXN0LmVtaXQoJ3BpcGUnLCBzcmMpO1xuXG4gIC8vIHN0YXJ0IHRoZSBmbG93IGlmIGl0IGhhc24ndCBiZWVuIHN0YXJ0ZWQgYWxyZWFkeS5cbiAgaWYgKCFzdGF0ZS5mbG93aW5nKSB7XG4gICAgZGVidWcoJ3BpcGUgcmVzdW1lJyk7XG4gICAgc3JjLnJlc3VtZSgpO1xuICB9XG5cbiAgcmV0dXJuIGRlc3Q7XG59O1xuXG5mdW5jdGlvbiBwaXBlT25EcmFpbihzcmMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBzdGF0ZSA9IHNyYy5fcmVhZGFibGVTdGF0ZTtcbiAgICBkZWJ1ZygncGlwZU9uRHJhaW4nLCBzdGF0ZS5hd2FpdERyYWluKTtcbiAgICBpZiAoc3RhdGUuYXdhaXREcmFpbilcbiAgICAgIHN0YXRlLmF3YWl0RHJhaW4tLTtcbiAgICBpZiAoc3RhdGUuYXdhaXREcmFpbiA9PT0gMCAmJiBFRWxpc3RlbmVyQ291bnQoc3JjLCAnZGF0YScpKSB7XG4gICAgICBzdGF0ZS5mbG93aW5nID0gdHJ1ZTtcbiAgICAgIGZsb3coc3JjKTtcbiAgICB9XG4gIH07XG59XG5cblxuUmVhZGFibGUucHJvdG90eXBlLnVucGlwZSA9IGZ1bmN0aW9uKGRlc3QpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcblxuICAvLyBpZiB3ZSdyZSBub3QgcGlwaW5nIGFueXdoZXJlLCB0aGVuIGRvIG5vdGhpbmcuXG4gIGlmIChzdGF0ZS5waXBlc0NvdW50ID09PSAwKVxuICAgIHJldHVybiB0aGlzO1xuXG4gIC8vIGp1c3Qgb25lIGRlc3RpbmF0aW9uLiAgbW9zdCBjb21tb24gY2FzZS5cbiAgaWYgKHN0YXRlLnBpcGVzQ291bnQgPT09IDEpIHtcbiAgICAvLyBwYXNzZWQgaW4gb25lLCBidXQgaXQncyBub3QgdGhlIHJpZ2h0IG9uZS5cbiAgICBpZiAoZGVzdCAmJiBkZXN0ICE9PSBzdGF0ZS5waXBlcylcbiAgICAgIHJldHVybiB0aGlzO1xuXG4gICAgaWYgKCFkZXN0KVxuICAgICAgZGVzdCA9IHN0YXRlLnBpcGVzO1xuXG4gICAgLy8gZ290IGEgbWF0Y2guXG4gICAgc3RhdGUucGlwZXMgPSBudWxsO1xuICAgIHN0YXRlLnBpcGVzQ291bnQgPSAwO1xuICAgIHN0YXRlLmZsb3dpbmcgPSBmYWxzZTtcbiAgICBpZiAoZGVzdClcbiAgICAgIGRlc3QuZW1pdCgndW5waXBlJywgdGhpcyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBzbG93IGNhc2UuIG11bHRpcGxlIHBpcGUgZGVzdGluYXRpb25zLlxuXG4gIGlmICghZGVzdCkge1xuICAgIC8vIHJlbW92ZSBhbGwuXG4gICAgdmFyIGRlc3RzID0gc3RhdGUucGlwZXM7XG4gICAgdmFyIGxlbiA9IHN0YXRlLnBpcGVzQ291bnQ7XG4gICAgc3RhdGUucGlwZXMgPSBudWxsO1xuICAgIHN0YXRlLnBpcGVzQ291bnQgPSAwO1xuICAgIHN0YXRlLmZsb3dpbmcgPSBmYWxzZTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspXG4gICAgICBkZXN0c1tpXS5lbWl0KCd1bnBpcGUnLCB0aGlzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIHRyeSB0byBmaW5kIHRoZSByaWdodCBvbmUuXG4gIHZhciBpID0gaW5kZXhPZihzdGF0ZS5waXBlcywgZGVzdCk7XG4gIGlmIChpID09PSAtMSlcbiAgICByZXR1cm4gdGhpcztcblxuICBzdGF0ZS5waXBlcy5zcGxpY2UoaSwgMSk7XG4gIHN0YXRlLnBpcGVzQ291bnQgLT0gMTtcbiAgaWYgKHN0YXRlLnBpcGVzQ291bnQgPT09IDEpXG4gICAgc3RhdGUucGlwZXMgPSBzdGF0ZS5waXBlc1swXTtcblxuICBkZXN0LmVtaXQoJ3VucGlwZScsIHRoaXMpO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLy8gc2V0IHVwIGRhdGEgZXZlbnRzIGlmIHRoZXkgYXJlIGFza2VkIGZvclxuLy8gRW5zdXJlIHJlYWRhYmxlIGxpc3RlbmVycyBldmVudHVhbGx5IGdldCBzb21ldGhpbmdcblJlYWRhYmxlLnByb3RvdHlwZS5vbiA9IGZ1bmN0aW9uKGV2LCBmbikge1xuICB2YXIgcmVzID0gU3RyZWFtLnByb3RvdHlwZS5vbi5jYWxsKHRoaXMsIGV2LCBmbik7XG5cbiAgLy8gSWYgbGlzdGVuaW5nIHRvIGRhdGEsIGFuZCBpdCBoYXMgbm90IGV4cGxpY2l0bHkgYmVlbiBwYXVzZWQsXG4gIC8vIHRoZW4gY2FsbCByZXN1bWUgdG8gc3RhcnQgdGhlIGZsb3cgb2YgZGF0YSBvbiB0aGUgbmV4dCB0aWNrLlxuICBpZiAoZXYgPT09ICdkYXRhJyAmJiBmYWxzZSAhPT0gdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nKSB7XG4gICAgdGhpcy5yZXN1bWUoKTtcbiAgfVxuXG4gIGlmIChldiA9PT0gJ3JlYWRhYmxlJyAmJiB0aGlzLnJlYWRhYmxlKSB7XG4gICAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgICBpZiAoIXN0YXRlLnJlYWRhYmxlTGlzdGVuaW5nKSB7XG4gICAgICBzdGF0ZS5yZWFkYWJsZUxpc3RlbmluZyA9IHRydWU7XG4gICAgICBzdGF0ZS5lbWl0dGVkUmVhZGFibGUgPSBmYWxzZTtcbiAgICAgIHN0YXRlLm5lZWRSZWFkYWJsZSA9IHRydWU7XG4gICAgICBpZiAoIXN0YXRlLnJlYWRpbmcpIHtcbiAgICAgICAgcHJvY2Vzc05leHRUaWNrKG5SZWFkaW5nTmV4dFRpY2ssIHRoaXMpO1xuICAgICAgfSBlbHNlIGlmIChzdGF0ZS5sZW5ndGgpIHtcbiAgICAgICAgZW1pdFJlYWRhYmxlKHRoaXMsIHN0YXRlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzO1xufTtcblJlYWRhYmxlLnByb3RvdHlwZS5hZGRMaXN0ZW5lciA9IFJlYWRhYmxlLnByb3RvdHlwZS5vbjtcblxuZnVuY3Rpb24gblJlYWRpbmdOZXh0VGljayhzZWxmKSB7XG4gIGRlYnVnKCdyZWFkYWJsZSBuZXh0dGljayByZWFkIDAnKTtcbiAgc2VsZi5yZWFkKDApO1xufVxuXG4vLyBwYXVzZSgpIGFuZCByZXN1bWUoKSBhcmUgcmVtbmFudHMgb2YgdGhlIGxlZ2FjeSByZWFkYWJsZSBzdHJlYW0gQVBJXG4vLyBJZiB0aGUgdXNlciB1c2VzIHRoZW0sIHRoZW4gc3dpdGNoIGludG8gb2xkIG1vZGUuXG5SZWFkYWJsZS5wcm90b3R5cGUucmVzdW1lID0gZnVuY3Rpb24oKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gIGlmICghc3RhdGUuZmxvd2luZykge1xuICAgIGRlYnVnKCdyZXN1bWUnKTtcbiAgICBzdGF0ZS5mbG93aW5nID0gdHJ1ZTtcbiAgICByZXN1bWUodGhpcywgc3RhdGUpO1xuICB9XG4gIHJldHVybiB0aGlzO1xufTtcblxuZnVuY3Rpb24gcmVzdW1lKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKCFzdGF0ZS5yZXN1bWVTY2hlZHVsZWQpIHtcbiAgICBzdGF0ZS5yZXN1bWVTY2hlZHVsZWQgPSB0cnVlO1xuICAgIHByb2Nlc3NOZXh0VGljayhyZXN1bWVfLCBzdHJlYW0sIHN0YXRlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXN1bWVfKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKCFzdGF0ZS5yZWFkaW5nKSB7XG4gICAgZGVidWcoJ3Jlc3VtZSByZWFkIDAnKTtcbiAgICBzdHJlYW0ucmVhZCgwKTtcbiAgfVxuXG4gIHN0YXRlLnJlc3VtZVNjaGVkdWxlZCA9IGZhbHNlO1xuICBzdHJlYW0uZW1pdCgncmVzdW1lJyk7XG4gIGZsb3coc3RyZWFtKTtcbiAgaWYgKHN0YXRlLmZsb3dpbmcgJiYgIXN0YXRlLnJlYWRpbmcpXG4gICAgc3RyZWFtLnJlYWQoMCk7XG59XG5cblJlYWRhYmxlLnByb3RvdHlwZS5wYXVzZSA9IGZ1bmN0aW9uKCkge1xuICBkZWJ1ZygnY2FsbCBwYXVzZSBmbG93aW5nPSVqJywgdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nKTtcbiAgaWYgKGZhbHNlICE9PSB0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcpIHtcbiAgICBkZWJ1ZygncGF1c2UnKTtcbiAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcgPSBmYWxzZTtcbiAgICB0aGlzLmVtaXQoJ3BhdXNlJyk7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5mdW5jdGlvbiBmbG93KHN0cmVhbSkge1xuICB2YXIgc3RhdGUgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGU7XG4gIGRlYnVnKCdmbG93Jywgc3RhdGUuZmxvd2luZyk7XG4gIGlmIChzdGF0ZS5mbG93aW5nKSB7XG4gICAgZG8ge1xuICAgICAgdmFyIGNodW5rID0gc3RyZWFtLnJlYWQoKTtcbiAgICB9IHdoaWxlIChudWxsICE9PSBjaHVuayAmJiBzdGF0ZS5mbG93aW5nKTtcbiAgfVxufVxuXG4vLyB3cmFwIGFuIG9sZC1zdHlsZSBzdHJlYW0gYXMgdGhlIGFzeW5jIGRhdGEgc291cmNlLlxuLy8gVGhpcyBpcyAqbm90KiBwYXJ0IG9mIHRoZSByZWFkYWJsZSBzdHJlYW0gaW50ZXJmYWNlLlxuLy8gSXQgaXMgYW4gdWdseSB1bmZvcnR1bmF0ZSBtZXNzIG9mIGhpc3RvcnkuXG5SZWFkYWJsZS5wcm90b3R5cGUud3JhcCA9IGZ1bmN0aW9uKHN0cmVhbSkge1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICB2YXIgcGF1c2VkID0gZmFsc2U7XG5cbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBzdHJlYW0ub24oJ2VuZCcsIGZ1bmN0aW9uKCkge1xuICAgIGRlYnVnKCd3cmFwcGVkIGVuZCcpO1xuICAgIGlmIChzdGF0ZS5kZWNvZGVyICYmICFzdGF0ZS5lbmRlZCkge1xuICAgICAgdmFyIGNodW5rID0gc3RhdGUuZGVjb2Rlci5lbmQoKTtcbiAgICAgIGlmIChjaHVuayAmJiBjaHVuay5sZW5ndGgpXG4gICAgICAgIHNlbGYucHVzaChjaHVuayk7XG4gICAgfVxuXG4gICAgc2VsZi5wdXNoKG51bGwpO1xuICB9KTtcblxuICBzdHJlYW0ub24oJ2RhdGEnLCBmdW5jdGlvbihjaHVuaykge1xuICAgIGRlYnVnKCd3cmFwcGVkIGRhdGEnKTtcbiAgICBpZiAoc3RhdGUuZGVjb2RlcilcbiAgICAgIGNodW5rID0gc3RhdGUuZGVjb2Rlci53cml0ZShjaHVuayk7XG5cbiAgICAvLyBkb24ndCBza2lwIG92ZXIgZmFsc3kgdmFsdWVzIGluIG9iamVjdE1vZGVcbiAgICBpZiAoc3RhdGUub2JqZWN0TW9kZSAmJiAoY2h1bmsgPT09IG51bGwgfHwgY2h1bmsgPT09IHVuZGVmaW5lZCkpXG4gICAgICByZXR1cm47XG4gICAgZWxzZSBpZiAoIXN0YXRlLm9iamVjdE1vZGUgJiYgKCFjaHVuayB8fCAhY2h1bmsubGVuZ3RoKSlcbiAgICAgIHJldHVybjtcblxuICAgIHZhciByZXQgPSBzZWxmLnB1c2goY2h1bmspO1xuICAgIGlmICghcmV0KSB7XG4gICAgICBwYXVzZWQgPSB0cnVlO1xuICAgICAgc3RyZWFtLnBhdXNlKCk7XG4gICAgfVxuICB9KTtcblxuICAvLyBwcm94eSBhbGwgdGhlIG90aGVyIG1ldGhvZHMuXG4gIC8vIGltcG9ydGFudCB3aGVuIHdyYXBwaW5nIGZpbHRlcnMgYW5kIGR1cGxleGVzLlxuICBmb3IgKHZhciBpIGluIHN0cmVhbSkge1xuICAgIGlmICh0aGlzW2ldID09PSB1bmRlZmluZWQgJiYgdHlwZW9mIHN0cmVhbVtpXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhpc1tpXSA9IGZ1bmN0aW9uKG1ldGhvZCkgeyByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBzdHJlYW1bbWV0aG9kXS5hcHBseShzdHJlYW0sIGFyZ3VtZW50cyk7XG4gICAgICB9OyB9KGkpO1xuICAgIH1cbiAgfVxuXG4gIC8vIHByb3h5IGNlcnRhaW4gaW1wb3J0YW50IGV2ZW50cy5cbiAgdmFyIGV2ZW50cyA9IFsnZXJyb3InLCAnY2xvc2UnLCAnZGVzdHJveScsICdwYXVzZScsICdyZXN1bWUnXTtcbiAgZm9yRWFjaChldmVudHMsIGZ1bmN0aW9uKGV2KSB7XG4gICAgc3RyZWFtLm9uKGV2LCBzZWxmLmVtaXQuYmluZChzZWxmLCBldikpO1xuICB9KTtcblxuICAvLyB3aGVuIHdlIHRyeSB0byBjb25zdW1lIHNvbWUgbW9yZSBieXRlcywgc2ltcGx5IHVucGF1c2UgdGhlXG4gIC8vIHVuZGVybHlpbmcgc3RyZWFtLlxuICBzZWxmLl9yZWFkID0gZnVuY3Rpb24obikge1xuICAgIGRlYnVnKCd3cmFwcGVkIF9yZWFkJywgbik7XG4gICAgaWYgKHBhdXNlZCkge1xuICAgICAgcGF1c2VkID0gZmFsc2U7XG4gICAgICBzdHJlYW0ucmVzdW1lKCk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBzZWxmO1xufTtcblxuXG4vLyBleHBvc2VkIGZvciB0ZXN0aW5nIHB1cnBvc2VzIG9ubHkuXG5SZWFkYWJsZS5fZnJvbUxpc3QgPSBmcm9tTGlzdDtcblxuLy8gUGx1Y2sgb2ZmIG4gYnl0ZXMgZnJvbSBhbiBhcnJheSBvZiBidWZmZXJzLlxuLy8gTGVuZ3RoIGlzIHRoZSBjb21iaW5lZCBsZW5ndGhzIG9mIGFsbCB0aGUgYnVmZmVycyBpbiB0aGUgbGlzdC5cbmZ1bmN0aW9uIGZyb21MaXN0KG4sIHN0YXRlKSB7XG4gIHZhciBsaXN0ID0gc3RhdGUuYnVmZmVyO1xuICB2YXIgbGVuZ3RoID0gc3RhdGUubGVuZ3RoO1xuICB2YXIgc3RyaW5nTW9kZSA9ICEhc3RhdGUuZGVjb2RlcjtcbiAgdmFyIG9iamVjdE1vZGUgPSAhIXN0YXRlLm9iamVjdE1vZGU7XG4gIHZhciByZXQ7XG5cbiAgLy8gbm90aGluZyBpbiB0aGUgbGlzdCwgZGVmaW5pdGVseSBlbXB0eS5cbiAgaWYgKGxpc3QubGVuZ3RoID09PSAwKVxuICAgIHJldHVybiBudWxsO1xuXG4gIGlmIChsZW5ndGggPT09IDApXG4gICAgcmV0ID0gbnVsbDtcbiAgZWxzZSBpZiAob2JqZWN0TW9kZSlcbiAgICByZXQgPSBsaXN0LnNoaWZ0KCk7XG4gIGVsc2UgaWYgKCFuIHx8IG4gPj0gbGVuZ3RoKSB7XG4gICAgLy8gcmVhZCBpdCBhbGwsIHRydW5jYXRlIHRoZSBhcnJheS5cbiAgICBpZiAoc3RyaW5nTW9kZSlcbiAgICAgIHJldCA9IGxpc3Quam9pbignJyk7XG4gICAgZWxzZSBpZiAobGlzdC5sZW5ndGggPT09IDEpXG4gICAgICByZXQgPSBsaXN0WzBdO1xuICAgIGVsc2VcbiAgICAgIHJldCA9IEJ1ZmZlci5jb25jYXQobGlzdCwgbGVuZ3RoKTtcbiAgICBsaXN0Lmxlbmd0aCA9IDA7XG4gIH0gZWxzZSB7XG4gICAgLy8gcmVhZCBqdXN0IHNvbWUgb2YgaXQuXG4gICAgaWYgKG4gPCBsaXN0WzBdLmxlbmd0aCkge1xuICAgICAgLy8ganVzdCB0YWtlIGEgcGFydCBvZiB0aGUgZmlyc3QgbGlzdCBpdGVtLlxuICAgICAgLy8gc2xpY2UgaXMgdGhlIHNhbWUgZm9yIGJ1ZmZlcnMgYW5kIHN0cmluZ3MuXG4gICAgICB2YXIgYnVmID0gbGlzdFswXTtcbiAgICAgIHJldCA9IGJ1Zi5zbGljZSgwLCBuKTtcbiAgICAgIGxpc3RbMF0gPSBidWYuc2xpY2Uobik7XG4gICAgfSBlbHNlIGlmIChuID09PSBsaXN0WzBdLmxlbmd0aCkge1xuICAgICAgLy8gZmlyc3QgbGlzdCBpcyBhIHBlcmZlY3QgbWF0Y2hcbiAgICAgIHJldCA9IGxpc3Quc2hpZnQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gY29tcGxleCBjYXNlLlxuICAgICAgLy8gd2UgaGF2ZSBlbm91Z2ggdG8gY292ZXIgaXQsIGJ1dCBpdCBzcGFucyBwYXN0IHRoZSBmaXJzdCBidWZmZXIuXG4gICAgICBpZiAoc3RyaW5nTW9kZSlcbiAgICAgICAgcmV0ID0gJyc7XG4gICAgICBlbHNlXG4gICAgICAgIHJldCA9IG5ldyBCdWZmZXIobik7XG5cbiAgICAgIHZhciBjID0gMDtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gbGlzdC5sZW5ndGg7IGkgPCBsICYmIGMgPCBuOyBpKyspIHtcbiAgICAgICAgdmFyIGJ1ZiA9IGxpc3RbMF07XG4gICAgICAgIHZhciBjcHkgPSBNYXRoLm1pbihuIC0gYywgYnVmLmxlbmd0aCk7XG5cbiAgICAgICAgaWYgKHN0cmluZ01vZGUpXG4gICAgICAgICAgcmV0ICs9IGJ1Zi5zbGljZSgwLCBjcHkpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgYnVmLmNvcHkocmV0LCBjLCAwLCBjcHkpO1xuXG4gICAgICAgIGlmIChjcHkgPCBidWYubGVuZ3RoKVxuICAgICAgICAgIGxpc3RbMF0gPSBidWYuc2xpY2UoY3B5KTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgIGxpc3Quc2hpZnQoKTtcblxuICAgICAgICBjICs9IGNweTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmV0O1xufVxuXG5mdW5jdGlvbiBlbmRSZWFkYWJsZShzdHJlYW0pIHtcbiAgdmFyIHN0YXRlID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlO1xuXG4gIC8vIElmIHdlIGdldCBoZXJlIGJlZm9yZSBjb25zdW1pbmcgYWxsIHRoZSBieXRlcywgdGhlbiB0aGF0IGlzIGFcbiAgLy8gYnVnIGluIG5vZGUuICBTaG91bGQgbmV2ZXIgaGFwcGVuLlxuICBpZiAoc3RhdGUubGVuZ3RoID4gMClcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2VuZFJlYWRhYmxlIGNhbGxlZCBvbiBub24tZW1wdHkgc3RyZWFtJyk7XG5cbiAgaWYgKCFzdGF0ZS5lbmRFbWl0dGVkKSB7XG4gICAgc3RhdGUuZW5kZWQgPSB0cnVlO1xuICAgIHByb2Nlc3NOZXh0VGljayhlbmRSZWFkYWJsZU5ULCBzdGF0ZSwgc3RyZWFtKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBlbmRSZWFkYWJsZU5UKHN0YXRlLCBzdHJlYW0pIHtcbiAgLy8gQ2hlY2sgdGhhdCB3ZSBkaWRuJ3QgZ2V0IG9uZSBsYXN0IHVuc2hpZnQuXG4gIGlmICghc3RhdGUuZW5kRW1pdHRlZCAmJiBzdGF0ZS5sZW5ndGggPT09IDApIHtcbiAgICBzdGF0ZS5lbmRFbWl0dGVkID0gdHJ1ZTtcbiAgICBzdHJlYW0ucmVhZGFibGUgPSBmYWxzZTtcbiAgICBzdHJlYW0uZW1pdCgnZW5kJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZm9yRWFjaCAoeHMsIGYpIHtcbiAgZm9yICh2YXIgaSA9IDAsIGwgPSB4cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBmKHhzW2ldLCBpKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpbmRleE9mICh4cywgeCkge1xuICBmb3IgKHZhciBpID0gMCwgbCA9IHhzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGlmICh4c1tpXSA9PT0geCkgcmV0dXJuIGk7XG4gIH1cbiAgcmV0dXJuIC0xO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCJcblxubW9kdWxlLmV4cG9ydHMgPSBjcmVhdGVSQlRyZWVcblxudmFyIFJFRCAgID0gMFxudmFyIEJMQUNLID0gMVxuXG5mdW5jdGlvbiBSQk5vZGUoY29sb3IsIGtleSwgdmFsdWUsIGxlZnQsIHJpZ2h0LCBjb3VudCkge1xuICB0aGlzLl9jb2xvciA9IGNvbG9yXG4gIHRoaXMua2V5ID0ga2V5XG4gIHRoaXMudmFsdWUgPSB2YWx1ZVxuICB0aGlzLmxlZnQgPSBsZWZ0XG4gIHRoaXMucmlnaHQgPSByaWdodFxuICB0aGlzLl9jb3VudCA9IGNvdW50XG59XG5cbmZ1bmN0aW9uIGNsb25lTm9kZShub2RlKSB7XG4gIHJldHVybiBuZXcgUkJOb2RlKG5vZGUuX2NvbG9yLCBub2RlLmtleSwgbm9kZS52YWx1ZSwgbm9kZS5sZWZ0LCBub2RlLnJpZ2h0LCBub2RlLl9jb3VudClcbn1cblxuZnVuY3Rpb24gcmVwYWludChjb2xvciwgbm9kZSkge1xuICByZXR1cm4gbmV3IFJCTm9kZShjb2xvciwgbm9kZS5rZXksIG5vZGUudmFsdWUsIG5vZGUubGVmdCwgbm9kZS5yaWdodCwgbm9kZS5fY291bnQpXG59XG5cbmZ1bmN0aW9uIHJlY291bnQobm9kZSkge1xuICBub2RlLl9jb3VudCA9IDEgKyAobm9kZS5sZWZ0ID8gbm9kZS5sZWZ0Ll9jb3VudCA6IDApICsgKG5vZGUucmlnaHQgPyBub2RlLnJpZ2h0Ll9jb3VudCA6IDApXG59XG5cbmZ1bmN0aW9uIFJlZEJsYWNrVHJlZShjb21wYXJlLCByb290KSB7XG4gIHRoaXMuX2NvbXBhcmUgPSBjb21wYXJlXG4gIHRoaXMucm9vdCA9IHJvb3Rcbn1cblxudmFyIHByb3RvID0gUmVkQmxhY2tUcmVlLnByb3RvdHlwZVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkocHJvdG8sIFwia2V5c1wiLCB7XG4gIGdldDogZnVuY3Rpb24oKSB7XG4gICAgdmFyIHJlc3VsdCA9IFtdXG4gICAgdGhpcy5mb3JFYWNoKGZ1bmN0aW9uKGssdikge1xuICAgICAgcmVzdWx0LnB1c2goaylcbiAgICB9KVxuICAgIHJldHVybiByZXN1bHRcbiAgfVxufSlcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3RvLCBcInZhbHVlc1wiLCB7XG4gIGdldDogZnVuY3Rpb24oKSB7XG4gICAgdmFyIHJlc3VsdCA9IFtdXG4gICAgdGhpcy5mb3JFYWNoKGZ1bmN0aW9uKGssdikge1xuICAgICAgcmVzdWx0LnB1c2godilcbiAgICB9KVxuICAgIHJldHVybiByZXN1bHRcbiAgfVxufSlcblxuLy9SZXR1cm5zIHRoZSBudW1iZXIgb2Ygbm9kZXMgaW4gdGhlIHRyZWVcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShwcm90bywgXCJsZW5ndGhcIiwge1xuICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgIGlmKHRoaXMucm9vdCkge1xuICAgICAgcmV0dXJuIHRoaXMucm9vdC5fY291bnRcbiAgICB9XG4gICAgcmV0dXJuIDBcbiAgfVxufSlcblxuLy9JbnNlcnQgYSBuZXcgaXRlbSBpbnRvIHRoZSB0cmVlXG5wcm90by5pbnNlcnQgPSBmdW5jdGlvbihrZXksIHZhbHVlKSB7XG4gIHZhciBjbXAgPSB0aGlzLl9jb21wYXJlXG4gIC8vRmluZCBwb2ludCB0byBpbnNlcnQgbmV3IG5vZGUgYXRcbiAgdmFyIG4gPSB0aGlzLnJvb3RcbiAgdmFyIG5fc3RhY2sgPSBbXVxuICB2YXIgZF9zdGFjayA9IFtdXG4gIHdoaWxlKG4pIHtcbiAgICB2YXIgZCA9IGNtcChrZXksIG4ua2V5KVxuICAgIG5fc3RhY2sucHVzaChuKVxuICAgIGRfc3RhY2sucHVzaChkKVxuICAgIGlmKGQgPD0gMCkge1xuICAgICAgbiA9IG4ubGVmdFxuICAgIH0gZWxzZSB7XG4gICAgICBuID0gbi5yaWdodFxuICAgIH1cbiAgfVxuICAvL1JlYnVpbGQgcGF0aCB0byBsZWFmIG5vZGVcbiAgbl9zdGFjay5wdXNoKG5ldyBSQk5vZGUoUkVELCBrZXksIHZhbHVlLCBudWxsLCBudWxsLCAxKSlcbiAgZm9yKHZhciBzPW5fc3RhY2subGVuZ3RoLTI7IHM+PTA7IC0tcykge1xuICAgIHZhciBuID0gbl9zdGFja1tzXVxuICAgIGlmKGRfc3RhY2tbc10gPD0gMCkge1xuICAgICAgbl9zdGFja1tzXSA9IG5ldyBSQk5vZGUobi5fY29sb3IsIG4ua2V5LCBuLnZhbHVlLCBuX3N0YWNrW3MrMV0sIG4ucmlnaHQsIG4uX2NvdW50KzEpXG4gICAgfSBlbHNlIHtcbiAgICAgIG5fc3RhY2tbc10gPSBuZXcgUkJOb2RlKG4uX2NvbG9yLCBuLmtleSwgbi52YWx1ZSwgbi5sZWZ0LCBuX3N0YWNrW3MrMV0sIG4uX2NvdW50KzEpXG4gICAgfVxuICB9XG4gIC8vUmViYWxhbmNlIHRyZWUgdXNpbmcgcm90YXRpb25zXG4gIC8vY29uc29sZS5sb2coXCJzdGFydCBpbnNlcnRcIiwga2V5LCBkX3N0YWNrKVxuICBmb3IodmFyIHM9bl9zdGFjay5sZW5ndGgtMTsgcz4xOyAtLXMpIHtcbiAgICB2YXIgcCA9IG5fc3RhY2tbcy0xXVxuICAgIHZhciBuID0gbl9zdGFja1tzXVxuICAgIGlmKHAuX2NvbG9yID09PSBCTEFDSyB8fCBuLl9jb2xvciA9PT0gQkxBQ0spIHtcbiAgICAgIGJyZWFrXG4gICAgfVxuICAgIHZhciBwcCA9IG5fc3RhY2tbcy0yXVxuICAgIGlmKHBwLmxlZnQgPT09IHApIHtcbiAgICAgIGlmKHAubGVmdCA9PT0gbikge1xuICAgICAgICB2YXIgeSA9IHBwLnJpZ2h0XG4gICAgICAgIGlmKHkgJiYgeS5fY29sb3IgPT09IFJFRCkge1xuICAgICAgICAgIC8vY29uc29sZS5sb2coXCJMTHJcIilcbiAgICAgICAgICBwLl9jb2xvciA9IEJMQUNLXG4gICAgICAgICAgcHAucmlnaHQgPSByZXBhaW50KEJMQUNLLCB5KVxuICAgICAgICAgIHBwLl9jb2xvciA9IFJFRFxuICAgICAgICAgIHMgLT0gMVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vY29uc29sZS5sb2coXCJMTGJcIilcbiAgICAgICAgICBwcC5fY29sb3IgPSBSRURcbiAgICAgICAgICBwcC5sZWZ0ID0gcC5yaWdodFxuICAgICAgICAgIHAuX2NvbG9yID0gQkxBQ0tcbiAgICAgICAgICBwLnJpZ2h0ID0gcHBcbiAgICAgICAgICBuX3N0YWNrW3MtMl0gPSBwXG4gICAgICAgICAgbl9zdGFja1tzLTFdID0gblxuICAgICAgICAgIHJlY291bnQocHApXG4gICAgICAgICAgcmVjb3VudChwKVxuICAgICAgICAgIGlmKHMgPj0gMykge1xuICAgICAgICAgICAgdmFyIHBwcCA9IG5fc3RhY2tbcy0zXVxuICAgICAgICAgICAgaWYocHBwLmxlZnQgPT09IHBwKSB7XG4gICAgICAgICAgICAgIHBwcC5sZWZ0ID0gcFxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcHBwLnJpZ2h0ID0gcFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgeSA9IHBwLnJpZ2h0XG4gICAgICAgIGlmKHkgJiYgeS5fY29sb3IgPT09IFJFRCkge1xuICAgICAgICAgIC8vY29uc29sZS5sb2coXCJMUnJcIilcbiAgICAgICAgICBwLl9jb2xvciA9IEJMQUNLXG4gICAgICAgICAgcHAucmlnaHQgPSByZXBhaW50KEJMQUNLLCB5KVxuICAgICAgICAgIHBwLl9jb2xvciA9IFJFRFxuICAgICAgICAgIHMgLT0gMVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vY29uc29sZS5sb2coXCJMUmJcIilcbiAgICAgICAgICBwLnJpZ2h0ID0gbi5sZWZ0XG4gICAgICAgICAgcHAuX2NvbG9yID0gUkVEXG4gICAgICAgICAgcHAubGVmdCA9IG4ucmlnaHRcbiAgICAgICAgICBuLl9jb2xvciA9IEJMQUNLXG4gICAgICAgICAgbi5sZWZ0ID0gcFxuICAgICAgICAgIG4ucmlnaHQgPSBwcFxuICAgICAgICAgIG5fc3RhY2tbcy0yXSA9IG5cbiAgICAgICAgICBuX3N0YWNrW3MtMV0gPSBwXG4gICAgICAgICAgcmVjb3VudChwcClcbiAgICAgICAgICByZWNvdW50KHApXG4gICAgICAgICAgcmVjb3VudChuKVxuICAgICAgICAgIGlmKHMgPj0gMykge1xuICAgICAgICAgICAgdmFyIHBwcCA9IG5fc3RhY2tbcy0zXVxuICAgICAgICAgICAgaWYocHBwLmxlZnQgPT09IHBwKSB7XG4gICAgICAgICAgICAgIHBwcC5sZWZ0ID0gblxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcHBwLnJpZ2h0ID0gblxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmKHAucmlnaHQgPT09IG4pIHtcbiAgICAgICAgdmFyIHkgPSBwcC5sZWZ0XG4gICAgICAgIGlmKHkgJiYgeS5fY29sb3IgPT09IFJFRCkge1xuICAgICAgICAgIC8vY29uc29sZS5sb2coXCJSUnJcIiwgeS5rZXkpXG4gICAgICAgICAgcC5fY29sb3IgPSBCTEFDS1xuICAgICAgICAgIHBwLmxlZnQgPSByZXBhaW50KEJMQUNLLCB5KVxuICAgICAgICAgIHBwLl9jb2xvciA9IFJFRFxuICAgICAgICAgIHMgLT0gMVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vY29uc29sZS5sb2coXCJSUmJcIilcbiAgICAgICAgICBwcC5fY29sb3IgPSBSRURcbiAgICAgICAgICBwcC5yaWdodCA9IHAubGVmdFxuICAgICAgICAgIHAuX2NvbG9yID0gQkxBQ0tcbiAgICAgICAgICBwLmxlZnQgPSBwcFxuICAgICAgICAgIG5fc3RhY2tbcy0yXSA9IHBcbiAgICAgICAgICBuX3N0YWNrW3MtMV0gPSBuXG4gICAgICAgICAgcmVjb3VudChwcClcbiAgICAgICAgICByZWNvdW50KHApXG4gICAgICAgICAgaWYocyA+PSAzKSB7XG4gICAgICAgICAgICB2YXIgcHBwID0gbl9zdGFja1tzLTNdXG4gICAgICAgICAgICBpZihwcHAucmlnaHQgPT09IHBwKSB7XG4gICAgICAgICAgICAgIHBwcC5yaWdodCA9IHBcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHBwcC5sZWZ0ID0gcFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgeSA9IHBwLmxlZnRcbiAgICAgICAgaWYoeSAmJiB5Ll9jb2xvciA9PT0gUkVEKSB7XG4gICAgICAgICAgLy9jb25zb2xlLmxvZyhcIlJMclwiKVxuICAgICAgICAgIHAuX2NvbG9yID0gQkxBQ0tcbiAgICAgICAgICBwcC5sZWZ0ID0gcmVwYWludChCTEFDSywgeSlcbiAgICAgICAgICBwcC5fY29sb3IgPSBSRURcbiAgICAgICAgICBzIC09IDFcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvL2NvbnNvbGUubG9nKFwiUkxiXCIpXG4gICAgICAgICAgcC5sZWZ0ID0gbi5yaWdodFxuICAgICAgICAgIHBwLl9jb2xvciA9IFJFRFxuICAgICAgICAgIHBwLnJpZ2h0ID0gbi5sZWZ0XG4gICAgICAgICAgbi5fY29sb3IgPSBCTEFDS1xuICAgICAgICAgIG4ucmlnaHQgPSBwXG4gICAgICAgICAgbi5sZWZ0ID0gcHBcbiAgICAgICAgICBuX3N0YWNrW3MtMl0gPSBuXG4gICAgICAgICAgbl9zdGFja1tzLTFdID0gcFxuICAgICAgICAgIHJlY291bnQocHApXG4gICAgICAgICAgcmVjb3VudChwKVxuICAgICAgICAgIHJlY291bnQobilcbiAgICAgICAgICBpZihzID49IDMpIHtcbiAgICAgICAgICAgIHZhciBwcHAgPSBuX3N0YWNrW3MtM11cbiAgICAgICAgICAgIGlmKHBwcC5yaWdodCA9PT0gcHApIHtcbiAgICAgICAgICAgICAgcHBwLnJpZ2h0ID0gblxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcHBwLmxlZnQgPSBuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLy9SZXR1cm4gbmV3IHRyZWVcbiAgbl9zdGFja1swXS5fY29sb3IgPSBCTEFDS1xuICByZXR1cm4gbmV3IFJlZEJsYWNrVHJlZShjbXAsIG5fc3RhY2tbMF0pXG59XG5cblxuLy9WaXNpdCBhbGwgbm9kZXMgaW5vcmRlclxuZnVuY3Rpb24gZG9WaXNpdEZ1bGwodmlzaXQsIG5vZGUpIHtcbiAgaWYobm9kZS5sZWZ0KSB7XG4gICAgdmFyIHYgPSBkb1Zpc2l0RnVsbCh2aXNpdCwgbm9kZS5sZWZ0KVxuICAgIGlmKHYpIHsgcmV0dXJuIHYgfVxuICB9XG4gIHZhciB2ID0gdmlzaXQobm9kZS5rZXksIG5vZGUudmFsdWUpXG4gIGlmKHYpIHsgcmV0dXJuIHYgfVxuICBpZihub2RlLnJpZ2h0KSB7XG4gICAgcmV0dXJuIGRvVmlzaXRGdWxsKHZpc2l0LCBub2RlLnJpZ2h0KVxuICB9XG59XG5cbi8vVmlzaXQgaGFsZiBub2RlcyBpbiBvcmRlclxuZnVuY3Rpb24gZG9WaXNpdEhhbGYobG8sIGNvbXBhcmUsIHZpc2l0LCBub2RlKSB7XG4gIHZhciBsID0gY29tcGFyZShsbywgbm9kZS5rZXkpXG4gIGlmKGwgPD0gMCkge1xuICAgIGlmKG5vZGUubGVmdCkge1xuICAgICAgdmFyIHYgPSBkb1Zpc2l0SGFsZihsbywgY29tcGFyZSwgdmlzaXQsIG5vZGUubGVmdClcbiAgICAgIGlmKHYpIHsgcmV0dXJuIHYgfVxuICAgIH1cbiAgICB2YXIgdiA9IHZpc2l0KG5vZGUua2V5LCBub2RlLnZhbHVlKVxuICAgIGlmKHYpIHsgcmV0dXJuIHYgfVxuICB9XG4gIGlmKG5vZGUucmlnaHQpIHtcbiAgICByZXR1cm4gZG9WaXNpdEhhbGYobG8sIGNvbXBhcmUsIHZpc2l0LCBub2RlLnJpZ2h0KVxuICB9XG59XG5cbi8vVmlzaXQgYWxsIG5vZGVzIHdpdGhpbiBhIHJhbmdlXG5mdW5jdGlvbiBkb1Zpc2l0KGxvLCBoaSwgY29tcGFyZSwgdmlzaXQsIG5vZGUpIHtcbiAgdmFyIGwgPSBjb21wYXJlKGxvLCBub2RlLmtleSlcbiAgdmFyIGggPSBjb21wYXJlKGhpLCBub2RlLmtleSlcbiAgdmFyIHZcbiAgaWYobCA8PSAwKSB7XG4gICAgaWYobm9kZS5sZWZ0KSB7XG4gICAgICB2ID0gZG9WaXNpdChsbywgaGksIGNvbXBhcmUsIHZpc2l0LCBub2RlLmxlZnQpXG4gICAgICBpZih2KSB7IHJldHVybiB2IH1cbiAgICB9XG4gICAgaWYoaCA+IDApIHtcbiAgICAgIHYgPSB2aXNpdChub2RlLmtleSwgbm9kZS52YWx1ZSlcbiAgICAgIGlmKHYpIHsgcmV0dXJuIHYgfVxuICAgIH1cbiAgfVxuICBpZihoID4gMCAmJiBub2RlLnJpZ2h0KSB7XG4gICAgcmV0dXJuIGRvVmlzaXQobG8sIGhpLCBjb21wYXJlLCB2aXNpdCwgbm9kZS5yaWdodClcbiAgfVxufVxuXG5cbnByb3RvLmZvckVhY2ggPSBmdW5jdGlvbiByYlRyZWVGb3JFYWNoKHZpc2l0LCBsbywgaGkpIHtcbiAgaWYoIXRoaXMucm9vdCkge1xuICAgIHJldHVyblxuICB9XG4gIHN3aXRjaChhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgY2FzZSAxOlxuICAgICAgcmV0dXJuIGRvVmlzaXRGdWxsKHZpc2l0LCB0aGlzLnJvb3QpXG4gICAgYnJlYWtcblxuICAgIGNhc2UgMjpcbiAgICAgIHJldHVybiBkb1Zpc2l0SGFsZihsbywgdGhpcy5fY29tcGFyZSwgdmlzaXQsIHRoaXMucm9vdClcbiAgICBicmVha1xuXG4gICAgY2FzZSAzOlxuICAgICAgaWYodGhpcy5fY29tcGFyZShsbywgaGkpID49IDApIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICByZXR1cm4gZG9WaXNpdChsbywgaGksIHRoaXMuX2NvbXBhcmUsIHZpc2l0LCB0aGlzLnJvb3QpXG4gICAgYnJlYWtcbiAgfVxufVxuXG4vL0ZpcnN0IGl0ZW0gaW4gbGlzdFxuT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3RvLCBcImJlZ2luXCIsIHtcbiAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc3RhY2sgPSBbXVxuICAgIHZhciBuID0gdGhpcy5yb290XG4gICAgd2hpbGUobikge1xuICAgICAgc3RhY2sucHVzaChuKVxuICAgICAgbiA9IG4ubGVmdFxuICAgIH1cbiAgICByZXR1cm4gbmV3IFJlZEJsYWNrVHJlZUl0ZXJhdG9yKHRoaXMsIHN0YWNrKVxuICB9XG59KVxuXG4vL0xhc3QgaXRlbSBpbiBsaXN0XG5PYmplY3QuZGVmaW5lUHJvcGVydHkocHJvdG8sIFwiZW5kXCIsIHtcbiAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc3RhY2sgPSBbXVxuICAgIHZhciBuID0gdGhpcy5yb290XG4gICAgd2hpbGUobikge1xuICAgICAgc3RhY2sucHVzaChuKVxuICAgICAgbiA9IG4ucmlnaHRcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBSZWRCbGFja1RyZWVJdGVyYXRvcih0aGlzLCBzdGFjaylcbiAgfVxufSlcblxuLy9GaW5kIHRoZSBpdGggaXRlbSBpbiB0aGUgdHJlZVxucHJvdG8uYXQgPSBmdW5jdGlvbihpZHgpIHtcbiAgaWYoaWR4IDwgMCkge1xuICAgIHJldHVybiBuZXcgUmVkQmxhY2tUcmVlSXRlcmF0b3IodGhpcywgW10pXG4gIH1cbiAgdmFyIG4gPSB0aGlzLnJvb3RcbiAgdmFyIHN0YWNrID0gW11cbiAgd2hpbGUodHJ1ZSkge1xuICAgIHN0YWNrLnB1c2gobilcbiAgICBpZihuLmxlZnQpIHtcbiAgICAgIGlmKGlkeCA8IG4ubGVmdC5fY291bnQpIHtcbiAgICAgICAgbiA9IG4ubGVmdFxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuICAgICAgaWR4IC09IG4ubGVmdC5fY291bnRcbiAgICB9XG4gICAgaWYoIWlkeCkge1xuICAgICAgcmV0dXJuIG5ldyBSZWRCbGFja1RyZWVJdGVyYXRvcih0aGlzLCBzdGFjaylcbiAgICB9XG4gICAgaWR4IC09IDFcbiAgICBpZihuLnJpZ2h0KSB7XG4gICAgICBpZihpZHggPj0gbi5yaWdodC5fY291bnQpIHtcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIG4gPSBuLnJpZ2h0XG4gICAgfSBlbHNlIHtcbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG4gIHJldHVybiBuZXcgUmVkQmxhY2tUcmVlSXRlcmF0b3IodGhpcywgW10pXG59XG5cbnByb3RvLmdlID0gZnVuY3Rpb24oa2V5KSB7XG4gIHZhciBjbXAgPSB0aGlzLl9jb21wYXJlXG4gIHZhciBuID0gdGhpcy5yb290XG4gIHZhciBzdGFjayA9IFtdXG4gIHZhciBsYXN0X3B0ciA9IDBcbiAgd2hpbGUobikge1xuICAgIHZhciBkID0gY21wKGtleSwgbi5rZXkpXG4gICAgc3RhY2sucHVzaChuKVxuICAgIGlmKGQgPD0gMCkge1xuICAgICAgbGFzdF9wdHIgPSBzdGFjay5sZW5ndGhcbiAgICB9XG4gICAgaWYoZCA8PSAwKSB7XG4gICAgICBuID0gbi5sZWZ0XG4gICAgfSBlbHNlIHtcbiAgICAgIG4gPSBuLnJpZ2h0XG4gICAgfVxuICB9XG4gIHN0YWNrLmxlbmd0aCA9IGxhc3RfcHRyXG4gIHJldHVybiBuZXcgUmVkQmxhY2tUcmVlSXRlcmF0b3IodGhpcywgc3RhY2spXG59XG5cbnByb3RvLmd0ID0gZnVuY3Rpb24oa2V5KSB7XG4gIHZhciBjbXAgPSB0aGlzLl9jb21wYXJlXG4gIHZhciBuID0gdGhpcy5yb290XG4gIHZhciBzdGFjayA9IFtdXG4gIHZhciBsYXN0X3B0ciA9IDBcbiAgd2hpbGUobikge1xuICAgIHZhciBkID0gY21wKGtleSwgbi5rZXkpXG4gICAgc3RhY2sucHVzaChuKVxuICAgIGlmKGQgPCAwKSB7XG4gICAgICBsYXN0X3B0ciA9IHN0YWNrLmxlbmd0aFxuICAgIH1cbiAgICBpZihkIDwgMCkge1xuICAgICAgbiA9IG4ubGVmdFxuICAgIH0gZWxzZSB7XG4gICAgICBuID0gbi5yaWdodFxuICAgIH1cbiAgfVxuICBzdGFjay5sZW5ndGggPSBsYXN0X3B0clxuICByZXR1cm4gbmV3IFJlZEJsYWNrVHJlZUl0ZXJhdG9yKHRoaXMsIHN0YWNrKVxufVxuXG5wcm90by5sdCA9IGZ1bmN0aW9uKGtleSkge1xuICB2YXIgY21wID0gdGhpcy5fY29tcGFyZVxuICB2YXIgbiA9IHRoaXMucm9vdFxuICB2YXIgc3RhY2sgPSBbXVxuICB2YXIgbGFzdF9wdHIgPSAwXG4gIHdoaWxlKG4pIHtcbiAgICB2YXIgZCA9IGNtcChrZXksIG4ua2V5KVxuICAgIHN0YWNrLnB1c2gobilcbiAgICBpZihkID4gMCkge1xuICAgICAgbGFzdF9wdHIgPSBzdGFjay5sZW5ndGhcbiAgICB9XG4gICAgaWYoZCA8PSAwKSB7XG4gICAgICBuID0gbi5sZWZ0XG4gICAgfSBlbHNlIHtcbiAgICAgIG4gPSBuLnJpZ2h0XG4gICAgfVxuICB9XG4gIHN0YWNrLmxlbmd0aCA9IGxhc3RfcHRyXG4gIHJldHVybiBuZXcgUmVkQmxhY2tUcmVlSXRlcmF0b3IodGhpcywgc3RhY2spXG59XG5cbnByb3RvLmxlID0gZnVuY3Rpb24oa2V5KSB7XG4gIHZhciBjbXAgPSB0aGlzLl9jb21wYXJlXG4gIHZhciBuID0gdGhpcy5yb290XG4gIHZhciBzdGFjayA9IFtdXG4gIHZhciBsYXN0X3B0ciA9IDBcbiAgd2hpbGUobikge1xuICAgIHZhciBkID0gY21wKGtleSwgbi5rZXkpXG4gICAgc3RhY2sucHVzaChuKVxuICAgIGlmKGQgPj0gMCkge1xuICAgICAgbGFzdF9wdHIgPSBzdGFjay5sZW5ndGhcbiAgICB9XG4gICAgaWYoZCA8IDApIHtcbiAgICAgIG4gPSBuLmxlZnRcbiAgICB9IGVsc2Uge1xuICAgICAgbiA9IG4ucmlnaHRcbiAgICB9XG4gIH1cbiAgc3RhY2subGVuZ3RoID0gbGFzdF9wdHJcbiAgcmV0dXJuIG5ldyBSZWRCbGFja1RyZWVJdGVyYXRvcih0aGlzLCBzdGFjaylcbn1cblxuLy9GaW5kcyB0aGUgaXRlbSB3aXRoIGtleSBpZiBpdCBleGlzdHNcbnByb3RvLmZpbmQgPSBmdW5jdGlvbihrZXkpIHtcbiAgdmFyIGNtcCA9IHRoaXMuX2NvbXBhcmVcbiAgdmFyIG4gPSB0aGlzLnJvb3RcbiAgdmFyIHN0YWNrID0gW11cbiAgd2hpbGUobikge1xuICAgIHZhciBkID0gY21wKGtleSwgbi5rZXkpXG4gICAgc3RhY2sucHVzaChuKVxuICAgIGlmKGQgPT09IDApIHtcbiAgICAgIHJldHVybiBuZXcgUmVkQmxhY2tUcmVlSXRlcmF0b3IodGhpcywgc3RhY2spXG4gICAgfVxuICAgIGlmKGQgPD0gMCkge1xuICAgICAgbiA9IG4ubGVmdFxuICAgIH0gZWxzZSB7XG4gICAgICBuID0gbi5yaWdodFxuICAgIH1cbiAgfVxuICByZXR1cm4gbmV3IFJlZEJsYWNrVHJlZUl0ZXJhdG9yKHRoaXMsIFtdKVxufVxuXG4vL1JlbW92ZXMgaXRlbSB3aXRoIGtleSBmcm9tIHRyZWVcbnByb3RvLnJlbW92ZSA9IGZ1bmN0aW9uKGtleSkge1xuICB2YXIgaXRlciA9IHRoaXMuZmluZChrZXkpXG4gIGlmKGl0ZXIpIHtcbiAgICByZXR1cm4gaXRlci5yZW1vdmUoKVxuICB9XG4gIHJldHVybiB0aGlzXG59XG5cbi8vUmV0dXJucyB0aGUgaXRlbSBhdCBga2V5YFxucHJvdG8uZ2V0ID0gZnVuY3Rpb24oa2V5KSB7XG4gIHZhciBjbXAgPSB0aGlzLl9jb21wYXJlXG4gIHZhciBuID0gdGhpcy5yb290XG4gIHdoaWxlKG4pIHtcbiAgICB2YXIgZCA9IGNtcChrZXksIG4ua2V5KVxuICAgIGlmKGQgPT09IDApIHtcbiAgICAgIHJldHVybiBuLnZhbHVlXG4gICAgfVxuICAgIGlmKGQgPD0gMCkge1xuICAgICAgbiA9IG4ubGVmdFxuICAgIH0gZWxzZSB7XG4gICAgICBuID0gbi5yaWdodFxuICAgIH1cbiAgfVxuICByZXR1cm5cbn1cblxuLy9JdGVyYXRvciBmb3IgcmVkIGJsYWNrIHRyZWVcbmZ1bmN0aW9uIFJlZEJsYWNrVHJlZUl0ZXJhdG9yKHRyZWUsIHN0YWNrKSB7XG4gIHRoaXMudHJlZSA9IHRyZWVcbiAgdGhpcy5fc3RhY2sgPSBzdGFja1xufVxuXG52YXIgaXByb3RvID0gUmVkQmxhY2tUcmVlSXRlcmF0b3IucHJvdG90eXBlXG5cbi8vVGVzdCBpZiBpdGVyYXRvciBpcyB2YWxpZFxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGlwcm90bywgXCJ2YWxpZFwiLCB7XG4gIGdldDogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YWNrLmxlbmd0aCA+IDBcbiAgfVxufSlcblxuLy9Ob2RlIG9mIHRoZSBpdGVyYXRvclxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGlwcm90bywgXCJub2RlXCIsIHtcbiAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICBpZih0aGlzLl9zdGFjay5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gdGhpcy5fc3RhY2tbdGhpcy5fc3RhY2subGVuZ3RoLTFdXG4gICAgfVxuICAgIHJldHVybiBudWxsXG4gIH0sXG4gIGVudW1lcmFibGU6IHRydWVcbn0pXG5cbi8vTWFrZXMgYSBjb3B5IG9mIGFuIGl0ZXJhdG9yXG5pcHJvdG8uY2xvbmUgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBSZWRCbGFja1RyZWVJdGVyYXRvcih0aGlzLnRyZWUsIHRoaXMuX3N0YWNrLnNsaWNlKCkpXG59XG5cbi8vU3dhcHMgdHdvIG5vZGVzXG5mdW5jdGlvbiBzd2FwTm9kZShuLCB2KSB7XG4gIG4ua2V5ID0gdi5rZXlcbiAgbi52YWx1ZSA9IHYudmFsdWVcbiAgbi5sZWZ0ID0gdi5sZWZ0XG4gIG4ucmlnaHQgPSB2LnJpZ2h0XG4gIG4uX2NvbG9yID0gdi5fY29sb3JcbiAgbi5fY291bnQgPSB2Ll9jb3VudFxufVxuXG4vL0ZpeCB1cCBhIGRvdWJsZSBibGFjayBub2RlIGluIGEgdHJlZVxuZnVuY3Rpb24gZml4RG91YmxlQmxhY2soc3RhY2spIHtcbiAgdmFyIG4sIHAsIHMsIHpcbiAgZm9yKHZhciBpPXN0YWNrLmxlbmd0aC0xOyBpPj0wOyAtLWkpIHtcbiAgICBuID0gc3RhY2tbaV1cbiAgICBpZihpID09PSAwKSB7XG4gICAgICBuLl9jb2xvciA9IEJMQUNLXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgLy9jb25zb2xlLmxvZyhcInZpc2l0IG5vZGU6XCIsIG4ua2V5LCBpLCBzdGFja1tpXS5rZXksIHN0YWNrW2ktMV0ua2V5KVxuICAgIHAgPSBzdGFja1tpLTFdXG4gICAgaWYocC5sZWZ0ID09PSBuKSB7XG4gICAgICAvL2NvbnNvbGUubG9nKFwibGVmdCBjaGlsZFwiKVxuICAgICAgcyA9IHAucmlnaHRcbiAgICAgIGlmKHMucmlnaHQgJiYgcy5yaWdodC5fY29sb3IgPT09IFJFRCkge1xuICAgICAgICAvL2NvbnNvbGUubG9nKFwiY2FzZSAxOiByaWdodCBzaWJsaW5nIGNoaWxkIHJlZFwiKVxuICAgICAgICBzID0gcC5yaWdodCA9IGNsb25lTm9kZShzKVxuICAgICAgICB6ID0gcy5yaWdodCA9IGNsb25lTm9kZShzLnJpZ2h0KVxuICAgICAgICBwLnJpZ2h0ID0gcy5sZWZ0XG4gICAgICAgIHMubGVmdCA9IHBcbiAgICAgICAgcy5yaWdodCA9IHpcbiAgICAgICAgcy5fY29sb3IgPSBwLl9jb2xvclxuICAgICAgICBuLl9jb2xvciA9IEJMQUNLXG4gICAgICAgIHAuX2NvbG9yID0gQkxBQ0tcbiAgICAgICAgei5fY29sb3IgPSBCTEFDS1xuICAgICAgICByZWNvdW50KHApXG4gICAgICAgIHJlY291bnQocylcbiAgICAgICAgaWYoaSA+IDEpIHtcbiAgICAgICAgICB2YXIgcHAgPSBzdGFja1tpLTJdXG4gICAgICAgICAgaWYocHAubGVmdCA9PT0gcCkge1xuICAgICAgICAgICAgcHAubGVmdCA9IHNcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcHAucmlnaHQgPSBzXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHN0YWNrW2ktMV0gPSBzXG4gICAgICAgIHJldHVyblxuICAgICAgfSBlbHNlIGlmKHMubGVmdCAmJiBzLmxlZnQuX2NvbG9yID09PSBSRUQpIHtcbiAgICAgICAgLy9jb25zb2xlLmxvZyhcImNhc2UgMTogbGVmdCBzaWJsaW5nIGNoaWxkIHJlZFwiKVxuICAgICAgICBzID0gcC5yaWdodCA9IGNsb25lTm9kZShzKVxuICAgICAgICB6ID0gcy5sZWZ0ID0gY2xvbmVOb2RlKHMubGVmdClcbiAgICAgICAgcC5yaWdodCA9IHoubGVmdFxuICAgICAgICBzLmxlZnQgPSB6LnJpZ2h0XG4gICAgICAgIHoubGVmdCA9IHBcbiAgICAgICAgei5yaWdodCA9IHNcbiAgICAgICAgei5fY29sb3IgPSBwLl9jb2xvclxuICAgICAgICBwLl9jb2xvciA9IEJMQUNLXG4gICAgICAgIHMuX2NvbG9yID0gQkxBQ0tcbiAgICAgICAgbi5fY29sb3IgPSBCTEFDS1xuICAgICAgICByZWNvdW50KHApXG4gICAgICAgIHJlY291bnQocylcbiAgICAgICAgcmVjb3VudCh6KVxuICAgICAgICBpZihpID4gMSkge1xuICAgICAgICAgIHZhciBwcCA9IHN0YWNrW2ktMl1cbiAgICAgICAgICBpZihwcC5sZWZ0ID09PSBwKSB7XG4gICAgICAgICAgICBwcC5sZWZ0ID0gelxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwcC5yaWdodCA9IHpcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc3RhY2tbaS0xXSA9IHpcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBpZihzLl9jb2xvciA9PT0gQkxBQ0spIHtcbiAgICAgICAgaWYocC5fY29sb3IgPT09IFJFRCkge1xuICAgICAgICAgIC8vY29uc29sZS5sb2coXCJjYXNlIDI6IGJsYWNrIHNpYmxpbmcsIHJlZCBwYXJlbnRcIiwgcC5yaWdodC52YWx1ZSlcbiAgICAgICAgICBwLl9jb2xvciA9IEJMQUNLXG4gICAgICAgICAgcC5yaWdodCA9IHJlcGFpbnQoUkVELCBzKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vY29uc29sZS5sb2coXCJjYXNlIDI6IGJsYWNrIHNpYmxpbmcsIGJsYWNrIHBhcmVudFwiLCBwLnJpZ2h0LnZhbHVlKVxuICAgICAgICAgIHAucmlnaHQgPSByZXBhaW50KFJFRCwgcylcbiAgICAgICAgICBjb250aW51ZSAgXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vY29uc29sZS5sb2coXCJjYXNlIDM6IHJlZCBzaWJsaW5nXCIpXG4gICAgICAgIHMgPSBjbG9uZU5vZGUocylcbiAgICAgICAgcC5yaWdodCA9IHMubGVmdFxuICAgICAgICBzLmxlZnQgPSBwXG4gICAgICAgIHMuX2NvbG9yID0gcC5fY29sb3JcbiAgICAgICAgcC5fY29sb3IgPSBSRURcbiAgICAgICAgcmVjb3VudChwKVxuICAgICAgICByZWNvdW50KHMpXG4gICAgICAgIGlmKGkgPiAxKSB7XG4gICAgICAgICAgdmFyIHBwID0gc3RhY2tbaS0yXVxuICAgICAgICAgIGlmKHBwLmxlZnQgPT09IHApIHtcbiAgICAgICAgICAgIHBwLmxlZnQgPSBzXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBwLnJpZ2h0ID0gc1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzdGFja1tpLTFdID0gc1xuICAgICAgICBzdGFja1tpXSA9IHBcbiAgICAgICAgaWYoaSsxIDwgc3RhY2subGVuZ3RoKSB7XG4gICAgICAgICAgc3RhY2tbaSsxXSA9IG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdGFjay5wdXNoKG4pXG4gICAgICAgIH1cbiAgICAgICAgaSA9IGkrMlxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvL2NvbnNvbGUubG9nKFwicmlnaHQgY2hpbGRcIilcbiAgICAgIHMgPSBwLmxlZnRcbiAgICAgIGlmKHMubGVmdCAmJiBzLmxlZnQuX2NvbG9yID09PSBSRUQpIHtcbiAgICAgICAgLy9jb25zb2xlLmxvZyhcImNhc2UgMTogbGVmdCBzaWJsaW5nIGNoaWxkIHJlZFwiLCBwLnZhbHVlLCBwLl9jb2xvcilcbiAgICAgICAgcyA9IHAubGVmdCA9IGNsb25lTm9kZShzKVxuICAgICAgICB6ID0gcy5sZWZ0ID0gY2xvbmVOb2RlKHMubGVmdClcbiAgICAgICAgcC5sZWZ0ID0gcy5yaWdodFxuICAgICAgICBzLnJpZ2h0ID0gcFxuICAgICAgICBzLmxlZnQgPSB6XG4gICAgICAgIHMuX2NvbG9yID0gcC5fY29sb3JcbiAgICAgICAgbi5fY29sb3IgPSBCTEFDS1xuICAgICAgICBwLl9jb2xvciA9IEJMQUNLXG4gICAgICAgIHouX2NvbG9yID0gQkxBQ0tcbiAgICAgICAgcmVjb3VudChwKVxuICAgICAgICByZWNvdW50KHMpXG4gICAgICAgIGlmKGkgPiAxKSB7XG4gICAgICAgICAgdmFyIHBwID0gc3RhY2tbaS0yXVxuICAgICAgICAgIGlmKHBwLnJpZ2h0ID09PSBwKSB7XG4gICAgICAgICAgICBwcC5yaWdodCA9IHNcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcHAubGVmdCA9IHNcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc3RhY2tbaS0xXSA9IHNcbiAgICAgICAgcmV0dXJuXG4gICAgICB9IGVsc2UgaWYocy5yaWdodCAmJiBzLnJpZ2h0Ll9jb2xvciA9PT0gUkVEKSB7XG4gICAgICAgIC8vY29uc29sZS5sb2coXCJjYXNlIDE6IHJpZ2h0IHNpYmxpbmcgY2hpbGQgcmVkXCIpXG4gICAgICAgIHMgPSBwLmxlZnQgPSBjbG9uZU5vZGUocylcbiAgICAgICAgeiA9IHMucmlnaHQgPSBjbG9uZU5vZGUocy5yaWdodClcbiAgICAgICAgcC5sZWZ0ID0gei5yaWdodFxuICAgICAgICBzLnJpZ2h0ID0gei5sZWZ0XG4gICAgICAgIHoucmlnaHQgPSBwXG4gICAgICAgIHoubGVmdCA9IHNcbiAgICAgICAgei5fY29sb3IgPSBwLl9jb2xvclxuICAgICAgICBwLl9jb2xvciA9IEJMQUNLXG4gICAgICAgIHMuX2NvbG9yID0gQkxBQ0tcbiAgICAgICAgbi5fY29sb3IgPSBCTEFDS1xuICAgICAgICByZWNvdW50KHApXG4gICAgICAgIHJlY291bnQocylcbiAgICAgICAgcmVjb3VudCh6KVxuICAgICAgICBpZihpID4gMSkge1xuICAgICAgICAgIHZhciBwcCA9IHN0YWNrW2ktMl1cbiAgICAgICAgICBpZihwcC5yaWdodCA9PT0gcCkge1xuICAgICAgICAgICAgcHAucmlnaHQgPSB6XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBwLmxlZnQgPSB6XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHN0YWNrW2ktMV0gPSB6XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgaWYocy5fY29sb3IgPT09IEJMQUNLKSB7XG4gICAgICAgIGlmKHAuX2NvbG9yID09PSBSRUQpIHtcbiAgICAgICAgICAvL2NvbnNvbGUubG9nKFwiY2FzZSAyOiBibGFjayBzaWJsaW5nLCByZWQgcGFyZW50XCIpXG4gICAgICAgICAgcC5fY29sb3IgPSBCTEFDS1xuICAgICAgICAgIHAubGVmdCA9IHJlcGFpbnQoUkVELCBzKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vY29uc29sZS5sb2coXCJjYXNlIDI6IGJsYWNrIHNpYmxpbmcsIGJsYWNrIHBhcmVudFwiKVxuICAgICAgICAgIHAubGVmdCA9IHJlcGFpbnQoUkVELCBzKVxuICAgICAgICAgIGNvbnRpbnVlICBcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy9jb25zb2xlLmxvZyhcImNhc2UgMzogcmVkIHNpYmxpbmdcIilcbiAgICAgICAgcyA9IGNsb25lTm9kZShzKVxuICAgICAgICBwLmxlZnQgPSBzLnJpZ2h0XG4gICAgICAgIHMucmlnaHQgPSBwXG4gICAgICAgIHMuX2NvbG9yID0gcC5fY29sb3JcbiAgICAgICAgcC5fY29sb3IgPSBSRURcbiAgICAgICAgcmVjb3VudChwKVxuICAgICAgICByZWNvdW50KHMpXG4gICAgICAgIGlmKGkgPiAxKSB7XG4gICAgICAgICAgdmFyIHBwID0gc3RhY2tbaS0yXVxuICAgICAgICAgIGlmKHBwLnJpZ2h0ID09PSBwKSB7XG4gICAgICAgICAgICBwcC5yaWdodCA9IHNcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcHAubGVmdCA9IHNcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc3RhY2tbaS0xXSA9IHNcbiAgICAgICAgc3RhY2tbaV0gPSBwXG4gICAgICAgIGlmKGkrMSA8IHN0YWNrLmxlbmd0aCkge1xuICAgICAgICAgIHN0YWNrW2krMV0gPSBuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3RhY2sucHVzaChuKVxuICAgICAgICB9XG4gICAgICAgIGkgPSBpKzJcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLy9SZW1vdmVzIGl0ZW0gYXQgaXRlcmF0b3IgZnJvbSB0cmVlXG5pcHJvdG8ucmVtb3ZlID0gZnVuY3Rpb24oKSB7XG4gIHZhciBzdGFjayA9IHRoaXMuX3N0YWNrXG4gIGlmKHN0YWNrLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB0aGlzLnRyZWVcbiAgfVxuICAvL0ZpcnN0IGNvcHkgcGF0aCB0byBub2RlXG4gIHZhciBjc3RhY2sgPSBuZXcgQXJyYXkoc3RhY2subGVuZ3RoKVxuICB2YXIgbiA9IHN0YWNrW3N0YWNrLmxlbmd0aC0xXVxuICBjc3RhY2tbY3N0YWNrLmxlbmd0aC0xXSA9IG5ldyBSQk5vZGUobi5fY29sb3IsIG4ua2V5LCBuLnZhbHVlLCBuLmxlZnQsIG4ucmlnaHQsIG4uX2NvdW50KVxuICBmb3IodmFyIGk9c3RhY2subGVuZ3RoLTI7IGk+PTA7IC0taSkge1xuICAgIHZhciBuID0gc3RhY2tbaV1cbiAgICBpZihuLmxlZnQgPT09IHN0YWNrW2krMV0pIHtcbiAgICAgIGNzdGFja1tpXSA9IG5ldyBSQk5vZGUobi5fY29sb3IsIG4ua2V5LCBuLnZhbHVlLCBjc3RhY2tbaSsxXSwgbi5yaWdodCwgbi5fY291bnQpXG4gICAgfSBlbHNlIHtcbiAgICAgIGNzdGFja1tpXSA9IG5ldyBSQk5vZGUobi5fY29sb3IsIG4ua2V5LCBuLnZhbHVlLCBuLmxlZnQsIGNzdGFja1tpKzFdLCBuLl9jb3VudClcbiAgICB9XG4gIH1cblxuICAvL0dldCBub2RlXG4gIG4gPSBjc3RhY2tbY3N0YWNrLmxlbmd0aC0xXVxuICAvL2NvbnNvbGUubG9nKFwic3RhcnQgcmVtb3ZlOiBcIiwgbi52YWx1ZSlcblxuICAvL0lmIG5vdCBsZWFmLCB0aGVuIHN3YXAgd2l0aCBwcmV2aW91cyBub2RlXG4gIGlmKG4ubGVmdCAmJiBuLnJpZ2h0KSB7XG4gICAgLy9jb25zb2xlLmxvZyhcIm1vdmluZyB0byBsZWFmXCIpXG5cbiAgICAvL0ZpcnN0IHdhbGsgdG8gcHJldmlvdXMgbGVhZlxuICAgIHZhciBzcGxpdCA9IGNzdGFjay5sZW5ndGhcbiAgICBuID0gbi5sZWZ0XG4gICAgd2hpbGUobi5yaWdodCkge1xuICAgICAgY3N0YWNrLnB1c2gobilcbiAgICAgIG4gPSBuLnJpZ2h0XG4gICAgfVxuICAgIC8vQ29weSBwYXRoIHRvIGxlYWZcbiAgICB2YXIgdiA9IGNzdGFja1tzcGxpdC0xXVxuICAgIGNzdGFjay5wdXNoKG5ldyBSQk5vZGUobi5fY29sb3IsIHYua2V5LCB2LnZhbHVlLCBuLmxlZnQsIG4ucmlnaHQsIG4uX2NvdW50KSlcbiAgICBjc3RhY2tbc3BsaXQtMV0ua2V5ID0gbi5rZXlcbiAgICBjc3RhY2tbc3BsaXQtMV0udmFsdWUgPSBuLnZhbHVlXG5cbiAgICAvL0ZpeCB1cCBzdGFja1xuICAgIGZvcih2YXIgaT1jc3RhY2subGVuZ3RoLTI7IGk+PXNwbGl0OyAtLWkpIHtcbiAgICAgIG4gPSBjc3RhY2tbaV1cbiAgICAgIGNzdGFja1tpXSA9IG5ldyBSQk5vZGUobi5fY29sb3IsIG4ua2V5LCBuLnZhbHVlLCBuLmxlZnQsIGNzdGFja1tpKzFdLCBuLl9jb3VudClcbiAgICB9XG4gICAgY3N0YWNrW3NwbGl0LTFdLmxlZnQgPSBjc3RhY2tbc3BsaXRdXG4gIH1cbiAgLy9jb25zb2xlLmxvZyhcInN0YWNrPVwiLCBjc3RhY2subWFwKGZ1bmN0aW9uKHYpIHsgcmV0dXJuIHYudmFsdWUgfSkpXG5cbiAgLy9SZW1vdmUgbGVhZiBub2RlXG4gIG4gPSBjc3RhY2tbY3N0YWNrLmxlbmd0aC0xXVxuICBpZihuLl9jb2xvciA9PT0gUkVEKSB7XG4gICAgLy9FYXN5IGNhc2U6IHJlbW92aW5nIHJlZCBsZWFmXG4gICAgLy9jb25zb2xlLmxvZyhcIlJFRCBsZWFmXCIpXG4gICAgdmFyIHAgPSBjc3RhY2tbY3N0YWNrLmxlbmd0aC0yXVxuICAgIGlmKHAubGVmdCA9PT0gbikge1xuICAgICAgcC5sZWZ0ID0gbnVsbFxuICAgIH0gZWxzZSBpZihwLnJpZ2h0ID09PSBuKSB7XG4gICAgICBwLnJpZ2h0ID0gbnVsbFxuICAgIH1cbiAgICBjc3RhY2sucG9wKClcbiAgICBmb3IodmFyIGk9MDsgaTxjc3RhY2subGVuZ3RoOyArK2kpIHtcbiAgICAgIGNzdGFja1tpXS5fY291bnQtLVxuICAgIH1cbiAgICByZXR1cm4gbmV3IFJlZEJsYWNrVHJlZSh0aGlzLnRyZWUuX2NvbXBhcmUsIGNzdGFja1swXSlcbiAgfSBlbHNlIHtcbiAgICBpZihuLmxlZnQgfHwgbi5yaWdodCkge1xuICAgICAgLy9TZWNvbmQgZWFzeSBjYXNlOiAgU2luZ2xlIGNoaWxkIGJsYWNrIHBhcmVudFxuICAgICAgLy9jb25zb2xlLmxvZyhcIkJMQUNLIHNpbmdsZSBjaGlsZFwiKVxuICAgICAgaWYobi5sZWZ0KSB7XG4gICAgICAgIHN3YXBOb2RlKG4sIG4ubGVmdClcbiAgICAgIH0gZWxzZSBpZihuLnJpZ2h0KSB7XG4gICAgICAgIHN3YXBOb2RlKG4sIG4ucmlnaHQpXG4gICAgICB9XG4gICAgICAvL0NoaWxkIG11c3QgYmUgcmVkLCBzbyByZXBhaW50IGl0IGJsYWNrIHRvIGJhbGFuY2UgY29sb3JcbiAgICAgIG4uX2NvbG9yID0gQkxBQ0tcbiAgICAgIGZvcih2YXIgaT0wOyBpPGNzdGFjay5sZW5ndGgtMTsgKytpKSB7XG4gICAgICAgIGNzdGFja1tpXS5fY291bnQtLVxuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBSZWRCbGFja1RyZWUodGhpcy50cmVlLl9jb21wYXJlLCBjc3RhY2tbMF0pXG4gICAgfSBlbHNlIGlmKGNzdGFjay5sZW5ndGggPT09IDEpIHtcbiAgICAgIC8vVGhpcmQgZWFzeSBjYXNlOiByb290XG4gICAgICAvL2NvbnNvbGUubG9nKFwiUk9PVFwiKVxuICAgICAgcmV0dXJuIG5ldyBSZWRCbGFja1RyZWUodGhpcy50cmVlLl9jb21wYXJlLCBudWxsKVxuICAgIH0gZWxzZSB7XG4gICAgICAvL0hhcmQgY2FzZTogUmVwYWludCBuLCBhbmQgdGhlbiBkbyBzb21lIG5hc3R5IHN0dWZmXG4gICAgICAvL2NvbnNvbGUubG9nKFwiQkxBQ0sgbGVhZiBubyBjaGlsZHJlblwiKVxuICAgICAgZm9yKHZhciBpPTA7IGk8Y3N0YWNrLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGNzdGFja1tpXS5fY291bnQtLVxuICAgICAgfVxuICAgICAgdmFyIHBhcmVudCA9IGNzdGFja1tjc3RhY2subGVuZ3RoLTJdXG4gICAgICBmaXhEb3VibGVCbGFjayhjc3RhY2spXG4gICAgICAvL0ZpeCB1cCBsaW5rc1xuICAgICAgaWYocGFyZW50LmxlZnQgPT09IG4pIHtcbiAgICAgICAgcGFyZW50LmxlZnQgPSBudWxsXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwYXJlbnQucmlnaHQgPSBudWxsXG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBuZXcgUmVkQmxhY2tUcmVlKHRoaXMudHJlZS5fY29tcGFyZSwgY3N0YWNrWzBdKVxufVxuXG4vL1JldHVybnMga2V5XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoaXByb3RvLCBcImtleVwiLCB7XG4gIGdldDogZnVuY3Rpb24oKSB7XG4gICAgaWYodGhpcy5fc3RhY2subGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3N0YWNrW3RoaXMuX3N0YWNrLmxlbmd0aC0xXS5rZXlcbiAgICB9XG4gICAgcmV0dXJuXG4gIH0sXG4gIGVudW1lcmFibGU6IHRydWVcbn0pXG5cbi8vUmV0dXJucyB2YWx1ZVxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGlwcm90bywgXCJ2YWx1ZVwiLCB7XG4gIGdldDogZnVuY3Rpb24oKSB7XG4gICAgaWYodGhpcy5fc3RhY2subGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3N0YWNrW3RoaXMuX3N0YWNrLmxlbmd0aC0xXS52YWx1ZVxuICAgIH1cbiAgICByZXR1cm5cbiAgfSxcbiAgZW51bWVyYWJsZTogdHJ1ZVxufSlcblxuXG4vL1JldHVybnMgdGhlIHBvc2l0aW9uIG9mIHRoaXMgaXRlcmF0b3IgaW4gdGhlIHNvcnRlZCBsaXN0XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoaXByb3RvLCBcImluZGV4XCIsIHtcbiAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICB2YXIgaWR4ID0gMFxuICAgIHZhciBzdGFjayA9IHRoaXMuX3N0YWNrXG4gICAgaWYoc3RhY2subGVuZ3RoID09PSAwKSB7XG4gICAgICB2YXIgciA9IHRoaXMudHJlZS5yb290XG4gICAgICBpZihyKSB7XG4gICAgICAgIHJldHVybiByLl9jb3VudFxuICAgICAgfVxuICAgICAgcmV0dXJuIDBcbiAgICB9IGVsc2UgaWYoc3RhY2tbc3RhY2subGVuZ3RoLTFdLmxlZnQpIHtcbiAgICAgIGlkeCA9IHN0YWNrW3N0YWNrLmxlbmd0aC0xXS5sZWZ0Ll9jb3VudFxuICAgIH1cbiAgICBmb3IodmFyIHM9c3RhY2subGVuZ3RoLTI7IHM+PTA7IC0tcykge1xuICAgICAgaWYoc3RhY2tbcysxXSA9PT0gc3RhY2tbc10ucmlnaHQpIHtcbiAgICAgICAgKytpZHhcbiAgICAgICAgaWYoc3RhY2tbc10ubGVmdCkge1xuICAgICAgICAgIGlkeCArPSBzdGFja1tzXS5sZWZ0Ll9jb3VudFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBpZHhcbiAgfSxcbiAgZW51bWVyYWJsZTogdHJ1ZVxufSlcblxuLy9BZHZhbmNlcyBpdGVyYXRvciB0byBuZXh0IGVsZW1lbnQgaW4gbGlzdFxuaXByb3RvLm5leHQgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHN0YWNrID0gdGhpcy5fc3RhY2tcbiAgaWYoc3RhY2subGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuXG4gIH1cbiAgdmFyIG4gPSBzdGFja1tzdGFjay5sZW5ndGgtMV1cbiAgaWYobi5yaWdodCkge1xuICAgIG4gPSBuLnJpZ2h0XG4gICAgd2hpbGUobikge1xuICAgICAgc3RhY2sucHVzaChuKVxuICAgICAgbiA9IG4ubGVmdFxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBzdGFjay5wb3AoKVxuICAgIHdoaWxlKHN0YWNrLmxlbmd0aCA+IDAgJiYgc3RhY2tbc3RhY2subGVuZ3RoLTFdLnJpZ2h0ID09PSBuKSB7XG4gICAgICBuID0gc3RhY2tbc3RhY2subGVuZ3RoLTFdXG4gICAgICBzdGFjay5wb3AoKVxuICAgIH1cbiAgfVxufVxuXG4vL0NoZWNrcyBpZiBpdGVyYXRvciBpcyBhdCBlbmQgb2YgdHJlZVxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGlwcm90bywgXCJoYXNOZXh0XCIsIHtcbiAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc3RhY2sgPSB0aGlzLl9zdGFja1xuICAgIGlmKHN0YWNrLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIGlmKHN0YWNrW3N0YWNrLmxlbmd0aC0xXS5yaWdodCkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgZm9yKHZhciBzPXN0YWNrLmxlbmd0aC0xOyBzPjA7IC0tcykge1xuICAgICAgaWYoc3RhY2tbcy0xXS5sZWZ0ID09PSBzdGFja1tzXSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufSlcblxuLy9VcGRhdGUgdmFsdWVcbmlwcm90by51cGRhdGUgPSBmdW5jdGlvbih2YWx1ZSkge1xuICB2YXIgc3RhY2sgPSB0aGlzLl9zdGFja1xuICBpZihzdGFjay5sZW5ndGggPT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW4ndCB1cGRhdGUgZW1wdHkgbm9kZSFcIilcbiAgfVxuICB2YXIgY3N0YWNrID0gbmV3IEFycmF5KHN0YWNrLmxlbmd0aClcbiAgdmFyIG4gPSBzdGFja1tzdGFjay5sZW5ndGgtMV1cbiAgY3N0YWNrW2NzdGFjay5sZW5ndGgtMV0gPSBuZXcgUkJOb2RlKG4uX2NvbG9yLCBuLmtleSwgdmFsdWUsIG4ubGVmdCwgbi5yaWdodCwgbi5fY291bnQpXG4gIGZvcih2YXIgaT1zdGFjay5sZW5ndGgtMjsgaT49MDsgLS1pKSB7XG4gICAgbiA9IHN0YWNrW2ldXG4gICAgaWYobi5sZWZ0ID09PSBzdGFja1tpKzFdKSB7XG4gICAgICBjc3RhY2tbaV0gPSBuZXcgUkJOb2RlKG4uX2NvbG9yLCBuLmtleSwgbi52YWx1ZSwgY3N0YWNrW2krMV0sIG4ucmlnaHQsIG4uX2NvdW50KVxuICAgIH0gZWxzZSB7XG4gICAgICBjc3RhY2tbaV0gPSBuZXcgUkJOb2RlKG4uX2NvbG9yLCBuLmtleSwgbi52YWx1ZSwgbi5sZWZ0LCBjc3RhY2tbaSsxXSwgbi5fY291bnQpXG4gICAgfVxuICB9XG4gIHJldHVybiBuZXcgUmVkQmxhY2tUcmVlKHRoaXMudHJlZS5fY29tcGFyZSwgY3N0YWNrWzBdKVxufVxuXG4vL01vdmVzIGl0ZXJhdG9yIGJhY2t3YXJkIG9uZSBlbGVtZW50XG5pcHJvdG8ucHJldiA9IGZ1bmN0aW9uKCkge1xuICB2YXIgc3RhY2sgPSB0aGlzLl9zdGFja1xuICBpZihzdGFjay5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm5cbiAgfVxuICB2YXIgbiA9IHN0YWNrW3N0YWNrLmxlbmd0aC0xXVxuICBpZihuLmxlZnQpIHtcbiAgICBuID0gbi5sZWZ0XG4gICAgd2hpbGUobikge1xuICAgICAgc3RhY2sucHVzaChuKVxuICAgICAgbiA9IG4ucmlnaHRcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgc3RhY2sucG9wKClcbiAgICB3aGlsZShzdGFjay5sZW5ndGggPiAwICYmIHN0YWNrW3N0YWNrLmxlbmd0aC0xXS5sZWZ0ID09PSBuKSB7XG4gICAgICBuID0gc3RhY2tbc3RhY2subGVuZ3RoLTFdXG4gICAgICBzdGFjay5wb3AoKVxuICAgIH1cbiAgfVxufVxuXG4vL0NoZWNrcyBpZiBpdGVyYXRvciBpcyBhdCBzdGFydCBvZiB0cmVlXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoaXByb3RvLCBcImhhc1ByZXZcIiwge1xuICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBzdGFjayA9IHRoaXMuX3N0YWNrXG4gICAgaWYoc3RhY2subGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgaWYoc3RhY2tbc3RhY2subGVuZ3RoLTFdLmxlZnQpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIGZvcih2YXIgcz1zdGFjay5sZW5ndGgtMTsgcz4wOyAtLXMpIHtcbiAgICAgIGlmKHN0YWNrW3MtMV0ucmlnaHQgPT09IHN0YWNrW3NdKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9XG59KVxuXG4vL0RlZmF1bHQgY29tcGFyaXNvbiBmdW5jdGlvblxuZnVuY3Rpb24gZGVmYXVsdENvbXBhcmUoYSwgYikge1xuICBpZihhIDwgYikge1xuICAgIHJldHVybiAtMVxuICB9XG4gIGlmKGEgPiBiKSB7XG4gICAgcmV0dXJuIDFcbiAgfVxuICByZXR1cm4gMFxufVxuXG4vL0J1aWxkIGEgdHJlZVxuZnVuY3Rpb24gY3JlYXRlUkJUcmVlKGNvbXBhcmUpIHtcbiAgcmV0dXJuIG5ldyBSZWRCbGFja1RyZWUoY29tcGFyZSB8fCBkZWZhdWx0Q29tcGFyZSwgbnVsbClcbn0iLCJ2YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKVxuXG52YXIgSU5ERU5UX1NUQVJUID0gL1tcXHtcXFtdL1xudmFyIElOREVOVF9FTkQgPSAvW1xcfVxcXV0vXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oKSB7XG4gIHZhciBsaW5lcyA9IFtdXG4gIHZhciBpbmRlbnQgPSAwXG5cbiAgdmFyIHB1c2ggPSBmdW5jdGlvbihzdHIpIHtcbiAgICB2YXIgc3BhY2VzID0gJydcbiAgICB3aGlsZSAoc3BhY2VzLmxlbmd0aCA8IGluZGVudCoyKSBzcGFjZXMgKz0gJyAgJ1xuICAgIGxpbmVzLnB1c2goc3BhY2VzK3N0cilcbiAgfVxuXG4gIHZhciBsaW5lID0gZnVuY3Rpb24oZm10KSB7XG4gICAgaWYgKCFmbXQpIHJldHVybiBsaW5lXG5cbiAgICBpZiAoSU5ERU5UX0VORC50ZXN0KGZtdC50cmltKClbMF0pICYmIElOREVOVF9TVEFSVC50ZXN0KGZtdFtmbXQubGVuZ3RoLTFdKSkge1xuICAgICAgaW5kZW50LS1cbiAgICAgIHB1c2godXRpbC5mb3JtYXQuYXBwbHkodXRpbCwgYXJndW1lbnRzKSlcbiAgICAgIGluZGVudCsrXG4gICAgICByZXR1cm4gbGluZVxuICAgIH1cbiAgICBpZiAoSU5ERU5UX1NUQVJULnRlc3QoZm10W2ZtdC5sZW5ndGgtMV0pKSB7XG4gICAgICBwdXNoKHV0aWwuZm9ybWF0LmFwcGx5KHV0aWwsIGFyZ3VtZW50cykpXG4gICAgICBpbmRlbnQrK1xuICAgICAgcmV0dXJuIGxpbmVcbiAgICB9XG4gICAgaWYgKElOREVOVF9FTkQudGVzdChmbXQudHJpbSgpWzBdKSkge1xuICAgICAgaW5kZW50LS1cbiAgICAgIHB1c2godXRpbC5mb3JtYXQuYXBwbHkodXRpbCwgYXJndW1lbnRzKSlcbiAgICAgIHJldHVybiBsaW5lXG4gICAgfVxuXG4gICAgcHVzaCh1dGlsLmZvcm1hdC5hcHBseSh1dGlsLCBhcmd1bWVudHMpKVxuICAgIHJldHVybiBsaW5lXG4gIH1cblxuICBsaW5lLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGxpbmVzLmpvaW4oJ1xcbicpXG4gIH1cblxuICBsaW5lLnRvRnVuY3Rpb24gPSBmdW5jdGlvbihzY29wZSkge1xuICAgIHZhciBzcmMgPSAncmV0dXJuICgnK2xpbmUudG9TdHJpbmcoKSsnKSdcblxuICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMoc2NvcGUgfHwge30pLm1hcChmdW5jdGlvbihrZXkpIHtcbiAgICAgIHJldHVybiBrZXlcbiAgICB9KVxuXG4gICAgdmFyIHZhbHMgPSBrZXlzLm1hcChmdW5jdGlvbihrZXkpIHtcbiAgICAgIHJldHVybiBzY29wZVtrZXldXG4gICAgfSlcblxuICAgIHJldHVybiBGdW5jdGlvbi5hcHBseShudWxsLCBrZXlzLmNvbmNhdChzcmMpKS5hcHBseShudWxsLCB2YWxzKVxuICB9XG5cbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGgpIGxpbmUuYXBwbHkobnVsbCwgYXJndW1lbnRzKVxuXG4gIHJldHVybiBsaW5lXG59XG4iLCJ2YXIgaXNQcm9wZXJ0eSA9IHJlcXVpcmUoJ2lzLXByb3BlcnR5JylcblxudmFyIGdlbiA9IGZ1bmN0aW9uKG9iaiwgcHJvcCkge1xuICByZXR1cm4gaXNQcm9wZXJ0eShwcm9wKSA/IG9iaisnLicrcHJvcCA6IG9iaisnWycrSlNPTi5zdHJpbmdpZnkocHJvcCkrJ10nXG59XG5cbmdlbi52YWxpZCA9IGlzUHJvcGVydHlcbmdlbi5wcm9wZXJ0eSA9IGZ1bmN0aW9uIChwcm9wKSB7XG4gcmV0dXJuIGlzUHJvcGVydHkocHJvcCkgPyBwcm9wIDogSlNPTi5zdHJpbmdpZnkocHJvcClcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBnZW5cbiIsIi8vIG9yaWdpbmFsbHkgcHVsbGVkIG91dCBvZiBzaW1wbGUtcGVlclxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGdldEJyb3dzZXJSVEMgKCkge1xuICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybiBudWxsXG4gIHZhciB3cnRjID0ge1xuICAgIFJUQ1BlZXJDb25uZWN0aW9uOiB3aW5kb3cubW96UlRDUGVlckNvbm5lY3Rpb24gfHwgd2luZG93LlJUQ1BlZXJDb25uZWN0aW9uIHx8XG4gICAgICB3aW5kb3cud2Via2l0UlRDUGVlckNvbm5lY3Rpb24sXG4gICAgUlRDU2Vzc2lvbkRlc2NyaXB0aW9uOiB3aW5kb3cubW96UlRDU2Vzc2lvbkRlc2NyaXB0aW9uIHx8XG4gICAgICB3aW5kb3cuUlRDU2Vzc2lvbkRlc2NyaXB0aW9uIHx8IHdpbmRvdy53ZWJraXRSVENTZXNzaW9uRGVzY3JpcHRpb24sXG4gICAgUlRDSWNlQ2FuZGlkYXRlOiB3aW5kb3cubW96UlRDSWNlQ2FuZGlkYXRlIHx8IHdpbmRvdy5SVENJY2VDYW5kaWRhdGUgfHxcbiAgICAgIHdpbmRvdy53ZWJraXRSVENJY2VDYW5kaWRhdGVcbiAgfVxuICBpZiAoIXdydGMuUlRDUGVlckNvbm5lY3Rpb24pIHJldHVybiBudWxsXG4gIHJldHVybiB3cnRjXG59XG4iLCJ2YXIgdG9wTGV2ZWwgPSB0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbCA6XG4gICAgdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cgOiB7fVxudmFyIG1pbkRvYyA9IHJlcXVpcmUoJ21pbi1kb2N1bWVudCcpO1xuXG5pZiAodHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJykge1xuICAgIG1vZHVsZS5leHBvcnRzID0gZG9jdW1lbnQ7XG59IGVsc2Uge1xuICAgIHZhciBkb2NjeSA9IHRvcExldmVsWydfX0dMT0JBTF9ET0NVTUVOVF9DQUNIRUA0J107XG5cbiAgICBpZiAoIWRvY2N5KSB7XG4gICAgICAgIGRvY2N5ID0gdG9wTGV2ZWxbJ19fR0xPQkFMX0RPQ1VNRU5UX0NBQ0hFQDQnXSA9IG1pbkRvYztcbiAgICB9XG5cbiAgICBtb2R1bGUuZXhwb3J0cyA9IGRvY2N5O1xufVxuIiwiaWYgKHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IHdpbmRvdztcbn0gZWxzZSBpZiAodHlwZW9mIGdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgIG1vZHVsZS5leHBvcnRzID0gZ2xvYmFsO1xufSBlbHNlIGlmICh0eXBlb2Ygc2VsZiAhPT0gXCJ1bmRlZmluZWRcIil7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBzZWxmO1xufSBlbHNlIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IHt9O1xufVxuIiwidmFyIGhhdCA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGJpdHMsIGJhc2UpIHtcbiAgICBpZiAoIWJhc2UpIGJhc2UgPSAxNjtcbiAgICBpZiAoYml0cyA9PT0gdW5kZWZpbmVkKSBiaXRzID0gMTI4O1xuICAgIGlmIChiaXRzIDw9IDApIHJldHVybiAnMCc7XG4gICAgXG4gICAgdmFyIGRpZ2l0cyA9IE1hdGgubG9nKE1hdGgucG93KDIsIGJpdHMpKSAvIE1hdGgubG9nKGJhc2UpO1xuICAgIGZvciAodmFyIGkgPSAyOyBkaWdpdHMgPT09IEluZmluaXR5OyBpICo9IDIpIHtcbiAgICAgICAgZGlnaXRzID0gTWF0aC5sb2coTWF0aC5wb3coMiwgYml0cyAvIGkpKSAvIE1hdGgubG9nKGJhc2UpICogaTtcbiAgICB9XG4gICAgXG4gICAgdmFyIHJlbSA9IGRpZ2l0cyAtIE1hdGguZmxvb3IoZGlnaXRzKTtcbiAgICBcbiAgICB2YXIgcmVzID0gJyc7XG4gICAgXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBNYXRoLmZsb29yKGRpZ2l0cyk7IGkrKykge1xuICAgICAgICB2YXIgeCA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGJhc2UpLnRvU3RyaW5nKGJhc2UpO1xuICAgICAgICByZXMgPSB4ICsgcmVzO1xuICAgIH1cbiAgICBcbiAgICBpZiAocmVtKSB7XG4gICAgICAgIHZhciBiID0gTWF0aC5wb3coYmFzZSwgcmVtKTtcbiAgICAgICAgdmFyIHggPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBiKS50b1N0cmluZyhiYXNlKTtcbiAgICAgICAgcmVzID0geCArIHJlcztcbiAgICB9XG4gICAgXG4gICAgdmFyIHBhcnNlZCA9IHBhcnNlSW50KHJlcywgYmFzZSk7XG4gICAgaWYgKHBhcnNlZCAhPT0gSW5maW5pdHkgJiYgcGFyc2VkID49IE1hdGgucG93KDIsIGJpdHMpKSB7XG4gICAgICAgIHJldHVybiBoYXQoYml0cywgYmFzZSlcbiAgICB9XG4gICAgZWxzZSByZXR1cm4gcmVzO1xufTtcblxuaGF0LnJhY2sgPSBmdW5jdGlvbiAoYml0cywgYmFzZSwgZXhwYW5kQnkpIHtcbiAgICB2YXIgZm4gPSBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICB2YXIgaXRlcnMgPSAwO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgICBpZiAoaXRlcnMgKysgPiAxMCkge1xuICAgICAgICAgICAgICAgIGlmIChleHBhbmRCeSkgYml0cyArPSBleHBhbmRCeTtcbiAgICAgICAgICAgICAgICBlbHNlIHRocm93IG5ldyBFcnJvcigndG9vIG1hbnkgSUQgY29sbGlzaW9ucywgdXNlIG1vcmUgYml0cycpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHZhciBpZCA9IGhhdChiaXRzLCBiYXNlKTtcbiAgICAgICAgfSB3aGlsZSAoT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoaGF0cywgaWQpKTtcbiAgICAgICAgXG4gICAgICAgIGhhdHNbaWRdID0gZGF0YTtcbiAgICAgICAgcmV0dXJuIGlkO1xuICAgIH07XG4gICAgdmFyIGhhdHMgPSBmbi5oYXRzID0ge307XG4gICAgXG4gICAgZm4uZ2V0ID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICAgIHJldHVybiBmbi5oYXRzW2lkXTtcbiAgICB9O1xuICAgIFxuICAgIGZuLnNldCA9IGZ1bmN0aW9uIChpZCwgdmFsdWUpIHtcbiAgICAgICAgZm4uaGF0c1tpZF0gPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGZuO1xuICAgIH07XG4gICAgXG4gICAgZm4uYml0cyA9IGJpdHMgfHwgMTI4O1xuICAgIGZuLmJhc2UgPSBiYXNlIHx8IDE2O1xuICAgIHJldHVybiBmbjtcbn07XG4iLCJ2YXIgZXEgPSByZXF1aXJlKCdidWZmZXItZXF1YWxzJylcbnZhciB4dGVuZCA9IHJlcXVpcmUoJ3h0ZW5kJylcbnZhciBpc2FycmF5ID0gcmVxdWlyZSgnaXNhcnJheScpXG52YXIgZGVmaW5lZCA9IHJlcXVpcmUoJ2RlZmluZWQnKVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChzb2RpdW0sIGtleXBhaXIsIG9wdHMpIHtcbiAgaWYgKHNvZGl1bS5hcGkgJiYgIXNvZGl1bS5jcnlwdG9fc2lnbikgc29kaXVtID0gc29kaXVtLmFwaVxuICBpZiAoIW9wdHMpIG9wdHMgPSB7fVxuICB2YXIgcHViXG4gIGlmICh0eXBlb2Ygb3B0cy5wdWJsaWNLZXkgPT09ICdmdW5jdGlvbicpIHtcbiAgICBwdWIgPSBvcHRzLnB1YmxpY0tleVxuICB9XG4gIGVsc2Uge1xuICAgIHZhciBwdWIgPSBbXS5jb25jYXQoa2V5cGFpci5wdWJsaWNLZXkgfHwgW10pXG4gICAgaWYgKG9wdHMucHVibGljS2V5KSBwdWIgPSBbXS5jb25jYXQocHViLCBvcHRzLnB1YmxpY0tleSlcbiAgfVxuIFxuICByZXR1cm4geHRlbmQoe1xuICAgIGlkZW50aXR5OiBkZWZpbmVkKFxuICAgICAga2V5cGFpci5pZGVudGl0eSwga2V5cGFpci5wdWJsaWNLZXksIG9wdHMuaWRlbnRpdHksIG9wdHMuaWRcbiAgICApLFxuICAgIHNpZ246IGZ1bmN0aW9uIChub2RlLCBjYikge1xuICAgICAgdmFyIGJrZXkgPSBCdWZmZXIobm9kZS5rZXksICdoZXgnKVxuICAgICAgaWYgKHNvZGl1bS5zaWduICYmICFzb2RpdW0uY3J5cHRvX3NpZ24pIHtcbiAgICAgICAgY2IobnVsbCwgc29kaXVtLnNpZ24oYmtleSwga2V5cGFpci5zZWNyZXRLZXkpKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2IobnVsbCwgc29kaXVtLmNyeXB0b19zaWduX2RldGFjaGVkKGJrZXksIGtleXBhaXIuc2VjcmV0S2V5KSlcbiAgICAgIH1cbiAgICB9LFxuICAgIHZlcmlmeTogZnVuY3Rpb24gKG5vZGUsIGNiKSB7XG4gICAgICBpZiAodHlwZW9mIHB1YiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBwdWIobm9kZS5pZGVudGl0eSwgZnVuY3Rpb24gKGVyciwgb2spIHtcbiAgICAgICAgICBpZiAoZXJyKSBjYihlcnIpXG4gICAgICAgICAgZWxzZSBpZiAoIW9rKSBjYihudWxsLCBmYWxzZSlcbiAgICAgICAgICBlbHNlIGNiKG51bGwsIHZlcmlmeShub2RlKSlcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHB1Yi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGlmIChlcShub2RlLmlkZW50aXR5LCBwdWJbaV0pKSBicmVha1xuICAgICAgICB9XG4gICAgICAgIGlmIChpID09PSBwdWIubGVuZ3RoKSByZXR1cm4gY2IobnVsbCwgZmFsc2UpXG4gICAgICAgIGNiKG51bGwsIHZlcmlmeShub2RlKSlcbiAgICAgIH1cbiAgICB9XG4gIH0sIG9wdHMpXG5cbiAgZnVuY3Rpb24gdmVyaWZ5IChub2RlKSB7XG4gICAgdmFyIGJrZXkgPSBCdWZmZXIobm9kZS5rZXksICdoZXgnKVxuICAgIGlmIChzb2RpdW0udmVyaWZ5ICYmICFzb2RpdW0uY3J5cHRvX3NpZ25fb3Blbikge1xuICAgICAgcmV0dXJuIHNvZGl1bS52ZXJpZnkoYmtleSwgbm9kZS5zaWduYXR1cmUsIG5vZGUuaWRlbnRpdHkpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBzb2RpdW0uY3J5cHRvX3NpZ25fdmVyaWZ5X2RldGFjaGVkKFxuICAgICAgICBub2RlLnNpZ25hdHVyZSwgYmtleSwgbm9kZS5pZGVudGl0eSlcbiAgICB9XG4gIH1cbn1cbiIsInZhciBhZnRlciA9IHJlcXVpcmUoJ2FmdGVyLWFsbCcpXG52YXIgbGV4aW50ID0gcmVxdWlyZSgnbGV4aWNvZ3JhcGhpYy1pbnRlZ2VyJylcbnZhciBjb2xsZWN0ID0gcmVxdWlyZSgnc3RyZWFtLWNvbGxlY3RvcicpXG52YXIgdGhyb3VnaCA9IHJlcXVpcmUoJ3Rocm91Z2gyJylcbnZhciBwdW1wID0gcmVxdWlyZSgncHVtcCcpXG52YXIgZnJvbSA9IHJlcXVpcmUoJ2Zyb20yJylcbnZhciBtdXRleGlmeSA9IHJlcXVpcmUoJ211dGV4aWZ5JylcbnZhciBjdWlkID0gcmVxdWlyZSgnY3VpZCcpXG52YXIgbG9ncyA9IHJlcXVpcmUoJ2xldmVsLWxvZ3MnKVxudmFyIGV2ZW50cyA9IHJlcXVpcmUoJ2V2ZW50cycpXG52YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKVxudmFyIGVudW1lcmF0ZSA9IHJlcXVpcmUoJ2xldmVsLWVudW1lcmF0ZScpXG52YXIgcmVwbGljYXRlID0gcmVxdWlyZSgnLi9saWIvcmVwbGljYXRlJylcbnZhciBtZXNzYWdlcyA9IHJlcXVpcmUoJy4vbGliL21lc3NhZ2VzJylcbnZhciBoYXNoID0gcmVxdWlyZSgnLi9saWIvaGFzaCcpXG52YXIgZW5jb2RlciA9IHJlcXVpcmUoJy4vbGliL2VuY29kZScpXG5cbnZhciBJRCA9ICchIWlkJ1xudmFyIENIQU5HRVMgPSAnIWNoYW5nZXMhJ1xudmFyIE5PREVTID0gJyFub2RlcyEnXG52YXIgSEVBRFMgPSAnIWhlYWRzISdcblxudmFyIElOVkFMSURfU0lHTkFUVVJFID0gbmV3IEVycm9yKCdJbnZhbGlkIHNpZ25hdHVyZScpXG52YXIgQ0hFQ0tTVU1fTUlTTUFUQ0ggPSBuZXcgRXJyb3IoJ0NoZWNrc3VtIG1pc21hdGNoJylcbnZhciBJTlZBTElEX0xPRyA9IG5ldyBFcnJvcignSW52YWxpZCBsb2cgc2VxdWVuY2UnKVxuXG5JTlZBTElEX0xPRy5ub3RGb3VuZCA9IHRydWVcbklOVkFMSURfTE9HLnN0YXR1cyA9IDQwNFxuXG52YXIgbm9vcCA9IGZ1bmN0aW9uICgpIHt9XG5cbnZhciBIeXBlcmxvZyA9IGZ1bmN0aW9uIChkYiwgb3B0cykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgSHlwZXJsb2cpKSByZXR1cm4gbmV3IEh5cGVybG9nKGRiLCBvcHRzKVxuICBpZiAoIW9wdHMpIG9wdHMgPSB7fVxuXG4gIGV2ZW50cy5FdmVudEVtaXR0ZXIuY2FsbCh0aGlzKVxuXG4gIHRoaXMuaWQgPSBvcHRzLmlkIHx8IG51bGxcbiAgdGhpcy5lbnVtZXJhdGUgPSBlbnVtZXJhdGUoZGIsIHtwcmVmaXg6ICdlbnVtJ30pXG4gIHRoaXMuZGIgPSBkYlxuICB0aGlzLmxvZ3MgPSBsb2dzKGRiLCB7cHJlZml4OiAnbG9ncycsIHZhbHVlRW5jb2Rpbmc6IG1lc3NhZ2VzLkVudHJ5fSlcbiAgdGhpcy5sb2NrID0gb3B0cy5sb2NrIHx8IG11dGV4aWZ5KClcbiAgdGhpcy5jaGFuZ2VzID0gMFxuICB0aGlzLnNldE1heExpc3RlbmVycygwKVxuICB0aGlzLnZhbHVlRW5jb2RpbmcgPSBvcHRzLnZhbHVlRW5jb2RpbmcgfHwgb3B0cy5lbmNvZGluZyB8fCAnYmluYXJ5J1xuICB0aGlzLmlkZW50aXR5ID0gb3B0cy5pZGVudGl0eSB8fCBudWxsXG4gIHRoaXMudmVyaWZ5ID0gb3B0cy52ZXJpZnkgfHwgbnVsbFxuICB0aGlzLnNpZ24gPSBvcHRzLnNpZ24gfHwgbnVsbFxuXG4gIHZhciBzZWxmID0gdGhpc1xuICB2YXIgZ2V0SWQgPSBvcHRzLmdldElkIHx8IGZ1bmN0aW9uIChjYikge1xuICAgIGRiLmdldChJRCwge3ZhbHVlRW5jb2Rpbmc6ICd1dGYtOCd9LCBmdW5jdGlvbiAoXywgaWQpIHtcbiAgICAgIGlmIChpZCkgcmV0dXJuIGNiKG51bGwsIGlkKVxuICAgICAgaWQgPSBjdWlkKClcbiAgICAgIGRiLnB1dChJRCwgaWQsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY2IobnVsbCwgaWQpXG4gICAgICB9KVxuICAgIH0pXG4gIH1cblxuICB0aGlzLmxvY2soZnVuY3Rpb24gKHJlbGVhc2UpIHtcbiAgICBjb2xsZWN0KGRiLmNyZWF0ZUtleVN0cmVhbSh7Z3Q6IENIQU5HRVMsIGx0OiBDSEFOR0VTICsgJ34nLCByZXZlcnNlOiB0cnVlLCBsaW1pdDogMX0pLCBmdW5jdGlvbiAoXywga2V5cykge1xuICAgICAgc2VsZi5jaGFuZ2VzID0gTWF0aC5tYXgoc2VsZi5jaGFuZ2VzLCBrZXlzICYmIGtleXMubGVuZ3RoID8gbGV4aW50LnVucGFjayhrZXlzWzBdLnNwbGl0KCchJykucG9wKCksICdoZXgnKSA6IDApXG4gICAgICBpZiAoc2VsZi5pZCkgcmV0dXJuIHJlbGVhc2UoKVxuICAgICAgZ2V0SWQoZnVuY3Rpb24gKF8sIGlkKSB7XG4gICAgICAgIHNlbGYuaWQgPSBpZCB8fCBjdWlkKClcbiAgICAgICAgcmVsZWFzZSgpXG4gICAgICB9KVxuICAgIH0pXG4gIH0pXG59XG5cbnV0aWwuaW5oZXJpdHMoSHlwZXJsb2csIGV2ZW50cy5FdmVudEVtaXR0ZXIpXG5cbkh5cGVybG9nLnByb3RvdHlwZS5yZWFkeSA9IGZ1bmN0aW9uIChjYikge1xuICBpZiAodGhpcy5pZCkgcmV0dXJuIGNiKClcbiAgdGhpcy5sb2NrKGZ1bmN0aW9uIChyZWxlYXNlKSB7XG4gICAgcmVsZWFzZSgpXG4gICAgY2IoKVxuICB9KVxufVxuXG5IeXBlcmxvZy5wcm90b3R5cGUuaGVhZHMgPSBmdW5jdGlvbiAob3B0cywgY2IpIHtcbiAgdmFyIHNlbGYgPSB0aGlzXG4gIGlmICghb3B0cykgb3B0cyA9IHt9XG4gIGlmICh0eXBlb2Ygb3B0cyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNiID0gb3B0c1xuICAgIG9wdHMgPSB7fVxuICB9XG5cbiAgdmFyIHJzID0gdGhpcy5kYi5jcmVhdGVWYWx1ZVN0cmVhbSh7XG4gICAgZ3Q6IEhFQURTLFxuICAgIGx0OiBIRUFEUyArICd+JyxcbiAgICB2YWx1ZUVuY29kaW5nOiAndXRmLTgnXG4gIH0pXG5cbiAgdmFyIGZvcm1hdCA9IHRocm91Z2gub2JqKGZ1bmN0aW9uIChrZXksIGVuYywgY2IpIHtcbiAgICBzZWxmLmdldChrZXksIG9wdHMsIGNiKVxuICB9KVxuXG4gIHJldHVybiBjb2xsZWN0KHB1bXAocnMsIGZvcm1hdCksIGNiKVxufVxuXG5IeXBlcmxvZy5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKGtleSwgb3B0cywgY2IpIHtcbiAgaWYgKCFvcHRzKSBvcHRzID0ge31cbiAgaWYgKHR5cGVvZiBvcHRzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2IgPSBvcHRzXG4gICAgb3B0cyA9IHt9XG4gIH1cbiAgdmFyIHNlbGYgPSB0aGlzXG4gIHRoaXMuZGIuZ2V0KE5PREVTICsga2V5LCB7dmFsdWVFbmNvZGluZzogJ2JpbmFyeSd9LCBmdW5jdGlvbiAoZXJyLCBidWYpIHtcbiAgICBpZiAoZXJyKSByZXR1cm4gY2IoZXJyKVxuICAgIHZhciBub2RlID0gbWVzc2FnZXMuTm9kZS5kZWNvZGUoYnVmKVxuICAgIG5vZGUudmFsdWUgPSBlbmNvZGVyLmRlY29kZShub2RlLnZhbHVlLCBvcHRzLnZhbHVlRW5jb2RpbmcgfHwgc2VsZi52YWx1ZUVuY29kaW5nKVxuICAgIGNiKG51bGwsIG5vZGUpXG4gIH0pXG59XG5cbnZhciBhZGQgPSBmdW5jdGlvbiAoZGFnLCBsaW5rcywgdmFsdWUsIG9wdHMsIGNiKSB7XG4gIHZhciBsb2dMaW5rcyA9IFtdXG4gIHZhciBpZCA9IG9wdHMubG9nIHx8IGRhZy5pZFxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxpbmtzLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKHR5cGVvZiBsaW5rc1tpXSAhPT0gJ3N0cmluZycpIGxpbmtzW2ldID0gbGlua3NbaV0ua2V5XG4gIH1cbiAgdmFyIG5vZGUgPSB7XG4gICAgbG9nOiBpZCxcbiAgICBrZXk6IGhhc2gobGlua3MsIHZhbHVlKSxcbiAgICBpZGVudGl0eTogb3B0cy5pZGVudGl0eSB8fCBudWxsLFxuICAgIHNpZ25hdHVyZTogb3B0cy5zaWduYXR1cmUgfHwgbnVsbCxcbiAgICB2YWx1ZTogdmFsdWUsXG4gICAgbGlua3M6IGxpbmtzXG4gIH1cbiAgZGFnLmVtaXQoJ3ByZWFkZCcsIG5vZGUpXG5cbiAgdmFyIG5leHQgPSBhZnRlcihmdW5jdGlvbiAoZXJyKSB7XG4gICAgaWYgKGVycikgcmV0dXJuIGNiKGVycilcblxuICAgIHZhciBvbmxvY2tlZCA9IGZ1bmN0aW9uIChyZWxlYXNlKSB7XG4gICAgICBkYWcubG9ncy5oZWFkKGlkLCBmdW5jdGlvbiAoZXJyLCBzZXEpIHtcbiAgICAgICAgaWYgKGVycikgcmV0dXJuIHJlbGVhc2UoY2IsIGVycilcblxuICAgICAgICBub2RlLmNoYW5nZSA9IGRhZy5jaGFuZ2VzICsgMVxuICAgICAgICBub2RlLnNlcSA9IHNlcSArIDFcblxuICAgICAgICBpZiAob3B0cy5oYXNoICYmIG5vZGUua2V5ICE9PSBvcHRzLmhhc2gpIHJldHVybiByZWxlYXNlKGNiLCBDSEVDS1NVTV9NSVNNQVRDSClcbiAgICAgICAgaWYgKG9wdHMuc2VxICYmIG5vZGUuc2VxICE9PSBvcHRzLnNlcSkgcmV0dXJuIHJlbGVhc2UoY2IsIElOVkFMSURfTE9HKVxuXG4gICAgICAgIHZhciBsb2cgPSB7XG4gICAgICAgICAgY2hhbmdlOiBkYWcuY2hhbmdlcyArIDEsXG4gICAgICAgICAgbm9kZTogbm9kZS5rZXksXG4gICAgICAgICAgbGlua3M6IGxvZ0xpbmtzXG4gICAgICAgIH1cblxuICAgICAgICB2YXIgb25jbG9uZSA9IGZ1bmN0aW9uIChjbG9uZSkge1xuICAgICAgICAgIGlmICghb3B0cy5sb2cpIHJldHVybiByZWxlYXNlKGNiLCBudWxsLCBjbG9uZSlcbiAgICAgICAgICBkYWcuZGIucHV0KGRhZy5sb2dzLmtleShub2RlLmxvZywgbm9kZS5zZXEpLCBtZXNzYWdlcy5FbnRyeS5lbmNvZGUobG9nKSwgZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgaWYgKGVycikgcmV0dXJuIHJlbGVhc2UoY2IsIGVycilcbiAgICAgICAgICAgIHJlbGVhc2UoY2IsIG51bGwsIGNsb25lKVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cblxuICAgICAgICBkYWcuZ2V0KG5vZGUua2V5LCB7IHZhbHVlRW5jb2Rpbmc6ICdiaW5hcnknIH0sIGZ1bmN0aW9uIChfLCBjbG9uZSkge1xuICAgICAgICAgIGlmIChjbG9uZSkgcmV0dXJuIG9uY2xvbmUoY2xvbmUpXG5cbiAgICAgICAgICB2YXIgYmF0Y2ggPSBbXVxuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGlua3MubGVuZ3RoOyBpKyspIGJhdGNoLnB1c2goe3R5cGU6ICdkZWwnLCBrZXk6IEhFQURTICsgbGlua3NbaV19KVxuICAgICAgICAgIGJhdGNoLnB1c2goe3R5cGU6ICdwdXQnLCBrZXk6IENIQU5HRVMgKyBsZXhpbnQucGFjayhub2RlLmNoYW5nZSwgJ2hleCcpLCB2YWx1ZTogbm9kZS5rZXl9KVxuICAgICAgICAgIGJhdGNoLnB1c2goe3R5cGU6ICdwdXQnLCBrZXk6IE5PREVTICsgbm9kZS5rZXksIHZhbHVlOiBtZXNzYWdlcy5Ob2RlLmVuY29kZShub2RlKX0pXG4gICAgICAgICAgYmF0Y2gucHVzaCh7dHlwZTogJ3B1dCcsIGtleTogSEVBRFMgKyBub2RlLmtleSwgdmFsdWU6IG5vZGUua2V5fSlcbiAgICAgICAgICBiYXRjaC5wdXNoKHt0eXBlOiAncHV0Jywga2V5OiBkYWcubG9ncy5rZXkobm9kZS5sb2csIG5vZGUuc2VxKSwgdmFsdWU6IG1lc3NhZ2VzLkVudHJ5LmVuY29kZShsb2cpfSlcblxuICAgICAgICAgIGRhZy5kYi5iYXRjaChiYXRjaCwgZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgaWYgKGVycikgcmV0dXJuIHJlbGVhc2UoY2IsIGVycilcbiAgICAgICAgICAgIGRhZy5jaGFuZ2VzID0gbm9kZS5jaGFuZ2VcbiAgICAgICAgICAgIGRhZy5lbWl0KCdhZGQnLCBub2RlKVxuICAgICAgICAgICAgcmVsZWFzZShjYiwgbnVsbCwgbm9kZSlcbiAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICB9XG5cbiAgICB2YXIgZG9uZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChvcHRzLnJlbGVhc2UpIHJldHVybiBvbmxvY2tlZChvcHRzLnJlbGVhc2UpXG4gICAgICBkYWcubG9jayhvbmxvY2tlZClcbiAgICB9XG5cbiAgICBpZiAobm9kZS5sb2cgPT09IGRhZy5pZCkgeyAvLyB3ZSBvd24gdGhpcyBub2RlXG4gICAgICBpZiAoIWRhZy5zaWduIHx8IG5vZGUuc2lnbmF0dXJlKSByZXR1cm4gZG9uZSgpXG4gICAgICBkYWcuc2lnbihub2RlLCBmdW5jdGlvbiAoZXJyLCBzaWcpIHtcbiAgICAgICAgaWYgKGVycikgcmV0dXJuIGNiKGVycilcbiAgICAgICAgbm9kZS5pZGVudGl0eSA9IGRhZy5pZGVudGl0eVxuICAgICAgICBub2RlLnNpZ25hdHVyZSA9IHNpZ1xuICAgICAgICBkb25lKClcbiAgICAgIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghZGFnLnZlcmlmeSkgcmV0dXJuIGRvbmUoKVxuICAgICAgZGFnLnZlcmlmeShub2RlLCBmdW5jdGlvbiAoZXJyLCB2YWxpZCkge1xuICAgICAgICBpZiAoZXJyKSByZXR1cm4gY2IoZXJyKVxuICAgICAgICBpZiAoIXZhbGlkKSByZXR1cm4gY2IoSU5WQUxJRF9TSUdOQVRVUkUpXG4gICAgICAgIGRvbmUoKVxuICAgICAgfSlcbiAgICB9XG4gIH0pXG5cbiAgdmFyIG5leHRMaW5rID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBjYiA9IG5leHQoKVxuICAgIHJldHVybiBmdW5jdGlvbiAoZXJyLCBsaW5rKSB7XG4gICAgICBpZiAoZXJyKSByZXR1cm4gY2IoZXJyKVxuICAgICAgaWYgKGxpbmsubG9nICE9PSBpZCAmJiBsb2dMaW5rcy5pbmRleE9mKGxpbmsubG9nKSA9PT0gLTEpIGxvZ0xpbmtzLnB1c2gobGluay5sb2cpXG4gICAgICBjYihudWxsKVxuICAgIH1cbiAgfVxuXG4gIGZvciAoaSA9IDA7IGkgPCBsaW5rcy5sZW5ndGg7IGkrKykge1xuICAgIGRhZy5nZXQobGlua3NbaV0sIG5leHRMaW5rKCkpXG4gIH1cbn1cblxudmFyIGNyZWF0ZUxpdmVTdHJlYW0gPSBmdW5jdGlvbiAoZGFnLCBvcHRzKSB7XG4gIHZhciBzaW5jZSA9IG9wdHMuc2luY2UgfHwgMFxuICB2YXIgbGltaXQgPSBvcHRzLmxpbWl0IHx8IC0xXG4gIHZhciB3YWl0ID0gbnVsbFxuXG4gIHZhciByZWFkID0gZnVuY3Rpb24gKHNpemUsIGNiKSB7XG4gICAgaWYgKGRhZy5jaGFuZ2VzIDw9IHNpbmNlKSB7XG4gICAgICB3YWl0ID0gY2JcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICghbGltaXQpIHJldHVybiBjYihudWxsLCBudWxsKVxuXG4gICAgZGFnLmRiLmdldChDSEFOR0VTICsgbGV4aW50LnBhY2soc2luY2UgKyAxLCAnaGV4JyksIGZ1bmN0aW9uIChlcnIsIGhhc2gpIHtcbiAgICAgIGlmIChlcnIpIHJldHVybiBjYihlcnIpXG4gICAgICBkYWcuZ2V0KGhhc2gsIG9wdHMsIGZ1bmN0aW9uIChlcnIsIG5vZGUpIHtcbiAgICAgICAgaWYgKGVycikgcmV0dXJuIGNiKGVycilcbiAgICAgICAgc2luY2UgPSBub2RlLmNoYW5nZVxuICAgICAgICBpZiAobGltaXQgIT09IC0xKSBsaW1pdC0tXG4gICAgICAgIGNiKG51bGwsIG5vZGUpXG4gICAgICB9KVxuICAgIH0pXG4gIH1cblxuICB2YXIga2ljayA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXdhaXQpIHJldHVyblxuICAgIHZhciBjYiA9IHdhaXRcbiAgICB3YWl0ID0gbnVsbFxuICAgIHJlYWQoMCwgY2IpXG4gIH1cblxuICBkYWcub24oJ2FkZCcsIGtpY2spXG4gIGRhZy5yZWFkeShraWNrKVxuXG4gIHZhciBycyA9IGZyb20ub2JqKHJlYWQpXG5cbiAgcnMub25jZSgnY2xvc2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgZGFnLnJlbW92ZUxpc3RlbmVyKCdhZGQnLCBraWNrKVxuICB9KVxuXG4gIHJldHVybiByc1xufVxuXG5IeXBlcmxvZy5wcm90b3R5cGUuY3JlYXRlUmVhZFN0cmVhbSA9IGZ1bmN0aW9uIChvcHRzKSB7XG4gIGlmICghb3B0cykgb3B0cyA9IHt9XG4gIGlmIChvcHRzLnRhaWwpIHtcbiAgICBvcHRzLnNpbmNlID0gdGhpcy5jaGFuZ2VzXG4gIH1cbiAgaWYgKG9wdHMubGl2ZSkgcmV0dXJuIGNyZWF0ZUxpdmVTdHJlYW0odGhpcywgb3B0cylcblxuICB2YXIgc2VsZiA9IHRoaXNcbiAgdmFyIHNpbmNlID0gb3B0cy5zaW5jZSB8fCAwXG4gIHZhciB1bnRpbCA9IG9wdHMudW50aWwgfHwgMFxuXG4gIHZhciBrZXlzID0gdGhpcy5kYi5jcmVhdGVWYWx1ZVN0cmVhbSh7XG4gICAgZ3Q6IENIQU5HRVMgKyBsZXhpbnQucGFjayhzaW5jZSwgJ2hleCcpLFxuICAgIGx0OiBDSEFOR0VTICsgKHVudGlsID8gbGV4aW50LnBhY2sodW50aWwsICdoZXgnKSA6ICd+JyksXG4gICAgdmFsdWVFbmNvZGluZzogJ3V0Zi04JyxcbiAgICByZXZlcnNlOiBvcHRzLnJldmVyc2UsXG4gICAgbGltaXQ6IG9wdHMubGltaXRcbiAgfSlcblxuICB2YXIgZ2V0ID0gZnVuY3Rpb24gKGtleSwgZW5jLCBjYikge1xuICAgIHNlbGYuZ2V0KGtleSwgb3B0cywgY2IpXG4gIH1cblxuICByZXR1cm4gcHVtcChrZXlzLCB0aHJvdWdoLm9iaihnZXQpKVxufVxuXG5IeXBlcmxvZy5wcm90b3R5cGUucmVwbGljYXRlID1cbkh5cGVybG9nLnByb3RvdHlwZS5jcmVhdGVSZXBsaWNhdGlvblN0cmVhbSA9IGZ1bmN0aW9uIChvcHRzKSB7XG4gIHJldHVybiByZXBsaWNhdGUodGhpcywgb3B0cylcbn1cblxuSHlwZXJsb2cucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIChsaW5rcywgdmFsdWUsIG9wdHMsIGNiKSB7XG4gIGlmICh0eXBlb2Ygb3B0cyA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIHRoaXMuYWRkKGxpbmtzLCB2YWx1ZSwgbnVsbCwgb3B0cylcbiAgaWYgKCFjYikgY2IgPSBub29wXG4gIGlmICghb3B0cykgb3B0cyA9IHt9XG4gIGlmICghbGlua3MpIGxpbmtzID0gW11cbiAgaWYgKCFBcnJheS5pc0FycmF5KGxpbmtzKSkgbGlua3MgPSBbbGlua3NdXG4gIHZhbHVlID0gZW5jb2Rlci5lbmNvZGUodmFsdWUsIG9wdHMudmFsdWVFbmNvZGluZyB8fCB0aGlzLnZhbHVlRW5jb2RpbmcpXG5cbiAgdmFyIHNlbGYgPSB0aGlzXG4gIHRoaXMucmVhZHkoZnVuY3Rpb24gKCkge1xuICAgIGFkZChzZWxmLCBsaW5rcywgdmFsdWUsIG9wdHMsIGZ1bmN0aW9uIChlcnIsIG5vZGUpIHtcbiAgICAgIGlmIChlcnIpIHJldHVybiBjYihlcnIpXG4gICAgICBub2RlLnZhbHVlID0gZW5jb2Rlci5kZWNvZGUobm9kZS52YWx1ZSwgb3B0cy52YWx1ZUVuY29kaW5nIHx8IHNlbGYudmFsdWVFbmNvZGluZylcbiAgICAgIGNiKG51bGwsIG5vZGUpXG4gICAgfSlcbiAgfSlcbn1cblxuSHlwZXJsb2cucHJvdG90eXBlLmFwcGVuZCA9IGZ1bmN0aW9uICh2YWx1ZSwgb3B0cywgY2IpIHtcbiAgaWYgKHR5cGVvZiBvcHRzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2IgPSBvcHRzXG4gICAgb3B0cyA9IHt9XG4gIH1cbiAgaWYgKCFjYikgY2IgPSBub29wXG4gIGlmICghb3B0cykgb3B0cyA9IHt9XG4gIHZhciBzZWxmID0gdGhpc1xuICB2YWx1ZSA9IGVuY29kZXIuZW5jb2RlKHZhbHVlLCBvcHRzLnZhbHVlRW5jb2RpbmcgfHwgdGhpcy52YWx1ZUVuY29kaW5nKVxuXG4gIHRoaXMubG9jayhmdW5jdGlvbiAocmVsZWFzZSkge1xuICAgIHNlbGYuaGVhZHMoZnVuY3Rpb24gKGVyciwgaGVhZHMpIHtcbiAgICAgIGlmIChlcnIpIHJldHVybiByZWxlYXNlKGNiLCBlcnIpXG4gICAgICBhZGQoc2VsZiwgaGVhZHMsIHZhbHVlLCB7cmVsZWFzZTogcmVsZWFzZX0sIGZ1bmN0aW9uIChlcnIsIG5vZGUpIHtcbiAgICAgICAgaWYgKGVycikgcmV0dXJuIGNiKGVycilcbiAgICAgICAgbm9kZS52YWx1ZSA9IGVuY29kZXIuZGVjb2RlKG5vZGUudmFsdWUsIG9wdHMudmFsdWVFbmNvZGluZyB8fCBzZWxmLnZhbHVlRW5jb2RpbmcpXG4gICAgICAgIGNiKG51bGwsIG5vZGUpXG4gICAgICB9KVxuICAgIH0pXG4gIH0pXG59XG5cbm1vZHVsZS5leHBvcnRzID0gSHlwZXJsb2dcbiIsImV4cG9ydHMuZW5jb2RlID0gZnVuY3Rpb24gKHZhbHVlLCBlbmMpIHtcbiAgaWYgKHR5cGVvZiBlbmMgPT09ICdvYmplY3QnICYmIGVuYy5lbmNvZGUpIHtcbiAgICB2YWx1ZSA9IGVuYy5lbmNvZGUodmFsdWUpXG4gIH0gZWxzZSBpZiAoZW5jID09PSAnanNvbicpIHtcbiAgICB2YWx1ZSA9IEJ1ZmZlcihKU09OLnN0cmluZ2lmeSh2YWx1ZSkpXG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHZhbHVlID0gbmV3IEJ1ZmZlcih2YWx1ZSlcbiAgcmV0dXJuIHZhbHVlXG59XG5cbmV4cG9ydHMuZGVjb2RlID0gZnVuY3Rpb24gKHZhbHVlLCBlbmMpIHtcbiAgaWYgKHR5cGVvZiBlbmMgPT09ICdvYmplY3QnICYmIGVuYy5kZWNvZGUpIHtcbiAgICByZXR1cm4gZW5jLmRlY29kZSh2YWx1ZSlcbiAgfSBlbHNlIGlmIChlbmMgPT09ICdqc29uJykge1xuICAgIHJldHVybiBKU09OLnBhcnNlKHZhbHVlLnRvU3RyaW5nKCkpXG4gIH0gZWxzZSBpZiAoZW5jID09PSAndXRmLTgnIHx8IGVuYyA9PT0gJ3V0ZjgnKSB7XG4gICAgcmV0dXJuIHZhbHVlLnRvU3RyaW5nKClcbiAgfVxuICByZXR1cm4gdmFsdWVcbn1cbiIsInZhciBmcmFtZWRIYXNoID0gcmVxdWlyZSgnZnJhbWVkLWhhc2gnKVxudmFyIGVtcHR5ID0gbmV3IEJ1ZmZlcigwKVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChsaW5rcywgdmFsdWUpIHtcbiAgdmFyIGhhc2ggPSBmcmFtZWRIYXNoKCdzaGEyNTYnKVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxpbmtzLmxlbmd0aDsgaSsrKSBoYXNoLnVwZGF0ZShsaW5rc1tpXSlcbiAgaGFzaC51cGRhdGUodmFsdWUgfHwgZW1wdHkpXG4gIHJldHVybiBoYXNoLmRpZ2VzdCgnaGV4Jylcbn1cbiIsInZhciBwcm90b2J1ZiA9IHJlcXVpcmUoJ3Byb3RvY29sLWJ1ZmZlcnMnKVxuXG5cbm1vZHVsZS5leHBvcnRzID0gcHJvdG9idWYoXCJtZXNzYWdlIE5vZGUge1xcbiAgcmVxdWlyZWQgdWludDMyIGNoYW5nZSAgID0gMTtcXG4gIHJlcXVpcmVkIHN0cmluZyBrZXkgICAgICA9IDI7XFxuICByZXF1aXJlZCBzdHJpbmcgbG9nICAgICAgPSAzO1xcbiAgb3B0aW9uYWwgdWludDMyIHNlcSAgICAgID0gNDtcXG4gIG9wdGlvbmFsIGJ5dGVzIGlkZW50aXR5ICA9IDc7XFxuICBvcHRpb25hbCBieXRlcyBzaWduYXR1cmUgPSA4O1xcbiAgcmVxdWlyZWQgYnl0ZXMgdmFsdWUgICAgID0gNTtcXG4gIHJlcGVhdGVkIHN0cmluZyBsaW5rcyAgICA9IDY7XFxufVxcblxcbm1lc3NhZ2UgRW50cnkge1xcbiAgcmVxdWlyZWQgdWludDMyIGNoYW5nZSA9IDE7XFxuICByZXF1aXJlZCBzdHJpbmcgbm9kZSAgID0gMjtcXG4gIHJlcGVhdGVkIHN0cmluZyBsaW5rcyAgPSAzO1xcbn1cXG5cXG5tZXNzYWdlIExvZyB7XFxuICByZXF1aXJlZCBzdHJpbmcgbG9nID0gMTtcXG4gIHJlcXVpcmVkIHVpbnQzMiBzZXEgPSAyO1xcbn1cXG5cXG5tZXNzYWdlIEhhbmRzaGFrZSB7XFxuICByZXF1aXJlZCB1aW50MzIgdmVyc2lvbiA9IDE7XFxuICBvcHRpb25hbCBzdHJpbmcgbW9kZSAgICA9IDIgW2RlZmF1bHQgPSBcXFwic3luY1xcXCJdO1xcbiAgb3B0aW9uYWwgYnl0ZXMgbWV0YWRhdGEgPSAzO1xcbiAgb3B0aW9uYWwgYm9vbCBsaXZlICAgICAgPSA0O1xcbn1cXG5cIilcbiIsInZhciBEdXBsZXhpZnkgPSByZXF1aXJlKCdkdXBsZXhpZnknKVxudmFyIHV0aWwgPSByZXF1aXJlKCd1dGlsJylcbnZhciBscHN0cmVhbSA9IHJlcXVpcmUoJ2xlbmd0aC1wcmVmaXhlZC1zdHJlYW0nKVxudmFyIHRocm91Z2ggPSByZXF1aXJlKCd0aHJvdWdoMicpXG52YXIgZGVidWcgPSByZXF1aXJlKCdkZWJ1ZycpKCdoeXBlcmxvZy1yZXBsaWNhdGUnKVxudmFyIG1lc3NhZ2VzID0gcmVxdWlyZSgnLi9tZXNzYWdlcycpXG5cbnZhciBlbXB0eSA9IHtcbiAgZW5jb2RpbmdMZW5ndGg6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gMFxuICB9LFxuICBlbmNvZGU6IGZ1bmN0aW9uIChkYXRhLCBidWYsIG9mZnNldCkge1xuICAgIHJldHVybiBidWZcbiAgfVxufVxuXG52YXIgUHJvdG9jb2wgPSBmdW5jdGlvbiAob3B0cykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgUHJvdG9jb2wpKSByZXR1cm4gbmV3IFByb3RvY29sKG9wdHMpXG5cbiAgdmFyIGZyYW1lID0gIW9wdHMgfHwgb3B0cy5mcmFtZSAhPT0gZmFsc2VcblxuICB0aGlzLl9lbmNvZGVyID0gZnJhbWUgPyBscHN0cmVhbS5lbmNvZGUoKSA6IHRocm91Z2gub2JqKClcbiAgdGhpcy5fZGVjb2RlciA9IGZyYW1lID8gbHBzdHJlYW0uZGVjb2RlKCkgOiB0aHJvdWdoLm9iaigpXG4gIHRoaXMuX2ZpbmFsaXplID0gb3B0cy5maW5hbGl6ZSA/IG9wdHMuZmluYWxpemUgOiBmdW5jdGlvbiAoY2IpIHsgY2IoKSB9XG4gIHRoaXMuX3Byb2Nlc3MgPSBvcHRzLnByb2Nlc3MgfHwgbnVsbFxuXG4gIHZhciBzZWxmID0gdGhpc1xuICB2YXIgcGFyc2UgPSB0aHJvdWdoLm9iaihmdW5jdGlvbiAoZGF0YSwgZW5jLCBjYikge1xuICAgIHNlbGYuX2RlY29kZShkYXRhLCBjYilcbiAgfSlcblxuICBwYXJzZS5vbignZXJyb3InLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgc2VsZi5kZXN0cm95KGVycilcbiAgfSlcblxuICB0aGlzLm9uKCdlbmQnLCBmdW5jdGlvbiAoKSB7XG4gICAgZGVidWcoJ2VuZGVkJylcbiAgICBzZWxmLmVuZCgpXG4gIH0pXG5cbiAgdGhpcy5vbignZmluaXNoJywgZnVuY3Rpb24gKCkge1xuICAgIGRlYnVnKCdmaW5pc2hlZCcpXG4gICAgc2VsZi5maW5hbGl6ZSgpXG4gIH0pXG5cbiAgdGhpcy5fZGVjb2Rlci5waXBlKHBhcnNlKVxuXG4gIGlmICh0aGlzLl9wcm9jZXNzKSB7XG4gICAgdGhpcy5fcHJvY2Vzcy5waXBlKHRocm91Z2gub2JqKGZ1bmN0aW9uIChub2RlLCBlbmMsIGNiKSB7XG4gICAgICBzZWxmLmVtaXQoJ25vZGUnLCBub2RlLCBjYikgfHwgY2IoKVxuICAgIH0pKVxuICB9XG5cbiAgdmFyIGh3bSA9IG9wdHMuaGlnaFdhdGVyTWFyayB8fCAxNlxuICBEdXBsZXhpZnkuY2FsbCh0aGlzLCB0aGlzLl9kZWNvZGVyLCB0aGlzLl9lbmNvZGVyLCBmcmFtZSA/IHt9IDoge29iamVjdE1vZGU6IHRydWUsIGhpZ2hXYXRlck1hcms6IGh3bX0pXG59XG5cbnV0aWwuaW5oZXJpdHMoUHJvdG9jb2wsIER1cGxleGlmeSlcblxuUHJvdG9jb2wucHJvdG90eXBlLmhhbmRzaGFrZSA9IGZ1bmN0aW9uIChoYW5kc2hha2UsIGNiKSB7XG4gIGRlYnVnKCdzZW5kaW5nIGhhbmRzaGFrZScpXG4gIHRoaXMuX2VuY29kZSgwLCBtZXNzYWdlcy5IYW5kc2hha2UsIGhhbmRzaGFrZSwgY2IpXG59XG5cblByb3RvY29sLnByb3RvdHlwZS5oYXZlID0gZnVuY3Rpb24gKGhhdmUsIGNiKSB7XG4gIGRlYnVnKCdzZW5kaW5nIGhhdmUnKVxuICB0aGlzLl9lbmNvZGUoMSwgbWVzc2FnZXMuTG9nLCBoYXZlLCBjYilcbn1cblxuUHJvdG9jb2wucHJvdG90eXBlLndhbnQgPSBmdW5jdGlvbiAod2FudCwgY2IpIHtcbiAgZGVidWcoJ3NlbmRpbmcgd2FudCcpXG4gIHRoaXMuX2VuY29kZSgyLCBtZXNzYWdlcy5Mb2csIHdhbnQsIGNiKVxufVxuXG5Qcm90b2NvbC5wcm90b3R5cGUubm9kZSA9IGZ1bmN0aW9uIChub2RlLCBjYikge1xuICBkZWJ1Zygnc2VuZGluZyBub2RlJylcbiAgdGhpcy5fZW5jb2RlKDMsIG1lc3NhZ2VzLk5vZGUsIG5vZGUsIGNiKVxufVxuXG5Qcm90b2NvbC5wcm90b3R5cGUuc2VudEhlYWRzID0gZnVuY3Rpb24gKGNiKSB7XG4gIGRlYnVnKCdzZW5kaW5nIHNlbnRIZWFkcycpXG4gIHRoaXMuX2VuY29kZSg0LCBlbXB0eSwgbnVsbCwgY2IpXG59XG5cblByb3RvY29sLnByb3RvdHlwZS5zZW50V2FudHMgPSBmdW5jdGlvbiAoY2IpIHtcbiAgZGVidWcoJ3NlbmRpbmcgc2VudFdhbnRzJylcbiAgdGhpcy5fZW5jb2RlKDUsIGVtcHR5LCBudWxsLCBjYilcbn1cblxuUHJvdG9jb2wucHJvdG90eXBlLmZpbmFsaXplID0gZnVuY3Rpb24gKGNiKSB7XG4gIHZhciBzZWxmID0gdGhpc1xuICB0aGlzLl9maW5hbGl6ZShmdW5jdGlvbiAoZXJyKSB7XG4gICAgZGVidWcoJ2VuZGluZycpXG4gICAgaWYgKGVycikgcmV0dXJuIHNlbGYuZGVzdHJveShlcnIpXG4gICAgc2VsZi5fZW5jb2Rlci5lbmQoY2IpXG4gIH0pXG59XG5cblByb3RvY29sLnByb3RvdHlwZS5fZW5jb2RlID0gZnVuY3Rpb24gKHR5cGUsIGVuYywgZGF0YSwgY2IpIHtcbiAgdmFyIGJ1ZiA9IG5ldyBCdWZmZXIoZW5jLmVuY29kaW5nTGVuZ3RoKGRhdGEpICsgMSlcbiAgYnVmWzBdID0gdHlwZVxuICBlbmMuZW5jb2RlKGRhdGEsIGJ1ZiwgMSlcbiAgdGhpcy5fZW5jb2Rlci53cml0ZShidWYsIGNiKVxufVxuXG52YXIgZGVjb2RlTWVzc2FnZSA9IGZ1bmN0aW9uIChkYXRhKSB7XG4gIHN3aXRjaCAoZGF0YVswXSkge1xuICAgIGNhc2UgMDogcmV0dXJuIG1lc3NhZ2VzLkhhbmRzaGFrZS5kZWNvZGUoZGF0YSwgMSlcbiAgICBjYXNlIDE6IHJldHVybiBtZXNzYWdlcy5Mb2cuZGVjb2RlKGRhdGEsIDEpXG4gICAgY2FzZSAyOiByZXR1cm4gbWVzc2FnZXMuTG9nLmRlY29kZShkYXRhLCAxKVxuICAgIGNhc2UgMzogcmV0dXJuIG1lc3NhZ2VzLk5vZGUuZGVjb2RlKGRhdGEsIDEpXG4gIH1cbiAgcmV0dXJuIG51bGxcbn1cblxuUHJvdG9jb2wucHJvdG90eXBlLl9kZWNvZGUgPSBmdW5jdGlvbiAoZGF0YSwgY2IpIHtcbiAgdHJ5IHtcbiAgICB2YXIgbXNnID0gZGVjb2RlTWVzc2FnZShkYXRhKVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICByZXR1cm4gY2IoZXJyKVxuICB9XG5cbiAgc3dpdGNoIChkYXRhWzBdKSB7XG4gICAgY2FzZSAwOlxuICAgIGRlYnVnKCdyZWNlaXZpbmcgaGFuZHNoYWtlJylcbiAgICByZXR1cm4gdGhpcy5lbWl0KCdoYW5kc2hha2UnLCBtc2csIGNiKSB8fCBjYigpXG5cbiAgICBjYXNlIDE6XG4gICAgZGVidWcoJ3JlY2VpdmluZyBoYXZlJylcbiAgICByZXR1cm4gdGhpcy5lbWl0KCdoYXZlJywgbXNnLCBjYikgfHwgY2IoKVxuXG4gICAgY2FzZSAyOlxuICAgIGRlYnVnKCdyZWNlaXZpbmcgd2FudCcpXG4gICAgcmV0dXJuIHRoaXMuZW1pdCgnd2FudCcsIG1zZywgY2IpIHx8IGNiKClcblxuICAgIGNhc2UgMzpcbiAgICBkZWJ1ZygncmVjZWl2aW5nIG5vZGUnKVxuICAgIHJldHVybiB0aGlzLl9wcm9jZXNzID8gdGhpcy5fcHJvY2Vzcy53cml0ZShtc2csIGNiKSA6ICh0aGlzLmVtaXQoJ25vZGUnLCBtc2csIGNiKSB8fCBjYigpKVxuXG4gICAgY2FzZSA0OlxuICAgIGRlYnVnKCdyZWNlaXZpbmcgc2VudEhlYWRzJylcbiAgICByZXR1cm4gdGhpcy5lbWl0KCdzZW50SGVhZHMnLCBjYikgfHwgY2IoKVxuXG4gICAgY2FzZSA1OlxuICAgIGRlYnVnKCdyZWNlaXZpbmcgc2VudFdhbnRzJylcbiAgICByZXR1cm4gdGhpcy5lbWl0KCdzZW50V2FudHMnLCBjYikgfHwgY2IoKVxuICB9XG5cbiAgY2IoKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFByb3RvY29sXG4iLCJ2YXIgdGhyb3VnaCA9IHJlcXVpcmUoJ3Rocm91Z2gyJylcbnZhciBwdW1wID0gcmVxdWlyZSgncHVtcCcpXG52YXIgYml0ZmllbGQgPSByZXF1aXJlKCdiaXRmaWVsZCcpXG52YXIgcHJvdG9jb2wgPSByZXF1aXJlKCcuL3Byb3RvY29sJylcbnZhciBzb3J0ZWRRdWV1ZSA9IHJlcXVpcmUoJy4vc29ydGVkLXF1ZXVlJylcblxudmFyIG5vb3AgPSBmdW5jdGlvbiAoKSB7fVxudmFyIG5vYXJyID0gW11cblxudmFyIE1BWF9CSVRGSUVMRCA9IDEwICogMTAyNCAqIDEwMjQgLy8gYXJiaXRyYXJ5IGhpZ2ggbnVtYmVyXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGRhZywgb3B0cykge1xuICBpZiAoIW9wdHMpIG9wdHMgPSB7fVxuXG4gIHZhciBzdHJlYW0gPSBwcm90b2NvbChvcHRzKVxuICB2YXIgbW9kZSA9IG9wdHMubW9kZSB8fCAnc3luYydcblxuICB2YXIgcHVzaGluZyA9IGJpdGZpZWxkKDEwMjQsIHtncm93OiBNQVhfQklURklFTER9KVxuXG4gIHZhciBjaGFuZ2VzID0gMFxuICB2YXIgbWlzc2luZyA9IDBcblxuICB2YXIgZG9uZSA9IGZhbHNlXG4gIHZhciByZW1vdGVTZW50V2FudHMgPSBmYWxzZVxuICB2YXIgcmVtb3RlU2VudEhlYWRzID0gZmFsc2VcbiAgdmFyIGxvY2FsU2VudFdhbnRzID0gZmFsc2VcbiAgdmFyIGxvY2FsU2VudEhlYWRzID0gZmFsc2VcblxuICB2YXIgbGl2ZSA9IG9wdHMubGl2ZVxuICB2YXIgb3V0Z29pbmcgPSBzb3J0ZWRRdWV1ZSgpXG4gIHZhciBpbmNvbWluZyA9IHNvcnRlZFF1ZXVlKClcblxuICBvdXRnb2luZy5wdWxsKGZ1bmN0aW9uIGxvb3AgKGVudHJ5KSB7XG4gICAgZGFnLmdldChlbnRyeS5ub2RlLCB7dmFsdWVFbmNvZGluZzogJ2JpbmFyeSd9LCBmdW5jdGlvbiAoZXJyLCBub2RlKSB7XG4gICAgICBpZiAoZXJyKSByZXR1cm4gc3RyZWFtLmRlc3Ryb3koZXJyKVxuICAgICAgc3RyZWFtLmVtaXQoJ3B1c2gnKVxuICAgICAgc3RyZWFtLm5vZGUobm9kZSwgZnVuY3Rpb24gKGVycikge1xuICAgICAgICBpZiAoZXJyKSByZXR1cm4gc3RyZWFtLmRlc3Ryb3koZXJyKVxuICAgICAgICBzZW5kTm9kZShub2RlLmxvZywgbm9kZS5zZXEgKyAxLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgICAgaWYgKGVycikgcmV0dXJuIHN0cmVhbS5kZXN0cm95KGVycilcbiAgICAgICAgICBvdXRnb2luZy5wdWxsKGxvb3ApXG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgIH0pXG4gIH0pXG5cbiAgdmFyIHBpcGUgPSBmdW5jdGlvbiAoYSwgYiwgY2IpIHtcbiAgICB2YXIgZGVzdHJveSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGEuZGVzdHJveSgpXG4gICAgfVxuXG4gICAgc3RyZWFtLm9uKCdjbG9zZScsIGRlc3Ryb3kpXG4gICAgc3RyZWFtLm9uKCdmaW5pc2gnLCBkZXN0cm95KVxuXG4gICAgYS5vbignZW5kJywgZnVuY3Rpb24gKCkge1xuICAgICAgc3RyZWFtLnJlbW92ZUxpc3RlbmVyKCdjbG9zZScsIGRlc3Ryb3kpXG4gICAgICBzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoJ2ZpbmlzaCcsIGRlc3Ryb3kpXG4gICAgfSlcblxuICAgIHJldHVybiBwdW1wKGEsIGIsIGNiKVxuICB9XG5cbiAgdmFyIHNlbmRDaGFuZ2VzID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciB3cml0ZSA9IGZ1bmN0aW9uIChub2RlLCBlbmMsIGNiKSB7XG4gICAgICBzdHJlYW0ubm9kZShub2RlLCBjYilcbiAgICB9XG5cbiAgICBzdHJlYW0uZW1pdCgnbGl2ZScpXG4gICAgcGlwZShkYWcuY3JlYXRlUmVhZFN0cmVhbSh7c2luY2U6IGNoYW5nZXMsIGxpdmU6IHRydWV9KSwgdGhyb3VnaC5vYmood3JpdGUpKVxuICB9XG5cbiAgdmFyIHVwZGF0ZSA9IGZ1bmN0aW9uIChjYikge1xuICAgIGlmIChkb25lIHx8ICFsb2NhbFNlbnRXYW50cyB8fCAhbG9jYWxTZW50SGVhZHMgfHwgIXJlbW90ZVNlbnRXYW50cyB8fCAhcmVtb3RlU2VudEhlYWRzKSByZXR1cm4gY2IoKVxuICAgIGRvbmUgPSB0cnVlXG4gICAgaWYgKCFsaXZlKSByZXR1cm4gc3RyZWFtLmZpbmFsaXplKGNiKVxuICAgIHNlbmRDaGFuZ2VzKClcbiAgICBjYigpXG4gIH1cblxuICB2YXIgc2VudFdhbnRzID0gZnVuY3Rpb24gKGNiKSB7XG4gICAgbG9jYWxTZW50V2FudHMgPSB0cnVlXG4gICAgc3RyZWFtLnNlbnRXYW50cygpXG4gICAgdXBkYXRlKGNiKVxuICB9XG5cbiAgdmFyIHNlbnRIZWFkcyA9IGZ1bmN0aW9uIChjYikge1xuICAgIGxvY2FsU2VudEhlYWRzID0gdHJ1ZVxuICAgIHN0cmVhbS5zZW50SGVhZHMoKVxuICAgIHVwZGF0ZShjYilcbiAgfVxuXG4gIHZhciBzZW5kTm9kZSA9IGZ1bmN0aW9uIChsb2csIHNlcSwgY2IpIHtcbiAgICBkYWcubG9ncy5nZXQobG9nLCBzZXEsIGZ1bmN0aW9uIChlcnIsIGVudHJ5KSB7XG4gICAgICBpZiAoZXJyICYmIGVyci5ub3RGb3VuZCkgcmV0dXJuIGNiKClcbiAgICAgIGlmIChlcnIpIHJldHVybiBjYihlcnIpXG4gICAgICBpZiAoZW50cnkuY2hhbmdlID4gY2hhbmdlcykgcmV0dXJuIGNiKCkgLy8gZW5zdXJlIHNuYXBzaG90XG5cbiAgICAgIHZhciBpID0gMFxuICAgICAgdmFyIGxvb3AgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChpIDwgZW50cnkubGlua3MubGVuZ3RoKSByZXR1cm4gc2VuZEhhdmUoZW50cnkubGlua3NbaSsrXSwgbG9vcClcbiAgICAgICAgZW50cnkubGlua3MgPSBub2FyciAvLyBwcmVtYXR1cmUgb3B0OiBsZXNzIG1lbSB5b1xuICAgICAgICBvdXRnb2luZy5wdXNoKGVudHJ5LCBjYilcbiAgICAgIH1cblxuICAgICAgbG9vcCgpXG4gICAgfSlcbiAgfVxuXG4gIHZhciByZWNlaXZlTm9kZSA9IGZ1bmN0aW9uIChub2RlLCBjYikge1xuICAgIHZhciBvcHRzID0ge1xuICAgICAgaGFzaDogbm9kZS5rZXksXG4gICAgICBsb2c6IG5vZGUubG9nLFxuICAgICAgc2VxOiBub2RlLnNlcSxcbiAgICAgIGlkZW50aXR5OiBub2RlLmlkZW50aXR5LFxuICAgICAgc2lnbmF0dXJlOiBub2RlLnNpZ25hdHVyZSxcbiAgICAgIHZhbHVlRW5jb2Rpbmc6ICdiaW5hcnknXG4gICAgfVxuICAgIGRhZy5hZGQobm9kZS5saW5rcywgbm9kZS52YWx1ZSwgb3B0cywgZnVuY3Rpb24gKGVycikge1xuICAgICAgaWYgKCFlcnIpIHJldHVybiBhZnRlckFkZChjYilcbiAgICAgIGlmICghZXJyLm5vdEZvdW5kKSByZXR1cm4gY2IoZXJyKVxuICAgICAgaW5jb21pbmcucHVzaChub2RlLCBjYilcbiAgICB9KVxuICB9XG5cbiAgdmFyIGFmdGVyQWRkID0gZnVuY3Rpb24gKGNiKSB7XG4gICAgc3RyZWFtLmVtaXQoJ3B1bGwnKVxuICAgIGlmICghbG9jYWxTZW50V2FudHMgJiYgIS0tbWlzc2luZykgcmV0dXJuIHNlbnRXYW50cyhjYilcbiAgICBpZiAoIWluY29taW5nLmxlbmd0aCkgcmV0dXJuIGNiKClcbiAgICBpbmNvbWluZy5wdWxsKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICByZWNlaXZlTm9kZShub2RlLCBjYilcbiAgICB9KVxuICB9XG5cbiAgdmFyIHNlbmRIYXZlID0gZnVuY3Rpb24gKGxvZywgY2IpIHtcbiAgICBkYWcuZW51bWVyYXRlKGxvZywgZnVuY3Rpb24gKGVyciwgaWR4KSB7XG4gICAgICBpZiAoZXJyKSByZXR1cm4gY2IoZXJyKVxuXG4gICAgICBpZiAocHVzaGluZy5nZXQoaWR4KSkgcmV0dXJuIGNiKClcbiAgICAgIHB1c2hpbmcuc2V0KGlkeCwgdHJ1ZSlcblxuICAgICAgZGFnLmxvZ3MuaGVhZChsb2csIGZ1bmN0aW9uIChlcnIsIHNlcSkge1xuICAgICAgICBpZiAoZXJyKSByZXR1cm4gY2IoZXJyKVxuICAgICAgICBkYWcubG9ncy5nZXQobG9nLCBzZXEsIGZ1bmN0aW9uIGxvb3AgKGVyciwgZW50cnkpIHsgLy8gZW5zdXJlIHNuYXBzaG90XG4gICAgICAgICAgaWYgKGVyciAmJiBlcnIubm90Rm91bmQpIHJldHVybiBjYigpXG4gICAgICAgICAgaWYgKGVycikgcmV0dXJuIGNiKGVycilcbiAgICAgICAgICBpZiAoZW50cnkuY2hhbmdlID4gY2hhbmdlcykgcmV0dXJuIGRhZy5sb2dzLmdldChsb2csIHNlcSAtIDEsIGxvb3ApXG4gICAgICAgICAgc3RyZWFtLmhhdmUoe2xvZzogbG9nLCBzZXE6IHNlcX0sIGNiKVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgc3RyZWFtLm9uY2UoJ3NlbnRIZWFkcycsIGZ1bmN0aW9uIChjYikge1xuICAgIGlmICghbG9jYWxTZW50V2FudHMgJiYgIW1pc3NpbmcpIHNlbnRXYW50cyhub29wKVxuICAgIHJlbW90ZVNlbnRIZWFkcyA9IHRydWVcbiAgICB1cGRhdGUoY2IpXG4gIH0pXG5cbiAgc3RyZWFtLm9uY2UoJ3NlbnRXYW50cycsIGZ1bmN0aW9uIChjYikge1xuICAgIHJlbW90ZVNlbnRXYW50cyA9IHRydWVcbiAgICB1cGRhdGUoY2IpXG4gIH0pXG5cbiAgc3RyZWFtLm9uKCd3YW50JywgZnVuY3Rpb24gKGhlYWQsIGNiKSB7XG4gICAgc2VuZE5vZGUoaGVhZC5sb2csIGhlYWQuc2VxICsgMSwgY2IpXG4gIH0pXG5cbiAgc3RyZWFtLm9uKCdoYXZlJywgZnVuY3Rpb24gKGhlYWQsIGNiKSB7XG4gICAgZGFnLmxvZ3MuaGVhZChoZWFkLmxvZywgZnVuY3Rpb24gKGVyciwgc2VxKSB7XG4gICAgICBpZiAoZXJyKSByZXR1cm4gY2IoZXJyKVxuICAgICAgaWYgKHNlcSA+PSBoZWFkLnNlcSkgcmV0dXJuIGNiKClcbiAgICAgIG1pc3NpbmcgKz0gKGhlYWQuc2VxIC0gc2VxKVxuICAgICAgc3RyZWFtLndhbnQoe2xvZzogaGVhZC5sb2csIHNlcTogc2VxfSwgY2IpXG4gICAgfSlcbiAgfSlcblxuICBzdHJlYW0ub24oJ25vZGUnLCByZWNlaXZlTm9kZSlcblxuICAvLyBzdGFydCB0aGUgaGFuZHNoYWtlXG5cbiAgc3RyZWFtLm9uKCdoYW5kc2hha2UnLCBmdW5jdGlvbiAoaGFuZHNoYWtlLCBjYikge1xuICAgIHZhciByZW1vdGVNb2RlID0gaGFuZHNoYWtlLm1vZGVcblxuICAgIGlmIChyZW1vdGVNb2RlICE9PSAncHVsbCcgJiYgcmVtb3RlTW9kZSAhPT0gJ3B1c2gnICYmIHJlbW90ZU1vZGUgIT09ICdzeW5jJykgcmV0dXJuIGNiKG5ldyBFcnJvcignUmVtb3RlIHVzZXMgaW52YWxpZCBtb2RlOiAnICsgcmVtb3RlTW9kZSkpXG4gICAgaWYgKHJlbW90ZU1vZGUgPT09ICdwdWxsJyAmJiBtb2RlID09PSAncHVsbCcpIHJldHVybiBjYihuZXcgRXJyb3IoJ1JlbW90ZSBhbmQgbG9jYWwgYXJlIGJvdGggcHVsbGluZycpKVxuICAgIGlmIChyZW1vdGVNb2RlID09PSAncHVzaCcgJiYgbW9kZSA9PT0gJ3B1c2gnKSByZXR1cm4gY2IobmV3IEVycm9yKCdSZW1vdGUgYW5kIGxvY2FsIGFyZSBib3RoIHB1c2hpbmcnKSlcblxuICAgIHJlbW90ZVNlbnRXYW50cyA9IHJlbW90ZU1vZGUgPT09ICdwdXNoJ1xuICAgIHJlbW90ZVNlbnRIZWFkcyA9IHJlbW90ZU1vZGUgPT09ICdwdWxsJ1xuICAgIGxvY2FsU2VudFdhbnRzID0gbW9kZSA9PT0gJ3B1c2gnIHx8IHJlbW90ZU1vZGUgPT09ICdwdWxsJ1xuICAgIGxvY2FsU2VudEhlYWRzID0gbW9kZSA9PT0gJ3B1bGwnIHx8IHJlbW90ZU1vZGUgPT09ICdwdXNoJ1xuXG4gICAgaWYgKGhhbmRzaGFrZS5tZXRhZGF0YSkgc3RyZWFtLmVtaXQoJ21ldGFkYXRhJywgaGFuZHNoYWtlLm1ldGFkYXRhKVxuICAgIGlmICghbGl2ZSkgbGl2ZSA9IGhhbmRzaGFrZS5saXZlXG4gICAgaWYgKGxvY2FsU2VudEhlYWRzKSByZXR1cm4gdXBkYXRlKGNiKVxuXG4gICAgdmFyIHdyaXRlID0gZnVuY3Rpb24gKG5vZGUsIGVuYywgY2IpIHtcbiAgICAgIHNlbmRIYXZlKG5vZGUubG9nLCBjYilcbiAgICB9XG5cbiAgICBkYWcubG9jayhmdW5jdGlvbiAocmVsZWFzZSkgeyAvLyBUT0RPOiBkb24ndCBsb2NrIGhlcmUuIGZpZ3VyZSBvdXQgaG93IHRvIHNuYXBzaG90IHRoZSBoZWFkcyB0byBhIGNoYW5nZSBpbnN0ZWFkXG4gICAgICBjaGFuZ2VzID0gZGFnLmNoYW5nZXNcbiAgICAgIHBpcGUoZGFnLmhlYWRzKCksIHRocm91Z2gub2JqKHdyaXRlKSwgZnVuY3Rpb24gKGVycikge1xuICAgICAgICByZWxlYXNlKClcbiAgICAgICAgaWYgKGVycikgcmV0dXJuIGNiKGVycilcbiAgICAgICAgc2VudEhlYWRzKGNiKVxuICAgICAgfSlcbiAgICB9KVxuICB9KVxuXG4gIHN0cmVhbS5oYW5kc2hha2Uoe3ZlcnNpb246IDEsIG1vZGU6IG9wdHMubW9kZSwgbWV0YWRhdGE6IG9wdHMubWV0YWRhdGEsIGxpdmU6IGxpdmV9KVxuXG4gIHJldHVybiBzdHJlYW1cbn1cbiIsInZhciBpbmRleE9mID0gZnVuY3Rpb24gKGxpc3QsIGNoYW5nZSkge1xuICB2YXIgbG93ID0gMFxuICB2YXIgaGlnaCA9IGxpc3QubGVuZ3RoXG4gIHZhciBtaWQgPSAwXG5cbiAgd2hpbGUgKGxvdyA8IGhpZ2gpIHtcbiAgICBtaWQgPSAobG93ICsgaGlnaCkgPj4gMVxuICAgIGlmIChjaGFuZ2UgPCBsaXN0W21pZF0uY2hhbmdlKSBoaWdoID0gbWlkXG4gICAgZWxzZSBsb3cgPSBtaWQgKyAxXG4gIH1cblxuICByZXR1cm4gbG93XG59XG5cbnZhciBTb3J0ZWRRdWV1ZSA9IGZ1bmN0aW9uICgpIHsgLy8gVE9ETzogYnVmZmVyIHRvIGxldmVsZGIgaWYgdGhlIHF1ZXVlIGJlY29tZXMgbGFyZ2VcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFNvcnRlZFF1ZXVlKSkgcmV0dXJuIG5ldyBTb3J0ZWRRdWV1ZSgpXG4gIHRoaXMubGlzdCA9IFtdXG4gIHRoaXMud2FpdCA9IG51bGxcbiAgdGhpcy5sZW5ndGggPSAwXG59XG5cblNvcnRlZFF1ZXVlLnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24gKGVudHJ5LCBjYikge1xuICB2YXIgaSA9IGluZGV4T2YodGhpcy5saXN0LCBlbnRyeS5jaGFuZ2UpXG4gIGlmIChpID09PSB0aGlzLmxpc3QubGVuZ3RoKSB0aGlzLmxpc3QucHVzaChlbnRyeSlcbiAgZWxzZSB0aGlzLmxpc3Quc3BsaWNlKGksIDAsIGVudHJ5KVxuICB0aGlzLmxlbmd0aCsrXG5cbiAgaWYgKHRoaXMud2FpdCkgdGhpcy5wdWxsKHRoaXMud2FpdClcbiAgaWYgKGNiKSBjYigpXG59XG5cblNvcnRlZFF1ZXVlLnByb3RvdHlwZS5wdWxsID0gZnVuY3Rpb24gKGNiKSB7XG4gIGlmICghdGhpcy5saXN0Lmxlbmd0aCkge1xuICAgIHRoaXMud2FpdCA9IGNiXG4gICAgcmV0dXJuXG4gIH1cblxuICB0aGlzLndhaXQgPSBudWxsXG5cbiAgdmFyIG5leHQgPSB0aGlzLmxpc3Quc2hpZnQoKVxuICB0aGlzLmxlbmd0aC0tXG5cbiAgY2IobmV4dClcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBTb3J0ZWRRdWV1ZVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWRhYmxlO1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIHByb2Nlc3NOZXh0VGljayA9IHJlcXVpcmUoJ3Byb2Nlc3MtbmV4dGljay1hcmdzJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIGlzQXJyYXkgPSByZXF1aXJlKCdpc2FycmF5Jyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ2J1ZmZlcicpLkJ1ZmZlcjtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG5SZWFkYWJsZS5SZWFkYWJsZVN0YXRlID0gUmVhZGFibGVTdGF0ZTtcblxudmFyIEVFID0gcmVxdWlyZSgnZXZlbnRzJyk7XG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgRUVsaXN0ZW5lckNvdW50ID0gZnVuY3Rpb24oZW1pdHRlciwgdHlwZSkge1xuICByZXR1cm4gZW1pdHRlci5saXN0ZW5lcnModHlwZSkubGVuZ3RoO1xufTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG5cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBTdHJlYW07XG4oZnVuY3Rpb24gKCl7dHJ5e1xuICBTdHJlYW0gPSByZXF1aXJlKCdzdCcgKyAncmVhbScpO1xufWNhdGNoKF8pe31maW5hbGx5e1xuICBpZiAoIVN0cmVhbSlcbiAgICBTdHJlYW0gPSByZXF1aXJlKCdldmVudHMnKS5FdmVudEVtaXR0ZXI7XG59fSgpKVxuLyo8L3JlcGxhY2VtZW50PiovXG5cbnZhciBCdWZmZXIgPSByZXF1aXJlKCdidWZmZXInKS5CdWZmZXI7XG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgdXRpbCA9IHJlcXVpcmUoJ2NvcmUtdXRpbC1pcycpO1xudXRpbC5pbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgZGVidWdVdGlsID0gcmVxdWlyZSgndXRpbCcpO1xudmFyIGRlYnVnO1xuaWYgKGRlYnVnVXRpbCAmJiBkZWJ1Z1V0aWwuZGVidWdsb2cpIHtcbiAgZGVidWcgPSBkZWJ1Z1V0aWwuZGVidWdsb2coJ3N0cmVhbScpO1xufSBlbHNlIHtcbiAgZGVidWcgPSBmdW5jdGlvbiAoKSB7fTtcbn1cbi8qPC9yZXBsYWNlbWVudD4qL1xuXG52YXIgU3RyaW5nRGVjb2RlcjtcblxudXRpbC5pbmhlcml0cyhSZWFkYWJsZSwgU3RyZWFtKTtcblxudmFyIER1cGxleDtcbmZ1bmN0aW9uIFJlYWRhYmxlU3RhdGUob3B0aW9ucywgc3RyZWFtKSB7XG4gIER1cGxleCA9IER1cGxleCB8fCByZXF1aXJlKCcuL19zdHJlYW1fZHVwbGV4Jyk7XG5cbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgLy8gb2JqZWN0IHN0cmVhbSBmbGFnLiBVc2VkIHRvIG1ha2UgcmVhZChuKSBpZ25vcmUgbiBhbmQgdG9cbiAgLy8gbWFrZSBhbGwgdGhlIGJ1ZmZlciBtZXJnaW5nIGFuZCBsZW5ndGggY2hlY2tzIGdvIGF3YXlcbiAgdGhpcy5vYmplY3RNb2RlID0gISFvcHRpb25zLm9iamVjdE1vZGU7XG5cbiAgaWYgKHN0cmVhbSBpbnN0YW5jZW9mIER1cGxleClcbiAgICB0aGlzLm9iamVjdE1vZGUgPSB0aGlzLm9iamVjdE1vZGUgfHwgISFvcHRpb25zLnJlYWRhYmxlT2JqZWN0TW9kZTtcblxuICAvLyB0aGUgcG9pbnQgYXQgd2hpY2ggaXQgc3RvcHMgY2FsbGluZyBfcmVhZCgpIHRvIGZpbGwgdGhlIGJ1ZmZlclxuICAvLyBOb3RlOiAwIGlzIGEgdmFsaWQgdmFsdWUsIG1lYW5zIFwiZG9uJ3QgY2FsbCBfcmVhZCBwcmVlbXB0aXZlbHkgZXZlclwiXG4gIHZhciBod20gPSBvcHRpb25zLmhpZ2hXYXRlck1hcms7XG4gIHZhciBkZWZhdWx0SHdtID0gdGhpcy5vYmplY3RNb2RlID8gMTYgOiAxNiAqIDEwMjQ7XG4gIHRoaXMuaGlnaFdhdGVyTWFyayA9IChod20gfHwgaHdtID09PSAwKSA/IGh3bSA6IGRlZmF1bHRId207XG5cbiAgLy8gY2FzdCB0byBpbnRzLlxuICB0aGlzLmhpZ2hXYXRlck1hcmsgPSB+fnRoaXMuaGlnaFdhdGVyTWFyaztcblxuICB0aGlzLmJ1ZmZlciA9IFtdO1xuICB0aGlzLmxlbmd0aCA9IDA7XG4gIHRoaXMucGlwZXMgPSBudWxsO1xuICB0aGlzLnBpcGVzQ291bnQgPSAwO1xuICB0aGlzLmZsb3dpbmcgPSBudWxsO1xuICB0aGlzLmVuZGVkID0gZmFsc2U7XG4gIHRoaXMuZW5kRW1pdHRlZCA9IGZhbHNlO1xuICB0aGlzLnJlYWRpbmcgPSBmYWxzZTtcblxuICAvLyBhIGZsYWcgdG8gYmUgYWJsZSB0byB0ZWxsIGlmIHRoZSBvbndyaXRlIGNiIGlzIGNhbGxlZCBpbW1lZGlhdGVseSxcbiAgLy8gb3Igb24gYSBsYXRlciB0aWNrLiAgV2Ugc2V0IHRoaXMgdG8gdHJ1ZSBhdCBmaXJzdCwgYmVjYXVzZSBhbnlcbiAgLy8gYWN0aW9ucyB0aGF0IHNob3VsZG4ndCBoYXBwZW4gdW50aWwgXCJsYXRlclwiIHNob3VsZCBnZW5lcmFsbHkgYWxzb1xuICAvLyBub3QgaGFwcGVuIGJlZm9yZSB0aGUgZmlyc3Qgd3JpdGUgY2FsbC5cbiAgdGhpcy5zeW5jID0gdHJ1ZTtcblxuICAvLyB3aGVuZXZlciB3ZSByZXR1cm4gbnVsbCwgdGhlbiB3ZSBzZXQgYSBmbGFnIHRvIHNheVxuICAvLyB0aGF0IHdlJ3JlIGF3YWl0aW5nIGEgJ3JlYWRhYmxlJyBldmVudCBlbWlzc2lvbi5cbiAgdGhpcy5uZWVkUmVhZGFibGUgPSBmYWxzZTtcbiAgdGhpcy5lbWl0dGVkUmVhZGFibGUgPSBmYWxzZTtcbiAgdGhpcy5yZWFkYWJsZUxpc3RlbmluZyA9IGZhbHNlO1xuXG4gIC8vIENyeXB0byBpcyBraW5kIG9mIG9sZCBhbmQgY3J1c3R5LiAgSGlzdG9yaWNhbGx5LCBpdHMgZGVmYXVsdCBzdHJpbmdcbiAgLy8gZW5jb2RpbmcgaXMgJ2JpbmFyeScgc28gd2UgaGF2ZSB0byBtYWtlIHRoaXMgY29uZmlndXJhYmxlLlxuICAvLyBFdmVyeXRoaW5nIGVsc2UgaW4gdGhlIHVuaXZlcnNlIHVzZXMgJ3V0ZjgnLCB0aG91Z2guXG4gIHRoaXMuZGVmYXVsdEVuY29kaW5nID0gb3B0aW9ucy5kZWZhdWx0RW5jb2RpbmcgfHwgJ3V0ZjgnO1xuXG4gIC8vIHdoZW4gcGlwaW5nLCB3ZSBvbmx5IGNhcmUgYWJvdXQgJ3JlYWRhYmxlJyBldmVudHMgdGhhdCBoYXBwZW5cbiAgLy8gYWZ0ZXIgcmVhZCgpaW5nIGFsbCB0aGUgYnl0ZXMgYW5kIG5vdCBnZXR0aW5nIGFueSBwdXNoYmFjay5cbiAgdGhpcy5yYW5PdXQgPSBmYWxzZTtcblxuICAvLyB0aGUgbnVtYmVyIG9mIHdyaXRlcnMgdGhhdCBhcmUgYXdhaXRpbmcgYSBkcmFpbiBldmVudCBpbiAucGlwZSgpc1xuICB0aGlzLmF3YWl0RHJhaW4gPSAwO1xuXG4gIC8vIGlmIHRydWUsIGEgbWF5YmVSZWFkTW9yZSBoYXMgYmVlbiBzY2hlZHVsZWRcbiAgdGhpcy5yZWFkaW5nTW9yZSA9IGZhbHNlO1xuXG4gIHRoaXMuZGVjb2RlciA9IG51bGw7XG4gIHRoaXMuZW5jb2RpbmcgPSBudWxsO1xuICBpZiAob3B0aW9ucy5lbmNvZGluZykge1xuICAgIGlmICghU3RyaW5nRGVjb2RlcilcbiAgICAgIFN0cmluZ0RlY29kZXIgPSByZXF1aXJlKCdzdHJpbmdfZGVjb2Rlci8nKS5TdHJpbmdEZWNvZGVyO1xuICAgIHRoaXMuZGVjb2RlciA9IG5ldyBTdHJpbmdEZWNvZGVyKG9wdGlvbnMuZW5jb2RpbmcpO1xuICAgIHRoaXMuZW5jb2RpbmcgPSBvcHRpb25zLmVuY29kaW5nO1xuICB9XG59XG5cbnZhciBEdXBsZXg7XG5mdW5jdGlvbiBSZWFkYWJsZShvcHRpb25zKSB7XG4gIER1cGxleCA9IER1cGxleCB8fCByZXF1aXJlKCcuL19zdHJlYW1fZHVwbGV4Jyk7XG5cbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFJlYWRhYmxlKSlcbiAgICByZXR1cm4gbmV3IFJlYWRhYmxlKG9wdGlvbnMpO1xuXG4gIHRoaXMuX3JlYWRhYmxlU3RhdGUgPSBuZXcgUmVhZGFibGVTdGF0ZShvcHRpb25zLCB0aGlzKTtcblxuICAvLyBsZWdhY3lcbiAgdGhpcy5yZWFkYWJsZSA9IHRydWU7XG5cbiAgaWYgKG9wdGlvbnMgJiYgdHlwZW9mIG9wdGlvbnMucmVhZCA9PT0gJ2Z1bmN0aW9uJylcbiAgICB0aGlzLl9yZWFkID0gb3B0aW9ucy5yZWFkO1xuXG4gIFN0cmVhbS5jYWxsKHRoaXMpO1xufVxuXG4vLyBNYW51YWxseSBzaG92ZSBzb21ldGhpbmcgaW50byB0aGUgcmVhZCgpIGJ1ZmZlci5cbi8vIFRoaXMgcmV0dXJucyB0cnVlIGlmIHRoZSBoaWdoV2F0ZXJNYXJrIGhhcyBub3QgYmVlbiBoaXQgeWV0LFxuLy8gc2ltaWxhciB0byBob3cgV3JpdGFibGUud3JpdGUoKSByZXR1cm5zIHRydWUgaWYgeW91IHNob3VsZFxuLy8gd3JpdGUoKSBzb21lIG1vcmUuXG5SZWFkYWJsZS5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uKGNodW5rLCBlbmNvZGluZykge1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuXG4gIGlmICghc3RhdGUub2JqZWN0TW9kZSAmJiB0eXBlb2YgY2h1bmsgPT09ICdzdHJpbmcnKSB7XG4gICAgZW5jb2RpbmcgPSBlbmNvZGluZyB8fCBzdGF0ZS5kZWZhdWx0RW5jb2Rpbmc7XG4gICAgaWYgKGVuY29kaW5nICE9PSBzdGF0ZS5lbmNvZGluZykge1xuICAgICAgY2h1bmsgPSBuZXcgQnVmZmVyKGNodW5rLCBlbmNvZGluZyk7XG4gICAgICBlbmNvZGluZyA9ICcnO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZWFkYWJsZUFkZENodW5rKHRoaXMsIHN0YXRlLCBjaHVuaywgZW5jb2RpbmcsIGZhbHNlKTtcbn07XG5cbi8vIFVuc2hpZnQgc2hvdWxkICphbHdheXMqIGJlIHNvbWV0aGluZyBkaXJlY3RseSBvdXQgb2YgcmVhZCgpXG5SZWFkYWJsZS5wcm90b3R5cGUudW5zaGlmdCA9IGZ1bmN0aW9uKGNodW5rKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gIHJldHVybiByZWFkYWJsZUFkZENodW5rKHRoaXMsIHN0YXRlLCBjaHVuaywgJycsIHRydWUpO1xufTtcblxuUmVhZGFibGUucHJvdG90eXBlLmlzUGF1c2VkID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcgPT09IGZhbHNlO1xufTtcblxuZnVuY3Rpb24gcmVhZGFibGVBZGRDaHVuayhzdHJlYW0sIHN0YXRlLCBjaHVuaywgZW5jb2RpbmcsIGFkZFRvRnJvbnQpIHtcbiAgdmFyIGVyID0gY2h1bmtJbnZhbGlkKHN0YXRlLCBjaHVuayk7XG4gIGlmIChlcikge1xuICAgIHN0cmVhbS5lbWl0KCdlcnJvcicsIGVyKTtcbiAgfSBlbHNlIGlmIChjaHVuayA9PT0gbnVsbCkge1xuICAgIHN0YXRlLnJlYWRpbmcgPSBmYWxzZTtcbiAgICBvbkVvZkNodW5rKHN0cmVhbSwgc3RhdGUpO1xuICB9IGVsc2UgaWYgKHN0YXRlLm9iamVjdE1vZGUgfHwgY2h1bmsgJiYgY2h1bmsubGVuZ3RoID4gMCkge1xuICAgIGlmIChzdGF0ZS5lbmRlZCAmJiAhYWRkVG9Gcm9udCkge1xuICAgICAgdmFyIGUgPSBuZXcgRXJyb3IoJ3N0cmVhbS5wdXNoKCkgYWZ0ZXIgRU9GJyk7XG4gICAgICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlKTtcbiAgICB9IGVsc2UgaWYgKHN0YXRlLmVuZEVtaXR0ZWQgJiYgYWRkVG9Gcm9udCkge1xuICAgICAgdmFyIGUgPSBuZXcgRXJyb3IoJ3N0cmVhbS51bnNoaWZ0KCkgYWZ0ZXIgZW5kIGV2ZW50Jyk7XG4gICAgICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHN0YXRlLmRlY29kZXIgJiYgIWFkZFRvRnJvbnQgJiYgIWVuY29kaW5nKVxuICAgICAgICBjaHVuayA9IHN0YXRlLmRlY29kZXIud3JpdGUoY2h1bmspO1xuXG4gICAgICBpZiAoIWFkZFRvRnJvbnQpXG4gICAgICAgIHN0YXRlLnJlYWRpbmcgPSBmYWxzZTtcblxuICAgICAgLy8gaWYgd2Ugd2FudCB0aGUgZGF0YSBub3csIGp1c3QgZW1pdCBpdC5cbiAgICAgIGlmIChzdGF0ZS5mbG93aW5nICYmIHN0YXRlLmxlbmd0aCA9PT0gMCAmJiAhc3RhdGUuc3luYykge1xuICAgICAgICBzdHJlYW0uZW1pdCgnZGF0YScsIGNodW5rKTtcbiAgICAgICAgc3RyZWFtLnJlYWQoMCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyB1cGRhdGUgdGhlIGJ1ZmZlciBpbmZvLlxuICAgICAgICBzdGF0ZS5sZW5ndGggKz0gc3RhdGUub2JqZWN0TW9kZSA/IDEgOiBjaHVuay5sZW5ndGg7XG4gICAgICAgIGlmIChhZGRUb0Zyb250KVxuICAgICAgICAgIHN0YXRlLmJ1ZmZlci51bnNoaWZ0KGNodW5rKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgIHN0YXRlLmJ1ZmZlci5wdXNoKGNodW5rKTtcblxuICAgICAgICBpZiAoc3RhdGUubmVlZFJlYWRhYmxlKVxuICAgICAgICAgIGVtaXRSZWFkYWJsZShzdHJlYW0pO1xuICAgICAgfVxuXG4gICAgICBtYXliZVJlYWRNb3JlKHN0cmVhbSwgc3RhdGUpO1xuICAgIH1cbiAgfSBlbHNlIGlmICghYWRkVG9Gcm9udCkge1xuICAgIHN0YXRlLnJlYWRpbmcgPSBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBuZWVkTW9yZURhdGEoc3RhdGUpO1xufVxuXG5cbi8vIGlmIGl0J3MgcGFzdCB0aGUgaGlnaCB3YXRlciBtYXJrLCB3ZSBjYW4gcHVzaCBpbiBzb21lIG1vcmUuXG4vLyBBbHNvLCBpZiB3ZSBoYXZlIG5vIGRhdGEgeWV0LCB3ZSBjYW4gc3RhbmQgc29tZVxuLy8gbW9yZSBieXRlcy4gIFRoaXMgaXMgdG8gd29yayBhcm91bmQgY2FzZXMgd2hlcmUgaHdtPTAsXG4vLyBzdWNoIGFzIHRoZSByZXBsLiAgQWxzbywgaWYgdGhlIHB1c2goKSB0cmlnZ2VyZWQgYVxuLy8gcmVhZGFibGUgZXZlbnQsIGFuZCB0aGUgdXNlciBjYWxsZWQgcmVhZChsYXJnZU51bWJlcikgc3VjaCB0aGF0XG4vLyBuZWVkUmVhZGFibGUgd2FzIHNldCwgdGhlbiB3ZSBvdWdodCB0byBwdXNoIG1vcmUsIHNvIHRoYXQgYW5vdGhlclxuLy8gJ3JlYWRhYmxlJyBldmVudCB3aWxsIGJlIHRyaWdnZXJlZC5cbmZ1bmN0aW9uIG5lZWRNb3JlRGF0YShzdGF0ZSkge1xuICByZXR1cm4gIXN0YXRlLmVuZGVkICYmXG4gICAgICAgICAoc3RhdGUubmVlZFJlYWRhYmxlIHx8XG4gICAgICAgICAgc3RhdGUubGVuZ3RoIDwgc3RhdGUuaGlnaFdhdGVyTWFyayB8fFxuICAgICAgICAgIHN0YXRlLmxlbmd0aCA9PT0gMCk7XG59XG5cbi8vIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LlxuUmVhZGFibGUucHJvdG90eXBlLnNldEVuY29kaW5nID0gZnVuY3Rpb24oZW5jKSB7XG4gIGlmICghU3RyaW5nRGVjb2RlcilcbiAgICBTdHJpbmdEZWNvZGVyID0gcmVxdWlyZSgnc3RyaW5nX2RlY29kZXIvJykuU3RyaW5nRGVjb2RlcjtcbiAgdGhpcy5fcmVhZGFibGVTdGF0ZS5kZWNvZGVyID0gbmV3IFN0cmluZ0RlY29kZXIoZW5jKTtcbiAgdGhpcy5fcmVhZGFibGVTdGF0ZS5lbmNvZGluZyA9IGVuYztcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vLyBEb24ndCByYWlzZSB0aGUgaHdtID4gOE1CXG52YXIgTUFYX0hXTSA9IDB4ODAwMDAwO1xuZnVuY3Rpb24gY29tcHV0ZU5ld0hpZ2hXYXRlck1hcmsobikge1xuICBpZiAobiA+PSBNQVhfSFdNKSB7XG4gICAgbiA9IE1BWF9IV007XG4gIH0gZWxzZSB7XG4gICAgLy8gR2V0IHRoZSBuZXh0IGhpZ2hlc3QgcG93ZXIgb2YgMlxuICAgIG4tLTtcbiAgICBuIHw9IG4gPj4+IDE7XG4gICAgbiB8PSBuID4+PiAyO1xuICAgIG4gfD0gbiA+Pj4gNDtcbiAgICBuIHw9IG4gPj4+IDg7XG4gICAgbiB8PSBuID4+PiAxNjtcbiAgICBuKys7XG4gIH1cbiAgcmV0dXJuIG47XG59XG5cbmZ1bmN0aW9uIGhvd011Y2hUb1JlYWQobiwgc3RhdGUpIHtcbiAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCAmJiBzdGF0ZS5lbmRlZClcbiAgICByZXR1cm4gMDtcblxuICBpZiAoc3RhdGUub2JqZWN0TW9kZSlcbiAgICByZXR1cm4gbiA9PT0gMCA/IDAgOiAxO1xuXG4gIGlmIChuID09PSBudWxsIHx8IGlzTmFOKG4pKSB7XG4gICAgLy8gb25seSBmbG93IG9uZSBidWZmZXIgYXQgYSB0aW1lXG4gICAgaWYgKHN0YXRlLmZsb3dpbmcgJiYgc3RhdGUuYnVmZmVyLmxlbmd0aClcbiAgICAgIHJldHVybiBzdGF0ZS5idWZmZXJbMF0ubGVuZ3RoO1xuICAgIGVsc2VcbiAgICAgIHJldHVybiBzdGF0ZS5sZW5ndGg7XG4gIH1cblxuICBpZiAobiA8PSAwKVxuICAgIHJldHVybiAwO1xuXG4gIC8vIElmIHdlJ3JlIGFza2luZyBmb3IgbW9yZSB0aGFuIHRoZSB0YXJnZXQgYnVmZmVyIGxldmVsLFxuICAvLyB0aGVuIHJhaXNlIHRoZSB3YXRlciBtYXJrLiAgQnVtcCB1cCB0byB0aGUgbmV4dCBoaWdoZXN0XG4gIC8vIHBvd2VyIG9mIDIsIHRvIHByZXZlbnQgaW5jcmVhc2luZyBpdCBleGNlc3NpdmVseSBpbiB0aW55XG4gIC8vIGFtb3VudHMuXG4gIGlmIChuID4gc3RhdGUuaGlnaFdhdGVyTWFyaylcbiAgICBzdGF0ZS5oaWdoV2F0ZXJNYXJrID0gY29tcHV0ZU5ld0hpZ2hXYXRlck1hcmsobik7XG5cbiAgLy8gZG9uJ3QgaGF2ZSB0aGF0IG11Y2guICByZXR1cm4gbnVsbCwgdW5sZXNzIHdlJ3ZlIGVuZGVkLlxuICBpZiAobiA+IHN0YXRlLmxlbmd0aCkge1xuICAgIGlmICghc3RhdGUuZW5kZWQpIHtcbiAgICAgIHN0YXRlLm5lZWRSZWFkYWJsZSA9IHRydWU7XG4gICAgICByZXR1cm4gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHN0YXRlLmxlbmd0aDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbjtcbn1cblxuLy8geW91IGNhbiBvdmVycmlkZSBlaXRoZXIgdGhpcyBtZXRob2QsIG9yIHRoZSBhc3luYyBfcmVhZChuKSBiZWxvdy5cblJlYWRhYmxlLnByb3RvdHlwZS5yZWFkID0gZnVuY3Rpb24obikge1xuICBkZWJ1ZygncmVhZCcsIG4pO1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICB2YXIgbk9yaWcgPSBuO1xuXG4gIGlmICh0eXBlb2YgbiAhPT0gJ251bWJlcicgfHwgbiA+IDApXG4gICAgc3RhdGUuZW1pdHRlZFJlYWRhYmxlID0gZmFsc2U7XG5cbiAgLy8gaWYgd2UncmUgZG9pbmcgcmVhZCgwKSB0byB0cmlnZ2VyIGEgcmVhZGFibGUgZXZlbnQsIGJ1dCB3ZVxuICAvLyBhbHJlYWR5IGhhdmUgYSBidW5jaCBvZiBkYXRhIGluIHRoZSBidWZmZXIsIHRoZW4ganVzdCB0cmlnZ2VyXG4gIC8vIHRoZSAncmVhZGFibGUnIGV2ZW50IGFuZCBtb3ZlIG9uLlxuICBpZiAobiA9PT0gMCAmJlxuICAgICAgc3RhdGUubmVlZFJlYWRhYmxlICYmXG4gICAgICAoc3RhdGUubGVuZ3RoID49IHN0YXRlLmhpZ2hXYXRlck1hcmsgfHwgc3RhdGUuZW5kZWQpKSB7XG4gICAgZGVidWcoJ3JlYWQ6IGVtaXRSZWFkYWJsZScsIHN0YXRlLmxlbmd0aCwgc3RhdGUuZW5kZWQpO1xuICAgIGlmIChzdGF0ZS5sZW5ndGggPT09IDAgJiYgc3RhdGUuZW5kZWQpXG4gICAgICBlbmRSZWFkYWJsZSh0aGlzKTtcbiAgICBlbHNlXG4gICAgICBlbWl0UmVhZGFibGUodGhpcyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBuID0gaG93TXVjaFRvUmVhZChuLCBzdGF0ZSk7XG5cbiAgLy8gaWYgd2UndmUgZW5kZWQsIGFuZCB3ZSdyZSBub3cgY2xlYXIsIHRoZW4gZmluaXNoIGl0IHVwLlxuICBpZiAobiA9PT0gMCAmJiBzdGF0ZS5lbmRlZCkge1xuICAgIGlmIChzdGF0ZS5sZW5ndGggPT09IDApXG4gICAgICBlbmRSZWFkYWJsZSh0aGlzKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8vIEFsbCB0aGUgYWN0dWFsIGNodW5rIGdlbmVyYXRpb24gbG9naWMgbmVlZHMgdG8gYmVcbiAgLy8gKmJlbG93KiB0aGUgY2FsbCB0byBfcmVhZC4gIFRoZSByZWFzb24gaXMgdGhhdCBpbiBjZXJ0YWluXG4gIC8vIHN5bnRoZXRpYyBzdHJlYW0gY2FzZXMsIHN1Y2ggYXMgcGFzc3Rocm91Z2ggc3RyZWFtcywgX3JlYWRcbiAgLy8gbWF5IGJlIGEgY29tcGxldGVseSBzeW5jaHJvbm91cyBvcGVyYXRpb24gd2hpY2ggbWF5IGNoYW5nZVxuICAvLyB0aGUgc3RhdGUgb2YgdGhlIHJlYWQgYnVmZmVyLCBwcm92aWRpbmcgZW5vdWdoIGRhdGEgd2hlblxuICAvLyBiZWZvcmUgdGhlcmUgd2FzICpub3QqIGVub3VnaC5cbiAgLy9cbiAgLy8gU28sIHRoZSBzdGVwcyBhcmU6XG4gIC8vIDEuIEZpZ3VyZSBvdXQgd2hhdCB0aGUgc3RhdGUgb2YgdGhpbmdzIHdpbGwgYmUgYWZ0ZXIgd2UgZG9cbiAgLy8gYSByZWFkIGZyb20gdGhlIGJ1ZmZlci5cbiAgLy9cbiAgLy8gMi4gSWYgdGhhdCByZXN1bHRpbmcgc3RhdGUgd2lsbCB0cmlnZ2VyIGEgX3JlYWQsIHRoZW4gY2FsbCBfcmVhZC5cbiAgLy8gTm90ZSB0aGF0IHRoaXMgbWF5IGJlIGFzeW5jaHJvbm91cywgb3Igc3luY2hyb25vdXMuICBZZXMsIGl0IGlzXG4gIC8vIGRlZXBseSB1Z2x5IHRvIHdyaXRlIEFQSXMgdGhpcyB3YXksIGJ1dCB0aGF0IHN0aWxsIGRvZXNuJ3QgbWVhblxuICAvLyB0aGF0IHRoZSBSZWFkYWJsZSBjbGFzcyBzaG91bGQgYmVoYXZlIGltcHJvcGVybHksIGFzIHN0cmVhbXMgYXJlXG4gIC8vIGRlc2lnbmVkIHRvIGJlIHN5bmMvYXN5bmMgYWdub3N0aWMuXG4gIC8vIFRha2Ugbm90ZSBpZiB0aGUgX3JlYWQgY2FsbCBpcyBzeW5jIG9yIGFzeW5jIChpZSwgaWYgdGhlIHJlYWQgY2FsbFxuICAvLyBoYXMgcmV0dXJuZWQgeWV0KSwgc28gdGhhdCB3ZSBrbm93IHdoZXRoZXIgb3Igbm90IGl0J3Mgc2FmZSB0byBlbWl0XG4gIC8vICdyZWFkYWJsZScgZXRjLlxuICAvL1xuICAvLyAzLiBBY3R1YWxseSBwdWxsIHRoZSByZXF1ZXN0ZWQgY2h1bmtzIG91dCBvZiB0aGUgYnVmZmVyIGFuZCByZXR1cm4uXG5cbiAgLy8gaWYgd2UgbmVlZCBhIHJlYWRhYmxlIGV2ZW50LCB0aGVuIHdlIG5lZWQgdG8gZG8gc29tZSByZWFkaW5nLlxuICB2YXIgZG9SZWFkID0gc3RhdGUubmVlZFJlYWRhYmxlO1xuICBkZWJ1ZygnbmVlZCByZWFkYWJsZScsIGRvUmVhZCk7XG5cbiAgLy8gaWYgd2UgY3VycmVudGx5IGhhdmUgbGVzcyB0aGFuIHRoZSBoaWdoV2F0ZXJNYXJrLCB0aGVuIGFsc28gcmVhZCBzb21lXG4gIGlmIChzdGF0ZS5sZW5ndGggPT09IDAgfHwgc3RhdGUubGVuZ3RoIC0gbiA8IHN0YXRlLmhpZ2hXYXRlck1hcmspIHtcbiAgICBkb1JlYWQgPSB0cnVlO1xuICAgIGRlYnVnKCdsZW5ndGggbGVzcyB0aGFuIHdhdGVybWFyaycsIGRvUmVhZCk7XG4gIH1cblxuICAvLyBob3dldmVyLCBpZiB3ZSd2ZSBlbmRlZCwgdGhlbiB0aGVyZSdzIG5vIHBvaW50LCBhbmQgaWYgd2UncmUgYWxyZWFkeVxuICAvLyByZWFkaW5nLCB0aGVuIGl0J3MgdW5uZWNlc3NhcnkuXG4gIGlmIChzdGF0ZS5lbmRlZCB8fCBzdGF0ZS5yZWFkaW5nKSB7XG4gICAgZG9SZWFkID0gZmFsc2U7XG4gICAgZGVidWcoJ3JlYWRpbmcgb3IgZW5kZWQnLCBkb1JlYWQpO1xuICB9XG5cbiAgaWYgKGRvUmVhZCkge1xuICAgIGRlYnVnKCdkbyByZWFkJyk7XG4gICAgc3RhdGUucmVhZGluZyA9IHRydWU7XG4gICAgc3RhdGUuc3luYyA9IHRydWU7XG4gICAgLy8gaWYgdGhlIGxlbmd0aCBpcyBjdXJyZW50bHkgemVybywgdGhlbiB3ZSAqbmVlZCogYSByZWFkYWJsZSBldmVudC5cbiAgICBpZiAoc3RhdGUubGVuZ3RoID09PSAwKVxuICAgICAgc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICAvLyBjYWxsIGludGVybmFsIHJlYWQgbWV0aG9kXG4gICAgdGhpcy5fcmVhZChzdGF0ZS5oaWdoV2F0ZXJNYXJrKTtcbiAgICBzdGF0ZS5zeW5jID0gZmFsc2U7XG4gIH1cblxuICAvLyBJZiBfcmVhZCBwdXNoZWQgZGF0YSBzeW5jaHJvbm91c2x5LCB0aGVuIGByZWFkaW5nYCB3aWxsIGJlIGZhbHNlLFxuICAvLyBhbmQgd2UgbmVlZCB0byByZS1ldmFsdWF0ZSBob3cgbXVjaCBkYXRhIHdlIGNhbiByZXR1cm4gdG8gdGhlIHVzZXIuXG4gIGlmIChkb1JlYWQgJiYgIXN0YXRlLnJlYWRpbmcpXG4gICAgbiA9IGhvd011Y2hUb1JlYWQobk9yaWcsIHN0YXRlKTtcblxuICB2YXIgcmV0O1xuICBpZiAobiA+IDApXG4gICAgcmV0ID0gZnJvbUxpc3Qobiwgc3RhdGUpO1xuICBlbHNlXG4gICAgcmV0ID0gbnVsbDtcblxuICBpZiAocmV0ID09PSBudWxsKSB7XG4gICAgc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICBuID0gMDtcbiAgfVxuXG4gIHN0YXRlLmxlbmd0aCAtPSBuO1xuXG4gIC8vIElmIHdlIGhhdmUgbm90aGluZyBpbiB0aGUgYnVmZmVyLCB0aGVuIHdlIHdhbnQgdG8ga25vd1xuICAvLyBhcyBzb29uIGFzIHdlICpkbyogZ2V0IHNvbWV0aGluZyBpbnRvIHRoZSBidWZmZXIuXG4gIGlmIChzdGF0ZS5sZW5ndGggPT09IDAgJiYgIXN0YXRlLmVuZGVkKVxuICAgIHN0YXRlLm5lZWRSZWFkYWJsZSA9IHRydWU7XG5cbiAgLy8gSWYgd2UgdHJpZWQgdG8gcmVhZCgpIHBhc3QgdGhlIEVPRiwgdGhlbiBlbWl0IGVuZCBvbiB0aGUgbmV4dCB0aWNrLlxuICBpZiAobk9yaWcgIT09IG4gJiYgc3RhdGUuZW5kZWQgJiYgc3RhdGUubGVuZ3RoID09PSAwKVxuICAgIGVuZFJlYWRhYmxlKHRoaXMpO1xuXG4gIGlmIChyZXQgIT09IG51bGwpXG4gICAgdGhpcy5lbWl0KCdkYXRhJywgcmV0KTtcblxuICByZXR1cm4gcmV0O1xufTtcblxuZnVuY3Rpb24gY2h1bmtJbnZhbGlkKHN0YXRlLCBjaHVuaykge1xuICB2YXIgZXIgPSBudWxsO1xuICBpZiAoIShCdWZmZXIuaXNCdWZmZXIoY2h1bmspKSAmJlxuICAgICAgdHlwZW9mIGNodW5rICE9PSAnc3RyaW5nJyAmJlxuICAgICAgY2h1bmsgIT09IG51bGwgJiZcbiAgICAgIGNodW5rICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICFzdGF0ZS5vYmplY3RNb2RlKSB7XG4gICAgZXIgPSBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIG5vbi1zdHJpbmcvYnVmZmVyIGNodW5rJyk7XG4gIH1cbiAgcmV0dXJuIGVyO1xufVxuXG5cbmZ1bmN0aW9uIG9uRW9mQ2h1bmsoc3RyZWFtLCBzdGF0ZSkge1xuICBpZiAoc3RhdGUuZW5kZWQpIHJldHVybjtcbiAgaWYgKHN0YXRlLmRlY29kZXIpIHtcbiAgICB2YXIgY2h1bmsgPSBzdGF0ZS5kZWNvZGVyLmVuZCgpO1xuICAgIGlmIChjaHVuayAmJiBjaHVuay5sZW5ndGgpIHtcbiAgICAgIHN0YXRlLmJ1ZmZlci5wdXNoKGNodW5rKTtcbiAgICAgIHN0YXRlLmxlbmd0aCArPSBzdGF0ZS5vYmplY3RNb2RlID8gMSA6IGNodW5rLmxlbmd0aDtcbiAgICB9XG4gIH1cbiAgc3RhdGUuZW5kZWQgPSB0cnVlO1xuXG4gIC8vIGVtaXQgJ3JlYWRhYmxlJyBub3cgdG8gbWFrZSBzdXJlIGl0IGdldHMgcGlja2VkIHVwLlxuICBlbWl0UmVhZGFibGUoc3RyZWFtKTtcbn1cblxuLy8gRG9uJ3QgZW1pdCByZWFkYWJsZSByaWdodCBhd2F5IGluIHN5bmMgbW9kZSwgYmVjYXVzZSB0aGlzIGNhbiB0cmlnZ2VyXG4vLyBhbm90aGVyIHJlYWQoKSBjYWxsID0+IHN0YWNrIG92ZXJmbG93LiAgVGhpcyB3YXksIGl0IG1pZ2h0IHRyaWdnZXJcbi8vIGEgbmV4dFRpY2sgcmVjdXJzaW9uIHdhcm5pbmcsIGJ1dCB0aGF0J3Mgbm90IHNvIGJhZC5cbmZ1bmN0aW9uIGVtaXRSZWFkYWJsZShzdHJlYW0pIHtcbiAgdmFyIHN0YXRlID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlO1xuICBzdGF0ZS5uZWVkUmVhZGFibGUgPSBmYWxzZTtcbiAgaWYgKCFzdGF0ZS5lbWl0dGVkUmVhZGFibGUpIHtcbiAgICBkZWJ1ZygnZW1pdFJlYWRhYmxlJywgc3RhdGUuZmxvd2luZyk7XG4gICAgc3RhdGUuZW1pdHRlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICBpZiAoc3RhdGUuc3luYylcbiAgICAgIHByb2Nlc3NOZXh0VGljayhlbWl0UmVhZGFibGVfLCBzdHJlYW0pO1xuICAgIGVsc2VcbiAgICAgIGVtaXRSZWFkYWJsZV8oc3RyZWFtKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBlbWl0UmVhZGFibGVfKHN0cmVhbSkge1xuICBkZWJ1ZygnZW1pdCByZWFkYWJsZScpO1xuICBzdHJlYW0uZW1pdCgncmVhZGFibGUnKTtcbiAgZmxvdyhzdHJlYW0pO1xufVxuXG5cbi8vIGF0IHRoaXMgcG9pbnQsIHRoZSB1c2VyIGhhcyBwcmVzdW1hYmx5IHNlZW4gdGhlICdyZWFkYWJsZScgZXZlbnQsXG4vLyBhbmQgY2FsbGVkIHJlYWQoKSB0byBjb25zdW1lIHNvbWUgZGF0YS4gIHRoYXQgbWF5IGhhdmUgdHJpZ2dlcmVkXG4vLyBpbiB0dXJuIGFub3RoZXIgX3JlYWQobikgY2FsbCwgaW4gd2hpY2ggY2FzZSByZWFkaW5nID0gdHJ1ZSBpZlxuLy8gaXQncyBpbiBwcm9ncmVzcy5cbi8vIEhvd2V2ZXIsIGlmIHdlJ3JlIG5vdCBlbmRlZCwgb3IgcmVhZGluZywgYW5kIHRoZSBsZW5ndGggPCBod20sXG4vLyB0aGVuIGdvIGFoZWFkIGFuZCB0cnkgdG8gcmVhZCBzb21lIG1vcmUgcHJlZW1wdGl2ZWx5LlxuZnVuY3Rpb24gbWF5YmVSZWFkTW9yZShzdHJlYW0sIHN0YXRlKSB7XG4gIGlmICghc3RhdGUucmVhZGluZ01vcmUpIHtcbiAgICBzdGF0ZS5yZWFkaW5nTW9yZSA9IHRydWU7XG4gICAgcHJvY2Vzc05leHRUaWNrKG1heWJlUmVhZE1vcmVfLCBzdHJlYW0sIHN0YXRlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBtYXliZVJlYWRNb3JlXyhzdHJlYW0sIHN0YXRlKSB7XG4gIHZhciBsZW4gPSBzdGF0ZS5sZW5ndGg7XG4gIHdoaWxlICghc3RhdGUucmVhZGluZyAmJiAhc3RhdGUuZmxvd2luZyAmJiAhc3RhdGUuZW5kZWQgJiZcbiAgICAgICAgIHN0YXRlLmxlbmd0aCA8IHN0YXRlLmhpZ2hXYXRlck1hcmspIHtcbiAgICBkZWJ1ZygnbWF5YmVSZWFkTW9yZSByZWFkIDAnKTtcbiAgICBzdHJlYW0ucmVhZCgwKTtcbiAgICBpZiAobGVuID09PSBzdGF0ZS5sZW5ndGgpXG4gICAgICAvLyBkaWRuJ3QgZ2V0IGFueSBkYXRhLCBzdG9wIHNwaW5uaW5nLlxuICAgICAgYnJlYWs7XG4gICAgZWxzZVxuICAgICAgbGVuID0gc3RhdGUubGVuZ3RoO1xuICB9XG4gIHN0YXRlLnJlYWRpbmdNb3JlID0gZmFsc2U7XG59XG5cbi8vIGFic3RyYWN0IG1ldGhvZC4gIHRvIGJlIG92ZXJyaWRkZW4gaW4gc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gY2xhc3Nlcy5cbi8vIGNhbGwgY2IoZXIsIGRhdGEpIHdoZXJlIGRhdGEgaXMgPD0gbiBpbiBsZW5ndGguXG4vLyBmb3IgdmlydHVhbCAobm9uLXN0cmluZywgbm9uLWJ1ZmZlcikgc3RyZWFtcywgXCJsZW5ndGhcIiBpcyBzb21ld2hhdFxuLy8gYXJiaXRyYXJ5LCBhbmQgcGVyaGFwcyBub3QgdmVyeSBtZWFuaW5nZnVsLlxuUmVhZGFibGUucHJvdG90eXBlLl9yZWFkID0gZnVuY3Rpb24obikge1xuICB0aGlzLmVtaXQoJ2Vycm9yJywgbmV3IEVycm9yKCdub3QgaW1wbGVtZW50ZWQnKSk7XG59O1xuXG5SZWFkYWJsZS5wcm90b3R5cGUucGlwZSA9IGZ1bmN0aW9uKGRlc3QsIHBpcGVPcHRzKSB7XG4gIHZhciBzcmMgPSB0aGlzO1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuXG4gIHN3aXRjaCAoc3RhdGUucGlwZXNDb3VudCkge1xuICAgIGNhc2UgMDpcbiAgICAgIHN0YXRlLnBpcGVzID0gZGVzdDtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMTpcbiAgICAgIHN0YXRlLnBpcGVzID0gW3N0YXRlLnBpcGVzLCBkZXN0XTtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICBzdGF0ZS5waXBlcy5wdXNoKGRlc3QpO1xuICAgICAgYnJlYWs7XG4gIH1cbiAgc3RhdGUucGlwZXNDb3VudCArPSAxO1xuICBkZWJ1ZygncGlwZSBjb3VudD0lZCBvcHRzPSVqJywgc3RhdGUucGlwZXNDb3VudCwgcGlwZU9wdHMpO1xuXG4gIHZhciBkb0VuZCA9ICghcGlwZU9wdHMgfHwgcGlwZU9wdHMuZW5kICE9PSBmYWxzZSkgJiZcbiAgICAgICAgICAgICAgZGVzdCAhPT0gcHJvY2Vzcy5zdGRvdXQgJiZcbiAgICAgICAgICAgICAgZGVzdCAhPT0gcHJvY2Vzcy5zdGRlcnI7XG5cbiAgdmFyIGVuZEZuID0gZG9FbmQgPyBvbmVuZCA6IGNsZWFudXA7XG4gIGlmIChzdGF0ZS5lbmRFbWl0dGVkKVxuICAgIHByb2Nlc3NOZXh0VGljayhlbmRGbik7XG4gIGVsc2VcbiAgICBzcmMub25jZSgnZW5kJywgZW5kRm4pO1xuXG4gIGRlc3Qub24oJ3VucGlwZScsIG9udW5waXBlKTtcbiAgZnVuY3Rpb24gb251bnBpcGUocmVhZGFibGUpIHtcbiAgICBkZWJ1Zygnb251bnBpcGUnKTtcbiAgICBpZiAocmVhZGFibGUgPT09IHNyYykge1xuICAgICAgY2xlYW51cCgpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG9uZW5kKCkge1xuICAgIGRlYnVnKCdvbmVuZCcpO1xuICAgIGRlc3QuZW5kKCk7XG4gIH1cblxuICAvLyB3aGVuIHRoZSBkZXN0IGRyYWlucywgaXQgcmVkdWNlcyB0aGUgYXdhaXREcmFpbiBjb3VudGVyXG4gIC8vIG9uIHRoZSBzb3VyY2UuICBUaGlzIHdvdWxkIGJlIG1vcmUgZWxlZ2FudCB3aXRoIGEgLm9uY2UoKVxuICAvLyBoYW5kbGVyIGluIGZsb3coKSwgYnV0IGFkZGluZyBhbmQgcmVtb3ZpbmcgcmVwZWF0ZWRseSBpc1xuICAvLyB0b28gc2xvdy5cbiAgdmFyIG9uZHJhaW4gPSBwaXBlT25EcmFpbihzcmMpO1xuICBkZXN0Lm9uKCdkcmFpbicsIG9uZHJhaW4pO1xuXG4gIHZhciBjbGVhbmVkVXAgPSBmYWxzZTtcbiAgZnVuY3Rpb24gY2xlYW51cCgpIHtcbiAgICBkZWJ1ZygnY2xlYW51cCcpO1xuICAgIC8vIGNsZWFudXAgZXZlbnQgaGFuZGxlcnMgb25jZSB0aGUgcGlwZSBpcyBicm9rZW5cbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdjbG9zZScsIG9uY2xvc2UpO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2ZpbmlzaCcsIG9uZmluaXNoKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdkcmFpbicsIG9uZHJhaW4pO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgb25lcnJvcik7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcigndW5waXBlJywgb251bnBpcGUpO1xuICAgIHNyYy5yZW1vdmVMaXN0ZW5lcignZW5kJywgb25lbmQpO1xuICAgIHNyYy5yZW1vdmVMaXN0ZW5lcignZW5kJywgY2xlYW51cCk7XG4gICAgc3JjLnJlbW92ZUxpc3RlbmVyKCdkYXRhJywgb25kYXRhKTtcblxuICAgIGNsZWFuZWRVcCA9IHRydWU7XG5cbiAgICAvLyBpZiB0aGUgcmVhZGVyIGlzIHdhaXRpbmcgZm9yIGEgZHJhaW4gZXZlbnQgZnJvbSB0aGlzXG4gICAgLy8gc3BlY2lmaWMgd3JpdGVyLCB0aGVuIGl0IHdvdWxkIGNhdXNlIGl0IHRvIG5ldmVyIHN0YXJ0XG4gICAgLy8gZmxvd2luZyBhZ2Fpbi5cbiAgICAvLyBTbywgaWYgdGhpcyBpcyBhd2FpdGluZyBhIGRyYWluLCB0aGVuIHdlIGp1c3QgY2FsbCBpdCBub3cuXG4gICAgLy8gSWYgd2UgZG9uJ3Qga25vdywgdGhlbiBhc3N1bWUgdGhhdCB3ZSBhcmUgd2FpdGluZyBmb3Igb25lLlxuICAgIGlmIChzdGF0ZS5hd2FpdERyYWluICYmXG4gICAgICAgICghZGVzdC5fd3JpdGFibGVTdGF0ZSB8fCBkZXN0Ll93cml0YWJsZVN0YXRlLm5lZWREcmFpbikpXG4gICAgICBvbmRyYWluKCk7XG4gIH1cblxuICBzcmMub24oJ2RhdGEnLCBvbmRhdGEpO1xuICBmdW5jdGlvbiBvbmRhdGEoY2h1bmspIHtcbiAgICBkZWJ1Zygnb25kYXRhJyk7XG4gICAgdmFyIHJldCA9IGRlc3Qud3JpdGUoY2h1bmspO1xuICAgIGlmIChmYWxzZSA9PT0gcmV0KSB7XG4gICAgICAvLyBJZiB0aGUgdXNlciB1bnBpcGVkIGR1cmluZyBgZGVzdC53cml0ZSgpYCwgaXQgaXMgcG9zc2libGVcbiAgICAgIC8vIHRvIGdldCBzdHVjayBpbiBhIHBlcm1hbmVudGx5IHBhdXNlZCBzdGF0ZSBpZiB0aGF0IHdyaXRlXG4gICAgICAvLyBhbHNvIHJldHVybmVkIGZhbHNlLlxuICAgICAgaWYgKHN0YXRlLnBpcGVzQ291bnQgPT09IDEgJiZcbiAgICAgICAgICBzdGF0ZS5waXBlc1swXSA9PT0gZGVzdCAmJlxuICAgICAgICAgIHNyYy5saXN0ZW5lckNvdW50KCdkYXRhJykgPT09IDEgJiZcbiAgICAgICAgICAhY2xlYW5lZFVwKSB7XG4gICAgICAgIGRlYnVnKCdmYWxzZSB3cml0ZSByZXNwb25zZSwgcGF1c2UnLCBzcmMuX3JlYWRhYmxlU3RhdGUuYXdhaXREcmFpbik7XG4gICAgICAgIHNyYy5fcmVhZGFibGVTdGF0ZS5hd2FpdERyYWluKys7XG4gICAgICB9XG4gICAgICBzcmMucGF1c2UoKTtcbiAgICB9XG4gIH1cblxuICAvLyBpZiB0aGUgZGVzdCBoYXMgYW4gZXJyb3IsIHRoZW4gc3RvcCBwaXBpbmcgaW50byBpdC5cbiAgLy8gaG93ZXZlciwgZG9uJ3Qgc3VwcHJlc3MgdGhlIHRocm93aW5nIGJlaGF2aW9yIGZvciB0aGlzLlxuICBmdW5jdGlvbiBvbmVycm9yKGVyKSB7XG4gICAgZGVidWcoJ29uZXJyb3InLCBlcik7XG4gICAgdW5waXBlKCk7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBvbmVycm9yKTtcbiAgICBpZiAoRUVsaXN0ZW5lckNvdW50KGRlc3QsICdlcnJvcicpID09PSAwKVxuICAgICAgZGVzdC5lbWl0KCdlcnJvcicsIGVyKTtcbiAgfVxuICAvLyBUaGlzIGlzIGEgYnJ1dGFsbHkgdWdseSBoYWNrIHRvIG1ha2Ugc3VyZSB0aGF0IG91ciBlcnJvciBoYW5kbGVyXG4gIC8vIGlzIGF0dGFjaGVkIGJlZm9yZSBhbnkgdXNlcmxhbmQgb25lcy4gIE5FVkVSIERPIFRISVMuXG4gIGlmICghZGVzdC5fZXZlbnRzIHx8ICFkZXN0Ll9ldmVudHMuZXJyb3IpXG4gICAgZGVzdC5vbignZXJyb3InLCBvbmVycm9yKTtcbiAgZWxzZSBpZiAoaXNBcnJheShkZXN0Ll9ldmVudHMuZXJyb3IpKVxuICAgIGRlc3QuX2V2ZW50cy5lcnJvci51bnNoaWZ0KG9uZXJyb3IpO1xuICBlbHNlXG4gICAgZGVzdC5fZXZlbnRzLmVycm9yID0gW29uZXJyb3IsIGRlc3QuX2V2ZW50cy5lcnJvcl07XG5cblxuICAvLyBCb3RoIGNsb3NlIGFuZCBmaW5pc2ggc2hvdWxkIHRyaWdnZXIgdW5waXBlLCBidXQgb25seSBvbmNlLlxuICBmdW5jdGlvbiBvbmNsb3NlKCkge1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2ZpbmlzaCcsIG9uZmluaXNoKTtcbiAgICB1bnBpcGUoKTtcbiAgfVxuICBkZXN0Lm9uY2UoJ2Nsb3NlJywgb25jbG9zZSk7XG4gIGZ1bmN0aW9uIG9uZmluaXNoKCkge1xuICAgIGRlYnVnKCdvbmZpbmlzaCcpO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2Nsb3NlJywgb25jbG9zZSk7XG4gICAgdW5waXBlKCk7XG4gIH1cbiAgZGVzdC5vbmNlKCdmaW5pc2gnLCBvbmZpbmlzaCk7XG5cbiAgZnVuY3Rpb24gdW5waXBlKCkge1xuICAgIGRlYnVnKCd1bnBpcGUnKTtcbiAgICBzcmMudW5waXBlKGRlc3QpO1xuICB9XG5cbiAgLy8gdGVsbCB0aGUgZGVzdCB0aGF0IGl0J3MgYmVpbmcgcGlwZWQgdG9cbiAgZGVzdC5lbWl0KCdwaXBlJywgc3JjKTtcblxuICAvLyBzdGFydCB0aGUgZmxvdyBpZiBpdCBoYXNuJ3QgYmVlbiBzdGFydGVkIGFscmVhZHkuXG4gIGlmICghc3RhdGUuZmxvd2luZykge1xuICAgIGRlYnVnKCdwaXBlIHJlc3VtZScpO1xuICAgIHNyYy5yZXN1bWUoKTtcbiAgfVxuXG4gIHJldHVybiBkZXN0O1xufTtcblxuZnVuY3Rpb24gcGlwZU9uRHJhaW4oc3JjKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc3RhdGUgPSBzcmMuX3JlYWRhYmxlU3RhdGU7XG4gICAgZGVidWcoJ3BpcGVPbkRyYWluJywgc3RhdGUuYXdhaXREcmFpbik7XG4gICAgaWYgKHN0YXRlLmF3YWl0RHJhaW4pXG4gICAgICBzdGF0ZS5hd2FpdERyYWluLS07XG4gICAgaWYgKHN0YXRlLmF3YWl0RHJhaW4gPT09IDAgJiYgRUVsaXN0ZW5lckNvdW50KHNyYywgJ2RhdGEnKSkge1xuICAgICAgc3RhdGUuZmxvd2luZyA9IHRydWU7XG4gICAgICBmbG93KHNyYyk7XG4gICAgfVxuICB9O1xufVxuXG5cblJlYWRhYmxlLnByb3RvdHlwZS51bnBpcGUgPSBmdW5jdGlvbihkZXN0KSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG5cbiAgLy8gaWYgd2UncmUgbm90IHBpcGluZyBhbnl3aGVyZSwgdGhlbiBkbyBub3RoaW5nLlxuICBpZiAoc3RhdGUucGlwZXNDb3VudCA9PT0gMClcbiAgICByZXR1cm4gdGhpcztcblxuICAvLyBqdXN0IG9uZSBkZXN0aW5hdGlvbi4gIG1vc3QgY29tbW9uIGNhc2UuXG4gIGlmIChzdGF0ZS5waXBlc0NvdW50ID09PSAxKSB7XG4gICAgLy8gcGFzc2VkIGluIG9uZSwgYnV0IGl0J3Mgbm90IHRoZSByaWdodCBvbmUuXG4gICAgaWYgKGRlc3QgJiYgZGVzdCAhPT0gc3RhdGUucGlwZXMpXG4gICAgICByZXR1cm4gdGhpcztcblxuICAgIGlmICghZGVzdClcbiAgICAgIGRlc3QgPSBzdGF0ZS5waXBlcztcblxuICAgIC8vIGdvdCBhIG1hdGNoLlxuICAgIHN0YXRlLnBpcGVzID0gbnVsbDtcbiAgICBzdGF0ZS5waXBlc0NvdW50ID0gMDtcbiAgICBzdGF0ZS5mbG93aW5nID0gZmFsc2U7XG4gICAgaWYgKGRlc3QpXG4gICAgICBkZXN0LmVtaXQoJ3VucGlwZScsIHRoaXMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gc2xvdyBjYXNlLiBtdWx0aXBsZSBwaXBlIGRlc3RpbmF0aW9ucy5cblxuICBpZiAoIWRlc3QpIHtcbiAgICAvLyByZW1vdmUgYWxsLlxuICAgIHZhciBkZXN0cyA9IHN0YXRlLnBpcGVzO1xuICAgIHZhciBsZW4gPSBzdGF0ZS5waXBlc0NvdW50O1xuICAgIHN0YXRlLnBpcGVzID0gbnVsbDtcbiAgICBzdGF0ZS5waXBlc0NvdW50ID0gMDtcbiAgICBzdGF0ZS5mbG93aW5nID0gZmFsc2U7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKVxuICAgICAgZGVzdHNbaV0uZW1pdCgndW5waXBlJywgdGhpcyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyB0cnkgdG8gZmluZCB0aGUgcmlnaHQgb25lLlxuICB2YXIgaSA9IGluZGV4T2Yoc3RhdGUucGlwZXMsIGRlc3QpO1xuICBpZiAoaSA9PT0gLTEpXG4gICAgcmV0dXJuIHRoaXM7XG5cbiAgc3RhdGUucGlwZXMuc3BsaWNlKGksIDEpO1xuICBzdGF0ZS5waXBlc0NvdW50IC09IDE7XG4gIGlmIChzdGF0ZS5waXBlc0NvdW50ID09PSAxKVxuICAgIHN0YXRlLnBpcGVzID0gc3RhdGUucGlwZXNbMF07XG5cbiAgZGVzdC5lbWl0KCd1bnBpcGUnLCB0aGlzKTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbi8vIHNldCB1cCBkYXRhIGV2ZW50cyBpZiB0aGV5IGFyZSBhc2tlZCBmb3Jcbi8vIEVuc3VyZSByZWFkYWJsZSBsaXN0ZW5lcnMgZXZlbnR1YWxseSBnZXQgc29tZXRoaW5nXG5SZWFkYWJsZS5wcm90b3R5cGUub24gPSBmdW5jdGlvbihldiwgZm4pIHtcbiAgdmFyIHJlcyA9IFN0cmVhbS5wcm90b3R5cGUub24uY2FsbCh0aGlzLCBldiwgZm4pO1xuXG4gIC8vIElmIGxpc3RlbmluZyB0byBkYXRhLCBhbmQgaXQgaGFzIG5vdCBleHBsaWNpdGx5IGJlZW4gcGF1c2VkLFxuICAvLyB0aGVuIGNhbGwgcmVzdW1lIHRvIHN0YXJ0IHRoZSBmbG93IG9mIGRhdGEgb24gdGhlIG5leHQgdGljay5cbiAgaWYgKGV2ID09PSAnZGF0YScgJiYgZmFsc2UgIT09IHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZykge1xuICAgIHRoaXMucmVzdW1lKCk7XG4gIH1cblxuICBpZiAoZXYgPT09ICdyZWFkYWJsZScgJiYgdGhpcy5yZWFkYWJsZSkge1xuICAgIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gICAgaWYgKCFzdGF0ZS5yZWFkYWJsZUxpc3RlbmluZykge1xuICAgICAgc3RhdGUucmVhZGFibGVMaXN0ZW5pbmcgPSB0cnVlO1xuICAgICAgc3RhdGUuZW1pdHRlZFJlYWRhYmxlID0gZmFsc2U7XG4gICAgICBzdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlO1xuICAgICAgaWYgKCFzdGF0ZS5yZWFkaW5nKSB7XG4gICAgICAgIHByb2Nlc3NOZXh0VGljayhuUmVhZGluZ05leHRUaWNrLCB0aGlzKTtcbiAgICAgIH0gZWxzZSBpZiAoc3RhdGUubGVuZ3RoKSB7XG4gICAgICAgIGVtaXRSZWFkYWJsZSh0aGlzLCBzdGF0ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlcztcbn07XG5SZWFkYWJsZS5wcm90b3R5cGUuYWRkTGlzdGVuZXIgPSBSZWFkYWJsZS5wcm90b3R5cGUub247XG5cbmZ1bmN0aW9uIG5SZWFkaW5nTmV4dFRpY2soc2VsZikge1xuICBkZWJ1ZygncmVhZGFibGUgbmV4dHRpY2sgcmVhZCAwJyk7XG4gIHNlbGYucmVhZCgwKTtcbn1cblxuLy8gcGF1c2UoKSBhbmQgcmVzdW1lKCkgYXJlIHJlbW5hbnRzIG9mIHRoZSBsZWdhY3kgcmVhZGFibGUgc3RyZWFtIEFQSVxuLy8gSWYgdGhlIHVzZXIgdXNlcyB0aGVtLCB0aGVuIHN3aXRjaCBpbnRvIG9sZCBtb2RlLlxuUmVhZGFibGUucHJvdG90eXBlLnJlc3VtZSA9IGZ1bmN0aW9uKCkge1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICBpZiAoIXN0YXRlLmZsb3dpbmcpIHtcbiAgICBkZWJ1ZygncmVzdW1lJyk7XG4gICAgc3RhdGUuZmxvd2luZyA9IHRydWU7XG4gICAgcmVzdW1lKHRoaXMsIHN0YXRlKTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG5cbmZ1bmN0aW9uIHJlc3VtZShzdHJlYW0sIHN0YXRlKSB7XG4gIGlmICghc3RhdGUucmVzdW1lU2NoZWR1bGVkKSB7XG4gICAgc3RhdGUucmVzdW1lU2NoZWR1bGVkID0gdHJ1ZTtcbiAgICBwcm9jZXNzTmV4dFRpY2socmVzdW1lXywgc3RyZWFtLCBzdGF0ZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzdW1lXyhzdHJlYW0sIHN0YXRlKSB7XG4gIGlmICghc3RhdGUucmVhZGluZykge1xuICAgIGRlYnVnKCdyZXN1bWUgcmVhZCAwJyk7XG4gICAgc3RyZWFtLnJlYWQoMCk7XG4gIH1cblxuICBzdGF0ZS5yZXN1bWVTY2hlZHVsZWQgPSBmYWxzZTtcbiAgc3RyZWFtLmVtaXQoJ3Jlc3VtZScpO1xuICBmbG93KHN0cmVhbSk7XG4gIGlmIChzdGF0ZS5mbG93aW5nICYmICFzdGF0ZS5yZWFkaW5nKVxuICAgIHN0cmVhbS5yZWFkKDApO1xufVxuXG5SZWFkYWJsZS5wcm90b3R5cGUucGF1c2UgPSBmdW5jdGlvbigpIHtcbiAgZGVidWcoJ2NhbGwgcGF1c2UgZmxvd2luZz0laicsIHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyk7XG4gIGlmIChmYWxzZSAhPT0gdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nKSB7XG4gICAgZGVidWcoJ3BhdXNlJyk7XG4gICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nID0gZmFsc2U7XG4gICAgdGhpcy5lbWl0KCdwYXVzZScpO1xuICB9XG4gIHJldHVybiB0aGlzO1xufTtcblxuZnVuY3Rpb24gZmxvdyhzdHJlYW0pIHtcbiAgdmFyIHN0YXRlID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlO1xuICBkZWJ1ZygnZmxvdycsIHN0YXRlLmZsb3dpbmcpO1xuICBpZiAoc3RhdGUuZmxvd2luZykge1xuICAgIGRvIHtcbiAgICAgIHZhciBjaHVuayA9IHN0cmVhbS5yZWFkKCk7XG4gICAgfSB3aGlsZSAobnVsbCAhPT0gY2h1bmsgJiYgc3RhdGUuZmxvd2luZyk7XG4gIH1cbn1cblxuLy8gd3JhcCBhbiBvbGQtc3R5bGUgc3RyZWFtIGFzIHRoZSBhc3luYyBkYXRhIHNvdXJjZS5cbi8vIFRoaXMgaXMgKm5vdCogcGFydCBvZiB0aGUgcmVhZGFibGUgc3RyZWFtIGludGVyZmFjZS5cbi8vIEl0IGlzIGFuIHVnbHkgdW5mb3J0dW5hdGUgbWVzcyBvZiBoaXN0b3J5LlxuUmVhZGFibGUucHJvdG90eXBlLndyYXAgPSBmdW5jdGlvbihzdHJlYW0pIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgdmFyIHBhdXNlZCA9IGZhbHNlO1xuXG4gIHZhciBzZWxmID0gdGhpcztcbiAgc3RyZWFtLm9uKCdlbmQnLCBmdW5jdGlvbigpIHtcbiAgICBkZWJ1Zygnd3JhcHBlZCBlbmQnKTtcbiAgICBpZiAoc3RhdGUuZGVjb2RlciAmJiAhc3RhdGUuZW5kZWQpIHtcbiAgICAgIHZhciBjaHVuayA9IHN0YXRlLmRlY29kZXIuZW5kKCk7XG4gICAgICBpZiAoY2h1bmsgJiYgY2h1bmsubGVuZ3RoKVxuICAgICAgICBzZWxmLnB1c2goY2h1bmspO1xuICAgIH1cblxuICAgIHNlbGYucHVzaChudWxsKTtcbiAgfSk7XG5cbiAgc3RyZWFtLm9uKCdkYXRhJywgZnVuY3Rpb24oY2h1bmspIHtcbiAgICBkZWJ1Zygnd3JhcHBlZCBkYXRhJyk7XG4gICAgaWYgKHN0YXRlLmRlY29kZXIpXG4gICAgICBjaHVuayA9IHN0YXRlLmRlY29kZXIud3JpdGUoY2h1bmspO1xuXG4gICAgLy8gZG9uJ3Qgc2tpcCBvdmVyIGZhbHN5IHZhbHVlcyBpbiBvYmplY3RNb2RlXG4gICAgaWYgKHN0YXRlLm9iamVjdE1vZGUgJiYgKGNodW5rID09PSBudWxsIHx8IGNodW5rID09PSB1bmRlZmluZWQpKVxuICAgICAgcmV0dXJuO1xuICAgIGVsc2UgaWYgKCFzdGF0ZS5vYmplY3RNb2RlICYmICghY2h1bmsgfHwgIWNodW5rLmxlbmd0aCkpXG4gICAgICByZXR1cm47XG5cbiAgICB2YXIgcmV0ID0gc2VsZi5wdXNoKGNodW5rKTtcbiAgICBpZiAoIXJldCkge1xuICAgICAgcGF1c2VkID0gdHJ1ZTtcbiAgICAgIHN0cmVhbS5wYXVzZSgpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gcHJveHkgYWxsIHRoZSBvdGhlciBtZXRob2RzLlxuICAvLyBpbXBvcnRhbnQgd2hlbiB3cmFwcGluZyBmaWx0ZXJzIGFuZCBkdXBsZXhlcy5cbiAgZm9yICh2YXIgaSBpbiBzdHJlYW0pIHtcbiAgICBpZiAodGhpc1tpXSA9PT0gdW5kZWZpbmVkICYmIHR5cGVvZiBzdHJlYW1baV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRoaXNbaV0gPSBmdW5jdGlvbihtZXRob2QpIHsgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gc3RyZWFtW21ldGhvZF0uYXBwbHkoc3RyZWFtLCBhcmd1bWVudHMpO1xuICAgICAgfTsgfShpKTtcbiAgICB9XG4gIH1cblxuICAvLyBwcm94eSBjZXJ0YWluIGltcG9ydGFudCBldmVudHMuXG4gIHZhciBldmVudHMgPSBbJ2Vycm9yJywgJ2Nsb3NlJywgJ2Rlc3Ryb3knLCAncGF1c2UnLCAncmVzdW1lJ107XG4gIGZvckVhY2goZXZlbnRzLCBmdW5jdGlvbihldikge1xuICAgIHN0cmVhbS5vbihldiwgc2VsZi5lbWl0LmJpbmQoc2VsZiwgZXYpKTtcbiAgfSk7XG5cbiAgLy8gd2hlbiB3ZSB0cnkgdG8gY29uc3VtZSBzb21lIG1vcmUgYnl0ZXMsIHNpbXBseSB1bnBhdXNlIHRoZVxuICAvLyB1bmRlcmx5aW5nIHN0cmVhbS5cbiAgc2VsZi5fcmVhZCA9IGZ1bmN0aW9uKG4pIHtcbiAgICBkZWJ1Zygnd3JhcHBlZCBfcmVhZCcsIG4pO1xuICAgIGlmIChwYXVzZWQpIHtcbiAgICAgIHBhdXNlZCA9IGZhbHNlO1xuICAgICAgc3RyZWFtLnJlc3VtZSgpO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gc2VsZjtcbn07XG5cblxuLy8gZXhwb3NlZCBmb3IgdGVzdGluZyBwdXJwb3NlcyBvbmx5LlxuUmVhZGFibGUuX2Zyb21MaXN0ID0gZnJvbUxpc3Q7XG5cbi8vIFBsdWNrIG9mZiBuIGJ5dGVzIGZyb20gYW4gYXJyYXkgb2YgYnVmZmVycy5cbi8vIExlbmd0aCBpcyB0aGUgY29tYmluZWQgbGVuZ3RocyBvZiBhbGwgdGhlIGJ1ZmZlcnMgaW4gdGhlIGxpc3QuXG5mdW5jdGlvbiBmcm9tTGlzdChuLCBzdGF0ZSkge1xuICB2YXIgbGlzdCA9IHN0YXRlLmJ1ZmZlcjtcbiAgdmFyIGxlbmd0aCA9IHN0YXRlLmxlbmd0aDtcbiAgdmFyIHN0cmluZ01vZGUgPSAhIXN0YXRlLmRlY29kZXI7XG4gIHZhciBvYmplY3RNb2RlID0gISFzdGF0ZS5vYmplY3RNb2RlO1xuICB2YXIgcmV0O1xuXG4gIC8vIG5vdGhpbmcgaW4gdGhlIGxpc3QsIGRlZmluaXRlbHkgZW1wdHkuXG4gIGlmIChsaXN0Lmxlbmd0aCA9PT0gMClcbiAgICByZXR1cm4gbnVsbDtcblxuICBpZiAobGVuZ3RoID09PSAwKVxuICAgIHJldCA9IG51bGw7XG4gIGVsc2UgaWYgKG9iamVjdE1vZGUpXG4gICAgcmV0ID0gbGlzdC5zaGlmdCgpO1xuICBlbHNlIGlmICghbiB8fCBuID49IGxlbmd0aCkge1xuICAgIC8vIHJlYWQgaXQgYWxsLCB0cnVuY2F0ZSB0aGUgYXJyYXkuXG4gICAgaWYgKHN0cmluZ01vZGUpXG4gICAgICByZXQgPSBsaXN0LmpvaW4oJycpO1xuICAgIGVsc2UgaWYgKGxpc3QubGVuZ3RoID09PSAxKVxuICAgICAgcmV0ID0gbGlzdFswXTtcbiAgICBlbHNlXG4gICAgICByZXQgPSBCdWZmZXIuY29uY2F0KGxpc3QsIGxlbmd0aCk7XG4gICAgbGlzdC5sZW5ndGggPSAwO1xuICB9IGVsc2Uge1xuICAgIC8vIHJlYWQganVzdCBzb21lIG9mIGl0LlxuICAgIGlmIChuIDwgbGlzdFswXS5sZW5ndGgpIHtcbiAgICAgIC8vIGp1c3QgdGFrZSBhIHBhcnQgb2YgdGhlIGZpcnN0IGxpc3QgaXRlbS5cbiAgICAgIC8vIHNsaWNlIGlzIHRoZSBzYW1lIGZvciBidWZmZXJzIGFuZCBzdHJpbmdzLlxuICAgICAgdmFyIGJ1ZiA9IGxpc3RbMF07XG4gICAgICByZXQgPSBidWYuc2xpY2UoMCwgbik7XG4gICAgICBsaXN0WzBdID0gYnVmLnNsaWNlKG4pO1xuICAgIH0gZWxzZSBpZiAobiA9PT0gbGlzdFswXS5sZW5ndGgpIHtcbiAgICAgIC8vIGZpcnN0IGxpc3QgaXMgYSBwZXJmZWN0IG1hdGNoXG4gICAgICByZXQgPSBsaXN0LnNoaWZ0KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGNvbXBsZXggY2FzZS5cbiAgICAgIC8vIHdlIGhhdmUgZW5vdWdoIHRvIGNvdmVyIGl0LCBidXQgaXQgc3BhbnMgcGFzdCB0aGUgZmlyc3QgYnVmZmVyLlxuICAgICAgaWYgKHN0cmluZ01vZGUpXG4gICAgICAgIHJldCA9ICcnO1xuICAgICAgZWxzZVxuICAgICAgICByZXQgPSBuZXcgQnVmZmVyKG4pO1xuXG4gICAgICB2YXIgYyA9IDA7XG4gICAgICBmb3IgKHZhciBpID0gMCwgbCA9IGxpc3QubGVuZ3RoOyBpIDwgbCAmJiBjIDwgbjsgaSsrKSB7XG4gICAgICAgIHZhciBidWYgPSBsaXN0WzBdO1xuICAgICAgICB2YXIgY3B5ID0gTWF0aC5taW4obiAtIGMsIGJ1Zi5sZW5ndGgpO1xuXG4gICAgICAgIGlmIChzdHJpbmdNb2RlKVxuICAgICAgICAgIHJldCArPSBidWYuc2xpY2UoMCwgY3B5KTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgIGJ1Zi5jb3B5KHJldCwgYywgMCwgY3B5KTtcblxuICAgICAgICBpZiAoY3B5IDwgYnVmLmxlbmd0aClcbiAgICAgICAgICBsaXN0WzBdID0gYnVmLnNsaWNlKGNweSk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICBsaXN0LnNoaWZ0KCk7XG5cbiAgICAgICAgYyArPSBjcHk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gZW5kUmVhZGFibGUoc3RyZWFtKSB7XG4gIHZhciBzdGF0ZSA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZTtcblxuICAvLyBJZiB3ZSBnZXQgaGVyZSBiZWZvcmUgY29uc3VtaW5nIGFsbCB0aGUgYnl0ZXMsIHRoZW4gdGhhdCBpcyBhXG4gIC8vIGJ1ZyBpbiBub2RlLiAgU2hvdWxkIG5ldmVyIGhhcHBlbi5cbiAgaWYgKHN0YXRlLmxlbmd0aCA+IDApXG4gICAgdGhyb3cgbmV3IEVycm9yKCdlbmRSZWFkYWJsZSBjYWxsZWQgb24gbm9uLWVtcHR5IHN0cmVhbScpO1xuXG4gIGlmICghc3RhdGUuZW5kRW1pdHRlZCkge1xuICAgIHN0YXRlLmVuZGVkID0gdHJ1ZTtcbiAgICBwcm9jZXNzTmV4dFRpY2soZW5kUmVhZGFibGVOVCwgc3RhdGUsIHN0cmVhbSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZW5kUmVhZGFibGVOVChzdGF0ZSwgc3RyZWFtKSB7XG4gIC8vIENoZWNrIHRoYXQgd2UgZGlkbid0IGdldCBvbmUgbGFzdCB1bnNoaWZ0LlxuICBpZiAoIXN0YXRlLmVuZEVtaXR0ZWQgJiYgc3RhdGUubGVuZ3RoID09PSAwKSB7XG4gICAgc3RhdGUuZW5kRW1pdHRlZCA9IHRydWU7XG4gICAgc3RyZWFtLnJlYWRhYmxlID0gZmFsc2U7XG4gICAgc3RyZWFtLmVtaXQoJ2VuZCcpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZvckVhY2ggKHhzLCBmKSB7XG4gIGZvciAodmFyIGkgPSAwLCBsID0geHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgZih4c1tpXSwgaSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaW5kZXhPZiAoeHMsIHgpIHtcbiAgZm9yICh2YXIgaSA9IDAsIGwgPSB4cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBpZiAoeHNbaV0gPT09IHgpIHJldHVybiBpO1xuICB9XG4gIHJldHVybiAtMTtcbn1cbiIsInZhciBUcmFuc2Zvcm0gPSByZXF1aXJlKCdyZWFkYWJsZS1zdHJlYW0vdHJhbnNmb3JtJylcbiAgLCBpbmhlcml0cyAgPSByZXF1aXJlKCd1dGlsJykuaW5oZXJpdHNcbiAgLCB4dGVuZCAgICAgPSByZXF1aXJlKCd4dGVuZCcpXG5cbmZ1bmN0aW9uIERlc3Ryb3lhYmxlVHJhbnNmb3JtKG9wdHMpIHtcbiAgVHJhbnNmb3JtLmNhbGwodGhpcywgb3B0cylcbiAgdGhpcy5fZGVzdHJveWVkID0gZmFsc2Vcbn1cblxuaW5oZXJpdHMoRGVzdHJveWFibGVUcmFuc2Zvcm0sIFRyYW5zZm9ybSlcblxuRGVzdHJveWFibGVUcmFuc2Zvcm0ucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbihlcnIpIHtcbiAgaWYgKHRoaXMuX2Rlc3Ryb3llZCkgcmV0dXJuXG4gIHRoaXMuX2Rlc3Ryb3llZCA9IHRydWVcbiAgXG4gIHZhciBzZWxmID0gdGhpc1xuICBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uKCkge1xuICAgIGlmIChlcnIpXG4gICAgICBzZWxmLmVtaXQoJ2Vycm9yJywgZXJyKVxuICAgIHNlbGYuZW1pdCgnY2xvc2UnKVxuICB9KVxufVxuXG4vLyBhIG5vb3AgX3RyYW5zZm9ybSBmdW5jdGlvblxuZnVuY3Rpb24gbm9vcCAoY2h1bmssIGVuYywgY2FsbGJhY2spIHtcbiAgY2FsbGJhY2sobnVsbCwgY2h1bmspXG59XG5cblxuLy8gY3JlYXRlIGEgbmV3IGV4cG9ydCBmdW5jdGlvbiwgdXNlZCBieSBib3RoIHRoZSBtYWluIGV4cG9ydCBhbmRcbi8vIHRoZSAuY3RvciBleHBvcnQsIGNvbnRhaW5zIGNvbW1vbiBsb2dpYyBmb3IgZGVhbGluZyB3aXRoIGFyZ3VtZW50c1xuZnVuY3Rpb24gdGhyb3VnaDIgKGNvbnN0cnVjdCkge1xuICByZXR1cm4gZnVuY3Rpb24gKG9wdGlvbnMsIHRyYW5zZm9ybSwgZmx1c2gpIHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMgPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZmx1c2ggICAgID0gdHJhbnNmb3JtXG4gICAgICB0cmFuc2Zvcm0gPSBvcHRpb25zXG4gICAgICBvcHRpb25zICAgPSB7fVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdHJhbnNmb3JtICE9ICdmdW5jdGlvbicpXG4gICAgICB0cmFuc2Zvcm0gPSBub29wXG5cbiAgICBpZiAodHlwZW9mIGZsdXNoICE9ICdmdW5jdGlvbicpXG4gICAgICBmbHVzaCA9IG51bGxcblxuICAgIHJldHVybiBjb25zdHJ1Y3Qob3B0aW9ucywgdHJhbnNmb3JtLCBmbHVzaClcbiAgfVxufVxuXG5cbi8vIG1haW4gZXhwb3J0LCBqdXN0IG1ha2UgbWUgYSB0cmFuc2Zvcm0gc3RyZWFtIVxubW9kdWxlLmV4cG9ydHMgPSB0aHJvdWdoMihmdW5jdGlvbiAob3B0aW9ucywgdHJhbnNmb3JtLCBmbHVzaCkge1xuICB2YXIgdDIgPSBuZXcgRGVzdHJveWFibGVUcmFuc2Zvcm0ob3B0aW9ucylcblxuICB0Mi5fdHJhbnNmb3JtID0gdHJhbnNmb3JtXG5cbiAgaWYgKGZsdXNoKVxuICAgIHQyLl9mbHVzaCA9IGZsdXNoXG5cbiAgcmV0dXJuIHQyXG59KVxuXG5cbi8vIG1ha2UgbWUgYSByZXVzYWJsZSBwcm90b3R5cGUgdGhhdCBJIGNhbiBgbmV3YCwgb3IgaW1wbGljaXRseSBgbmV3YFxuLy8gd2l0aCBhIGNvbnN0cnVjdG9yIGNhbGxcbm1vZHVsZS5leHBvcnRzLmN0b3IgPSB0aHJvdWdoMihmdW5jdGlvbiAob3B0aW9ucywgdHJhbnNmb3JtLCBmbHVzaCkge1xuICBmdW5jdGlvbiBUaHJvdWdoMiAob3ZlcnJpZGUpIHtcbiAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgVGhyb3VnaDIpKVxuICAgICAgcmV0dXJuIG5ldyBUaHJvdWdoMihvdmVycmlkZSlcblxuICAgIHRoaXMub3B0aW9ucyA9IHh0ZW5kKG9wdGlvbnMsIG92ZXJyaWRlKVxuXG4gICAgRGVzdHJveWFibGVUcmFuc2Zvcm0uY2FsbCh0aGlzLCB0aGlzLm9wdGlvbnMpXG4gIH1cblxuICBpbmhlcml0cyhUaHJvdWdoMiwgRGVzdHJveWFibGVUcmFuc2Zvcm0pXG5cbiAgVGhyb3VnaDIucHJvdG90eXBlLl90cmFuc2Zvcm0gPSB0cmFuc2Zvcm1cblxuICBpZiAoZmx1c2gpXG4gICAgVGhyb3VnaDIucHJvdG90eXBlLl9mbHVzaCA9IGZsdXNoXG5cbiAgcmV0dXJuIFRocm91Z2gyXG59KVxuXG5cbm1vZHVsZS5leHBvcnRzLm9iaiA9IHRocm91Z2gyKGZ1bmN0aW9uIChvcHRpb25zLCB0cmFuc2Zvcm0sIGZsdXNoKSB7XG4gIHZhciB0MiA9IG5ldyBEZXN0cm95YWJsZVRyYW5zZm9ybSh4dGVuZCh7IG9iamVjdE1vZGU6IHRydWUsIGhpZ2hXYXRlck1hcms6IDE2IH0sIG9wdGlvbnMpKVxuXG4gIHQyLl90cmFuc2Zvcm0gPSB0cmFuc2Zvcm1cblxuICBpZiAoZmx1c2gpXG4gICAgdDIuX2ZsdXNoID0gZmx1c2hcblxuICByZXR1cm4gdDJcbn0pXG4iLCIndXNlIHN0cmljdCc7XG5cbi8qZ2xvYmFsIHdpbmRvdywgZ2xvYmFsKi9cblxudmFyIHJvb3QgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA/XG4gICAgd2luZG93IDogdHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCcgP1xuICAgIGdsb2JhbCA6IHt9O1xuXG5tb2R1bGUuZXhwb3J0cyA9IEluZGl2aWR1YWw7XG5cbmZ1bmN0aW9uIEluZGl2aWR1YWwoa2V5LCB2YWx1ZSkge1xuICAgIGlmIChrZXkgaW4gcm9vdCkge1xuICAgICAgICByZXR1cm4gcm9vdFtrZXldO1xuICAgIH1cblxuICAgIHJvb3Rba2V5XSA9IHZhbHVlO1xuXG4gICAgcmV0dXJuIHZhbHVlO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgSW5kaXZpZHVhbCA9IHJlcXVpcmUoJy4vaW5kZXguanMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBPbmVWZXJzaW9uO1xuXG5mdW5jdGlvbiBPbmVWZXJzaW9uKG1vZHVsZU5hbWUsIHZlcnNpb24sIGRlZmF1bHRWYWx1ZSkge1xuICAgIHZhciBrZXkgPSAnX19JTkRJVklEVUFMX09ORV9WRVJTSU9OXycgKyBtb2R1bGVOYW1lO1xuICAgIHZhciBlbmZvcmNlS2V5ID0ga2V5ICsgJ19FTkZPUkNFX1NJTkdMRVRPTic7XG5cbiAgICB2YXIgdmVyc2lvblZhbHVlID0gSW5kaXZpZHVhbChlbmZvcmNlS2V5LCB2ZXJzaW9uKTtcblxuICAgIGlmICh2ZXJzaW9uVmFsdWUgIT09IHZlcnNpb24pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW4gb25seSBoYXZlIG9uZSBjb3B5IG9mICcgK1xuICAgICAgICAgICAgbW9kdWxlTmFtZSArICcuXFxuJyArXG4gICAgICAgICAgICAnWW91IGFscmVhZHkgaGF2ZSB2ZXJzaW9uICcgKyB2ZXJzaW9uVmFsdWUgK1xuICAgICAgICAgICAgJyBpbnN0YWxsZWQuXFxuJyArXG4gICAgICAgICAgICAnVGhpcyBtZWFucyB5b3UgY2Fubm90IGluc3RhbGwgdmVyc2lvbiAnICsgdmVyc2lvbik7XG4gICAgfVxuXG4gICAgcmV0dXJuIEluZGl2aWR1YWwoa2V5LCBkZWZhdWx0VmFsdWUpO1xufVxuIiwibW9kdWxlLmV4cG9ydHMgPSBpc0Z1bmN0aW9uXG5cbnZhciB0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdcblxuZnVuY3Rpb24gaXNGdW5jdGlvbiAoZm4pIHtcbiAgdmFyIHN0cmluZyA9IHRvU3RyaW5nLmNhbGwoZm4pXG4gIHJldHVybiBzdHJpbmcgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXScgfHxcbiAgICAodHlwZW9mIGZuID09PSAnZnVuY3Rpb24nICYmIHN0cmluZyAhPT0gJ1tvYmplY3QgUmVnRXhwXScpIHx8XG4gICAgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmXG4gICAgIC8vIElFOCBhbmQgYmVsb3dcbiAgICAgKGZuID09PSB3aW5kb3cuc2V0VGltZW91dCB8fFxuICAgICAgZm4gPT09IHdpbmRvdy5hbGVydCB8fFxuICAgICAgZm4gPT09IHdpbmRvdy5jb25maXJtIHx8XG4gICAgICBmbiA9PT0gd2luZG93LnByb21wdCkpXG59O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaXNPYmplY3QoeCkge1xuXHRyZXR1cm4gdHlwZW9mIHggPT09IFwib2JqZWN0XCIgJiYgeCAhPT0gbnVsbDtcbn07XG4iLCJcInVzZSBzdHJpY3RcIlxuZnVuY3Rpb24gaXNQcm9wZXJ0eShzdHIpIHtcbiAgcmV0dXJuIC9eWyRBLVpcXF9hLXpcXHhhYVxceGI1XFx4YmFcXHhjMC1cXHhkNlxceGQ4LVxceGY2XFx4ZjgtXFx1MDJjMVxcdTAyYzYtXFx1MDJkMVxcdTAyZTAtXFx1MDJlNFxcdTAyZWNcXHUwMmVlXFx1MDM3MC1cXHUwMzc0XFx1MDM3NlxcdTAzNzdcXHUwMzdhLVxcdTAzN2RcXHUwMzg2XFx1MDM4OC1cXHUwMzhhXFx1MDM4Y1xcdTAzOGUtXFx1MDNhMVxcdTAzYTMtXFx1MDNmNVxcdTAzZjctXFx1MDQ4MVxcdTA0OGEtXFx1MDUyN1xcdTA1MzEtXFx1MDU1NlxcdTA1NTlcXHUwNTYxLVxcdTA1ODdcXHUwNWQwLVxcdTA1ZWFcXHUwNWYwLVxcdTA1ZjJcXHUwNjIwLVxcdTA2NGFcXHUwNjZlXFx1MDY2ZlxcdTA2NzEtXFx1MDZkM1xcdTA2ZDVcXHUwNmU1XFx1MDZlNlxcdTA2ZWVcXHUwNmVmXFx1MDZmYS1cXHUwNmZjXFx1MDZmZlxcdTA3MTBcXHUwNzEyLVxcdTA3MmZcXHUwNzRkLVxcdTA3YTVcXHUwN2IxXFx1MDdjYS1cXHUwN2VhXFx1MDdmNFxcdTA3ZjVcXHUwN2ZhXFx1MDgwMC1cXHUwODE1XFx1MDgxYVxcdTA4MjRcXHUwODI4XFx1MDg0MC1cXHUwODU4XFx1MDhhMFxcdTA4YTItXFx1MDhhY1xcdTA5MDQtXFx1MDkzOVxcdTA5M2RcXHUwOTUwXFx1MDk1OC1cXHUwOTYxXFx1MDk3MS1cXHUwOTc3XFx1MDk3OS1cXHUwOTdmXFx1MDk4NS1cXHUwOThjXFx1MDk4ZlxcdTA5OTBcXHUwOTkzLVxcdTA5YThcXHUwOWFhLVxcdTA5YjBcXHUwOWIyXFx1MDliNi1cXHUwOWI5XFx1MDliZFxcdTA5Y2VcXHUwOWRjXFx1MDlkZFxcdTA5ZGYtXFx1MDllMVxcdTA5ZjBcXHUwOWYxXFx1MGEwNS1cXHUwYTBhXFx1MGEwZlxcdTBhMTBcXHUwYTEzLVxcdTBhMjhcXHUwYTJhLVxcdTBhMzBcXHUwYTMyXFx1MGEzM1xcdTBhMzVcXHUwYTM2XFx1MGEzOFxcdTBhMzlcXHUwYTU5LVxcdTBhNWNcXHUwYTVlXFx1MGE3Mi1cXHUwYTc0XFx1MGE4NS1cXHUwYThkXFx1MGE4Zi1cXHUwYTkxXFx1MGE5My1cXHUwYWE4XFx1MGFhYS1cXHUwYWIwXFx1MGFiMlxcdTBhYjNcXHUwYWI1LVxcdTBhYjlcXHUwYWJkXFx1MGFkMFxcdTBhZTBcXHUwYWUxXFx1MGIwNS1cXHUwYjBjXFx1MGIwZlxcdTBiMTBcXHUwYjEzLVxcdTBiMjhcXHUwYjJhLVxcdTBiMzBcXHUwYjMyXFx1MGIzM1xcdTBiMzUtXFx1MGIzOVxcdTBiM2RcXHUwYjVjXFx1MGI1ZFxcdTBiNWYtXFx1MGI2MVxcdTBiNzFcXHUwYjgzXFx1MGI4NS1cXHUwYjhhXFx1MGI4ZS1cXHUwYjkwXFx1MGI5Mi1cXHUwYjk1XFx1MGI5OVxcdTBiOWFcXHUwYjljXFx1MGI5ZVxcdTBiOWZcXHUwYmEzXFx1MGJhNFxcdTBiYTgtXFx1MGJhYVxcdTBiYWUtXFx1MGJiOVxcdTBiZDBcXHUwYzA1LVxcdTBjMGNcXHUwYzBlLVxcdTBjMTBcXHUwYzEyLVxcdTBjMjhcXHUwYzJhLVxcdTBjMzNcXHUwYzM1LVxcdTBjMzlcXHUwYzNkXFx1MGM1OFxcdTBjNTlcXHUwYzYwXFx1MGM2MVxcdTBjODUtXFx1MGM4Y1xcdTBjOGUtXFx1MGM5MFxcdTBjOTItXFx1MGNhOFxcdTBjYWEtXFx1MGNiM1xcdTBjYjUtXFx1MGNiOVxcdTBjYmRcXHUwY2RlXFx1MGNlMFxcdTBjZTFcXHUwY2YxXFx1MGNmMlxcdTBkMDUtXFx1MGQwY1xcdTBkMGUtXFx1MGQxMFxcdTBkMTItXFx1MGQzYVxcdTBkM2RcXHUwZDRlXFx1MGQ2MFxcdTBkNjFcXHUwZDdhLVxcdTBkN2ZcXHUwZDg1LVxcdTBkOTZcXHUwZDlhLVxcdTBkYjFcXHUwZGIzLVxcdTBkYmJcXHUwZGJkXFx1MGRjMC1cXHUwZGM2XFx1MGUwMS1cXHUwZTMwXFx1MGUzMlxcdTBlMzNcXHUwZTQwLVxcdTBlNDZcXHUwZTgxXFx1MGU4MlxcdTBlODRcXHUwZTg3XFx1MGU4OFxcdTBlOGFcXHUwZThkXFx1MGU5NC1cXHUwZTk3XFx1MGU5OS1cXHUwZTlmXFx1MGVhMS1cXHUwZWEzXFx1MGVhNVxcdTBlYTdcXHUwZWFhXFx1MGVhYlxcdTBlYWQtXFx1MGViMFxcdTBlYjJcXHUwZWIzXFx1MGViZFxcdTBlYzAtXFx1MGVjNFxcdTBlYzZcXHUwZWRjLVxcdTBlZGZcXHUwZjAwXFx1MGY0MC1cXHUwZjQ3XFx1MGY0OS1cXHUwZjZjXFx1MGY4OC1cXHUwZjhjXFx1MTAwMC1cXHUxMDJhXFx1MTAzZlxcdTEwNTAtXFx1MTA1NVxcdTEwNWEtXFx1MTA1ZFxcdTEwNjFcXHUxMDY1XFx1MTA2NlxcdTEwNmUtXFx1MTA3MFxcdTEwNzUtXFx1MTA4MVxcdTEwOGVcXHUxMGEwLVxcdTEwYzVcXHUxMGM3XFx1MTBjZFxcdTEwZDAtXFx1MTBmYVxcdTEwZmMtXFx1MTI0OFxcdTEyNGEtXFx1MTI0ZFxcdTEyNTAtXFx1MTI1NlxcdTEyNThcXHUxMjVhLVxcdTEyNWRcXHUxMjYwLVxcdTEyODhcXHUxMjhhLVxcdTEyOGRcXHUxMjkwLVxcdTEyYjBcXHUxMmIyLVxcdTEyYjVcXHUxMmI4LVxcdTEyYmVcXHUxMmMwXFx1MTJjMi1cXHUxMmM1XFx1MTJjOC1cXHUxMmQ2XFx1MTJkOC1cXHUxMzEwXFx1MTMxMi1cXHUxMzE1XFx1MTMxOC1cXHUxMzVhXFx1MTM4MC1cXHUxMzhmXFx1MTNhMC1cXHUxM2Y0XFx1MTQwMS1cXHUxNjZjXFx1MTY2Zi1cXHUxNjdmXFx1MTY4MS1cXHUxNjlhXFx1MTZhMC1cXHUxNmVhXFx1MTZlZS1cXHUxNmYwXFx1MTcwMC1cXHUxNzBjXFx1MTcwZS1cXHUxNzExXFx1MTcyMC1cXHUxNzMxXFx1MTc0MC1cXHUxNzUxXFx1MTc2MC1cXHUxNzZjXFx1MTc2ZS1cXHUxNzcwXFx1MTc4MC1cXHUxN2IzXFx1MTdkN1xcdTE3ZGNcXHUxODIwLVxcdTE4NzdcXHUxODgwLVxcdTE4YThcXHUxOGFhXFx1MThiMC1cXHUxOGY1XFx1MTkwMC1cXHUxOTFjXFx1MTk1MC1cXHUxOTZkXFx1MTk3MC1cXHUxOTc0XFx1MTk4MC1cXHUxOWFiXFx1MTljMS1cXHUxOWM3XFx1MWEwMC1cXHUxYTE2XFx1MWEyMC1cXHUxYTU0XFx1MWFhN1xcdTFiMDUtXFx1MWIzM1xcdTFiNDUtXFx1MWI0YlxcdTFiODMtXFx1MWJhMFxcdTFiYWVcXHUxYmFmXFx1MWJiYS1cXHUxYmU1XFx1MWMwMC1cXHUxYzIzXFx1MWM0ZC1cXHUxYzRmXFx1MWM1YS1cXHUxYzdkXFx1MWNlOS1cXHUxY2VjXFx1MWNlZS1cXHUxY2YxXFx1MWNmNVxcdTFjZjZcXHUxZDAwLVxcdTFkYmZcXHUxZTAwLVxcdTFmMTVcXHUxZjE4LVxcdTFmMWRcXHUxZjIwLVxcdTFmNDVcXHUxZjQ4LVxcdTFmNGRcXHUxZjUwLVxcdTFmNTdcXHUxZjU5XFx1MWY1YlxcdTFmNWRcXHUxZjVmLVxcdTFmN2RcXHUxZjgwLVxcdTFmYjRcXHUxZmI2LVxcdTFmYmNcXHUxZmJlXFx1MWZjMi1cXHUxZmM0XFx1MWZjNi1cXHUxZmNjXFx1MWZkMC1cXHUxZmQzXFx1MWZkNi1cXHUxZmRiXFx1MWZlMC1cXHUxZmVjXFx1MWZmMi1cXHUxZmY0XFx1MWZmNi1cXHUxZmZjXFx1MjA3MVxcdTIwN2ZcXHUyMDkwLVxcdTIwOWNcXHUyMTAyXFx1MjEwN1xcdTIxMGEtXFx1MjExM1xcdTIxMTVcXHUyMTE5LVxcdTIxMWRcXHUyMTI0XFx1MjEyNlxcdTIxMjhcXHUyMTJhLVxcdTIxMmRcXHUyMTJmLVxcdTIxMzlcXHUyMTNjLVxcdTIxM2ZcXHUyMTQ1LVxcdTIxNDlcXHUyMTRlXFx1MjE2MC1cXHUyMTg4XFx1MmMwMC1cXHUyYzJlXFx1MmMzMC1cXHUyYzVlXFx1MmM2MC1cXHUyY2U0XFx1MmNlYi1cXHUyY2VlXFx1MmNmMlxcdTJjZjNcXHUyZDAwLVxcdTJkMjVcXHUyZDI3XFx1MmQyZFxcdTJkMzAtXFx1MmQ2N1xcdTJkNmZcXHUyZDgwLVxcdTJkOTZcXHUyZGEwLVxcdTJkYTZcXHUyZGE4LVxcdTJkYWVcXHUyZGIwLVxcdTJkYjZcXHUyZGI4LVxcdTJkYmVcXHUyZGMwLVxcdTJkYzZcXHUyZGM4LVxcdTJkY2VcXHUyZGQwLVxcdTJkZDZcXHUyZGQ4LVxcdTJkZGVcXHUyZTJmXFx1MzAwNS1cXHUzMDA3XFx1MzAyMS1cXHUzMDI5XFx1MzAzMS1cXHUzMDM1XFx1MzAzOC1cXHUzMDNjXFx1MzA0MS1cXHUzMDk2XFx1MzA5ZC1cXHUzMDlmXFx1MzBhMS1cXHUzMGZhXFx1MzBmYy1cXHUzMGZmXFx1MzEwNS1cXHUzMTJkXFx1MzEzMS1cXHUzMThlXFx1MzFhMC1cXHUzMWJhXFx1MzFmMC1cXHUzMWZmXFx1MzQwMC1cXHU0ZGI1XFx1NGUwMC1cXHU5ZmNjXFx1YTAwMC1cXHVhNDhjXFx1YTRkMC1cXHVhNGZkXFx1YTUwMC1cXHVhNjBjXFx1YTYxMC1cXHVhNjFmXFx1YTYyYVxcdWE2MmJcXHVhNjQwLVxcdWE2NmVcXHVhNjdmLVxcdWE2OTdcXHVhNmEwLVxcdWE2ZWZcXHVhNzE3LVxcdWE3MWZcXHVhNzIyLVxcdWE3ODhcXHVhNzhiLVxcdWE3OGVcXHVhNzkwLVxcdWE3OTNcXHVhN2EwLVxcdWE3YWFcXHVhN2Y4LVxcdWE4MDFcXHVhODAzLVxcdWE4MDVcXHVhODA3LVxcdWE4MGFcXHVhODBjLVxcdWE4MjJcXHVhODQwLVxcdWE4NzNcXHVhODgyLVxcdWE4YjNcXHVhOGYyLVxcdWE4ZjdcXHVhOGZiXFx1YTkwYS1cXHVhOTI1XFx1YTkzMC1cXHVhOTQ2XFx1YTk2MC1cXHVhOTdjXFx1YTk4NC1cXHVhOWIyXFx1YTljZlxcdWFhMDAtXFx1YWEyOFxcdWFhNDAtXFx1YWE0MlxcdWFhNDQtXFx1YWE0YlxcdWFhNjAtXFx1YWE3NlxcdWFhN2FcXHVhYTgwLVxcdWFhYWZcXHVhYWIxXFx1YWFiNVxcdWFhYjZcXHVhYWI5LVxcdWFhYmRcXHVhYWMwXFx1YWFjMlxcdWFhZGItXFx1YWFkZFxcdWFhZTAtXFx1YWFlYVxcdWFhZjItXFx1YWFmNFxcdWFiMDEtXFx1YWIwNlxcdWFiMDktXFx1YWIwZVxcdWFiMTEtXFx1YWIxNlxcdWFiMjAtXFx1YWIyNlxcdWFiMjgtXFx1YWIyZVxcdWFiYzAtXFx1YWJlMlxcdWFjMDAtXFx1ZDdhM1xcdWQ3YjAtXFx1ZDdjNlxcdWQ3Y2ItXFx1ZDdmYlxcdWY5MDAtXFx1ZmE2ZFxcdWZhNzAtXFx1ZmFkOVxcdWZiMDAtXFx1ZmIwNlxcdWZiMTMtXFx1ZmIxN1xcdWZiMWRcXHVmYjFmLVxcdWZiMjhcXHVmYjJhLVxcdWZiMzZcXHVmYjM4LVxcdWZiM2NcXHVmYjNlXFx1ZmI0MFxcdWZiNDFcXHVmYjQzXFx1ZmI0NFxcdWZiNDYtXFx1ZmJiMVxcdWZiZDMtXFx1ZmQzZFxcdWZkNTAtXFx1ZmQ4ZlxcdWZkOTItXFx1ZmRjN1xcdWZkZjAtXFx1ZmRmYlxcdWZlNzAtXFx1ZmU3NFxcdWZlNzYtXFx1ZmVmY1xcdWZmMjEtXFx1ZmYzYVxcdWZmNDEtXFx1ZmY1YVxcdWZmNjYtXFx1ZmZiZVxcdWZmYzItXFx1ZmZjN1xcdWZmY2EtXFx1ZmZjZlxcdWZmZDItXFx1ZmZkN1xcdWZmZGEtXFx1ZmZkY11bJEEtWlxcX2EtelxceGFhXFx4YjVcXHhiYVxceGMwLVxceGQ2XFx4ZDgtXFx4ZjZcXHhmOC1cXHUwMmMxXFx1MDJjNi1cXHUwMmQxXFx1MDJlMC1cXHUwMmU0XFx1MDJlY1xcdTAyZWVcXHUwMzcwLVxcdTAzNzRcXHUwMzc2XFx1MDM3N1xcdTAzN2EtXFx1MDM3ZFxcdTAzODZcXHUwMzg4LVxcdTAzOGFcXHUwMzhjXFx1MDM4ZS1cXHUwM2ExXFx1MDNhMy1cXHUwM2Y1XFx1MDNmNy1cXHUwNDgxXFx1MDQ4YS1cXHUwNTI3XFx1MDUzMS1cXHUwNTU2XFx1MDU1OVxcdTA1NjEtXFx1MDU4N1xcdTA1ZDAtXFx1MDVlYVxcdTA1ZjAtXFx1MDVmMlxcdTA2MjAtXFx1MDY0YVxcdTA2NmVcXHUwNjZmXFx1MDY3MS1cXHUwNmQzXFx1MDZkNVxcdTA2ZTVcXHUwNmU2XFx1MDZlZVxcdTA2ZWZcXHUwNmZhLVxcdTA2ZmNcXHUwNmZmXFx1MDcxMFxcdTA3MTItXFx1MDcyZlxcdTA3NGQtXFx1MDdhNVxcdTA3YjFcXHUwN2NhLVxcdTA3ZWFcXHUwN2Y0XFx1MDdmNVxcdTA3ZmFcXHUwODAwLVxcdTA4MTVcXHUwODFhXFx1MDgyNFxcdTA4MjhcXHUwODQwLVxcdTA4NThcXHUwOGEwXFx1MDhhMi1cXHUwOGFjXFx1MDkwNC1cXHUwOTM5XFx1MDkzZFxcdTA5NTBcXHUwOTU4LVxcdTA5NjFcXHUwOTcxLVxcdTA5NzdcXHUwOTc5LVxcdTA5N2ZcXHUwOTg1LVxcdTA5OGNcXHUwOThmXFx1MDk5MFxcdTA5OTMtXFx1MDlhOFxcdTA5YWEtXFx1MDliMFxcdTA5YjJcXHUwOWI2LVxcdTA5YjlcXHUwOWJkXFx1MDljZVxcdTA5ZGNcXHUwOWRkXFx1MDlkZi1cXHUwOWUxXFx1MDlmMFxcdTA5ZjFcXHUwYTA1LVxcdTBhMGFcXHUwYTBmXFx1MGExMFxcdTBhMTMtXFx1MGEyOFxcdTBhMmEtXFx1MGEzMFxcdTBhMzJcXHUwYTMzXFx1MGEzNVxcdTBhMzZcXHUwYTM4XFx1MGEzOVxcdTBhNTktXFx1MGE1Y1xcdTBhNWVcXHUwYTcyLVxcdTBhNzRcXHUwYTg1LVxcdTBhOGRcXHUwYThmLVxcdTBhOTFcXHUwYTkzLVxcdTBhYThcXHUwYWFhLVxcdTBhYjBcXHUwYWIyXFx1MGFiM1xcdTBhYjUtXFx1MGFiOVxcdTBhYmRcXHUwYWQwXFx1MGFlMFxcdTBhZTFcXHUwYjA1LVxcdTBiMGNcXHUwYjBmXFx1MGIxMFxcdTBiMTMtXFx1MGIyOFxcdTBiMmEtXFx1MGIzMFxcdTBiMzJcXHUwYjMzXFx1MGIzNS1cXHUwYjM5XFx1MGIzZFxcdTBiNWNcXHUwYjVkXFx1MGI1Zi1cXHUwYjYxXFx1MGI3MVxcdTBiODNcXHUwYjg1LVxcdTBiOGFcXHUwYjhlLVxcdTBiOTBcXHUwYjkyLVxcdTBiOTVcXHUwYjk5XFx1MGI5YVxcdTBiOWNcXHUwYjllXFx1MGI5ZlxcdTBiYTNcXHUwYmE0XFx1MGJhOC1cXHUwYmFhXFx1MGJhZS1cXHUwYmI5XFx1MGJkMFxcdTBjMDUtXFx1MGMwY1xcdTBjMGUtXFx1MGMxMFxcdTBjMTItXFx1MGMyOFxcdTBjMmEtXFx1MGMzM1xcdTBjMzUtXFx1MGMzOVxcdTBjM2RcXHUwYzU4XFx1MGM1OVxcdTBjNjBcXHUwYzYxXFx1MGM4NS1cXHUwYzhjXFx1MGM4ZS1cXHUwYzkwXFx1MGM5Mi1cXHUwY2E4XFx1MGNhYS1cXHUwY2IzXFx1MGNiNS1cXHUwY2I5XFx1MGNiZFxcdTBjZGVcXHUwY2UwXFx1MGNlMVxcdTBjZjFcXHUwY2YyXFx1MGQwNS1cXHUwZDBjXFx1MGQwZS1cXHUwZDEwXFx1MGQxMi1cXHUwZDNhXFx1MGQzZFxcdTBkNGVcXHUwZDYwXFx1MGQ2MVxcdTBkN2EtXFx1MGQ3ZlxcdTBkODUtXFx1MGQ5NlxcdTBkOWEtXFx1MGRiMVxcdTBkYjMtXFx1MGRiYlxcdTBkYmRcXHUwZGMwLVxcdTBkYzZcXHUwZTAxLVxcdTBlMzBcXHUwZTMyXFx1MGUzM1xcdTBlNDAtXFx1MGU0NlxcdTBlODFcXHUwZTgyXFx1MGU4NFxcdTBlODdcXHUwZTg4XFx1MGU4YVxcdTBlOGRcXHUwZTk0LVxcdTBlOTdcXHUwZTk5LVxcdTBlOWZcXHUwZWExLVxcdTBlYTNcXHUwZWE1XFx1MGVhN1xcdTBlYWFcXHUwZWFiXFx1MGVhZC1cXHUwZWIwXFx1MGViMlxcdTBlYjNcXHUwZWJkXFx1MGVjMC1cXHUwZWM0XFx1MGVjNlxcdTBlZGMtXFx1MGVkZlxcdTBmMDBcXHUwZjQwLVxcdTBmNDdcXHUwZjQ5LVxcdTBmNmNcXHUwZjg4LVxcdTBmOGNcXHUxMDAwLVxcdTEwMmFcXHUxMDNmXFx1MTA1MC1cXHUxMDU1XFx1MTA1YS1cXHUxMDVkXFx1MTA2MVxcdTEwNjVcXHUxMDY2XFx1MTA2ZS1cXHUxMDcwXFx1MTA3NS1cXHUxMDgxXFx1MTA4ZVxcdTEwYTAtXFx1MTBjNVxcdTEwYzdcXHUxMGNkXFx1MTBkMC1cXHUxMGZhXFx1MTBmYy1cXHUxMjQ4XFx1MTI0YS1cXHUxMjRkXFx1MTI1MC1cXHUxMjU2XFx1MTI1OFxcdTEyNWEtXFx1MTI1ZFxcdTEyNjAtXFx1MTI4OFxcdTEyOGEtXFx1MTI4ZFxcdTEyOTAtXFx1MTJiMFxcdTEyYjItXFx1MTJiNVxcdTEyYjgtXFx1MTJiZVxcdTEyYzBcXHUxMmMyLVxcdTEyYzVcXHUxMmM4LVxcdTEyZDZcXHUxMmQ4LVxcdTEzMTBcXHUxMzEyLVxcdTEzMTVcXHUxMzE4LVxcdTEzNWFcXHUxMzgwLVxcdTEzOGZcXHUxM2EwLVxcdTEzZjRcXHUxNDAxLVxcdTE2NmNcXHUxNjZmLVxcdTE2N2ZcXHUxNjgxLVxcdTE2OWFcXHUxNmEwLVxcdTE2ZWFcXHUxNmVlLVxcdTE2ZjBcXHUxNzAwLVxcdTE3MGNcXHUxNzBlLVxcdTE3MTFcXHUxNzIwLVxcdTE3MzFcXHUxNzQwLVxcdTE3NTFcXHUxNzYwLVxcdTE3NmNcXHUxNzZlLVxcdTE3NzBcXHUxNzgwLVxcdTE3YjNcXHUxN2Q3XFx1MTdkY1xcdTE4MjAtXFx1MTg3N1xcdTE4ODAtXFx1MThhOFxcdTE4YWFcXHUxOGIwLVxcdTE4ZjVcXHUxOTAwLVxcdTE5MWNcXHUxOTUwLVxcdTE5NmRcXHUxOTcwLVxcdTE5NzRcXHUxOTgwLVxcdTE5YWJcXHUxOWMxLVxcdTE5YzdcXHUxYTAwLVxcdTFhMTZcXHUxYTIwLVxcdTFhNTRcXHUxYWE3XFx1MWIwNS1cXHUxYjMzXFx1MWI0NS1cXHUxYjRiXFx1MWI4My1cXHUxYmEwXFx1MWJhZVxcdTFiYWZcXHUxYmJhLVxcdTFiZTVcXHUxYzAwLVxcdTFjMjNcXHUxYzRkLVxcdTFjNGZcXHUxYzVhLVxcdTFjN2RcXHUxY2U5LVxcdTFjZWNcXHUxY2VlLVxcdTFjZjFcXHUxY2Y1XFx1MWNmNlxcdTFkMDAtXFx1MWRiZlxcdTFlMDAtXFx1MWYxNVxcdTFmMTgtXFx1MWYxZFxcdTFmMjAtXFx1MWY0NVxcdTFmNDgtXFx1MWY0ZFxcdTFmNTAtXFx1MWY1N1xcdTFmNTlcXHUxZjViXFx1MWY1ZFxcdTFmNWYtXFx1MWY3ZFxcdTFmODAtXFx1MWZiNFxcdTFmYjYtXFx1MWZiY1xcdTFmYmVcXHUxZmMyLVxcdTFmYzRcXHUxZmM2LVxcdTFmY2NcXHUxZmQwLVxcdTFmZDNcXHUxZmQ2LVxcdTFmZGJcXHUxZmUwLVxcdTFmZWNcXHUxZmYyLVxcdTFmZjRcXHUxZmY2LVxcdTFmZmNcXHUyMDcxXFx1MjA3ZlxcdTIwOTAtXFx1MjA5Y1xcdTIxMDJcXHUyMTA3XFx1MjEwYS1cXHUyMTEzXFx1MjExNVxcdTIxMTktXFx1MjExZFxcdTIxMjRcXHUyMTI2XFx1MjEyOFxcdTIxMmEtXFx1MjEyZFxcdTIxMmYtXFx1MjEzOVxcdTIxM2MtXFx1MjEzZlxcdTIxNDUtXFx1MjE0OVxcdTIxNGVcXHUyMTYwLVxcdTIxODhcXHUyYzAwLVxcdTJjMmVcXHUyYzMwLVxcdTJjNWVcXHUyYzYwLVxcdTJjZTRcXHUyY2ViLVxcdTJjZWVcXHUyY2YyXFx1MmNmM1xcdTJkMDAtXFx1MmQyNVxcdTJkMjdcXHUyZDJkXFx1MmQzMC1cXHUyZDY3XFx1MmQ2ZlxcdTJkODAtXFx1MmQ5NlxcdTJkYTAtXFx1MmRhNlxcdTJkYTgtXFx1MmRhZVxcdTJkYjAtXFx1MmRiNlxcdTJkYjgtXFx1MmRiZVxcdTJkYzAtXFx1MmRjNlxcdTJkYzgtXFx1MmRjZVxcdTJkZDAtXFx1MmRkNlxcdTJkZDgtXFx1MmRkZVxcdTJlMmZcXHUzMDA1LVxcdTMwMDdcXHUzMDIxLVxcdTMwMjlcXHUzMDMxLVxcdTMwMzVcXHUzMDM4LVxcdTMwM2NcXHUzMDQxLVxcdTMwOTZcXHUzMDlkLVxcdTMwOWZcXHUzMGExLVxcdTMwZmFcXHUzMGZjLVxcdTMwZmZcXHUzMTA1LVxcdTMxMmRcXHUzMTMxLVxcdTMxOGVcXHUzMWEwLVxcdTMxYmFcXHUzMWYwLVxcdTMxZmZcXHUzNDAwLVxcdTRkYjVcXHU0ZTAwLVxcdTlmY2NcXHVhMDAwLVxcdWE0OGNcXHVhNGQwLVxcdWE0ZmRcXHVhNTAwLVxcdWE2MGNcXHVhNjEwLVxcdWE2MWZcXHVhNjJhXFx1YTYyYlxcdWE2NDAtXFx1YTY2ZVxcdWE2N2YtXFx1YTY5N1xcdWE2YTAtXFx1YTZlZlxcdWE3MTctXFx1YTcxZlxcdWE3MjItXFx1YTc4OFxcdWE3OGItXFx1YTc4ZVxcdWE3OTAtXFx1YTc5M1xcdWE3YTAtXFx1YTdhYVxcdWE3ZjgtXFx1YTgwMVxcdWE4MDMtXFx1YTgwNVxcdWE4MDctXFx1YTgwYVxcdWE4MGMtXFx1YTgyMlxcdWE4NDAtXFx1YTg3M1xcdWE4ODItXFx1YThiM1xcdWE4ZjItXFx1YThmN1xcdWE4ZmJcXHVhOTBhLVxcdWE5MjVcXHVhOTMwLVxcdWE5NDZcXHVhOTYwLVxcdWE5N2NcXHVhOTg0LVxcdWE5YjJcXHVhOWNmXFx1YWEwMC1cXHVhYTI4XFx1YWE0MC1cXHVhYTQyXFx1YWE0NC1cXHVhYTRiXFx1YWE2MC1cXHVhYTc2XFx1YWE3YVxcdWFhODAtXFx1YWFhZlxcdWFhYjFcXHVhYWI1XFx1YWFiNlxcdWFhYjktXFx1YWFiZFxcdWFhYzBcXHVhYWMyXFx1YWFkYi1cXHVhYWRkXFx1YWFlMC1cXHVhYWVhXFx1YWFmMi1cXHVhYWY0XFx1YWIwMS1cXHVhYjA2XFx1YWIwOS1cXHVhYjBlXFx1YWIxMS1cXHVhYjE2XFx1YWIyMC1cXHVhYjI2XFx1YWIyOC1cXHVhYjJlXFx1YWJjMC1cXHVhYmUyXFx1YWMwMC1cXHVkN2EzXFx1ZDdiMC1cXHVkN2M2XFx1ZDdjYi1cXHVkN2ZiXFx1ZjkwMC1cXHVmYTZkXFx1ZmE3MC1cXHVmYWQ5XFx1ZmIwMC1cXHVmYjA2XFx1ZmIxMy1cXHVmYjE3XFx1ZmIxZFxcdWZiMWYtXFx1ZmIyOFxcdWZiMmEtXFx1ZmIzNlxcdWZiMzgtXFx1ZmIzY1xcdWZiM2VcXHVmYjQwXFx1ZmI0MVxcdWZiNDNcXHVmYjQ0XFx1ZmI0Ni1cXHVmYmIxXFx1ZmJkMy1cXHVmZDNkXFx1ZmQ1MC1cXHVmZDhmXFx1ZmQ5Mi1cXHVmZGM3XFx1ZmRmMC1cXHVmZGZiXFx1ZmU3MC1cXHVmZTc0XFx1ZmU3Ni1cXHVmZWZjXFx1ZmYyMS1cXHVmZjNhXFx1ZmY0MS1cXHVmZjVhXFx1ZmY2Ni1cXHVmZmJlXFx1ZmZjMi1cXHVmZmM3XFx1ZmZjYS1cXHVmZmNmXFx1ZmZkMi1cXHVmZmQ3XFx1ZmZkYS1cXHVmZmRjMC05XFx1MDMwMC1cXHUwMzZmXFx1MDQ4My1cXHUwNDg3XFx1MDU5MS1cXHUwNWJkXFx1MDViZlxcdTA1YzFcXHUwNWMyXFx1MDVjNFxcdTA1YzVcXHUwNWM3XFx1MDYxMC1cXHUwNjFhXFx1MDY0Yi1cXHUwNjY5XFx1MDY3MFxcdTA2ZDYtXFx1MDZkY1xcdTA2ZGYtXFx1MDZlNFxcdTA2ZTdcXHUwNmU4XFx1MDZlYS1cXHUwNmVkXFx1MDZmMC1cXHUwNmY5XFx1MDcxMVxcdTA3MzAtXFx1MDc0YVxcdTA3YTYtXFx1MDdiMFxcdTA3YzAtXFx1MDdjOVxcdTA3ZWItXFx1MDdmM1xcdTA4MTYtXFx1MDgxOVxcdTA4MWItXFx1MDgyM1xcdTA4MjUtXFx1MDgyN1xcdTA4MjktXFx1MDgyZFxcdTA4NTktXFx1MDg1YlxcdTA4ZTQtXFx1MDhmZVxcdTA5MDAtXFx1MDkwM1xcdTA5M2EtXFx1MDkzY1xcdTA5M2UtXFx1MDk0ZlxcdTA5NTEtXFx1MDk1N1xcdTA5NjJcXHUwOTYzXFx1MDk2Ni1cXHUwOTZmXFx1MDk4MS1cXHUwOTgzXFx1MDliY1xcdTA5YmUtXFx1MDljNFxcdTA5YzdcXHUwOWM4XFx1MDljYi1cXHUwOWNkXFx1MDlkN1xcdTA5ZTJcXHUwOWUzXFx1MDllNi1cXHUwOWVmXFx1MGEwMS1cXHUwYTAzXFx1MGEzY1xcdTBhM2UtXFx1MGE0MlxcdTBhNDdcXHUwYTQ4XFx1MGE0Yi1cXHUwYTRkXFx1MGE1MVxcdTBhNjYtXFx1MGE3MVxcdTBhNzVcXHUwYTgxLVxcdTBhODNcXHUwYWJjXFx1MGFiZS1cXHUwYWM1XFx1MGFjNy1cXHUwYWM5XFx1MGFjYi1cXHUwYWNkXFx1MGFlMlxcdTBhZTNcXHUwYWU2LVxcdTBhZWZcXHUwYjAxLVxcdTBiMDNcXHUwYjNjXFx1MGIzZS1cXHUwYjQ0XFx1MGI0N1xcdTBiNDhcXHUwYjRiLVxcdTBiNGRcXHUwYjU2XFx1MGI1N1xcdTBiNjJcXHUwYjYzXFx1MGI2Ni1cXHUwYjZmXFx1MGI4MlxcdTBiYmUtXFx1MGJjMlxcdTBiYzYtXFx1MGJjOFxcdTBiY2EtXFx1MGJjZFxcdTBiZDdcXHUwYmU2LVxcdTBiZWZcXHUwYzAxLVxcdTBjMDNcXHUwYzNlLVxcdTBjNDRcXHUwYzQ2LVxcdTBjNDhcXHUwYzRhLVxcdTBjNGRcXHUwYzU1XFx1MGM1NlxcdTBjNjJcXHUwYzYzXFx1MGM2Ni1cXHUwYzZmXFx1MGM4MlxcdTBjODNcXHUwY2JjXFx1MGNiZS1cXHUwY2M0XFx1MGNjNi1cXHUwY2M4XFx1MGNjYS1cXHUwY2NkXFx1MGNkNVxcdTBjZDZcXHUwY2UyXFx1MGNlM1xcdTBjZTYtXFx1MGNlZlxcdTBkMDJcXHUwZDAzXFx1MGQzZS1cXHUwZDQ0XFx1MGQ0Ni1cXHUwZDQ4XFx1MGQ0YS1cXHUwZDRkXFx1MGQ1N1xcdTBkNjJcXHUwZDYzXFx1MGQ2Ni1cXHUwZDZmXFx1MGQ4MlxcdTBkODNcXHUwZGNhXFx1MGRjZi1cXHUwZGQ0XFx1MGRkNlxcdTBkZDgtXFx1MGRkZlxcdTBkZjJcXHUwZGYzXFx1MGUzMVxcdTBlMzQtXFx1MGUzYVxcdTBlNDctXFx1MGU0ZVxcdTBlNTAtXFx1MGU1OVxcdTBlYjFcXHUwZWI0LVxcdTBlYjlcXHUwZWJiXFx1MGViY1xcdTBlYzgtXFx1MGVjZFxcdTBlZDAtXFx1MGVkOVxcdTBmMThcXHUwZjE5XFx1MGYyMC1cXHUwZjI5XFx1MGYzNVxcdTBmMzdcXHUwZjM5XFx1MGYzZVxcdTBmM2ZcXHUwZjcxLVxcdTBmODRcXHUwZjg2XFx1MGY4N1xcdTBmOGQtXFx1MGY5N1xcdTBmOTktXFx1MGZiY1xcdTBmYzZcXHUxMDJiLVxcdTEwM2VcXHUxMDQwLVxcdTEwNDlcXHUxMDU2LVxcdTEwNTlcXHUxMDVlLVxcdTEwNjBcXHUxMDYyLVxcdTEwNjRcXHUxMDY3LVxcdTEwNmRcXHUxMDcxLVxcdTEwNzRcXHUxMDgyLVxcdTEwOGRcXHUxMDhmLVxcdTEwOWRcXHUxMzVkLVxcdTEzNWZcXHUxNzEyLVxcdTE3MTRcXHUxNzMyLVxcdTE3MzRcXHUxNzUyXFx1MTc1M1xcdTE3NzJcXHUxNzczXFx1MTdiNC1cXHUxN2QzXFx1MTdkZFxcdTE3ZTAtXFx1MTdlOVxcdTE4MGItXFx1MTgwZFxcdTE4MTAtXFx1MTgxOVxcdTE4YTlcXHUxOTIwLVxcdTE5MmJcXHUxOTMwLVxcdTE5M2JcXHUxOTQ2LVxcdTE5NGZcXHUxOWIwLVxcdTE5YzBcXHUxOWM4XFx1MTljOVxcdTE5ZDAtXFx1MTlkOVxcdTFhMTctXFx1MWExYlxcdTFhNTUtXFx1MWE1ZVxcdTFhNjAtXFx1MWE3Y1xcdTFhN2YtXFx1MWE4OVxcdTFhOTAtXFx1MWE5OVxcdTFiMDAtXFx1MWIwNFxcdTFiMzQtXFx1MWI0NFxcdTFiNTAtXFx1MWI1OVxcdTFiNmItXFx1MWI3M1xcdTFiODAtXFx1MWI4MlxcdTFiYTEtXFx1MWJhZFxcdTFiYjAtXFx1MWJiOVxcdTFiZTYtXFx1MWJmM1xcdTFjMjQtXFx1MWMzN1xcdTFjNDAtXFx1MWM0OVxcdTFjNTAtXFx1MWM1OVxcdTFjZDAtXFx1MWNkMlxcdTFjZDQtXFx1MWNlOFxcdTFjZWRcXHUxY2YyLVxcdTFjZjRcXHUxZGMwLVxcdTFkZTZcXHUxZGZjLVxcdTFkZmZcXHUyMDBjXFx1MjAwZFxcdTIwM2ZcXHUyMDQwXFx1MjA1NFxcdTIwZDAtXFx1MjBkY1xcdTIwZTFcXHUyMGU1LVxcdTIwZjBcXHUyY2VmLVxcdTJjZjFcXHUyZDdmXFx1MmRlMC1cXHUyZGZmXFx1MzAyYS1cXHUzMDJmXFx1MzA5OVxcdTMwOWFcXHVhNjIwLVxcdWE2MjlcXHVhNjZmXFx1YTY3NC1cXHVhNjdkXFx1YTY5ZlxcdWE2ZjBcXHVhNmYxXFx1YTgwMlxcdWE4MDZcXHVhODBiXFx1YTgyMy1cXHVhODI3XFx1YTg4MFxcdWE4ODFcXHVhOGI0LVxcdWE4YzRcXHVhOGQwLVxcdWE4ZDlcXHVhOGUwLVxcdWE4ZjFcXHVhOTAwLVxcdWE5MDlcXHVhOTI2LVxcdWE5MmRcXHVhOTQ3LVxcdWE5NTNcXHVhOTgwLVxcdWE5ODNcXHVhOWIzLVxcdWE5YzBcXHVhOWQwLVxcdWE5ZDlcXHVhYTI5LVxcdWFhMzZcXHVhYTQzXFx1YWE0Y1xcdWFhNGRcXHVhYTUwLVxcdWFhNTlcXHVhYTdiXFx1YWFiMFxcdWFhYjItXFx1YWFiNFxcdWFhYjdcXHVhYWI4XFx1YWFiZVxcdWFhYmZcXHVhYWMxXFx1YWFlYi1cXHVhYWVmXFx1YWFmNVxcdWFhZjZcXHVhYmUzLVxcdWFiZWFcXHVhYmVjXFx1YWJlZFxcdWFiZjAtXFx1YWJmOVxcdWZiMWVcXHVmZTAwLVxcdWZlMGZcXHVmZTIwLVxcdWZlMjZcXHVmZTMzXFx1ZmUzNFxcdWZlNGQtXFx1ZmU0ZlxcdWZmMTAtXFx1ZmYxOVxcdWZmM2ZdKiQvLnRlc3Qoc3RyKVxufVxubW9kdWxlLmV4cG9ydHMgPSBpc1Byb3BlcnR5IiwibW9kdWxlLmV4cG9ydHMgICAgICA9IGlzVHlwZWRBcnJheVxuaXNUeXBlZEFycmF5LnN0cmljdCA9IGlzU3RyaWN0VHlwZWRBcnJheVxuaXNUeXBlZEFycmF5Lmxvb3NlICA9IGlzTG9vc2VUeXBlZEFycmF5XG5cbnZhciB0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdcbnZhciBuYW1lcyA9IHtcbiAgICAnW29iamVjdCBJbnQ4QXJyYXldJzogdHJ1ZVxuICAsICdbb2JqZWN0IEludDE2QXJyYXldJzogdHJ1ZVxuICAsICdbb2JqZWN0IEludDMyQXJyYXldJzogdHJ1ZVxuICAsICdbb2JqZWN0IFVpbnQ4QXJyYXldJzogdHJ1ZVxuICAsICdbb2JqZWN0IFVpbnQ4Q2xhbXBlZEFycmF5XSc6IHRydWVcbiAgLCAnW29iamVjdCBVaW50MTZBcnJheV0nOiB0cnVlXG4gICwgJ1tvYmplY3QgVWludDMyQXJyYXldJzogdHJ1ZVxuICAsICdbb2JqZWN0IEZsb2F0MzJBcnJheV0nOiB0cnVlXG4gICwgJ1tvYmplY3QgRmxvYXQ2NEFycmF5XSc6IHRydWVcbn1cblxuZnVuY3Rpb24gaXNUeXBlZEFycmF5KGFycikge1xuICByZXR1cm4gKFxuICAgICAgIGlzU3RyaWN0VHlwZWRBcnJheShhcnIpXG4gICAgfHwgaXNMb29zZVR5cGVkQXJyYXkoYXJyKVxuICApXG59XG5cbmZ1bmN0aW9uIGlzU3RyaWN0VHlwZWRBcnJheShhcnIpIHtcbiAgcmV0dXJuIChcbiAgICAgICBhcnIgaW5zdGFuY2VvZiBJbnQ4QXJyYXlcbiAgICB8fCBhcnIgaW5zdGFuY2VvZiBJbnQxNkFycmF5XG4gICAgfHwgYXJyIGluc3RhbmNlb2YgSW50MzJBcnJheVxuICAgIHx8IGFyciBpbnN0YW5jZW9mIFVpbnQ4QXJyYXlcbiAgICB8fCBhcnIgaW5zdGFuY2VvZiBVaW50OENsYW1wZWRBcnJheVxuICAgIHx8IGFyciBpbnN0YW5jZW9mIFVpbnQxNkFycmF5XG4gICAgfHwgYXJyIGluc3RhbmNlb2YgVWludDMyQXJyYXlcbiAgICB8fCBhcnIgaW5zdGFuY2VvZiBGbG9hdDMyQXJyYXlcbiAgICB8fCBhcnIgaW5zdGFuY2VvZiBGbG9hdDY0QXJyYXlcbiAgKVxufVxuXG5mdW5jdGlvbiBpc0xvb3NlVHlwZWRBcnJheShhcnIpIHtcbiAgcmV0dXJuIG5hbWVzW3RvU3RyaW5nLmNhbGwoYXJyKV1cbn1cbiIsInZhciB2YXJpbnQgPSByZXF1aXJlKCd2YXJpbnQnKVxudmFyIHN0cmVhbSA9IHJlcXVpcmUoJ3JlYWRhYmxlLXN0cmVhbScpXG52YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKVxuXG52YXIgRGVjb2RlciA9IGZ1bmN0aW9uIChvcHRzKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBEZWNvZGVyKSkgcmV0dXJuIG5ldyBEZWNvZGVyKG9wdHMpXG4gIHN0cmVhbS5UcmFuc2Zvcm0uY2FsbCh0aGlzKVxuXG4gIHRoaXMuX21pc3NpbmcgPSAwXG4gIHRoaXMuX21lc3NhZ2UgPSBudWxsXG4gIHRoaXMuX2xpbWl0ID0gb3B0cyAmJiBvcHRzLmxpbWl0IHx8IDBcbiAgdGhpcy5fcHJlZml4ID0gbmV3IEJ1ZmZlcih0aGlzLl9saW1pdCA/IHZhcmludC5lbmNvZGluZ0xlbmd0aCh0aGlzLl9saW1pdCkgOiAxMDApXG4gIHRoaXMuX3B0ciA9IDBcbn1cblxudXRpbC5pbmhlcml0cyhEZWNvZGVyLCBzdHJlYW0uVHJhbnNmb3JtKVxuXG5EZWNvZGVyLnByb3RvdHlwZS5fcHVzaCA9IGZ1bmN0aW9uIChtZXNzYWdlKSB7XG4gIHRoaXMuX3B0ciA9IDBcbiAgdGhpcy5fbWlzc2luZyA9IDBcbiAgdGhpcy5fbWVzc2FnZSA9IG51bGxcbiAgdGhpcy5wdXNoKG1lc3NhZ2UpXG59XG5cbkRlY29kZXIucHJvdG90eXBlLl9wYXJzZUxlbmd0aCA9IGZ1bmN0aW9uIChkYXRhLCBvZmZzZXQpIHtcbiAgZm9yIChvZmZzZXQ7IG9mZnNldCA8IGRhdGEubGVuZ3RoOyBvZmZzZXQrKykge1xuICAgIGlmICh0aGlzLl9wdHIgPj0gdGhpcy5fcHJlZml4Lmxlbmd0aCkgcmV0dXJuIHRoaXMuX3ByZWZpeEVycm9yKGRhdGEpXG4gICAgdGhpcy5fcHJlZml4W3RoaXMuX3B0cisrXSA9IGRhdGFbb2Zmc2V0XVxuICAgIGlmICghKGRhdGFbb2Zmc2V0XSAmIDB4ODApKSB7XG4gICAgICB0aGlzLl9taXNzaW5nID0gdmFyaW50LmRlY29kZSh0aGlzLl9wcmVmaXgpXG4gICAgICBpZiAodGhpcy5fbGltaXQgJiYgdGhpcy5fbWlzc2luZyA+IHRoaXMuX2xpbWl0KSByZXR1cm4gdGhpcy5fcHJlZml4RXJyb3IoZGF0YSlcbiAgICAgIHRoaXMuX3B0ciA9IDBcbiAgICAgIHJldHVybiBvZmZzZXQgKyAxXG4gICAgfVxuICB9XG4gIHJldHVybiBkYXRhLmxlbmd0aFxufVxuXG5EZWNvZGVyLnByb3RvdHlwZS5fcHJlZml4RXJyb3IgPSBmdW5jdGlvbiAoZGF0YSkge1xuICB0aGlzLmVtaXQoJ2Vycm9yJywgbmV3IEVycm9yKCdNZXNzYWdlIGlzIGxhcmdlciB0aGFuIG1heCBsZW5ndGgnKSlcbiAgcmV0dXJuIGRhdGEubGVuZ3RoXG59XG5cbkRlY29kZXIucHJvdG90eXBlLl9wYXJzZU1lc3NhZ2UgPSBmdW5jdGlvbiAoZGF0YSwgb2Zmc2V0KSB7XG4gIHZhciBmcmVlID0gZGF0YS5sZW5ndGggLSBvZmZzZXRcbiAgdmFyIG1pc3NpbmcgPSB0aGlzLl9taXNzaW5nXG5cbiAgaWYgKCF0aGlzLl9tZXNzYWdlKSB7XG4gICAgaWYgKG1pc3NpbmcgPD0gZnJlZSkgeyAvLyBmYXN0IHRyYWNrIC0gbm8gY29weVxuICAgICAgdGhpcy5fcHVzaChkYXRhLnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgbWlzc2luZykpXG4gICAgICByZXR1cm4gb2Zmc2V0ICsgbWlzc2luZ1xuICAgIH1cbiAgICB0aGlzLl9tZXNzYWdlID0gbmV3IEJ1ZmZlcihtaXNzaW5nKVxuICB9XG5cbiAgLy8gVE9ETzogYWRkIG9wdC1pbiBcInBhcnRpYWwgbW9kZVwiIHRvIGNvbXBsZXRlbHkgYXZvaWQgY29weXNcbiAgZGF0YS5jb3B5KHRoaXMuX21lc3NhZ2UsIHRoaXMuX3B0ciwgb2Zmc2V0LCBvZmZzZXQgKyBtaXNzaW5nKVxuXG4gIGlmIChtaXNzaW5nIDw9IGZyZWUpIHtcbiAgICB0aGlzLl9wdXNoKHRoaXMuX21lc3NhZ2UpXG4gICAgcmV0dXJuIG9mZnNldCArIG1pc3NpbmdcbiAgfVxuXG4gIHRoaXMuX21pc3NpbmcgLT0gZnJlZVxuICB0aGlzLl9wdHIgKz0gZnJlZVxuXG4gIHJldHVybiBkYXRhLmxlbmd0aFxufVxuXG5EZWNvZGVyLnByb3RvdHlwZS5fdHJhbnNmb3JtID0gZnVuY3Rpb24gKGRhdGEsIGVuYywgY2IpIHtcbiAgdmFyIG9mZnNldCA9IDBcblxuICB3aGlsZSAob2Zmc2V0IDwgZGF0YS5sZW5ndGgpIHtcbiAgICBpZiAodGhpcy5fbWlzc2luZykgb2Zmc2V0ID0gdGhpcy5fcGFyc2VNZXNzYWdlKGRhdGEsIG9mZnNldClcbiAgICBlbHNlIG9mZnNldCA9IHRoaXMuX3BhcnNlTGVuZ3RoKGRhdGEsIG9mZnNldClcbiAgfVxuXG4gIGNiKClcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBEZWNvZGVyXG4iLCJ2YXIgdmFyaW50ID0gcmVxdWlyZSgndmFyaW50JylcbnZhciBzdHJlYW0gPSByZXF1aXJlKCdyZWFkYWJsZS1zdHJlYW0nKVxudmFyIHV0aWwgPSByZXF1aXJlKCd1dGlsJylcblxudmFyIHBvb2wgPSBuZXcgQnVmZmVyKDEwICogMTAyNClcbnZhciB1c2VkID0gMFxuXG52YXIgRW5jb2RlciA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIEVuY29kZXIpKSByZXR1cm4gbmV3IEVuY29kZXIoKVxuICBzdHJlYW0uVHJhbnNmb3JtLmNhbGwodGhpcylcbn1cblxudXRpbC5pbmhlcml0cyhFbmNvZGVyLCBzdHJlYW0uVHJhbnNmb3JtKVxuXG5FbmNvZGVyLnByb3RvdHlwZS5fdHJhbnNmb3JtID0gZnVuY3Rpb24gKGRhdGEsIGVuYywgY2IpIHtcbiAgdmFyaW50LmVuY29kZShkYXRhLmxlbmd0aCwgcG9vbCwgdXNlZClcbiAgdXNlZCArPSB2YXJpbnQuZW5jb2RlLmJ5dGVzXG5cbiAgdGhpcy5wdXNoKHBvb2wuc2xpY2UodXNlZCAtIHZhcmludC5lbmNvZGUuYnl0ZXMsIHVzZWQpKVxuICB0aGlzLnB1c2goZGF0YSlcblxuICBpZiAocG9vbC5sZW5ndGggLSB1c2VkIDwgMTAwKSB7XG4gICAgcG9vbCA9IG5ldyBCdWZmZXIoMTAgKiAxMDI0KVxuICAgIHVzZWQgPSAwXG4gIH1cblxuICBjYigpXG59XG5cbm1vZHVsZS5leHBvcnRzID0gRW5jb2RlclxuIiwiZXhwb3J0cy5lbmNvZGUgPSByZXF1aXJlKCcuL2VuY29kZScpXG5leHBvcnRzLmRlY29kZSA9IHJlcXVpcmUoJy4vZGVjb2RlJylcbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFkYWJsZTtcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBwcm9jZXNzTmV4dFRpY2sgPSByZXF1aXJlKCdwcm9jZXNzLW5leHRpY2stYXJncycpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBpc0FycmF5ID0gcmVxdWlyZSgnaXNhcnJheScpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBCdWZmZXIgPSByZXF1aXJlKCdidWZmZXInKS5CdWZmZXI7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuUmVhZGFibGUuUmVhZGFibGVTdGF0ZSA9IFJlYWRhYmxlU3RhdGU7XG5cbnZhciBFRSA9IHJlcXVpcmUoJ2V2ZW50cycpO1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIEVFbGlzdGVuZXJDb3VudCA9IGZ1bmN0aW9uKGVtaXR0ZXIsIHR5cGUpIHtcbiAgcmV0dXJuIGVtaXR0ZXIubGlzdGVuZXJzKHR5cGUpLmxlbmd0aDtcbn07XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgU3RyZWFtO1xuKGZ1bmN0aW9uICgpe3RyeXtcbiAgU3RyZWFtID0gcmVxdWlyZSgnc3QnICsgJ3JlYW0nKTtcbn1jYXRjaChfKXt9ZmluYWxseXtcbiAgaWYgKCFTdHJlYW0pXG4gICAgU3RyZWFtID0gcmVxdWlyZSgnZXZlbnRzJykuRXZlbnRFbWl0dGVyO1xufX0oKSlcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG52YXIgQnVmZmVyID0gcmVxdWlyZSgnYnVmZmVyJykuQnVmZmVyO1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIHV0aWwgPSByZXF1aXJlKCdjb3JlLXV0aWwtaXMnKTtcbnV0aWwuaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cblxuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIGRlYnVnVXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcbnZhciBkZWJ1ZztcbmlmIChkZWJ1Z1V0aWwgJiYgZGVidWdVdGlsLmRlYnVnbG9nKSB7XG4gIGRlYnVnID0gZGVidWdVdGlsLmRlYnVnbG9nKCdzdHJlYW0nKTtcbn0gZWxzZSB7XG4gIGRlYnVnID0gZnVuY3Rpb24gKCkge307XG59XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxudmFyIFN0cmluZ0RlY29kZXI7XG5cbnV0aWwuaW5oZXJpdHMoUmVhZGFibGUsIFN0cmVhbSk7XG5cbnZhciBEdXBsZXg7XG5mdW5jdGlvbiBSZWFkYWJsZVN0YXRlKG9wdGlvbnMsIHN0cmVhbSkge1xuICBEdXBsZXggPSBEdXBsZXggfHwgcmVxdWlyZSgnLi9fc3RyZWFtX2R1cGxleCcpO1xuXG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gIC8vIG9iamVjdCBzdHJlYW0gZmxhZy4gVXNlZCB0byBtYWtlIHJlYWQobikgaWdub3JlIG4gYW5kIHRvXG4gIC8vIG1ha2UgYWxsIHRoZSBidWZmZXIgbWVyZ2luZyBhbmQgbGVuZ3RoIGNoZWNrcyBnbyBhd2F5XG4gIHRoaXMub2JqZWN0TW9kZSA9ICEhb3B0aW9ucy5vYmplY3RNb2RlO1xuXG4gIGlmIChzdHJlYW0gaW5zdGFuY2VvZiBEdXBsZXgpXG4gICAgdGhpcy5vYmplY3RNb2RlID0gdGhpcy5vYmplY3RNb2RlIHx8ICEhb3B0aW9ucy5yZWFkYWJsZU9iamVjdE1vZGU7XG5cbiAgLy8gdGhlIHBvaW50IGF0IHdoaWNoIGl0IHN0b3BzIGNhbGxpbmcgX3JlYWQoKSB0byBmaWxsIHRoZSBidWZmZXJcbiAgLy8gTm90ZTogMCBpcyBhIHZhbGlkIHZhbHVlLCBtZWFucyBcImRvbid0IGNhbGwgX3JlYWQgcHJlZW1wdGl2ZWx5IGV2ZXJcIlxuICB2YXIgaHdtID0gb3B0aW9ucy5oaWdoV2F0ZXJNYXJrO1xuICB2YXIgZGVmYXVsdEh3bSA9IHRoaXMub2JqZWN0TW9kZSA/IDE2IDogMTYgKiAxMDI0O1xuICB0aGlzLmhpZ2hXYXRlck1hcmsgPSAoaHdtIHx8IGh3bSA9PT0gMCkgPyBod20gOiBkZWZhdWx0SHdtO1xuXG4gIC8vIGNhc3QgdG8gaW50cy5cbiAgdGhpcy5oaWdoV2F0ZXJNYXJrID0gfn50aGlzLmhpZ2hXYXRlck1hcms7XG5cbiAgdGhpcy5idWZmZXIgPSBbXTtcbiAgdGhpcy5sZW5ndGggPSAwO1xuICB0aGlzLnBpcGVzID0gbnVsbDtcbiAgdGhpcy5waXBlc0NvdW50ID0gMDtcbiAgdGhpcy5mbG93aW5nID0gbnVsbDtcbiAgdGhpcy5lbmRlZCA9IGZhbHNlO1xuICB0aGlzLmVuZEVtaXR0ZWQgPSBmYWxzZTtcbiAgdGhpcy5yZWFkaW5nID0gZmFsc2U7XG5cbiAgLy8gYSBmbGFnIHRvIGJlIGFibGUgdG8gdGVsbCBpZiB0aGUgb253cml0ZSBjYiBpcyBjYWxsZWQgaW1tZWRpYXRlbHksXG4gIC8vIG9yIG9uIGEgbGF0ZXIgdGljay4gIFdlIHNldCB0aGlzIHRvIHRydWUgYXQgZmlyc3QsIGJlY2F1c2UgYW55XG4gIC8vIGFjdGlvbnMgdGhhdCBzaG91bGRuJ3QgaGFwcGVuIHVudGlsIFwibGF0ZXJcIiBzaG91bGQgZ2VuZXJhbGx5IGFsc29cbiAgLy8gbm90IGhhcHBlbiBiZWZvcmUgdGhlIGZpcnN0IHdyaXRlIGNhbGwuXG4gIHRoaXMuc3luYyA9IHRydWU7XG5cbiAgLy8gd2hlbmV2ZXIgd2UgcmV0dXJuIG51bGwsIHRoZW4gd2Ugc2V0IGEgZmxhZyB0byBzYXlcbiAgLy8gdGhhdCB3ZSdyZSBhd2FpdGluZyBhICdyZWFkYWJsZScgZXZlbnQgZW1pc3Npb24uXG4gIHRoaXMubmVlZFJlYWRhYmxlID0gZmFsc2U7XG4gIHRoaXMuZW1pdHRlZFJlYWRhYmxlID0gZmFsc2U7XG4gIHRoaXMucmVhZGFibGVMaXN0ZW5pbmcgPSBmYWxzZTtcblxuICAvLyBDcnlwdG8gaXMga2luZCBvZiBvbGQgYW5kIGNydXN0eS4gIEhpc3RvcmljYWxseSwgaXRzIGRlZmF1bHQgc3RyaW5nXG4gIC8vIGVuY29kaW5nIGlzICdiaW5hcnknIHNvIHdlIGhhdmUgdG8gbWFrZSB0aGlzIGNvbmZpZ3VyYWJsZS5cbiAgLy8gRXZlcnl0aGluZyBlbHNlIGluIHRoZSB1bml2ZXJzZSB1c2VzICd1dGY4JywgdGhvdWdoLlxuICB0aGlzLmRlZmF1bHRFbmNvZGluZyA9IG9wdGlvbnMuZGVmYXVsdEVuY29kaW5nIHx8ICd1dGY4JztcblxuICAvLyB3aGVuIHBpcGluZywgd2Ugb25seSBjYXJlIGFib3V0ICdyZWFkYWJsZScgZXZlbnRzIHRoYXQgaGFwcGVuXG4gIC8vIGFmdGVyIHJlYWQoKWluZyBhbGwgdGhlIGJ5dGVzIGFuZCBub3QgZ2V0dGluZyBhbnkgcHVzaGJhY2suXG4gIHRoaXMucmFuT3V0ID0gZmFsc2U7XG5cbiAgLy8gdGhlIG51bWJlciBvZiB3cml0ZXJzIHRoYXQgYXJlIGF3YWl0aW5nIGEgZHJhaW4gZXZlbnQgaW4gLnBpcGUoKXNcbiAgdGhpcy5hd2FpdERyYWluID0gMDtcblxuICAvLyBpZiB0cnVlLCBhIG1heWJlUmVhZE1vcmUgaGFzIGJlZW4gc2NoZWR1bGVkXG4gIHRoaXMucmVhZGluZ01vcmUgPSBmYWxzZTtcblxuICB0aGlzLmRlY29kZXIgPSBudWxsO1xuICB0aGlzLmVuY29kaW5nID0gbnVsbDtcbiAgaWYgKG9wdGlvbnMuZW5jb2RpbmcpIHtcbiAgICBpZiAoIVN0cmluZ0RlY29kZXIpXG4gICAgICBTdHJpbmdEZWNvZGVyID0gcmVxdWlyZSgnc3RyaW5nX2RlY29kZXIvJykuU3RyaW5nRGVjb2RlcjtcbiAgICB0aGlzLmRlY29kZXIgPSBuZXcgU3RyaW5nRGVjb2RlcihvcHRpb25zLmVuY29kaW5nKTtcbiAgICB0aGlzLmVuY29kaW5nID0gb3B0aW9ucy5lbmNvZGluZztcbiAgfVxufVxuXG52YXIgRHVwbGV4O1xuZnVuY3Rpb24gUmVhZGFibGUob3B0aW9ucykge1xuICBEdXBsZXggPSBEdXBsZXggfHwgcmVxdWlyZSgnLi9fc3RyZWFtX2R1cGxleCcpO1xuXG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBSZWFkYWJsZSkpXG4gICAgcmV0dXJuIG5ldyBSZWFkYWJsZShvcHRpb25zKTtcblxuICB0aGlzLl9yZWFkYWJsZVN0YXRlID0gbmV3IFJlYWRhYmxlU3RhdGUob3B0aW9ucywgdGhpcyk7XG5cbiAgLy8gbGVnYWN5XG4gIHRoaXMucmVhZGFibGUgPSB0cnVlO1xuXG4gIGlmIChvcHRpb25zICYmIHR5cGVvZiBvcHRpb25zLnJlYWQgPT09ICdmdW5jdGlvbicpXG4gICAgdGhpcy5fcmVhZCA9IG9wdGlvbnMucmVhZDtcblxuICBTdHJlYW0uY2FsbCh0aGlzKTtcbn1cblxuLy8gTWFudWFsbHkgc2hvdmUgc29tZXRoaW5nIGludG8gdGhlIHJlYWQoKSBidWZmZXIuXG4vLyBUaGlzIHJldHVybnMgdHJ1ZSBpZiB0aGUgaGlnaFdhdGVyTWFyayBoYXMgbm90IGJlZW4gaGl0IHlldCxcbi8vIHNpbWlsYXIgdG8gaG93IFdyaXRhYmxlLndyaXRlKCkgcmV0dXJucyB0cnVlIGlmIHlvdSBzaG91bGRcbi8vIHdyaXRlKCkgc29tZSBtb3JlLlxuUmVhZGFibGUucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbihjaHVuaywgZW5jb2RpbmcpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcblxuICBpZiAoIXN0YXRlLm9iamVjdE1vZGUgJiYgdHlwZW9mIGNodW5rID09PSAnc3RyaW5nJykge1xuICAgIGVuY29kaW5nID0gZW5jb2RpbmcgfHwgc3RhdGUuZGVmYXVsdEVuY29kaW5nO1xuICAgIGlmIChlbmNvZGluZyAhPT0gc3RhdGUuZW5jb2RpbmcpIHtcbiAgICAgIGNodW5rID0gbmV3IEJ1ZmZlcihjaHVuaywgZW5jb2RpbmcpO1xuICAgICAgZW5jb2RpbmcgPSAnJztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVhZGFibGVBZGRDaHVuayh0aGlzLCBzdGF0ZSwgY2h1bmssIGVuY29kaW5nLCBmYWxzZSk7XG59O1xuXG4vLyBVbnNoaWZ0IHNob3VsZCAqYWx3YXlzKiBiZSBzb21ldGhpbmcgZGlyZWN0bHkgb3V0IG9mIHJlYWQoKVxuUmVhZGFibGUucHJvdG90eXBlLnVuc2hpZnQgPSBmdW5jdGlvbihjaHVuaykge1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICByZXR1cm4gcmVhZGFibGVBZGRDaHVuayh0aGlzLCBzdGF0ZSwgY2h1bmssICcnLCB0cnVlKTtcbn07XG5cblJlYWRhYmxlLnByb3RvdHlwZS5pc1BhdXNlZCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nID09PSBmYWxzZTtcbn07XG5cbmZ1bmN0aW9uIHJlYWRhYmxlQWRkQ2h1bmsoc3RyZWFtLCBzdGF0ZSwgY2h1bmssIGVuY29kaW5nLCBhZGRUb0Zyb250KSB7XG4gIHZhciBlciA9IGNodW5rSW52YWxpZChzdGF0ZSwgY2h1bmspO1xuICBpZiAoZXIpIHtcbiAgICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcik7XG4gIH0gZWxzZSBpZiAoY2h1bmsgPT09IG51bGwpIHtcbiAgICBzdGF0ZS5yZWFkaW5nID0gZmFsc2U7XG4gICAgb25Fb2ZDaHVuayhzdHJlYW0sIHN0YXRlKTtcbiAgfSBlbHNlIGlmIChzdGF0ZS5vYmplY3RNb2RlIHx8IGNodW5rICYmIGNodW5rLmxlbmd0aCA+IDApIHtcbiAgICBpZiAoc3RhdGUuZW5kZWQgJiYgIWFkZFRvRnJvbnQpIHtcbiAgICAgIHZhciBlID0gbmV3IEVycm9yKCdzdHJlYW0ucHVzaCgpIGFmdGVyIEVPRicpO1xuICAgICAgc3RyZWFtLmVtaXQoJ2Vycm9yJywgZSk7XG4gICAgfSBlbHNlIGlmIChzdGF0ZS5lbmRFbWl0dGVkICYmIGFkZFRvRnJvbnQpIHtcbiAgICAgIHZhciBlID0gbmV3IEVycm9yKCdzdHJlYW0udW5zaGlmdCgpIGFmdGVyIGVuZCBldmVudCcpO1xuICAgICAgc3RyZWFtLmVtaXQoJ2Vycm9yJywgZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChzdGF0ZS5kZWNvZGVyICYmICFhZGRUb0Zyb250ICYmICFlbmNvZGluZylcbiAgICAgICAgY2h1bmsgPSBzdGF0ZS5kZWNvZGVyLndyaXRlKGNodW5rKTtcblxuICAgICAgaWYgKCFhZGRUb0Zyb250KVxuICAgICAgICBzdGF0ZS5yZWFkaW5nID0gZmFsc2U7XG5cbiAgICAgIC8vIGlmIHdlIHdhbnQgdGhlIGRhdGEgbm93LCBqdXN0IGVtaXQgaXQuXG4gICAgICBpZiAoc3RhdGUuZmxvd2luZyAmJiBzdGF0ZS5sZW5ndGggPT09IDAgJiYgIXN0YXRlLnN5bmMpIHtcbiAgICAgICAgc3RyZWFtLmVtaXQoJ2RhdGEnLCBjaHVuayk7XG4gICAgICAgIHN0cmVhbS5yZWFkKDApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gdXBkYXRlIHRoZSBidWZmZXIgaW5mby5cbiAgICAgICAgc3RhdGUubGVuZ3RoICs9IHN0YXRlLm9iamVjdE1vZGUgPyAxIDogY2h1bmsubGVuZ3RoO1xuICAgICAgICBpZiAoYWRkVG9Gcm9udClcbiAgICAgICAgICBzdGF0ZS5idWZmZXIudW5zaGlmdChjaHVuayk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICBzdGF0ZS5idWZmZXIucHVzaChjaHVuayk7XG5cbiAgICAgICAgaWYgKHN0YXRlLm5lZWRSZWFkYWJsZSlcbiAgICAgICAgICBlbWl0UmVhZGFibGUoc3RyZWFtKTtcbiAgICAgIH1cblxuICAgICAgbWF5YmVSZWFkTW9yZShzdHJlYW0sIHN0YXRlKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoIWFkZFRvRnJvbnQpIHtcbiAgICBzdGF0ZS5yZWFkaW5nID0gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gbmVlZE1vcmVEYXRhKHN0YXRlKTtcbn1cblxuXG4vLyBpZiBpdCdzIHBhc3QgdGhlIGhpZ2ggd2F0ZXIgbWFyaywgd2UgY2FuIHB1c2ggaW4gc29tZSBtb3JlLlxuLy8gQWxzbywgaWYgd2UgaGF2ZSBubyBkYXRhIHlldCwgd2UgY2FuIHN0YW5kIHNvbWVcbi8vIG1vcmUgYnl0ZXMuICBUaGlzIGlzIHRvIHdvcmsgYXJvdW5kIGNhc2VzIHdoZXJlIGh3bT0wLFxuLy8gc3VjaCBhcyB0aGUgcmVwbC4gIEFsc28sIGlmIHRoZSBwdXNoKCkgdHJpZ2dlcmVkIGFcbi8vIHJlYWRhYmxlIGV2ZW50LCBhbmQgdGhlIHVzZXIgY2FsbGVkIHJlYWQobGFyZ2VOdW1iZXIpIHN1Y2ggdGhhdFxuLy8gbmVlZFJlYWRhYmxlIHdhcyBzZXQsIHRoZW4gd2Ugb3VnaHQgdG8gcHVzaCBtb3JlLCBzbyB0aGF0IGFub3RoZXJcbi8vICdyZWFkYWJsZScgZXZlbnQgd2lsbCBiZSB0cmlnZ2VyZWQuXG5mdW5jdGlvbiBuZWVkTW9yZURhdGEoc3RhdGUpIHtcbiAgcmV0dXJuICFzdGF0ZS5lbmRlZCAmJlxuICAgICAgICAgKHN0YXRlLm5lZWRSZWFkYWJsZSB8fFxuICAgICAgICAgIHN0YXRlLmxlbmd0aCA8IHN0YXRlLmhpZ2hXYXRlck1hcmsgfHxcbiAgICAgICAgICBzdGF0ZS5sZW5ndGggPT09IDApO1xufVxuXG4vLyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS5cblJlYWRhYmxlLnByb3RvdHlwZS5zZXRFbmNvZGluZyA9IGZ1bmN0aW9uKGVuYykge1xuICBpZiAoIVN0cmluZ0RlY29kZXIpXG4gICAgU3RyaW5nRGVjb2RlciA9IHJlcXVpcmUoJ3N0cmluZ19kZWNvZGVyLycpLlN0cmluZ0RlY29kZXI7XG4gIHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVjb2RlciA9IG5ldyBTdHJpbmdEZWNvZGVyKGVuYyk7XG4gIHRoaXMuX3JlYWRhYmxlU3RhdGUuZW5jb2RpbmcgPSBlbmM7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLy8gRG9uJ3QgcmFpc2UgdGhlIGh3bSA+IDhNQlxudmFyIE1BWF9IV00gPSAweDgwMDAwMDtcbmZ1bmN0aW9uIGNvbXB1dGVOZXdIaWdoV2F0ZXJNYXJrKG4pIHtcbiAgaWYgKG4gPj0gTUFYX0hXTSkge1xuICAgIG4gPSBNQVhfSFdNO1xuICB9IGVsc2Uge1xuICAgIC8vIEdldCB0aGUgbmV4dCBoaWdoZXN0IHBvd2VyIG9mIDJcbiAgICBuLS07XG4gICAgbiB8PSBuID4+PiAxO1xuICAgIG4gfD0gbiA+Pj4gMjtcbiAgICBuIHw9IG4gPj4+IDQ7XG4gICAgbiB8PSBuID4+PiA4O1xuICAgIG4gfD0gbiA+Pj4gMTY7XG4gICAgbisrO1xuICB9XG4gIHJldHVybiBuO1xufVxuXG5mdW5jdGlvbiBob3dNdWNoVG9SZWFkKG4sIHN0YXRlKSB7XG4gIGlmIChzdGF0ZS5sZW5ndGggPT09IDAgJiYgc3RhdGUuZW5kZWQpXG4gICAgcmV0dXJuIDA7XG5cbiAgaWYgKHN0YXRlLm9iamVjdE1vZGUpXG4gICAgcmV0dXJuIG4gPT09IDAgPyAwIDogMTtcblxuICBpZiAobiA9PT0gbnVsbCB8fCBpc05hTihuKSkge1xuICAgIC8vIG9ubHkgZmxvdyBvbmUgYnVmZmVyIGF0IGEgdGltZVxuICAgIGlmIChzdGF0ZS5mbG93aW5nICYmIHN0YXRlLmJ1ZmZlci5sZW5ndGgpXG4gICAgICByZXR1cm4gc3RhdGUuYnVmZmVyWzBdLmxlbmd0aDtcbiAgICBlbHNlXG4gICAgICByZXR1cm4gc3RhdGUubGVuZ3RoO1xuICB9XG5cbiAgaWYgKG4gPD0gMClcbiAgICByZXR1cm4gMDtcblxuICAvLyBJZiB3ZSdyZSBhc2tpbmcgZm9yIG1vcmUgdGhhbiB0aGUgdGFyZ2V0IGJ1ZmZlciBsZXZlbCxcbiAgLy8gdGhlbiByYWlzZSB0aGUgd2F0ZXIgbWFyay4gIEJ1bXAgdXAgdG8gdGhlIG5leHQgaGlnaGVzdFxuICAvLyBwb3dlciBvZiAyLCB0byBwcmV2ZW50IGluY3JlYXNpbmcgaXQgZXhjZXNzaXZlbHkgaW4gdGlueVxuICAvLyBhbW91bnRzLlxuICBpZiAobiA+IHN0YXRlLmhpZ2hXYXRlck1hcmspXG4gICAgc3RhdGUuaGlnaFdhdGVyTWFyayA9IGNvbXB1dGVOZXdIaWdoV2F0ZXJNYXJrKG4pO1xuXG4gIC8vIGRvbid0IGhhdmUgdGhhdCBtdWNoLiAgcmV0dXJuIG51bGwsIHVubGVzcyB3ZSd2ZSBlbmRlZC5cbiAgaWYgKG4gPiBzdGF0ZS5sZW5ndGgpIHtcbiAgICBpZiAoIXN0YXRlLmVuZGVkKSB7XG4gICAgICBzdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlO1xuICAgICAgcmV0dXJuIDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBzdGF0ZS5sZW5ndGg7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG47XG59XG5cbi8vIHlvdSBjYW4gb3ZlcnJpZGUgZWl0aGVyIHRoaXMgbWV0aG9kLCBvciB0aGUgYXN5bmMgX3JlYWQobikgYmVsb3cuXG5SZWFkYWJsZS5wcm90b3R5cGUucmVhZCA9IGZ1bmN0aW9uKG4pIHtcbiAgZGVidWcoJ3JlYWQnLCBuKTtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgdmFyIG5PcmlnID0gbjtcblxuICBpZiAodHlwZW9mIG4gIT09ICdudW1iZXInIHx8IG4gPiAwKVxuICAgIHN0YXRlLmVtaXR0ZWRSZWFkYWJsZSA9IGZhbHNlO1xuXG4gIC8vIGlmIHdlJ3JlIGRvaW5nIHJlYWQoMCkgdG8gdHJpZ2dlciBhIHJlYWRhYmxlIGV2ZW50LCBidXQgd2VcbiAgLy8gYWxyZWFkeSBoYXZlIGEgYnVuY2ggb2YgZGF0YSBpbiB0aGUgYnVmZmVyLCB0aGVuIGp1c3QgdHJpZ2dlclxuICAvLyB0aGUgJ3JlYWRhYmxlJyBldmVudCBhbmQgbW92ZSBvbi5cbiAgaWYgKG4gPT09IDAgJiZcbiAgICAgIHN0YXRlLm5lZWRSZWFkYWJsZSAmJlxuICAgICAgKHN0YXRlLmxlbmd0aCA+PSBzdGF0ZS5oaWdoV2F0ZXJNYXJrIHx8IHN0YXRlLmVuZGVkKSkge1xuICAgIGRlYnVnKCdyZWFkOiBlbWl0UmVhZGFibGUnLCBzdGF0ZS5sZW5ndGgsIHN0YXRlLmVuZGVkKTtcbiAgICBpZiAoc3RhdGUubGVuZ3RoID09PSAwICYmIHN0YXRlLmVuZGVkKVxuICAgICAgZW5kUmVhZGFibGUodGhpcyk7XG4gICAgZWxzZVxuICAgICAgZW1pdFJlYWRhYmxlKHRoaXMpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgbiA9IGhvd011Y2hUb1JlYWQobiwgc3RhdGUpO1xuXG4gIC8vIGlmIHdlJ3ZlIGVuZGVkLCBhbmQgd2UncmUgbm93IGNsZWFyLCB0aGVuIGZpbmlzaCBpdCB1cC5cbiAgaWYgKG4gPT09IDAgJiYgc3RhdGUuZW5kZWQpIHtcbiAgICBpZiAoc3RhdGUubGVuZ3RoID09PSAwKVxuICAgICAgZW5kUmVhZGFibGUodGhpcyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyBBbGwgdGhlIGFjdHVhbCBjaHVuayBnZW5lcmF0aW9uIGxvZ2ljIG5lZWRzIHRvIGJlXG4gIC8vICpiZWxvdyogdGhlIGNhbGwgdG8gX3JlYWQuICBUaGUgcmVhc29uIGlzIHRoYXQgaW4gY2VydGFpblxuICAvLyBzeW50aGV0aWMgc3RyZWFtIGNhc2VzLCBzdWNoIGFzIHBhc3N0aHJvdWdoIHN0cmVhbXMsIF9yZWFkXG4gIC8vIG1heSBiZSBhIGNvbXBsZXRlbHkgc3luY2hyb25vdXMgb3BlcmF0aW9uIHdoaWNoIG1heSBjaGFuZ2VcbiAgLy8gdGhlIHN0YXRlIG9mIHRoZSByZWFkIGJ1ZmZlciwgcHJvdmlkaW5nIGVub3VnaCBkYXRhIHdoZW5cbiAgLy8gYmVmb3JlIHRoZXJlIHdhcyAqbm90KiBlbm91Z2guXG4gIC8vXG4gIC8vIFNvLCB0aGUgc3RlcHMgYXJlOlxuICAvLyAxLiBGaWd1cmUgb3V0IHdoYXQgdGhlIHN0YXRlIG9mIHRoaW5ncyB3aWxsIGJlIGFmdGVyIHdlIGRvXG4gIC8vIGEgcmVhZCBmcm9tIHRoZSBidWZmZXIuXG4gIC8vXG4gIC8vIDIuIElmIHRoYXQgcmVzdWx0aW5nIHN0YXRlIHdpbGwgdHJpZ2dlciBhIF9yZWFkLCB0aGVuIGNhbGwgX3JlYWQuXG4gIC8vIE5vdGUgdGhhdCB0aGlzIG1heSBiZSBhc3luY2hyb25vdXMsIG9yIHN5bmNocm9ub3VzLiAgWWVzLCBpdCBpc1xuICAvLyBkZWVwbHkgdWdseSB0byB3cml0ZSBBUElzIHRoaXMgd2F5LCBidXQgdGhhdCBzdGlsbCBkb2Vzbid0IG1lYW5cbiAgLy8gdGhhdCB0aGUgUmVhZGFibGUgY2xhc3Mgc2hvdWxkIGJlaGF2ZSBpbXByb3Blcmx5LCBhcyBzdHJlYW1zIGFyZVxuICAvLyBkZXNpZ25lZCB0byBiZSBzeW5jL2FzeW5jIGFnbm9zdGljLlxuICAvLyBUYWtlIG5vdGUgaWYgdGhlIF9yZWFkIGNhbGwgaXMgc3luYyBvciBhc3luYyAoaWUsIGlmIHRoZSByZWFkIGNhbGxcbiAgLy8gaGFzIHJldHVybmVkIHlldCksIHNvIHRoYXQgd2Uga25vdyB3aGV0aGVyIG9yIG5vdCBpdCdzIHNhZmUgdG8gZW1pdFxuICAvLyAncmVhZGFibGUnIGV0Yy5cbiAgLy9cbiAgLy8gMy4gQWN0dWFsbHkgcHVsbCB0aGUgcmVxdWVzdGVkIGNodW5rcyBvdXQgb2YgdGhlIGJ1ZmZlciBhbmQgcmV0dXJuLlxuXG4gIC8vIGlmIHdlIG5lZWQgYSByZWFkYWJsZSBldmVudCwgdGhlbiB3ZSBuZWVkIHRvIGRvIHNvbWUgcmVhZGluZy5cbiAgdmFyIGRvUmVhZCA9IHN0YXRlLm5lZWRSZWFkYWJsZTtcbiAgZGVidWcoJ25lZWQgcmVhZGFibGUnLCBkb1JlYWQpO1xuXG4gIC8vIGlmIHdlIGN1cnJlbnRseSBoYXZlIGxlc3MgdGhhbiB0aGUgaGlnaFdhdGVyTWFyaywgdGhlbiBhbHNvIHJlYWQgc29tZVxuICBpZiAoc3RhdGUubGVuZ3RoID09PSAwIHx8IHN0YXRlLmxlbmd0aCAtIG4gPCBzdGF0ZS5oaWdoV2F0ZXJNYXJrKSB7XG4gICAgZG9SZWFkID0gdHJ1ZTtcbiAgICBkZWJ1ZygnbGVuZ3RoIGxlc3MgdGhhbiB3YXRlcm1hcmsnLCBkb1JlYWQpO1xuICB9XG5cbiAgLy8gaG93ZXZlciwgaWYgd2UndmUgZW5kZWQsIHRoZW4gdGhlcmUncyBubyBwb2ludCwgYW5kIGlmIHdlJ3JlIGFscmVhZHlcbiAgLy8gcmVhZGluZywgdGhlbiBpdCdzIHVubmVjZXNzYXJ5LlxuICBpZiAoc3RhdGUuZW5kZWQgfHwgc3RhdGUucmVhZGluZykge1xuICAgIGRvUmVhZCA9IGZhbHNlO1xuICAgIGRlYnVnKCdyZWFkaW5nIG9yIGVuZGVkJywgZG9SZWFkKTtcbiAgfVxuXG4gIGlmIChkb1JlYWQpIHtcbiAgICBkZWJ1ZygnZG8gcmVhZCcpO1xuICAgIHN0YXRlLnJlYWRpbmcgPSB0cnVlO1xuICAgIHN0YXRlLnN5bmMgPSB0cnVlO1xuICAgIC8vIGlmIHRoZSBsZW5ndGggaXMgY3VycmVudGx5IHplcm8sIHRoZW4gd2UgKm5lZWQqIGEgcmVhZGFibGUgZXZlbnQuXG4gICAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMClcbiAgICAgIHN0YXRlLm5lZWRSZWFkYWJsZSA9IHRydWU7XG4gICAgLy8gY2FsbCBpbnRlcm5hbCByZWFkIG1ldGhvZFxuICAgIHRoaXMuX3JlYWQoc3RhdGUuaGlnaFdhdGVyTWFyayk7XG4gICAgc3RhdGUuc3luYyA9IGZhbHNlO1xuICB9XG5cbiAgLy8gSWYgX3JlYWQgcHVzaGVkIGRhdGEgc3luY2hyb25vdXNseSwgdGhlbiBgcmVhZGluZ2Agd2lsbCBiZSBmYWxzZSxcbiAgLy8gYW5kIHdlIG5lZWQgdG8gcmUtZXZhbHVhdGUgaG93IG11Y2ggZGF0YSB3ZSBjYW4gcmV0dXJuIHRvIHRoZSB1c2VyLlxuICBpZiAoZG9SZWFkICYmICFzdGF0ZS5yZWFkaW5nKVxuICAgIG4gPSBob3dNdWNoVG9SZWFkKG5PcmlnLCBzdGF0ZSk7XG5cbiAgdmFyIHJldDtcbiAgaWYgKG4gPiAwKVxuICAgIHJldCA9IGZyb21MaXN0KG4sIHN0YXRlKTtcbiAgZWxzZVxuICAgIHJldCA9IG51bGw7XG5cbiAgaWYgKHJldCA9PT0gbnVsbCkge1xuICAgIHN0YXRlLm5lZWRSZWFkYWJsZSA9IHRydWU7XG4gICAgbiA9IDA7XG4gIH1cblxuICBzdGF0ZS5sZW5ndGggLT0gbjtcblxuICAvLyBJZiB3ZSBoYXZlIG5vdGhpbmcgaW4gdGhlIGJ1ZmZlciwgdGhlbiB3ZSB3YW50IHRvIGtub3dcbiAgLy8gYXMgc29vbiBhcyB3ZSAqZG8qIGdldCBzb21ldGhpbmcgaW50byB0aGUgYnVmZmVyLlxuICBpZiAoc3RhdGUubGVuZ3RoID09PSAwICYmICFzdGF0ZS5lbmRlZClcbiAgICBzdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlO1xuXG4gIC8vIElmIHdlIHRyaWVkIHRvIHJlYWQoKSBwYXN0IHRoZSBFT0YsIHRoZW4gZW1pdCBlbmQgb24gdGhlIG5leHQgdGljay5cbiAgaWYgKG5PcmlnICE9PSBuICYmIHN0YXRlLmVuZGVkICYmIHN0YXRlLmxlbmd0aCA9PT0gMClcbiAgICBlbmRSZWFkYWJsZSh0aGlzKTtcblxuICBpZiAocmV0ICE9PSBudWxsKVxuICAgIHRoaXMuZW1pdCgnZGF0YScsIHJldCk7XG5cbiAgcmV0dXJuIHJldDtcbn07XG5cbmZ1bmN0aW9uIGNodW5rSW52YWxpZChzdGF0ZSwgY2h1bmspIHtcbiAgdmFyIGVyID0gbnVsbDtcbiAgaWYgKCEoQnVmZmVyLmlzQnVmZmVyKGNodW5rKSkgJiZcbiAgICAgIHR5cGVvZiBjaHVuayAhPT0gJ3N0cmluZycgJiZcbiAgICAgIGNodW5rICE9PSBudWxsICYmXG4gICAgICBjaHVuayAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAhc3RhdGUub2JqZWN0TW9kZSkge1xuICAgIGVyID0gbmV3IFR5cGVFcnJvcignSW52YWxpZCBub24tc3RyaW5nL2J1ZmZlciBjaHVuaycpO1xuICB9XG4gIHJldHVybiBlcjtcbn1cblxuXG5mdW5jdGlvbiBvbkVvZkNodW5rKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKHN0YXRlLmVuZGVkKSByZXR1cm47XG4gIGlmIChzdGF0ZS5kZWNvZGVyKSB7XG4gICAgdmFyIGNodW5rID0gc3RhdGUuZGVjb2Rlci5lbmQoKTtcbiAgICBpZiAoY2h1bmsgJiYgY2h1bmsubGVuZ3RoKSB7XG4gICAgICBzdGF0ZS5idWZmZXIucHVzaChjaHVuayk7XG4gICAgICBzdGF0ZS5sZW5ndGggKz0gc3RhdGUub2JqZWN0TW9kZSA/IDEgOiBjaHVuay5sZW5ndGg7XG4gICAgfVxuICB9XG4gIHN0YXRlLmVuZGVkID0gdHJ1ZTtcblxuICAvLyBlbWl0ICdyZWFkYWJsZScgbm93IHRvIG1ha2Ugc3VyZSBpdCBnZXRzIHBpY2tlZCB1cC5cbiAgZW1pdFJlYWRhYmxlKHN0cmVhbSk7XG59XG5cbi8vIERvbid0IGVtaXQgcmVhZGFibGUgcmlnaHQgYXdheSBpbiBzeW5jIG1vZGUsIGJlY2F1c2UgdGhpcyBjYW4gdHJpZ2dlclxuLy8gYW5vdGhlciByZWFkKCkgY2FsbCA9PiBzdGFjayBvdmVyZmxvdy4gIFRoaXMgd2F5LCBpdCBtaWdodCB0cmlnZ2VyXG4vLyBhIG5leHRUaWNrIHJlY3Vyc2lvbiB3YXJuaW5nLCBidXQgdGhhdCdzIG5vdCBzbyBiYWQuXG5mdW5jdGlvbiBlbWl0UmVhZGFibGUoc3RyZWFtKSB7XG4gIHZhciBzdGF0ZSA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZTtcbiAgc3RhdGUubmVlZFJlYWRhYmxlID0gZmFsc2U7XG4gIGlmICghc3RhdGUuZW1pdHRlZFJlYWRhYmxlKSB7XG4gICAgZGVidWcoJ2VtaXRSZWFkYWJsZScsIHN0YXRlLmZsb3dpbmcpO1xuICAgIHN0YXRlLmVtaXR0ZWRSZWFkYWJsZSA9IHRydWU7XG4gICAgaWYgKHN0YXRlLnN5bmMpXG4gICAgICBwcm9jZXNzTmV4dFRpY2soZW1pdFJlYWRhYmxlXywgc3RyZWFtKTtcbiAgICBlbHNlXG4gICAgICBlbWl0UmVhZGFibGVfKHN0cmVhbSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZW1pdFJlYWRhYmxlXyhzdHJlYW0pIHtcbiAgZGVidWcoJ2VtaXQgcmVhZGFibGUnKTtcbiAgc3RyZWFtLmVtaXQoJ3JlYWRhYmxlJyk7XG4gIGZsb3coc3RyZWFtKTtcbn1cblxuXG4vLyBhdCB0aGlzIHBvaW50LCB0aGUgdXNlciBoYXMgcHJlc3VtYWJseSBzZWVuIHRoZSAncmVhZGFibGUnIGV2ZW50LFxuLy8gYW5kIGNhbGxlZCByZWFkKCkgdG8gY29uc3VtZSBzb21lIGRhdGEuICB0aGF0IG1heSBoYXZlIHRyaWdnZXJlZFxuLy8gaW4gdHVybiBhbm90aGVyIF9yZWFkKG4pIGNhbGwsIGluIHdoaWNoIGNhc2UgcmVhZGluZyA9IHRydWUgaWZcbi8vIGl0J3MgaW4gcHJvZ3Jlc3MuXG4vLyBIb3dldmVyLCBpZiB3ZSdyZSBub3QgZW5kZWQsIG9yIHJlYWRpbmcsIGFuZCB0aGUgbGVuZ3RoIDwgaHdtLFxuLy8gdGhlbiBnbyBhaGVhZCBhbmQgdHJ5IHRvIHJlYWQgc29tZSBtb3JlIHByZWVtcHRpdmVseS5cbmZ1bmN0aW9uIG1heWJlUmVhZE1vcmUoc3RyZWFtLCBzdGF0ZSkge1xuICBpZiAoIXN0YXRlLnJlYWRpbmdNb3JlKSB7XG4gICAgc3RhdGUucmVhZGluZ01vcmUgPSB0cnVlO1xuICAgIHByb2Nlc3NOZXh0VGljayhtYXliZVJlYWRNb3JlXywgc3RyZWFtLCBzdGF0ZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbWF5YmVSZWFkTW9yZV8oc3RyZWFtLCBzdGF0ZSkge1xuICB2YXIgbGVuID0gc3RhdGUubGVuZ3RoO1xuICB3aGlsZSAoIXN0YXRlLnJlYWRpbmcgJiYgIXN0YXRlLmZsb3dpbmcgJiYgIXN0YXRlLmVuZGVkICYmXG4gICAgICAgICBzdGF0ZS5sZW5ndGggPCBzdGF0ZS5oaWdoV2F0ZXJNYXJrKSB7XG4gICAgZGVidWcoJ21heWJlUmVhZE1vcmUgcmVhZCAwJyk7XG4gICAgc3RyZWFtLnJlYWQoMCk7XG4gICAgaWYgKGxlbiA9PT0gc3RhdGUubGVuZ3RoKVxuICAgICAgLy8gZGlkbid0IGdldCBhbnkgZGF0YSwgc3RvcCBzcGlubmluZy5cbiAgICAgIGJyZWFrO1xuICAgIGVsc2VcbiAgICAgIGxlbiA9IHN0YXRlLmxlbmd0aDtcbiAgfVxuICBzdGF0ZS5yZWFkaW5nTW9yZSA9IGZhbHNlO1xufVxuXG4vLyBhYnN0cmFjdCBtZXRob2QuICB0byBiZSBvdmVycmlkZGVuIGluIHNwZWNpZmljIGltcGxlbWVudGF0aW9uIGNsYXNzZXMuXG4vLyBjYWxsIGNiKGVyLCBkYXRhKSB3aGVyZSBkYXRhIGlzIDw9IG4gaW4gbGVuZ3RoLlxuLy8gZm9yIHZpcnR1YWwgKG5vbi1zdHJpbmcsIG5vbi1idWZmZXIpIHN0cmVhbXMsIFwibGVuZ3RoXCIgaXMgc29tZXdoYXRcbi8vIGFyYml0cmFyeSwgYW5kIHBlcmhhcHMgbm90IHZlcnkgbWVhbmluZ2Z1bC5cblJlYWRhYmxlLnByb3RvdHlwZS5fcmVhZCA9IGZ1bmN0aW9uKG4pIHtcbiAgdGhpcy5lbWl0KCdlcnJvcicsIG5ldyBFcnJvcignbm90IGltcGxlbWVudGVkJykpO1xufTtcblxuUmVhZGFibGUucHJvdG90eXBlLnBpcGUgPSBmdW5jdGlvbihkZXN0LCBwaXBlT3B0cykge1xuICB2YXIgc3JjID0gdGhpcztcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcblxuICBzd2l0Y2ggKHN0YXRlLnBpcGVzQ291bnQpIHtcbiAgICBjYXNlIDA6XG4gICAgICBzdGF0ZS5waXBlcyA9IGRlc3Q7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDE6XG4gICAgICBzdGF0ZS5waXBlcyA9IFtzdGF0ZS5waXBlcywgZGVzdF07XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgc3RhdGUucGlwZXMucHVzaChkZXN0KTtcbiAgICAgIGJyZWFrO1xuICB9XG4gIHN0YXRlLnBpcGVzQ291bnQgKz0gMTtcbiAgZGVidWcoJ3BpcGUgY291bnQ9JWQgb3B0cz0laicsIHN0YXRlLnBpcGVzQ291bnQsIHBpcGVPcHRzKTtcblxuICB2YXIgZG9FbmQgPSAoIXBpcGVPcHRzIHx8IHBpcGVPcHRzLmVuZCAhPT0gZmFsc2UpICYmXG4gICAgICAgICAgICAgIGRlc3QgIT09IHByb2Nlc3Muc3Rkb3V0ICYmXG4gICAgICAgICAgICAgIGRlc3QgIT09IHByb2Nlc3Muc3RkZXJyO1xuXG4gIHZhciBlbmRGbiA9IGRvRW5kID8gb25lbmQgOiBjbGVhbnVwO1xuICBpZiAoc3RhdGUuZW5kRW1pdHRlZClcbiAgICBwcm9jZXNzTmV4dFRpY2soZW5kRm4pO1xuICBlbHNlXG4gICAgc3JjLm9uY2UoJ2VuZCcsIGVuZEZuKTtcblxuICBkZXN0Lm9uKCd1bnBpcGUnLCBvbnVucGlwZSk7XG4gIGZ1bmN0aW9uIG9udW5waXBlKHJlYWRhYmxlKSB7XG4gICAgZGVidWcoJ29udW5waXBlJyk7XG4gICAgaWYgKHJlYWRhYmxlID09PSBzcmMpIHtcbiAgICAgIGNsZWFudXAoKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBvbmVuZCgpIHtcbiAgICBkZWJ1Zygnb25lbmQnKTtcbiAgICBkZXN0LmVuZCgpO1xuICB9XG5cbiAgLy8gd2hlbiB0aGUgZGVzdCBkcmFpbnMsIGl0IHJlZHVjZXMgdGhlIGF3YWl0RHJhaW4gY291bnRlclxuICAvLyBvbiB0aGUgc291cmNlLiAgVGhpcyB3b3VsZCBiZSBtb3JlIGVsZWdhbnQgd2l0aCBhIC5vbmNlKClcbiAgLy8gaGFuZGxlciBpbiBmbG93KCksIGJ1dCBhZGRpbmcgYW5kIHJlbW92aW5nIHJlcGVhdGVkbHkgaXNcbiAgLy8gdG9vIHNsb3cuXG4gIHZhciBvbmRyYWluID0gcGlwZU9uRHJhaW4oc3JjKTtcbiAgZGVzdC5vbignZHJhaW4nLCBvbmRyYWluKTtcblxuICB2YXIgY2xlYW5lZFVwID0gZmFsc2U7XG4gIGZ1bmN0aW9uIGNsZWFudXAoKSB7XG4gICAgZGVidWcoJ2NsZWFudXAnKTtcbiAgICAvLyBjbGVhbnVwIGV2ZW50IGhhbmRsZXJzIG9uY2UgdGhlIHBpcGUgaXMgYnJva2VuXG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLCBvbmNsb3NlKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdmaW5pc2gnLCBvbmZpbmlzaCk7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZHJhaW4nLCBvbmRyYWluKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdlcnJvcicsIG9uZXJyb3IpO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ3VucGlwZScsIG9udW5waXBlKTtcbiAgICBzcmMucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIG9uZW5kKTtcbiAgICBzcmMucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIGNsZWFudXApO1xuICAgIHNyYy5yZW1vdmVMaXN0ZW5lcignZGF0YScsIG9uZGF0YSk7XG5cbiAgICBjbGVhbmVkVXAgPSB0cnVlO1xuXG4gICAgLy8gaWYgdGhlIHJlYWRlciBpcyB3YWl0aW5nIGZvciBhIGRyYWluIGV2ZW50IGZyb20gdGhpc1xuICAgIC8vIHNwZWNpZmljIHdyaXRlciwgdGhlbiBpdCB3b3VsZCBjYXVzZSBpdCB0byBuZXZlciBzdGFydFxuICAgIC8vIGZsb3dpbmcgYWdhaW4uXG4gICAgLy8gU28sIGlmIHRoaXMgaXMgYXdhaXRpbmcgYSBkcmFpbiwgdGhlbiB3ZSBqdXN0IGNhbGwgaXQgbm93LlxuICAgIC8vIElmIHdlIGRvbid0IGtub3csIHRoZW4gYXNzdW1lIHRoYXQgd2UgYXJlIHdhaXRpbmcgZm9yIG9uZS5cbiAgICBpZiAoc3RhdGUuYXdhaXREcmFpbiAmJlxuICAgICAgICAoIWRlc3QuX3dyaXRhYmxlU3RhdGUgfHwgZGVzdC5fd3JpdGFibGVTdGF0ZS5uZWVkRHJhaW4pKVxuICAgICAgb25kcmFpbigpO1xuICB9XG5cbiAgc3JjLm9uKCdkYXRhJywgb25kYXRhKTtcbiAgZnVuY3Rpb24gb25kYXRhKGNodW5rKSB7XG4gICAgZGVidWcoJ29uZGF0YScpO1xuICAgIHZhciByZXQgPSBkZXN0LndyaXRlKGNodW5rKTtcbiAgICBpZiAoZmFsc2UgPT09IHJldCkge1xuICAgICAgLy8gSWYgdGhlIHVzZXIgdW5waXBlZCBkdXJpbmcgYGRlc3Qud3JpdGUoKWAsIGl0IGlzIHBvc3NpYmxlXG4gICAgICAvLyB0byBnZXQgc3R1Y2sgaW4gYSBwZXJtYW5lbnRseSBwYXVzZWQgc3RhdGUgaWYgdGhhdCB3cml0ZVxuICAgICAgLy8gYWxzbyByZXR1cm5lZCBmYWxzZS5cbiAgICAgIGlmIChzdGF0ZS5waXBlc0NvdW50ID09PSAxICYmXG4gICAgICAgICAgc3RhdGUucGlwZXNbMF0gPT09IGRlc3QgJiZcbiAgICAgICAgICBzcmMubGlzdGVuZXJDb3VudCgnZGF0YScpID09PSAxICYmXG4gICAgICAgICAgIWNsZWFuZWRVcCkge1xuICAgICAgICBkZWJ1ZygnZmFsc2Ugd3JpdGUgcmVzcG9uc2UsIHBhdXNlJywgc3JjLl9yZWFkYWJsZVN0YXRlLmF3YWl0RHJhaW4pO1xuICAgICAgICBzcmMuX3JlYWRhYmxlU3RhdGUuYXdhaXREcmFpbisrO1xuICAgICAgfVxuICAgICAgc3JjLnBhdXNlKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gaWYgdGhlIGRlc3QgaGFzIGFuIGVycm9yLCB0aGVuIHN0b3AgcGlwaW5nIGludG8gaXQuXG4gIC8vIGhvd2V2ZXIsIGRvbid0IHN1cHByZXNzIHRoZSB0aHJvd2luZyBiZWhhdmlvciBmb3IgdGhpcy5cbiAgZnVuY3Rpb24gb25lcnJvcihlcikge1xuICAgIGRlYnVnKCdvbmVycm9yJywgZXIpO1xuICAgIHVucGlwZSgpO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgb25lcnJvcik7XG4gICAgaWYgKEVFbGlzdGVuZXJDb3VudChkZXN0LCAnZXJyb3InKSA9PT0gMClcbiAgICAgIGRlc3QuZW1pdCgnZXJyb3InLCBlcik7XG4gIH1cbiAgLy8gVGhpcyBpcyBhIGJydXRhbGx5IHVnbHkgaGFjayB0byBtYWtlIHN1cmUgdGhhdCBvdXIgZXJyb3IgaGFuZGxlclxuICAvLyBpcyBhdHRhY2hlZCBiZWZvcmUgYW55IHVzZXJsYW5kIG9uZXMuICBORVZFUiBETyBUSElTLlxuICBpZiAoIWRlc3QuX2V2ZW50cyB8fCAhZGVzdC5fZXZlbnRzLmVycm9yKVxuICAgIGRlc3Qub24oJ2Vycm9yJywgb25lcnJvcik7XG4gIGVsc2UgaWYgKGlzQXJyYXkoZGVzdC5fZXZlbnRzLmVycm9yKSlcbiAgICBkZXN0Ll9ldmVudHMuZXJyb3IudW5zaGlmdChvbmVycm9yKTtcbiAgZWxzZVxuICAgIGRlc3QuX2V2ZW50cy5lcnJvciA9IFtvbmVycm9yLCBkZXN0Ll9ldmVudHMuZXJyb3JdO1xuXG5cbiAgLy8gQm90aCBjbG9zZSBhbmQgZmluaXNoIHNob3VsZCB0cmlnZ2VyIHVucGlwZSwgYnV0IG9ubHkgb25jZS5cbiAgZnVuY3Rpb24gb25jbG9zZSgpIHtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdmaW5pc2gnLCBvbmZpbmlzaCk7XG4gICAgdW5waXBlKCk7XG4gIH1cbiAgZGVzdC5vbmNlKCdjbG9zZScsIG9uY2xvc2UpO1xuICBmdW5jdGlvbiBvbmZpbmlzaCgpIHtcbiAgICBkZWJ1Zygnb25maW5pc2gnKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdjbG9zZScsIG9uY2xvc2UpO1xuICAgIHVucGlwZSgpO1xuICB9XG4gIGRlc3Qub25jZSgnZmluaXNoJywgb25maW5pc2gpO1xuXG4gIGZ1bmN0aW9uIHVucGlwZSgpIHtcbiAgICBkZWJ1ZygndW5waXBlJyk7XG4gICAgc3JjLnVucGlwZShkZXN0KTtcbiAgfVxuXG4gIC8vIHRlbGwgdGhlIGRlc3QgdGhhdCBpdCdzIGJlaW5nIHBpcGVkIHRvXG4gIGRlc3QuZW1pdCgncGlwZScsIHNyYyk7XG5cbiAgLy8gc3RhcnQgdGhlIGZsb3cgaWYgaXQgaGFzbid0IGJlZW4gc3RhcnRlZCBhbHJlYWR5LlxuICBpZiAoIXN0YXRlLmZsb3dpbmcpIHtcbiAgICBkZWJ1ZygncGlwZSByZXN1bWUnKTtcbiAgICBzcmMucmVzdW1lKCk7XG4gIH1cblxuICByZXR1cm4gZGVzdDtcbn07XG5cbmZ1bmN0aW9uIHBpcGVPbkRyYWluKHNyYykge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHN0YXRlID0gc3JjLl9yZWFkYWJsZVN0YXRlO1xuICAgIGRlYnVnKCdwaXBlT25EcmFpbicsIHN0YXRlLmF3YWl0RHJhaW4pO1xuICAgIGlmIChzdGF0ZS5hd2FpdERyYWluKVxuICAgICAgc3RhdGUuYXdhaXREcmFpbi0tO1xuICAgIGlmIChzdGF0ZS5hd2FpdERyYWluID09PSAwICYmIEVFbGlzdGVuZXJDb3VudChzcmMsICdkYXRhJykpIHtcbiAgICAgIHN0YXRlLmZsb3dpbmcgPSB0cnVlO1xuICAgICAgZmxvdyhzcmMpO1xuICAgIH1cbiAgfTtcbn1cblxuXG5SZWFkYWJsZS5wcm90b3R5cGUudW5waXBlID0gZnVuY3Rpb24oZGVzdCkge1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuXG4gIC8vIGlmIHdlJ3JlIG5vdCBwaXBpbmcgYW55d2hlcmUsIHRoZW4gZG8gbm90aGluZy5cbiAgaWYgKHN0YXRlLnBpcGVzQ291bnQgPT09IDApXG4gICAgcmV0dXJuIHRoaXM7XG5cbiAgLy8ganVzdCBvbmUgZGVzdGluYXRpb24uICBtb3N0IGNvbW1vbiBjYXNlLlxuICBpZiAoc3RhdGUucGlwZXNDb3VudCA9PT0gMSkge1xuICAgIC8vIHBhc3NlZCBpbiBvbmUsIGJ1dCBpdCdzIG5vdCB0aGUgcmlnaHQgb25lLlxuICAgIGlmIChkZXN0ICYmIGRlc3QgIT09IHN0YXRlLnBpcGVzKVxuICAgICAgcmV0dXJuIHRoaXM7XG5cbiAgICBpZiAoIWRlc3QpXG4gICAgICBkZXN0ID0gc3RhdGUucGlwZXM7XG5cbiAgICAvLyBnb3QgYSBtYXRjaC5cbiAgICBzdGF0ZS5waXBlcyA9IG51bGw7XG4gICAgc3RhdGUucGlwZXNDb3VudCA9IDA7XG4gICAgc3RhdGUuZmxvd2luZyA9IGZhbHNlO1xuICAgIGlmIChkZXN0KVxuICAgICAgZGVzdC5lbWl0KCd1bnBpcGUnLCB0aGlzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIHNsb3cgY2FzZS4gbXVsdGlwbGUgcGlwZSBkZXN0aW5hdGlvbnMuXG5cbiAgaWYgKCFkZXN0KSB7XG4gICAgLy8gcmVtb3ZlIGFsbC5cbiAgICB2YXIgZGVzdHMgPSBzdGF0ZS5waXBlcztcbiAgICB2YXIgbGVuID0gc3RhdGUucGlwZXNDb3VudDtcbiAgICBzdGF0ZS5waXBlcyA9IG51bGw7XG4gICAgc3RhdGUucGlwZXNDb3VudCA9IDA7XG4gICAgc3RhdGUuZmxvd2luZyA9IGZhbHNlO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKylcbiAgICAgIGRlc3RzW2ldLmVtaXQoJ3VucGlwZScsIHRoaXMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gdHJ5IHRvIGZpbmQgdGhlIHJpZ2h0IG9uZS5cbiAgdmFyIGkgPSBpbmRleE9mKHN0YXRlLnBpcGVzLCBkZXN0KTtcbiAgaWYgKGkgPT09IC0xKVxuICAgIHJldHVybiB0aGlzO1xuXG4gIHN0YXRlLnBpcGVzLnNwbGljZShpLCAxKTtcbiAgc3RhdGUucGlwZXNDb3VudCAtPSAxO1xuICBpZiAoc3RhdGUucGlwZXNDb3VudCA9PT0gMSlcbiAgICBzdGF0ZS5waXBlcyA9IHN0YXRlLnBpcGVzWzBdO1xuXG4gIGRlc3QuZW1pdCgndW5waXBlJywgdGhpcyk7XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vLyBzZXQgdXAgZGF0YSBldmVudHMgaWYgdGhleSBhcmUgYXNrZWQgZm9yXG4vLyBFbnN1cmUgcmVhZGFibGUgbGlzdGVuZXJzIGV2ZW50dWFsbHkgZ2V0IHNvbWV0aGluZ1xuUmVhZGFibGUucHJvdG90eXBlLm9uID0gZnVuY3Rpb24oZXYsIGZuKSB7XG4gIHZhciByZXMgPSBTdHJlYW0ucHJvdG90eXBlLm9uLmNhbGwodGhpcywgZXYsIGZuKTtcblxuICAvLyBJZiBsaXN0ZW5pbmcgdG8gZGF0YSwgYW5kIGl0IGhhcyBub3QgZXhwbGljaXRseSBiZWVuIHBhdXNlZCxcbiAgLy8gdGhlbiBjYWxsIHJlc3VtZSB0byBzdGFydCB0aGUgZmxvdyBvZiBkYXRhIG9uIHRoZSBuZXh0IHRpY2suXG4gIGlmIChldiA9PT0gJ2RhdGEnICYmIGZhbHNlICE9PSB0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcpIHtcbiAgICB0aGlzLnJlc3VtZSgpO1xuICB9XG5cbiAgaWYgKGV2ID09PSAncmVhZGFibGUnICYmIHRoaXMucmVhZGFibGUpIHtcbiAgICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICAgIGlmICghc3RhdGUucmVhZGFibGVMaXN0ZW5pbmcpIHtcbiAgICAgIHN0YXRlLnJlYWRhYmxlTGlzdGVuaW5nID0gdHJ1ZTtcbiAgICAgIHN0YXRlLmVtaXR0ZWRSZWFkYWJsZSA9IGZhbHNlO1xuICAgICAgc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICAgIGlmICghc3RhdGUucmVhZGluZykge1xuICAgICAgICBwcm9jZXNzTmV4dFRpY2soblJlYWRpbmdOZXh0VGljaywgdGhpcyk7XG4gICAgICB9IGVsc2UgaWYgKHN0YXRlLmxlbmd0aCkge1xuICAgICAgICBlbWl0UmVhZGFibGUodGhpcywgc3RhdGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXM7XG59O1xuUmVhZGFibGUucHJvdG90eXBlLmFkZExpc3RlbmVyID0gUmVhZGFibGUucHJvdG90eXBlLm9uO1xuXG5mdW5jdGlvbiBuUmVhZGluZ05leHRUaWNrKHNlbGYpIHtcbiAgZGVidWcoJ3JlYWRhYmxlIG5leHR0aWNrIHJlYWQgMCcpO1xuICBzZWxmLnJlYWQoMCk7XG59XG5cbi8vIHBhdXNlKCkgYW5kIHJlc3VtZSgpIGFyZSByZW1uYW50cyBvZiB0aGUgbGVnYWN5IHJlYWRhYmxlIHN0cmVhbSBBUElcbi8vIElmIHRoZSB1c2VyIHVzZXMgdGhlbSwgdGhlbiBzd2l0Y2ggaW50byBvbGQgbW9kZS5cblJlYWRhYmxlLnByb3RvdHlwZS5yZXN1bWUgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgaWYgKCFzdGF0ZS5mbG93aW5nKSB7XG4gICAgZGVidWcoJ3Jlc3VtZScpO1xuICAgIHN0YXRlLmZsb3dpbmcgPSB0cnVlO1xuICAgIHJlc3VtZSh0aGlzLCBzdGF0ZSk7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5mdW5jdGlvbiByZXN1bWUoc3RyZWFtLCBzdGF0ZSkge1xuICBpZiAoIXN0YXRlLnJlc3VtZVNjaGVkdWxlZCkge1xuICAgIHN0YXRlLnJlc3VtZVNjaGVkdWxlZCA9IHRydWU7XG4gICAgcHJvY2Vzc05leHRUaWNrKHJlc3VtZV8sIHN0cmVhbSwgc3RhdGUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlc3VtZV8oc3RyZWFtLCBzdGF0ZSkge1xuICBpZiAoIXN0YXRlLnJlYWRpbmcpIHtcbiAgICBkZWJ1ZygncmVzdW1lIHJlYWQgMCcpO1xuICAgIHN0cmVhbS5yZWFkKDApO1xuICB9XG5cbiAgc3RhdGUucmVzdW1lU2NoZWR1bGVkID0gZmFsc2U7XG4gIHN0cmVhbS5lbWl0KCdyZXN1bWUnKTtcbiAgZmxvdyhzdHJlYW0pO1xuICBpZiAoc3RhdGUuZmxvd2luZyAmJiAhc3RhdGUucmVhZGluZylcbiAgICBzdHJlYW0ucmVhZCgwKTtcbn1cblxuUmVhZGFibGUucHJvdG90eXBlLnBhdXNlID0gZnVuY3Rpb24oKSB7XG4gIGRlYnVnKCdjYWxsIHBhdXNlIGZsb3dpbmc9JWonLCB0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcpO1xuICBpZiAoZmFsc2UgIT09IHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZykge1xuICAgIGRlYnVnKCdwYXVzZScpO1xuICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyA9IGZhbHNlO1xuICAgIHRoaXMuZW1pdCgncGF1c2UnKTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG5cbmZ1bmN0aW9uIGZsb3coc3RyZWFtKSB7XG4gIHZhciBzdGF0ZSA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZTtcbiAgZGVidWcoJ2Zsb3cnLCBzdGF0ZS5mbG93aW5nKTtcbiAgaWYgKHN0YXRlLmZsb3dpbmcpIHtcbiAgICBkbyB7XG4gICAgICB2YXIgY2h1bmsgPSBzdHJlYW0ucmVhZCgpO1xuICAgIH0gd2hpbGUgKG51bGwgIT09IGNodW5rICYmIHN0YXRlLmZsb3dpbmcpO1xuICB9XG59XG5cbi8vIHdyYXAgYW4gb2xkLXN0eWxlIHN0cmVhbSBhcyB0aGUgYXN5bmMgZGF0YSBzb3VyY2UuXG4vLyBUaGlzIGlzICpub3QqIHBhcnQgb2YgdGhlIHJlYWRhYmxlIHN0cmVhbSBpbnRlcmZhY2UuXG4vLyBJdCBpcyBhbiB1Z2x5IHVuZm9ydHVuYXRlIG1lc3Mgb2YgaGlzdG9yeS5cblJlYWRhYmxlLnByb3RvdHlwZS53cmFwID0gZnVuY3Rpb24oc3RyZWFtKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gIHZhciBwYXVzZWQgPSBmYWxzZTtcblxuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHN0cmVhbS5vbignZW5kJywgZnVuY3Rpb24oKSB7XG4gICAgZGVidWcoJ3dyYXBwZWQgZW5kJyk7XG4gICAgaWYgKHN0YXRlLmRlY29kZXIgJiYgIXN0YXRlLmVuZGVkKSB7XG4gICAgICB2YXIgY2h1bmsgPSBzdGF0ZS5kZWNvZGVyLmVuZCgpO1xuICAgICAgaWYgKGNodW5rICYmIGNodW5rLmxlbmd0aClcbiAgICAgICAgc2VsZi5wdXNoKGNodW5rKTtcbiAgICB9XG5cbiAgICBzZWxmLnB1c2gobnVsbCk7XG4gIH0pO1xuXG4gIHN0cmVhbS5vbignZGF0YScsIGZ1bmN0aW9uKGNodW5rKSB7XG4gICAgZGVidWcoJ3dyYXBwZWQgZGF0YScpO1xuICAgIGlmIChzdGF0ZS5kZWNvZGVyKVxuICAgICAgY2h1bmsgPSBzdGF0ZS5kZWNvZGVyLndyaXRlKGNodW5rKTtcblxuICAgIC8vIGRvbid0IHNraXAgb3ZlciBmYWxzeSB2YWx1ZXMgaW4gb2JqZWN0TW9kZVxuICAgIGlmIChzdGF0ZS5vYmplY3RNb2RlICYmIChjaHVuayA9PT0gbnVsbCB8fCBjaHVuayA9PT0gdW5kZWZpbmVkKSlcbiAgICAgIHJldHVybjtcbiAgICBlbHNlIGlmICghc3RhdGUub2JqZWN0TW9kZSAmJiAoIWNodW5rIHx8ICFjaHVuay5sZW5ndGgpKVxuICAgICAgcmV0dXJuO1xuXG4gICAgdmFyIHJldCA9IHNlbGYucHVzaChjaHVuayk7XG4gICAgaWYgKCFyZXQpIHtcbiAgICAgIHBhdXNlZCA9IHRydWU7XG4gICAgICBzdHJlYW0ucGF1c2UoKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIHByb3h5IGFsbCB0aGUgb3RoZXIgbWV0aG9kcy5cbiAgLy8gaW1wb3J0YW50IHdoZW4gd3JhcHBpbmcgZmlsdGVycyBhbmQgZHVwbGV4ZXMuXG4gIGZvciAodmFyIGkgaW4gc3RyZWFtKSB7XG4gICAgaWYgKHRoaXNbaV0gPT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygc3RyZWFtW2ldID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzW2ldID0gZnVuY3Rpb24obWV0aG9kKSB7IHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHN0cmVhbVttZXRob2RdLmFwcGx5KHN0cmVhbSwgYXJndW1lbnRzKTtcbiAgICAgIH07IH0oaSk7XG4gICAgfVxuICB9XG5cbiAgLy8gcHJveHkgY2VydGFpbiBpbXBvcnRhbnQgZXZlbnRzLlxuICB2YXIgZXZlbnRzID0gWydlcnJvcicsICdjbG9zZScsICdkZXN0cm95JywgJ3BhdXNlJywgJ3Jlc3VtZSddO1xuICBmb3JFYWNoKGV2ZW50cywgZnVuY3Rpb24oZXYpIHtcbiAgICBzdHJlYW0ub24oZXYsIHNlbGYuZW1pdC5iaW5kKHNlbGYsIGV2KSk7XG4gIH0pO1xuXG4gIC8vIHdoZW4gd2UgdHJ5IHRvIGNvbnN1bWUgc29tZSBtb3JlIGJ5dGVzLCBzaW1wbHkgdW5wYXVzZSB0aGVcbiAgLy8gdW5kZXJseWluZyBzdHJlYW0uXG4gIHNlbGYuX3JlYWQgPSBmdW5jdGlvbihuKSB7XG4gICAgZGVidWcoJ3dyYXBwZWQgX3JlYWQnLCBuKTtcbiAgICBpZiAocGF1c2VkKSB7XG4gICAgICBwYXVzZWQgPSBmYWxzZTtcbiAgICAgIHN0cmVhbS5yZXN1bWUoKTtcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIHNlbGY7XG59O1xuXG5cbi8vIGV4cG9zZWQgZm9yIHRlc3RpbmcgcHVycG9zZXMgb25seS5cblJlYWRhYmxlLl9mcm9tTGlzdCA9IGZyb21MaXN0O1xuXG4vLyBQbHVjayBvZmYgbiBieXRlcyBmcm9tIGFuIGFycmF5IG9mIGJ1ZmZlcnMuXG4vLyBMZW5ndGggaXMgdGhlIGNvbWJpbmVkIGxlbmd0aHMgb2YgYWxsIHRoZSBidWZmZXJzIGluIHRoZSBsaXN0LlxuZnVuY3Rpb24gZnJvbUxpc3Qobiwgc3RhdGUpIHtcbiAgdmFyIGxpc3QgPSBzdGF0ZS5idWZmZXI7XG4gIHZhciBsZW5ndGggPSBzdGF0ZS5sZW5ndGg7XG4gIHZhciBzdHJpbmdNb2RlID0gISFzdGF0ZS5kZWNvZGVyO1xuICB2YXIgb2JqZWN0TW9kZSA9ICEhc3RhdGUub2JqZWN0TW9kZTtcbiAgdmFyIHJldDtcblxuICAvLyBub3RoaW5nIGluIHRoZSBsaXN0LCBkZWZpbml0ZWx5IGVtcHR5LlxuICBpZiAobGlzdC5sZW5ndGggPT09IDApXG4gICAgcmV0dXJuIG51bGw7XG5cbiAgaWYgKGxlbmd0aCA9PT0gMClcbiAgICByZXQgPSBudWxsO1xuICBlbHNlIGlmIChvYmplY3RNb2RlKVxuICAgIHJldCA9IGxpc3Quc2hpZnQoKTtcbiAgZWxzZSBpZiAoIW4gfHwgbiA+PSBsZW5ndGgpIHtcbiAgICAvLyByZWFkIGl0IGFsbCwgdHJ1bmNhdGUgdGhlIGFycmF5LlxuICAgIGlmIChzdHJpbmdNb2RlKVxuICAgICAgcmV0ID0gbGlzdC5qb2luKCcnKTtcbiAgICBlbHNlIGlmIChsaXN0Lmxlbmd0aCA9PT0gMSlcbiAgICAgIHJldCA9IGxpc3RbMF07XG4gICAgZWxzZVxuICAgICAgcmV0ID0gQnVmZmVyLmNvbmNhdChsaXN0LCBsZW5ndGgpO1xuICAgIGxpc3QubGVuZ3RoID0gMDtcbiAgfSBlbHNlIHtcbiAgICAvLyByZWFkIGp1c3Qgc29tZSBvZiBpdC5cbiAgICBpZiAobiA8IGxpc3RbMF0ubGVuZ3RoKSB7XG4gICAgICAvLyBqdXN0IHRha2UgYSBwYXJ0IG9mIHRoZSBmaXJzdCBsaXN0IGl0ZW0uXG4gICAgICAvLyBzbGljZSBpcyB0aGUgc2FtZSBmb3IgYnVmZmVycyBhbmQgc3RyaW5ncy5cbiAgICAgIHZhciBidWYgPSBsaXN0WzBdO1xuICAgICAgcmV0ID0gYnVmLnNsaWNlKDAsIG4pO1xuICAgICAgbGlzdFswXSA9IGJ1Zi5zbGljZShuKTtcbiAgICB9IGVsc2UgaWYgKG4gPT09IGxpc3RbMF0ubGVuZ3RoKSB7XG4gICAgICAvLyBmaXJzdCBsaXN0IGlzIGEgcGVyZmVjdCBtYXRjaFxuICAgICAgcmV0ID0gbGlzdC5zaGlmdCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBjb21wbGV4IGNhc2UuXG4gICAgICAvLyB3ZSBoYXZlIGVub3VnaCB0byBjb3ZlciBpdCwgYnV0IGl0IHNwYW5zIHBhc3QgdGhlIGZpcnN0IGJ1ZmZlci5cbiAgICAgIGlmIChzdHJpbmdNb2RlKVxuICAgICAgICByZXQgPSAnJztcbiAgICAgIGVsc2VcbiAgICAgICAgcmV0ID0gbmV3IEJ1ZmZlcihuKTtcblxuICAgICAgdmFyIGMgPSAwO1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBsaXN0Lmxlbmd0aDsgaSA8IGwgJiYgYyA8IG47IGkrKykge1xuICAgICAgICB2YXIgYnVmID0gbGlzdFswXTtcbiAgICAgICAgdmFyIGNweSA9IE1hdGgubWluKG4gLSBjLCBidWYubGVuZ3RoKTtcblxuICAgICAgICBpZiAoc3RyaW5nTW9kZSlcbiAgICAgICAgICByZXQgKz0gYnVmLnNsaWNlKDAsIGNweSk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICBidWYuY29weShyZXQsIGMsIDAsIGNweSk7XG5cbiAgICAgICAgaWYgKGNweSA8IGJ1Zi5sZW5ndGgpXG4gICAgICAgICAgbGlzdFswXSA9IGJ1Zi5zbGljZShjcHkpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgbGlzdC5zaGlmdCgpO1xuXG4gICAgICAgIGMgKz0gY3B5O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIGVuZFJlYWRhYmxlKHN0cmVhbSkge1xuICB2YXIgc3RhdGUgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGU7XG5cbiAgLy8gSWYgd2UgZ2V0IGhlcmUgYmVmb3JlIGNvbnN1bWluZyBhbGwgdGhlIGJ5dGVzLCB0aGVuIHRoYXQgaXMgYVxuICAvLyBidWcgaW4gbm9kZS4gIFNob3VsZCBuZXZlciBoYXBwZW4uXG4gIGlmIChzdGF0ZS5sZW5ndGggPiAwKVxuICAgIHRocm93IG5ldyBFcnJvcignZW5kUmVhZGFibGUgY2FsbGVkIG9uIG5vbi1lbXB0eSBzdHJlYW0nKTtcblxuICBpZiAoIXN0YXRlLmVuZEVtaXR0ZWQpIHtcbiAgICBzdGF0ZS5lbmRlZCA9IHRydWU7XG4gICAgcHJvY2Vzc05leHRUaWNrKGVuZFJlYWRhYmxlTlQsIHN0YXRlLCBzdHJlYW0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGVuZFJlYWRhYmxlTlQoc3RhdGUsIHN0cmVhbSkge1xuICAvLyBDaGVjayB0aGF0IHdlIGRpZG4ndCBnZXQgb25lIGxhc3QgdW5zaGlmdC5cbiAgaWYgKCFzdGF0ZS5lbmRFbWl0dGVkICYmIHN0YXRlLmxlbmd0aCA9PT0gMCkge1xuICAgIHN0YXRlLmVuZEVtaXR0ZWQgPSB0cnVlO1xuICAgIHN0cmVhbS5yZWFkYWJsZSA9IGZhbHNlO1xuICAgIHN0cmVhbS5lbWl0KCdlbmQnKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmb3JFYWNoICh4cywgZikge1xuICBmb3IgKHZhciBpID0gMCwgbCA9IHhzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGYoeHNbaV0sIGkpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGluZGV4T2YgKHhzLCB4KSB7XG4gIGZvciAodmFyIGkgPSAwLCBsID0geHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgaWYgKHhzW2ldID09PSB4KSByZXR1cm4gaTtcbiAgfVxuICByZXR1cm4gLTE7XG59XG4iLCJ2YXIgZW5jb2RpbmdzID0gcmVxdWlyZSgnLi9saWIvZW5jb2RpbmdzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gQ29kZWM7XG5cbmZ1bmN0aW9uIENvZGVjKG9wdHMpe1xuICB0aGlzLm9wdHMgPSBvcHRzIHx8IHt9O1xuICB0aGlzLmVuY29kaW5ncyA9IGVuY29kaW5ncztcbn1cblxuQ29kZWMucHJvdG90eXBlLl9lbmNvZGluZyA9IGZ1bmN0aW9uKGVuY29kaW5nKXtcbiAgaWYgKHR5cGVvZiBlbmNvZGluZyA9PSAnc3RyaW5nJykgZW5jb2RpbmcgPSBlbmNvZGluZ3NbZW5jb2RpbmddO1xuICBpZiAoIWVuY29kaW5nKSBlbmNvZGluZyA9IGVuY29kaW5ncy5pZDtcbiAgcmV0dXJuIGVuY29kaW5nO1xufTtcblxuQ29kZWMucHJvdG90eXBlLl9rZXlFbmNvZGluZyA9IGZ1bmN0aW9uKG9wdHMsIGJhdGNoT3B0cyl7XG4gIHJldHVybiB0aGlzLl9lbmNvZGluZyhiYXRjaE9wdHMgJiYgYmF0Y2hPcHRzLmtleUVuY29kaW5nXG4gICAgfHwgb3B0cyAmJiBvcHRzLmtleUVuY29kaW5nXG4gICAgfHwgdGhpcy5vcHRzLmtleUVuY29kaW5nKTtcbn07XG5cbkNvZGVjLnByb3RvdHlwZS5fdmFsdWVFbmNvZGluZyA9IGZ1bmN0aW9uKG9wdHMsIGJhdGNoT3B0cyl7XG4gIHJldHVybiB0aGlzLl9lbmNvZGluZyhcbiAgICBiYXRjaE9wdHMgJiYgKGJhdGNoT3B0cy52YWx1ZUVuY29kaW5nIHx8IGJhdGNoT3B0cy5lbmNvZGluZylcbiAgICB8fCBvcHRzICYmIChvcHRzLnZhbHVlRW5jb2RpbmcgfHwgb3B0cy5lbmNvZGluZylcbiAgICB8fCAodGhpcy5vcHRzLnZhbHVlRW5jb2RpbmcgfHwgdGhpcy5vcHRzLmVuY29kaW5nKSk7XG59O1xuXG5Db2RlYy5wcm90b3R5cGUuZW5jb2RlS2V5ID0gZnVuY3Rpb24oa2V5LCBvcHRzLCBiYXRjaE9wdHMpe1xuICByZXR1cm4gdGhpcy5fa2V5RW5jb2Rpbmcob3B0cywgYmF0Y2hPcHRzKS5lbmNvZGUoa2V5KTtcbn07XG5cbkNvZGVjLnByb3RvdHlwZS5lbmNvZGVWYWx1ZSA9IGZ1bmN0aW9uKHZhbHVlLCBvcHRzLCBiYXRjaE9wdHMpe1xuICByZXR1cm4gdGhpcy5fdmFsdWVFbmNvZGluZyhvcHRzLCBiYXRjaE9wdHMpLmVuY29kZSh2YWx1ZSk7XG59O1xuXG5Db2RlYy5wcm90b3R5cGUuZGVjb2RlS2V5ID0gZnVuY3Rpb24oa2V5LCBvcHRzKXtcbiAgcmV0dXJuIHRoaXMuX2tleUVuY29kaW5nKG9wdHMpLmRlY29kZShrZXkpO1xufTtcblxuQ29kZWMucHJvdG90eXBlLmRlY29kZVZhbHVlID0gZnVuY3Rpb24odmFsdWUsIG9wdHMpe1xuICByZXR1cm4gdGhpcy5fdmFsdWVFbmNvZGluZyhvcHRzKS5kZWNvZGUodmFsdWUpO1xufTtcblxuQ29kZWMucHJvdG90eXBlLmVuY29kZUJhdGNoID0gZnVuY3Rpb24ob3BzLCBvcHRzKXtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gIHJldHVybiBvcHMubWFwKGZ1bmN0aW9uKF9vcCl7XG4gICAgdmFyIG9wID0ge1xuICAgICAgdHlwZTogX29wLnR5cGUsXG4gICAgICBrZXk6IHNlbGYuZW5jb2RlS2V5KF9vcC5rZXksIG9wdHMsIF9vcClcbiAgICB9O1xuICAgIGlmIChzZWxmLmtleUFzQnVmZmVyKG9wdHMsIF9vcCkpIG9wLmtleUVuY29kaW5nID0gJ2JpbmFyeSc7XG4gICAgaWYgKF9vcC5wcmVmaXgpIG9wLnByZWZpeCA9IF9vcC5wcmVmaXg7XG4gICAgaWYgKCd2YWx1ZScgaW4gX29wKSB7XG4gICAgICBvcC52YWx1ZSA9IHNlbGYuZW5jb2RlVmFsdWUoX29wLnZhbHVlLCBvcHRzLCBfb3ApO1xuICAgICAgaWYgKHNlbGYudmFsdWVBc0J1ZmZlcihvcHRzLCBfb3ApKSBvcC52YWx1ZUVuY29kaW5nID0gJ2JpbmFyeSc7XG4gICAgfVxuICAgIHJldHVybiBvcDtcbiAgfSk7XG59O1xuXG52YXIgbHRndEtleXMgPSBbJ2x0JywgJ2d0JywgJ2x0ZScsICdndGUnLCAnc3RhcnQnLCAnZW5kJ107XG5cbkNvZGVjLnByb3RvdHlwZS5lbmNvZGVMdGd0ID0gZnVuY3Rpb24obHRndCl7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIHJldCA9IHt9O1xuICBPYmplY3Qua2V5cyhsdGd0KS5mb3JFYWNoKGZ1bmN0aW9uKGtleSl7XG4gICAgcmV0W2tleV0gPSBsdGd0S2V5cy5pbmRleE9mKGtleSkgPiAtMVxuICAgICAgPyBzZWxmLmVuY29kZUtleShsdGd0W2tleV0sIGx0Z3QpXG4gICAgICA6IGx0Z3Rba2V5XVxuICB9KTtcbiAgcmV0dXJuIHJldDtcbn07XG5cbkNvZGVjLnByb3RvdHlwZS5jcmVhdGVTdHJlYW1EZWNvZGVyID0gZnVuY3Rpb24ob3B0cyl7XG4gIHZhciBzZWxmID0gdGhpcztcblxuICBpZiAob3B0cy5rZXlzICYmIG9wdHMudmFsdWVzKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKGtleSwgdmFsdWUpe1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAga2V5OiBzZWxmLmRlY29kZUtleShrZXksIG9wdHMpLFxuICAgICAgICB2YWx1ZTogc2VsZi5kZWNvZGVWYWx1ZSh2YWx1ZSwgb3B0cylcbiAgICAgIH07XG4gICAgfTtcbiAgfSBlbHNlIGlmIChvcHRzLmtleXMpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oa2V5KSB7XG4gICAgICByZXR1cm4gc2VsZi5kZWNvZGVLZXkoa2V5LCBvcHRzKTtcbiAgICB9OyBcbiAgfSBlbHNlIGlmIChvcHRzLnZhbHVlcykge1xuICAgIHJldHVybiBmdW5jdGlvbihfLCB2YWx1ZSl7XG4gICAgICByZXR1cm4gc2VsZi5kZWNvZGVWYWx1ZSh2YWx1ZSwgb3B0cyk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBmdW5jdGlvbigpe307XG4gIH1cbn07XG5cbkNvZGVjLnByb3RvdHlwZS5rZXlBc0J1ZmZlciA9IGZ1bmN0aW9uKG9wdHMpe1xuICByZXR1cm4gdGhpcy5fa2V5RW5jb2Rpbmcob3B0cykuYnVmZmVyO1xufTtcblxuQ29kZWMucHJvdG90eXBlLnZhbHVlQXNCdWZmZXIgPSBmdW5jdGlvbihvcHRzKXtcbiAgcmV0dXJuIHRoaXMuX3ZhbHVlRW5jb2Rpbmcob3B0cykuYnVmZmVyO1xufTtcblxuIiwiXG5leHBvcnRzLnV0ZjggPSBleHBvcnRzWyd1dGYtOCddID0ge1xuICBlbmNvZGU6IGZ1bmN0aW9uKGRhdGEpe1xuICAgIHJldHVybiBpc0JpbmFyeShkYXRhKVxuICAgICAgPyBkYXRhXG4gICAgICA6IFN0cmluZyhkYXRhKTtcbiAgfSxcbiAgZGVjb2RlOiBpZGVudGl0eSxcbiAgYnVmZmVyOiBmYWxzZSxcbiAgdHlwZTogJ3V0ZjgnXG59O1xuXG5leHBvcnRzLmpzb24gPSB7XG4gIGVuY29kZTogSlNPTi5zdHJpbmdpZnksXG4gIGRlY29kZTogSlNPTi5wYXJzZSxcbiAgYnVmZmVyOiBmYWxzZSxcbiAgdHlwZTogJ2pzb24nXG59O1xuXG5leHBvcnRzLmJpbmFyeSA9IHtcbiAgZW5jb2RlOiBmdW5jdGlvbihkYXRhKXtcbiAgICByZXR1cm4gaXNCaW5hcnkoZGF0YSlcbiAgICAgID8gZGF0YVxuICAgICAgOiBuZXcgQnVmZmVyKGRhdGEpOyAgICAgIFxuICB9LFxuICBkZWNvZGU6IGlkZW50aXR5LFxuICBidWZmZXI6IHRydWUsXG4gIHR5cGU6ICdiaW5hcnknXG59O1xuXG5leHBvcnRzLmlkID0ge1xuICBlbmNvZGU6IGZ1bmN0aW9uKGRhdGEpe1xuICAgIHJldHVybiBkYXRhO1xuICB9LFxuICBkZWNvZGU6IGZ1bmN0aW9uKGRhdGEpe1xuICAgIHJldHVybiBkYXRhO1xuICB9LFxuICBidWZmZXI6IGZhbHNlLFxuICB0eXBlOiAnaWQnXG59O1xuXG52YXIgYnVmZmVyRW5jb2RpbmdzID0gW1xuICAnaGV4JyxcbiAgJ2FzY2lpJyxcbiAgJ2Jhc2U2NCcsXG4gICd1Y3MyJyxcbiAgJ3Vjcy0yJyxcbiAgJ3V0ZjE2bGUnLFxuICAndXRmLTE2bGUnXG5dO1xuXG5idWZmZXJFbmNvZGluZ3MuZm9yRWFjaChmdW5jdGlvbih0eXBlKXtcbiAgZXhwb3J0c1t0eXBlXSA9IHtcbiAgICBlbmNvZGU6IGZ1bmN0aW9uKGRhdGEpe1xuICAgICAgcmV0dXJuIGlzQmluYXJ5KGRhdGEpXG4gICAgICAgID8gZGF0YVxuICAgICAgICA6IG5ldyBCdWZmZXIoZGF0YSwgdHlwZSk7XG4gICAgfSxcbiAgICBkZWNvZGU6IGZ1bmN0aW9uKGJ1ZmZlcil7XG4gICAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKHR5cGUpO1xuICAgIH0sXG4gICAgYnVmZmVyOiB0cnVlLFxuICAgIHR5cGU6IHR5cGVcbiAgfTtcbn0pO1xuXG5mdW5jdGlvbiBpZGVudGl0eSh2YWx1ZSl7XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gaXNCaW5hcnkoZGF0YSl7XG4gIHJldHVybiBkYXRhID09PSB1bmRlZmluZWRcbiAgICB8fCBkYXRhID09PSBudWxsXG4gICAgfHwgQnVmZmVyLmlzQnVmZmVyKGRhdGEpO1xufVxuXG4iLCJ2YXIgbXV0ZXhpZnkgPSByZXF1aXJlKCdtdXRleGlmeScpXG5cbnZhciBlbnVtZXJhdG9yID0gZnVuY3Rpb24gKGRiLCBvcHRzKSB7XG4gIGlmICghb3B0cykgb3B0cyA9IHt9XG5cbiAgdmFyIHNlcCA9IG9wdHMuc2VwIHx8ICchJ1xuICB2YXIgcHJlZml4ID0gb3B0cy5wcmVmaXggPyBzZXAgKyBvcHRzLnByZWZpeCArIHNlcCA6ICcnXG4gIHZhciBrZXlQcmVmaXggPSBwcmVmaXggKyBzZXBcblxuICB2YXIgY291bnQgPSAwXG4gIHZhciBsb2NrID0gbXV0ZXhpZnkoKVxuXG4gIHZhciBnZXRDb3VudCA9IGZ1bmN0aW9uIChjYikge1xuICAgIGlmIChjb3VudCkgcmV0dXJuIGNiKG51bGwsIGNvdW50KVxuICAgIGRiLmdldChrZXlQcmVmaXgsIHt2YWx1ZUVuY29kaW5nOiAndXRmLTgnfSwgZnVuY3Rpb24gKGVyciwgY250KSB7XG4gICAgICBpZiAoZXJyICYmICFlcnIubm90Rm91bmQpIHJldHVybiBjYihlcnIpXG4gICAgICBjb3VudCA9IE51bWJlcihjbnQgfHwgMClcbiAgICAgIGNiKG51bGwsIGNvdW50KVxuICAgIH0pXG4gIH1cblxuICB2YXIgaW5zZXJ0ID0gZnVuY3Rpb24gKHByZXZDb3VudCwga2V5LCBjYikge1xuICAgIGxvY2soZnVuY3Rpb24gKHJlbGVhc2UpIHtcbiAgICAgIHZhciBpbmMgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgZ2V0Q291bnQoZnVuY3Rpb24oZXJyLCBjbnQpIHtcbiAgICAgICAgICBpZiAoZXJyKSByZXR1cm4gcmVsZWFzZShjYiwgZXJyKVxuXG4gICAgICAgICAgdmFyIGJhdGNoID0gW3tcbiAgICAgICAgICAgIHR5cGU6ICdwdXQnLFxuICAgICAgICAgICAga2V5OiBrZXksXG4gICAgICAgICAgICB2YWx1ZUVuY29kaW5nOiAndXRmLTgnLFxuICAgICAgICAgICAgdmFsdWU6IGNvdW50LnRvU3RyaW5nKClcbiAgICAgICAgICB9LCB7XG4gICAgICAgICAgICB0eXBlOiAncHV0JyxcbiAgICAgICAgICAgIGtleToga2V5UHJlZml4LFxuICAgICAgICAgICAgdmFsdWVFbmNvZGluZzogJ3V0Zi04JyxcbiAgICAgICAgICAgIHZhbHVlOiAoY291bnQgKyAxKS50b1N0cmluZygpXG4gICAgICAgICAgfV1cblxuICAgICAgICAgIGRiLmJhdGNoKGJhdGNoLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgICAgICBpZiAoZXJyKSByZXR1cm4gcmVsZWFzZShjYiwgZXJyKVxuICAgICAgICAgICAgY291bnQrK1xuICAgICAgICAgICAgcmVsZWFzZShjYiwgbnVsbCwgY291bnQgLSAxKVxuICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIGlmIChwcmV2Q291bnQgPT09IGNvdW50KSByZXR1cm4gaW5jKClcblxuICAgICAgZGIuZ2V0KGtleSwge3ZhbHVlRW5jb2Rpbmc6ICd1dGYtOCd9LCBmdW5jdGlvbiAoZXJyLCBudW0pIHtcbiAgICAgICAgaWYgKGVyciAmJiAhZXJyLm5vdEZvdW5kKSByZXR1cm4gcmVsZWFzZShjYiwgZXJyKVxuICAgICAgICBpZiAobnVtKSByZXR1cm4gcmVsZWFzZShjYiwgbnVsbCwgTnVtYmVyKG51bSkpXG4gICAgICAgIGluYygpXG4gICAgICB9KVxuICAgIH0pXG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKGtleSwgY2IpIHtcbiAgICBpZiAoIWtleSkgdGhyb3cgbmV3IEVycm9yKCdrZXkgaXMgcmVxdWlyZWQnKVxuXG4gICAga2V5ID0ga2V5UHJlZml4ICsga2V5XG5cbiAgICBkYi5nZXQoa2V5LCB7dmFsdWVFbmNvZGluZzogJ3V0Zi04J30sIGZ1bmN0aW9uIChlcnIsIG51bSkge1xuICAgICAgaWYgKGVyciAmJiAhZXJyLm5vdEZvdW5kKSByZXR1cm4gY2IoZXJyKVxuICAgICAgaWYgKG51bSkgcmV0dXJuIGNiKG51bGwsIE51bWJlcihudW0pKVxuICAgICAgaW5zZXJ0KGNvdW50LCBrZXksIGNiKVxuICAgIH0pXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBlbnVtZXJhdG9yXG4iLCIvKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNSBMZXZlbFVQIGNvbnRyaWJ1dG9yc1xuICogU2VlIGxpc3QgYXQgPGh0dHBzOi8vZ2l0aHViLmNvbS9ydmFnZy9ub2RlLWxldmVsdXAjY29udHJpYnV0aW5nPlxuICogTUlUIExpY2Vuc2VcbiAqIDxodHRwczovL2dpdGh1Yi5jb20vcnZhZ2cvbm9kZS1sZXZlbHVwL2Jsb2IvbWFzdGVyL0xJQ0VOU0UubWQ+XG4gKi9cblxudmFyIGNyZWF0ZUVycm9yICAgPSByZXF1aXJlKCdlcnJubycpLmNyZWF0ZVxuICAsIExldmVsVVBFcnJvciAgPSBjcmVhdGVFcnJvcignTGV2ZWxVUEVycm9yJylcbiAgLCBOb3RGb3VuZEVycm9yID0gY3JlYXRlRXJyb3IoJ05vdEZvdW5kRXJyb3InLCBMZXZlbFVQRXJyb3IpXG5cbk5vdEZvdW5kRXJyb3IucHJvdG90eXBlLm5vdEZvdW5kID0gdHJ1ZVxuTm90Rm91bmRFcnJvci5wcm90b3R5cGUuc3RhdHVzICAgPSA0MDRcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgTGV2ZWxVUEVycm9yICAgICAgICA6IExldmVsVVBFcnJvclxuICAsIEluaXRpYWxpemF0aW9uRXJyb3IgOiBjcmVhdGVFcnJvcignSW5pdGlhbGl6YXRpb25FcnJvcicsIExldmVsVVBFcnJvcilcbiAgLCBPcGVuRXJyb3IgICAgICAgICAgIDogY3JlYXRlRXJyb3IoJ09wZW5FcnJvcicsIExldmVsVVBFcnJvcilcbiAgLCBSZWFkRXJyb3IgICAgICAgICAgIDogY3JlYXRlRXJyb3IoJ1JlYWRFcnJvcicsIExldmVsVVBFcnJvcilcbiAgLCBXcml0ZUVycm9yICAgICAgICAgIDogY3JlYXRlRXJyb3IoJ1dyaXRlRXJyb3InLCBMZXZlbFVQRXJyb3IpXG4gICwgTm90Rm91bmRFcnJvciAgICAgICA6IE5vdEZvdW5kRXJyb3JcbiAgLCBFbmNvZGluZ0Vycm9yICAgICAgIDogY3JlYXRlRXJyb3IoJ0VuY29kaW5nRXJyb3InLCBMZXZlbFVQRXJyb3IpXG59XG4iLCJ2YXIgaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xudmFyIFJlYWRhYmxlID0gcmVxdWlyZSgncmVhZGFibGUtc3RyZWFtJykuUmVhZGFibGU7XG52YXIgZXh0ZW5kID0gcmVxdWlyZSgneHRlbmQnKTtcbnZhciBFbmNvZGluZ0Vycm9yID0gcmVxdWlyZSgnbGV2ZWwtZXJyb3JzJykuRW5jb2RpbmdFcnJvcjtcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFkU3RyZWFtO1xuaW5oZXJpdHMoUmVhZFN0cmVhbSwgUmVhZGFibGUpO1xuXG5mdW5jdGlvbiBSZWFkU3RyZWFtKGl0ZXJhdG9yLCBvcHRpb25zKXtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFJlYWRTdHJlYW0pKSByZXR1cm4gbmV3IFJlYWRTdHJlYW0oaXRlcmF0b3IsIG9wdGlvbnMpO1xuICBSZWFkYWJsZS5jYWxsKHRoaXMsIGV4dGVuZChvcHRpb25zLCB7XG4gICAgb2JqZWN0TW9kZTogdHJ1ZVxuICB9KSk7XG4gIHRoaXMuX2l0ZXJhdG9yID0gaXRlcmF0b3I7XG4gIHRoaXMuX2Rlc3Ryb3llZCA9IGZhbHNlO1xuICB0aGlzLl9kZWNvZGVyID0gbnVsbDtcbiAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5kZWNvZGVyKSB0aGlzLl9kZWNvZGVyID0gb3B0aW9ucy5kZWNvZGVyO1xuICB0aGlzLm9uKCdlbmQnLCB0aGlzLl9jbGVhbnVwLmJpbmQodGhpcykpO1xufVxuXG5SZWFkU3RyZWFtLnByb3RvdHlwZS5fcmVhZCA9IGZ1bmN0aW9uKCl7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgaWYgKHRoaXMuX2Rlc3Ryb3llZCkgcmV0dXJuO1xuXG4gIHRoaXMuX2l0ZXJhdG9yLm5leHQoZnVuY3Rpb24oZXJyLCBrZXksIHZhbHVlKXtcbiAgICBpZiAoc2VsZi5fZGVzdHJveWVkKSByZXR1cm47XG4gICAgaWYgKGVycikgcmV0dXJuIHNlbGYuZW1pdCgnZXJyb3InLCBlcnIpO1xuICAgIGlmIChrZXkgPT09IHVuZGVmaW5lZCAmJiB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBzZWxmLnB1c2gobnVsbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghc2VsZi5fZGVjb2RlcikgcmV0dXJuIHNlbGYucHVzaCh7IGtleToga2V5LCB2YWx1ZTogdmFsdWUgfSk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IHNlbGYuX2RlY29kZXIoa2V5LCB2YWx1ZSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgc2VsZi5lbWl0KCdlcnJvcicsIG5ldyBFbmNvZGluZ0Vycm9yKGVycikpO1xuICAgICAgICBzZWxmLnB1c2gobnVsbCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHNlbGYucHVzaCh2YWx1ZSk7XG4gICAgfVxuICB9KTtcbn07XG5cblJlYWRTdHJlYW0ucHJvdG90eXBlLmRlc3Ryb3kgPVxuUmVhZFN0cmVhbS5wcm90b3R5cGUuX2NsZWFudXAgPSBmdW5jdGlvbigpe1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIGlmICh0aGlzLl9kZXN0cm95ZWQpIHJldHVybjtcbiAgdGhpcy5fZGVzdHJveWVkID0gdHJ1ZTtcblxuICB0aGlzLl9pdGVyYXRvci5lbmQoZnVuY3Rpb24oZXJyKXtcbiAgICBpZiAoZXJyKSByZXR1cm4gc2VsZi5lbWl0KCdlcnJvcicsIGVycik7XG4gICAgc2VsZi5lbWl0KCdjbG9zZScpO1xuICB9KTtcbn07XG5cbiIsInZhciBsZXhpbnQgPSByZXF1aXJlKCdsZXhpY29ncmFwaGljLWludGVnZXInKVxudmFyIGNvbGxlY3QgPSByZXF1aXJlKCdzdHJlYW0tY29sbGVjdG9yJylcbnZhciB0aHJvdWdoID0gcmVxdWlyZSgndGhyb3VnaDInKVxudmFyIGZyb20gPSByZXF1aXJlKCdmcm9tMicpXG52YXIgcHVtcCA9IHJlcXVpcmUoJ3B1bXAnKVxuXG52YXIgbm9vcCA9IGZ1bmN0aW9uICgpIHt9XG5cbnZhciBMb2dzID0gZnVuY3Rpb24gKGRiLCBvcHRzKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBMb2dzKSkgcmV0dXJuIG5ldyBMb2dzKGRiLCBvcHRzKVxuICBpZiAoIW9wdHMpIG9wdHMgPSB7fVxuXG4gIHRoaXMuZGIgPSBkYlxuICB0aGlzLnNlcCA9IG9wdHMuc2VwYXJhdG9yIHx8IG9wdHMuc2VwIHx8ICchJ1xuICB0aGlzLnByZWZpeCA9IG9wdHMucHJlZml4ID8gdGhpcy5zZXAgKyBvcHRzLnByZWZpeCArIHRoaXMuc2VwIDogJydcbiAgdGhpcy52YWx1ZUVuY29kaW5nID0gb3B0cy52YWx1ZUVuY29kaW5nXG59XG5cbkxvZ3MucHJvdG90eXBlLmtleSA9IGZ1bmN0aW9uIChsb2csIHNlcSkge1xuICByZXR1cm4gdGhpcy5wcmVmaXggKyBsb2cgKyB0aGlzLnNlcCArIChzZXEgPT09IC0xID8gJ1xceGZmJyA6IGxleGludC5wYWNrKHNlcSwgJ2hleCcpKVxufVxuXG5Mb2dzLnByb3RvdHlwZS5saXN0ID0gZnVuY3Rpb24gKGNiKSB7XG4gIHZhciBzZWxmID0gdGhpc1xuXG4gIHZhciBwcmV2ID0gdGhpcy5wcmVmaXhcbiAgdmFyIHJzID0gZnJvbS5vYmooZnVuY3Rpb24gKHNpemUsIGNiKSB7XG4gICAgY29sbGVjdChzZWxmLmRiLmNyZWF0ZUtleVN0cmVhbSh7Z3Q6IHByZXYsIGxpbWl0OiAxfSksIGZ1bmN0aW9uIChlcnIsIGtleXMpIHtcbiAgICAgIGlmIChlcnIpIHJldHVybiBjYihlcnIpXG4gICAgICBpZiAoIWtleXMubGVuZ3RoKSByZXR1cm4gY2IobnVsbCwgbnVsbClcbiAgICAgIHZhciBsb2cgPSBrZXlzWzBdLnNsaWNlKDAsIGtleXNbMF0ubGFzdEluZGV4T2Yoc2VsZi5zZXApKVxuICAgICAgcHJldiA9IHNlbGYua2V5KGxvZywgLTEpXG4gICAgICBjYihudWxsLCBsb2cpXG4gICAgfSlcbiAgfSlcblxuICByZXR1cm4gY29sbGVjdChycywgY2IpXG59XG5cbkxvZ3MucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIChsb2csIHNlcSwgY2IpIHtcbiAgdGhpcy5kYi5nZXQodGhpcy5rZXkobG9nLCBzZXEpLCB7dmFsdWVFbmNvZGluZzogdGhpcy52YWx1ZUVuY29kaW5nfSwgY2IpXG59XG5cbkxvZ3MucHJvdG90eXBlLnB1dCA9IGZ1bmN0aW9uIChsb2csIHNlcSwgdmFsdWUsIGNiKSB7XG4gIHRoaXMuZGIucHV0KHRoaXMua2V5KGxvZywgc2VxKSwgdmFsdWUsIHt2YWx1ZUVuY29kaW5nOiB0aGlzLnZhbHVlRW5jb2Rpbmd9LCBjYilcbn1cblxuTG9ncy5wcm90b3R5cGUuYXBwZW5kID0gZnVuY3Rpb24gKGxvZywgdmFsdWUsIGNiKSB7XG4gIGlmICghY2IpIGNiID0gbm9vcFxuICB2YXIgc2VsZiA9IHRoaXNcblxuICB0aGlzLmhlYWQobG9nLCBmdW5jdGlvbiAoZXJyLCBzZXEpIHtcbiAgICBpZiAoZXJyKSByZXR1cm4gY2IoZXJyKVxuICAgIHNlbGYucHV0KGxvZywgc2VxICsgMSwgdmFsdWUsIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgIGlmIChlcnIpIHJldHVybiBjYihlcnIpXG4gICAgICBjYihudWxsLCBzZXEgKyAxKVxuICAgIH0pXG4gIH0pXG59XG5cbkxvZ3MucHJvdG90eXBlLmhlYWQgPSBmdW5jdGlvbiAobG9nLCBjYikge1xuICB2YXIgc2VsZiA9IHRoaXNcblxuICB2YXIga2V5cyA9IHRoaXMuZGIuY3JlYXRlS2V5U3RyZWFtKHtcbiAgICBndDogdGhpcy5rZXkobG9nLCAwKSxcbiAgICBsdDogdGhpcy5rZXkobG9nLCAtMSksXG4gICAgcmV2ZXJzZTogdHJ1ZSxcbiAgICBsaW1pdDogMVxuICB9KVxuXG4gIGNvbGxlY3Qoa2V5cywgZnVuY3Rpb24gKGVyciwgaGVhZCkge1xuICAgIGlmIChlcnIpIHJldHVybiBjYihlcnIpXG4gICAgY2IobnVsbCwgaGVhZC5sZW5ndGggPyBsZXhpbnQudW5wYWNrKGhlYWRbMF0uc2xpY2UoaGVhZFswXS5sYXN0SW5kZXhPZihzZWxmLnNlcCkgKyAxKSwgJ2hleCcpIDogMClcbiAgfSlcbn1cblxuTG9ncy5wcm90b3R5cGUuY3JlYXRlVmFsdWVTdHJlYW0gPSBmdW5jdGlvbiAobG9nLCBvcHRzKSB7XG4gIGlmICghb3B0cykgb3B0cyA9IHt9XG4gIHJldHVybiB0aGlzLmRiLmNyZWF0ZVZhbHVlU3RyZWFtKHtcbiAgICBndDogdGhpcy5rZXkobG9nLCBvcHRzLnNpbmNlIHx8IDApLFxuICAgIGx0OiB0aGlzLmtleShsb2csIG9wdHMudW50aWwgfHwgLTEpLFxuICAgIHZhbHVlRW5jb2Rpbmc6IHRoaXMudmFsdWVFbmNvZGluZyxcbiAgICByZXZlcnNlOiBvcHRzLnJldmVyc2VcbiAgfSlcbn1cblxuTG9ncy5wcm90b3R5cGUuY3JlYXRlUmVhZFN0cmVhbSA9IGZ1bmN0aW9uIChsb2csIG9wdHMpIHtcbiAgaWYgKCFvcHRzKSBvcHRzID0ge31cblxuICB2YXIgc2VsZiA9IHRoaXNcblxuICB2YXIgcnMgPSB0aGlzLmRiLmNyZWF0ZVJlYWRTdHJlYW0oe1xuICAgIGd0OiB0aGlzLmtleShsb2csIG9wdHMuc2luY2UgfHwgMCksXG4gICAgbHQ6IHRoaXMua2V5KGxvZywgb3B0cy51bnRpbCB8fCAtMSksXG4gICAgdmFsdWVFbmNvZGluZzogdGhpcy52YWx1ZUVuY29kaW5nLFxuICAgIHJldmVyc2U6IG9wdHMucmV2ZXJzZVxuICB9KVxuXG4gIHZhciBmb3JtYXQgPSB0aHJvdWdoLm9iaihmdW5jdGlvbiAoZGF0YSwgZW5jLCBjYikge1xuICAgIHZhciBrZXkgPSBkYXRhLmtleVxuICAgIHZhciBsb2cgPSBrZXkuc2xpY2UoMCwga2V5Lmxhc3RJbmRleE9mKHNlbGYuc2VwKSlcbiAgICB2YXIgc2VxID0gbGV4aW50LnVucGFjayhrZXkuc2xpY2UobG9nLmxlbmd0aCArIDEpLCAnaGV4JylcbiAgICBjYihudWxsLCB7bG9nOiBsb2csIHNlcTogc2VxLCB2YWx1ZTogZGF0YS52YWx1ZX0pXG4gIH0pXG5cbiAgcmV0dXJuIHB1bXAocnMsIGZvcm1hdClcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBMb2dzXG4iLCJ2YXIgUmVhZGFibGUgPSByZXF1aXJlKCdyZWFkYWJsZS1zdHJlYW0nKS5SZWFkYWJsZVxudmFyIGluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZyb20yXG5cbmZyb20yLmN0b3IgPSBjdG9yXG5mcm9tMi5vYmogPSBvYmpcblxudmFyIFByb3RvID0gY3RvcigpXG5cbmZ1bmN0aW9uIHRvRnVuY3Rpb24obGlzdCkge1xuICBsaXN0ID0gbGlzdC5zbGljZSgpXG4gIHJldHVybiBmdW5jdGlvbiAoXywgY2IpIHtcbiAgICBjYihudWxsLCBsaXN0Lmxlbmd0aCA/IGxpc3Quc2hpZnQoKSA6IG51bGwpXG4gIH1cbn1cblxuZnVuY3Rpb24gZnJvbTIob3B0cywgcmVhZCkge1xuICBpZiAodHlwZW9mIG9wdHMgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkob3B0cykpIHtcbiAgICByZWFkID0gb3B0c1xuICAgIG9wdHMgPSB7fVxuICB9XG4gIFxuICBpZiAoQXJyYXkuaXNBcnJheShyZWFkKSkgcmVhZCA9IHRvRnVuY3Rpb24ocmVhZClcblxuICB2YXIgcnMgPSBuZXcgUHJvdG8ob3B0cylcbiAgcnMuX2Zyb20gPSByZWFkXG4gIHJldHVybiByc1xufVxuXG5mdW5jdGlvbiBjdG9yKG9wdHMsIHJlYWQpIHtcbiAgaWYgKHR5cGVvZiBvcHRzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmVhZCA9IG9wdHNcbiAgICBvcHRzID0ge31cbiAgfVxuXG4gIG9wdHMgPSBkZWZhdWx0cyhvcHRzKVxuXG4gIGluaGVyaXRzKENsYXNzLCBSZWFkYWJsZSlcbiAgZnVuY3Rpb24gQ2xhc3Mob3ZlcnJpZGUpIHtcbiAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgQ2xhc3MpKSByZXR1cm4gbmV3IENsYXNzKG92ZXJyaWRlKVxuICAgIHRoaXMuX3JlYWRpbmcgPSBmYWxzZVxuICAgIHRoaXMuZGVzdHJveWVkID0gZmFsc2VcbiAgICBSZWFkYWJsZS5jYWxsKHRoaXMsIG92ZXJyaWRlIHx8IG9wdHMpXG4gIH1cblxuICBDbGFzcy5wcm90b3R5cGUuX2Zyb20gPSByZWFkXG4gIENsYXNzLnByb3RvdHlwZS5fcmVhZCA9IGZ1bmN0aW9uKHNpemUpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXNcblxuICAgIGlmICh0aGlzLl9yZWFkaW5nIHx8IHRoaXMuZGVzdHJveWVkKSByZXR1cm5cbiAgICB0aGlzLl9yZWFkaW5nID0gdHJ1ZVxuICAgIHRoaXMuX2Zyb20oc2l6ZSwgY2hlY2spXG4gICAgZnVuY3Rpb24gY2hlY2soZXJyLCBkYXRhKSB7XG4gICAgICBpZiAoc2VsZi5kZXN0cm95ZWQpIHJldHVyblxuICAgICAgaWYgKGVycikgcmV0dXJuIHNlbGYuZGVzdHJveShlcnIpXG4gICAgICBpZiAoZGF0YSA9PT0gbnVsbCkgcmV0dXJuIHNlbGYucHVzaChudWxsKVxuICAgICAgc2VsZi5fcmVhZGluZyA9IGZhbHNlXG4gICAgICBpZiAoc2VsZi5wdXNoKGRhdGEpKSBzZWxmLl9yZWFkKClcbiAgICB9XG4gIH1cblxuICBDbGFzcy5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uKGVycikge1xuICAgIGlmICh0aGlzLmRlc3Ryb3llZCkgcmV0dXJuXG4gICAgdGhpcy5kZXN0cm95ZWQgPSB0cnVlXG5cbiAgICB2YXIgc2VsZiA9IHRoaXNcbiAgICBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKGVycikgc2VsZi5lbWl0KCdlcnJvcicsIGVycilcbiAgICAgIHNlbGYuZW1pdCgnY2xvc2UnKVxuICAgIH0pXG4gIH1cblxuICByZXR1cm4gQ2xhc3Ncbn1cblxuZnVuY3Rpb24gb2JqKG9wdHMsIHJlYWQpIHtcbiAgaWYgKHR5cGVvZiBvcHRzID09PSAnZnVuY3Rpb24nIHx8IEFycmF5LmlzQXJyYXkob3B0cykpIHtcbiAgICByZWFkID0gb3B0c1xuICAgIG9wdHMgPSB7fVxuICB9XG5cbiAgb3B0cyA9IGRlZmF1bHRzKG9wdHMpXG4gIG9wdHMub2JqZWN0TW9kZSA9IHRydWVcbiAgb3B0cy5oaWdoV2F0ZXJNYXJrID0gMTZcblxuICByZXR1cm4gZnJvbTIob3B0cywgcmVhZClcbn1cblxuZnVuY3Rpb24gZGVmYXVsdHMob3B0cykge1xuICBvcHRzID0gb3B0cyB8fCB7fVxuICByZXR1cm4gb3B0c1xufVxuIiwiLyogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTUgTGV2ZWxVUCBjb250cmlidXRvcnNcbiAqIFNlZSBsaXN0IGF0IDxodHRwczovL2dpdGh1Yi5jb20vbGV2ZWwvbGV2ZWx1cCNjb250cmlidXRpbmc+XG4gKiBNSVQgTGljZW5zZVxuICogPGh0dHBzOi8vZ2l0aHViLmNvbS9sZXZlbC9sZXZlbHVwL2Jsb2IvbWFzdGVyL0xJQ0VOU0UubWQ+XG4gKi9cblxudmFyIHV0aWwgICAgICAgICAgPSByZXF1aXJlKCcuL3V0aWwnKVxuICAsIFdyaXRlRXJyb3IgICAgPSByZXF1aXJlKCdsZXZlbC1lcnJvcnMnKS5Xcml0ZUVycm9yXG5cbiAgLCBnZXRPcHRpb25zICAgID0gdXRpbC5nZXRPcHRpb25zXG4gICwgZGlzcGF0Y2hFcnJvciA9IHV0aWwuZGlzcGF0Y2hFcnJvclxuXG5mdW5jdGlvbiBCYXRjaCAobGV2ZWx1cCwgY29kZWMpIHtcbiAgdGhpcy5fbGV2ZWx1cCA9IGxldmVsdXBcbiAgdGhpcy5fY29kZWMgPSBjb2RlY1xuICB0aGlzLmJhdGNoID0gbGV2ZWx1cC5kYi5iYXRjaCgpXG4gIHRoaXMub3BzID0gW11cbiAgdGhpcy5sZW5ndGggPSAwXG59XG5cbkJhdGNoLnByb3RvdHlwZS5wdXQgPSBmdW5jdGlvbiAoa2V5XywgdmFsdWVfLCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBnZXRPcHRpb25zKG9wdGlvbnMpXG5cbiAgdmFyIGtleSAgID0gdGhpcy5fY29kZWMuZW5jb2RlS2V5KGtleV8sIG9wdGlvbnMpXG4gICAgLCB2YWx1ZSA9IHRoaXMuX2NvZGVjLmVuY29kZVZhbHVlKHZhbHVlXywgb3B0aW9ucylcblxuICB0cnkge1xuICAgIHRoaXMuYmF0Y2gucHV0KGtleSwgdmFsdWUpXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgV3JpdGVFcnJvcihlKVxuICB9XG4gIHRoaXMub3BzLnB1c2goeyB0eXBlIDogJ3B1dCcsIGtleSA6IGtleSwgdmFsdWUgOiB2YWx1ZSB9KVxuICB0aGlzLmxlbmd0aCsrXG5cbiAgcmV0dXJuIHRoaXNcbn1cblxuQmF0Y2gucHJvdG90eXBlLmRlbCA9IGZ1bmN0aW9uIChrZXlfLCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBnZXRPcHRpb25zKG9wdGlvbnMpXG5cbiAgdmFyIGtleSA9IHRoaXMuX2NvZGVjLmVuY29kZUtleShrZXlfLCBvcHRpb25zKVxuXG4gIHRyeSB7XG4gICAgdGhpcy5iYXRjaC5kZWwoa2V5KVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICB0aHJvdyBuZXcgV3JpdGVFcnJvcihlcnIpXG4gIH1cbiAgdGhpcy5vcHMucHVzaCh7IHR5cGUgOiAnZGVsJywga2V5IDoga2V5IH0pXG4gIHRoaXMubGVuZ3RoKytcblxuICByZXR1cm4gdGhpc1xufVxuXG5CYXRjaC5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7XG4gIHRyeSB7XG4gICAgdGhpcy5iYXRjaC5jbGVhcigpXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHRocm93IG5ldyBXcml0ZUVycm9yKGVycilcbiAgfVxuXG4gIHRoaXMub3BzID0gW11cbiAgdGhpcy5sZW5ndGggPSAwXG4gIHJldHVybiB0aGlzXG59XG5cbkJhdGNoLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICB2YXIgbGV2ZWx1cCA9IHRoaXMuX2xldmVsdXBcbiAgICAsIG9wcyAgICAgPSB0aGlzLm9wc1xuXG4gIHRyeSB7XG4gICAgdGhpcy5iYXRjaC53cml0ZShmdW5jdGlvbiAoZXJyKSB7XG4gICAgICBpZiAoZXJyKVxuICAgICAgICByZXR1cm4gZGlzcGF0Y2hFcnJvcihsZXZlbHVwLCBuZXcgV3JpdGVFcnJvcihlcnIpLCBjYWxsYmFjaylcbiAgICAgIGxldmVsdXAuZW1pdCgnYmF0Y2gnLCBvcHMpXG4gICAgICBpZiAoY2FsbGJhY2spXG4gICAgICAgIGNhbGxiYWNrKClcbiAgICB9KVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICB0aHJvdyBuZXcgV3JpdGVFcnJvcihlcnIpXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBCYXRjaFxuIiwiLyogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTUgTGV2ZWxVUCBjb250cmlidXRvcnNcbiAqIFNlZSBsaXN0IGF0IDxodHRwczovL2dpdGh1Yi5jb20vbGV2ZWwvbGV2ZWx1cCNjb250cmlidXRpbmc+XG4gKiBNSVQgTGljZW5zZVxuICogPGh0dHBzOi8vZ2l0aHViLmNvbS9sZXZlbC9sZXZlbHVwL2Jsb2IvbWFzdGVyL0xJQ0VOU0UubWQ+XG4gKi9cblxudmFyIEV2ZW50RW1pdHRlciAgICAgICAgPSByZXF1aXJlKCdldmVudHMnKS5FdmVudEVtaXR0ZXJcbiAgLCBpbmhlcml0cyAgICAgICAgICAgID0gcmVxdWlyZSgndXRpbCcpLmluaGVyaXRzXG4gICwgZGVwcmVjYXRlICAgICAgICAgICA9IHJlcXVpcmUoJ3V0aWwnKS5kZXByZWNhdGVcbiAgLCBleHRlbmQgICAgICAgICAgICAgID0gcmVxdWlyZSgneHRlbmQnKVxuICAsIHByciAgICAgICAgICAgICAgICAgPSByZXF1aXJlKCdwcnInKVxuICAsIERlZmVycmVkTGV2ZWxET1dOICAgPSByZXF1aXJlKCdkZWZlcnJlZC1sZXZlbGRvd24nKVxuICAsIEl0ZXJhdG9yU3RyZWFtICAgICAgPSByZXF1aXJlKCdsZXZlbC1pdGVyYXRvci1zdHJlYW0nKVxuXG4gICwgZXJyb3JzICAgICAgICAgICAgICA9IHJlcXVpcmUoJ2xldmVsLWVycm9ycycpXG4gICwgV3JpdGVFcnJvciAgICAgICAgICA9IGVycm9ycy5Xcml0ZUVycm9yXG4gICwgUmVhZEVycm9yICAgICAgICAgICA9IGVycm9ycy5SZWFkRXJyb3JcbiAgLCBOb3RGb3VuZEVycm9yICAgICAgID0gZXJyb3JzLk5vdEZvdW5kRXJyb3JcbiAgLCBPcGVuRXJyb3IgICAgICAgICAgID0gZXJyb3JzLk9wZW5FcnJvclxuICAsIEVuY29kaW5nRXJyb3IgICAgICAgPSBlcnJvcnMuRW5jb2RpbmdFcnJvclxuICAsIEluaXRpYWxpemF0aW9uRXJyb3IgPSBlcnJvcnMuSW5pdGlhbGl6YXRpb25FcnJvclxuXG4gICwgdXRpbCAgICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vdXRpbCcpXG4gICwgQmF0Y2ggICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vYmF0Y2gnKVxuICAsIENvZGVjICAgICAgICAgICAgICAgPSByZXF1aXJlKCdsZXZlbC1jb2RlYycpXG5cbiAgLCBnZXRPcHRpb25zICAgICAgICAgID0gdXRpbC5nZXRPcHRpb25zXG4gICwgZGVmYXVsdE9wdGlvbnMgICAgICA9IHV0aWwuZGVmYXVsdE9wdGlvbnNcbiAgLCBnZXRMZXZlbERPV04gICAgICAgID0gdXRpbC5nZXRMZXZlbERPV05cbiAgLCBkaXNwYXRjaEVycm9yICAgICAgID0gdXRpbC5kaXNwYXRjaEVycm9yXG4gICwgaXNEZWZpbmVkICAgICAgICAgICA9IHV0aWwuaXNEZWZpbmVkXG5cbmZ1bmN0aW9uIGdldENhbGxiYWNrIChvcHRpb25zLCBjYWxsYmFjaykge1xuICByZXR1cm4gdHlwZW9mIG9wdGlvbnMgPT0gJ2Z1bmN0aW9uJyA/IG9wdGlvbnMgOiBjYWxsYmFja1xufVxuXG4vLyBQb3NzaWJsZSBMZXZlbFVQI19zdGF0dXMgdmFsdWVzOlxuLy8gIC0gJ25ldycgICAgIC0gbmV3bHkgY3JlYXRlZCwgbm90IG9wZW5lZCBvciBjbG9zZWRcbi8vICAtICdvcGVuaW5nJyAtIHdhaXRpbmcgZm9yIHRoZSBkYXRhYmFzZSB0byBiZSBvcGVuZWQsIHBvc3Qgb3BlbigpXG4vLyAgLSAnb3BlbicgICAgLSBzdWNjZXNzZnVsbHkgb3BlbmVkIHRoZSBkYXRhYmFzZSwgYXZhaWxhYmxlIGZvciB1c2Vcbi8vICAtICdjbG9zaW5nJyAtIHdhaXRpbmcgZm9yIHRoZSBkYXRhYmFzZSB0byBiZSBjbG9zZWQsIHBvc3QgY2xvc2UoKVxuLy8gIC0gJ2Nsb3NlZCcgIC0gZGF0YWJhc2UgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGNsb3NlZCwgc2hvdWxkIG5vdCBiZVxuLy8gICAgICAgICAgICAgICAgIHVzZWQgZXhjZXB0IGZvciBhbm90aGVyIG9wZW4oKSBvcGVyYXRpb25cblxuZnVuY3Rpb24gTGV2ZWxVUCAobG9jYXRpb24sIG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBMZXZlbFVQKSlcbiAgICByZXR1cm4gbmV3IExldmVsVVAobG9jYXRpb24sIG9wdGlvbnMsIGNhbGxiYWNrKVxuXG4gIHZhciBlcnJvclxuXG4gIEV2ZW50RW1pdHRlci5jYWxsKHRoaXMpXG4gIHRoaXMuc2V0TWF4TGlzdGVuZXJzKEluZmluaXR5KVxuXG4gIGlmICh0eXBlb2YgbG9jYXRpb24gPT0gJ2Z1bmN0aW9uJykge1xuICAgIG9wdGlvbnMgPSB0eXBlb2Ygb3B0aW9ucyA9PSAnb2JqZWN0JyA/IG9wdGlvbnMgOiB7fVxuICAgIG9wdGlvbnMuZGIgPSBsb2NhdGlvblxuICAgIGxvY2F0aW9uID0gbnVsbFxuICB9IGVsc2UgaWYgKHR5cGVvZiBsb2NhdGlvbiA9PSAnb2JqZWN0JyAmJiB0eXBlb2YgbG9jYXRpb24uZGIgPT0gJ2Z1bmN0aW9uJykge1xuICAgIG9wdGlvbnMgPSBsb2NhdGlvblxuICAgIGxvY2F0aW9uID0gbnVsbFxuICB9XG5cblxuICBpZiAodHlwZW9mIG9wdGlvbnMgPT0gJ2Z1bmN0aW9uJykge1xuICAgIGNhbGxiYWNrID0gb3B0aW9uc1xuICAgIG9wdGlvbnMgID0ge31cbiAgfVxuXG4gIGlmICgoIW9wdGlvbnMgfHwgdHlwZW9mIG9wdGlvbnMuZGIgIT0gJ2Z1bmN0aW9uJykgJiYgdHlwZW9mIGxvY2F0aW9uICE9ICdzdHJpbmcnKSB7XG4gICAgZXJyb3IgPSBuZXcgSW5pdGlhbGl6YXRpb25FcnJvcihcbiAgICAgICAgJ011c3QgcHJvdmlkZSBhIGxvY2F0aW9uIGZvciB0aGUgZGF0YWJhc2UnKVxuICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgcmV0dXJuIHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24gKCkge1xuICAgICAgICBjYWxsYmFjayhlcnJvcilcbiAgICAgIH0pXG4gICAgfVxuICAgIHRocm93IGVycm9yXG4gIH1cblxuICBvcHRpb25zICAgICAgPSBnZXRPcHRpb25zKG9wdGlvbnMpXG4gIHRoaXMub3B0aW9ucyA9IGV4dGVuZChkZWZhdWx0T3B0aW9ucywgb3B0aW9ucylcbiAgdGhpcy5fY29kZWMgPSBuZXcgQ29kZWModGhpcy5vcHRpb25zKVxuICB0aGlzLl9zdGF0dXMgPSAnbmV3J1xuICAvLyBzZXQgdGhpcy5sb2NhdGlvbiBhcyBlbnVtZXJhYmxlIGJ1dCBub3QgY29uZmlndXJhYmxlIG9yIHdyaXRhYmxlXG4gIHBycih0aGlzLCAnbG9jYXRpb24nLCBsb2NhdGlvbiwgJ2UnKVxuXG4gIHRoaXMub3BlbihjYWxsYmFjaylcbn1cblxuaW5oZXJpdHMoTGV2ZWxVUCwgRXZlbnRFbWl0dGVyKVxuXG5MZXZlbFVQLnByb3RvdHlwZS5vcGVuID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gIHZhciBzZWxmID0gdGhpc1xuICAgICwgZGJGYWN0b3J5XG4gICAgLCBkYlxuXG4gIGlmICh0aGlzLmlzT3BlbigpKSB7XG4gICAgaWYgKGNhbGxiYWNrKVxuICAgICAgcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiAoKSB7IGNhbGxiYWNrKG51bGwsIHNlbGYpIH0pXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIGlmICh0aGlzLl9pc09wZW5pbmcoKSkge1xuICAgIHJldHVybiBjYWxsYmFjayAmJiB0aGlzLm9uY2UoXG4gICAgICAgICdvcGVuJ1xuICAgICAgLCBmdW5jdGlvbiAoKSB7IGNhbGxiYWNrKG51bGwsIHNlbGYpIH1cbiAgICApXG4gIH1cblxuICB0aGlzLmVtaXQoJ29wZW5pbmcnKVxuXG4gIHRoaXMuX3N0YXR1cyA9ICdvcGVuaW5nJ1xuICB0aGlzLmRiICAgICAgPSBuZXcgRGVmZXJyZWRMZXZlbERPV04odGhpcy5sb2NhdGlvbilcbiAgZGJGYWN0b3J5ICAgID0gdGhpcy5vcHRpb25zLmRiIHx8IGdldExldmVsRE9XTigpXG4gIGRiICAgICAgICAgICA9IGRiRmFjdG9yeSh0aGlzLmxvY2F0aW9uKVxuXG4gIGRiLm9wZW4odGhpcy5vcHRpb25zLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgaWYgKGVycikge1xuICAgICAgcmV0dXJuIGRpc3BhdGNoRXJyb3Ioc2VsZiwgbmV3IE9wZW5FcnJvcihlcnIpLCBjYWxsYmFjaylcbiAgICB9IGVsc2Uge1xuICAgICAgc2VsZi5kYi5zZXREYihkYilcbiAgICAgIHNlbGYuZGIgPSBkYlxuICAgICAgc2VsZi5fc3RhdHVzID0gJ29wZW4nXG4gICAgICBpZiAoY2FsbGJhY2spXG4gICAgICAgIGNhbGxiYWNrKG51bGwsIHNlbGYpXG4gICAgICBzZWxmLmVtaXQoJ29wZW4nKVxuICAgICAgc2VsZi5lbWl0KCdyZWFkeScpXG4gICAgfVxuICB9KVxufVxuXG5MZXZlbFVQLnByb3RvdHlwZS5jbG9zZSA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICB2YXIgc2VsZiA9IHRoaXNcblxuICBpZiAodGhpcy5pc09wZW4oKSkge1xuICAgIHRoaXMuX3N0YXR1cyA9ICdjbG9zaW5nJ1xuICAgIHRoaXMuZGIuY2xvc2UoZnVuY3Rpb24gKCkge1xuICAgICAgc2VsZi5fc3RhdHVzID0gJ2Nsb3NlZCdcbiAgICAgIHNlbGYuZW1pdCgnY2xvc2VkJylcbiAgICAgIGlmIChjYWxsYmFjaylcbiAgICAgICAgY2FsbGJhY2suYXBwbHkobnVsbCwgYXJndW1lbnRzKVxuICAgIH0pXG4gICAgdGhpcy5lbWl0KCdjbG9zaW5nJylcbiAgICB0aGlzLmRiID0gbmV3IERlZmVycmVkTGV2ZWxET1dOKHRoaXMubG9jYXRpb24pXG4gIH0gZWxzZSBpZiAodGhpcy5fc3RhdHVzID09ICdjbG9zZWQnICYmIGNhbGxiYWNrKSB7XG4gICAgcmV0dXJuIHByb2Nlc3MubmV4dFRpY2soY2FsbGJhY2spXG4gIH0gZWxzZSBpZiAodGhpcy5fc3RhdHVzID09ICdjbG9zaW5nJyAmJiBjYWxsYmFjaykge1xuICAgIHRoaXMub25jZSgnY2xvc2VkJywgY2FsbGJhY2spXG4gIH0gZWxzZSBpZiAodGhpcy5faXNPcGVuaW5nKCkpIHtcbiAgICB0aGlzLm9uY2UoJ29wZW4nLCBmdW5jdGlvbiAoKSB7XG4gICAgICBzZWxmLmNsb3NlKGNhbGxiYWNrKVxuICAgIH0pXG4gIH1cbn1cblxuTGV2ZWxVUC5wcm90b3R5cGUuaXNPcGVuID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5fc3RhdHVzID09ICdvcGVuJ1xufVxuXG5MZXZlbFVQLnByb3RvdHlwZS5faXNPcGVuaW5nID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5fc3RhdHVzID09ICdvcGVuaW5nJ1xufVxuXG5MZXZlbFVQLnByb3RvdHlwZS5pc0Nsb3NlZCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuICgvXmNsb3MvKS50ZXN0KHRoaXMuX3N0YXR1cylcbn1cblxuZnVuY3Rpb24gbWF5YmVFcnJvcihkYiwgb3B0aW9ucywgY2FsbGJhY2spIHtcbiAgaWYgKCFkYi5faXNPcGVuaW5nKCkgJiYgIWRiLmlzT3BlbigpKSB7XG4gICAgZGlzcGF0Y2hFcnJvcihcbiAgICAgICAgZGJcbiAgICAgICwgbmV3IFJlYWRFcnJvcignRGF0YWJhc2UgaXMgbm90IG9wZW4nKVxuICAgICAgLCBjYWxsYmFja1xuICAgIClcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG59XG5cbmZ1bmN0aW9uIHdyaXRlRXJyb3IgKGRiLCBtZXNzYWdlLCBjYWxsYmFjaykge1xuICBkaXNwYXRjaEVycm9yKFxuICAgICAgZGJcbiAgICAgLCBuZXcgV3JpdGVFcnJvcihtZXNzYWdlKVxuICAgICAsIGNhbGxiYWNrXG4gIClcbn1cblxuZnVuY3Rpb24gcmVhZEVycm9yIChkYiwgbWVzc2FnZSwgY2FsbGJhY2spIHtcbiAgZGlzcGF0Y2hFcnJvcihcbiAgICAgIGRiXG4gICAgICwgbmV3IFJlYWRFcnJvcihtZXNzYWdlKVxuICAgICAsIGNhbGxiYWNrXG4gIClcbn1cblxuXG5MZXZlbFVQLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAoa2V5Xywgb3B0aW9ucywgY2FsbGJhY2spIHtcbiAgdmFyIHNlbGYgPSB0aGlzXG4gICAgLCBrZXlcblxuICBjYWxsYmFjayA9IGdldENhbGxiYWNrKG9wdGlvbnMsIGNhbGxiYWNrKVxuXG4gIGlmIChtYXliZUVycm9yKHRoaXMsIG9wdGlvbnMsIGNhbGxiYWNrKSlcbiAgICByZXR1cm5cblxuICBpZiAoa2V5XyA9PT0gbnVsbCB8fCBrZXlfID09PSB1bmRlZmluZWQgfHwgJ2Z1bmN0aW9uJyAhPT0gdHlwZW9mIGNhbGxiYWNrKVxuICAgIHJldHVybiByZWFkRXJyb3IodGhpc1xuICAgICAgLCAnZ2V0KCkgcmVxdWlyZXMga2V5IGFuZCBjYWxsYmFjayBhcmd1bWVudHMnLCBjYWxsYmFjaylcblxuICBvcHRpb25zID0gdXRpbC5nZXRPcHRpb25zKG9wdGlvbnMpXG4gIGtleSA9IHRoaXMuX2NvZGVjLmVuY29kZUtleShrZXlfLCBvcHRpb25zKVxuXG4gIG9wdGlvbnMuYXNCdWZmZXIgPSB0aGlzLl9jb2RlYy52YWx1ZUFzQnVmZmVyKG9wdGlvbnMpXG5cbiAgdGhpcy5kYi5nZXQoa2V5LCBvcHRpb25zLCBmdW5jdGlvbiAoZXJyLCB2YWx1ZSkge1xuICAgIGlmIChlcnIpIHtcbiAgICAgIGlmICgoL25vdGZvdW5kL2kpLnRlc3QoZXJyKSB8fCBlcnIubm90Rm91bmQpIHtcbiAgICAgICAgZXJyID0gbmV3IE5vdEZvdW5kRXJyb3IoXG4gICAgICAgICAgICAnS2V5IG5vdCBmb3VuZCBpbiBkYXRhYmFzZSBbJyArIGtleV8gKyAnXScsIGVycilcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVyciA9IG5ldyBSZWFkRXJyb3IoZXJyKVxuICAgICAgfVxuICAgICAgcmV0dXJuIGRpc3BhdGNoRXJyb3Ioc2VsZiwgZXJyLCBjYWxsYmFjaylcbiAgICB9XG4gICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICB0cnkge1xuICAgICAgICB2YWx1ZSA9IHNlbGYuX2NvZGVjLmRlY29kZVZhbHVlKHZhbHVlLCBvcHRpb25zKVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2sobmV3IEVuY29kaW5nRXJyb3IoZSkpXG4gICAgICB9XG4gICAgICBjYWxsYmFjayhudWxsLCB2YWx1ZSlcbiAgICB9XG4gIH0pXG59XG5cbkxldmVsVVAucHJvdG90eXBlLnB1dCA9IGZ1bmN0aW9uIChrZXlfLCB2YWx1ZV8sIG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gIHZhciBzZWxmID0gdGhpc1xuICAgICwga2V5XG4gICAgLCB2YWx1ZVxuXG4gIGNhbGxiYWNrID0gZ2V0Q2FsbGJhY2sob3B0aW9ucywgY2FsbGJhY2spXG5cbiAgaWYgKGtleV8gPT09IG51bGwgfHwga2V5XyA9PT0gdW5kZWZpbmVkKVxuICAgIHJldHVybiB3cml0ZUVycm9yKHRoaXMsICdwdXQoKSByZXF1aXJlcyBhIGtleSBhcmd1bWVudCcsIGNhbGxiYWNrKVxuXG4gIGlmIChtYXliZUVycm9yKHRoaXMsIG9wdGlvbnMsIGNhbGxiYWNrKSlcbiAgICByZXR1cm5cblxuICBvcHRpb25zID0gZ2V0T3B0aW9ucyhvcHRpb25zKVxuICBrZXkgICAgID0gdGhpcy5fY29kZWMuZW5jb2RlS2V5KGtleV8sIG9wdGlvbnMpXG4gIHZhbHVlICAgPSB0aGlzLl9jb2RlYy5lbmNvZGVWYWx1ZSh2YWx1ZV8sIG9wdGlvbnMpXG5cbiAgdGhpcy5kYi5wdXQoa2V5LCB2YWx1ZSwgb3B0aW9ucywgZnVuY3Rpb24gKGVycikge1xuICAgIGlmIChlcnIpIHtcbiAgICAgIHJldHVybiBkaXNwYXRjaEVycm9yKHNlbGYsIG5ldyBXcml0ZUVycm9yKGVyciksIGNhbGxiYWNrKVxuICAgIH0gZWxzZSB7XG4gICAgICBzZWxmLmVtaXQoJ3B1dCcsIGtleV8sIHZhbHVlXylcbiAgICAgIGlmIChjYWxsYmFjaylcbiAgICAgICAgY2FsbGJhY2soKVxuICAgIH1cbiAgfSlcbn1cblxuTGV2ZWxVUC5wcm90b3R5cGUuZGVsID0gZnVuY3Rpb24gKGtleV8sIG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gIHZhciBzZWxmID0gdGhpc1xuICAgICwga2V5XG5cbiAgY2FsbGJhY2sgPSBnZXRDYWxsYmFjayhvcHRpb25zLCBjYWxsYmFjaylcblxuICBpZiAoa2V5XyA9PT0gbnVsbCB8fCBrZXlfID09PSB1bmRlZmluZWQpXG4gICAgcmV0dXJuIHdyaXRlRXJyb3IodGhpcywgJ2RlbCgpIHJlcXVpcmVzIGEga2V5IGFyZ3VtZW50JywgY2FsbGJhY2spXG5cbiAgaWYgKG1heWJlRXJyb3IodGhpcywgb3B0aW9ucywgY2FsbGJhY2spKVxuICAgIHJldHVyblxuXG4gIG9wdGlvbnMgPSBnZXRPcHRpb25zKG9wdGlvbnMpXG4gIGtleSAgICAgPSB0aGlzLl9jb2RlYy5lbmNvZGVLZXkoa2V5Xywgb3B0aW9ucylcblxuICB0aGlzLmRiLmRlbChrZXksIG9wdGlvbnMsIGZ1bmN0aW9uIChlcnIpIHtcbiAgICBpZiAoZXJyKSB7XG4gICAgICByZXR1cm4gZGlzcGF0Y2hFcnJvcihzZWxmLCBuZXcgV3JpdGVFcnJvcihlcnIpLCBjYWxsYmFjaylcbiAgICB9IGVsc2Uge1xuICAgICAgc2VsZi5lbWl0KCdkZWwnLCBrZXlfKVxuICAgICAgaWYgKGNhbGxiYWNrKVxuICAgICAgICBjYWxsYmFjaygpXG4gICAgfVxuICB9KVxufVxuXG5MZXZlbFVQLnByb3RvdHlwZS5iYXRjaCA9IGZ1bmN0aW9uIChhcnJfLCBvcHRpb25zLCBjYWxsYmFjaykge1xuICB2YXIgc2VsZiA9IHRoaXNcbiAgICAsIGtleUVuY1xuICAgICwgdmFsdWVFbmNcbiAgICAsIGFyclxuXG4gIGlmICghYXJndW1lbnRzLmxlbmd0aClcbiAgICByZXR1cm4gbmV3IEJhdGNoKHRoaXMsIHRoaXMuX2NvZGVjKVxuXG4gIGNhbGxiYWNrID0gZ2V0Q2FsbGJhY2sob3B0aW9ucywgY2FsbGJhY2spXG5cbiAgaWYgKCFBcnJheS5pc0FycmF5KGFycl8pKVxuICAgIHJldHVybiB3cml0ZUVycm9yKHRoaXMsICdiYXRjaCgpIHJlcXVpcmVzIGFuIGFycmF5IGFyZ3VtZW50JywgY2FsbGJhY2spXG5cbiAgaWYgKG1heWJlRXJyb3IodGhpcywgb3B0aW9ucywgY2FsbGJhY2spKVxuICAgIHJldHVyblxuXG4gIG9wdGlvbnMgID0gZ2V0T3B0aW9ucyhvcHRpb25zKVxuICBhcnIgICAgICA9IHNlbGYuX2NvZGVjLmVuY29kZUJhdGNoKGFycl8sIG9wdGlvbnMpXG4gIGFyciAgICAgID0gYXJyLm1hcChmdW5jdGlvbiAob3ApIHtcbiAgICBpZiAoIW9wLnR5cGUgJiYgb3Aua2V5ICE9PSB1bmRlZmluZWQgJiYgb3AudmFsdWUgIT09IHVuZGVmaW5lZClcbiAgICAgIG9wLnR5cGUgPSAncHV0J1xuICAgIHJldHVybiBvcFxuICB9KVxuXG4gIHRoaXMuZGIuYmF0Y2goYXJyLCBvcHRpb25zLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgaWYgKGVycikge1xuICAgICAgcmV0dXJuIGRpc3BhdGNoRXJyb3Ioc2VsZiwgbmV3IFdyaXRlRXJyb3IoZXJyKSwgY2FsbGJhY2spXG4gICAgfSBlbHNlIHtcbiAgICAgIHNlbGYuZW1pdCgnYmF0Y2gnLCBhcnJfKVxuICAgICAgaWYgKGNhbGxiYWNrKVxuICAgICAgICBjYWxsYmFjaygpXG4gICAgfVxuICB9KVxufVxuXG5MZXZlbFVQLnByb3RvdHlwZS5hcHByb3hpbWF0ZVNpemUgPSBkZXByZWNhdGUoZnVuY3Rpb24gKHN0YXJ0XywgZW5kXywgb3B0aW9ucywgY2FsbGJhY2spIHsgICBcbiAgdmFyIHNlbGYgPSB0aGlzICAgIFxuICAgICwgc3RhcnQgICAgXG4gICAgLCBlbmQgICAgXG4gICBcbiAgY2FsbGJhY2sgPSBnZXRDYWxsYmFjayhvcHRpb25zLCBjYWxsYmFjaykgICAgXG4gICBcbiAgb3B0aW9ucyA9IGdldE9wdGlvbnMob3B0aW9ucykgICAgXG4gICBcbiAgaWYgKHN0YXJ0XyA9PT0gbnVsbCB8fCBzdGFydF8gPT09IHVuZGVmaW5lZCAgICBcbiAgICAgICAgfHwgZW5kXyA9PT0gbnVsbCB8fCBlbmRfID09PSB1bmRlZmluZWQgfHwgJ2Z1bmN0aW9uJyAhPT0gdHlwZW9mIGNhbGxiYWNrKSAgICBcbiAgICByZXR1cm4gcmVhZEVycm9yKHRoaXMsICdhcHByb3hpbWF0ZVNpemUoKSByZXF1aXJlcyBzdGFydCwgZW5kIGFuZCBjYWxsYmFjayBhcmd1bWVudHMnLCBjYWxsYmFjaykgICBcbiAgIFxuICBzdGFydCA9IHRoaXMuX2NvZGVjLmVuY29kZUtleShzdGFydF8sIG9wdGlvbnMpICAgXG4gIGVuZCAgID0gdGhpcy5fY29kZWMuZW5jb2RlS2V5KGVuZF8sIG9wdGlvbnMpICAgXG4gICBcbiAgdGhpcy5kYi5hcHByb3hpbWF0ZVNpemUoc3RhcnQsIGVuZCwgZnVuY3Rpb24gKGVyciwgc2l6ZSkgeyAgIFxuICAgIGlmIChlcnIpIHsgICBcbiAgICAgIHJldHVybiBkaXNwYXRjaEVycm9yKHNlbGYsIG5ldyBPcGVuRXJyb3IoZXJyKSwgY2FsbGJhY2spICAgXG4gICAgfSBlbHNlIGlmIChjYWxsYmFjaykgeyAgIFxuICAgICAgY2FsbGJhY2sobnVsbCwgc2l6ZSkgICBcbiAgICB9ICAgIFxuICB9KSAgIFxufSwgJ2RiLmFwcHJveGltYXRlU2l6ZSgpIGlzIGRlcHJlY2F0ZWQuIFVzZSBkYi5kYi5hcHByb3hpbWF0ZVNpemUoKSBpbnN0ZWFkJylcblxuTGV2ZWxVUC5wcm90b3R5cGUucmVhZFN0cmVhbSA9XG5MZXZlbFVQLnByb3RvdHlwZS5jcmVhdGVSZWFkU3RyZWFtID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IGV4dGVuZCgge2tleXM6IHRydWUsIHZhbHVlczogdHJ1ZX0sIHRoaXMub3B0aW9ucywgb3B0aW9ucylcblxuICBvcHRpb25zLmtleUVuY29kaW5nICAgPSBvcHRpb25zLmtleUVuY29kaW5nXG4gIG9wdGlvbnMudmFsdWVFbmNvZGluZyA9IG9wdGlvbnMudmFsdWVFbmNvZGluZ1xuXG4gIG9wdGlvbnMgPSB0aGlzLl9jb2RlYy5lbmNvZGVMdGd0KG9wdGlvbnMpO1xuICBvcHRpb25zLmtleUFzQnVmZmVyICAgPSB0aGlzLl9jb2RlYy5rZXlBc0J1ZmZlcihvcHRpb25zKVxuICBvcHRpb25zLnZhbHVlQXNCdWZmZXIgPSB0aGlzLl9jb2RlYy52YWx1ZUFzQnVmZmVyKG9wdGlvbnMpXG5cbiAgaWYgKCdudW1iZXInICE9PSB0eXBlb2Ygb3B0aW9ucy5saW1pdClcbiAgICBvcHRpb25zLmxpbWl0ID0gLTFcblxuICByZXR1cm4gbmV3IEl0ZXJhdG9yU3RyZWFtKHRoaXMuZGIuaXRlcmF0b3Iob3B0aW9ucyksIGV4dGVuZChvcHRpb25zLCB7XG4gICAgZGVjb2RlcjogdGhpcy5fY29kZWMuY3JlYXRlU3RyZWFtRGVjb2RlcihvcHRpb25zKVxuICB9KSlcbn1cblxuTGV2ZWxVUC5wcm90b3R5cGUua2V5U3RyZWFtID1cbkxldmVsVVAucHJvdG90eXBlLmNyZWF0ZUtleVN0cmVhbSA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gIHJldHVybiB0aGlzLmNyZWF0ZVJlYWRTdHJlYW0oZXh0ZW5kKG9wdGlvbnMsIHsga2V5czogdHJ1ZSwgdmFsdWVzOiBmYWxzZSB9KSlcbn1cblxuTGV2ZWxVUC5wcm90b3R5cGUudmFsdWVTdHJlYW0gPVxuTGV2ZWxVUC5wcm90b3R5cGUuY3JlYXRlVmFsdWVTdHJlYW0gPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICByZXR1cm4gdGhpcy5jcmVhdGVSZWFkU3RyZWFtKGV4dGVuZChvcHRpb25zLCB7IGtleXM6IGZhbHNlLCB2YWx1ZXM6IHRydWUgfSkpXG59XG5cbkxldmVsVVAucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gJ0xldmVsVVAnXG59XG5cbmZ1bmN0aW9uIHV0aWxTdGF0aWMgKG5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChsb2NhdGlvbiwgY2FsbGJhY2spIHtcbiAgICBnZXRMZXZlbERPV04oKVtuYW1lXShsb2NhdGlvbiwgY2FsbGJhY2sgfHwgZnVuY3Rpb24gKCkge30pXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgICAgICAgICA9IExldmVsVVBcbm1vZHVsZS5leHBvcnRzLmVycm9ycyAgPSByZXF1aXJlKCdsZXZlbC1lcnJvcnMnKVxubW9kdWxlLmV4cG9ydHMuZGVzdHJveSA9IGRlcHJlY2F0ZShcbiAgICB1dGlsU3RhdGljKCdkZXN0cm95JylcbiAgLCAnbGV2ZWx1cC5kZXN0cm95KCkgaXMgZGVwcmVjYXRlZC4gVXNlIGxldmVsZG93bi5kZXN0cm95KCkgaW5zdGVhZCdcbilcbm1vZHVsZS5leHBvcnRzLnJlcGFpciAgPSBkZXByZWNhdGUoXG4gICAgdXRpbFN0YXRpYygncmVwYWlyJylcbiAgLCAnbGV2ZWx1cC5yZXBhaXIoKSBpcyBkZXByZWNhdGVkLiBVc2UgbGV2ZWxkb3duLnJlcGFpcigpIGluc3RlYWQnXG4pXG5cbiIsIi8qIENvcHlyaWdodCAoYykgMjAxMi0yMDE1IExldmVsVVAgY29udHJpYnV0b3JzXG4gKiBTZWUgbGlzdCBhdCA8aHR0cHM6Ly9naXRodWIuY29tL2xldmVsL2xldmVsdXAjY29udHJpYnV0aW5nPlxuICogTUlUIExpY2Vuc2VcbiAqIDxodHRwczovL2dpdGh1Yi5jb20vbGV2ZWwvbGV2ZWx1cC9ibG9iL21hc3Rlci9MSUNFTlNFLm1kPlxuICovXG5cbnZhciBleHRlbmQgICAgICAgICA9IHJlcXVpcmUoJ3h0ZW5kJylcbiAgLCBMZXZlbFVQRXJyb3IgICA9IHJlcXVpcmUoJ2xldmVsLWVycm9ycycpLkxldmVsVVBFcnJvclxuICAsIGZvcm1hdCAgICAgICAgID0gcmVxdWlyZSgndXRpbCcpLmZvcm1hdFxuICAsIGRlZmF1bHRPcHRpb25zID0ge1xuICAgICAgICBjcmVhdGVJZk1pc3NpbmcgOiB0cnVlXG4gICAgICAsIGVycm9ySWZFeGlzdHMgICA6IGZhbHNlXG4gICAgICAsIGtleUVuY29kaW5nICAgICA6ICd1dGY4J1xuICAgICAgLCB2YWx1ZUVuY29kaW5nICAgOiAndXRmOCdcbiAgICAgICwgY29tcHJlc3Npb24gICAgIDogdHJ1ZVxuICAgIH1cblxuICAsIGxldmVsZG93blxuXG5mdW5jdGlvbiBnZXRPcHRpb25zIChvcHRpb25zKSB7XG4gIGlmICh0eXBlb2Ygb3B0aW9ucyA9PSAnc3RyaW5nJylcbiAgICBvcHRpb25zID0geyB2YWx1ZUVuY29kaW5nOiBvcHRpb25zIH1cbiAgaWYgKHR5cGVvZiBvcHRpb25zICE9ICdvYmplY3QnKVxuICAgIG9wdGlvbnMgPSB7fVxuICByZXR1cm4gb3B0aW9uc1xufVxuXG5mdW5jdGlvbiBnZXRMZXZlbERPV04gKCkge1xuICBpZiAobGV2ZWxkb3duKVxuICAgIHJldHVybiBsZXZlbGRvd25cblxuICB2YXIgcmVxdWlyZWRWZXJzaW9uICA9IHJlcXVpcmUoJy4uL3BhY2thZ2UuanNvbicpLmRldkRlcGVuZGVuY2llcy5sZXZlbGRvd25cbiAgICAsIGxldmVsZG93blZlcnNpb25cblxuICB0cnkge1xuICAgIGxldmVsZG93blZlcnNpb24gPSByZXF1aXJlKCdsZXZlbGRvd24vcGFja2FnZScpLnZlcnNpb25cbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IHJlcXVpcmVFcnJvcihlKVxuICB9XG5cbiAgaWYgKCFyZXF1aXJlKCdzZW12ZXInKS5zYXRpc2ZpZXMobGV2ZWxkb3duVmVyc2lvbiwgcmVxdWlyZWRWZXJzaW9uKSkge1xuICAgIHRocm93IG5ldyBMZXZlbFVQRXJyb3IoXG4gICAgICAgICdJbnN0YWxsZWQgdmVyc2lvbiBvZiBMZXZlbERPV04gKCdcbiAgICAgICsgbGV2ZWxkb3duVmVyc2lvblxuICAgICAgKyAnKSBkb2VzIG5vdCBtYXRjaCByZXF1aXJlZCB2ZXJzaW9uICgnXG4gICAgICArIHJlcXVpcmVkVmVyc2lvblxuICAgICAgKyAnKSdcbiAgICApXG4gIH1cblxuICB0cnkge1xuICAgIHJldHVybiBsZXZlbGRvd24gPSByZXF1aXJlKCdsZXZlbGRvd24nKVxuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgcmVxdWlyZUVycm9yKGUpXG4gIH1cbn1cblxuZnVuY3Rpb24gcmVxdWlyZUVycm9yIChlKSB7XG4gIHZhciB0ZW1wbGF0ZSA9ICdGYWlsZWQgdG8gcmVxdWlyZSBMZXZlbERPV04gKCVzKS4gVHJ5IGBucG0gaW5zdGFsbCBsZXZlbGRvd25gIGlmIGl0XFwncyBtaXNzaW5nJ1xuICByZXR1cm4gbmV3IExldmVsVVBFcnJvcihmb3JtYXQodGVtcGxhdGUsIGUubWVzc2FnZSkpXG59XG5cbmZ1bmN0aW9uIGRpc3BhdGNoRXJyb3IgKGRiLCBlcnJvciwgY2FsbGJhY2spIHtcbiAgdHlwZW9mIGNhbGxiYWNrID09ICdmdW5jdGlvbicgPyBjYWxsYmFjayhlcnJvcikgOiBkYi5lbWl0KCdlcnJvcicsIGVycm9yKVxufVxuXG5mdW5jdGlvbiBpc0RlZmluZWQgKHYpIHtcbiAgcmV0dXJuIHR5cGVvZiB2ICE9PSAndW5kZWZpbmVkJ1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBkZWZhdWx0T3B0aW9ucyAgOiBkZWZhdWx0T3B0aW9uc1xuICAsIGdldE9wdGlvbnMgICAgICA6IGdldE9wdGlvbnNcbiAgLCBnZXRMZXZlbERPV04gICAgOiBnZXRMZXZlbERPV05cbiAgLCBkaXNwYXRjaEVycm9yICAgOiBkaXNwYXRjaEVycm9yXG4gICwgaXNEZWZpbmVkICAgICAgIDogaXNEZWZpbmVkXG59XG4iLCJtb2R1bGUuZXhwb3J0cz17XG4gIFwiX2FyZ3NcIjogW1xuICAgIFtcbiAgICAgIFwibGV2ZWx1cEB+MS4zLjBcIixcbiAgICAgIFwiL2hvbWUvbmVydm91cy91bmlzeW5jL3Byb2plY3RzL211bHRpcGxleGVkL2h5cGVycGxhdGUvbm9kZV9tb2R1bGVzL2xldmVsLXBhY2thZ2VyXCJcbiAgICBdXG4gIF0sXG4gIFwiX2Zyb21cIjogXCJsZXZlbHVwQD49MS4zLjAgPDEuNC4wXCIsXG4gIFwiX2lkXCI6IFwibGV2ZWx1cEAxLjMuMVwiLFxuICBcIl9pbkNhY2hlXCI6IHRydWUsXG4gIFwiX2luc3RhbGxhYmxlXCI6IHRydWUsXG4gIFwiX2xvY2F0aW9uXCI6IFwiL2xldmVsdXBcIixcbiAgXCJfbm9kZVZlcnNpb25cIjogXCI0LjIuMlwiLFxuICBcIl9ucG1Vc2VyXCI6IHtcbiAgICBcImVtYWlsXCI6IFwicmFscGh0aGVuaW5qYUByaXNldXAubmV0XCIsXG4gICAgXCJuYW1lXCI6IFwicmFscGh0aGVuaW5qYVwiXG4gIH0sXG4gIFwiX25wbVZlcnNpb25cIjogXCIzLjUuMFwiLFxuICBcIl9waGFudG9tQ2hpbGRyZW5cIjoge30sXG4gIFwiX3JlcXVlc3RlZFwiOiB7XG4gICAgXCJuYW1lXCI6IFwibGV2ZWx1cFwiLFxuICAgIFwicmF3XCI6IFwibGV2ZWx1cEB+MS4zLjBcIixcbiAgICBcInJhd1NwZWNcIjogXCJ+MS4zLjBcIixcbiAgICBcInNjb3BlXCI6IG51bGwsXG4gICAgXCJzcGVjXCI6IFwiPj0xLjMuMCA8MS40LjBcIixcbiAgICBcInR5cGVcIjogXCJyYW5nZVwiXG4gIH0sXG4gIFwiX3JlcXVpcmVkQnlcIjogW1xuICAgIFwiL2xldmVsLXBhY2thZ2VyXCIsXG4gICAgXCIvbWVtZGJcIlxuICBdLFxuICBcIl9yZXNvbHZlZFwiOiBcImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2xldmVsdXAvLS9sZXZlbHVwLTEuMy4xLnRnelwiLFxuICBcIl9zaGFzdW1cIjogXCI4MDMwNzU4YmIxYjFkYWZkYjcxYmZiNTVmZmYwY2FhMjc0MGNiODQ2XCIsXG4gIFwiX3Nocmlua3dyYXBcIjogbnVsbCxcbiAgXCJfc3BlY1wiOiBcImxldmVsdXBAfjEuMy4wXCIsXG4gIFwiX3doZXJlXCI6IFwiL2hvbWUvbmVydm91cy91bmlzeW5jL3Byb2plY3RzL211bHRpcGxleGVkL2h5cGVycGxhdGUvbm9kZV9tb2R1bGVzL2xldmVsLXBhY2thZ2VyXCIsXG4gIFwiYnJvd3NlclwiOiB7XG4gICAgXCJsZXZlbGRvd25cIjogZmFsc2UsXG4gICAgXCJsZXZlbGRvd24vcGFja2FnZVwiOiBmYWxzZSxcbiAgICBcInNlbXZlclwiOiBmYWxzZVxuICB9LFxuICBcImJ1Z3NcIjoge1xuICAgIFwidXJsXCI6IFwiaHR0cHM6Ly9naXRodWIuY29tL2xldmVsL2xldmVsdXAvaXNzdWVzXCJcbiAgfSxcbiAgXCJjb250cmlidXRvcnNcIjogW1xuICAgIHtcbiAgICAgIFwibmFtZVwiOiBcIkp1bGlhbiBHcnViZXJcIixcbiAgICAgIFwiZW1haWxcIjogXCJqdWxpYW5AanVsaWFuZ3J1YmVyLmNvbVwiLFxuICAgICAgXCJ1cmxcIjogXCJodHRwczovL2dpdGh1Yi5jb20vanVsaWFuZ3J1YmVyXCJcbiAgICB9LFxuICAgIHtcbiAgICAgIFwibmFtZVwiOiBcIlJvZCBWYWdnXCIsXG4gICAgICBcImVtYWlsXCI6IFwickB2YS5nZ1wiLFxuICAgICAgXCJ1cmxcIjogXCJodHRwczovL2dpdGh1Yi5jb20vcnZhZ2dcIlxuICAgIH0sXG4gICAge1xuICAgICAgXCJuYW1lXCI6IFwiSmFrZSBWZXJiYXRlblwiLFxuICAgICAgXCJlbWFpbFwiOiBcInJheW5vczJAZ21haWwuY29tXCIsXG4gICAgICBcInVybFwiOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9yYXlub3NcIlxuICAgIH0sXG4gICAge1xuICAgICAgXCJuYW1lXCI6IFwiRG9taW5pYyBUYXJyXCIsXG4gICAgICBcImVtYWlsXCI6IFwiZG9taW5pYy50YXJyQGdtYWlsLmNvbVwiLFxuICAgICAgXCJ1cmxcIjogXCJodHRwczovL2dpdGh1Yi5jb20vZG9taW5pY3RhcnJcIlxuICAgIH0sXG4gICAge1xuICAgICAgXCJuYW1lXCI6IFwiTWF4IE9nZGVuXCIsXG4gICAgICBcImVtYWlsXCI6IFwibWF4QG1heG9nZGVuLmNvbVwiLFxuICAgICAgXCJ1cmxcIjogXCJodHRwczovL2dpdGh1Yi5jb20vbWF4b2dkZW5cIlxuICAgIH0sXG4gICAge1xuICAgICAgXCJuYW1lXCI6IFwiTGFycy1NYWdudXMgU2tvZ1wiLFxuICAgICAgXCJlbWFpbFwiOiBcInJhbHBodGhlbmluamFAcmlzZXVwLm5ldFwiLFxuICAgICAgXCJ1cmxcIjogXCJodHRwczovL2dpdGh1Yi5jb20vcmFscGh0aGVuaW5qYVwiXG4gICAgfSxcbiAgICB7XG4gICAgICBcIm5hbWVcIjogXCJEYXZpZCBCasO2cmtsdW5kXCIsXG4gICAgICBcImVtYWlsXCI6IFwiZGF2aWQuYmpvcmtsdW5kQGdtYWlsLmNvbVwiLFxuICAgICAgXCJ1cmxcIjogXCJodHRwczovL2dpdGh1Yi5jb20va2VzbGFcIlxuICAgIH0sXG4gICAge1xuICAgICAgXCJuYW1lXCI6IFwiSm9obiBDaGVzbGV5XCIsXG4gICAgICBcImVtYWlsXCI6IFwiam9obkBjaGVzbC5lc1wiLFxuICAgICAgXCJ1cmxcIjogXCJodHRwczovL2dpdGh1Yi5jb20vY2hlc2xlcy9cIlxuICAgIH0sXG4gICAge1xuICAgICAgXCJuYW1lXCI6IFwiUGFvbG8gRnJhZ29tZW5pXCIsXG4gICAgICBcImVtYWlsXCI6IFwicGFvbG9AYXN5bmMubHlcIixcbiAgICAgIFwidXJsXCI6IFwiaHR0cHM6Ly9naXRodWIuY29tL2hpajFueFwiXG4gICAgfSxcbiAgICB7XG4gICAgICBcIm5hbWVcIjogXCJBbnRvbiBXaGFsbGV5XCIsXG4gICAgICBcImVtYWlsXCI6IFwiYW50b24ud2hhbGxleUBuZWFyZm9ybS5jb21cIixcbiAgICAgIFwidXJsXCI6IFwiaHR0cHM6Ly9naXRodWIuY29tL05vOVwiXG4gICAgfSxcbiAgICB7XG4gICAgICBcIm5hbWVcIjogXCJNYXR0ZW8gQ29sbGluYVwiLFxuICAgICAgXCJlbWFpbFwiOiBcIm1hdHRlby5jb2xsaW5hQGdtYWlsLmNvbVwiLFxuICAgICAgXCJ1cmxcIjogXCJodHRwczovL2dpdGh1Yi5jb20vbWNvbGxpbmFcIlxuICAgIH0sXG4gICAge1xuICAgICAgXCJuYW1lXCI6IFwiUGVkcm8gVGVpeGVpcmFcIixcbiAgICAgIFwiZW1haWxcIjogXCJwZWRyby50ZWl4ZWlyYUBnbWFpbC5jb21cIixcbiAgICAgIFwidXJsXCI6IFwiaHR0cHM6Ly9naXRodWIuY29tL3BndGVcIlxuICAgIH0sXG4gICAge1xuICAgICAgXCJuYW1lXCI6IFwiSmFtZXMgSGFsbGlkYXlcIixcbiAgICAgIFwiZW1haWxcIjogXCJtYWlsQHN1YnN0YWNrLm5ldFwiLFxuICAgICAgXCJ1cmxcIjogXCJodHRwczovL2dpdGh1Yi5jb20vc3Vic3RhY2tcIlxuICAgIH0sXG4gICAge1xuICAgICAgXCJuYW1lXCI6IFwiSmFycmV0dCBDcnVnZXJcIixcbiAgICAgIFwiZW1haWxcIjogXCJqY3J1Z3p6QGdtYWlsLmNvbVwiLFxuICAgICAgXCJ1cmxcIjogXCJodHRwczovL2dpdGh1Yi5jb20vamNydWd6elwiXG4gICAgfVxuICBdLFxuICBcImRlcGVuZGVuY2llc1wiOiB7XG4gICAgXCJkZWZlcnJlZC1sZXZlbGRvd25cIjogXCJ+MS4yLjFcIixcbiAgICBcImxldmVsLWNvZGVjXCI6IFwifjYuMS4wXCIsXG4gICAgXCJsZXZlbC1lcnJvcnNcIjogXCJ+MS4wLjNcIixcbiAgICBcImxldmVsLWl0ZXJhdG9yLXN0cmVhbVwiOiBcIn4xLjMuMFwiLFxuICAgIFwicHJyXCI6IFwifjEuMC4xXCIsXG4gICAgXCJzZW12ZXJcIjogXCJ+NS4xLjBcIixcbiAgICBcInh0ZW5kXCI6IFwifjQuMC4wXCJcbiAgfSxcbiAgXCJkZXNjcmlwdGlvblwiOiBcIkZhc3QgJiBzaW1wbGUgc3RvcmFnZSAtIGEgTm9kZS5qcy1zdHlsZSBMZXZlbERCIHdyYXBwZXJcIixcbiAgXCJkZXZEZXBlbmRlbmNpZXNcIjoge1xuICAgIFwiYXN5bmNcIjogXCJ+MS41LjBcIixcbiAgICBcImJ1c3Rlcm1vdmVcIjogXCJ+MS4wLjBcIixcbiAgICBcImRlbGF5ZWRcIjogXCJ+MS4wLjFcIixcbiAgICBcImZhdWNldFwiOiBcIn4wLjAuMVwiLFxuICAgIFwibGV2ZWxkb3duXCI6IFwiXjEuMS4wXCIsXG4gICAgXCJtZW1kb3duXCI6IFwifjEuMS4wXCIsXG4gICAgXCJtc2dwYWNrLWpzXCI6IFwifjAuMy4wXCIsXG4gICAgXCJyZWZlcmVlXCI6IFwifjEuMi4wXCIsXG4gICAgXCJyaW1yYWZcIjogXCJ+Mi40LjNcIixcbiAgICBcInNsb3ctc3RyZWFtXCI6IFwiMC4wLjRcIixcbiAgICBcInRhcFwiOiBcIn4yLjMuMVwiLFxuICAgIFwidGFwZVwiOiBcIn40LjIuMVwiXG4gIH0sXG4gIFwiZGlyZWN0b3JpZXNcIjoge30sXG4gIFwiZGlzdFwiOiB7XG4gICAgXCJzaGFzdW1cIjogXCI4MDMwNzU4YmIxYjFkYWZkYjcxYmZiNTVmZmYwY2FhMjc0MGNiODQ2XCIsXG4gICAgXCJ0YXJiYWxsXCI6IFwiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9sZXZlbHVwLy0vbGV2ZWx1cC0xLjMuMS50Z3pcIlxuICB9LFxuICBcImdpdEhlYWRcIjogXCI0MGJkNjY4NzI5NzQxNDBjNzlhNzRkOTQxMWI5OTJkZGZmYTkyNmE0XCIsXG4gIFwiaG9tZXBhZ2VcIjogXCJodHRwczovL2dpdGh1Yi5jb20vbGV2ZWwvbGV2ZWx1cFwiLFxuICBcImtleXdvcmRzXCI6IFtcbiAgICBcImRhdGFiYXNlXCIsXG4gICAgXCJkYlwiLFxuICAgIFwianNvblwiLFxuICAgIFwibGV2ZWxkYlwiLFxuICAgIFwic3RvcmFnZVwiLFxuICAgIFwic3RvcmVcIixcbiAgICBcInN0cmVhbVwiXG4gIF0sXG4gIFwibGljZW5zZVwiOiBcIk1JVFwiLFxuICBcIm1haW5cIjogXCJsaWIvbGV2ZWx1cC5qc1wiLFxuICBcIm1haW50YWluZXJzXCI6IFtcbiAgICB7XG4gICAgICBcIm5hbWVcIjogXCJydmFnZ1wiLFxuICAgICAgXCJlbWFpbFwiOiBcInJvZEB2YWdnLm9yZ1wiXG4gICAgfSxcbiAgICB7XG4gICAgICBcIm5hbWVcIjogXCJyYWxwaHRoZW5pbmphXCIsXG4gICAgICBcImVtYWlsXCI6IFwicmFscGh0aGVuaW5qYUByaXNldXAubmV0XCJcbiAgICB9LFxuICAgIHtcbiAgICAgIFwibmFtZVwiOiBcImp1bGlhbmdydWJlclwiLFxuICAgICAgXCJlbWFpbFwiOiBcImp1bGlhbkBqdWxpYW5ncnViZXIuY29tXCJcbiAgICB9XG4gIF0sXG4gIFwibmFtZVwiOiBcImxldmVsdXBcIixcbiAgXCJvcHRpb25hbERlcGVuZGVuY2llc1wiOiB7fSxcbiAgXCJyZWFkbWVcIjogXCJFUlJPUjogTm8gUkVBRE1FIGRhdGEgZm91bmQhXCIsXG4gIFwicmVwb3NpdG9yeVwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiZ2l0XCIsXG4gICAgXCJ1cmxcIjogXCJnaXQraHR0cHM6Ly9naXRodWIuY29tL2xldmVsL2xldmVsdXAuZ2l0XCJcbiAgfSxcbiAgXCJzY3JpcHRzXCI6IHtcbiAgICBcInRlc3RcIjogXCJ0YXBlIHRlc3QvKi10ZXN0LmpzIHwgZmF1Y2V0XCJcbiAgfSxcbiAgXCJ2ZXJzaW9uXCI6IFwiMS4zLjFcIlxufVxuIiwiZXhwb3J0cy5wYWNrID0gcGFjaztcbmV4cG9ydHMudW5wYWNrID0gdW5wYWNrO1xuXG5mdW5jdGlvbiBwYWNrIChuLCBlbmMpIHtcbiAgICBuID0gTWF0aC5mbG9vcihuKTtcbiAgICBpZiAobiA8IDAgfHwgbiA9PT0gSW5maW5pdHkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgXG4gICAgdmFyIGJ5dGVzO1xuICAgIHZhciBtYXggPSAyNTE7XG4gICAgdmFyIHggPSBuIC0gbWF4O1xuICAgIFxuICAgIGlmIChuIDwgbWF4KSB7XG4gICAgICAgIGJ5dGVzID0gWyBuIF07XG4gICAgfVxuICAgIGVsc2UgaWYgKHggPCAyNTYpIHtcbiAgICAgICAgYnl0ZXMgPSBbIG1heCwgeCBdO1xuICAgIH1cbiAgICBlbHNlIGlmICh4IDwgMjU2KjI1Nikge1xuICAgICAgICBieXRlcyA9IFsgbWF4ICsgMSwgTWF0aC5mbG9vcih4IC8gMjU2KSwgeCAlIDI1NiBdO1xuICAgIH1cbiAgICBlbHNlIGlmICh4IDwgMjU2KjI1NioyNTYpIHtcbiAgICAgICAgYnl0ZXMgPSBbXG4gICAgICAgICAgICBtYXggKyAyLFxuICAgICAgICAgICAgTWF0aC5mbG9vcih4IC8gMjU2IC8gMjU2KSxcbiAgICAgICAgICAgIE1hdGguZmxvb3IoeCAvIDI1NikgJSAyNTYsXG4gICAgICAgICAgICB4ICUgMjU2XG4gICAgICAgIF07XG4gICAgfVxuICAgIGVsc2UgaWYgKHggPCAyNTYqMjU2KjI1NioyNTYpIHtcbiAgICAgICAgYnl0ZXMgPSBbXG4gICAgICAgICAgICBtYXggKyAzLFxuICAgICAgICAgICAgTWF0aC5mbG9vcih4IC8gMjU2IC8gMjU2IC8gMjU2KSxcbiAgICAgICAgICAgIE1hdGguZmxvb3IoeCAvIDI1NiAvIDI1NikgJSAyNTYsXG4gICAgICAgICAgICBNYXRoLmZsb29yKHggLyAyNTYpICUgMjU2LFxuICAgICAgICAgICAgeCAlIDI1NlxuICAgICAgICBdO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdmFyIGV4cCA9IE1hdGguZmxvb3IoTWF0aC5sb2coeCkgLyBNYXRoLmxvZygyKSkgLSAzMjtcbiAgICAgICAgYnl0ZXMgPSBbIDI1NSBdO1xuICAgICAgICBieXRlcy5wdXNoLmFwcGx5KGJ5dGVzLCBwYWNrKGV4cCkpO1xuICAgICAgICB2YXIgcmVzID0geCAvIE1hdGgucG93KDIsIGV4cCAtIDExKTtcbiAgICAgICAgYnl0ZXMucHVzaC5hcHBseShieXRlcywgYnl0ZXNPZih4IC8gTWF0aC5wb3coMiwgZXhwIC0gMTEpKSk7XG4gICAgfVxuICAgIGlmIChlbmMgPT09IHVuZGVmaW5lZCB8fCBlbmMgPT09ICdhcnJheScpIHJldHVybiBieXRlcztcbiAgICBpZiAoZW5jID09PSAnaGV4JykgcmV0dXJuIGVuY29kZUhleChieXRlcyk7XG59O1xuXG5mdW5jdGlvbiB1bnBhY2sgKHhzKSB7XG4gICAgaWYgKHR5cGVvZiB4cyA9PT0gJ3N0cmluZycpIHhzID0gZGVjb2RlSGV4KHhzKTtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoeHMpKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIFxuICAgIGlmICh4cy5sZW5ndGggPT09IDEgJiYgeHNbMF0gPCAyNTEpIHtcbiAgICAgICAgcmV0dXJuIHhzWzBdO1xuICAgIH1cbiAgICBpZiAoeHMubGVuZ3RoID09PSAyICYmIHhzWzBdID09PSAyNTEpIHtcbiAgICAgICAgcmV0dXJuIDI1MSArIHhzWzFdO1xuICAgIH1cbiAgICBpZiAoeHMubGVuZ3RoID09PSAzICYmIHhzWzBdID09PSAyNTIpIHtcbiAgICAgICAgcmV0dXJuIDI1MSArIDI1NiAqIHhzWzFdICsgeHNbMl07XG4gICAgfVxuICAgIGlmICh4cy5sZW5ndGggPT09IDQgJiYgeHNbMF0gPT09IDI1Mykge1xuICAgICAgICByZXR1cm4gMjUxICsgMjU2ICogMjU2ICogeHNbMV0gKyAyNTYgKiB4c1syXSArIHhzWzNdO1xuICAgIH1cbiAgICBpZiAoeHMubGVuZ3RoID09PSA1ICYmIHhzWzBdID09PSAyNTQpIHtcbiAgICAgICAgcmV0dXJuIDI1MSArIDI1NiAqIDI1NiAqIDI1NiAqIHhzWzFdXG4gICAgICAgICAgICArIDI1NiAqIDI1NiAqIHhzWzJdICsgMjU2ICogeHNbM10gKyB4c1s0XVxuICAgICAgICA7XG4gICAgfVxuICAgIGlmICh4cy5sZW5ndGggPiA1ICYmIHhzWzBdID09PSAyNTUpIHtcbiAgICAgICAgdmFyIG0gPSAwLCB4ID0gMTtcbiAgICAgICAgdmFyIHBpdm90ID0gTWF0aC5tYXgoMiwgeHMubGVuZ3RoIC0gNik7XG4gICAgICAgIGZvciAodmFyIGkgPSB4cy5sZW5ndGggLSAxOyBpID49IHBpdm90OyBpLS0pIHtcbiAgICAgICAgICAgIG0gKz0geCAqIHhzW2ldO1xuICAgICAgICAgICAgeCAqPSAyNTY7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHhzWzFdICsgMzIgPCAyNTEpIHtcbiAgICAgICAgICAgIHZhciBuID0gdW5wYWNrKFsgeHNbMV0gKyAzMiBdKSAtIDExO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHhzWzBdID09PSAyNTUgJiYgeHNbMV0gPCAyNTEpIHtcbiAgICAgICAgICAgIHZhciBuID0geHNbMV0gKyAyMTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChwaXZvdCA9PT0gMykge1xuICAgICAgICAgICAgdmFyIG4gPSB1bnBhY2soWyB4c1sxXSwgeHNbMl0gKyAyMSBdKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChwaXZvdCA9PT0gNCkge1xuICAgICAgICAgICAgdmFyIG4gPSB1bnBhY2soWyB4c1sxXSwgeHNbMl0sIHhzWzNdICsgMjEgXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIDI1MSArIG0gLyBNYXRoLnBvdygyLCAzMiAtIG4pO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBlbmNvZGVIZXgoYnl0ZXMpIHtcbiAgICB2YXIgcyA9ICcnO1xuICAgIGZvciAodmFyIGkgPSAwLCBsID0gYnl0ZXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIHZhciBiID0gYnl0ZXNbaV07XG4gICAgICAgIHZhciBjID0gYi50b1N0cmluZygxNik7XG4gICAgICAgIGlmIChiIDwgMTYpIGMgPSAnMCcgKyBjO1xuICAgICAgICBzICs9IGM7XG4gICAgfVxuICAgIHJldHVybiBzO1xufVxuXG5mdW5jdGlvbiBkZWNvZGVIZXgoaGV4KSB7XG4gICAgdmFyIGJ5dGVzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBoZXgubGVuZ3RoOyBpID0gaSsyKSB7XG4gICAgICAgIGJ5dGVzLnB1c2gocGFyc2VJbnQoaGV4W2ldICsgaGV4W2krMV0sIDE2KSk7XG4gICAgfVxuICAgIHJldHVybiBieXRlcztcbn1cblxuZnVuY3Rpb24gYnl0ZXNPZiAoeCkge1xuICAgIHggPSBNYXRoLmZsb29yKHgpO1xuICAgIHZhciBieXRlcyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwLCBkID0gMTsgaSA8IDY7IGkrKywgZCAqPSAyNTYpIHtcbiAgICAgICAgYnl0ZXMudW5zaGlmdChNYXRoLmZsb29yKHggLyBkKSAlIDI1Nik7XG4gICAgfVxuICAgIHJldHVybiBieXRlcztcbn1cbiIsIihmdW5jdGlvbiAocm9vdCwgZmFjdG9yeSkge1xuXHRpZiAodHlwZW9mIHByb2Nlc3MgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIHByb2Nlc3Muc3Rkb3V0ID09PSBcInVuZGVmaW5lZFwiKSB7XG5cdFx0cHJvY2Vzcy5zdGRlcnIgPSBwcm9jZXNzLnN0ZG91dCA9IHsgd3JpdGU6IGZ1bmN0aW9uKCkgeyB9IH07XG5cdH1cblx0aWYgKHR5cGVvZiBkZWZpbmUgPT09IFwiZnVuY3Rpb25cIiAmJiBkZWZpbmUuYW1kKSB7XG5cdFx0ZGVmaW5lKFtcImV4cG9ydHNcIiwgXCJsaWJzb2RpdW1cIl0sIGZhY3RvcnkpO1xuXHR9IGVsc2UgaWYgKHR5cGVvZiBleHBvcnRzICE9PSBcInVuZGVmaW5lZFwiKSB7XG5cdFx0ZmFjdG9yeShleHBvcnRzLCByZXF1aXJlKFwibGlic29kaXVtXCIpKTtcblx0fSBlbHNlIHtcblx0XHR2YXIgY2IgPSByb290LnNvZGl1bSAmJiByb290LnNvZGl1bS5vbmxvYWQ7XG5cdFx0ZmFjdG9yeSgocm9vdC5zb2RpdW0gPSB7fSksIHJvb3QubGlic29kaXVtKTtcblx0XHRpZiAodHlwZW9mIGNiID09PSBcImZ1bmN0aW9uXCIpIHtcblx0XHRcdGNiKHJvb3Quc29kaXVtKTtcblx0XHR9XG5cdH1cbn0odGhpcywgZnVuY3Rpb24gKGV4cG9ydHMsIGxpYnNvZGl1bSkge1xuXHRcInVzZSBzdHJpY3RcIjtcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcblxuXHR2YXIgb3V0cHV0X2Zvcm1hdCA9IFwidWludDhhcnJheVwiO1xuXG5cdGxpYnNvZGl1bS5fc29kaXVtX2luaXQoKTtcblxuXHQvLyBMaXN0IG9mIGZ1bmN0aW9ucyBhbmQgY29uc3RhbnRzIGRlZmluZWQgaW4gdGhlIHdyYXBwZWQgbGlic29kaXVtXG5cdGZ1bmN0aW9uIHN5bWJvbHMoKSB7XG5cdFx0cmV0dXJuIE9iamVjdC5rZXlzKGV4cG9ydHMpLnNvcnQoKTtcblx0fVxuXG5cdGZ1bmN0aW9uIGluY3JlbWVudChieXRlcykge1xuXHRcdGlmICghIGJ5dGVzIGluc3RhbmNlb2YgVWludDhBcnJheSkge1xuXHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcihcIk9ubHkgVWludDhBcnJheSBpbnN0YW5jZXMgY2FuIGJlIGluY3JlbWVudGVkXCIpO1xuXHRcdH1cbiAgICAgICAgdmFyIGMgPSAxIDw8IDg7XG5cdFx0Zm9yICh2YXIgaSA9IDAgfCAwLCBqID0gYnl0ZXMubGVuZ3RoOyBpIDwgajsgaSsrKSB7XG4gICAgICAgICAgICBjID4+PSA4O1xuICAgICAgICAgICAgYyArPSBieXRlc1tpXTtcblx0XHRcdGJ5dGVzW2ldID0gYyAmIDB4ZmY7XG5cdFx0fVxuXHR9XG5cblx0ZnVuY3Rpb24gbWVtemVybyhieXRlcykge1xuXHRcdGlmICghIGJ5dGVzIGluc3RhbmNlb2YgVWludDhBcnJheSkge1xuXHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcihcIk9ubHkgVWludDhBcnJheSBpbnN0YW5jZXMgY2FuIGJlIHdpcGVkXCIpO1xuXHRcdH1cblx0XHRmb3IgKHZhciBpID0gMCB8IDAsIGogPSBieXRlcy5sZW5ndGg7IGkgPCBqOyBpKyspIHtcblx0XHRcdGJ5dGVzW2ldID0gMDtcblx0XHR9XG5cdH1cblxuXHRmdW5jdGlvbiBtZW1jbXAoYjEsIGIyKSB7XG5cdFx0aWYgKCEoYjEgaW5zdGFuY2VvZiBVaW50OEFycmF5ICYmIGIyIGluc3RhbmNlb2YgVWludDhBcnJheSkpIHtcblx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoXCJPbmx5IFVpbnQ4QXJyYXkgaW5zdGFuY2VzIGNhbiBiZSBjb21wYXJlZFwiKTtcblx0XHR9XG5cdFx0aWYgKGIxLmxlbmd0aCAhPT0gYjIubGVuZ3RoKSB7XG5cdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKFwiT25seSBpbnN0YW5jZXMgb2YgaWRlbnRpY2FsIGxlbmd0aCBjYW4gYmUgY29tcGFyZWRcIik7XG5cdFx0fVxuXHRcdGZvciAodmFyIGQgPSAwIHwgMCwgaSA9IDAgfCAwLCBqID0gYjEubGVuZ3RoOyBpIDwgajsgaSsrKSB7XG5cdFx0XHRkIHw9IGIxW2ldIF4gYjJbaV07XG5cdFx0fVxuXHRcdHJldHVybiBkID09PSAwO1xuXHR9XG5cblx0ZnVuY3Rpb24gY29tcGFyZShiMSwgYjIpIHtcblx0XHRpZiAoIShiMSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkgJiYgYjIgaW5zdGFuY2VvZiBVaW50OEFycmF5KSkge1xuXHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcihcIk9ubHkgVWludDhBcnJheSBpbnN0YW5jZXMgY2FuIGJlIGNvbXBhcmVkXCIpO1xuXHRcdH1cblx0XHRpZiAoYjEubGVuZ3RoICE9PSBiMi5sZW5ndGgpIHtcblx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoXCJPbmx5IGluc3RhbmNlcyBvZiBpZGVudGljYWwgbGVuZ3RoIGNhbiBiZSBjb21wYXJlZFwiKTtcblx0XHR9XG5cdFx0Zm9yICh2YXIgZ3QgPSAwIHwgMCwgZXEgPSAxIHwgMSwgaSA9IGIxLmxlbmd0aDsgaS0tID4gMDspIHtcblx0XHRcdGd0IHw9ICgoYjJbaV0gLSBiMVtpXSkgPj4gOCkgJiBlcTtcblx0XHRcdGVxICY9ICgoYjJbaV0gXiBiMVtpXSkgLSAxKSA+PiA4O1xuXHRcdH1cblx0XHRyZXR1cm4gKGd0ICsgZ3QgKyBlcSkgLSAxO1xuXHR9XG5cblx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblx0Ly8gQ29kZWNzXG5cblx0ZnVuY3Rpb24gZnJvbV9zdHJpbmcoc3RyKSB7XG5cdFx0aWYgKHR5cGVvZiBUZXh0RW5jb2RlciA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdFx0XHRyZXR1cm4gbmV3IFRleHRFbmNvZGVyKFwidXRmLThcIikuZW5jb2RlKHN0cik7XG5cdFx0fVxuXHRcdHN0ciA9IHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChzdHIpKTtcblx0XHR2YXIgYnl0ZXMgPSBuZXcgVWludDhBcnJheShzdHIubGVuZ3RoKTtcblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuXHRcdFx0Ynl0ZXNbaV0gPSBzdHIuY2hhckNvZGVBdChpKTtcblx0XHR9XG5cdFx0cmV0dXJuIGJ5dGVzO1xuXHR9XG5cblx0ZnVuY3Rpb24gdG9fc3RyaW5nKGJ5dGVzKSB7XG5cdFx0aWYgKHR5cGVvZiBUZXh0RGVjb2RlciA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdFx0XHRyZXR1cm4gbmV3IFRleHREZWNvZGVyKFwidXRmLThcIiwge2ZhdGFsOiB0cnVlfSkuZGVjb2RlKGJ5dGVzKTtcblx0XHR9XG5cblx0XHR0cnkge1xuXHRcdFx0cmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChlc2NhcGUoU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBieXRlcykpKTtcblx0XHR9XG5cdFx0Y2F0Y2ggKF8pIHtcblx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoXCJUaGUgZW5jb2RlZCBkYXRhIHdhcyBub3QgdmFsaWQuXCIpO1xuXHRcdH1cblx0fVxuXG5cdGZ1bmN0aW9uIGZyb21faGV4KHN0cikge1xuXHRcdGlmICghaXNfaGV4KHN0cikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJUaGUgcHJvdmlkZWQgc3RyaW5nIGRvZXNuJ3QgbG9vayBsaWtlIGhleCBkYXRhXCIpO1xuXHRcdHZhciByZXN1bHQgPSBuZXcgVWludDhBcnJheShzdHIubGVuZ3RoIC8gMik7XG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpICs9IDIpIHtcblx0XHRcdHJlc3VsdFtpID4+PiAxXSA9IHBhcnNlSW50KHN0ci5zdWJzdHIoaSwgMiksIDE2KTtcblx0XHR9XG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdGZ1bmN0aW9uIHRvX2hleChieXRlcykge1xuXHRcdHZhciBzdHIgPSBcIlwiLCBiLCBjLCB4O1xuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdGMgPSBieXRlc1tpXSAmIDB4Zjtcblx0XHRcdGIgPSBieXRlc1tpXSA+Pj4gNDtcblx0XHRcdHggPSAoODcgKyBjICsgKCgoYyAtIDEwKSA+PiA4KSAmIH4zOCkpIDw8IDggfFxuXHRcdFx0ICAgICg4NyArIGIgKyAoKChiIC0gMTApID4+IDgpICYgfjM4KSk7XG5cdFx0XHRzdHIgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSh4ICYgMHhmZikgKyBTdHJpbmcuZnJvbUNoYXJDb2RlKHggPj4+IDgpO1xuXHRcdH1cblx0XHRyZXR1cm4gc3RyO1xuXHR9XG5cblx0ZnVuY3Rpb24gaXNfaGV4KHN0cikge1xuXHRcdHJldHVybiAodHlwZW9mIHN0ciA9PT0gXCJzdHJpbmdcIiAmJiAvXlswLTlhLWZdKyQvaS50ZXN0KHN0cikgJiYgc3RyLmxlbmd0aCAlIDIgPT09IDApO1xuXHR9XG5cblx0ZnVuY3Rpb24gZnJvbV9iYXNlNjQoc0Jhc2U2NCwgbkJsb2Nrc1NpemUpIHtcblx0XHRmdW5jdGlvbiBfYjY0VG9VaW50NihuQ2hyKSB7XG5cdFx0XHRyZXR1cm4gbkNociA+IDY0ICYmIG5DaHIgPCA5MSA/XG5cdFx0XHRcdG5DaHIgLSA2NSA6IG5DaHIgPiA5NiAmJiBuQ2hyIDwgMTIzID9cblx0XHRcdFx0bkNociAtIDcxIDogbkNociA+IDQ3ICYmIG5DaHIgPCA1OCA/XG5cdFx0XHRcdG5DaHIgKyA0IDogbkNociA9PT0gNDMgP1xuXHRcdFx0XHQ2MiA6IG5DaHIgPT09IDQ3ID9cblx0XHRcdFx0NjMgOlxuXHRcdFx0XHQwO1xuXHRcdH1cblx0XHR2YXJcblx0XHRcdHNCNjRFbmMgPSBzQmFzZTY0LnJlcGxhY2UoL1teQS1aYS16MC05XFwrXFwvXS9nLCBcIlwiKSxcblx0XHRcdG5JbkxlbiA9IHNCNjRFbmMubGVuZ3RoLFxuXHRcdFx0bk91dExlbiA9IG5CbG9ja3NTaXplID8gTWF0aC5jZWlsKChuSW5MZW4gKiAzICsgMSA+PiAyKSAvIG5CbG9ja3NTaXplKSAqIG5CbG9ja3NTaXplIDogbkluTGVuICogMyArIDEgPj4gMixcblx0XHRcdHRhQnl0ZXMgPSBuZXcgVWludDhBcnJheShuT3V0TGVuKTtcblx0XHRmb3IgKHZhciBuTW9kMywgbk1vZDQsIG5VaW50MjQgPSAwLCBuT3V0SWR4ID0gMCwgbkluSWR4ID0gMDsgbkluSWR4IDwgbkluTGVuOyBuSW5JZHgrKykge1xuXHRcdFx0bk1vZDQgPSBuSW5JZHggJiAzO1xuXHRcdFx0blVpbnQyNCB8PSBfYjY0VG9VaW50NihzQjY0RW5jLmNoYXJDb2RlQXQobkluSWR4KSkgPDwgMTggLSA2ICogbk1vZDQ7XG5cdFx0XHRpZiAobk1vZDQgPT09IDMgfHwgbkluTGVuIC0gbkluSWR4ID09PSAxKSB7XG5cdFx0XHRcdGZvciAobk1vZDMgPSAwOyBuTW9kMyA8IDMgJiYgbk91dElkeCA8IG5PdXRMZW47IG5Nb2QzKyssIG5PdXRJZHgrKykge1xuXHRcdFx0XHRcdHRhQnl0ZXNbbk91dElkeF0gPSBuVWludDI0ID4+PiAoMTYgPj4+IG5Nb2QzICYgMjQpICYgMjU1O1xuXHRcdFx0XHR9XG5cdFx0XHRcdG5VaW50MjQgPSAwO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gdGFCeXRlcztcblx0fVxuXG5cdGZ1bmN0aW9uIHRvX2Jhc2U2NChhQnl0ZXMsIG5vTmV3TGluZSkge1xuXHRcdGZ1bmN0aW9uIF91aW50NlRvQjY0KG5VaW50Nikge1xuXHRcdFx0cmV0dXJuIG5VaW50NiA8IDI2ID9cblx0XHRcdFx0blVpbnQ2ICsgNjUgOiBuVWludDYgPCA1MiA/XG5cdFx0XHRcdG5VaW50NiArIDcxIDogblVpbnQ2IDwgNjIgP1xuXHRcdFx0XHRuVWludDYgLSA0IDogblVpbnQ2ID09PSA2MiA/XG5cdFx0XHRcdDQzIDogblVpbnQ2ID09PSA2MyA/XG5cdFx0XHRcdDQ3IDpcblx0XHRcdFx0NjU7XG5cdFx0fVxuXHRcdGlmICh0eXBlb2YgYUJ5dGVzID09PSBcInN0cmluZ1wiKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXhjZXB0aW9uKFwiaW5wdXQgaGFzIHRvIGJlIGFuIGFycmF5XCIpO1xuXHRcdH1cblx0XHR2YXIgbk1vZDMgPSAyLFxuXHRcdFx0c0I2NEVuYyA9IFwiXCI7XG5cdFx0Zm9yICh2YXIgbkxlbiA9IGFCeXRlcy5sZW5ndGgsIG5VaW50MjQgPSAwLCBuSWR4ID0gMDsgbklkeCA8IG5MZW47IG5JZHgrKykge1xuXHRcdFx0bk1vZDMgPSBuSWR4ICUgMztcblx0XHRcdGlmIChuSWR4ID4gMCAmJiAobklkeCAqIDQgLyAzKSAlIDc2ID09PSAwICYmICFub05ld0xpbmUpIHtcblx0XHRcdFx0c0I2NEVuYyArPSBcIlxcclxcblwiO1xuXHRcdFx0fVxuXHRcdFx0blVpbnQyNCB8PSBhQnl0ZXNbbklkeF0gPDwgKDE2ID4+PiBuTW9kMyAmIDI0KTtcblx0XHRcdGlmIChuTW9kMyA9PT0gMiB8fCBhQnl0ZXMubGVuZ3RoIC0gbklkeCA9PT0gMSkge1xuXHRcdFx0XHRzQjY0RW5jICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoX3VpbnQ2VG9CNjQoblVpbnQyNCA+Pj4gMTggJiA2MyksIF91aW50NlRvQjY0KG5VaW50MjQgPj4+IDEyICYgNjMpLCBfdWludDZUb0I2NChuVWludDI0ID4+PiA2ICYgNjMpLCBfdWludDZUb0I2NChuVWludDI0ICYgNjMpKTtcblx0XHRcdFx0blVpbnQyNCA9IDA7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBzQjY0RW5jLnN1YnN0cigwLCBzQjY0RW5jLmxlbmd0aCAtIDIgKyBuTW9kMykgKyAobk1vZDMgPT09IDIgPyBcIlwiIDogbk1vZDMgPT09IDEgPyBcIj1cIiA6IFwiPT1cIik7XG5cdH1cblxuXHRmdW5jdGlvbiBvdXRwdXRfZm9ybWF0cygpIHtcblx0XHRyZXR1cm4gW1widWludDhhcnJheVwiLCBcInRleHRcIiwgXCJoZXhcIiwgXCJiYXNlNjRcIl07XG5cdH1cblxuXHRmdW5jdGlvbiBfZm9ybWF0X291dHB1dChvdXRwdXQsIG9wdGlvbmFsT3V0cHV0Rm9ybWF0KSB7XG5cdFx0dmFyIHNlbGVjdGVkT3V0cHV0Rm9ybWF0ID0gb3B0aW9uYWxPdXRwdXRGb3JtYXQgfHwgb3V0cHV0X2Zvcm1hdDtcblx0XHRpZiAoIV9pc19vdXRwdXRfZm9ybWF0KHNlbGVjdGVkT3V0cHV0Rm9ybWF0KSkgdGhyb3cgbmV3IEVycm9yKHNlbGVjdGVkT3V0cHV0Rm9ybWF0ICsgXCIgb3V0cHV0IGZvcm1hdCBpcyBub3QgYXZhaWxhYmxlXCIpO1xuXHRcdGlmIChvdXRwdXQgaW5zdGFuY2VvZiBBbGxvY2F0ZWRCdWYpIHtcblx0XHRcdGlmIChzZWxlY3RlZE91dHB1dEZvcm1hdCA9PT0gXCJ1aW50OGFycmF5XCIpIHJldHVybiBvdXRwdXQudG9fVWludDhBcnJheSgpO1xuXHRcdFx0ZWxzZSBpZiAoc2VsZWN0ZWRPdXRwdXRGb3JtYXQgPT09IFwidGV4dFwiKSByZXR1cm4gbGlic29kaXVtLlBvaW50ZXJfc3RyaW5naWZ5KG91dHB1dC5hZGRyZXNzLCBvdXRwdXQubGVuZ3RoKTtcblx0XHRcdGVsc2UgaWYgKHNlbGVjdGVkT3V0cHV0Rm9ybWF0ID09PSBcImhleFwiKSByZXR1cm4gdG9faGV4KG91dHB1dC50b19VaW50OEFycmF5KCkpO1xuXHRcdFx0ZWxzZSBpZiAoc2VsZWN0ZWRPdXRwdXRGb3JtYXQgPT09IFwiYmFzZTY0XCIpIHJldHVybiB0b19iYXNlNjQob3V0cHV0LnRvX1VpbnQ4QXJyYXkoKSk7XG5cdFx0XHRlbHNlIHRocm93IG5ldyBFcnJvcihcIldoYXQgaXMgb3V0cHV0IGZvcm1hdCBcXFwiXCIgKyBzZWxlY3RlZE91dHB1dEZvcm1hdCArIFwiXFxcIj9cIik7XG5cdFx0fSBlbHNlIGlmICh0eXBlb2Ygb3V0cHV0ID09PSBcIm9iamVjdFwiKSB7IC8vQ29tcG9zZWQgb3V0cHV0LiBFeGFtcGxlIDoga2V5IHBhaXJzXG5cdFx0XHR2YXIgcHJvcHMgPSBPYmplY3Qua2V5cyhvdXRwdXQpO1xuXHRcdFx0dmFyIGZvcm1hdHRlZE91dHB1dCA9IHt9O1xuXHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRmb3JtYXR0ZWRPdXRwdXRbcHJvcHNbaV1dID0gX2Zvcm1hdF9vdXRwdXQob3V0cHV0W3Byb3BzW2ldXSwgc2VsZWN0ZWRPdXRwdXRGb3JtYXQpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGZvcm1hdHRlZE91dHB1dDtcblx0XHR9IGVsc2UgaWYgKHR5cGVvZiBvdXRwdXQgPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdHJldHVybiBvdXRwdXQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgZm9ybWF0IG91dHB1dFwiKTtcblx0XHR9XG5cdH1cblxuXHRmdW5jdGlvbiBfaXNfb3V0cHV0X2Zvcm1hdChmb3JtYXQpIHtcblx0XHR2YXIgZm9ybWF0cyA9IG91dHB1dF9mb3JtYXRzKCk7XG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBmb3JtYXRzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRpZiAoZm9ybWF0c1tpXSA9PT0gZm9ybWF0KSByZXR1cm4gdHJ1ZTtcblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0ZnVuY3Rpb24gX2NoZWNrX291dHB1dF9mb3JtYXQoZm9ybWF0KSB7XG5cdFx0aWYgKCFmb3JtYXQpIHtcblx0XHRcdHJldHVybjtcblx0XHR9IGVsc2UgaWYgKHR5cGVvZiBmb3JtYXQgIT09IFwic3RyaW5nXCIpIHtcblx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoXCJXaGVuIGRlZmluZWQsIHRoZSBvdXRwdXQgZm9ybWF0IG11c3QgYmUgYSBzdHJpbmdcIik7XG5cdFx0fSBlbHNlIGlmICghX2lzX291dHB1dF9mb3JtYXQoZm9ybWF0KSkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKGZvcm1hdCArIFwiIGlzIG5vdCBhIHN1cHBvcnRlZCBvdXRwdXQgZm9ybWF0XCIpO1xuXHRcdH1cblx0fVxuXG5cdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cdC8vIE1lbW9yeSBtYW5hZ2VtZW50XG5cblx0Ly8gQWxsb2NhdGVkQnVmOiBhZGRyZXNzIGFsbG9jYXRlZCB1c2luZyBfbWFsbG9jKCkgKyBsZW5ndGhcblx0ZnVuY3Rpb24gQWxsb2NhdGVkQnVmKGxlbmd0aCkge1xuXHRcdHRoaXMubGVuZ3RoID0gbGVuZ3RoO1xuXHRcdHRoaXMuYWRkcmVzcyA9IF9tYWxsb2MobGVuZ3RoKTtcblx0fVxuXG5cdC8vIENvcHkgdGhlIGNvbnRlbnQgb2YgYSBBbGxvY2F0ZWRCdWYgKF9tYWxsb2MoKSdkIG1lbW9yeSkgaW50byBhIFVpbnQ4QXJyYXlcblx0QWxsb2NhdGVkQnVmLnByb3RvdHlwZS50b19VaW50OEFycmF5ID0gZnVuY3Rpb24gKCkge1xuXHRcdHZhciByZXN1bHQgPSBuZXcgVWludDhBcnJheSh0aGlzLmxlbmd0aCk7XG5cdFx0cmVzdWx0LnNldChsaWJzb2RpdW0uSEVBUFU4LnN1YmFycmF5KHRoaXMuYWRkcmVzcywgdGhpcy5hZGRyZXNzICsgdGhpcy5sZW5ndGgpKTtcblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9O1xuXG5cdC8vIF9tYWxsb2MoKSBhIHJlZ2lvbiBhbmQgaW5pdGlhbGl6ZSBpdCB3aXRoIHRoZSBjb250ZW50IG9mIGEgVWludDhBcnJheVxuXHRmdW5jdGlvbiBfdG9fYWxsb2NhdGVkX2J1Zl9hZGRyZXNzKGJ5dGVzKSB7XG5cdFx0dmFyIGFkZHJlc3MgPSBfbWFsbG9jKGJ5dGVzLmxlbmd0aCk7XG5cdFx0bGlic29kaXVtLkhFQVBVOC5zZXQoYnl0ZXMsIGFkZHJlc3MpO1xuXHRcdHJldHVybiBhZGRyZXNzO1xuXHR9XG5cblx0ZnVuY3Rpb24gX21hbGxvYyhsZW5ndGgpIHtcblx0XHR2YXIgcmVzdWx0ID0gbGlic29kaXVtLl9tYWxsb2MobGVuZ3RoKTtcblx0XHRpZiAocmVzdWx0ID09PSAwKSB7XG5cdFx0XHR0aHJvdyB7XG5cdFx0XHRcdG1lc3NhZ2U6IFwiX21hbGxvYygpIGZhaWxlZFwiLFxuXHRcdFx0XHRsZW5ndGg6IGxlbmd0aFxuXHRcdFx0fTtcblx0XHR9XG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdGZ1bmN0aW9uIF9mcmVlKGFkZHJlc3MpIHtcblx0XHRsaWJzb2RpdW0uX2ZyZWUoYWRkcmVzcyk7XG5cdH1cblxuXHRmdW5jdGlvbiBfZnJlZV9hbGwoYWRkcmVzc2VzKSB7XG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBhZGRyZXNzZXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdF9mcmVlKGFkZHJlc3Nlc1tpXSk7XG5cdFx0fVxuXHR9XG5cblx0ZnVuY3Rpb24gX2ZyZWVfYW5kX3Rocm93X2Vycm9yKGFkZHJlc3NfcG9vbCwgZXJyKSB7XG5cdFx0X2ZyZWVfYWxsKGFkZHJlc3NfcG9vbCk7XG5cdFx0dGhyb3cgbmV3IEVycm9yKGVycik7XG5cdH1cblxuXHRmdW5jdGlvbiBfZnJlZV9hbmRfdGhyb3dfdHlwZV9lcnJvcihhZGRyZXNzX3Bvb2wsIGVycikge1xuXHRcdF9mcmVlX2FsbChhZGRyZXNzX3Bvb2wpO1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoZXJyKTtcblx0fVxuXG5cdGZ1bmN0aW9uIF9yZXF1aXJlX2RlZmluZWQoYWRkcmVzc19wb29sLCB2YXJWYWx1ZSwgdmFyTmFtZSkge1xuXHRcdGlmICh2YXJWYWx1ZSA9PSB1bmRlZmluZWQpIHtcblx0XHRcdF9mcmVlX2FuZF90aHJvd190eXBlX2Vycm9yKGFkZHJlc3NfcG9vbCwgdmFyTmFtZSArIFwiIGNhbm5vdCBiZSBudWxsIG9yIHVuZGVmaW5lZFwiKTtcblx0XHR9XG5cdH1cblxuXHRmdW5jdGlvbiBfYW55X3RvX1VpbnQ4QXJyYXkoYWRkcmVzc19wb29sLCB2YXJWYWx1ZSwgdmFyTmFtZSkge1xuXHRcdF9yZXF1aXJlX2RlZmluZWQoYWRkcmVzc19wb29sLCB2YXJWYWx1ZSwgdmFyTmFtZSk7XG5cdFx0aWYgKHZhclZhbHVlIGluc3RhbmNlb2YgVWludDhBcnJheSkge1xuXHRcdFx0cmV0dXJuIHZhclZhbHVlO1xuXHRcdH0gZWxzZSBpZiAodHlwZW9mIHZhclZhbHVlID09PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRyZXR1cm4gZnJvbV9zdHJpbmcodmFyVmFsdWUpO1xuXHRcdH1cblx0XHRfZnJlZV9hbmRfdGhyb3dfdHlwZV9lcnJvcihhZGRyZXNzX3Bvb2wsIFwidW5zdXBwb3J0ZWQgaW5wdXQgdHlwZSBmb3IgXCIgKyB2YXJOYW1lKTtcblx0fVxuXG5cdFxuXHRmdW5jdGlvbiBjcnlwdG9fYWVhZF9jaGFjaGEyMHBvbHkxMzA1X2RlY3J5cHQoc2VjcmV0X25vbmNlLCBjaXBoZXJ0ZXh0LCBhZGRpdGlvbmFsX2RhdGEsIHB1YmxpY19ub25jZSwga2V5LCBvdXRwdXRGb3JtYXQpIHtcblx0XHR2YXIgYWRkcmVzc19wb29sID0gW107XG5cdFx0X2NoZWNrX291dHB1dF9mb3JtYXQob3V0cHV0Rm9ybWF0KTtcblxuXHRcdC8vIC0tLS0tLS0tLS0gaW5wdXQ6IHNlY3JldF9ub25jZSAodW5zaXplZF9idWZfb3B0aW9uYWwpXG5cdFx0XG5cdFx0dmFyIHNlY3JldF9ub25jZV9hZGRyZXNzID0gbnVsbCwgc2VjcmV0X25vbmNlX2xlbmd0aCA9IDA7XG5cdFx0aWYgKHNlY3JldF9ub25jZSAhPSB1bmRlZmluZWQpIHtcblx0XHRcdHNlY3JldF9ub25jZSA9IF9hbnlfdG9fVWludDhBcnJheShhZGRyZXNzX3Bvb2wsIHNlY3JldF9ub25jZSwgXCJzZWNyZXRfbm9uY2VcIik7XG5cdFx0XHRzZWNyZXRfbm9uY2VfYWRkcmVzcyA9IF90b19hbGxvY2F0ZWRfYnVmX2FkZHJlc3Moc2VjcmV0X25vbmNlKTtcblx0XHRcdHNlY3JldF9ub25jZV9sZW5ndGggPSBzZWNyZXRfbm9uY2UubGVuZ3RoO1xuXHRcdFx0YWRkcmVzc19wb29sLnB1c2goc2VjcmV0X25vbmNlX2FkZHJlc3MpO1xuXHRcdH1cblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBjaXBoZXJ0ZXh0ICh1bnNpemVkX2J1Zilcblx0XHRcblx0XHRjaXBoZXJ0ZXh0ID0gX2FueV90b19VaW50OEFycmF5KGFkZHJlc3NfcG9vbCwgY2lwaGVydGV4dCwgXCJjaXBoZXJ0ZXh0XCIpO1xuXHRcdHZhciBjaXBoZXJ0ZXh0X2FkZHJlc3MgPSBfdG9fYWxsb2NhdGVkX2J1Zl9hZGRyZXNzKGNpcGhlcnRleHQpLFxuXHRcdCAgICBjaXBoZXJ0ZXh0X2xlbmd0aCA9IGNpcGhlcnRleHQubGVuZ3RoO1xuXHRcdGFkZHJlc3NfcG9vbC5wdXNoKGNpcGhlcnRleHRfYWRkcmVzcyk7XG5cdFx0XG5cdFx0Ly8gLS0tLS0tLS0tLSBpbnB1dDogYWRkaXRpb25hbF9kYXRhICh1bnNpemVkX2J1Zl9vcHRpb25hbClcblx0XHRcblx0XHR2YXIgYWRkaXRpb25hbF9kYXRhX2FkZHJlc3MgPSBudWxsLCBhZGRpdGlvbmFsX2RhdGFfbGVuZ3RoID0gMDtcblx0XHRpZiAoYWRkaXRpb25hbF9kYXRhICE9IHVuZGVmaW5lZCkge1xuXHRcdFx0YWRkaXRpb25hbF9kYXRhID0gX2FueV90b19VaW50OEFycmF5KGFkZHJlc3NfcG9vbCwgYWRkaXRpb25hbF9kYXRhLCBcImFkZGl0aW9uYWxfZGF0YVwiKTtcblx0XHRcdGFkZGl0aW9uYWxfZGF0YV9hZGRyZXNzID0gX3RvX2FsbG9jYXRlZF9idWZfYWRkcmVzcyhhZGRpdGlvbmFsX2RhdGEpO1xuXHRcdFx0YWRkaXRpb25hbF9kYXRhX2xlbmd0aCA9IGFkZGl0aW9uYWxfZGF0YS5sZW5ndGg7XG5cdFx0XHRhZGRyZXNzX3Bvb2wucHVzaChhZGRpdGlvbmFsX2RhdGFfYWRkcmVzcyk7XG5cdFx0fVxuXHRcdFxuXHRcdC8vIC0tLS0tLS0tLS0gaW5wdXQ6IHB1YmxpY19ub25jZSAoYnVmKVxuXHRcdFxuXHRcdHB1YmxpY19ub25jZSA9IF9hbnlfdG9fVWludDhBcnJheShhZGRyZXNzX3Bvb2wsIHB1YmxpY19ub25jZSwgXCJwdWJsaWNfbm9uY2VcIik7XG5cdFx0dmFyIHB1YmxpY19ub25jZV9hZGRyZXNzLCBwdWJsaWNfbm9uY2VfbGVuZ3RoID0gKGxpYnNvZGl1bS5fY3J5cHRvX2FlYWRfY2hhY2hhMjBwb2x5MTMwNV9ucHViYnl0ZXMoKSkgfCAwO1xuXHRcdGlmIChwdWJsaWNfbm9uY2UubGVuZ3RoICE9PSBwdWJsaWNfbm9uY2VfbGVuZ3RoKSB7XG5cdFx0XHRfZnJlZV9hbmRfdGhyb3dfdHlwZV9lcnJvcihhZGRyZXNzX3Bvb2wsIFwiaW52YWxpZCBwdWJsaWNfbm9uY2UgbGVuZ3RoXCIpO1xuXHRcdH1cblx0XHRwdWJsaWNfbm9uY2VfYWRkcmVzcyA9IF90b19hbGxvY2F0ZWRfYnVmX2FkZHJlc3MocHVibGljX25vbmNlKTtcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChwdWJsaWNfbm9uY2VfYWRkcmVzcyk7XG5cdFx0XG5cdFx0Ly8gLS0tLS0tLS0tLSBpbnB1dDoga2V5IChidWYpXG5cdFx0XG5cdFx0a2V5ID0gX2FueV90b19VaW50OEFycmF5KGFkZHJlc3NfcG9vbCwga2V5LCBcImtleVwiKTtcblx0XHR2YXIga2V5X2FkZHJlc3MsIGtleV9sZW5ndGggPSAobGlic29kaXVtLl9jcnlwdG9fYWVhZF9jaGFjaGEyMHBvbHkxMzA1X2tleWJ5dGVzKCkpIHwgMDtcblx0XHRpZiAoa2V5Lmxlbmd0aCAhPT0ga2V5X2xlbmd0aCkge1xuXHRcdFx0X2ZyZWVfYW5kX3Rocm93X3R5cGVfZXJyb3IoYWRkcmVzc19wb29sLCBcImludmFsaWQga2V5IGxlbmd0aFwiKTtcblx0XHR9XG5cdFx0a2V5X2FkZHJlc3MgPSBfdG9fYWxsb2NhdGVkX2J1Zl9hZGRyZXNzKGtleSk7XG5cdFx0YWRkcmVzc19wb29sLnB1c2goa2V5X2FkZHJlc3MpO1xuXHRcdFxuXHRcdC8vIC0tLS0tLS0tLS0gb3V0cHV0IG1lc3NhZ2UgKGJ1Zilcblx0XHRcblx0XHR2YXIgbWVzc2FnZV9sZW5ndGggPSAoY2lwaGVydGV4dF9sZW5ndGggLSBsaWJzb2RpdW0uX2NyeXB0b19hZWFkX2NoYWNoYTIwcG9seTEzMDVfYWJ5dGVzKCkpIHwgMCxcblx0XHQgICAgbWVzc2FnZSA9IG5ldyBBbGxvY2F0ZWRCdWYobWVzc2FnZV9sZW5ndGgpLFxuXHRcdCAgICBtZXNzYWdlX2FkZHJlc3MgPSBtZXNzYWdlLmFkZHJlc3M7XG5cdFx0XG5cdFx0YWRkcmVzc19wb29sLnB1c2gobWVzc2FnZV9hZGRyZXNzKTtcblx0XHRcblx0XHRpZiAoKGxpYnNvZGl1bS5fY3J5cHRvX2FlYWRfY2hhY2hhMjBwb2x5MTMwNV9kZWNyeXB0KG1lc3NhZ2VfYWRkcmVzcywgbnVsbCwgc2VjcmV0X25vbmNlX2FkZHJlc3MsIGNpcGhlcnRleHRfYWRkcmVzcywgY2lwaGVydGV4dF9sZW5ndGgsIDAsIGFkZGl0aW9uYWxfZGF0YV9hZGRyZXNzLCBhZGRpdGlvbmFsX2RhdGFfbGVuZ3RoLCAwLCBwdWJsaWNfbm9uY2VfYWRkcmVzcywga2V5X2FkZHJlc3MpKSA9PT0gMCkge1xuXHRcdFx0dmFyIHJldCA9IF9mb3JtYXRfb3V0cHV0KG1lc3NhZ2UsIG91dHB1dEZvcm1hdCk7XG5cdFx0XHRfZnJlZV9hbGwoYWRkcmVzc19wb29sKTtcblx0XHRcdHJldHVybiByZXQ7XG5cdFx0fVxuXHRcdF9mcmVlX2FuZF90aHJvd19lcnJvcihhZGRyZXNzX3Bvb2wpO1xuXHRcdFxuXHR9XG5cblx0ZnVuY3Rpb24gY3J5cHRvX2FlYWRfY2hhY2hhMjBwb2x5MTMwNV9lbmNyeXB0KG1lc3NhZ2UsIGFkZGl0aW9uYWxfZGF0YSwgc2VjcmV0X25vbmNlLCBwdWJsaWNfbm9uY2UsIGtleSwgb3V0cHV0Rm9ybWF0KSB7XG5cdFx0dmFyIGFkZHJlc3NfcG9vbCA9IFtdO1xuXHRcdF9jaGVja19vdXRwdXRfZm9ybWF0KG91dHB1dEZvcm1hdCk7XG5cblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBtZXNzYWdlICh1bnNpemVkX2J1Zilcblx0XHRcblx0XHRtZXNzYWdlID0gX2FueV90b19VaW50OEFycmF5KGFkZHJlc3NfcG9vbCwgbWVzc2FnZSwgXCJtZXNzYWdlXCIpO1xuXHRcdHZhciBtZXNzYWdlX2FkZHJlc3MgPSBfdG9fYWxsb2NhdGVkX2J1Zl9hZGRyZXNzKG1lc3NhZ2UpLFxuXHRcdCAgICBtZXNzYWdlX2xlbmd0aCA9IG1lc3NhZ2UubGVuZ3RoO1xuXHRcdGFkZHJlc3NfcG9vbC5wdXNoKG1lc3NhZ2VfYWRkcmVzcyk7XG5cdFx0XG5cdFx0Ly8gLS0tLS0tLS0tLSBpbnB1dDogYWRkaXRpb25hbF9kYXRhICh1bnNpemVkX2J1Zl9vcHRpb25hbClcblx0XHRcblx0XHR2YXIgYWRkaXRpb25hbF9kYXRhX2FkZHJlc3MgPSBudWxsLCBhZGRpdGlvbmFsX2RhdGFfbGVuZ3RoID0gMDtcblx0XHRpZiAoYWRkaXRpb25hbF9kYXRhICE9IHVuZGVmaW5lZCkge1xuXHRcdFx0YWRkaXRpb25hbF9kYXRhID0gX2FueV90b19VaW50OEFycmF5KGFkZHJlc3NfcG9vbCwgYWRkaXRpb25hbF9kYXRhLCBcImFkZGl0aW9uYWxfZGF0YVwiKTtcblx0XHRcdGFkZGl0aW9uYWxfZGF0YV9hZGRyZXNzID0gX3RvX2FsbG9jYXRlZF9idWZfYWRkcmVzcyhhZGRpdGlvbmFsX2RhdGEpO1xuXHRcdFx0YWRkaXRpb25hbF9kYXRhX2xlbmd0aCA9IGFkZGl0aW9uYWxfZGF0YS5sZW5ndGg7XG5cdFx0XHRhZGRyZXNzX3Bvb2wucHVzaChhZGRpdGlvbmFsX2RhdGFfYWRkcmVzcyk7XG5cdFx0fVxuXHRcdFxuXHRcdC8vIC0tLS0tLS0tLS0gaW5wdXQ6IHNlY3JldF9ub25jZSAodW5zaXplZF9idWZfb3B0aW9uYWwpXG5cdFx0XG5cdFx0dmFyIHNlY3JldF9ub25jZV9hZGRyZXNzID0gbnVsbCwgc2VjcmV0X25vbmNlX2xlbmd0aCA9IDA7XG5cdFx0aWYgKHNlY3JldF9ub25jZSAhPSB1bmRlZmluZWQpIHtcblx0XHRcdHNlY3JldF9ub25jZSA9IF9hbnlfdG9fVWludDhBcnJheShhZGRyZXNzX3Bvb2wsIHNlY3JldF9ub25jZSwgXCJzZWNyZXRfbm9uY2VcIik7XG5cdFx0XHRzZWNyZXRfbm9uY2VfYWRkcmVzcyA9IF90b19hbGxvY2F0ZWRfYnVmX2FkZHJlc3Moc2VjcmV0X25vbmNlKTtcblx0XHRcdHNlY3JldF9ub25jZV9sZW5ndGggPSBzZWNyZXRfbm9uY2UubGVuZ3RoO1xuXHRcdFx0YWRkcmVzc19wb29sLnB1c2goc2VjcmV0X25vbmNlX2FkZHJlc3MpO1xuXHRcdH1cblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBwdWJsaWNfbm9uY2UgKGJ1Zilcblx0XHRcblx0XHRwdWJsaWNfbm9uY2UgPSBfYW55X3RvX1VpbnQ4QXJyYXkoYWRkcmVzc19wb29sLCBwdWJsaWNfbm9uY2UsIFwicHVibGljX25vbmNlXCIpO1xuXHRcdHZhciBwdWJsaWNfbm9uY2VfYWRkcmVzcywgcHVibGljX25vbmNlX2xlbmd0aCA9IChsaWJzb2RpdW0uX2NyeXB0b19hZWFkX2NoYWNoYTIwcG9seTEzMDVfbnB1YmJ5dGVzKCkpIHwgMDtcblx0XHRpZiAocHVibGljX25vbmNlLmxlbmd0aCAhPT0gcHVibGljX25vbmNlX2xlbmd0aCkge1xuXHRcdFx0X2ZyZWVfYW5kX3Rocm93X3R5cGVfZXJyb3IoYWRkcmVzc19wb29sLCBcImludmFsaWQgcHVibGljX25vbmNlIGxlbmd0aFwiKTtcblx0XHR9XG5cdFx0cHVibGljX25vbmNlX2FkZHJlc3MgPSBfdG9fYWxsb2NhdGVkX2J1Zl9hZGRyZXNzKHB1YmxpY19ub25jZSk7XG5cdFx0YWRkcmVzc19wb29sLnB1c2gocHVibGljX25vbmNlX2FkZHJlc3MpO1xuXHRcdFxuXHRcdC8vIC0tLS0tLS0tLS0gaW5wdXQ6IGtleSAoYnVmKVxuXHRcdFxuXHRcdGtleSA9IF9hbnlfdG9fVWludDhBcnJheShhZGRyZXNzX3Bvb2wsIGtleSwgXCJrZXlcIik7XG5cdFx0dmFyIGtleV9hZGRyZXNzLCBrZXlfbGVuZ3RoID0gKGxpYnNvZGl1bS5fY3J5cHRvX2FlYWRfY2hhY2hhMjBwb2x5MTMwNV9rZXlieXRlcygpKSB8IDA7XG5cdFx0aWYgKGtleS5sZW5ndGggIT09IGtleV9sZW5ndGgpIHtcblx0XHRcdF9mcmVlX2FuZF90aHJvd190eXBlX2Vycm9yKGFkZHJlc3NfcG9vbCwgXCJpbnZhbGlkIGtleSBsZW5ndGhcIik7XG5cdFx0fVxuXHRcdGtleV9hZGRyZXNzID0gX3RvX2FsbG9jYXRlZF9idWZfYWRkcmVzcyhrZXkpO1xuXHRcdGFkZHJlc3NfcG9vbC5wdXNoKGtleV9hZGRyZXNzKTtcblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIG91dHB1dCBjaXBoZXJ0ZXh0IChidWYpXG5cdFx0XG5cdFx0dmFyIGNpcGhlcnRleHRfbGVuZ3RoID0gKG1lc3NhZ2VfbGVuZ3RoICsgbGlic29kaXVtLl9jcnlwdG9fYWVhZF9jaGFjaGEyMHBvbHkxMzA1X2FieXRlcygpKSB8IDAsXG5cdFx0ICAgIGNpcGhlcnRleHQgPSBuZXcgQWxsb2NhdGVkQnVmKGNpcGhlcnRleHRfbGVuZ3RoKSxcblx0XHQgICAgY2lwaGVydGV4dF9hZGRyZXNzID0gY2lwaGVydGV4dC5hZGRyZXNzO1xuXHRcdFxuXHRcdGFkZHJlc3NfcG9vbC5wdXNoKGNpcGhlcnRleHRfYWRkcmVzcyk7XG5cdFx0XG5cdFx0aWYgKChsaWJzb2RpdW0uX2NyeXB0b19hZWFkX2NoYWNoYTIwcG9seTEzMDVfZW5jcnlwdChjaXBoZXJ0ZXh0X2FkZHJlc3MsIG51bGwsIG1lc3NhZ2VfYWRkcmVzcywgbWVzc2FnZV9sZW5ndGgsIDAsIGFkZGl0aW9uYWxfZGF0YV9hZGRyZXNzLCBhZGRpdGlvbmFsX2RhdGFfbGVuZ3RoLCAwLCBzZWNyZXRfbm9uY2VfYWRkcmVzcywgcHVibGljX25vbmNlX2FkZHJlc3MsIGtleV9hZGRyZXNzKSkgPT09IDApIHtcblx0XHRcdHZhciByZXQgPSBfZm9ybWF0X291dHB1dChjaXBoZXJ0ZXh0LCBvdXRwdXRGb3JtYXQpO1xuXHRcdFx0X2ZyZWVfYWxsKGFkZHJlc3NfcG9vbCk7XG5cdFx0XHRyZXR1cm4gcmV0O1xuXHRcdH1cblx0XHRfZnJlZV9hbmRfdGhyb3dfZXJyb3IoYWRkcmVzc19wb29sKTtcblx0XHRcblx0fVxuXG5cdGZ1bmN0aW9uIGNyeXB0b19hZWFkX2NoYWNoYTIwcG9seTEzMDVfaWV0Zl9kZWNyeXB0KHNlY3JldF9ub25jZSwgY2lwaGVydGV4dCwgYWRkaXRpb25hbF9kYXRhLCBwdWJsaWNfbm9uY2UsIGtleSwgb3V0cHV0Rm9ybWF0KSB7XG5cdFx0dmFyIGFkZHJlc3NfcG9vbCA9IFtdO1xuXHRcdF9jaGVja19vdXRwdXRfZm9ybWF0KG91dHB1dEZvcm1hdCk7XG5cblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBzZWNyZXRfbm9uY2UgKHVuc2l6ZWRfYnVmX29wdGlvbmFsKVxuXHRcdFxuXHRcdHZhciBzZWNyZXRfbm9uY2VfYWRkcmVzcyA9IG51bGwsIHNlY3JldF9ub25jZV9sZW5ndGggPSAwO1xuXHRcdGlmIChzZWNyZXRfbm9uY2UgIT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRzZWNyZXRfbm9uY2UgPSBfYW55X3RvX1VpbnQ4QXJyYXkoYWRkcmVzc19wb29sLCBzZWNyZXRfbm9uY2UsIFwic2VjcmV0X25vbmNlXCIpO1xuXHRcdFx0c2VjcmV0X25vbmNlX2FkZHJlc3MgPSBfdG9fYWxsb2NhdGVkX2J1Zl9hZGRyZXNzKHNlY3JldF9ub25jZSk7XG5cdFx0XHRzZWNyZXRfbm9uY2VfbGVuZ3RoID0gc2VjcmV0X25vbmNlLmxlbmd0aDtcblx0XHRcdGFkZHJlc3NfcG9vbC5wdXNoKHNlY3JldF9ub25jZV9hZGRyZXNzKTtcblx0XHR9XG5cdFx0XG5cdFx0Ly8gLS0tLS0tLS0tLSBpbnB1dDogY2lwaGVydGV4dCAodW5zaXplZF9idWYpXG5cdFx0XG5cdFx0Y2lwaGVydGV4dCA9IF9hbnlfdG9fVWludDhBcnJheShhZGRyZXNzX3Bvb2wsIGNpcGhlcnRleHQsIFwiY2lwaGVydGV4dFwiKTtcblx0XHR2YXIgY2lwaGVydGV4dF9hZGRyZXNzID0gX3RvX2FsbG9jYXRlZF9idWZfYWRkcmVzcyhjaXBoZXJ0ZXh0KSxcblx0XHQgICAgY2lwaGVydGV4dF9sZW5ndGggPSBjaXBoZXJ0ZXh0Lmxlbmd0aDtcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChjaXBoZXJ0ZXh0X2FkZHJlc3MpO1xuXHRcdFxuXHRcdC8vIC0tLS0tLS0tLS0gaW5wdXQ6IGFkZGl0aW9uYWxfZGF0YSAodW5zaXplZF9idWZfb3B0aW9uYWwpXG5cdFx0XG5cdFx0dmFyIGFkZGl0aW9uYWxfZGF0YV9hZGRyZXNzID0gbnVsbCwgYWRkaXRpb25hbF9kYXRhX2xlbmd0aCA9IDA7XG5cdFx0aWYgKGFkZGl0aW9uYWxfZGF0YSAhPSB1bmRlZmluZWQpIHtcblx0XHRcdGFkZGl0aW9uYWxfZGF0YSA9IF9hbnlfdG9fVWludDhBcnJheShhZGRyZXNzX3Bvb2wsIGFkZGl0aW9uYWxfZGF0YSwgXCJhZGRpdGlvbmFsX2RhdGFcIik7XG5cdFx0XHRhZGRpdGlvbmFsX2RhdGFfYWRkcmVzcyA9IF90b19hbGxvY2F0ZWRfYnVmX2FkZHJlc3MoYWRkaXRpb25hbF9kYXRhKTtcblx0XHRcdGFkZGl0aW9uYWxfZGF0YV9sZW5ndGggPSBhZGRpdGlvbmFsX2RhdGEubGVuZ3RoO1xuXHRcdFx0YWRkcmVzc19wb29sLnB1c2goYWRkaXRpb25hbF9kYXRhX2FkZHJlc3MpO1xuXHRcdH1cblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBwdWJsaWNfbm9uY2UgKGJ1Zilcblx0XHRcblx0XHRwdWJsaWNfbm9uY2UgPSBfYW55X3RvX1VpbnQ4QXJyYXkoYWRkcmVzc19wb29sLCBwdWJsaWNfbm9uY2UsIFwicHVibGljX25vbmNlXCIpO1xuXHRcdHZhciBwdWJsaWNfbm9uY2VfYWRkcmVzcywgcHVibGljX25vbmNlX2xlbmd0aCA9IChsaWJzb2RpdW0uX2NyeXB0b19hZWFkX2NoYWNoYTIwcG9seTEzMDVfaWV0Zl9ucHViYnl0ZXMoKSkgfCAwO1xuXHRcdGlmIChwdWJsaWNfbm9uY2UubGVuZ3RoICE9PSBwdWJsaWNfbm9uY2VfbGVuZ3RoKSB7XG5cdFx0XHRfZnJlZV9hbmRfdGhyb3dfdHlwZV9lcnJvcihhZGRyZXNzX3Bvb2wsIFwiaW52YWxpZCBwdWJsaWNfbm9uY2UgbGVuZ3RoXCIpO1xuXHRcdH1cblx0XHRwdWJsaWNfbm9uY2VfYWRkcmVzcyA9IF90b19hbGxvY2F0ZWRfYnVmX2FkZHJlc3MocHVibGljX25vbmNlKTtcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChwdWJsaWNfbm9uY2VfYWRkcmVzcyk7XG5cdFx0XG5cdFx0Ly8gLS0tLS0tLS0tLSBpbnB1dDoga2V5IChidWYpXG5cdFx0XG5cdFx0a2V5ID0gX2FueV90b19VaW50OEFycmF5KGFkZHJlc3NfcG9vbCwga2V5LCBcImtleVwiKTtcblx0XHR2YXIga2V5X2FkZHJlc3MsIGtleV9sZW5ndGggPSAobGlic29kaXVtLl9jcnlwdG9fYWVhZF9jaGFjaGEyMHBvbHkxMzA1X2tleWJ5dGVzKCkpIHwgMDtcblx0XHRpZiAoa2V5Lmxlbmd0aCAhPT0ga2V5X2xlbmd0aCkge1xuXHRcdFx0X2ZyZWVfYW5kX3Rocm93X3R5cGVfZXJyb3IoYWRkcmVzc19wb29sLCBcImludmFsaWQga2V5IGxlbmd0aFwiKTtcblx0XHR9XG5cdFx0a2V5X2FkZHJlc3MgPSBfdG9fYWxsb2NhdGVkX2J1Zl9hZGRyZXNzKGtleSk7XG5cdFx0YWRkcmVzc19wb29sLnB1c2goa2V5X2FkZHJlc3MpO1xuXHRcdFxuXHRcdC8vIC0tLS0tLS0tLS0gb3V0cHV0IG1lc3NhZ2UgKGJ1Zilcblx0XHRcblx0XHR2YXIgbWVzc2FnZV9sZW5ndGggPSAoY2lwaGVydGV4dF9sZW5ndGggLSBsaWJzb2RpdW0uX2NyeXB0b19hZWFkX2NoYWNoYTIwcG9seTEzMDVfYWJ5dGVzKCkpIHwgMCxcblx0XHQgICAgbWVzc2FnZSA9IG5ldyBBbGxvY2F0ZWRCdWYobWVzc2FnZV9sZW5ndGgpLFxuXHRcdCAgICBtZXNzYWdlX2FkZHJlc3MgPSBtZXNzYWdlLmFkZHJlc3M7XG5cdFx0XG5cdFx0YWRkcmVzc19wb29sLnB1c2gobWVzc2FnZV9hZGRyZXNzKTtcblx0XHRcblx0XHRpZiAoKGxpYnNvZGl1bS5fY3J5cHRvX2FlYWRfY2hhY2hhMjBwb2x5MTMwNV9pZXRmX2RlY3J5cHQobWVzc2FnZV9hZGRyZXNzLCBudWxsLCBzZWNyZXRfbm9uY2VfYWRkcmVzcywgY2lwaGVydGV4dF9hZGRyZXNzLCBjaXBoZXJ0ZXh0X2xlbmd0aCwgMCwgYWRkaXRpb25hbF9kYXRhX2FkZHJlc3MsIGFkZGl0aW9uYWxfZGF0YV9sZW5ndGgsIDAsIHB1YmxpY19ub25jZV9hZGRyZXNzLCBrZXlfYWRkcmVzcykpID09PSAwKSB7XG5cdFx0XHR2YXIgcmV0ID0gX2Zvcm1hdF9vdXRwdXQobWVzc2FnZSwgb3V0cHV0Rm9ybWF0KTtcblx0XHRcdF9mcmVlX2FsbChhZGRyZXNzX3Bvb2wpO1xuXHRcdFx0cmV0dXJuIHJldDtcblx0XHR9XG5cdFx0X2ZyZWVfYW5kX3Rocm93X2Vycm9yKGFkZHJlc3NfcG9vbCk7XG5cdFx0XG5cdH1cblxuXHRmdW5jdGlvbiBjcnlwdG9fYWVhZF9jaGFjaGEyMHBvbHkxMzA1X2lldGZfZW5jcnlwdChtZXNzYWdlLCBhZGRpdGlvbmFsX2RhdGEsIHNlY3JldF9ub25jZSwgcHVibGljX25vbmNlLCBrZXksIG91dHB1dEZvcm1hdCkge1xuXHRcdHZhciBhZGRyZXNzX3Bvb2wgPSBbXTtcblx0XHRfY2hlY2tfb3V0cHV0X2Zvcm1hdChvdXRwdXRGb3JtYXQpO1xuXG5cdFx0Ly8gLS0tLS0tLS0tLSBpbnB1dDogbWVzc2FnZSAodW5zaXplZF9idWYpXG5cdFx0XG5cdFx0bWVzc2FnZSA9IF9hbnlfdG9fVWludDhBcnJheShhZGRyZXNzX3Bvb2wsIG1lc3NhZ2UsIFwibWVzc2FnZVwiKTtcblx0XHR2YXIgbWVzc2FnZV9hZGRyZXNzID0gX3RvX2FsbG9jYXRlZF9idWZfYWRkcmVzcyhtZXNzYWdlKSxcblx0XHQgICAgbWVzc2FnZV9sZW5ndGggPSBtZXNzYWdlLmxlbmd0aDtcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChtZXNzYWdlX2FkZHJlc3MpO1xuXHRcdFxuXHRcdC8vIC0tLS0tLS0tLS0gaW5wdXQ6IGFkZGl0aW9uYWxfZGF0YSAodW5zaXplZF9idWZfb3B0aW9uYWwpXG5cdFx0XG5cdFx0dmFyIGFkZGl0aW9uYWxfZGF0YV9hZGRyZXNzID0gbnVsbCwgYWRkaXRpb25hbF9kYXRhX2xlbmd0aCA9IDA7XG5cdFx0aWYgKGFkZGl0aW9uYWxfZGF0YSAhPSB1bmRlZmluZWQpIHtcblx0XHRcdGFkZGl0aW9uYWxfZGF0YSA9IF9hbnlfdG9fVWludDhBcnJheShhZGRyZXNzX3Bvb2wsIGFkZGl0aW9uYWxfZGF0YSwgXCJhZGRpdGlvbmFsX2RhdGFcIik7XG5cdFx0XHRhZGRpdGlvbmFsX2RhdGFfYWRkcmVzcyA9IF90b19hbGxvY2F0ZWRfYnVmX2FkZHJlc3MoYWRkaXRpb25hbF9kYXRhKTtcblx0XHRcdGFkZGl0aW9uYWxfZGF0YV9sZW5ndGggPSBhZGRpdGlvbmFsX2RhdGEubGVuZ3RoO1xuXHRcdFx0YWRkcmVzc19wb29sLnB1c2goYWRkaXRpb25hbF9kYXRhX2FkZHJlc3MpO1xuXHRcdH1cblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBzZWNyZXRfbm9uY2UgKHVuc2l6ZWRfYnVmX29wdGlvbmFsKVxuXHRcdFxuXHRcdHZhciBzZWNyZXRfbm9uY2VfYWRkcmVzcyA9IG51bGwsIHNlY3JldF9ub25jZV9sZW5ndGggPSAwO1xuXHRcdGlmIChzZWNyZXRfbm9uY2UgIT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRzZWNyZXRfbm9uY2UgPSBfYW55X3RvX1VpbnQ4QXJyYXkoYWRkcmVzc19wb29sLCBzZWNyZXRfbm9uY2UsIFwic2VjcmV0X25vbmNlXCIpO1xuXHRcdFx0c2VjcmV0X25vbmNlX2FkZHJlc3MgPSBfdG9fYWxsb2NhdGVkX2J1Zl9hZGRyZXNzKHNlY3JldF9ub25jZSk7XG5cdFx0XHRzZWNyZXRfbm9uY2VfbGVuZ3RoID0gc2VjcmV0X25vbmNlLmxlbmd0aDtcblx0XHRcdGFkZHJlc3NfcG9vbC5wdXNoKHNlY3JldF9ub25jZV9hZGRyZXNzKTtcblx0XHR9XG5cdFx0XG5cdFx0Ly8gLS0tLS0tLS0tLSBpbnB1dDogcHVibGljX25vbmNlIChidWYpXG5cdFx0XG5cdFx0cHVibGljX25vbmNlID0gX2FueV90b19VaW50OEFycmF5KGFkZHJlc3NfcG9vbCwgcHVibGljX25vbmNlLCBcInB1YmxpY19ub25jZVwiKTtcblx0XHR2YXIgcHVibGljX25vbmNlX2FkZHJlc3MsIHB1YmxpY19ub25jZV9sZW5ndGggPSAobGlic29kaXVtLl9jcnlwdG9fYWVhZF9jaGFjaGEyMHBvbHkxMzA1X2lldGZfbnB1YmJ5dGVzKCkpIHwgMDtcblx0XHRpZiAocHVibGljX25vbmNlLmxlbmd0aCAhPT0gcHVibGljX25vbmNlX2xlbmd0aCkge1xuXHRcdFx0X2ZyZWVfYW5kX3Rocm93X3R5cGVfZXJyb3IoYWRkcmVzc19wb29sLCBcImludmFsaWQgcHVibGljX25vbmNlIGxlbmd0aFwiKTtcblx0XHR9XG5cdFx0cHVibGljX25vbmNlX2FkZHJlc3MgPSBfdG9fYWxsb2NhdGVkX2J1Zl9hZGRyZXNzKHB1YmxpY19ub25jZSk7XG5cdFx0YWRkcmVzc19wb29sLnB1c2gocHVibGljX25vbmNlX2FkZHJlc3MpO1xuXHRcdFxuXHRcdC8vIC0tLS0tLS0tLS0gaW5wdXQ6IGtleSAoYnVmKVxuXHRcdFxuXHRcdGtleSA9IF9hbnlfdG9fVWludDhBcnJheShhZGRyZXNzX3Bvb2wsIGtleSwgXCJrZXlcIik7XG5cdFx0dmFyIGtleV9hZGRyZXNzLCBrZXlfbGVuZ3RoID0gKGxpYnNvZGl1bS5fY3J5cHRvX2FlYWRfY2hhY2hhMjBwb2x5MTMwNV9rZXlieXRlcygpKSB8IDA7XG5cdFx0aWYgKGtleS5sZW5ndGggIT09IGtleV9sZW5ndGgpIHtcblx0XHRcdF9mcmVlX2FuZF90aHJvd190eXBlX2Vycm9yKGFkZHJlc3NfcG9vbCwgXCJpbnZhbGlkIGtleSBsZW5ndGhcIik7XG5cdFx0fVxuXHRcdGtleV9hZGRyZXNzID0gX3RvX2FsbG9jYXRlZF9idWZfYWRkcmVzcyhrZXkpO1xuXHRcdGFkZHJlc3NfcG9vbC5wdXNoKGtleV9hZGRyZXNzKTtcblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIG91dHB1dCBjaXBoZXJ0ZXh0IChidWYpXG5cdFx0XG5cdFx0dmFyIGNpcGhlcnRleHRfbGVuZ3RoID0gKG1lc3NhZ2VfbGVuZ3RoICsgbGlic29kaXVtLl9jcnlwdG9fYWVhZF9jaGFjaGEyMHBvbHkxMzA1X2FieXRlcygpKSB8IDAsXG5cdFx0ICAgIGNpcGhlcnRleHQgPSBuZXcgQWxsb2NhdGVkQnVmKGNpcGhlcnRleHRfbGVuZ3RoKSxcblx0XHQgICAgY2lwaGVydGV4dF9hZGRyZXNzID0gY2lwaGVydGV4dC5hZGRyZXNzO1xuXHRcdFxuXHRcdGFkZHJlc3NfcG9vbC5wdXNoKGNpcGhlcnRleHRfYWRkcmVzcyk7XG5cdFx0XG5cdFx0aWYgKChsaWJzb2RpdW0uX2NyeXB0b19hZWFkX2NoYWNoYTIwcG9seTEzMDVfaWV0Zl9lbmNyeXB0KGNpcGhlcnRleHRfYWRkcmVzcywgbnVsbCwgbWVzc2FnZV9hZGRyZXNzLCBtZXNzYWdlX2xlbmd0aCwgMCwgYWRkaXRpb25hbF9kYXRhX2FkZHJlc3MsIGFkZGl0aW9uYWxfZGF0YV9sZW5ndGgsIDAsIHNlY3JldF9ub25jZV9hZGRyZXNzLCBwdWJsaWNfbm9uY2VfYWRkcmVzcywga2V5X2FkZHJlc3MpKSA9PT0gMCkge1xuXHRcdFx0dmFyIHJldCA9IF9mb3JtYXRfb3V0cHV0KGNpcGhlcnRleHQsIG91dHB1dEZvcm1hdCk7XG5cdFx0XHRfZnJlZV9hbGwoYWRkcmVzc19wb29sKTtcblx0XHRcdHJldHVybiByZXQ7XG5cdFx0fVxuXHRcdF9mcmVlX2FuZF90aHJvd19lcnJvcihhZGRyZXNzX3Bvb2wpO1xuXHRcdFxuXHR9XG5cblx0ZnVuY3Rpb24gY3J5cHRvX2F1dGgobWVzc2FnZSwga2V5LCBvdXRwdXRGb3JtYXQpIHtcblx0XHR2YXIgYWRkcmVzc19wb29sID0gW107XG5cdFx0X2NoZWNrX291dHB1dF9mb3JtYXQob3V0cHV0Rm9ybWF0KTtcblxuXHRcdC8vIC0tLS0tLS0tLS0gaW5wdXQ6IG1lc3NhZ2UgKHVuc2l6ZWRfYnVmKVxuXHRcdFxuXHRcdG1lc3NhZ2UgPSBfYW55X3RvX1VpbnQ4QXJyYXkoYWRkcmVzc19wb29sLCBtZXNzYWdlLCBcIm1lc3NhZ2VcIik7XG5cdFx0dmFyIG1lc3NhZ2VfYWRkcmVzcyA9IF90b19hbGxvY2F0ZWRfYnVmX2FkZHJlc3MobWVzc2FnZSksXG5cdFx0ICAgIG1lc3NhZ2VfbGVuZ3RoID0gbWVzc2FnZS5sZW5ndGg7XG5cdFx0YWRkcmVzc19wb29sLnB1c2gobWVzc2FnZV9hZGRyZXNzKTtcblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBrZXkgKGJ1Zilcblx0XHRcblx0XHRrZXkgPSBfYW55X3RvX1VpbnQ4QXJyYXkoYWRkcmVzc19wb29sLCBrZXksIFwia2V5XCIpO1xuXHRcdHZhciBrZXlfYWRkcmVzcywga2V5X2xlbmd0aCA9IChsaWJzb2RpdW0uX2NyeXB0b19hdXRoX2tleWJ5dGVzKCkpIHwgMDtcblx0XHRpZiAoa2V5Lmxlbmd0aCAhPT0ga2V5X2xlbmd0aCkge1xuXHRcdFx0X2ZyZWVfYW5kX3Rocm93X3R5cGVfZXJyb3IoYWRkcmVzc19wb29sLCBcImludmFsaWQga2V5IGxlbmd0aFwiKTtcblx0XHR9XG5cdFx0a2V5X2FkZHJlc3MgPSBfdG9fYWxsb2NhdGVkX2J1Zl9hZGRyZXNzKGtleSk7XG5cdFx0YWRkcmVzc19wb29sLnB1c2goa2V5X2FkZHJlc3MpO1xuXHRcdFxuXHRcdC8vIC0tLS0tLS0tLS0gb3V0cHV0IHRhZyAoYnVmKVxuXHRcdFxuXHRcdHZhciB0YWdfbGVuZ3RoID0gKGxpYnNvZGl1bS5fY3J5cHRvX2F1dGhfYnl0ZXMoKSkgfCAwLFxuXHRcdCAgICB0YWcgPSBuZXcgQWxsb2NhdGVkQnVmKHRhZ19sZW5ndGgpLFxuXHRcdCAgICB0YWdfYWRkcmVzcyA9IHRhZy5hZGRyZXNzO1xuXHRcdFxuXHRcdGFkZHJlc3NfcG9vbC5wdXNoKHRhZ19hZGRyZXNzKTtcblx0XHRcblx0XHRpZiAoKGxpYnNvZGl1bS5fY3J5cHRvX2F1dGgodGFnX2FkZHJlc3MsIG1lc3NhZ2VfYWRkcmVzcywgbWVzc2FnZV9sZW5ndGgsIDAsIGtleV9hZGRyZXNzKSB8IDApID09PSAwKSB7XG5cdFx0XHR2YXIgcmV0ID0gX2Zvcm1hdF9vdXRwdXQodGFnLCBvdXRwdXRGb3JtYXQpO1xuXHRcdFx0X2ZyZWVfYWxsKGFkZHJlc3NfcG9vbCk7XG5cdFx0XHRyZXR1cm4gcmV0O1xuXHRcdH1cblx0XHRfZnJlZV9hbmRfdGhyb3dfZXJyb3IoYWRkcmVzc19wb29sKTtcblx0XHRcblx0fVxuXG5cdGZ1bmN0aW9uIGNyeXB0b19hdXRoX2htYWNzaGEyNTYobWVzc2FnZSwga2V5LCBvdXRwdXRGb3JtYXQpIHtcblx0XHR2YXIgYWRkcmVzc19wb29sID0gW107XG5cdFx0X2NoZWNrX291dHB1dF9mb3JtYXQob3V0cHV0Rm9ybWF0KTtcblxuXHRcdC8vIC0tLS0tLS0tLS0gaW5wdXQ6IG1lc3NhZ2UgKHVuc2l6ZWRfYnVmKVxuXHRcdFxuXHRcdG1lc3NhZ2UgPSBfYW55X3RvX1VpbnQ4QXJyYXkoYWRkcmVzc19wb29sLCBtZXNzYWdlLCBcIm1lc3NhZ2VcIik7XG5cdFx0dmFyIG1lc3NhZ2VfYWRkcmVzcyA9IF90b19hbGxvY2F0ZWRfYnVmX2FkZHJlc3MobWVzc2FnZSksXG5cdFx0ICAgIG1lc3NhZ2VfbGVuZ3RoID0gbWVzc2FnZS5sZW5ndGg7XG5cdFx0YWRkcmVzc19wb29sLnB1c2gobWVzc2FnZV9hZGRyZXNzKTtcblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBrZXkgKGJ1Zilcblx0XHRcblx0XHRrZXkgPSBfYW55X3RvX1VpbnQ4QXJyYXkoYWRkcmVzc19wb29sLCBrZXksIFwia2V5XCIpO1xuXHRcdHZhciBrZXlfYWRkcmVzcywga2V5X2xlbmd0aCA9IChsaWJzb2RpdW0uX2NyeXB0b19hdXRoX2htYWNzaGEyNTZfa2V5Ynl0ZXMoKSkgfCAwO1xuXHRcdGlmIChrZXkubGVuZ3RoICE9PSBrZXlfbGVuZ3RoKSB7XG5cdFx0XHRfZnJlZV9hbmRfdGhyb3dfdHlwZV9lcnJvcihhZGRyZXNzX3Bvb2wsIFwiaW52YWxpZCBrZXkgbGVuZ3RoXCIpO1xuXHRcdH1cblx0XHRrZXlfYWRkcmVzcyA9IF90b19hbGxvY2F0ZWRfYnVmX2FkZHJlc3Moa2V5KTtcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChrZXlfYWRkcmVzcyk7XG5cdFx0XG5cdFx0Ly8gLS0tLS0tLS0tLSBvdXRwdXQgaGFzaCAoYnVmKVxuXHRcdFxuXHRcdHZhciBoYXNoX2xlbmd0aCA9IChsaWJzb2RpdW0uX2NyeXB0b19hdXRoX2htYWNzaGEyNTZfYnl0ZXMoKSkgfCAwLFxuXHRcdCAgICBoYXNoID0gbmV3IEFsbG9jYXRlZEJ1ZihoYXNoX2xlbmd0aCksXG5cdFx0ICAgIGhhc2hfYWRkcmVzcyA9IGhhc2guYWRkcmVzcztcblx0XHRcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChoYXNoX2FkZHJlc3MpO1xuXHRcdFxuXHRcdGlmICgobGlic29kaXVtLl9jcnlwdG9fYXV0aF9obWFjc2hhMjU2KGhhc2hfYWRkcmVzcywgbWVzc2FnZV9hZGRyZXNzLCBtZXNzYWdlX2xlbmd0aCwgMCwga2V5X2FkZHJlc3MpIHwgMCkgPT09IDApIHtcblx0XHRcdHZhciByZXQgPSBfZm9ybWF0X291dHB1dChoYXNoLCBvdXRwdXRGb3JtYXQpO1xuXHRcdFx0X2ZyZWVfYWxsKGFkZHJlc3NfcG9vbCk7XG5cdFx0XHRyZXR1cm4gcmV0O1xuXHRcdH1cblx0XHRfZnJlZV9hbmRfdGhyb3dfZXJyb3IoYWRkcmVzc19wb29sKTtcblx0XHRcblx0fVxuXG5cdGZ1bmN0aW9uIGNyeXB0b19hdXRoX2htYWNzaGEyNTZfdmVyaWZ5KHRhZywgbWVzc2FnZSwga2V5KSB7XG5cdFx0dmFyIGFkZHJlc3NfcG9vbCA9IFtdO1xuXG5cdFx0Ly8gLS0tLS0tLS0tLSBpbnB1dDogdGFnIChidWYpXG5cdFx0XG5cdFx0dGFnID0gX2FueV90b19VaW50OEFycmF5KGFkZHJlc3NfcG9vbCwgdGFnLCBcInRhZ1wiKTtcblx0XHR2YXIgdGFnX2FkZHJlc3MsIHRhZ19sZW5ndGggPSAobGlic29kaXVtLl9jcnlwdG9fYXV0aF9obWFjc2hhMjU2X2J5dGVzKCkpIHwgMDtcblx0XHRpZiAodGFnLmxlbmd0aCAhPT0gdGFnX2xlbmd0aCkge1xuXHRcdFx0X2ZyZWVfYW5kX3Rocm93X3R5cGVfZXJyb3IoYWRkcmVzc19wb29sLCBcImludmFsaWQgdGFnIGxlbmd0aFwiKTtcblx0XHR9XG5cdFx0dGFnX2FkZHJlc3MgPSBfdG9fYWxsb2NhdGVkX2J1Zl9hZGRyZXNzKHRhZyk7XG5cdFx0YWRkcmVzc19wb29sLnB1c2godGFnX2FkZHJlc3MpO1xuXHRcdFxuXHRcdC8vIC0tLS0tLS0tLS0gaW5wdXQ6IG1lc3NhZ2UgKHVuc2l6ZWRfYnVmKVxuXHRcdFxuXHRcdG1lc3NhZ2UgPSBfYW55X3RvX1VpbnQ4QXJyYXkoYWRkcmVzc19wb29sLCBtZXNzYWdlLCBcIm1lc3NhZ2VcIik7XG5cdFx0dmFyIG1lc3NhZ2VfYWRkcmVzcyA9IF90b19hbGxvY2F0ZWRfYnVmX2FkZHJlc3MobWVzc2FnZSksXG5cdFx0ICAgIG1lc3NhZ2VfbGVuZ3RoID0gbWVzc2FnZS5sZW5ndGg7XG5cdFx0YWRkcmVzc19wb29sLnB1c2gobWVzc2FnZV9hZGRyZXNzKTtcblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBrZXkgKGJ1Zilcblx0XHRcblx0XHRrZXkgPSBfYW55X3RvX1VpbnQ4QXJyYXkoYWRkcmVzc19wb29sLCBrZXksIFwia2V5XCIpO1xuXHRcdHZhciBrZXlfYWRkcmVzcywga2V5X2xlbmd0aCA9IChsaWJzb2RpdW0uX2NyeXB0b19hdXRoX2htYWNzaGEyNTZfa2V5Ynl0ZXMoKSkgfCAwO1xuXHRcdGlmIChrZXkubGVuZ3RoICE9PSBrZXlfbGVuZ3RoKSB7XG5cdFx0XHRfZnJlZV9hbmRfdGhyb3dfdHlwZV9lcnJvcihhZGRyZXNzX3Bvb2wsIFwiaW52YWxpZCBrZXkgbGVuZ3RoXCIpO1xuXHRcdH1cblx0XHRrZXlfYWRkcmVzcyA9IF90b19hbGxvY2F0ZWRfYnVmX2FkZHJlc3Moa2V5KTtcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChrZXlfYWRkcmVzcyk7XG5cdFx0XG5cdFx0dmFyIHJlc3VsdCA9IGxpYnNvZGl1bS5fY3J5cHRvX2F1dGhfaG1hY3NoYTI1Nl92ZXJpZnkodGFnX2FkZHJlc3MsIG1lc3NhZ2VfYWRkcmVzcywgbWVzc2FnZV9sZW5ndGgsIDAsIGtleV9hZGRyZXNzKSB8IDA7XG5cdFx0dmFyIHJldCA9IChyZXN1bHQgPT09IDApO1xuXHRcdF9mcmVlX2FsbChhZGRyZXNzX3Bvb2wpO1xuXHRcdHJldHVybiByZXQ7XG5cdFx0XG5cdH1cblxuXHRmdW5jdGlvbiBjcnlwdG9fYXV0aF9obWFjc2hhNTEyKG1lc3NhZ2UsIGtleSwgb3V0cHV0Rm9ybWF0KSB7XG5cdFx0dmFyIGFkZHJlc3NfcG9vbCA9IFtdO1xuXHRcdF9jaGVja19vdXRwdXRfZm9ybWF0KG91dHB1dEZvcm1hdCk7XG5cblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBtZXNzYWdlICh1bnNpemVkX2J1Zilcblx0XHRcblx0XHRtZXNzYWdlID0gX2FueV90b19VaW50OEFycmF5KGFkZHJlc3NfcG9vbCwgbWVzc2FnZSwgXCJtZXNzYWdlXCIpO1xuXHRcdHZhciBtZXNzYWdlX2FkZHJlc3MgPSBfdG9fYWxsb2NhdGVkX2J1Zl9hZGRyZXNzKG1lc3NhZ2UpLFxuXHRcdCAgICBtZXNzYWdlX2xlbmd0aCA9IG1lc3NhZ2UubGVuZ3RoO1xuXHRcdGFkZHJlc3NfcG9vbC5wdXNoKG1lc3NhZ2VfYWRkcmVzcyk7XG5cdFx0XG5cdFx0Ly8gLS0tLS0tLS0tLSBpbnB1dDoga2V5IChidWYpXG5cdFx0XG5cdFx0a2V5ID0gX2FueV90b19VaW50OEFycmF5KGFkZHJlc3NfcG9vbCwga2V5LCBcImtleVwiKTtcblx0XHR2YXIga2V5X2FkZHJlc3MsIGtleV9sZW5ndGggPSAobGlic29kaXVtLl9jcnlwdG9fYXV0aF9obWFjc2hhNTEyX2tleWJ5dGVzKCkpIHwgMDtcblx0XHRpZiAoa2V5Lmxlbmd0aCAhPT0ga2V5X2xlbmd0aCkge1xuXHRcdFx0X2ZyZWVfYW5kX3Rocm93X3R5cGVfZXJyb3IoYWRkcmVzc19wb29sLCBcImludmFsaWQga2V5IGxlbmd0aFwiKTtcblx0XHR9XG5cdFx0a2V5X2FkZHJlc3MgPSBfdG9fYWxsb2NhdGVkX2J1Zl9hZGRyZXNzKGtleSk7XG5cdFx0YWRkcmVzc19wb29sLnB1c2goa2V5X2FkZHJlc3MpO1xuXHRcdFxuXHRcdC8vIC0tLS0tLS0tLS0gb3V0cHV0IGhhc2ggKGJ1Zilcblx0XHRcblx0XHR2YXIgaGFzaF9sZW5ndGggPSAobGlic29kaXVtLl9jcnlwdG9fYXV0aF9obWFjc2hhNTEyX2J5dGVzKCkpIHwgMCxcblx0XHQgICAgaGFzaCA9IG5ldyBBbGxvY2F0ZWRCdWYoaGFzaF9sZW5ndGgpLFxuXHRcdCAgICBoYXNoX2FkZHJlc3MgPSBoYXNoLmFkZHJlc3M7XG5cdFx0XG5cdFx0YWRkcmVzc19wb29sLnB1c2goaGFzaF9hZGRyZXNzKTtcblx0XHRcblx0XHRpZiAoKGxpYnNvZGl1bS5fY3J5cHRvX2F1dGhfaG1hY3NoYTUxMihoYXNoX2FkZHJlc3MsIG1lc3NhZ2VfYWRkcmVzcywgbWVzc2FnZV9sZW5ndGgsIDAsIGtleV9hZGRyZXNzKSB8IDApID09PSAwKSB7XG5cdFx0XHR2YXIgcmV0ID0gX2Zvcm1hdF9vdXRwdXQoaGFzaCwgb3V0cHV0Rm9ybWF0KTtcblx0XHRcdF9mcmVlX2FsbChhZGRyZXNzX3Bvb2wpO1xuXHRcdFx0cmV0dXJuIHJldDtcblx0XHR9XG5cdFx0X2ZyZWVfYW5kX3Rocm93X2Vycm9yKGFkZHJlc3NfcG9vbCk7XG5cdFx0XG5cdH1cblxuXHRmdW5jdGlvbiBjcnlwdG9fYXV0aF9obWFjc2hhNTEyX3ZlcmlmeSh0YWcsIG1lc3NhZ2UsIGtleSkge1xuXHRcdHZhciBhZGRyZXNzX3Bvb2wgPSBbXTtcblxuXHRcdC8vIC0tLS0tLS0tLS0gaW5wdXQ6IHRhZyAoYnVmKVxuXHRcdFxuXHRcdHRhZyA9IF9hbnlfdG9fVWludDhBcnJheShhZGRyZXNzX3Bvb2wsIHRhZywgXCJ0YWdcIik7XG5cdFx0dmFyIHRhZ19hZGRyZXNzLCB0YWdfbGVuZ3RoID0gKGxpYnNvZGl1bS5fY3J5cHRvX2F1dGhfaG1hY3NoYTUxMl9ieXRlcygpKSB8IDA7XG5cdFx0aWYgKHRhZy5sZW5ndGggIT09IHRhZ19sZW5ndGgpIHtcblx0XHRcdF9mcmVlX2FuZF90aHJvd190eXBlX2Vycm9yKGFkZHJlc3NfcG9vbCwgXCJpbnZhbGlkIHRhZyBsZW5ndGhcIik7XG5cdFx0fVxuXHRcdHRhZ19hZGRyZXNzID0gX3RvX2FsbG9jYXRlZF9idWZfYWRkcmVzcyh0YWcpO1xuXHRcdGFkZHJlc3NfcG9vbC5wdXNoKHRhZ19hZGRyZXNzKTtcblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBtZXNzYWdlICh1bnNpemVkX2J1Zilcblx0XHRcblx0XHRtZXNzYWdlID0gX2FueV90b19VaW50OEFycmF5KGFkZHJlc3NfcG9vbCwgbWVzc2FnZSwgXCJtZXNzYWdlXCIpO1xuXHRcdHZhciBtZXNzYWdlX2FkZHJlc3MgPSBfdG9fYWxsb2NhdGVkX2J1Zl9hZGRyZXNzKG1lc3NhZ2UpLFxuXHRcdCAgICBtZXNzYWdlX2xlbmd0aCA9IG1lc3NhZ2UubGVuZ3RoO1xuXHRcdGFkZHJlc3NfcG9vbC5wdXNoKG1lc3NhZ2VfYWRkcmVzcyk7XG5cdFx0XG5cdFx0Ly8gLS0tLS0tLS0tLSBpbnB1dDoga2V5IChidWYpXG5cdFx0XG5cdFx0a2V5ID0gX2FueV90b19VaW50OEFycmF5KGFkZHJlc3NfcG9vbCwga2V5LCBcImtleVwiKTtcblx0XHR2YXIga2V5X2FkZHJlc3MsIGtleV9sZW5ndGggPSAobGlic29kaXVtLl9jcnlwdG9fYXV0aF9obWFjc2hhNTEyX2tleWJ5dGVzKCkpIHwgMDtcblx0XHRpZiAoa2V5Lmxlbmd0aCAhPT0ga2V5X2xlbmd0aCkge1xuXHRcdFx0X2ZyZWVfYW5kX3Rocm93X3R5cGVfZXJyb3IoYWRkcmVzc19wb29sLCBcImludmFsaWQga2V5IGxlbmd0aFwiKTtcblx0XHR9XG5cdFx0a2V5X2FkZHJlc3MgPSBfdG9fYWxsb2NhdGVkX2J1Zl9hZGRyZXNzKGtleSk7XG5cdFx0YWRkcmVzc19wb29sLnB1c2goa2V5X2FkZHJlc3MpO1xuXHRcdFxuXHRcdHZhciByZXN1bHQgPSBsaWJzb2RpdW0uX2NyeXB0b19hdXRoX2htYWNzaGE1MTJfdmVyaWZ5KHRhZ19hZGRyZXNzLCBtZXNzYWdlX2FkZHJlc3MsIG1lc3NhZ2VfbGVuZ3RoLCAwLCBrZXlfYWRkcmVzcykgfCAwO1xuXHRcdHZhciByZXQgPSAocmVzdWx0ID09PSAwKTtcblx0XHRfZnJlZV9hbGwoYWRkcmVzc19wb29sKTtcblx0XHRyZXR1cm4gcmV0O1xuXHRcdFxuXHR9XG5cblx0ZnVuY3Rpb24gY3J5cHRvX2F1dGhfdmVyaWZ5KHRhZywgbWVzc2FnZSwga2V5KSB7XG5cdFx0dmFyIGFkZHJlc3NfcG9vbCA9IFtdO1xuXG5cdFx0Ly8gLS0tLS0tLS0tLSBpbnB1dDogdGFnIChidWYpXG5cdFx0XG5cdFx0dGFnID0gX2FueV90b19VaW50OEFycmF5KGFkZHJlc3NfcG9vbCwgdGFnLCBcInRhZ1wiKTtcblx0XHR2YXIgdGFnX2FkZHJlc3MsIHRhZ19sZW5ndGggPSAobGlic29kaXVtLl9jcnlwdG9fYXV0aF9ieXRlcygpKSB8IDA7XG5cdFx0aWYgKHRhZy5sZW5ndGggIT09IHRhZ19sZW5ndGgpIHtcblx0XHRcdF9mcmVlX2FuZF90aHJvd190eXBlX2Vycm9yKGFkZHJlc3NfcG9vbCwgXCJpbnZhbGlkIHRhZyBsZW5ndGhcIik7XG5cdFx0fVxuXHRcdHRhZ19hZGRyZXNzID0gX3RvX2FsbG9jYXRlZF9idWZfYWRkcmVzcyh0YWcpO1xuXHRcdGFkZHJlc3NfcG9vbC5wdXNoKHRhZ19hZGRyZXNzKTtcblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBtZXNzYWdlICh1bnNpemVkX2J1Zilcblx0XHRcblx0XHRtZXNzYWdlID0gX2FueV90b19VaW50OEFycmF5KGFkZHJlc3NfcG9vbCwgbWVzc2FnZSwgXCJtZXNzYWdlXCIpO1xuXHRcdHZhciBtZXNzYWdlX2FkZHJlc3MgPSBfdG9fYWxsb2NhdGVkX2J1Zl9hZGRyZXNzKG1lc3NhZ2UpLFxuXHRcdCAgICBtZXNzYWdlX2xlbmd0aCA9IG1lc3NhZ2UubGVuZ3RoO1xuXHRcdGFkZHJlc3NfcG9vbC5wdXNoKG1lc3NhZ2VfYWRkcmVzcyk7XG5cdFx0XG5cdFx0Ly8gLS0tLS0tLS0tLSBpbnB1dDoga2V5IChidWYpXG5cdFx0XG5cdFx0a2V5ID0gX2FueV90b19VaW50OEFycmF5KGFkZHJlc3NfcG9vbCwga2V5LCBcImtleVwiKTtcblx0XHR2YXIga2V5X2FkZHJlc3MsIGtleV9sZW5ndGggPSAobGlic29kaXVtLl9jcnlwdG9fYXV0aF9rZXlieXRlcygpKSB8IDA7XG5cdFx0aWYgKGtleS5sZW5ndGggIT09IGtleV9sZW5ndGgpIHtcblx0XHRcdF9mcmVlX2FuZF90aHJvd190eXBlX2Vycm9yKGFkZHJlc3NfcG9vbCwgXCJpbnZhbGlkIGtleSBsZW5ndGhcIik7XG5cdFx0fVxuXHRcdGtleV9hZGRyZXNzID0gX3RvX2FsbG9jYXRlZF9idWZfYWRkcmVzcyhrZXkpO1xuXHRcdGFkZHJlc3NfcG9vbC5wdXNoKGtleV9hZGRyZXNzKTtcblx0XHRcblx0XHR2YXIgcmVzdWx0ID0gbGlic29kaXVtLl9jcnlwdG9fYXV0aF92ZXJpZnkodGFnX2FkZHJlc3MsIG1lc3NhZ2VfYWRkcmVzcywgbWVzc2FnZV9sZW5ndGgsIDAsIGtleV9hZGRyZXNzKSB8IDA7XG5cdFx0dmFyIHJldCA9IChyZXN1bHQgPT09IDApO1xuXHRcdF9mcmVlX2FsbChhZGRyZXNzX3Bvb2wpO1xuXHRcdHJldHVybiByZXQ7XG5cdFx0XG5cdH1cblxuXHRmdW5jdGlvbiBjcnlwdG9fYm94X2JlZm9yZW5tKHB1YmxpY0tleSwgc2VjcmV0S2V5LCBvdXRwdXRGb3JtYXQpIHtcblx0XHR2YXIgYWRkcmVzc19wb29sID0gW107XG5cdFx0X2NoZWNrX291dHB1dF9mb3JtYXQob3V0cHV0Rm9ybWF0KTtcblxuXHRcdC8vIC0tLS0tLS0tLS0gaW5wdXQ6IHB1YmxpY0tleSAoYnVmKVxuXHRcdFxuXHRcdHB1YmxpY0tleSA9IF9hbnlfdG9fVWludDhBcnJheShhZGRyZXNzX3Bvb2wsIHB1YmxpY0tleSwgXCJwdWJsaWNLZXlcIik7XG5cdFx0dmFyIHB1YmxpY0tleV9hZGRyZXNzLCBwdWJsaWNLZXlfbGVuZ3RoID0gKGxpYnNvZGl1bS5fY3J5cHRvX2JveF9wdWJsaWNrZXlieXRlcygpKSB8IDA7XG5cdFx0aWYgKHB1YmxpY0tleS5sZW5ndGggIT09IHB1YmxpY0tleV9sZW5ndGgpIHtcblx0XHRcdF9mcmVlX2FuZF90aHJvd190eXBlX2Vycm9yKGFkZHJlc3NfcG9vbCwgXCJpbnZhbGlkIHB1YmxpY0tleSBsZW5ndGhcIik7XG5cdFx0fVxuXHRcdHB1YmxpY0tleV9hZGRyZXNzID0gX3RvX2FsbG9jYXRlZF9idWZfYWRkcmVzcyhwdWJsaWNLZXkpO1xuXHRcdGFkZHJlc3NfcG9vbC5wdXNoKHB1YmxpY0tleV9hZGRyZXNzKTtcblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBzZWNyZXRLZXkgKGJ1Zilcblx0XHRcblx0XHRzZWNyZXRLZXkgPSBfYW55X3RvX1VpbnQ4QXJyYXkoYWRkcmVzc19wb29sLCBzZWNyZXRLZXksIFwic2VjcmV0S2V5XCIpO1xuXHRcdHZhciBzZWNyZXRLZXlfYWRkcmVzcywgc2VjcmV0S2V5X2xlbmd0aCA9IChsaWJzb2RpdW0uX2NyeXB0b19ib3hfc2VjcmV0a2V5Ynl0ZXMoKSkgfCAwO1xuXHRcdGlmIChzZWNyZXRLZXkubGVuZ3RoICE9PSBzZWNyZXRLZXlfbGVuZ3RoKSB7XG5cdFx0XHRfZnJlZV9hbmRfdGhyb3dfdHlwZV9lcnJvcihhZGRyZXNzX3Bvb2wsIFwiaW52YWxpZCBzZWNyZXRLZXkgbGVuZ3RoXCIpO1xuXHRcdH1cblx0XHRzZWNyZXRLZXlfYWRkcmVzcyA9IF90b19hbGxvY2F0ZWRfYnVmX2FkZHJlc3Moc2VjcmV0S2V5KTtcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChzZWNyZXRLZXlfYWRkcmVzcyk7XG5cdFx0XG5cdFx0Ly8gLS0tLS0tLS0tLSBvdXRwdXQgc2hhcmVkS2V5IChidWYpXG5cdFx0XG5cdFx0dmFyIHNoYXJlZEtleV9sZW5ndGggPSAobGlic29kaXVtLl9jcnlwdG9fYm94X2JlZm9yZW5tYnl0ZXMoKSkgfCAwLFxuXHRcdCAgICBzaGFyZWRLZXkgPSBuZXcgQWxsb2NhdGVkQnVmKHNoYXJlZEtleV9sZW5ndGgpLFxuXHRcdCAgICBzaGFyZWRLZXlfYWRkcmVzcyA9IHNoYXJlZEtleS5hZGRyZXNzO1xuXHRcdFxuXHRcdGFkZHJlc3NfcG9vbC5wdXNoKHNoYXJlZEtleV9hZGRyZXNzKTtcblx0XHRcblx0XHRpZiAoKGxpYnNvZGl1bS5fY3J5cHRvX2JveF9iZWZvcmVubShzaGFyZWRLZXlfYWRkcmVzcywgcHVibGljS2V5X2FkZHJlc3MsIHNlY3JldEtleV9hZGRyZXNzKSB8IDApID09PSAwKSB7XG5cdFx0XHR2YXIgcmV0ID0gX2Zvcm1hdF9vdXRwdXQoc2hhcmVkS2V5LCBvdXRwdXRGb3JtYXQpO1xuXHRcdFx0X2ZyZWVfYWxsKGFkZHJlc3NfcG9vbCk7XG5cdFx0XHRyZXR1cm4gcmV0O1xuXHRcdH1cblx0XHRfZnJlZV9hbmRfdGhyb3dfZXJyb3IoYWRkcmVzc19wb29sKTtcblx0XHRcblx0fVxuXG5cdGZ1bmN0aW9uIGNyeXB0b19ib3hfZGV0YWNoZWQobWVzc2FnZSwgbm9uY2UsIHB1YmxpY0tleSwgc2VjcmV0S2V5LCBvdXRwdXRGb3JtYXQpIHtcblx0XHR2YXIgYWRkcmVzc19wb29sID0gW107XG5cdFx0X2NoZWNrX291dHB1dF9mb3JtYXQob3V0cHV0Rm9ybWF0KTtcblxuXHRcdC8vIC0tLS0tLS0tLS0gaW5wdXQ6IG1lc3NhZ2UgKHVuc2l6ZWRfYnVmKVxuXHRcdFxuXHRcdG1lc3NhZ2UgPSBfYW55X3RvX1VpbnQ4QXJyYXkoYWRkcmVzc19wb29sLCBtZXNzYWdlLCBcIm1lc3NhZ2VcIik7XG5cdFx0dmFyIG1lc3NhZ2VfYWRkcmVzcyA9IF90b19hbGxvY2F0ZWRfYnVmX2FkZHJlc3MobWVzc2FnZSksXG5cdFx0ICAgIG1lc3NhZ2VfbGVuZ3RoID0gbWVzc2FnZS5sZW5ndGg7XG5cdFx0YWRkcmVzc19wb29sLnB1c2gobWVzc2FnZV9hZGRyZXNzKTtcblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBub25jZSAoYnVmKVxuXHRcdFxuXHRcdG5vbmNlID0gX2FueV90b19VaW50OEFycmF5KGFkZHJlc3NfcG9vbCwgbm9uY2UsIFwibm9uY2VcIik7XG5cdFx0dmFyIG5vbmNlX2FkZHJlc3MsIG5vbmNlX2xlbmd0aCA9IChsaWJzb2RpdW0uX2NyeXB0b19ib3hfbm9uY2VieXRlcygpKSB8IDA7XG5cdFx0aWYgKG5vbmNlLmxlbmd0aCAhPT0gbm9uY2VfbGVuZ3RoKSB7XG5cdFx0XHRfZnJlZV9hbmRfdGhyb3dfdHlwZV9lcnJvcihhZGRyZXNzX3Bvb2wsIFwiaW52YWxpZCBub25jZSBsZW5ndGhcIik7XG5cdFx0fVxuXHRcdG5vbmNlX2FkZHJlc3MgPSBfdG9fYWxsb2NhdGVkX2J1Zl9hZGRyZXNzKG5vbmNlKTtcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChub25jZV9hZGRyZXNzKTtcblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBwdWJsaWNLZXkgKGJ1Zilcblx0XHRcblx0XHRwdWJsaWNLZXkgPSBfYW55X3RvX1VpbnQ4QXJyYXkoYWRkcmVzc19wb29sLCBwdWJsaWNLZXksIFwicHVibGljS2V5XCIpO1xuXHRcdHZhciBwdWJsaWNLZXlfYWRkcmVzcywgcHVibGljS2V5X2xlbmd0aCA9IChsaWJzb2RpdW0uX2NyeXB0b19ib3hfcHVibGlja2V5Ynl0ZXMoKSkgfCAwO1xuXHRcdGlmIChwdWJsaWNLZXkubGVuZ3RoICE9PSBwdWJsaWNLZXlfbGVuZ3RoKSB7XG5cdFx0XHRfZnJlZV9hbmRfdGhyb3dfdHlwZV9lcnJvcihhZGRyZXNzX3Bvb2wsIFwiaW52YWxpZCBwdWJsaWNLZXkgbGVuZ3RoXCIpO1xuXHRcdH1cblx0XHRwdWJsaWNLZXlfYWRkcmVzcyA9IF90b19hbGxvY2F0ZWRfYnVmX2FkZHJlc3MocHVibGljS2V5KTtcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChwdWJsaWNLZXlfYWRkcmVzcyk7XG5cdFx0XG5cdFx0Ly8gLS0tLS0tLS0tLSBpbnB1dDogc2VjcmV0S2V5IChidWYpXG5cdFx0XG5cdFx0c2VjcmV0S2V5ID0gX2FueV90b19VaW50OEFycmF5KGFkZHJlc3NfcG9vbCwgc2VjcmV0S2V5LCBcInNlY3JldEtleVwiKTtcblx0XHR2YXIgc2VjcmV0S2V5X2FkZHJlc3MsIHNlY3JldEtleV9sZW5ndGggPSAobGlic29kaXVtLl9jcnlwdG9fYm94X3NlY3JldGtleWJ5dGVzKCkpIHwgMDtcblx0XHRpZiAoc2VjcmV0S2V5Lmxlbmd0aCAhPT0gc2VjcmV0S2V5X2xlbmd0aCkge1xuXHRcdFx0X2ZyZWVfYW5kX3Rocm93X3R5cGVfZXJyb3IoYWRkcmVzc19wb29sLCBcImludmFsaWQgc2VjcmV0S2V5IGxlbmd0aFwiKTtcblx0XHR9XG5cdFx0c2VjcmV0S2V5X2FkZHJlc3MgPSBfdG9fYWxsb2NhdGVkX2J1Zl9hZGRyZXNzKHNlY3JldEtleSk7XG5cdFx0YWRkcmVzc19wb29sLnB1c2goc2VjcmV0S2V5X2FkZHJlc3MpO1xuXHRcdFxuXHRcdC8vIC0tLS0tLS0tLS0gb3V0cHV0IGNpcGhlcnRleHQgKGJ1Zilcblx0XHRcblx0XHR2YXIgY2lwaGVydGV4dF9sZW5ndGggPSAobWVzc2FnZV9sZW5ndGgpIHwgMCxcblx0XHQgICAgY2lwaGVydGV4dCA9IG5ldyBBbGxvY2F0ZWRCdWYoY2lwaGVydGV4dF9sZW5ndGgpLFxuXHRcdCAgICBjaXBoZXJ0ZXh0X2FkZHJlc3MgPSBjaXBoZXJ0ZXh0LmFkZHJlc3M7XG5cdFx0XG5cdFx0YWRkcmVzc19wb29sLnB1c2goY2lwaGVydGV4dF9hZGRyZXNzKTtcblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIG91dHB1dCBtYWMgKGJ1Zilcblx0XHRcblx0XHR2YXIgbWFjX2xlbmd0aCA9IChsaWJzb2RpdW0uX2NyeXB0b19ib3hfbWFjYnl0ZXMoKSkgfCAwLFxuXHRcdCAgICBtYWMgPSBuZXcgQWxsb2NhdGVkQnVmKG1hY19sZW5ndGgpLFxuXHRcdCAgICBtYWNfYWRkcmVzcyA9IG1hYy5hZGRyZXNzO1xuXHRcdFxuXHRcdGFkZHJlc3NfcG9vbC5wdXNoKG1hY19hZGRyZXNzKTtcblx0XHRcblx0XHRpZiAoKGxpYnNvZGl1bS5fY3J5cHRvX2JveF9kZXRhY2hlZChjaXBoZXJ0ZXh0X2FkZHJlc3MsIG1hY19hZGRyZXNzLCBtZXNzYWdlX2FkZHJlc3MsIG1lc3NhZ2VfbGVuZ3RoLCAwLCBub25jZV9hZGRyZXNzLCBwdWJsaWNLZXlfYWRkcmVzcywgc2VjcmV0S2V5X2FkZHJlc3MpIHwgMCkgPT09IDApIHtcblx0XHRcdHZhciByZXQgPSBfZm9ybWF0X291dHB1dCh7Y2lwaGVydGV4dDogY2lwaGVydGV4dCwgbWFjOiBtYWN9LCBvdXRwdXRGb3JtYXQpO1xuXHRcdFx0X2ZyZWVfYWxsKGFkZHJlc3NfcG9vbCk7XG5cdFx0XHRyZXR1cm4gcmV0O1xuXHRcdH1cblx0XHRfZnJlZV9hbmRfdGhyb3dfZXJyb3IoYWRkcmVzc19wb29sKTtcblx0XHRcblx0fVxuXG5cdGZ1bmN0aW9uIGNyeXB0b19ib3hfZWFzeShtZXNzYWdlLCBub25jZSwgcHVibGljS2V5LCBzZWNyZXRLZXksIG91dHB1dEZvcm1hdCkge1xuXHRcdHZhciBhZGRyZXNzX3Bvb2wgPSBbXTtcblx0XHRfY2hlY2tfb3V0cHV0X2Zvcm1hdChvdXRwdXRGb3JtYXQpO1xuXG5cdFx0Ly8gLS0tLS0tLS0tLSBpbnB1dDogbWVzc2FnZSAodW5zaXplZF9idWYpXG5cdFx0XG5cdFx0bWVzc2FnZSA9IF9hbnlfdG9fVWludDhBcnJheShhZGRyZXNzX3Bvb2wsIG1lc3NhZ2UsIFwibWVzc2FnZVwiKTtcblx0XHR2YXIgbWVzc2FnZV9hZGRyZXNzID0gX3RvX2FsbG9jYXRlZF9idWZfYWRkcmVzcyhtZXNzYWdlKSxcblx0XHQgICAgbWVzc2FnZV9sZW5ndGggPSBtZXNzYWdlLmxlbmd0aDtcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChtZXNzYWdlX2FkZHJlc3MpO1xuXHRcdFxuXHRcdC8vIC0tLS0tLS0tLS0gaW5wdXQ6IG5vbmNlIChidWYpXG5cdFx0XG5cdFx0bm9uY2UgPSBfYW55X3RvX1VpbnQ4QXJyYXkoYWRkcmVzc19wb29sLCBub25jZSwgXCJub25jZVwiKTtcblx0XHR2YXIgbm9uY2VfYWRkcmVzcywgbm9uY2VfbGVuZ3RoID0gKGxpYnNvZGl1bS5fY3J5cHRvX2JveF9ub25jZWJ5dGVzKCkpIHwgMDtcblx0XHRpZiAobm9uY2UubGVuZ3RoICE9PSBub25jZV9sZW5ndGgpIHtcblx0XHRcdF9mcmVlX2FuZF90aHJvd190eXBlX2Vycm9yKGFkZHJlc3NfcG9vbCwgXCJpbnZhbGlkIG5vbmNlIGxlbmd0aFwiKTtcblx0XHR9XG5cdFx0bm9uY2VfYWRkcmVzcyA9IF90b19hbGxvY2F0ZWRfYnVmX2FkZHJlc3Mobm9uY2UpO1xuXHRcdGFkZHJlc3NfcG9vbC5wdXNoKG5vbmNlX2FkZHJlc3MpO1xuXHRcdFxuXHRcdC8vIC0tLS0tLS0tLS0gaW5wdXQ6IHB1YmxpY0tleSAoYnVmKVxuXHRcdFxuXHRcdHB1YmxpY0tleSA9IF9hbnlfdG9fVWludDhBcnJheShhZGRyZXNzX3Bvb2wsIHB1YmxpY0tleSwgXCJwdWJsaWNLZXlcIik7XG5cdFx0dmFyIHB1YmxpY0tleV9hZGRyZXNzLCBwdWJsaWNLZXlfbGVuZ3RoID0gKGxpYnNvZGl1bS5fY3J5cHRvX2JveF9wdWJsaWNrZXlieXRlcygpKSB8IDA7XG5cdFx0aWYgKHB1YmxpY0tleS5sZW5ndGggIT09IHB1YmxpY0tleV9sZW5ndGgpIHtcblx0XHRcdF9mcmVlX2FuZF90aHJvd190eXBlX2Vycm9yKGFkZHJlc3NfcG9vbCwgXCJpbnZhbGlkIHB1YmxpY0tleSBsZW5ndGhcIik7XG5cdFx0fVxuXHRcdHB1YmxpY0tleV9hZGRyZXNzID0gX3RvX2FsbG9jYXRlZF9idWZfYWRkcmVzcyhwdWJsaWNLZXkpO1xuXHRcdGFkZHJlc3NfcG9vbC5wdXNoKHB1YmxpY0tleV9hZGRyZXNzKTtcblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBzZWNyZXRLZXkgKGJ1Zilcblx0XHRcblx0XHRzZWNyZXRLZXkgPSBfYW55X3RvX1VpbnQ4QXJyYXkoYWRkcmVzc19wb29sLCBzZWNyZXRLZXksIFwic2VjcmV0S2V5XCIpO1xuXHRcdHZhciBzZWNyZXRLZXlfYWRkcmVzcywgc2VjcmV0S2V5X2xlbmd0aCA9IChsaWJzb2RpdW0uX2NyeXB0b19ib3hfc2VjcmV0a2V5Ynl0ZXMoKSkgfCAwO1xuXHRcdGlmIChzZWNyZXRLZXkubGVuZ3RoICE9PSBzZWNyZXRLZXlfbGVuZ3RoKSB7XG5cdFx0XHRfZnJlZV9hbmRfdGhyb3dfdHlwZV9lcnJvcihhZGRyZXNzX3Bvb2wsIFwiaW52YWxpZCBzZWNyZXRLZXkgbGVuZ3RoXCIpO1xuXHRcdH1cblx0XHRzZWNyZXRLZXlfYWRkcmVzcyA9IF90b19hbGxvY2F0ZWRfYnVmX2FkZHJlc3Moc2VjcmV0S2V5KTtcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChzZWNyZXRLZXlfYWRkcmVzcyk7XG5cdFx0XG5cdFx0Ly8gLS0tLS0tLS0tLSBvdXRwdXQgY2lwaGVydGV4dCAoYnVmKVxuXHRcdFxuXHRcdHZhciBjaXBoZXJ0ZXh0X2xlbmd0aCA9IChtZXNzYWdlX2xlbmd0aCArIGxpYnNvZGl1bS5fY3J5cHRvX2JveF9tYWNieXRlcygpKSB8IDAsXG5cdFx0ICAgIGNpcGhlcnRleHQgPSBuZXcgQWxsb2NhdGVkQnVmKGNpcGhlcnRleHRfbGVuZ3RoKSxcblx0XHQgICAgY2lwaGVydGV4dF9hZGRyZXNzID0gY2lwaGVydGV4dC5hZGRyZXNzO1xuXHRcdFxuXHRcdGFkZHJlc3NfcG9vbC5wdXNoKGNpcGhlcnRleHRfYWRkcmVzcyk7XG5cdFx0XG5cdFx0aWYgKChsaWJzb2RpdW0uX2NyeXB0b19ib3hfZWFzeShjaXBoZXJ0ZXh0X2FkZHJlc3MsIG1lc3NhZ2VfYWRkcmVzcywgbWVzc2FnZV9sZW5ndGgsIDAsIG5vbmNlX2FkZHJlc3MsIHB1YmxpY0tleV9hZGRyZXNzLCBzZWNyZXRLZXlfYWRkcmVzcykgfCAwKSA9PT0gMCkge1xuXHRcdFx0dmFyIHJldCA9IF9mb3JtYXRfb3V0cHV0KGNpcGhlcnRleHQsIG91dHB1dEZvcm1hdCk7XG5cdFx0XHRfZnJlZV9hbGwoYWRkcmVzc19wb29sKTtcblx0XHRcdHJldHVybiByZXQ7XG5cdFx0fVxuXHRcdF9mcmVlX2FuZF90aHJvd19lcnJvcihhZGRyZXNzX3Bvb2wpO1xuXHRcdFxuXHR9XG5cblx0ZnVuY3Rpb24gY3J5cHRvX2JveF9lYXN5X2FmdGVybm0obWVzc2FnZSwgbm9uY2UsIHNoYXJlZEtleSwgb3V0cHV0Rm9ybWF0KSB7XG5cdFx0dmFyIGFkZHJlc3NfcG9vbCA9IFtdO1xuXHRcdF9jaGVja19vdXRwdXRfZm9ybWF0KG91dHB1dEZvcm1hdCk7XG5cblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBtZXNzYWdlICh1bnNpemVkX2J1Zilcblx0XHRcblx0XHRtZXNzYWdlID0gX2FueV90b19VaW50OEFycmF5KGFkZHJlc3NfcG9vbCwgbWVzc2FnZSwgXCJtZXNzYWdlXCIpO1xuXHRcdHZhciBtZXNzYWdlX2FkZHJlc3MgPSBfdG9fYWxsb2NhdGVkX2J1Zl9hZGRyZXNzKG1lc3NhZ2UpLFxuXHRcdCAgICBtZXNzYWdlX2xlbmd0aCA9IG1lc3NhZ2UubGVuZ3RoO1xuXHRcdGFkZHJlc3NfcG9vbC5wdXNoKG1lc3NhZ2VfYWRkcmVzcyk7XG5cdFx0XG5cdFx0Ly8gLS0tLS0tLS0tLSBpbnB1dDogbm9uY2UgKGJ1Zilcblx0XHRcblx0XHRub25jZSA9IF9hbnlfdG9fVWludDhBcnJheShhZGRyZXNzX3Bvb2wsIG5vbmNlLCBcIm5vbmNlXCIpO1xuXHRcdHZhciBub25jZV9hZGRyZXNzLCBub25jZV9sZW5ndGggPSAobGlic29kaXVtLl9jcnlwdG9fYm94X25vbmNlYnl0ZXMoKSkgfCAwO1xuXHRcdGlmIChub25jZS5sZW5ndGggIT09IG5vbmNlX2xlbmd0aCkge1xuXHRcdFx0X2ZyZWVfYW5kX3Rocm93X3R5cGVfZXJyb3IoYWRkcmVzc19wb29sLCBcImludmFsaWQgbm9uY2UgbGVuZ3RoXCIpO1xuXHRcdH1cblx0XHRub25jZV9hZGRyZXNzID0gX3RvX2FsbG9jYXRlZF9idWZfYWRkcmVzcyhub25jZSk7XG5cdFx0YWRkcmVzc19wb29sLnB1c2gobm9uY2VfYWRkcmVzcyk7XG5cdFx0XG5cdFx0Ly8gLS0tLS0tLS0tLSBpbnB1dDogc2hhcmVkS2V5IChidWYpXG5cdFx0XG5cdFx0c2hhcmVkS2V5ID0gX2FueV90b19VaW50OEFycmF5KGFkZHJlc3NfcG9vbCwgc2hhcmVkS2V5LCBcInNoYXJlZEtleVwiKTtcblx0XHR2YXIgc2hhcmVkS2V5X2FkZHJlc3MsIHNoYXJlZEtleV9sZW5ndGggPSAobGlic29kaXVtLl9jcnlwdG9fYm94X2JlZm9yZW5tYnl0ZXMoKSkgfCAwO1xuXHRcdGlmIChzaGFyZWRLZXkubGVuZ3RoICE9PSBzaGFyZWRLZXlfbGVuZ3RoKSB7XG5cdFx0XHRfZnJlZV9hbmRfdGhyb3dfdHlwZV9lcnJvcihhZGRyZXNzX3Bvb2wsIFwiaW52YWxpZCBzaGFyZWRLZXkgbGVuZ3RoXCIpO1xuXHRcdH1cblx0XHRzaGFyZWRLZXlfYWRkcmVzcyA9IF90b19hbGxvY2F0ZWRfYnVmX2FkZHJlc3Moc2hhcmVkS2V5KTtcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChzaGFyZWRLZXlfYWRkcmVzcyk7XG5cdFx0XG5cdFx0Ly8gLS0tLS0tLS0tLSBvdXRwdXQgY2lwaGVydGV4dCAoYnVmKVxuXHRcdFxuXHRcdHZhciBjaXBoZXJ0ZXh0X2xlbmd0aCA9IChtZXNzYWdlX2xlbmd0aCArIGxpYnNvZGl1bS5fY3J5cHRvX2JveF9tYWNieXRlcygpKSB8IDAsXG5cdFx0ICAgIGNpcGhlcnRleHQgPSBuZXcgQWxsb2NhdGVkQnVmKGNpcGhlcnRleHRfbGVuZ3RoKSxcblx0XHQgICAgY2lwaGVydGV4dF9hZGRyZXNzID0gY2lwaGVydGV4dC5hZGRyZXNzO1xuXHRcdFxuXHRcdGFkZHJlc3NfcG9vbC5wdXNoKGNpcGhlcnRleHRfYWRkcmVzcyk7XG5cdFx0XG5cdFx0aWYgKChsaWJzb2RpdW0uX2NyeXB0b19ib3hfZWFzeV9hZnRlcm5tKGNpcGhlcnRleHRfYWRkcmVzcywgbWVzc2FnZV9hZGRyZXNzLCBtZXNzYWdlX2xlbmd0aCwgMCwgbm9uY2VfYWRkcmVzcywgc2hhcmVkS2V5X2FkZHJlc3MpIHwgMCkgPT09IDApIHtcblx0XHRcdHZhciByZXQgPSBfZm9ybWF0X291dHB1dChjaXBoZXJ0ZXh0LCBvdXRwdXRGb3JtYXQpO1xuXHRcdFx0X2ZyZWVfYWxsKGFkZHJlc3NfcG9vbCk7XG5cdFx0XHRyZXR1cm4gcmV0O1xuXHRcdH1cblx0XHRfZnJlZV9hbmRfdGhyb3dfZXJyb3IoYWRkcmVzc19wb29sKTtcblx0XHRcblx0fVxuXG5cdGZ1bmN0aW9uIGNyeXB0b19ib3hfa2V5cGFpcihvdXRwdXRGb3JtYXQpIHtcblx0XHR2YXIgYWRkcmVzc19wb29sID0gW107XG5cdFx0X2NoZWNrX291dHB1dF9mb3JtYXQob3V0cHV0Rm9ybWF0KTtcblxuXHRcdC8vIC0tLS0tLS0tLS0gb3V0cHV0IHB1YmxpY0tleSAoYnVmKVxuXHRcdFxuXHRcdHZhciBwdWJsaWNLZXlfbGVuZ3RoID0gKGxpYnNvZGl1bS5fY3J5cHRvX2JveF9wdWJsaWNrZXlieXRlcygpKSB8IDAsXG5cdFx0ICAgIHB1YmxpY0tleSA9IG5ldyBBbGxvY2F0ZWRCdWYocHVibGljS2V5X2xlbmd0aCksXG5cdFx0ICAgIHB1YmxpY0tleV9hZGRyZXNzID0gcHVibGljS2V5LmFkZHJlc3M7XG5cdFx0XG5cdFx0YWRkcmVzc19wb29sLnB1c2gocHVibGljS2V5X2FkZHJlc3MpO1xuXHRcdFxuXHRcdC8vIC0tLS0tLS0tLS0gb3V0cHV0IHNlY3JldEtleSAoYnVmKVxuXHRcdFxuXHRcdHZhciBzZWNyZXRLZXlfbGVuZ3RoID0gKGxpYnNvZGl1bS5fY3J5cHRvX2JveF9zZWNyZXRrZXlieXRlcygpKSB8IDAsXG5cdFx0ICAgIHNlY3JldEtleSA9IG5ldyBBbGxvY2F0ZWRCdWYoc2VjcmV0S2V5X2xlbmd0aCksXG5cdFx0ICAgIHNlY3JldEtleV9hZGRyZXNzID0gc2VjcmV0S2V5LmFkZHJlc3M7XG5cdFx0XG5cdFx0YWRkcmVzc19wb29sLnB1c2goc2VjcmV0S2V5X2FkZHJlc3MpO1xuXHRcdFxuXHRcdGlmICgobGlic29kaXVtLl9jcnlwdG9fYm94X2tleXBhaXIocHVibGljS2V5X2FkZHJlc3MsIHNlY3JldEtleV9hZGRyZXNzKSB8IDApID09PSAwKSB7XG5cdFx0XHR2YXIgcmV0ID0gX2Zvcm1hdF9vdXRwdXQoe3B1YmxpY0tleTogcHVibGljS2V5LCBwcml2YXRlS2V5OiBzZWNyZXRLZXksIGtleVR5cGU6IFwiY3VydmUyNTUxOVwifSwgb3V0cHV0Rm9ybWF0KTtcblx0XHRcdF9mcmVlX2FsbChhZGRyZXNzX3Bvb2wpO1xuXHRcdFx0cmV0dXJuIHJldDtcblx0XHR9XG5cdFx0X2ZyZWVfYW5kX3Rocm93X2Vycm9yKGFkZHJlc3NfcG9vbCk7XG5cdFx0XG5cdH1cblxuXHRmdW5jdGlvbiBjcnlwdG9fYm94X29wZW5fZGV0YWNoZWQoY2lwaGVydGV4dCwgbWFjLCBub25jZSwgcHVibGljS2V5LCBzZWNyZXRLZXksIG91dHB1dEZvcm1hdCkge1xuXHRcdHZhciBhZGRyZXNzX3Bvb2wgPSBbXTtcblx0XHRfY2hlY2tfb3V0cHV0X2Zvcm1hdChvdXRwdXRGb3JtYXQpO1xuXG5cdFx0Ly8gLS0tLS0tLS0tLSBpbnB1dDogY2lwaGVydGV4dCAodW5zaXplZF9idWYpXG5cdFx0XG5cdFx0Y2lwaGVydGV4dCA9IF9hbnlfdG9fVWludDhBcnJheShhZGRyZXNzX3Bvb2wsIGNpcGhlcnRleHQsIFwiY2lwaGVydGV4dFwiKTtcblx0XHR2YXIgY2lwaGVydGV4dF9hZGRyZXNzID0gX3RvX2FsbG9jYXRlZF9idWZfYWRkcmVzcyhjaXBoZXJ0ZXh0KSxcblx0XHQgICAgY2lwaGVydGV4dF9sZW5ndGggPSBjaXBoZXJ0ZXh0Lmxlbmd0aDtcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChjaXBoZXJ0ZXh0X2FkZHJlc3MpO1xuXHRcdFxuXHRcdC8vIC0tLS0tLS0tLS0gaW5wdXQ6IG1hYyAoYnVmKVxuXHRcdFxuXHRcdG1hYyA9IF9hbnlfdG9fVWludDhBcnJheShhZGRyZXNzX3Bvb2wsIG1hYywgXCJtYWNcIik7XG5cdFx0dmFyIG1hY19hZGRyZXNzLCBtYWNfbGVuZ3RoID0gKGxpYnNvZGl1bS5fY3J5cHRvX2JveF9tYWNieXRlcygpKSB8IDA7XG5cdFx0aWYgKG1hYy5sZW5ndGggIT09IG1hY19sZW5ndGgpIHtcblx0XHRcdF9mcmVlX2FuZF90aHJvd190eXBlX2Vycm9yKGFkZHJlc3NfcG9vbCwgXCJpbnZhbGlkIG1hYyBsZW5ndGhcIik7XG5cdFx0fVxuXHRcdG1hY19hZGRyZXNzID0gX3RvX2FsbG9jYXRlZF9idWZfYWRkcmVzcyhtYWMpO1xuXHRcdGFkZHJlc3NfcG9vbC5wdXNoKG1hY19hZGRyZXNzKTtcblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBub25jZSAoYnVmKVxuXHRcdFxuXHRcdG5vbmNlID0gX2FueV90b19VaW50OEFycmF5KGFkZHJlc3NfcG9vbCwgbm9uY2UsIFwibm9uY2VcIik7XG5cdFx0dmFyIG5vbmNlX2FkZHJlc3MsIG5vbmNlX2xlbmd0aCA9IChsaWJzb2RpdW0uX2NyeXB0b19ib3hfbm9uY2VieXRlcygpKSB8IDA7XG5cdFx0aWYgKG5vbmNlLmxlbmd0aCAhPT0gbm9uY2VfbGVuZ3RoKSB7XG5cdFx0XHRfZnJlZV9hbmRfdGhyb3dfdHlwZV9lcnJvcihhZGRyZXNzX3Bvb2wsIFwiaW52YWxpZCBub25jZSBsZW5ndGhcIik7XG5cdFx0fVxuXHRcdG5vbmNlX2FkZHJlc3MgPSBfdG9fYWxsb2NhdGVkX2J1Zl9hZGRyZXNzKG5vbmNlKTtcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChub25jZV9hZGRyZXNzKTtcblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBwdWJsaWNLZXkgKGJ1Zilcblx0XHRcblx0XHRwdWJsaWNLZXkgPSBfYW55X3RvX1VpbnQ4QXJyYXkoYWRkcmVzc19wb29sLCBwdWJsaWNLZXksIFwicHVibGljS2V5XCIpO1xuXHRcdHZhciBwdWJsaWNLZXlfYWRkcmVzcywgcHVibGljS2V5X2xlbmd0aCA9IChsaWJzb2RpdW0uX2NyeXB0b19ib3hfcHVibGlja2V5Ynl0ZXMoKSkgfCAwO1xuXHRcdGlmIChwdWJsaWNLZXkubGVuZ3RoICE9PSBwdWJsaWNLZXlfbGVuZ3RoKSB7XG5cdFx0XHRfZnJlZV9hbmRfdGhyb3dfdHlwZV9lcnJvcihhZGRyZXNzX3Bvb2wsIFwiaW52YWxpZCBwdWJsaWNLZXkgbGVuZ3RoXCIpO1xuXHRcdH1cblx0XHRwdWJsaWNLZXlfYWRkcmVzcyA9IF90b19hbGxvY2F0ZWRfYnVmX2FkZHJlc3MocHVibGljS2V5KTtcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChwdWJsaWNLZXlfYWRkcmVzcyk7XG5cdFx0XG5cdFx0Ly8gLS0tLS0tLS0tLSBpbnB1dDogc2VjcmV0S2V5IChidWYpXG5cdFx0XG5cdFx0c2VjcmV0S2V5ID0gX2FueV90b19VaW50OEFycmF5KGFkZHJlc3NfcG9vbCwgc2VjcmV0S2V5LCBcInNlY3JldEtleVwiKTtcblx0XHR2YXIgc2VjcmV0S2V5X2FkZHJlc3MsIHNlY3JldEtleV9sZW5ndGggPSAobGlic29kaXVtLl9jcnlwdG9fYm94X3NlY3JldGtleWJ5dGVzKCkpIHwgMDtcblx0XHRpZiAoc2VjcmV0S2V5Lmxlbmd0aCAhPT0gc2VjcmV0S2V5X2xlbmd0aCkge1xuXHRcdFx0X2ZyZWVfYW5kX3Rocm93X3R5cGVfZXJyb3IoYWRkcmVzc19wb29sLCBcImludmFsaWQgc2VjcmV0S2V5IGxlbmd0aFwiKTtcblx0XHR9XG5cdFx0c2VjcmV0S2V5X2FkZHJlc3MgPSBfdG9fYWxsb2NhdGVkX2J1Zl9hZGRyZXNzKHNlY3JldEtleSk7XG5cdFx0YWRkcmVzc19wb29sLnB1c2goc2VjcmV0S2V5X2FkZHJlc3MpO1xuXHRcdFxuXHRcdC8vIC0tLS0tLS0tLS0gb3V0cHV0IHBsYWludGV4dCAoYnVmKVxuXHRcdFxuXHRcdHZhciBwbGFpbnRleHRfbGVuZ3RoID0gKGNpcGhlcnRleHRfbGVuZ3RoKSB8IDAsXG5cdFx0ICAgIHBsYWludGV4dCA9IG5ldyBBbGxvY2F0ZWRCdWYocGxhaW50ZXh0X2xlbmd0aCksXG5cdFx0ICAgIHBsYWludGV4dF9hZGRyZXNzID0gcGxhaW50ZXh0LmFkZHJlc3M7XG5cdFx0XG5cdFx0YWRkcmVzc19wb29sLnB1c2gocGxhaW50ZXh0X2FkZHJlc3MpO1xuXHRcdFxuXHRcdGlmICgobGlic29kaXVtLl9jcnlwdG9fYm94X29wZW5fZGV0YWNoZWQocGxhaW50ZXh0X2FkZHJlc3MsIGNpcGhlcnRleHRfYWRkcmVzcywgbWFjX2FkZHJlc3MsIGNpcGhlcnRleHRfbGVuZ3RoLCAwLCBub25jZV9hZGRyZXNzLCBwdWJsaWNLZXlfYWRkcmVzcywgc2VjcmV0S2V5X2FkZHJlc3MpIHwgMCkgPT09IDApIHtcblx0XHRcdHZhciByZXQgPSBfZm9ybWF0X291dHB1dChwbGFpbnRleHQsIG91dHB1dEZvcm1hdCk7XG5cdFx0XHRfZnJlZV9hbGwoYWRkcmVzc19wb29sKTtcblx0XHRcdHJldHVybiByZXQ7XG5cdFx0fVxuXHRcdF9mcmVlX2FuZF90aHJvd19lcnJvcihhZGRyZXNzX3Bvb2wpO1xuXHRcdFxuXHR9XG5cblx0ZnVuY3Rpb24gY3J5cHRvX2JveF9vcGVuX2Vhc3koY2lwaGVydGV4dCwgbm9uY2UsIHB1YmxpY0tleSwgc2VjcmV0S2V5LCBvdXRwdXRGb3JtYXQpIHtcblx0XHR2YXIgYWRkcmVzc19wb29sID0gW107XG5cdFx0X2NoZWNrX291dHB1dF9mb3JtYXQob3V0cHV0Rm9ybWF0KTtcblxuXHRcdC8vIC0tLS0tLS0tLS0gaW5wdXQ6IGNpcGhlcnRleHQgKHVuc2l6ZWRfYnVmKVxuXHRcdFxuXHRcdGNpcGhlcnRleHQgPSBfYW55X3RvX1VpbnQ4QXJyYXkoYWRkcmVzc19wb29sLCBjaXBoZXJ0ZXh0LCBcImNpcGhlcnRleHRcIik7XG5cdFx0dmFyIGNpcGhlcnRleHRfYWRkcmVzcyA9IF90b19hbGxvY2F0ZWRfYnVmX2FkZHJlc3MoY2lwaGVydGV4dCksXG5cdFx0ICAgIGNpcGhlcnRleHRfbGVuZ3RoID0gY2lwaGVydGV4dC5sZW5ndGg7XG5cdFx0YWRkcmVzc19wb29sLnB1c2goY2lwaGVydGV4dF9hZGRyZXNzKTtcblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBub25jZSAoYnVmKVxuXHRcdFxuXHRcdG5vbmNlID0gX2FueV90b19VaW50OEFycmF5KGFkZHJlc3NfcG9vbCwgbm9uY2UsIFwibm9uY2VcIik7XG5cdFx0dmFyIG5vbmNlX2FkZHJlc3MsIG5vbmNlX2xlbmd0aCA9IChsaWJzb2RpdW0uX2NyeXB0b19ib3hfbm9uY2VieXRlcygpKSB8IDA7XG5cdFx0aWYgKG5vbmNlLmxlbmd0aCAhPT0gbm9uY2VfbGVuZ3RoKSB7XG5cdFx0XHRfZnJlZV9hbmRfdGhyb3dfdHlwZV9lcnJvcihhZGRyZXNzX3Bvb2wsIFwiaW52YWxpZCBub25jZSBsZW5ndGhcIik7XG5cdFx0fVxuXHRcdG5vbmNlX2FkZHJlc3MgPSBfdG9fYWxsb2NhdGVkX2J1Zl9hZGRyZXNzKG5vbmNlKTtcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChub25jZV9hZGRyZXNzKTtcblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBwdWJsaWNLZXkgKGJ1Zilcblx0XHRcblx0XHRwdWJsaWNLZXkgPSBfYW55X3RvX1VpbnQ4QXJyYXkoYWRkcmVzc19wb29sLCBwdWJsaWNLZXksIFwicHVibGljS2V5XCIpO1xuXHRcdHZhciBwdWJsaWNLZXlfYWRkcmVzcywgcHVibGljS2V5X2xlbmd0aCA9IChsaWJzb2RpdW0uX2NyeXB0b19ib3hfcHVibGlja2V5Ynl0ZXMoKSkgfCAwO1xuXHRcdGlmIChwdWJsaWNLZXkubGVuZ3RoICE9PSBwdWJsaWNLZXlfbGVuZ3RoKSB7XG5cdFx0XHRfZnJlZV9hbmRfdGhyb3dfdHlwZV9lcnJvcihhZGRyZXNzX3Bvb2wsIFwiaW52YWxpZCBwdWJsaWNLZXkgbGVuZ3RoXCIpO1xuXHRcdH1cblx0XHRwdWJsaWNLZXlfYWRkcmVzcyA9IF90b19hbGxvY2F0ZWRfYnVmX2FkZHJlc3MocHVibGljS2V5KTtcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChwdWJsaWNLZXlfYWRkcmVzcyk7XG5cdFx0XG5cdFx0Ly8gLS0tLS0tLS0tLSBpbnB1dDogc2VjcmV0S2V5IChidWYpXG5cdFx0XG5cdFx0c2VjcmV0S2V5ID0gX2FueV90b19VaW50OEFycmF5KGFkZHJlc3NfcG9vbCwgc2VjcmV0S2V5LCBcInNlY3JldEtleVwiKTtcblx0XHR2YXIgc2VjcmV0S2V5X2FkZHJlc3MsIHNlY3JldEtleV9sZW5ndGggPSAobGlic29kaXVtLl9jcnlwdG9fYm94X3NlY3JldGtleWJ5dGVzKCkpIHwgMDtcblx0XHRpZiAoc2VjcmV0S2V5Lmxlbmd0aCAhPT0gc2VjcmV0S2V5X2xlbmd0aCkge1xuXHRcdFx0X2ZyZWVfYW5kX3Rocm93X3R5cGVfZXJyb3IoYWRkcmVzc19wb29sLCBcImludmFsaWQgc2VjcmV0S2V5IGxlbmd0aFwiKTtcblx0XHR9XG5cdFx0c2VjcmV0S2V5X2FkZHJlc3MgPSBfdG9fYWxsb2NhdGVkX2J1Zl9hZGRyZXNzKHNlY3JldEtleSk7XG5cdFx0YWRkcmVzc19wb29sLnB1c2goc2VjcmV0S2V5X2FkZHJlc3MpO1xuXHRcdFxuXHRcdC8vIC0tLS0tLS0tLS0gb3V0cHV0IHBsYWludGV4dCAoYnVmKVxuXHRcdFxuXHRcdHZhciBwbGFpbnRleHRfbGVuZ3RoID0gKGNpcGhlcnRleHRfbGVuZ3RoIC0gbGlic29kaXVtLl9jcnlwdG9fYm94X21hY2J5dGVzKCkpIHwgMCxcblx0XHQgICAgcGxhaW50ZXh0ID0gbmV3IEFsbG9jYXRlZEJ1ZihwbGFpbnRleHRfbGVuZ3RoKSxcblx0XHQgICAgcGxhaW50ZXh0X2FkZHJlc3MgPSBwbGFpbnRleHQuYWRkcmVzcztcblx0XHRcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChwbGFpbnRleHRfYWRkcmVzcyk7XG5cdFx0XG5cdFx0aWYgKChsaWJzb2RpdW0uX2NyeXB0b19ib3hfb3Blbl9lYXN5KHBsYWludGV4dF9hZGRyZXNzLCBjaXBoZXJ0ZXh0X2FkZHJlc3MsIGNpcGhlcnRleHRfbGVuZ3RoLCAwLCBub25jZV9hZGRyZXNzLCBwdWJsaWNLZXlfYWRkcmVzcywgc2VjcmV0S2V5X2FkZHJlc3MpIHwgMCkgPT09IDApIHtcblx0XHRcdHZhciByZXQgPSBfZm9ybWF0X291dHB1dChwbGFpbnRleHQsIG91dHB1dEZvcm1hdCk7XG5cdFx0XHRfZnJlZV9hbGwoYWRkcmVzc19wb29sKTtcblx0XHRcdHJldHVybiByZXQ7XG5cdFx0fVxuXHRcdF9mcmVlX2FuZF90aHJvd19lcnJvcihhZGRyZXNzX3Bvb2wpO1xuXHRcdFxuXHR9XG5cblx0ZnVuY3Rpb24gY3J5cHRvX2JveF9vcGVuX2Vhc3lfYWZ0ZXJubShjaXBoZXJ0ZXh0LCBub25jZSwgc2hhcmVkS2V5LCBvdXRwdXRGb3JtYXQpIHtcblx0XHR2YXIgYWRkcmVzc19wb29sID0gW107XG5cdFx0X2NoZWNrX291dHB1dF9mb3JtYXQob3V0cHV0Rm9ybWF0KTtcblxuXHRcdC8vIC0tLS0tLS0tLS0gaW5wdXQ6IGNpcGhlcnRleHQgKHVuc2l6ZWRfYnVmKVxuXHRcdFxuXHRcdGNpcGhlcnRleHQgPSBfYW55X3RvX1VpbnQ4QXJyYXkoYWRkcmVzc19wb29sLCBjaXBoZXJ0ZXh0LCBcImNpcGhlcnRleHRcIik7XG5cdFx0dmFyIGNpcGhlcnRleHRfYWRkcmVzcyA9IF90b19hbGxvY2F0ZWRfYnVmX2FkZHJlc3MoY2lwaGVydGV4dCksXG5cdFx0ICAgIGNpcGhlcnRleHRfbGVuZ3RoID0gY2lwaGVydGV4dC5sZW5ndGg7XG5cdFx0YWRkcmVzc19wb29sLnB1c2goY2lwaGVydGV4dF9hZGRyZXNzKTtcblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBub25jZSAoYnVmKVxuXHRcdFxuXHRcdG5vbmNlID0gX2FueV90b19VaW50OEFycmF5KGFkZHJlc3NfcG9vbCwgbm9uY2UsIFwibm9uY2VcIik7XG5cdFx0dmFyIG5vbmNlX2FkZHJlc3MsIG5vbmNlX2xlbmd0aCA9IChsaWJzb2RpdW0uX2NyeXB0b19ib3hfbm9uY2VieXRlcygpKSB8IDA7XG5cdFx0aWYgKG5vbmNlLmxlbmd0aCAhPT0gbm9uY2VfbGVuZ3RoKSB7XG5cdFx0XHRfZnJlZV9hbmRfdGhyb3dfdHlwZV9lcnJvcihhZGRyZXNzX3Bvb2wsIFwiaW52YWxpZCBub25jZSBsZW5ndGhcIik7XG5cdFx0fVxuXHRcdG5vbmNlX2FkZHJlc3MgPSBfdG9fYWxsb2NhdGVkX2J1Zl9hZGRyZXNzKG5vbmNlKTtcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChub25jZV9hZGRyZXNzKTtcblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBzaGFyZWRLZXkgKGJ1Zilcblx0XHRcblx0XHRzaGFyZWRLZXkgPSBfYW55X3RvX1VpbnQ4QXJyYXkoYWRkcmVzc19wb29sLCBzaGFyZWRLZXksIFwic2hhcmVkS2V5XCIpO1xuXHRcdHZhciBzaGFyZWRLZXlfYWRkcmVzcywgc2hhcmVkS2V5X2xlbmd0aCA9IChsaWJzb2RpdW0uX2NyeXB0b19ib3hfYmVmb3Jlbm1ieXRlcygpKSB8IDA7XG5cdFx0aWYgKHNoYXJlZEtleS5sZW5ndGggIT09IHNoYXJlZEtleV9sZW5ndGgpIHtcblx0XHRcdF9mcmVlX2FuZF90aHJvd190eXBlX2Vycm9yKGFkZHJlc3NfcG9vbCwgXCJpbnZhbGlkIHNoYXJlZEtleSBsZW5ndGhcIik7XG5cdFx0fVxuXHRcdHNoYXJlZEtleV9hZGRyZXNzID0gX3RvX2FsbG9jYXRlZF9idWZfYWRkcmVzcyhzaGFyZWRLZXkpO1xuXHRcdGFkZHJlc3NfcG9vbC5wdXNoKHNoYXJlZEtleV9hZGRyZXNzKTtcblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIG91dHB1dCBwbGFpbnRleHQgKGJ1Zilcblx0XHRcblx0XHR2YXIgcGxhaW50ZXh0X2xlbmd0aCA9IChjaXBoZXJ0ZXh0X2xlbmd0aCAtIGxpYnNvZGl1bS5fY3J5cHRvX2JveF9tYWNieXRlcygpKSB8IDAsXG5cdFx0ICAgIHBsYWludGV4dCA9IG5ldyBBbGxvY2F0ZWRCdWYocGxhaW50ZXh0X2xlbmd0aCksXG5cdFx0ICAgIHBsYWludGV4dF9hZGRyZXNzID0gcGxhaW50ZXh0LmFkZHJlc3M7XG5cdFx0XG5cdFx0YWRkcmVzc19wb29sLnB1c2gocGxhaW50ZXh0X2FkZHJlc3MpO1xuXHRcdFxuXHRcdGlmICgobGlic29kaXVtLl9jcnlwdG9fYm94X29wZW5fZWFzeV9hZnRlcm5tKHBsYWludGV4dF9hZGRyZXNzLCBjaXBoZXJ0ZXh0X2FkZHJlc3MsIGNpcGhlcnRleHRfbGVuZ3RoLCAwLCBub25jZV9hZGRyZXNzLCBzaGFyZWRLZXlfYWRkcmVzcykgfCAwKSA9PT0gMCkge1xuXHRcdFx0dmFyIHJldCA9IF9mb3JtYXRfb3V0cHV0KHBsYWludGV4dCwgb3V0cHV0Rm9ybWF0KTtcblx0XHRcdF9mcmVlX2FsbChhZGRyZXNzX3Bvb2wpO1xuXHRcdFx0cmV0dXJuIHJldDtcblx0XHR9XG5cdFx0X2ZyZWVfYW5kX3Rocm93X2Vycm9yKGFkZHJlc3NfcG9vbCk7XG5cdFx0XG5cdH1cblxuXHRmdW5jdGlvbiBjcnlwdG9fYm94X3NlYWwobWVzc2FnZSwgcHVibGljS2V5LCBvdXRwdXRGb3JtYXQpIHtcblx0XHR2YXIgYWRkcmVzc19wb29sID0gW107XG5cdFx0X2NoZWNrX291dHB1dF9mb3JtYXQob3V0cHV0Rm9ybWF0KTtcblxuXHRcdC8vIC0tLS0tLS0tLS0gaW5wdXQ6IG1lc3NhZ2UgKHVuc2l6ZWRfYnVmKVxuXHRcdFxuXHRcdG1lc3NhZ2UgPSBfYW55X3RvX1VpbnQ4QXJyYXkoYWRkcmVzc19wb29sLCBtZXNzYWdlLCBcIm1lc3NhZ2VcIik7XG5cdFx0dmFyIG1lc3NhZ2VfYWRkcmVzcyA9IF90b19hbGxvY2F0ZWRfYnVmX2FkZHJlc3MobWVzc2FnZSksXG5cdFx0ICAgIG1lc3NhZ2VfbGVuZ3RoID0gbWVzc2FnZS5sZW5ndGg7XG5cdFx0YWRkcmVzc19wb29sLnB1c2gobWVzc2FnZV9hZGRyZXNzKTtcblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBwdWJsaWNLZXkgKGJ1Zilcblx0XHRcblx0XHRwdWJsaWNLZXkgPSBfYW55X3RvX1VpbnQ4QXJyYXkoYWRkcmVzc19wb29sLCBwdWJsaWNLZXksIFwicHVibGljS2V5XCIpO1xuXHRcdHZhciBwdWJsaWNLZXlfYWRkcmVzcywgcHVibGljS2V5X2xlbmd0aCA9IChsaWJzb2RpdW0uX2NyeXB0b19ib3hfcHVibGlja2V5Ynl0ZXMoKSkgfCAwO1xuXHRcdGlmIChwdWJsaWNLZXkubGVuZ3RoICE9PSBwdWJsaWNLZXlfbGVuZ3RoKSB7XG5cdFx0XHRfZnJlZV9hbmRfdGhyb3dfdHlwZV9lcnJvcihhZGRyZXNzX3Bvb2wsIFwiaW52YWxpZCBwdWJsaWNLZXkgbGVuZ3RoXCIpO1xuXHRcdH1cblx0XHRwdWJsaWNLZXlfYWRkcmVzcyA9IF90b19hbGxvY2F0ZWRfYnVmX2FkZHJlc3MocHVibGljS2V5KTtcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChwdWJsaWNLZXlfYWRkcmVzcyk7XG5cdFx0XG5cdFx0Ly8gLS0tLS0tLS0tLSBvdXRwdXQgY2lwaGVydGV4dCAoYnVmKVxuXHRcdFxuXHRcdHZhciBjaXBoZXJ0ZXh0X2xlbmd0aCA9IChtZXNzYWdlX2xlbmd0aCArIGxpYnNvZGl1bS5fY3J5cHRvX2JveF9zZWFsYnl0ZXMoKSkgfCAwLFxuXHRcdCAgICBjaXBoZXJ0ZXh0ID0gbmV3IEFsbG9jYXRlZEJ1ZihjaXBoZXJ0ZXh0X2xlbmd0aCksXG5cdFx0ICAgIGNpcGhlcnRleHRfYWRkcmVzcyA9IGNpcGhlcnRleHQuYWRkcmVzcztcblx0XHRcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChjaXBoZXJ0ZXh0X2FkZHJlc3MpO1xuXHRcdFxuXHRcdGlmICgobGlic29kaXVtLl9jcnlwdG9fYm94X3NlYWwoY2lwaGVydGV4dF9hZGRyZXNzLCBtZXNzYWdlX2FkZHJlc3MsIG1lc3NhZ2VfbGVuZ3RoLCAwLCBwdWJsaWNLZXlfYWRkcmVzcykgfCAwKSA9PT0gMCkge1xuXHRcdFx0dmFyIHJldCA9IF9mb3JtYXRfb3V0cHV0KGNpcGhlcnRleHQsIG91dHB1dEZvcm1hdCk7XG5cdFx0XHRfZnJlZV9hbGwoYWRkcmVzc19wb29sKTtcblx0XHRcdHJldHVybiByZXQ7XG5cdFx0fVxuXHRcdF9mcmVlX2FuZF90aHJvd19lcnJvcihhZGRyZXNzX3Bvb2wpO1xuXHRcdFxuXHR9XG5cblx0ZnVuY3Rpb24gY3J5cHRvX2JveF9zZWFsX29wZW4oY2lwaGVydGV4dCwgcHVibGljS2V5LCBzZWNyZXRLZXksIG91dHB1dEZvcm1hdCkge1xuXHRcdHZhciBhZGRyZXNzX3Bvb2wgPSBbXTtcblx0XHRfY2hlY2tfb3V0cHV0X2Zvcm1hdChvdXRwdXRGb3JtYXQpO1xuXG5cdFx0Ly8gLS0tLS0tLS0tLSBpbnB1dDogY2lwaGVydGV4dCAodW5zaXplZF9idWYpXG5cdFx0XG5cdFx0Y2lwaGVydGV4dCA9IF9hbnlfdG9fVWludDhBcnJheShhZGRyZXNzX3Bvb2wsIGNpcGhlcnRleHQsIFwiY2lwaGVydGV4dFwiKTtcblx0XHR2YXIgY2lwaGVydGV4dF9hZGRyZXNzID0gX3RvX2FsbG9jYXRlZF9idWZfYWRkcmVzcyhjaXBoZXJ0ZXh0KSxcblx0XHQgICAgY2lwaGVydGV4dF9sZW5ndGggPSBjaXBoZXJ0ZXh0Lmxlbmd0aDtcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChjaXBoZXJ0ZXh0X2FkZHJlc3MpO1xuXHRcdFxuXHRcdC8vIC0tLS0tLS0tLS0gaW5wdXQ6IHB1YmxpY0tleSAoYnVmKVxuXHRcdFxuXHRcdHB1YmxpY0tleSA9IF9hbnlfdG9fVWludDhBcnJheShhZGRyZXNzX3Bvb2wsIHB1YmxpY0tleSwgXCJwdWJsaWNLZXlcIik7XG5cdFx0dmFyIHB1YmxpY0tleV9hZGRyZXNzLCBwdWJsaWNLZXlfbGVuZ3RoID0gKGxpYnNvZGl1bS5fY3J5cHRvX2JveF9wdWJsaWNrZXlieXRlcygpKSB8IDA7XG5cdFx0aWYgKHB1YmxpY0tleS5sZW5ndGggIT09IHB1YmxpY0tleV9sZW5ndGgpIHtcblx0XHRcdF9mcmVlX2FuZF90aHJvd190eXBlX2Vycm9yKGFkZHJlc3NfcG9vbCwgXCJpbnZhbGlkIHB1YmxpY0tleSBsZW5ndGhcIik7XG5cdFx0fVxuXHRcdHB1YmxpY0tleV9hZGRyZXNzID0gX3RvX2FsbG9jYXRlZF9idWZfYWRkcmVzcyhwdWJsaWNLZXkpO1xuXHRcdGFkZHJlc3NfcG9vbC5wdXNoKHB1YmxpY0tleV9hZGRyZXNzKTtcblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBzZWNyZXRLZXkgKGJ1Zilcblx0XHRcblx0XHRzZWNyZXRLZXkgPSBfYW55X3RvX1VpbnQ4QXJyYXkoYWRkcmVzc19wb29sLCBzZWNyZXRLZXksIFwic2VjcmV0S2V5XCIpO1xuXHRcdHZhciBzZWNyZXRLZXlfYWRkcmVzcywgc2VjcmV0S2V5X2xlbmd0aCA9IChsaWJzb2RpdW0uX2NyeXB0b19ib3hfc2VjcmV0a2V5Ynl0ZXMoKSkgfCAwO1xuXHRcdGlmIChzZWNyZXRLZXkubGVuZ3RoICE9PSBzZWNyZXRLZXlfbGVuZ3RoKSB7XG5cdFx0XHRfZnJlZV9hbmRfdGhyb3dfdHlwZV9lcnJvcihhZGRyZXNzX3Bvb2wsIFwiaW52YWxpZCBzZWNyZXRLZXkgbGVuZ3RoXCIpO1xuXHRcdH1cblx0XHRzZWNyZXRLZXlfYWRkcmVzcyA9IF90b19hbGxvY2F0ZWRfYnVmX2FkZHJlc3Moc2VjcmV0S2V5KTtcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChzZWNyZXRLZXlfYWRkcmVzcyk7XG5cdFx0XG5cdFx0Ly8gLS0tLS0tLS0tLSBvdXRwdXQgcGxhaW50ZXh0IChidWYpXG5cdFx0XG5cdFx0dmFyIHBsYWludGV4dF9sZW5ndGggPSAoY2lwaGVydGV4dF9sZW5ndGggLSBsaWJzb2RpdW0uX2NyeXB0b19ib3hfc2VhbGJ5dGVzKCkpIHwgMCxcblx0XHQgICAgcGxhaW50ZXh0ID0gbmV3IEFsbG9jYXRlZEJ1ZihwbGFpbnRleHRfbGVuZ3RoKSxcblx0XHQgICAgcGxhaW50ZXh0X2FkZHJlc3MgPSBwbGFpbnRleHQuYWRkcmVzcztcblx0XHRcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChwbGFpbnRleHRfYWRkcmVzcyk7XG5cdFx0XG5cdFx0aWYgKChsaWJzb2RpdW0uX2NyeXB0b19ib3hfc2VhbF9vcGVuKHBsYWludGV4dF9hZGRyZXNzLCBjaXBoZXJ0ZXh0X2FkZHJlc3MsIGNpcGhlcnRleHRfbGVuZ3RoLCAwLCBwdWJsaWNLZXlfYWRkcmVzcywgc2VjcmV0S2V5X2FkZHJlc3MpIHwgMCkgPT09IDApIHtcblx0XHRcdHZhciByZXQgPSBfZm9ybWF0X291dHB1dChwbGFpbnRleHQsIG91dHB1dEZvcm1hdCk7XG5cdFx0XHRfZnJlZV9hbGwoYWRkcmVzc19wb29sKTtcblx0XHRcdHJldHVybiByZXQ7XG5cdFx0fVxuXHRcdF9mcmVlX2FuZF90aHJvd19lcnJvcihhZGRyZXNzX3Bvb2wpO1xuXHRcdFxuXHR9XG5cblx0ZnVuY3Rpb24gY3J5cHRvX2JveF9zZWVkX2tleXBhaXIoc2VlZCwgb3V0cHV0Rm9ybWF0KSB7XG5cdFx0dmFyIGFkZHJlc3NfcG9vbCA9IFtdO1xuXHRcdF9jaGVja19vdXRwdXRfZm9ybWF0KG91dHB1dEZvcm1hdCk7XG5cblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBzZWVkIChidWYpXG5cdFx0XG5cdFx0c2VlZCA9IF9hbnlfdG9fVWludDhBcnJheShhZGRyZXNzX3Bvb2wsIHNlZWQsIFwic2VlZFwiKTtcblx0XHR2YXIgc2VlZF9hZGRyZXNzLCBzZWVkX2xlbmd0aCA9IChsaWJzb2RpdW0uX2NyeXB0b19ib3hfc2VlZGJ5dGVzKCkpIHwgMDtcblx0XHRpZiAoc2VlZC5sZW5ndGggIT09IHNlZWRfbGVuZ3RoKSB7XG5cdFx0XHRfZnJlZV9hbmRfdGhyb3dfdHlwZV9lcnJvcihhZGRyZXNzX3Bvb2wsIFwiaW52YWxpZCBzZWVkIGxlbmd0aFwiKTtcblx0XHR9XG5cdFx0c2VlZF9hZGRyZXNzID0gX3RvX2FsbG9jYXRlZF9idWZfYWRkcmVzcyhzZWVkKTtcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChzZWVkX2FkZHJlc3MpO1xuXHRcdFxuXHRcdC8vIC0tLS0tLS0tLS0gb3V0cHV0IHB1YmxpY0tleSAoYnVmKVxuXHRcdFxuXHRcdHZhciBwdWJsaWNLZXlfbGVuZ3RoID0gKGxpYnNvZGl1bS5fY3J5cHRvX2JveF9wdWJsaWNrZXlieXRlcygpKSB8IDAsXG5cdFx0ICAgIHB1YmxpY0tleSA9IG5ldyBBbGxvY2F0ZWRCdWYocHVibGljS2V5X2xlbmd0aCksXG5cdFx0ICAgIHB1YmxpY0tleV9hZGRyZXNzID0gcHVibGljS2V5LmFkZHJlc3M7XG5cdFx0XG5cdFx0YWRkcmVzc19wb29sLnB1c2gocHVibGljS2V5X2FkZHJlc3MpO1xuXHRcdFxuXHRcdC8vIC0tLS0tLS0tLS0gb3V0cHV0IHByaXZhdGVLZXkgKGJ1Zilcblx0XHRcblx0XHR2YXIgcHJpdmF0ZUtleV9sZW5ndGggPSAobGlic29kaXVtLl9jcnlwdG9fYm94X3NlY3JldGtleWJ5dGVzKCkpIHwgMCxcblx0XHQgICAgcHJpdmF0ZUtleSA9IG5ldyBBbGxvY2F0ZWRCdWYocHJpdmF0ZUtleV9sZW5ndGgpLFxuXHRcdCAgICBwcml2YXRlS2V5X2FkZHJlc3MgPSBwcml2YXRlS2V5LmFkZHJlc3M7XG5cdFx0XG5cdFx0YWRkcmVzc19wb29sLnB1c2gocHJpdmF0ZUtleV9hZGRyZXNzKTtcblx0XHRcblx0XHRpZiAoKGxpYnNvZGl1bS5fY3J5cHRvX2JveF9zZWVkX2tleXBhaXIocHVibGljS2V5X2FkZHJlc3MsIHByaXZhdGVLZXlfYWRkcmVzcywgc2VlZF9hZGRyZXNzKSB8IDApID09PSAwKSB7XG5cdFx0XHR2YXIgcmV0ID0gX2Zvcm1hdF9vdXRwdXQoe3B1YmxpY0tleTogcHVibGljS2V5LCBwcml2YXRlS2V5OiBwcml2YXRlS2V5fSwgb3V0cHV0Rm9ybWF0KTtcblx0XHRcdF9mcmVlX2FsbChhZGRyZXNzX3Bvb2wpO1xuXHRcdFx0cmV0dXJuIHJldDtcblx0XHR9XG5cdFx0X2ZyZWVfYW5kX3Rocm93X2Vycm9yKGFkZHJlc3NfcG9vbCk7XG5cdFx0XG5cdH1cblxuXHRmdW5jdGlvbiBjcnlwdG9fZ2VuZXJpY2hhc2goaGFzaF9sZW5ndGgsIG1lc3NhZ2UsIGtleSwgb3V0cHV0Rm9ybWF0KSB7XG5cdFx0dmFyIGFkZHJlc3NfcG9vbCA9IFtdO1xuXHRcdF9jaGVja19vdXRwdXRfZm9ybWF0KG91dHB1dEZvcm1hdCk7XG5cblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBoYXNoX2xlbmd0aCAodWludClcblx0XHRcblx0XHRfcmVxdWlyZV9kZWZpbmVkKGFkZHJlc3NfcG9vbCwgaGFzaF9sZW5ndGgsIFwiaGFzaF9sZW5ndGhcIik7XG5cdFx0XG5cdFx0aWYgKCEodHlwZW9mIGhhc2hfbGVuZ3RoID09PSBcIm51bWJlclwiICYmIChoYXNoX2xlbmd0aCB8IDApID09PSBoYXNoX2xlbmd0aCkgJiYgKGhhc2hfbGVuZ3RoIHwgMCkgPiAwKSB7XG5cdFx0XHRfZnJlZV9hbmRfdGhyb3dfdHlwZV9lcnJvcihhZGRyZXNzX3Bvb2wsIFwiaGFzaF9sZW5ndGggbXVzdCBiZSBhbiB1bnNpZ25lZCBpbnRlZ2VyXCIpO1xuXHRcdH1cblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBtZXNzYWdlICh1bnNpemVkX2J1Zilcblx0XHRcblx0XHRtZXNzYWdlID0gX2FueV90b19VaW50OEFycmF5KGFkZHJlc3NfcG9vbCwgbWVzc2FnZSwgXCJtZXNzYWdlXCIpO1xuXHRcdHZhciBtZXNzYWdlX2FkZHJlc3MgPSBfdG9fYWxsb2NhdGVkX2J1Zl9hZGRyZXNzKG1lc3NhZ2UpLFxuXHRcdCAgICBtZXNzYWdlX2xlbmd0aCA9IG1lc3NhZ2UubGVuZ3RoO1xuXHRcdGFkZHJlc3NfcG9vbC5wdXNoKG1lc3NhZ2VfYWRkcmVzcyk7XG5cdFx0XG5cdFx0Ly8gLS0tLS0tLS0tLSBpbnB1dDoga2V5ICh1bnNpemVkX2J1Zl9vcHRpb25hbClcblx0XHRcblx0XHR2YXIga2V5X2FkZHJlc3MgPSBudWxsLCBrZXlfbGVuZ3RoID0gMDtcblx0XHRpZiAoa2V5ICE9IHVuZGVmaW5lZCkge1xuXHRcdFx0a2V5ID0gX2FueV90b19VaW50OEFycmF5KGFkZHJlc3NfcG9vbCwga2V5LCBcImtleVwiKTtcblx0XHRcdGtleV9hZGRyZXNzID0gX3RvX2FsbG9jYXRlZF9idWZfYWRkcmVzcyhrZXkpO1xuXHRcdFx0a2V5X2xlbmd0aCA9IGtleS5sZW5ndGg7XG5cdFx0XHRhZGRyZXNzX3Bvb2wucHVzaChrZXlfYWRkcmVzcyk7XG5cdFx0fVxuXHRcdFxuXHRcdC8vIC0tLS0tLS0tLS0gb3V0cHV0IGhhc2ggKGJ1Zilcblx0XHRcblx0XHR2YXIgaGFzaF9sZW5ndGggPSAoaGFzaF9sZW5ndGgpIHwgMCxcblx0XHQgICAgaGFzaCA9IG5ldyBBbGxvY2F0ZWRCdWYoaGFzaF9sZW5ndGgpLFxuXHRcdCAgICBoYXNoX2FkZHJlc3MgPSBoYXNoLmFkZHJlc3M7XG5cdFx0XG5cdFx0YWRkcmVzc19wb29sLnB1c2goaGFzaF9hZGRyZXNzKTtcblx0XHRcblx0XHRpZiAoKGxpYnNvZGl1bS5fY3J5cHRvX2dlbmVyaWNoYXNoKGhhc2hfYWRkcmVzcywgaGFzaF9sZW5ndGgsIG1lc3NhZ2VfYWRkcmVzcywgbWVzc2FnZV9sZW5ndGgsIDAsIGtleV9hZGRyZXNzLCBrZXlfbGVuZ3RoKSB8IDApID09PSAwKSB7XG5cdFx0XHR2YXIgcmV0ID0gX2Zvcm1hdF9vdXRwdXQoaGFzaCwgb3V0cHV0Rm9ybWF0KTtcblx0XHRcdF9mcmVlX2FsbChhZGRyZXNzX3Bvb2wpO1xuXHRcdFx0cmV0dXJuIHJldDtcblx0XHR9XG5cdFx0X2ZyZWVfYW5kX3Rocm93X2Vycm9yKGFkZHJlc3NfcG9vbCk7XG5cdFx0XG5cdH1cblxuXHRmdW5jdGlvbiBjcnlwdG9fZ2VuZXJpY2hhc2hfZmluYWwoc3RhdGVfYWRkcmVzcywgaGFzaF9sZW5ndGgsIG91dHB1dEZvcm1hdCkge1xuXHRcdHZhciBhZGRyZXNzX3Bvb2wgPSBbXTtcblx0XHRfY2hlY2tfb3V0cHV0X2Zvcm1hdChvdXRwdXRGb3JtYXQpO1xuXG5cdFx0Ly8gLS0tLS0tLS0tLSBpbnB1dDogc3RhdGVfYWRkcmVzcyAoZ2VuZXJpY2hhc2hfc3RhdGVfYWRkcmVzcylcblx0XHRcblx0XHRfcmVxdWlyZV9kZWZpbmVkKGFkZHJlc3NfcG9vbCwgc3RhdGVfYWRkcmVzcywgXCJzdGF0ZV9hZGRyZXNzXCIpO1xuXHRcdFxuXHRcdC8vIC0tLS0tLS0tLS0gaW5wdXQ6IGhhc2hfbGVuZ3RoICh1aW50KVxuXHRcdFxuXHRcdF9yZXF1aXJlX2RlZmluZWQoYWRkcmVzc19wb29sLCBoYXNoX2xlbmd0aCwgXCJoYXNoX2xlbmd0aFwiKTtcblx0XHRcblx0XHRpZiAoISh0eXBlb2YgaGFzaF9sZW5ndGggPT09IFwibnVtYmVyXCIgJiYgKGhhc2hfbGVuZ3RoIHwgMCkgPT09IGhhc2hfbGVuZ3RoKSAmJiAoaGFzaF9sZW5ndGggfCAwKSA+IDApIHtcblx0XHRcdF9mcmVlX2FuZF90aHJvd190eXBlX2Vycm9yKGFkZHJlc3NfcG9vbCwgXCJoYXNoX2xlbmd0aCBtdXN0IGJlIGFuIHVuc2lnbmVkIGludGVnZXJcIik7XG5cdFx0fVxuXHRcdFxuXHRcdC8vIC0tLS0tLS0tLS0gb3V0cHV0IGhhc2ggKGJ1Zilcblx0XHRcblx0XHR2YXIgaGFzaF9sZW5ndGggPSAoaGFzaF9sZW5ndGgpIHwgMCxcblx0XHQgICAgaGFzaCA9IG5ldyBBbGxvY2F0ZWRCdWYoaGFzaF9sZW5ndGgpLFxuXHRcdCAgICBoYXNoX2FkZHJlc3MgPSBoYXNoLmFkZHJlc3M7XG5cdFx0XG5cdFx0YWRkcmVzc19wb29sLnB1c2goaGFzaF9hZGRyZXNzKTtcblx0XHRcblx0XHRpZiAoKGxpYnNvZGl1bS5fY3J5cHRvX2dlbmVyaWNoYXNoX2ZpbmFsKHN0YXRlX2FkZHJlc3MsIGhhc2hfYWRkcmVzcywgaGFzaF9sZW5ndGgpIHwgMCkgPT09IDApIHtcblx0XHRcdHZhciByZXQgPSAobGlic29kaXVtLl9mcmVlKHN0YXRlX2FkZHJlc3MpLCBfZm9ybWF0X291dHB1dChoYXNoLCBvdXRwdXRGb3JtYXQpKTtcblx0XHRcdF9mcmVlX2FsbChhZGRyZXNzX3Bvb2wpO1xuXHRcdFx0cmV0dXJuIHJldDtcblx0XHR9XG5cdFx0X2ZyZWVfYW5kX3Rocm93X2Vycm9yKGFkZHJlc3NfcG9vbCk7XG5cdFx0XG5cdH1cblxuXHRmdW5jdGlvbiBjcnlwdG9fZ2VuZXJpY2hhc2hfaW5pdChrZXksIGhhc2hfbGVuZ3RoLCBvdXRwdXRGb3JtYXQpIHtcblx0XHR2YXIgYWRkcmVzc19wb29sID0gW107XG5cdFx0X2NoZWNrX291dHB1dF9mb3JtYXQob3V0cHV0Rm9ybWF0KTtcblxuXHRcdC8vIC0tLS0tLS0tLS0gaW5wdXQ6IGtleSAodW5zaXplZF9idWZfb3B0aW9uYWwpXG5cdFx0XG5cdFx0dmFyIGtleV9hZGRyZXNzID0gbnVsbCwga2V5X2xlbmd0aCA9IDA7XG5cdFx0aWYgKGtleSAhPSB1bmRlZmluZWQpIHtcblx0XHRcdGtleSA9IF9hbnlfdG9fVWludDhBcnJheShhZGRyZXNzX3Bvb2wsIGtleSwgXCJrZXlcIik7XG5cdFx0XHRrZXlfYWRkcmVzcyA9IF90b19hbGxvY2F0ZWRfYnVmX2FkZHJlc3Moa2V5KTtcblx0XHRcdGtleV9sZW5ndGggPSBrZXkubGVuZ3RoO1xuXHRcdFx0YWRkcmVzc19wb29sLnB1c2goa2V5X2FkZHJlc3MpO1xuXHRcdH1cblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBoYXNoX2xlbmd0aCAodWludClcblx0XHRcblx0XHRfcmVxdWlyZV9kZWZpbmVkKGFkZHJlc3NfcG9vbCwgaGFzaF9sZW5ndGgsIFwiaGFzaF9sZW5ndGhcIik7XG5cdFx0XG5cdFx0aWYgKCEodHlwZW9mIGhhc2hfbGVuZ3RoID09PSBcIm51bWJlclwiICYmIChoYXNoX2xlbmd0aCB8IDApID09PSBoYXNoX2xlbmd0aCkgJiYgKGhhc2hfbGVuZ3RoIHwgMCkgPiAwKSB7XG5cdFx0XHRfZnJlZV9hbmRfdGhyb3dfdHlwZV9lcnJvcihhZGRyZXNzX3Bvb2wsIFwiaGFzaF9sZW5ndGggbXVzdCBiZSBhbiB1bnNpZ25lZCBpbnRlZ2VyXCIpO1xuXHRcdH1cblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIG91dHB1dCBzdGF0ZSAoZ2VuZXJpY2hhc2hfc3RhdGUpXG5cdFx0XG5cdFx0dmFyIHN0YXRlX2FkZHJlc3MgPSBuZXcgQWxsb2NhdGVkQnVmKDM1NykuYWRkcmVzcztcblx0XHRcblx0XHRpZiAoKGxpYnNvZGl1bS5fY3J5cHRvX2dlbmVyaWNoYXNoX2luaXQoc3RhdGVfYWRkcmVzcywga2V5X2FkZHJlc3MsIGtleV9sZW5ndGgsIGhhc2hfbGVuZ3RoKSB8IDApID09PSAwKSB7XG5cdFx0XHR2YXIgcmV0ID0gc3RhdGVfYWRkcmVzcztcblx0XHRcdF9mcmVlX2FsbChhZGRyZXNzX3Bvb2wpO1xuXHRcdFx0cmV0dXJuIHJldDtcblx0XHR9XG5cdFx0X2ZyZWVfYW5kX3Rocm93X2Vycm9yKGFkZHJlc3NfcG9vbCk7XG5cdFx0XG5cdH1cblxuXHRmdW5jdGlvbiBjcnlwdG9fZ2VuZXJpY2hhc2hfdXBkYXRlKHN0YXRlX2FkZHJlc3MsIG1lc3NhZ2VfY2h1bmssIG91dHB1dEZvcm1hdCkge1xuXHRcdHZhciBhZGRyZXNzX3Bvb2wgPSBbXTtcblx0XHRfY2hlY2tfb3V0cHV0X2Zvcm1hdChvdXRwdXRGb3JtYXQpO1xuXG5cdFx0Ly8gLS0tLS0tLS0tLSBpbnB1dDogc3RhdGVfYWRkcmVzcyAoZ2VuZXJpY2hhc2hfc3RhdGVfYWRkcmVzcylcblx0XHRcblx0XHRfcmVxdWlyZV9kZWZpbmVkKGFkZHJlc3NfcG9vbCwgc3RhdGVfYWRkcmVzcywgXCJzdGF0ZV9hZGRyZXNzXCIpO1xuXHRcdFxuXHRcdC8vIC0tLS0tLS0tLS0gaW5wdXQ6IG1lc3NhZ2VfY2h1bmsgKHVuc2l6ZWRfYnVmKVxuXHRcdFxuXHRcdG1lc3NhZ2VfY2h1bmsgPSBfYW55X3RvX1VpbnQ4QXJyYXkoYWRkcmVzc19wb29sLCBtZXNzYWdlX2NodW5rLCBcIm1lc3NhZ2VfY2h1bmtcIik7XG5cdFx0dmFyIG1lc3NhZ2VfY2h1bmtfYWRkcmVzcyA9IF90b19hbGxvY2F0ZWRfYnVmX2FkZHJlc3MobWVzc2FnZV9jaHVuayksXG5cdFx0ICAgIG1lc3NhZ2VfY2h1bmtfbGVuZ3RoID0gbWVzc2FnZV9jaHVuay5sZW5ndGg7XG5cdFx0YWRkcmVzc19wb29sLnB1c2gobWVzc2FnZV9jaHVua19hZGRyZXNzKTtcblx0XHRcblx0XHRpZiAoKGxpYnNvZGl1bS5fY3J5cHRvX2dlbmVyaWNoYXNoX3VwZGF0ZShzdGF0ZV9hZGRyZXNzLCBtZXNzYWdlX2NodW5rX2FkZHJlc3MsIG1lc3NhZ2VfY2h1bmtfbGVuZ3RoKSB8IDApID09PSAwKSB7XG5cdFx0XHRfZnJlZV9hbGwoYWRkcmVzc19wb29sKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0X2ZyZWVfYW5kX3Rocm93X2Vycm9yKGFkZHJlc3NfcG9vbCk7XG5cdFx0XG5cdH1cblxuXHRmdW5jdGlvbiBjcnlwdG9faGFzaChtZXNzYWdlLCBvdXRwdXRGb3JtYXQpIHtcblx0XHR2YXIgYWRkcmVzc19wb29sID0gW107XG5cdFx0X2NoZWNrX291dHB1dF9mb3JtYXQob3V0cHV0Rm9ybWF0KTtcblxuXHRcdC8vIC0tLS0tLS0tLS0gaW5wdXQ6IG1lc3NhZ2UgKHVuc2l6ZWRfYnVmKVxuXHRcdFxuXHRcdG1lc3NhZ2UgPSBfYW55X3RvX1VpbnQ4QXJyYXkoYWRkcmVzc19wb29sLCBtZXNzYWdlLCBcIm1lc3NhZ2VcIik7XG5cdFx0dmFyIG1lc3NhZ2VfYWRkcmVzcyA9IF90b19hbGxvY2F0ZWRfYnVmX2FkZHJlc3MobWVzc2FnZSksXG5cdFx0ICAgIG1lc3NhZ2VfbGVuZ3RoID0gbWVzc2FnZS5sZW5ndGg7XG5cdFx0YWRkcmVzc19wb29sLnB1c2gobWVzc2FnZV9hZGRyZXNzKTtcblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIG91dHB1dCBoYXNoIChidWYpXG5cdFx0XG5cdFx0dmFyIGhhc2hfbGVuZ3RoID0gKGxpYnNvZGl1bS5fY3J5cHRvX2hhc2hfYnl0ZXMoKSkgfCAwLFxuXHRcdCAgICBoYXNoID0gbmV3IEFsbG9jYXRlZEJ1ZihoYXNoX2xlbmd0aCksXG5cdFx0ICAgIGhhc2hfYWRkcmVzcyA9IGhhc2guYWRkcmVzcztcblx0XHRcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChoYXNoX2FkZHJlc3MpO1xuXHRcdFxuXHRcdGlmICgobGlic29kaXVtLl9jcnlwdG9faGFzaChoYXNoX2FkZHJlc3MsIG1lc3NhZ2VfYWRkcmVzcywgbWVzc2FnZV9sZW5ndGgsIDApIHwgMCkgPT09IDApIHtcblx0XHRcdHZhciByZXQgPSBfZm9ybWF0X291dHB1dChoYXNoLCBvdXRwdXRGb3JtYXQpO1xuXHRcdFx0X2ZyZWVfYWxsKGFkZHJlc3NfcG9vbCk7XG5cdFx0XHRyZXR1cm4gcmV0O1xuXHRcdH1cblx0XHRfZnJlZV9hbmRfdGhyb3dfZXJyb3IoYWRkcmVzc19wb29sKTtcblx0XHRcblx0fVxuXG5cdGZ1bmN0aW9uIGNyeXB0b19oYXNoX3NoYTI1NihtZXNzYWdlLCBvdXRwdXRGb3JtYXQpIHtcblx0XHR2YXIgYWRkcmVzc19wb29sID0gW107XG5cdFx0X2NoZWNrX291dHB1dF9mb3JtYXQob3V0cHV0Rm9ybWF0KTtcblxuXHRcdC8vIC0tLS0tLS0tLS0gaW5wdXQ6IG1lc3NhZ2UgKHVuc2l6ZWRfYnVmKVxuXHRcdFxuXHRcdG1lc3NhZ2UgPSBfYW55X3RvX1VpbnQ4QXJyYXkoYWRkcmVzc19wb29sLCBtZXNzYWdlLCBcIm1lc3NhZ2VcIik7XG5cdFx0dmFyIG1lc3NhZ2VfYWRkcmVzcyA9IF90b19hbGxvY2F0ZWRfYnVmX2FkZHJlc3MobWVzc2FnZSksXG5cdFx0ICAgIG1lc3NhZ2VfbGVuZ3RoID0gbWVzc2FnZS5sZW5ndGg7XG5cdFx0YWRkcmVzc19wb29sLnB1c2gobWVzc2FnZV9hZGRyZXNzKTtcblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIG91dHB1dCBoYXNoIChidWYpXG5cdFx0XG5cdFx0dmFyIGhhc2hfbGVuZ3RoID0gKGxpYnNvZGl1bS5fY3J5cHRvX2hhc2hfc2hhMjU2X2J5dGVzKCkpIHwgMCxcblx0XHQgICAgaGFzaCA9IG5ldyBBbGxvY2F0ZWRCdWYoaGFzaF9sZW5ndGgpLFxuXHRcdCAgICBoYXNoX2FkZHJlc3MgPSBoYXNoLmFkZHJlc3M7XG5cdFx0XG5cdFx0YWRkcmVzc19wb29sLnB1c2goaGFzaF9hZGRyZXNzKTtcblx0XHRcblx0XHRpZiAoKGxpYnNvZGl1bS5fY3J5cHRvX2hhc2hfc2hhMjU2KGhhc2hfYWRkcmVzcywgbWVzc2FnZV9hZGRyZXNzLCBtZXNzYWdlX2xlbmd0aCwgMCkgfCAwKSA9PT0gMCkge1xuXHRcdFx0dmFyIHJldCA9IF9mb3JtYXRfb3V0cHV0KGhhc2gsIG91dHB1dEZvcm1hdCk7XG5cdFx0XHRfZnJlZV9hbGwoYWRkcmVzc19wb29sKTtcblx0XHRcdHJldHVybiByZXQ7XG5cdFx0fVxuXHRcdF9mcmVlX2FuZF90aHJvd19lcnJvcihhZGRyZXNzX3Bvb2wpO1xuXHRcdFxuXHR9XG5cblx0ZnVuY3Rpb24gY3J5cHRvX2hhc2hfc2hhNTEyKG1lc3NhZ2UsIG91dHB1dEZvcm1hdCkge1xuXHRcdHZhciBhZGRyZXNzX3Bvb2wgPSBbXTtcblx0XHRfY2hlY2tfb3V0cHV0X2Zvcm1hdChvdXRwdXRGb3JtYXQpO1xuXG5cdFx0Ly8gLS0tLS0tLS0tLSBpbnB1dDogbWVzc2FnZSAodW5zaXplZF9idWYpXG5cdFx0XG5cdFx0bWVzc2FnZSA9IF9hbnlfdG9fVWludDhBcnJheShhZGRyZXNzX3Bvb2wsIG1lc3NhZ2UsIFwibWVzc2FnZVwiKTtcblx0XHR2YXIgbWVzc2FnZV9hZGRyZXNzID0gX3RvX2FsbG9jYXRlZF9idWZfYWRkcmVzcyhtZXNzYWdlKSxcblx0XHQgICAgbWVzc2FnZV9sZW5ndGggPSBtZXNzYWdlLmxlbmd0aDtcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChtZXNzYWdlX2FkZHJlc3MpO1xuXHRcdFxuXHRcdC8vIC0tLS0tLS0tLS0gb3V0cHV0IGhhc2ggKGJ1Zilcblx0XHRcblx0XHR2YXIgaGFzaF9sZW5ndGggPSAobGlic29kaXVtLl9jcnlwdG9faGFzaF9zaGE1MTJfYnl0ZXMoKSkgfCAwLFxuXHRcdCAgICBoYXNoID0gbmV3IEFsbG9jYXRlZEJ1ZihoYXNoX2xlbmd0aCksXG5cdFx0ICAgIGhhc2hfYWRkcmVzcyA9IGhhc2guYWRkcmVzcztcblx0XHRcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChoYXNoX2FkZHJlc3MpO1xuXHRcdFxuXHRcdGlmICgobGlic29kaXVtLl9jcnlwdG9faGFzaF9zaGE1MTIoaGFzaF9hZGRyZXNzLCBtZXNzYWdlX2FkZHJlc3MsIG1lc3NhZ2VfbGVuZ3RoLCAwKSB8IDApID09PSAwKSB7XG5cdFx0XHR2YXIgcmV0ID0gX2Zvcm1hdF9vdXRwdXQoaGFzaCwgb3V0cHV0Rm9ybWF0KTtcblx0XHRcdF9mcmVlX2FsbChhZGRyZXNzX3Bvb2wpO1xuXHRcdFx0cmV0dXJuIHJldDtcblx0XHR9XG5cdFx0X2ZyZWVfYW5kX3Rocm93X2Vycm9yKGFkZHJlc3NfcG9vbCk7XG5cdFx0XG5cdH1cblxuXHRmdW5jdGlvbiBjcnlwdG9fb25ldGltZWF1dGgobWVzc2FnZSwga2V5LCBvdXRwdXRGb3JtYXQpIHtcblx0XHR2YXIgYWRkcmVzc19wb29sID0gW107XG5cdFx0X2NoZWNrX291dHB1dF9mb3JtYXQob3V0cHV0Rm9ybWF0KTtcblxuXHRcdC8vIC0tLS0tLS0tLS0gaW5wdXQ6IG1lc3NhZ2UgKHVuc2l6ZWRfYnVmKVxuXHRcdFxuXHRcdG1lc3NhZ2UgPSBfYW55X3RvX1VpbnQ4QXJyYXkoYWRkcmVzc19wb29sLCBtZXNzYWdlLCBcIm1lc3NhZ2VcIik7XG5cdFx0dmFyIG1lc3NhZ2VfYWRkcmVzcyA9IF90b19hbGxvY2F0ZWRfYnVmX2FkZHJlc3MobWVzc2FnZSksXG5cdFx0ICAgIG1lc3NhZ2VfbGVuZ3RoID0gbWVzc2FnZS5sZW5ndGg7XG5cdFx0YWRkcmVzc19wb29sLnB1c2gobWVzc2FnZV9hZGRyZXNzKTtcblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBrZXkgKGJ1Zilcblx0XHRcblx0XHRrZXkgPSBfYW55X3RvX1VpbnQ4QXJyYXkoYWRkcmVzc19wb29sLCBrZXksIFwia2V5XCIpO1xuXHRcdHZhciBrZXlfYWRkcmVzcywga2V5X2xlbmd0aCA9IChsaWJzb2RpdW0uX2NyeXB0b19vbmV0aW1lYXV0aF9rZXlieXRlcygpKSB8IDA7XG5cdFx0aWYgKGtleS5sZW5ndGggIT09IGtleV9sZW5ndGgpIHtcblx0XHRcdF9mcmVlX2FuZF90aHJvd190eXBlX2Vycm9yKGFkZHJlc3NfcG9vbCwgXCJpbnZhbGlkIGtleSBsZW5ndGhcIik7XG5cdFx0fVxuXHRcdGtleV9hZGRyZXNzID0gX3RvX2FsbG9jYXRlZF9idWZfYWRkcmVzcyhrZXkpO1xuXHRcdGFkZHJlc3NfcG9vbC5wdXNoKGtleV9hZGRyZXNzKTtcblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIG91dHB1dCBoYXNoIChidWYpXG5cdFx0XG5cdFx0dmFyIGhhc2hfbGVuZ3RoID0gKGxpYnNvZGl1bS5fY3J5cHRvX29uZXRpbWVhdXRoX2J5dGVzKCkpIHwgMCxcblx0XHQgICAgaGFzaCA9IG5ldyBBbGxvY2F0ZWRCdWYoaGFzaF9sZW5ndGgpLFxuXHRcdCAgICBoYXNoX2FkZHJlc3MgPSBoYXNoLmFkZHJlc3M7XG5cdFx0XG5cdFx0YWRkcmVzc19wb29sLnB1c2goaGFzaF9hZGRyZXNzKTtcblx0XHRcblx0XHRpZiAoKGxpYnNvZGl1bS5fY3J5cHRvX29uZXRpbWVhdXRoKGhhc2hfYWRkcmVzcywgbWVzc2FnZV9hZGRyZXNzLCBtZXNzYWdlX2xlbmd0aCwgMCwga2V5X2FkZHJlc3MpIHwgMCkgPT09IDApIHtcblx0XHRcdHZhciByZXQgPSBfZm9ybWF0X291dHB1dChoYXNoLCBvdXRwdXRGb3JtYXQpO1xuXHRcdFx0X2ZyZWVfYWxsKGFkZHJlc3NfcG9vbCk7XG5cdFx0XHRyZXR1cm4gcmV0O1xuXHRcdH1cblx0XHRfZnJlZV9hbmRfdGhyb3dfZXJyb3IoYWRkcmVzc19wb29sKTtcblx0XHRcblx0fVxuXG5cdGZ1bmN0aW9uIGNyeXB0b19vbmV0aW1lYXV0aF9maW5hbChzdGF0ZV9hZGRyZXNzLCBvdXRwdXRGb3JtYXQpIHtcblx0XHR2YXIgYWRkcmVzc19wb29sID0gW107XG5cdFx0X2NoZWNrX291dHB1dF9mb3JtYXQob3V0cHV0Rm9ybWF0KTtcblxuXHRcdC8vIC0tLS0tLS0tLS0gaW5wdXQ6IHN0YXRlX2FkZHJlc3MgKG9uZXRpbWVhdXRoX3N0YXRlX2FkZHJlc3MpXG5cdFx0XG5cdFx0X3JlcXVpcmVfZGVmaW5lZChhZGRyZXNzX3Bvb2wsIHN0YXRlX2FkZHJlc3MsIFwic3RhdGVfYWRkcmVzc1wiKTtcblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIG91dHB1dCBoYXNoIChidWYpXG5cdFx0XG5cdFx0dmFyIGhhc2hfbGVuZ3RoID0gKGxpYnNvZGl1bS5fY3J5cHRvX29uZXRpbWVhdXRoX2J5dGVzKCkpIHwgMCxcblx0XHQgICAgaGFzaCA9IG5ldyBBbGxvY2F0ZWRCdWYoaGFzaF9sZW5ndGgpLFxuXHRcdCAgICBoYXNoX2FkZHJlc3MgPSBoYXNoLmFkZHJlc3M7XG5cdFx0XG5cdFx0YWRkcmVzc19wb29sLnB1c2goaGFzaF9hZGRyZXNzKTtcblx0XHRcblx0XHRpZiAoKGxpYnNvZGl1bS5fY3J5cHRvX29uZXRpbWVhdXRoX2ZpbmFsKHN0YXRlX2FkZHJlc3MsIGhhc2hfYWRkcmVzcykgfCAwKSA9PT0gMCkge1xuXHRcdFx0dmFyIHJldCA9IChsaWJzb2RpdW0uX2ZyZWUoc3RhdGVfYWRkcmVzcyksIF9mb3JtYXRfb3V0cHV0KGhhc2gsIG91dHB1dEZvcm1hdCkpO1xuXHRcdFx0X2ZyZWVfYWxsKGFkZHJlc3NfcG9vbCk7XG5cdFx0XHRyZXR1cm4gcmV0O1xuXHRcdH1cblx0XHRfZnJlZV9hbmRfdGhyb3dfZXJyb3IoYWRkcmVzc19wb29sKTtcblx0XHRcblx0fVxuXG5cdGZ1bmN0aW9uIGNyeXB0b19vbmV0aW1lYXV0aF9pbml0KGtleSwgb3V0cHV0Rm9ybWF0KSB7XG5cdFx0dmFyIGFkZHJlc3NfcG9vbCA9IFtdO1xuXHRcdF9jaGVja19vdXRwdXRfZm9ybWF0KG91dHB1dEZvcm1hdCk7XG5cblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBrZXkgKHVuc2l6ZWRfYnVmX29wdGlvbmFsKVxuXHRcdFxuXHRcdHZhciBrZXlfYWRkcmVzcyA9IG51bGwsIGtleV9sZW5ndGggPSAwO1xuXHRcdGlmIChrZXkgIT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRrZXkgPSBfYW55X3RvX1VpbnQ4QXJyYXkoYWRkcmVzc19wb29sLCBrZXksIFwia2V5XCIpO1xuXHRcdFx0a2V5X2FkZHJlc3MgPSBfdG9fYWxsb2NhdGVkX2J1Zl9hZGRyZXNzKGtleSk7XG5cdFx0XHRrZXlfbGVuZ3RoID0ga2V5Lmxlbmd0aDtcblx0XHRcdGFkZHJlc3NfcG9vbC5wdXNoKGtleV9hZGRyZXNzKTtcblx0XHR9XG5cdFx0XG5cdFx0Ly8gLS0tLS0tLS0tLSBvdXRwdXQgc3RhdGUgKG9uZXRpbWVhdXRoX3N0YXRlKVxuXHRcdFxuXHRcdHZhciBzdGF0ZV9hZGRyZXNzID0gbmV3IEFsbG9jYXRlZEJ1ZigxNDQpLmFkZHJlc3M7XG5cdFx0XG5cdFx0aWYgKChsaWJzb2RpdW0uX2NyeXB0b19vbmV0aW1lYXV0aF9pbml0KHN0YXRlX2FkZHJlc3MsIGtleV9hZGRyZXNzKSB8IDApID09PSAwKSB7XG5cdFx0XHR2YXIgcmV0ID0gc3RhdGVfYWRkcmVzcztcblx0XHRcdF9mcmVlX2FsbChhZGRyZXNzX3Bvb2wpO1xuXHRcdFx0cmV0dXJuIHJldDtcblx0XHR9XG5cdFx0X2ZyZWVfYW5kX3Rocm93X2Vycm9yKGFkZHJlc3NfcG9vbCk7XG5cdFx0XG5cdH1cblxuXHRmdW5jdGlvbiBjcnlwdG9fb25ldGltZWF1dGhfdXBkYXRlKHN0YXRlX2FkZHJlc3MsIG1lc3NhZ2VfY2h1bmssIG91dHB1dEZvcm1hdCkge1xuXHRcdHZhciBhZGRyZXNzX3Bvb2wgPSBbXTtcblx0XHRfY2hlY2tfb3V0cHV0X2Zvcm1hdChvdXRwdXRGb3JtYXQpO1xuXG5cdFx0Ly8gLS0tLS0tLS0tLSBpbnB1dDogc3RhdGVfYWRkcmVzcyAob25ldGltZWF1dGhfc3RhdGVfYWRkcmVzcylcblx0XHRcblx0XHRfcmVxdWlyZV9kZWZpbmVkKGFkZHJlc3NfcG9vbCwgc3RhdGVfYWRkcmVzcywgXCJzdGF0ZV9hZGRyZXNzXCIpO1xuXHRcdFxuXHRcdC8vIC0tLS0tLS0tLS0gaW5wdXQ6IG1lc3NhZ2VfY2h1bmsgKHVuc2l6ZWRfYnVmKVxuXHRcdFxuXHRcdG1lc3NhZ2VfY2h1bmsgPSBfYW55X3RvX1VpbnQ4QXJyYXkoYWRkcmVzc19wb29sLCBtZXNzYWdlX2NodW5rLCBcIm1lc3NhZ2VfY2h1bmtcIik7XG5cdFx0dmFyIG1lc3NhZ2VfY2h1bmtfYWRkcmVzcyA9IF90b19hbGxvY2F0ZWRfYnVmX2FkZHJlc3MobWVzc2FnZV9jaHVuayksXG5cdFx0ICAgIG1lc3NhZ2VfY2h1bmtfbGVuZ3RoID0gbWVzc2FnZV9jaHVuay5sZW5ndGg7XG5cdFx0YWRkcmVzc19wb29sLnB1c2gobWVzc2FnZV9jaHVua19hZGRyZXNzKTtcblx0XHRcblx0XHRpZiAoKGxpYnNvZGl1bS5fY3J5cHRvX29uZXRpbWVhdXRoX3VwZGF0ZShzdGF0ZV9hZGRyZXNzLCBtZXNzYWdlX2NodW5rX2FkZHJlc3MsIG1lc3NhZ2VfY2h1bmtfbGVuZ3RoKSB8IDApID09PSAwKSB7XG5cdFx0XHRfZnJlZV9hbGwoYWRkcmVzc19wb29sKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0X2ZyZWVfYW5kX3Rocm93X2Vycm9yKGFkZHJlc3NfcG9vbCk7XG5cdFx0XG5cdH1cblxuXHRmdW5jdGlvbiBjcnlwdG9fb25ldGltZWF1dGhfdmVyaWZ5KGhhc2gsIG1lc3NhZ2UsIGtleSkge1xuXHRcdHZhciBhZGRyZXNzX3Bvb2wgPSBbXTtcblxuXHRcdC8vIC0tLS0tLS0tLS0gaW5wdXQ6IGhhc2ggKGJ1Zilcblx0XHRcblx0XHRoYXNoID0gX2FueV90b19VaW50OEFycmF5KGFkZHJlc3NfcG9vbCwgaGFzaCwgXCJoYXNoXCIpO1xuXHRcdHZhciBoYXNoX2FkZHJlc3MsIGhhc2hfbGVuZ3RoID0gKGxpYnNvZGl1bS5fY3J5cHRvX29uZXRpbWVhdXRoX2J5dGVzKCkpIHwgMDtcblx0XHRpZiAoaGFzaC5sZW5ndGggIT09IGhhc2hfbGVuZ3RoKSB7XG5cdFx0XHRfZnJlZV9hbmRfdGhyb3dfdHlwZV9lcnJvcihhZGRyZXNzX3Bvb2wsIFwiaW52YWxpZCBoYXNoIGxlbmd0aFwiKTtcblx0XHR9XG5cdFx0aGFzaF9hZGRyZXNzID0gX3RvX2FsbG9jYXRlZF9idWZfYWRkcmVzcyhoYXNoKTtcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChoYXNoX2FkZHJlc3MpO1xuXHRcdFxuXHRcdC8vIC0tLS0tLS0tLS0gaW5wdXQ6IG1lc3NhZ2UgKHVuc2l6ZWRfYnVmKVxuXHRcdFxuXHRcdG1lc3NhZ2UgPSBfYW55X3RvX1VpbnQ4QXJyYXkoYWRkcmVzc19wb29sLCBtZXNzYWdlLCBcIm1lc3NhZ2VcIik7XG5cdFx0dmFyIG1lc3NhZ2VfYWRkcmVzcyA9IF90b19hbGxvY2F0ZWRfYnVmX2FkZHJlc3MobWVzc2FnZSksXG5cdFx0ICAgIG1lc3NhZ2VfbGVuZ3RoID0gbWVzc2FnZS5sZW5ndGg7XG5cdFx0YWRkcmVzc19wb29sLnB1c2gobWVzc2FnZV9hZGRyZXNzKTtcblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBrZXkgKGJ1Zilcblx0XHRcblx0XHRrZXkgPSBfYW55X3RvX1VpbnQ4QXJyYXkoYWRkcmVzc19wb29sLCBrZXksIFwia2V5XCIpO1xuXHRcdHZhciBrZXlfYWRkcmVzcywga2V5X2xlbmd0aCA9IChsaWJzb2RpdW0uX2NyeXB0b19vbmV0aW1lYXV0aF9rZXlieXRlcygpKSB8IDA7XG5cdFx0aWYgKGtleS5sZW5ndGggIT09IGtleV9sZW5ndGgpIHtcblx0XHRcdF9mcmVlX2FuZF90aHJvd190eXBlX2Vycm9yKGFkZHJlc3NfcG9vbCwgXCJpbnZhbGlkIGtleSBsZW5ndGhcIik7XG5cdFx0fVxuXHRcdGtleV9hZGRyZXNzID0gX3RvX2FsbG9jYXRlZF9idWZfYWRkcmVzcyhrZXkpO1xuXHRcdGFkZHJlc3NfcG9vbC5wdXNoKGtleV9hZGRyZXNzKTtcblx0XHRcblx0XHR2YXIgcmVzdWx0ID0gbGlic29kaXVtLl9jcnlwdG9fb25ldGltZWF1dGhfdmVyaWZ5KGhhc2hfYWRkcmVzcywgbWVzc2FnZV9hZGRyZXNzLCBtZXNzYWdlX2xlbmd0aCwgMCwga2V5X2FkZHJlc3MpIHwgMDtcblx0XHR2YXIgcmV0ID0gKHJlc3VsdCA9PT0gMCk7XG5cdFx0X2ZyZWVfYWxsKGFkZHJlc3NfcG9vbCk7XG5cdFx0cmV0dXJuIHJldDtcblx0XHRcblx0fVxuXG5cdGZ1bmN0aW9uIGNyeXB0b19wd2hhc2hfc2NyeXB0c2Fsc2EyMDhzaGEyNTYocGFzc3dvcmQsIHNhbHQsIG9wc0xpbWl0LCBtZW1MaW1pdCwga2V5TGVuZ3RoLCBvdXRwdXRGb3JtYXQpIHtcblx0XHR2YXIgYWRkcmVzc19wb29sID0gW107XG5cdFx0X2NoZWNrX291dHB1dF9mb3JtYXQob3V0cHV0Rm9ybWF0KTtcblxuXHRcdC8vIC0tLS0tLS0tLS0gaW5wdXQ6IHBhc3N3b3JkICh1bnNpemVkX2J1Zilcblx0XHRcblx0XHRwYXNzd29yZCA9IF9hbnlfdG9fVWludDhBcnJheShhZGRyZXNzX3Bvb2wsIHBhc3N3b3JkLCBcInBhc3N3b3JkXCIpO1xuXHRcdHZhciBwYXNzd29yZF9hZGRyZXNzID0gX3RvX2FsbG9jYXRlZF9idWZfYWRkcmVzcyhwYXNzd29yZCksXG5cdFx0ICAgIHBhc3N3b3JkX2xlbmd0aCA9IHBhc3N3b3JkLmxlbmd0aDtcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChwYXNzd29yZF9hZGRyZXNzKTtcblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBzYWx0IChidWYpXG5cdFx0XG5cdFx0c2FsdCA9IF9hbnlfdG9fVWludDhBcnJheShhZGRyZXNzX3Bvb2wsIHNhbHQsIFwic2FsdFwiKTtcblx0XHR2YXIgc2FsdF9hZGRyZXNzLCBzYWx0X2xlbmd0aCA9IChsaWJzb2RpdW0uX2NyeXB0b19wd2hhc2hfc2NyeXB0c2Fsc2EyMDhzaGEyNTZfc2FsdGJ5dGVzKCkpIHwgMDtcblx0XHRpZiAoc2FsdC5sZW5ndGggIT09IHNhbHRfbGVuZ3RoKSB7XG5cdFx0XHRfZnJlZV9hbmRfdGhyb3dfdHlwZV9lcnJvcihhZGRyZXNzX3Bvb2wsIFwiaW52YWxpZCBzYWx0IGxlbmd0aFwiKTtcblx0XHR9XG5cdFx0c2FsdF9hZGRyZXNzID0gX3RvX2FsbG9jYXRlZF9idWZfYWRkcmVzcyhzYWx0KTtcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChzYWx0X2FkZHJlc3MpO1xuXHRcdFxuXHRcdC8vIC0tLS0tLS0tLS0gaW5wdXQ6IG9wc0xpbWl0ICh1aW50KVxuXHRcdFxuXHRcdF9yZXF1aXJlX2RlZmluZWQoYWRkcmVzc19wb29sLCBvcHNMaW1pdCwgXCJvcHNMaW1pdFwiKTtcblx0XHRcblx0XHRpZiAoISh0eXBlb2Ygb3BzTGltaXQgPT09IFwibnVtYmVyXCIgJiYgKG9wc0xpbWl0IHwgMCkgPT09IG9wc0xpbWl0KSAmJiAob3BzTGltaXQgfCAwKSA+IDApIHtcblx0XHRcdF9mcmVlX2FuZF90aHJvd190eXBlX2Vycm9yKGFkZHJlc3NfcG9vbCwgXCJvcHNMaW1pdCBtdXN0IGJlIGFuIHVuc2lnbmVkIGludGVnZXJcIik7XG5cdFx0fVxuXHRcdFxuXHRcdC8vIC0tLS0tLS0tLS0gaW5wdXQ6IG1lbUxpbWl0ICh1aW50KVxuXHRcdFxuXHRcdF9yZXF1aXJlX2RlZmluZWQoYWRkcmVzc19wb29sLCBtZW1MaW1pdCwgXCJtZW1MaW1pdFwiKTtcblx0XHRcblx0XHRpZiAoISh0eXBlb2YgbWVtTGltaXQgPT09IFwibnVtYmVyXCIgJiYgKG1lbUxpbWl0IHwgMCkgPT09IG1lbUxpbWl0KSAmJiAobWVtTGltaXQgfCAwKSA+IDApIHtcblx0XHRcdF9mcmVlX2FuZF90aHJvd190eXBlX2Vycm9yKGFkZHJlc3NfcG9vbCwgXCJtZW1MaW1pdCBtdXN0IGJlIGFuIHVuc2lnbmVkIGludGVnZXJcIik7XG5cdFx0fVxuXHRcdFxuXHRcdC8vIC0tLS0tLS0tLS0gaW5wdXQ6IGtleUxlbmd0aCAodWludClcblx0XHRcblx0XHRfcmVxdWlyZV9kZWZpbmVkKGFkZHJlc3NfcG9vbCwga2V5TGVuZ3RoLCBcImtleUxlbmd0aFwiKTtcblx0XHRcblx0XHRpZiAoISh0eXBlb2Yga2V5TGVuZ3RoID09PSBcIm51bWJlclwiICYmIChrZXlMZW5ndGggfCAwKSA9PT0ga2V5TGVuZ3RoKSAmJiAoa2V5TGVuZ3RoIHwgMCkgPiAwKSB7XG5cdFx0XHRfZnJlZV9hbmRfdGhyb3dfdHlwZV9lcnJvcihhZGRyZXNzX3Bvb2wsIFwia2V5TGVuZ3RoIG11c3QgYmUgYW4gdW5zaWduZWQgaW50ZWdlclwiKTtcblx0XHR9XG5cdFx0XG5cdFx0Ly8gLS0tLS0tLS0tLSBvdXRwdXQgZGVyaXZlZEtleSAoYnVmKVxuXHRcdFxuXHRcdHZhciBkZXJpdmVkS2V5X2xlbmd0aCA9IChrZXlMZW5ndGgpIHwgMCxcblx0XHQgICAgZGVyaXZlZEtleSA9IG5ldyBBbGxvY2F0ZWRCdWYoZGVyaXZlZEtleV9sZW5ndGgpLFxuXHRcdCAgICBkZXJpdmVkS2V5X2FkZHJlc3MgPSBkZXJpdmVkS2V5LmFkZHJlc3M7XG5cdFx0XG5cdFx0YWRkcmVzc19wb29sLnB1c2goZGVyaXZlZEtleV9hZGRyZXNzKTtcblx0XHRcblx0XHRpZiAoKGxpYnNvZGl1bS5fY3J5cHRvX3B3aGFzaF9zY3J5cHRzYWxzYTIwOHNoYTI1NihkZXJpdmVkS2V5X2FkZHJlc3MsIGtleUxlbmd0aCwgMCwgcGFzc3dvcmRfYWRkcmVzcywgcGFzc3dvcmRfbGVuZ3RoLCAwLCBzYWx0X2FkZHJlc3MsIG9wc0xpbWl0LCAwLCBtZW1MaW1pdCkgfCAwKSA9PT0gMCkge1xuXHRcdFx0dmFyIHJldCA9IF9mb3JtYXRfb3V0cHV0KGRlcml2ZWRLZXksIG91dHB1dEZvcm1hdCk7XG5cdFx0XHRfZnJlZV9hbGwoYWRkcmVzc19wb29sKTtcblx0XHRcdHJldHVybiByZXQ7XG5cdFx0fVxuXHRcdF9mcmVlX2FuZF90aHJvd19lcnJvcihhZGRyZXNzX3Bvb2wpO1xuXHRcdFxuXHR9XG5cblx0ZnVuY3Rpb24gY3J5cHRvX3B3aGFzaF9zY3J5cHRzYWxzYTIwOHNoYTI1Nl9sbChwYXNzd29yZCwgc2FsdCwgb3BzTGltaXQsIHIsIHAsIGtleUxlbmd0aCwgb3V0cHV0Rm9ybWF0KSB7XG5cdFx0dmFyIGFkZHJlc3NfcG9vbCA9IFtdO1xuXHRcdF9jaGVja19vdXRwdXRfZm9ybWF0KG91dHB1dEZvcm1hdCk7XG5cblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBwYXNzd29yZCAodW5zaXplZF9idWYpXG5cdFx0XG5cdFx0cGFzc3dvcmQgPSBfYW55X3RvX1VpbnQ4QXJyYXkoYWRkcmVzc19wb29sLCBwYXNzd29yZCwgXCJwYXNzd29yZFwiKTtcblx0XHR2YXIgcGFzc3dvcmRfYWRkcmVzcyA9IF90b19hbGxvY2F0ZWRfYnVmX2FkZHJlc3MocGFzc3dvcmQpLFxuXHRcdCAgICBwYXNzd29yZF9sZW5ndGggPSBwYXNzd29yZC5sZW5ndGg7XG5cdFx0YWRkcmVzc19wb29sLnB1c2gocGFzc3dvcmRfYWRkcmVzcyk7XG5cdFx0XG5cdFx0Ly8gLS0tLS0tLS0tLSBpbnB1dDogc2FsdCAodW5zaXplZF9idWYpXG5cdFx0XG5cdFx0c2FsdCA9IF9hbnlfdG9fVWludDhBcnJheShhZGRyZXNzX3Bvb2wsIHNhbHQsIFwic2FsdFwiKTtcblx0XHR2YXIgc2FsdF9hZGRyZXNzID0gX3RvX2FsbG9jYXRlZF9idWZfYWRkcmVzcyhzYWx0KSxcblx0XHQgICAgc2FsdF9sZW5ndGggPSBzYWx0Lmxlbmd0aDtcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChzYWx0X2FkZHJlc3MpO1xuXHRcdFxuXHRcdC8vIC0tLS0tLS0tLS0gaW5wdXQ6IG9wc0xpbWl0ICh1aW50KVxuXHRcdFxuXHRcdF9yZXF1aXJlX2RlZmluZWQoYWRkcmVzc19wb29sLCBvcHNMaW1pdCwgXCJvcHNMaW1pdFwiKTtcblx0XHRcblx0XHRpZiAoISh0eXBlb2Ygb3BzTGltaXQgPT09IFwibnVtYmVyXCIgJiYgKG9wc0xpbWl0IHwgMCkgPT09IG9wc0xpbWl0KSAmJiAob3BzTGltaXQgfCAwKSA+IDApIHtcblx0XHRcdF9mcmVlX2FuZF90aHJvd190eXBlX2Vycm9yKGFkZHJlc3NfcG9vbCwgXCJvcHNMaW1pdCBtdXN0IGJlIGFuIHVuc2lnbmVkIGludGVnZXJcIik7XG5cdFx0fVxuXHRcdFxuXHRcdC8vIC0tLS0tLS0tLS0gaW5wdXQ6IHIgKHVpbnQpXG5cdFx0XG5cdFx0X3JlcXVpcmVfZGVmaW5lZChhZGRyZXNzX3Bvb2wsIHIsIFwiclwiKTtcblx0XHRcblx0XHRpZiAoISh0eXBlb2YgciA9PT0gXCJudW1iZXJcIiAmJiAociB8IDApID09PSByKSAmJiAociB8IDApID4gMCkge1xuXHRcdFx0X2ZyZWVfYW5kX3Rocm93X3R5cGVfZXJyb3IoYWRkcmVzc19wb29sLCBcInIgbXVzdCBiZSBhbiB1bnNpZ25lZCBpbnRlZ2VyXCIpO1xuXHRcdH1cblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBwICh1aW50KVxuXHRcdFxuXHRcdF9yZXF1aXJlX2RlZmluZWQoYWRkcmVzc19wb29sLCBwLCBcInBcIik7XG5cdFx0XG5cdFx0aWYgKCEodHlwZW9mIHAgPT09IFwibnVtYmVyXCIgJiYgKHAgfCAwKSA9PT0gcCkgJiYgKHAgfCAwKSA+IDApIHtcblx0XHRcdF9mcmVlX2FuZF90aHJvd190eXBlX2Vycm9yKGFkZHJlc3NfcG9vbCwgXCJwIG11c3QgYmUgYW4gdW5zaWduZWQgaW50ZWdlclwiKTtcblx0XHR9XG5cdFx0XG5cdFx0Ly8gLS0tLS0tLS0tLSBpbnB1dDoga2V5TGVuZ3RoICh1aW50KVxuXHRcdFxuXHRcdF9yZXF1aXJlX2RlZmluZWQoYWRkcmVzc19wb29sLCBrZXlMZW5ndGgsIFwia2V5TGVuZ3RoXCIpO1xuXHRcdFxuXHRcdGlmICghKHR5cGVvZiBrZXlMZW5ndGggPT09IFwibnVtYmVyXCIgJiYgKGtleUxlbmd0aCB8IDApID09PSBrZXlMZW5ndGgpICYmIChrZXlMZW5ndGggfCAwKSA+IDApIHtcblx0XHRcdF9mcmVlX2FuZF90aHJvd190eXBlX2Vycm9yKGFkZHJlc3NfcG9vbCwgXCJrZXlMZW5ndGggbXVzdCBiZSBhbiB1bnNpZ25lZCBpbnRlZ2VyXCIpO1xuXHRcdH1cblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIG91dHB1dCBkZXJpdmVkS2V5IChidWYpXG5cdFx0XG5cdFx0dmFyIGRlcml2ZWRLZXlfbGVuZ3RoID0gKGtleUxlbmd0aCkgfCAwLFxuXHRcdCAgICBkZXJpdmVkS2V5ID0gbmV3IEFsbG9jYXRlZEJ1ZihkZXJpdmVkS2V5X2xlbmd0aCksXG5cdFx0ICAgIGRlcml2ZWRLZXlfYWRkcmVzcyA9IGRlcml2ZWRLZXkuYWRkcmVzcztcblx0XHRcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChkZXJpdmVkS2V5X2FkZHJlc3MpO1xuXHRcdFxuXHRcdGlmICgobGlic29kaXVtLl9jcnlwdG9fcHdoYXNoX3NjcnlwdHNhbHNhMjA4c2hhMjU2X2xsKHBhc3N3b3JkX2FkZHJlc3MsIHBhc3N3b3JkX2xlbmd0aCwgc2FsdF9hZGRyZXNzLCBzYWx0X2xlbmd0aCwgb3BzTGltaXQsIDAsIHIsIHAsIGRlcml2ZWRLZXlfYWRkcmVzcywga2V5TGVuZ3RoKSB8IDApID09PSAwKSB7XG5cdFx0XHR2YXIgcmV0ID0gX2Zvcm1hdF9vdXRwdXQoZGVyaXZlZEtleSwgb3V0cHV0Rm9ybWF0KTtcblx0XHRcdF9mcmVlX2FsbChhZGRyZXNzX3Bvb2wpO1xuXHRcdFx0cmV0dXJuIHJldDtcblx0XHR9XG5cdFx0X2ZyZWVfYW5kX3Rocm93X2Vycm9yKGFkZHJlc3NfcG9vbCk7XG5cdFx0XG5cdH1cblxuXHRmdW5jdGlvbiBjcnlwdG9fcHdoYXNoX3NjcnlwdHNhbHNhMjA4c2hhMjU2X3N0cihwYXNzd29yZCwgb3BzTGltaXQsIG1lbUxpbWl0LCBvdXRwdXRGb3JtYXQpIHtcblx0XHR2YXIgYWRkcmVzc19wb29sID0gW107XG5cdFx0X2NoZWNrX291dHB1dF9mb3JtYXQob3V0cHV0Rm9ybWF0KTtcblxuXHRcdC8vIC0tLS0tLS0tLS0gaW5wdXQ6IHBhc3N3b3JkICh1bnNpemVkX2J1Zilcblx0XHRcblx0XHRwYXNzd29yZCA9IF9hbnlfdG9fVWludDhBcnJheShhZGRyZXNzX3Bvb2wsIHBhc3N3b3JkLCBcInBhc3N3b3JkXCIpO1xuXHRcdHZhciBwYXNzd29yZF9hZGRyZXNzID0gX3RvX2FsbG9jYXRlZF9idWZfYWRkcmVzcyhwYXNzd29yZCksXG5cdFx0ICAgIHBhc3N3b3JkX2xlbmd0aCA9IHBhc3N3b3JkLmxlbmd0aDtcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChwYXNzd29yZF9hZGRyZXNzKTtcblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBvcHNMaW1pdCAodWludClcblx0XHRcblx0XHRfcmVxdWlyZV9kZWZpbmVkKGFkZHJlc3NfcG9vbCwgb3BzTGltaXQsIFwib3BzTGltaXRcIik7XG5cdFx0XG5cdFx0aWYgKCEodHlwZW9mIG9wc0xpbWl0ID09PSBcIm51bWJlclwiICYmIChvcHNMaW1pdCB8IDApID09PSBvcHNMaW1pdCkgJiYgKG9wc0xpbWl0IHwgMCkgPiAwKSB7XG5cdFx0XHRfZnJlZV9hbmRfdGhyb3dfdHlwZV9lcnJvcihhZGRyZXNzX3Bvb2wsIFwib3BzTGltaXQgbXVzdCBiZSBhbiB1bnNpZ25lZCBpbnRlZ2VyXCIpO1xuXHRcdH1cblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBtZW1MaW1pdCAodWludClcblx0XHRcblx0XHRfcmVxdWlyZV9kZWZpbmVkKGFkZHJlc3NfcG9vbCwgbWVtTGltaXQsIFwibWVtTGltaXRcIik7XG5cdFx0XG5cdFx0aWYgKCEodHlwZW9mIG1lbUxpbWl0ID09PSBcIm51bWJlclwiICYmIChtZW1MaW1pdCB8IDApID09PSBtZW1MaW1pdCkgJiYgKG1lbUxpbWl0IHwgMCkgPiAwKSB7XG5cdFx0XHRfZnJlZV9hbmRfdGhyb3dfdHlwZV9lcnJvcihhZGRyZXNzX3Bvb2wsIFwibWVtTGltaXQgbXVzdCBiZSBhbiB1bnNpZ25lZCBpbnRlZ2VyXCIpO1xuXHRcdH1cblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIG91dHB1dCBoYXNoZWRfcGFzc3dvcmQgKGJ1Zilcblx0XHRcblx0XHR2YXIgaGFzaGVkX3Bhc3N3b3JkX2xlbmd0aCA9IChsaWJzb2RpdW0uX2NyeXB0b19wd2hhc2hfc2NyeXB0c2Fsc2EyMDhzaGEyNTZfc3RyYnl0ZXMoKSkgfCAwLFxuXHRcdCAgICBoYXNoZWRfcGFzc3dvcmQgPSBuZXcgQWxsb2NhdGVkQnVmKGhhc2hlZF9wYXNzd29yZF9sZW5ndGgpLFxuXHRcdCAgICBoYXNoZWRfcGFzc3dvcmRfYWRkcmVzcyA9IGhhc2hlZF9wYXNzd29yZC5hZGRyZXNzO1xuXHRcdFxuXHRcdGFkZHJlc3NfcG9vbC5wdXNoKGhhc2hlZF9wYXNzd29yZF9hZGRyZXNzKTtcblx0XHRcblx0XHRpZiAoKGxpYnNvZGl1bS5fY3J5cHRvX3B3aGFzaF9zY3J5cHRzYWxzYTIwOHNoYTI1Nl9zdHIoaGFzaGVkX3Bhc3N3b3JkX2FkZHJlc3MsIHBhc3N3b3JkX2FkZHJlc3MsIHBhc3N3b3JkX2xlbmd0aCwgMCwgb3BzTGltaXQsIDAsIG1lbUxpbWl0KSB8IDApID09PSAwKSB7XG5cdFx0XHR2YXIgcmV0ID0gbGlic29kaXVtLlBvaW50ZXJfc3RyaW5naWZ5KGhhc2hlZF9wYXNzd29yZF9hZGRyZXNzKTtcblx0XHRcdF9mcmVlX2FsbChhZGRyZXNzX3Bvb2wpO1xuXHRcdFx0cmV0dXJuIHJldDtcblx0XHR9XG5cdFx0X2ZyZWVfYW5kX3Rocm93X2Vycm9yKGFkZHJlc3NfcG9vbCk7XG5cdFx0XG5cdH1cblxuXHRmdW5jdGlvbiBjcnlwdG9fcHdoYXNoX3NjcnlwdHNhbHNhMjA4c2hhMjU2X3N0cl92ZXJpZnkoaGFzaGVkX3Bhc3N3b3JkLCBwYXNzd29yZCwgb3V0cHV0Rm9ybWF0KSB7XG5cdFx0dmFyIGFkZHJlc3NfcG9vbCA9IFtdO1xuXHRcdF9jaGVja19vdXRwdXRfZm9ybWF0KG91dHB1dEZvcm1hdCk7XG5cblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBoYXNoZWRfcGFzc3dvcmQgKHN0cmluZylcblx0XHRcblx0XHRoYXNoZWRfcGFzc3dvcmQgPSBmcm9tX3N0cmluZyhoYXNoZWRfcGFzc3dvcmQgKyBcIlxcMFwiKTtcblx0XHR2YXIgaGFzaGVkX3Bhc3N3b3JkX2FkZHJlc3MgPSBfdG9fYWxsb2NhdGVkX2J1Zl9hZGRyZXNzKGhhc2hlZF9wYXNzd29yZCksXG5cdFx0ICAgIGhhc2hlZF9wYXNzd29yZF9sZW5ndGggPSBoYXNoZWRfcGFzc3dvcmQubGVuZ3RoIC0gMTtcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChoYXNoZWRfcGFzc3dvcmRfYWRkcmVzcyk7XG5cdFx0XG5cdFx0Ly8gLS0tLS0tLS0tLSBpbnB1dDogcGFzc3dvcmQgKHVuc2l6ZWRfYnVmKVxuXHRcdFxuXHRcdHBhc3N3b3JkID0gX2FueV90b19VaW50OEFycmF5KGFkZHJlc3NfcG9vbCwgcGFzc3dvcmQsIFwicGFzc3dvcmRcIik7XG5cdFx0dmFyIHBhc3N3b3JkX2FkZHJlc3MgPSBfdG9fYWxsb2NhdGVkX2J1Zl9hZGRyZXNzKHBhc3N3b3JkKSxcblx0XHQgICAgcGFzc3dvcmRfbGVuZ3RoID0gcGFzc3dvcmQubGVuZ3RoO1xuXHRcdGFkZHJlc3NfcG9vbC5wdXNoKHBhc3N3b3JkX2FkZHJlc3MpO1xuXHRcdFxuXHRcdHZhciByZXN1bHQgPSBsaWJzb2RpdW0uX2NyeXB0b19wd2hhc2hfc2NyeXB0c2Fsc2EyMDhzaGEyNTZfc3RyX3ZlcmlmeShoYXNoZWRfcGFzc3dvcmRfYWRkcmVzcywgcGFzc3dvcmRfYWRkcmVzcywgcGFzc3dvcmRfbGVuZ3RoLCAwKSB8IDA7XG5cdFx0dmFyIHJldCA9IChyZXN1bHQgPT09IDApO1xuXHRcdF9mcmVlX2FsbChhZGRyZXNzX3Bvb2wpO1xuXHRcdHJldHVybiByZXQ7XG5cdFx0XG5cdH1cblxuXHRmdW5jdGlvbiBjcnlwdG9fc2NhbGFybXVsdChwcml2YXRlS2V5LCBwdWJsaWNLZXksIG91dHB1dEZvcm1hdCkge1xuXHRcdHZhciBhZGRyZXNzX3Bvb2wgPSBbXTtcblx0XHRfY2hlY2tfb3V0cHV0X2Zvcm1hdChvdXRwdXRGb3JtYXQpO1xuXG5cdFx0Ly8gLS0tLS0tLS0tLSBpbnB1dDogcHJpdmF0ZUtleSAoYnVmKVxuXHRcdFxuXHRcdHByaXZhdGVLZXkgPSBfYW55X3RvX1VpbnQ4QXJyYXkoYWRkcmVzc19wb29sLCBwcml2YXRlS2V5LCBcInByaXZhdGVLZXlcIik7XG5cdFx0dmFyIHByaXZhdGVLZXlfYWRkcmVzcywgcHJpdmF0ZUtleV9sZW5ndGggPSAobGlic29kaXVtLl9jcnlwdG9fc2NhbGFybXVsdF9zY2FsYXJieXRlcygpKSB8IDA7XG5cdFx0aWYgKHByaXZhdGVLZXkubGVuZ3RoICE9PSBwcml2YXRlS2V5X2xlbmd0aCkge1xuXHRcdFx0X2ZyZWVfYW5kX3Rocm93X3R5cGVfZXJyb3IoYWRkcmVzc19wb29sLCBcImludmFsaWQgcHJpdmF0ZUtleSBsZW5ndGhcIik7XG5cdFx0fVxuXHRcdHByaXZhdGVLZXlfYWRkcmVzcyA9IF90b19hbGxvY2F0ZWRfYnVmX2FkZHJlc3MocHJpdmF0ZUtleSk7XG5cdFx0YWRkcmVzc19wb29sLnB1c2gocHJpdmF0ZUtleV9hZGRyZXNzKTtcblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBwdWJsaWNLZXkgKGJ1Zilcblx0XHRcblx0XHRwdWJsaWNLZXkgPSBfYW55X3RvX1VpbnQ4QXJyYXkoYWRkcmVzc19wb29sLCBwdWJsaWNLZXksIFwicHVibGljS2V5XCIpO1xuXHRcdHZhciBwdWJsaWNLZXlfYWRkcmVzcywgcHVibGljS2V5X2xlbmd0aCA9IChsaWJzb2RpdW0uX2NyeXB0b19zY2FsYXJtdWx0X3NjYWxhcmJ5dGVzKCkpIHwgMDtcblx0XHRpZiAocHVibGljS2V5Lmxlbmd0aCAhPT0gcHVibGljS2V5X2xlbmd0aCkge1xuXHRcdFx0X2ZyZWVfYW5kX3Rocm93X3R5cGVfZXJyb3IoYWRkcmVzc19wb29sLCBcImludmFsaWQgcHVibGljS2V5IGxlbmd0aFwiKTtcblx0XHR9XG5cdFx0cHVibGljS2V5X2FkZHJlc3MgPSBfdG9fYWxsb2NhdGVkX2J1Zl9hZGRyZXNzKHB1YmxpY0tleSk7XG5cdFx0YWRkcmVzc19wb29sLnB1c2gocHVibGljS2V5X2FkZHJlc3MpO1xuXHRcdFxuXHRcdC8vIC0tLS0tLS0tLS0gb3V0cHV0IHNoYXJlZFNlY3JldCAoYnVmKVxuXHRcdFxuXHRcdHZhciBzaGFyZWRTZWNyZXRfbGVuZ3RoID0gKGxpYnNvZGl1bS5fY3J5cHRvX3NjYWxhcm11bHRfYnl0ZXMoKSkgfCAwLFxuXHRcdCAgICBzaGFyZWRTZWNyZXQgPSBuZXcgQWxsb2NhdGVkQnVmKHNoYXJlZFNlY3JldF9sZW5ndGgpLFxuXHRcdCAgICBzaGFyZWRTZWNyZXRfYWRkcmVzcyA9IHNoYXJlZFNlY3JldC5hZGRyZXNzO1xuXHRcdFxuXHRcdGFkZHJlc3NfcG9vbC5wdXNoKHNoYXJlZFNlY3JldF9hZGRyZXNzKTtcblx0XHRcblx0XHRpZiAoKGxpYnNvZGl1bS5fY3J5cHRvX3NjYWxhcm11bHQoc2hhcmVkU2VjcmV0X2FkZHJlc3MsIHByaXZhdGVLZXlfYWRkcmVzcywgcHVibGljS2V5X2FkZHJlc3MpIHwgMCkgPT09IDApIHtcblx0XHRcdHZhciByZXQgPSBfZm9ybWF0X291dHB1dChzaGFyZWRTZWNyZXQsIG91dHB1dEZvcm1hdCk7XG5cdFx0XHRfZnJlZV9hbGwoYWRkcmVzc19wb29sKTtcblx0XHRcdHJldHVybiByZXQ7XG5cdFx0fVxuXHRcdF9mcmVlX2FuZF90aHJvd19lcnJvcihhZGRyZXNzX3Bvb2wpO1xuXHRcdFxuXHR9XG5cblx0ZnVuY3Rpb24gY3J5cHRvX3NjYWxhcm11bHRfYmFzZShwcml2YXRlS2V5LCBvdXRwdXRGb3JtYXQpIHtcblx0XHR2YXIgYWRkcmVzc19wb29sID0gW107XG5cdFx0X2NoZWNrX291dHB1dF9mb3JtYXQob3V0cHV0Rm9ybWF0KTtcblxuXHRcdC8vIC0tLS0tLS0tLS0gaW5wdXQ6IHByaXZhdGVLZXkgKGJ1Zilcblx0XHRcblx0XHRwcml2YXRlS2V5ID0gX2FueV90b19VaW50OEFycmF5KGFkZHJlc3NfcG9vbCwgcHJpdmF0ZUtleSwgXCJwcml2YXRlS2V5XCIpO1xuXHRcdHZhciBwcml2YXRlS2V5X2FkZHJlc3MsIHByaXZhdGVLZXlfbGVuZ3RoID0gKGxpYnNvZGl1bS5fY3J5cHRvX3NjYWxhcm11bHRfc2NhbGFyYnl0ZXMoKSkgfCAwO1xuXHRcdGlmIChwcml2YXRlS2V5Lmxlbmd0aCAhPT0gcHJpdmF0ZUtleV9sZW5ndGgpIHtcblx0XHRcdF9mcmVlX2FuZF90aHJvd190eXBlX2Vycm9yKGFkZHJlc3NfcG9vbCwgXCJpbnZhbGlkIHByaXZhdGVLZXkgbGVuZ3RoXCIpO1xuXHRcdH1cblx0XHRwcml2YXRlS2V5X2FkZHJlc3MgPSBfdG9fYWxsb2NhdGVkX2J1Zl9hZGRyZXNzKHByaXZhdGVLZXkpO1xuXHRcdGFkZHJlc3NfcG9vbC5wdXNoKHByaXZhdGVLZXlfYWRkcmVzcyk7XG5cdFx0XG5cdFx0Ly8gLS0tLS0tLS0tLSBvdXRwdXQgcHVibGljS2V5IChidWYpXG5cdFx0XG5cdFx0dmFyIHB1YmxpY0tleV9sZW5ndGggPSAobGlic29kaXVtLl9jcnlwdG9fc2NhbGFybXVsdF9zY2FsYXJieXRlcygpKSB8IDAsXG5cdFx0ICAgIHB1YmxpY0tleSA9IG5ldyBBbGxvY2F0ZWRCdWYocHVibGljS2V5X2xlbmd0aCksXG5cdFx0ICAgIHB1YmxpY0tleV9hZGRyZXNzID0gcHVibGljS2V5LmFkZHJlc3M7XG5cdFx0XG5cdFx0YWRkcmVzc19wb29sLnB1c2gocHVibGljS2V5X2FkZHJlc3MpO1xuXHRcdFxuXHRcdGlmICgobGlic29kaXVtLl9jcnlwdG9fc2NhbGFybXVsdF9iYXNlKHB1YmxpY0tleV9hZGRyZXNzLCBwcml2YXRlS2V5X2FkZHJlc3MpIHwgMCkgPT09IDApIHtcblx0XHRcdHZhciByZXQgPSBfZm9ybWF0X291dHB1dChwdWJsaWNLZXksIG91dHB1dEZvcm1hdCk7XG5cdFx0XHRfZnJlZV9hbGwoYWRkcmVzc19wb29sKTtcblx0XHRcdHJldHVybiByZXQ7XG5cdFx0fVxuXHRcdF9mcmVlX2FuZF90aHJvd19lcnJvcihhZGRyZXNzX3Bvb2wpO1xuXHRcdFxuXHR9XG5cblx0ZnVuY3Rpb24gY3J5cHRvX3NlY3JldGJveF9kZXRhY2hlZChtZXNzYWdlLCBub25jZSwga2V5LCBvdXRwdXRGb3JtYXQpIHtcblx0XHR2YXIgYWRkcmVzc19wb29sID0gW107XG5cdFx0X2NoZWNrX291dHB1dF9mb3JtYXQob3V0cHV0Rm9ybWF0KTtcblxuXHRcdC8vIC0tLS0tLS0tLS0gaW5wdXQ6IG1lc3NhZ2UgKHVuc2l6ZWRfYnVmKVxuXHRcdFxuXHRcdG1lc3NhZ2UgPSBfYW55X3RvX1VpbnQ4QXJyYXkoYWRkcmVzc19wb29sLCBtZXNzYWdlLCBcIm1lc3NhZ2VcIik7XG5cdFx0dmFyIG1lc3NhZ2VfYWRkcmVzcyA9IF90b19hbGxvY2F0ZWRfYnVmX2FkZHJlc3MobWVzc2FnZSksXG5cdFx0ICAgIG1lc3NhZ2VfbGVuZ3RoID0gbWVzc2FnZS5sZW5ndGg7XG5cdFx0YWRkcmVzc19wb29sLnB1c2gobWVzc2FnZV9hZGRyZXNzKTtcblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBub25jZSAoYnVmKVxuXHRcdFxuXHRcdG5vbmNlID0gX2FueV90b19VaW50OEFycmF5KGFkZHJlc3NfcG9vbCwgbm9uY2UsIFwibm9uY2VcIik7XG5cdFx0dmFyIG5vbmNlX2FkZHJlc3MsIG5vbmNlX2xlbmd0aCA9IChsaWJzb2RpdW0uX2NyeXB0b19zZWNyZXRib3hfbm9uY2VieXRlcygpKSB8IDA7XG5cdFx0aWYgKG5vbmNlLmxlbmd0aCAhPT0gbm9uY2VfbGVuZ3RoKSB7XG5cdFx0XHRfZnJlZV9hbmRfdGhyb3dfdHlwZV9lcnJvcihhZGRyZXNzX3Bvb2wsIFwiaW52YWxpZCBub25jZSBsZW5ndGhcIik7XG5cdFx0fVxuXHRcdG5vbmNlX2FkZHJlc3MgPSBfdG9fYWxsb2NhdGVkX2J1Zl9hZGRyZXNzKG5vbmNlKTtcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChub25jZV9hZGRyZXNzKTtcblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBrZXkgKGJ1Zilcblx0XHRcblx0XHRrZXkgPSBfYW55X3RvX1VpbnQ4QXJyYXkoYWRkcmVzc19wb29sLCBrZXksIFwia2V5XCIpO1xuXHRcdHZhciBrZXlfYWRkcmVzcywga2V5X2xlbmd0aCA9IChsaWJzb2RpdW0uX2NyeXB0b19zZWNyZXRib3hfa2V5Ynl0ZXMoKSkgfCAwO1xuXHRcdGlmIChrZXkubGVuZ3RoICE9PSBrZXlfbGVuZ3RoKSB7XG5cdFx0XHRfZnJlZV9hbmRfdGhyb3dfdHlwZV9lcnJvcihhZGRyZXNzX3Bvb2wsIFwiaW52YWxpZCBrZXkgbGVuZ3RoXCIpO1xuXHRcdH1cblx0XHRrZXlfYWRkcmVzcyA9IF90b19hbGxvY2F0ZWRfYnVmX2FkZHJlc3Moa2V5KTtcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChrZXlfYWRkcmVzcyk7XG5cdFx0XG5cdFx0Ly8gLS0tLS0tLS0tLSBvdXRwdXQgY2lwaGVyIChidWYpXG5cdFx0XG5cdFx0dmFyIGNpcGhlcl9sZW5ndGggPSAobWVzc2FnZV9sZW5ndGgpIHwgMCxcblx0XHQgICAgY2lwaGVyID0gbmV3IEFsbG9jYXRlZEJ1ZihjaXBoZXJfbGVuZ3RoKSxcblx0XHQgICAgY2lwaGVyX2FkZHJlc3MgPSBjaXBoZXIuYWRkcmVzcztcblx0XHRcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChjaXBoZXJfYWRkcmVzcyk7XG5cdFx0XG5cdFx0Ly8gLS0tLS0tLS0tLSBvdXRwdXQgbWFjIChidWYpXG5cdFx0XG5cdFx0dmFyIG1hY19sZW5ndGggPSAobGlic29kaXVtLl9jcnlwdG9fc2VjcmV0Ym94X21hY2J5dGVzKCkpIHwgMCxcblx0XHQgICAgbWFjID0gbmV3IEFsbG9jYXRlZEJ1ZihtYWNfbGVuZ3RoKSxcblx0XHQgICAgbWFjX2FkZHJlc3MgPSBtYWMuYWRkcmVzcztcblx0XHRcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChtYWNfYWRkcmVzcyk7XG5cdFx0XG5cdFx0aWYgKChsaWJzb2RpdW0uX2NyeXB0b19zZWNyZXRib3hfZGV0YWNoZWQoY2lwaGVyX2FkZHJlc3MsIG1hY19hZGRyZXNzLCBtZXNzYWdlX2FkZHJlc3MsIG1lc3NhZ2VfbGVuZ3RoLCAwLCBub25jZV9hZGRyZXNzLCBrZXlfYWRkcmVzcykgfCAwKSA9PT0gMCkge1xuXHRcdFx0dmFyIHJldCA9IF9mb3JtYXRfb3V0cHV0KHttYWM6IG1hYywgY2lwaGVyOiBjaXBoZXJ9LCBvdXRwdXRGb3JtYXQpO1xuXHRcdFx0X2ZyZWVfYWxsKGFkZHJlc3NfcG9vbCk7XG5cdFx0XHRyZXR1cm4gcmV0O1xuXHRcdH1cblx0XHRfZnJlZV9hbmRfdGhyb3dfZXJyb3IoYWRkcmVzc19wb29sKTtcblx0XHRcblx0fVxuXG5cdGZ1bmN0aW9uIGNyeXB0b19zZWNyZXRib3hfZWFzeShtZXNzYWdlLCBub25jZSwga2V5LCBvdXRwdXRGb3JtYXQpIHtcblx0XHR2YXIgYWRkcmVzc19wb29sID0gW107XG5cdFx0X2NoZWNrX291dHB1dF9mb3JtYXQob3V0cHV0Rm9ybWF0KTtcblxuXHRcdC8vIC0tLS0tLS0tLS0gaW5wdXQ6IG1lc3NhZ2UgKHVuc2l6ZWRfYnVmKVxuXHRcdFxuXHRcdG1lc3NhZ2UgPSBfYW55X3RvX1VpbnQ4QXJyYXkoYWRkcmVzc19wb29sLCBtZXNzYWdlLCBcIm1lc3NhZ2VcIik7XG5cdFx0dmFyIG1lc3NhZ2VfYWRkcmVzcyA9IF90b19hbGxvY2F0ZWRfYnVmX2FkZHJlc3MobWVzc2FnZSksXG5cdFx0ICAgIG1lc3NhZ2VfbGVuZ3RoID0gbWVzc2FnZS5sZW5ndGg7XG5cdFx0YWRkcmVzc19wb29sLnB1c2gobWVzc2FnZV9hZGRyZXNzKTtcblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBub25jZSAoYnVmKVxuXHRcdFxuXHRcdG5vbmNlID0gX2FueV90b19VaW50OEFycmF5KGFkZHJlc3NfcG9vbCwgbm9uY2UsIFwibm9uY2VcIik7XG5cdFx0dmFyIG5vbmNlX2FkZHJlc3MsIG5vbmNlX2xlbmd0aCA9IChsaWJzb2RpdW0uX2NyeXB0b19zZWNyZXRib3hfbm9uY2VieXRlcygpKSB8IDA7XG5cdFx0aWYgKG5vbmNlLmxlbmd0aCAhPT0gbm9uY2VfbGVuZ3RoKSB7XG5cdFx0XHRfZnJlZV9hbmRfdGhyb3dfdHlwZV9lcnJvcihhZGRyZXNzX3Bvb2wsIFwiaW52YWxpZCBub25jZSBsZW5ndGhcIik7XG5cdFx0fVxuXHRcdG5vbmNlX2FkZHJlc3MgPSBfdG9fYWxsb2NhdGVkX2J1Zl9hZGRyZXNzKG5vbmNlKTtcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChub25jZV9hZGRyZXNzKTtcblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBrZXkgKGJ1Zilcblx0XHRcblx0XHRrZXkgPSBfYW55X3RvX1VpbnQ4QXJyYXkoYWRkcmVzc19wb29sLCBrZXksIFwia2V5XCIpO1xuXHRcdHZhciBrZXlfYWRkcmVzcywga2V5X2xlbmd0aCA9IChsaWJzb2RpdW0uX2NyeXB0b19zZWNyZXRib3hfa2V5Ynl0ZXMoKSkgfCAwO1xuXHRcdGlmIChrZXkubGVuZ3RoICE9PSBrZXlfbGVuZ3RoKSB7XG5cdFx0XHRfZnJlZV9hbmRfdGhyb3dfdHlwZV9lcnJvcihhZGRyZXNzX3Bvb2wsIFwiaW52YWxpZCBrZXkgbGVuZ3RoXCIpO1xuXHRcdH1cblx0XHRrZXlfYWRkcmVzcyA9IF90b19hbGxvY2F0ZWRfYnVmX2FkZHJlc3Moa2V5KTtcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChrZXlfYWRkcmVzcyk7XG5cdFx0XG5cdFx0Ly8gLS0tLS0tLS0tLSBvdXRwdXQgY2lwaGVyIChidWYpXG5cdFx0XG5cdFx0dmFyIGNpcGhlcl9sZW5ndGggPSAobWVzc2FnZV9sZW5ndGggKyBsaWJzb2RpdW0uX2NyeXB0b19zZWNyZXRib3hfbWFjYnl0ZXMoKSkgfCAwLFxuXHRcdCAgICBjaXBoZXIgPSBuZXcgQWxsb2NhdGVkQnVmKGNpcGhlcl9sZW5ndGgpLFxuXHRcdCAgICBjaXBoZXJfYWRkcmVzcyA9IGNpcGhlci5hZGRyZXNzO1xuXHRcdFxuXHRcdGFkZHJlc3NfcG9vbC5wdXNoKGNpcGhlcl9hZGRyZXNzKTtcblx0XHRcblx0XHRpZiAoKGxpYnNvZGl1bS5fY3J5cHRvX3NlY3JldGJveF9lYXN5KGNpcGhlcl9hZGRyZXNzLCBtZXNzYWdlX2FkZHJlc3MsIG1lc3NhZ2VfbGVuZ3RoLCAwLCBub25jZV9hZGRyZXNzLCBrZXlfYWRkcmVzcykgfCAwKSA9PT0gMCkge1xuXHRcdFx0dmFyIHJldCA9IF9mb3JtYXRfb3V0cHV0KGNpcGhlciwgb3V0cHV0Rm9ybWF0KTtcblx0XHRcdF9mcmVlX2FsbChhZGRyZXNzX3Bvb2wpO1xuXHRcdFx0cmV0dXJuIHJldDtcblx0XHR9XG5cdFx0X2ZyZWVfYW5kX3Rocm93X2Vycm9yKGFkZHJlc3NfcG9vbCk7XG5cdFx0XG5cdH1cblxuXHRmdW5jdGlvbiBjcnlwdG9fc2VjcmV0Ym94X29wZW5fZGV0YWNoZWQoY2lwaGVydGV4dCwgbWFjLCBub25jZSwga2V5LCBvdXRwdXRGb3JtYXQpIHtcblx0XHR2YXIgYWRkcmVzc19wb29sID0gW107XG5cdFx0X2NoZWNrX291dHB1dF9mb3JtYXQob3V0cHV0Rm9ybWF0KTtcblxuXHRcdC8vIC0tLS0tLS0tLS0gaW5wdXQ6IGNpcGhlcnRleHQgKHVuc2l6ZWRfYnVmKVxuXHRcdFxuXHRcdGNpcGhlcnRleHQgPSBfYW55X3RvX1VpbnQ4QXJyYXkoYWRkcmVzc19wb29sLCBjaXBoZXJ0ZXh0LCBcImNpcGhlcnRleHRcIik7XG5cdFx0dmFyIGNpcGhlcnRleHRfYWRkcmVzcyA9IF90b19hbGxvY2F0ZWRfYnVmX2FkZHJlc3MoY2lwaGVydGV4dCksXG5cdFx0ICAgIGNpcGhlcnRleHRfbGVuZ3RoID0gY2lwaGVydGV4dC5sZW5ndGg7XG5cdFx0YWRkcmVzc19wb29sLnB1c2goY2lwaGVydGV4dF9hZGRyZXNzKTtcblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBtYWMgKGJ1Zilcblx0XHRcblx0XHRtYWMgPSBfYW55X3RvX1VpbnQ4QXJyYXkoYWRkcmVzc19wb29sLCBtYWMsIFwibWFjXCIpO1xuXHRcdHZhciBtYWNfYWRkcmVzcywgbWFjX2xlbmd0aCA9IChsaWJzb2RpdW0uX2NyeXB0b19zZWNyZXRib3hfbWFjYnl0ZXMoKSkgfCAwO1xuXHRcdGlmIChtYWMubGVuZ3RoICE9PSBtYWNfbGVuZ3RoKSB7XG5cdFx0XHRfZnJlZV9hbmRfdGhyb3dfdHlwZV9lcnJvcihhZGRyZXNzX3Bvb2wsIFwiaW52YWxpZCBtYWMgbGVuZ3RoXCIpO1xuXHRcdH1cblx0XHRtYWNfYWRkcmVzcyA9IF90b19hbGxvY2F0ZWRfYnVmX2FkZHJlc3MobWFjKTtcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChtYWNfYWRkcmVzcyk7XG5cdFx0XG5cdFx0Ly8gLS0tLS0tLS0tLSBpbnB1dDogbm9uY2UgKGJ1Zilcblx0XHRcblx0XHRub25jZSA9IF9hbnlfdG9fVWludDhBcnJheShhZGRyZXNzX3Bvb2wsIG5vbmNlLCBcIm5vbmNlXCIpO1xuXHRcdHZhciBub25jZV9hZGRyZXNzLCBub25jZV9sZW5ndGggPSAobGlic29kaXVtLl9jcnlwdG9fc2VjcmV0Ym94X25vbmNlYnl0ZXMoKSkgfCAwO1xuXHRcdGlmIChub25jZS5sZW5ndGggIT09IG5vbmNlX2xlbmd0aCkge1xuXHRcdFx0X2ZyZWVfYW5kX3Rocm93X3R5cGVfZXJyb3IoYWRkcmVzc19wb29sLCBcImludmFsaWQgbm9uY2UgbGVuZ3RoXCIpO1xuXHRcdH1cblx0XHRub25jZV9hZGRyZXNzID0gX3RvX2FsbG9jYXRlZF9idWZfYWRkcmVzcyhub25jZSk7XG5cdFx0YWRkcmVzc19wb29sLnB1c2gobm9uY2VfYWRkcmVzcyk7XG5cdFx0XG5cdFx0Ly8gLS0tLS0tLS0tLSBpbnB1dDoga2V5IChidWYpXG5cdFx0XG5cdFx0a2V5ID0gX2FueV90b19VaW50OEFycmF5KGFkZHJlc3NfcG9vbCwga2V5LCBcImtleVwiKTtcblx0XHR2YXIga2V5X2FkZHJlc3MsIGtleV9sZW5ndGggPSAobGlic29kaXVtLl9jcnlwdG9fc2VjcmV0Ym94X2tleWJ5dGVzKCkpIHwgMDtcblx0XHRpZiAoa2V5Lmxlbmd0aCAhPT0ga2V5X2xlbmd0aCkge1xuXHRcdFx0X2ZyZWVfYW5kX3Rocm93X3R5cGVfZXJyb3IoYWRkcmVzc19wb29sLCBcImludmFsaWQga2V5IGxlbmd0aFwiKTtcblx0XHR9XG5cdFx0a2V5X2FkZHJlc3MgPSBfdG9fYWxsb2NhdGVkX2J1Zl9hZGRyZXNzKGtleSk7XG5cdFx0YWRkcmVzc19wb29sLnB1c2goa2V5X2FkZHJlc3MpO1xuXHRcdFxuXHRcdC8vIC0tLS0tLS0tLS0gb3V0cHV0IG1lc3NhZ2UgKGJ1Zilcblx0XHRcblx0XHR2YXIgbWVzc2FnZV9sZW5ndGggPSAoY2lwaGVydGV4dF9sZW5ndGgpIHwgMCxcblx0XHQgICAgbWVzc2FnZSA9IG5ldyBBbGxvY2F0ZWRCdWYobWVzc2FnZV9sZW5ndGgpLFxuXHRcdCAgICBtZXNzYWdlX2FkZHJlc3MgPSBtZXNzYWdlLmFkZHJlc3M7XG5cdFx0XG5cdFx0YWRkcmVzc19wb29sLnB1c2gobWVzc2FnZV9hZGRyZXNzKTtcblx0XHRcblx0XHRpZiAoKGxpYnNvZGl1bS5fY3J5cHRvX3NlY3JldGJveF9vcGVuX2RldGFjaGVkKG1lc3NhZ2VfYWRkcmVzcywgY2lwaGVydGV4dF9hZGRyZXNzLCBtYWNfYWRkcmVzcywgY2lwaGVydGV4dF9sZW5ndGgsIDAsIG5vbmNlX2FkZHJlc3MsIGtleV9hZGRyZXNzKSB8IDApID09PSAwKSB7XG5cdFx0XHR2YXIgcmV0ID0gX2Zvcm1hdF9vdXRwdXQobWVzc2FnZSwgb3V0cHV0Rm9ybWF0KTtcblx0XHRcdF9mcmVlX2FsbChhZGRyZXNzX3Bvb2wpO1xuXHRcdFx0cmV0dXJuIHJldDtcblx0XHR9XG5cdFx0X2ZyZWVfYW5kX3Rocm93X2Vycm9yKGFkZHJlc3NfcG9vbCk7XG5cdFx0XG5cdH1cblxuXHRmdW5jdGlvbiBjcnlwdG9fc2VjcmV0Ym94X29wZW5fZWFzeShjaXBoZXJ0ZXh0LCBub25jZSwga2V5LCBvdXRwdXRGb3JtYXQpIHtcblx0XHR2YXIgYWRkcmVzc19wb29sID0gW107XG5cdFx0X2NoZWNrX291dHB1dF9mb3JtYXQob3V0cHV0Rm9ybWF0KTtcblxuXHRcdC8vIC0tLS0tLS0tLS0gaW5wdXQ6IGNpcGhlcnRleHQgKHVuc2l6ZWRfYnVmKVxuXHRcdFxuXHRcdGNpcGhlcnRleHQgPSBfYW55X3RvX1VpbnQ4QXJyYXkoYWRkcmVzc19wb29sLCBjaXBoZXJ0ZXh0LCBcImNpcGhlcnRleHRcIik7XG5cdFx0dmFyIGNpcGhlcnRleHRfYWRkcmVzcyA9IF90b19hbGxvY2F0ZWRfYnVmX2FkZHJlc3MoY2lwaGVydGV4dCksXG5cdFx0ICAgIGNpcGhlcnRleHRfbGVuZ3RoID0gY2lwaGVydGV4dC5sZW5ndGg7XG5cdFx0YWRkcmVzc19wb29sLnB1c2goY2lwaGVydGV4dF9hZGRyZXNzKTtcblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBub25jZSAoYnVmKVxuXHRcdFxuXHRcdG5vbmNlID0gX2FueV90b19VaW50OEFycmF5KGFkZHJlc3NfcG9vbCwgbm9uY2UsIFwibm9uY2VcIik7XG5cdFx0dmFyIG5vbmNlX2FkZHJlc3MsIG5vbmNlX2xlbmd0aCA9IChsaWJzb2RpdW0uX2NyeXB0b19zZWNyZXRib3hfbm9uY2VieXRlcygpKSB8IDA7XG5cdFx0aWYgKG5vbmNlLmxlbmd0aCAhPT0gbm9uY2VfbGVuZ3RoKSB7XG5cdFx0XHRfZnJlZV9hbmRfdGhyb3dfdHlwZV9lcnJvcihhZGRyZXNzX3Bvb2wsIFwiaW52YWxpZCBub25jZSBsZW5ndGhcIik7XG5cdFx0fVxuXHRcdG5vbmNlX2FkZHJlc3MgPSBfdG9fYWxsb2NhdGVkX2J1Zl9hZGRyZXNzKG5vbmNlKTtcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChub25jZV9hZGRyZXNzKTtcblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBrZXkgKGJ1Zilcblx0XHRcblx0XHRrZXkgPSBfYW55X3RvX1VpbnQ4QXJyYXkoYWRkcmVzc19wb29sLCBrZXksIFwia2V5XCIpO1xuXHRcdHZhciBrZXlfYWRkcmVzcywga2V5X2xlbmd0aCA9IChsaWJzb2RpdW0uX2NyeXB0b19zZWNyZXRib3hfa2V5Ynl0ZXMoKSkgfCAwO1xuXHRcdGlmIChrZXkubGVuZ3RoICE9PSBrZXlfbGVuZ3RoKSB7XG5cdFx0XHRfZnJlZV9hbmRfdGhyb3dfdHlwZV9lcnJvcihhZGRyZXNzX3Bvb2wsIFwiaW52YWxpZCBrZXkgbGVuZ3RoXCIpO1xuXHRcdH1cblx0XHRrZXlfYWRkcmVzcyA9IF90b19hbGxvY2F0ZWRfYnVmX2FkZHJlc3Moa2V5KTtcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChrZXlfYWRkcmVzcyk7XG5cdFx0XG5cdFx0Ly8gLS0tLS0tLS0tLSBvdXRwdXQgbWVzc2FnZSAoYnVmKVxuXHRcdFxuXHRcdHZhciBtZXNzYWdlX2xlbmd0aCA9IChjaXBoZXJ0ZXh0X2xlbmd0aCAtIGxpYnNvZGl1bS5fY3J5cHRvX3NlY3JldGJveF9tYWNieXRlcygpKSB8IDAsXG5cdFx0ICAgIG1lc3NhZ2UgPSBuZXcgQWxsb2NhdGVkQnVmKG1lc3NhZ2VfbGVuZ3RoKSxcblx0XHQgICAgbWVzc2FnZV9hZGRyZXNzID0gbWVzc2FnZS5hZGRyZXNzO1xuXHRcdFxuXHRcdGFkZHJlc3NfcG9vbC5wdXNoKG1lc3NhZ2VfYWRkcmVzcyk7XG5cdFx0XG5cdFx0aWYgKChsaWJzb2RpdW0uX2NyeXB0b19zZWNyZXRib3hfb3Blbl9lYXN5KG1lc3NhZ2VfYWRkcmVzcywgY2lwaGVydGV4dF9hZGRyZXNzLCBjaXBoZXJ0ZXh0X2xlbmd0aCwgMCwgbm9uY2VfYWRkcmVzcywga2V5X2FkZHJlc3MpIHwgMCkgPT09IDApIHtcblx0XHRcdHZhciByZXQgPSBfZm9ybWF0X291dHB1dChtZXNzYWdlLCBvdXRwdXRGb3JtYXQpO1xuXHRcdFx0X2ZyZWVfYWxsKGFkZHJlc3NfcG9vbCk7XG5cdFx0XHRyZXR1cm4gcmV0O1xuXHRcdH1cblx0XHRfZnJlZV9hbmRfdGhyb3dfZXJyb3IoYWRkcmVzc19wb29sKTtcblx0XHRcblx0fVxuXG5cdGZ1bmN0aW9uIGNyeXB0b19zaG9ydGhhc2gobWVzc2FnZSwga2V5LCBvdXRwdXRGb3JtYXQpIHtcblx0XHR2YXIgYWRkcmVzc19wb29sID0gW107XG5cdFx0X2NoZWNrX291dHB1dF9mb3JtYXQob3V0cHV0Rm9ybWF0KTtcblxuXHRcdC8vIC0tLS0tLS0tLS0gaW5wdXQ6IG1lc3NhZ2UgKHVuc2l6ZWRfYnVmKVxuXHRcdFxuXHRcdG1lc3NhZ2UgPSBfYW55X3RvX1VpbnQ4QXJyYXkoYWRkcmVzc19wb29sLCBtZXNzYWdlLCBcIm1lc3NhZ2VcIik7XG5cdFx0dmFyIG1lc3NhZ2VfYWRkcmVzcyA9IF90b19hbGxvY2F0ZWRfYnVmX2FkZHJlc3MobWVzc2FnZSksXG5cdFx0ICAgIG1lc3NhZ2VfbGVuZ3RoID0gbWVzc2FnZS5sZW5ndGg7XG5cdFx0YWRkcmVzc19wb29sLnB1c2gobWVzc2FnZV9hZGRyZXNzKTtcblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBrZXkgKGJ1Zilcblx0XHRcblx0XHRrZXkgPSBfYW55X3RvX1VpbnQ4QXJyYXkoYWRkcmVzc19wb29sLCBrZXksIFwia2V5XCIpO1xuXHRcdHZhciBrZXlfYWRkcmVzcywga2V5X2xlbmd0aCA9IChsaWJzb2RpdW0uX2NyeXB0b19zaG9ydGhhc2hfa2V5Ynl0ZXMoKSkgfCAwO1xuXHRcdGlmIChrZXkubGVuZ3RoICE9PSBrZXlfbGVuZ3RoKSB7XG5cdFx0XHRfZnJlZV9hbmRfdGhyb3dfdHlwZV9lcnJvcihhZGRyZXNzX3Bvb2wsIFwiaW52YWxpZCBrZXkgbGVuZ3RoXCIpO1xuXHRcdH1cblx0XHRrZXlfYWRkcmVzcyA9IF90b19hbGxvY2F0ZWRfYnVmX2FkZHJlc3Moa2V5KTtcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChrZXlfYWRkcmVzcyk7XG5cdFx0XG5cdFx0Ly8gLS0tLS0tLS0tLSBvdXRwdXQgaGFzaCAoYnVmKVxuXHRcdFxuXHRcdHZhciBoYXNoX2xlbmd0aCA9IChsaWJzb2RpdW0uX2NyeXB0b19zaG9ydGhhc2hfYnl0ZXMoKSkgfCAwLFxuXHRcdCAgICBoYXNoID0gbmV3IEFsbG9jYXRlZEJ1ZihoYXNoX2xlbmd0aCksXG5cdFx0ICAgIGhhc2hfYWRkcmVzcyA9IGhhc2guYWRkcmVzcztcblx0XHRcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChoYXNoX2FkZHJlc3MpO1xuXHRcdFxuXHRcdGlmICgobGlic29kaXVtLl9jcnlwdG9fc2hvcnRoYXNoKGhhc2hfYWRkcmVzcywgbWVzc2FnZV9hZGRyZXNzLCBtZXNzYWdlX2xlbmd0aCwgMCwga2V5X2FkZHJlc3MpIHwgMCkgPT09IDApIHtcblx0XHRcdHZhciByZXQgPSBfZm9ybWF0X291dHB1dChoYXNoLCBvdXRwdXRGb3JtYXQpO1xuXHRcdFx0X2ZyZWVfYWxsKGFkZHJlc3NfcG9vbCk7XG5cdFx0XHRyZXR1cm4gcmV0O1xuXHRcdH1cblx0XHRfZnJlZV9hbmRfdGhyb3dfZXJyb3IoYWRkcmVzc19wb29sKTtcblx0XHRcblx0fVxuXG5cdGZ1bmN0aW9uIGNyeXB0b19zaWduKG1lc3NhZ2UsIHByaXZhdGVLZXksIG91dHB1dEZvcm1hdCkge1xuXHRcdHZhciBhZGRyZXNzX3Bvb2wgPSBbXTtcblx0XHRfY2hlY2tfb3V0cHV0X2Zvcm1hdChvdXRwdXRGb3JtYXQpO1xuXG5cdFx0Ly8gLS0tLS0tLS0tLSBpbnB1dDogbWVzc2FnZSAodW5zaXplZF9idWYpXG5cdFx0XG5cdFx0bWVzc2FnZSA9IF9hbnlfdG9fVWludDhBcnJheShhZGRyZXNzX3Bvb2wsIG1lc3NhZ2UsIFwibWVzc2FnZVwiKTtcblx0XHR2YXIgbWVzc2FnZV9hZGRyZXNzID0gX3RvX2FsbG9jYXRlZF9idWZfYWRkcmVzcyhtZXNzYWdlKSxcblx0XHQgICAgbWVzc2FnZV9sZW5ndGggPSBtZXNzYWdlLmxlbmd0aDtcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChtZXNzYWdlX2FkZHJlc3MpO1xuXHRcdFxuXHRcdC8vIC0tLS0tLS0tLS0gaW5wdXQ6IHByaXZhdGVLZXkgKGJ1Zilcblx0XHRcblx0XHRwcml2YXRlS2V5ID0gX2FueV90b19VaW50OEFycmF5KGFkZHJlc3NfcG9vbCwgcHJpdmF0ZUtleSwgXCJwcml2YXRlS2V5XCIpO1xuXHRcdHZhciBwcml2YXRlS2V5X2FkZHJlc3MsIHByaXZhdGVLZXlfbGVuZ3RoID0gKGxpYnNvZGl1bS5fY3J5cHRvX3NpZ25fc2VjcmV0a2V5Ynl0ZXMoKSkgfCAwO1xuXHRcdGlmIChwcml2YXRlS2V5Lmxlbmd0aCAhPT0gcHJpdmF0ZUtleV9sZW5ndGgpIHtcblx0XHRcdF9mcmVlX2FuZF90aHJvd190eXBlX2Vycm9yKGFkZHJlc3NfcG9vbCwgXCJpbnZhbGlkIHByaXZhdGVLZXkgbGVuZ3RoXCIpO1xuXHRcdH1cblx0XHRwcml2YXRlS2V5X2FkZHJlc3MgPSBfdG9fYWxsb2NhdGVkX2J1Zl9hZGRyZXNzKHByaXZhdGVLZXkpO1xuXHRcdGFkZHJlc3NfcG9vbC5wdXNoKHByaXZhdGVLZXlfYWRkcmVzcyk7XG5cdFx0XG5cdFx0Ly8gLS0tLS0tLS0tLSBvdXRwdXQgc2lnbmF0dXJlIChidWYpXG5cdFx0XG5cdFx0dmFyIHNpZ25hdHVyZV9sZW5ndGggPSAobWVzc2FnZS5sZW5ndGggKyBsaWJzb2RpdW0uX2NyeXB0b19zaWduX2J5dGVzKCkpIHwgMCxcblx0XHQgICAgc2lnbmF0dXJlID0gbmV3IEFsbG9jYXRlZEJ1ZihzaWduYXR1cmVfbGVuZ3RoKSxcblx0XHQgICAgc2lnbmF0dXJlX2FkZHJlc3MgPSBzaWduYXR1cmUuYWRkcmVzcztcblx0XHRcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChzaWduYXR1cmVfYWRkcmVzcyk7XG5cdFx0XG5cdFx0aWYgKChsaWJzb2RpdW0uX2NyeXB0b19zaWduKHNpZ25hdHVyZV9hZGRyZXNzLCBudWxsLCBtZXNzYWdlX2FkZHJlc3MsIG1lc3NhZ2VfbGVuZ3RoLCAwLCBwcml2YXRlS2V5X2FkZHJlc3MpIHwgMCkgPT09IDApIHtcblx0XHRcdHZhciByZXQgPSBfZm9ybWF0X291dHB1dChzaWduYXR1cmUsIG91dHB1dEZvcm1hdCk7XG5cdFx0XHRfZnJlZV9hbGwoYWRkcmVzc19wb29sKTtcblx0XHRcdHJldHVybiByZXQ7XG5cdFx0fVxuXHRcdF9mcmVlX2FuZF90aHJvd19lcnJvcihhZGRyZXNzX3Bvb2wpO1xuXHRcdFxuXHR9XG5cblx0ZnVuY3Rpb24gY3J5cHRvX3NpZ25fZGV0YWNoZWQobWVzc2FnZSwgcHJpdmF0ZUtleSwgb3V0cHV0Rm9ybWF0KSB7XG5cdFx0dmFyIGFkZHJlc3NfcG9vbCA9IFtdO1xuXHRcdF9jaGVja19vdXRwdXRfZm9ybWF0KG91dHB1dEZvcm1hdCk7XG5cblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBtZXNzYWdlICh1bnNpemVkX2J1Zilcblx0XHRcblx0XHRtZXNzYWdlID0gX2FueV90b19VaW50OEFycmF5KGFkZHJlc3NfcG9vbCwgbWVzc2FnZSwgXCJtZXNzYWdlXCIpO1xuXHRcdHZhciBtZXNzYWdlX2FkZHJlc3MgPSBfdG9fYWxsb2NhdGVkX2J1Zl9hZGRyZXNzKG1lc3NhZ2UpLFxuXHRcdCAgICBtZXNzYWdlX2xlbmd0aCA9IG1lc3NhZ2UubGVuZ3RoO1xuXHRcdGFkZHJlc3NfcG9vbC5wdXNoKG1lc3NhZ2VfYWRkcmVzcyk7XG5cdFx0XG5cdFx0Ly8gLS0tLS0tLS0tLSBpbnB1dDogcHJpdmF0ZUtleSAoYnVmKVxuXHRcdFxuXHRcdHByaXZhdGVLZXkgPSBfYW55X3RvX1VpbnQ4QXJyYXkoYWRkcmVzc19wb29sLCBwcml2YXRlS2V5LCBcInByaXZhdGVLZXlcIik7XG5cdFx0dmFyIHByaXZhdGVLZXlfYWRkcmVzcywgcHJpdmF0ZUtleV9sZW5ndGggPSAobGlic29kaXVtLl9jcnlwdG9fc2lnbl9zZWNyZXRrZXlieXRlcygpKSB8IDA7XG5cdFx0aWYgKHByaXZhdGVLZXkubGVuZ3RoICE9PSBwcml2YXRlS2V5X2xlbmd0aCkge1xuXHRcdFx0X2ZyZWVfYW5kX3Rocm93X3R5cGVfZXJyb3IoYWRkcmVzc19wb29sLCBcImludmFsaWQgcHJpdmF0ZUtleSBsZW5ndGhcIik7XG5cdFx0fVxuXHRcdHByaXZhdGVLZXlfYWRkcmVzcyA9IF90b19hbGxvY2F0ZWRfYnVmX2FkZHJlc3MocHJpdmF0ZUtleSk7XG5cdFx0YWRkcmVzc19wb29sLnB1c2gocHJpdmF0ZUtleV9hZGRyZXNzKTtcblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIG91dHB1dCBzaWduYXR1cmUgKGJ1Zilcblx0XHRcblx0XHR2YXIgc2lnbmF0dXJlX2xlbmd0aCA9IChsaWJzb2RpdW0uX2NyeXB0b19zaWduX2J5dGVzKCkpIHwgMCxcblx0XHQgICAgc2lnbmF0dXJlID0gbmV3IEFsbG9jYXRlZEJ1ZihzaWduYXR1cmVfbGVuZ3RoKSxcblx0XHQgICAgc2lnbmF0dXJlX2FkZHJlc3MgPSBzaWduYXR1cmUuYWRkcmVzcztcblx0XHRcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChzaWduYXR1cmVfYWRkcmVzcyk7XG5cdFx0XG5cdFx0aWYgKChsaWJzb2RpdW0uX2NyeXB0b19zaWduX2RldGFjaGVkKHNpZ25hdHVyZV9hZGRyZXNzLCBudWxsLCBtZXNzYWdlX2FkZHJlc3MsIG1lc3NhZ2VfbGVuZ3RoLCAwLCBwcml2YXRlS2V5X2FkZHJlc3MpIHwgMCkgPT09IDApIHtcblx0XHRcdHZhciByZXQgPSBfZm9ybWF0X291dHB1dChzaWduYXR1cmUsIG91dHB1dEZvcm1hdCk7XG5cdFx0XHRfZnJlZV9hbGwoYWRkcmVzc19wb29sKTtcblx0XHRcdHJldHVybiByZXQ7XG5cdFx0fVxuXHRcdF9mcmVlX2FuZF90aHJvd19lcnJvcihhZGRyZXNzX3Bvb2wpO1xuXHRcdFxuXHR9XG5cblx0ZnVuY3Rpb24gY3J5cHRvX3NpZ25fZWQyNTUxOV9wa190b19jdXJ2ZTI1NTE5KGVkUGssIG91dHB1dEZvcm1hdCkge1xuXHRcdHZhciBhZGRyZXNzX3Bvb2wgPSBbXTtcblx0XHRfY2hlY2tfb3V0cHV0X2Zvcm1hdChvdXRwdXRGb3JtYXQpO1xuXG5cdFx0Ly8gLS0tLS0tLS0tLSBpbnB1dDogZWRQayAoYnVmKVxuXHRcdFxuXHRcdGVkUGsgPSBfYW55X3RvX1VpbnQ4QXJyYXkoYWRkcmVzc19wb29sLCBlZFBrLCBcImVkUGtcIik7XG5cdFx0dmFyIGVkUGtfYWRkcmVzcywgZWRQa19sZW5ndGggPSAobGlic29kaXVtLl9jcnlwdG9fc2lnbl9wdWJsaWNrZXlieXRlcygpKSB8IDA7XG5cdFx0aWYgKGVkUGsubGVuZ3RoICE9PSBlZFBrX2xlbmd0aCkge1xuXHRcdFx0X2ZyZWVfYW5kX3Rocm93X3R5cGVfZXJyb3IoYWRkcmVzc19wb29sLCBcImludmFsaWQgZWRQayBsZW5ndGhcIik7XG5cdFx0fVxuXHRcdGVkUGtfYWRkcmVzcyA9IF90b19hbGxvY2F0ZWRfYnVmX2FkZHJlc3MoZWRQayk7XG5cdFx0YWRkcmVzc19wb29sLnB1c2goZWRQa19hZGRyZXNzKTtcblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIG91dHB1dCBjUGsgKGJ1Zilcblx0XHRcblx0XHR2YXIgY1BrX2xlbmd0aCA9IChsaWJzb2RpdW0uX2NyeXB0b19zY2FsYXJtdWx0X3NjYWxhcmJ5dGVzKCkpIHwgMCxcblx0XHQgICAgY1BrID0gbmV3IEFsbG9jYXRlZEJ1ZihjUGtfbGVuZ3RoKSxcblx0XHQgICAgY1BrX2FkZHJlc3MgPSBjUGsuYWRkcmVzcztcblx0XHRcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChjUGtfYWRkcmVzcyk7XG5cdFx0XG5cdFx0aWYgKChsaWJzb2RpdW0uX2NyeXB0b19zaWduX2VkMjU1MTlfcGtfdG9fY3VydmUyNTUxOShjUGtfYWRkcmVzcywgZWRQa19hZGRyZXNzKSB8IDApID09PSAwKSB7XG5cdFx0XHR2YXIgcmV0ID0gX2Zvcm1hdF9vdXRwdXQoY1BrLCBvdXRwdXRGb3JtYXQpO1xuXHRcdFx0X2ZyZWVfYWxsKGFkZHJlc3NfcG9vbCk7XG5cdFx0XHRyZXR1cm4gcmV0O1xuXHRcdH1cblx0XHRfZnJlZV9hbmRfdGhyb3dfZXJyb3IoYWRkcmVzc19wb29sKTtcblx0XHRcblx0fVxuXG5cdGZ1bmN0aW9uIGNyeXB0b19zaWduX2VkMjU1MTlfc2tfdG9fY3VydmUyNTUxOShlZFNrLCBvdXRwdXRGb3JtYXQpIHtcblx0XHR2YXIgYWRkcmVzc19wb29sID0gW107XG5cdFx0X2NoZWNrX291dHB1dF9mb3JtYXQob3V0cHV0Rm9ybWF0KTtcblxuXHRcdC8vIC0tLS0tLS0tLS0gaW5wdXQ6IGVkU2sgKGJ1Zilcblx0XHRcblx0XHRlZFNrID0gX2FueV90b19VaW50OEFycmF5KGFkZHJlc3NfcG9vbCwgZWRTaywgXCJlZFNrXCIpO1xuXHRcdHZhciBlZFNrX2FkZHJlc3MsIGVkU2tfbGVuZ3RoID0gKGxpYnNvZGl1bS5fY3J5cHRvX3NpZ25fc2VjcmV0a2V5Ynl0ZXMoKSkgfCAwO1xuXHRcdGlmIChlZFNrLmxlbmd0aCAhPT0gZWRTa19sZW5ndGgpIHtcblx0XHRcdF9mcmVlX2FuZF90aHJvd190eXBlX2Vycm9yKGFkZHJlc3NfcG9vbCwgXCJpbnZhbGlkIGVkU2sgbGVuZ3RoXCIpO1xuXHRcdH1cblx0XHRlZFNrX2FkZHJlc3MgPSBfdG9fYWxsb2NhdGVkX2J1Zl9hZGRyZXNzKGVkU2spO1xuXHRcdGFkZHJlc3NfcG9vbC5wdXNoKGVkU2tfYWRkcmVzcyk7XG5cdFx0XG5cdFx0Ly8gLS0tLS0tLS0tLSBvdXRwdXQgY1NrIChidWYpXG5cdFx0XG5cdFx0dmFyIGNTa19sZW5ndGggPSAobGlic29kaXVtLl9jcnlwdG9fc2NhbGFybXVsdF9zY2FsYXJieXRlcygpKSB8IDAsXG5cdFx0ICAgIGNTayA9IG5ldyBBbGxvY2F0ZWRCdWYoY1NrX2xlbmd0aCksXG5cdFx0ICAgIGNTa19hZGRyZXNzID0gY1NrLmFkZHJlc3M7XG5cdFx0XG5cdFx0YWRkcmVzc19wb29sLnB1c2goY1NrX2FkZHJlc3MpO1xuXHRcdFxuXHRcdGlmICgobGlic29kaXVtLl9jcnlwdG9fc2lnbl9lZDI1NTE5X3NrX3RvX2N1cnZlMjU1MTkoY1NrX2FkZHJlc3MsIGVkU2tfYWRkcmVzcykgfCAwKSA9PT0gMCkge1xuXHRcdFx0dmFyIHJldCA9IF9mb3JtYXRfb3V0cHV0KGNTaywgb3V0cHV0Rm9ybWF0KTtcblx0XHRcdF9mcmVlX2FsbChhZGRyZXNzX3Bvb2wpO1xuXHRcdFx0cmV0dXJuIHJldDtcblx0XHR9XG5cdFx0X2ZyZWVfYW5kX3Rocm93X2Vycm9yKGFkZHJlc3NfcG9vbCk7XG5cdFx0XG5cdH1cblxuXHRmdW5jdGlvbiBjcnlwdG9fc2lnbl9lZDI1NTE5X3NrX3RvX3BrKHByaXZhdGVLZXksIG91dHB1dEZvcm1hdCkge1xuXHRcdHZhciBhZGRyZXNzX3Bvb2wgPSBbXTtcblx0XHRfY2hlY2tfb3V0cHV0X2Zvcm1hdChvdXRwdXRGb3JtYXQpO1xuXG5cdFx0Ly8gLS0tLS0tLS0tLSBpbnB1dDogcHJpdmF0ZUtleSAoYnVmKVxuXHRcdFxuXHRcdHByaXZhdGVLZXkgPSBfYW55X3RvX1VpbnQ4QXJyYXkoYWRkcmVzc19wb29sLCBwcml2YXRlS2V5LCBcInByaXZhdGVLZXlcIik7XG5cdFx0dmFyIHByaXZhdGVLZXlfYWRkcmVzcywgcHJpdmF0ZUtleV9sZW5ndGggPSAobGlic29kaXVtLl9jcnlwdG9fc2lnbl9zZWNyZXRrZXlieXRlcygpKSB8IDA7XG5cdFx0aWYgKHByaXZhdGVLZXkubGVuZ3RoICE9PSBwcml2YXRlS2V5X2xlbmd0aCkge1xuXHRcdFx0X2ZyZWVfYW5kX3Rocm93X3R5cGVfZXJyb3IoYWRkcmVzc19wb29sLCBcImludmFsaWQgcHJpdmF0ZUtleSBsZW5ndGhcIik7XG5cdFx0fVxuXHRcdHByaXZhdGVLZXlfYWRkcmVzcyA9IF90b19hbGxvY2F0ZWRfYnVmX2FkZHJlc3MocHJpdmF0ZUtleSk7XG5cdFx0YWRkcmVzc19wb29sLnB1c2gocHJpdmF0ZUtleV9hZGRyZXNzKTtcblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIG91dHB1dCBwdWJsaWNLZXkgKGJ1Zilcblx0XHRcblx0XHR2YXIgcHVibGljS2V5X2xlbmd0aCA9IChsaWJzb2RpdW0uX2NyeXB0b19zaWduX3B1YmxpY2tleWJ5dGVzKCkpIHwgMCxcblx0XHQgICAgcHVibGljS2V5ID0gbmV3IEFsbG9jYXRlZEJ1ZihwdWJsaWNLZXlfbGVuZ3RoKSxcblx0XHQgICAgcHVibGljS2V5X2FkZHJlc3MgPSBwdWJsaWNLZXkuYWRkcmVzcztcblx0XHRcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChwdWJsaWNLZXlfYWRkcmVzcyk7XG5cdFx0XG5cdFx0aWYgKChsaWJzb2RpdW0uX2NyeXB0b19zaWduX2VkMjU1MTlfc2tfdG9fcGsocHVibGljS2V5X2FkZHJlc3MsIHByaXZhdGVLZXlfYWRkcmVzcykgfCAwKSA9PT0gMCkge1xuXHRcdFx0dmFyIHJldCA9IF9mb3JtYXRfb3V0cHV0KHB1YmxpY0tleSwgb3V0cHV0Rm9ybWF0KTtcblx0XHRcdF9mcmVlX2FsbChhZGRyZXNzX3Bvb2wpO1xuXHRcdFx0cmV0dXJuIHJldDtcblx0XHR9XG5cdFx0X2ZyZWVfYW5kX3Rocm93X2Vycm9yKGFkZHJlc3NfcG9vbCk7XG5cdFx0XG5cdH1cblxuXHRmdW5jdGlvbiBjcnlwdG9fc2lnbl9lZDI1NTE5X3NrX3RvX3NlZWQocHJpdmF0ZUtleSwgb3V0cHV0Rm9ybWF0KSB7XG5cdFx0dmFyIGFkZHJlc3NfcG9vbCA9IFtdO1xuXHRcdF9jaGVja19vdXRwdXRfZm9ybWF0KG91dHB1dEZvcm1hdCk7XG5cblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBwcml2YXRlS2V5IChidWYpXG5cdFx0XG5cdFx0cHJpdmF0ZUtleSA9IF9hbnlfdG9fVWludDhBcnJheShhZGRyZXNzX3Bvb2wsIHByaXZhdGVLZXksIFwicHJpdmF0ZUtleVwiKTtcblx0XHR2YXIgcHJpdmF0ZUtleV9hZGRyZXNzLCBwcml2YXRlS2V5X2xlbmd0aCA9IChsaWJzb2RpdW0uX2NyeXB0b19zaWduX3NlY3JldGtleWJ5dGVzKCkpIHwgMDtcblx0XHRpZiAocHJpdmF0ZUtleS5sZW5ndGggIT09IHByaXZhdGVLZXlfbGVuZ3RoKSB7XG5cdFx0XHRfZnJlZV9hbmRfdGhyb3dfdHlwZV9lcnJvcihhZGRyZXNzX3Bvb2wsIFwiaW52YWxpZCBwcml2YXRlS2V5IGxlbmd0aFwiKTtcblx0XHR9XG5cdFx0cHJpdmF0ZUtleV9hZGRyZXNzID0gX3RvX2FsbG9jYXRlZF9idWZfYWRkcmVzcyhwcml2YXRlS2V5KTtcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChwcml2YXRlS2V5X2FkZHJlc3MpO1xuXHRcdFxuXHRcdC8vIC0tLS0tLS0tLS0gb3V0cHV0IHNlZWQgKGJ1Zilcblx0XHRcblx0XHR2YXIgc2VlZF9sZW5ndGggPSAobGlic29kaXVtLl9jcnlwdG9fc2lnbl9zZWVkYnl0ZXMoKSkgfCAwLFxuXHRcdCAgICBzZWVkID0gbmV3IEFsbG9jYXRlZEJ1ZihzZWVkX2xlbmd0aCksXG5cdFx0ICAgIHNlZWRfYWRkcmVzcyA9IHNlZWQuYWRkcmVzcztcblx0XHRcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChzZWVkX2FkZHJlc3MpO1xuXHRcdFxuXHRcdGlmICgobGlic29kaXVtLl9jcnlwdG9fc2lnbl9lZDI1NTE5X3NrX3RvX3NlZWQoc2VlZF9hZGRyZXNzLCBwcml2YXRlS2V5X2FkZHJlc3MpIHwgMCkgPT09IDApIHtcblx0XHRcdHZhciByZXQgPSBfZm9ybWF0X291dHB1dChzZWVkLCBvdXRwdXRGb3JtYXQpO1xuXHRcdFx0X2ZyZWVfYWxsKGFkZHJlc3NfcG9vbCk7XG5cdFx0XHRyZXR1cm4gcmV0O1xuXHRcdH1cblx0XHRfZnJlZV9hbmRfdGhyb3dfZXJyb3IoYWRkcmVzc19wb29sKTtcblx0XHRcblx0fVxuXG5cdGZ1bmN0aW9uIGNyeXB0b19zaWduX2tleXBhaXIob3V0cHV0Rm9ybWF0KSB7XG5cdFx0dmFyIGFkZHJlc3NfcG9vbCA9IFtdO1xuXHRcdF9jaGVja19vdXRwdXRfZm9ybWF0KG91dHB1dEZvcm1hdCk7XG5cblx0XHQvLyAtLS0tLS0tLS0tIG91dHB1dCBwdWJsaWNLZXkgKGJ1Zilcblx0XHRcblx0XHR2YXIgcHVibGljS2V5X2xlbmd0aCA9IChsaWJzb2RpdW0uX2NyeXB0b19zaWduX3B1YmxpY2tleWJ5dGVzKCkpIHwgMCxcblx0XHQgICAgcHVibGljS2V5ID0gbmV3IEFsbG9jYXRlZEJ1ZihwdWJsaWNLZXlfbGVuZ3RoKSxcblx0XHQgICAgcHVibGljS2V5X2FkZHJlc3MgPSBwdWJsaWNLZXkuYWRkcmVzcztcblx0XHRcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChwdWJsaWNLZXlfYWRkcmVzcyk7XG5cdFx0XG5cdFx0Ly8gLS0tLS0tLS0tLSBvdXRwdXQgcHJpdmF0ZUtleSAoYnVmKVxuXHRcdFxuXHRcdHZhciBwcml2YXRlS2V5X2xlbmd0aCA9IChsaWJzb2RpdW0uX2NyeXB0b19zaWduX3NlY3JldGtleWJ5dGVzKCkpIHwgMCxcblx0XHQgICAgcHJpdmF0ZUtleSA9IG5ldyBBbGxvY2F0ZWRCdWYocHJpdmF0ZUtleV9sZW5ndGgpLFxuXHRcdCAgICBwcml2YXRlS2V5X2FkZHJlc3MgPSBwcml2YXRlS2V5LmFkZHJlc3M7XG5cdFx0XG5cdFx0YWRkcmVzc19wb29sLnB1c2gocHJpdmF0ZUtleV9hZGRyZXNzKTtcblx0XHRcblx0XHRpZiAoKGxpYnNvZGl1bS5fY3J5cHRvX3NpZ25fa2V5cGFpcihwdWJsaWNLZXlfYWRkcmVzcywgcHJpdmF0ZUtleV9hZGRyZXNzKSB8IDApID09PSAwKSB7XG5cdFx0XHR2YXIgcmV0ID0gX2Zvcm1hdF9vdXRwdXQoe3B1YmxpY0tleTogcHVibGljS2V5LCBwcml2YXRlS2V5OiBwcml2YXRlS2V5LCBrZXlUeXBlOiAnZWQyNTUxOSd9LCBvdXRwdXRGb3JtYXQpO1xuXHRcdFx0X2ZyZWVfYWxsKGFkZHJlc3NfcG9vbCk7XG5cdFx0XHRyZXR1cm4gcmV0O1xuXHRcdH1cblx0XHRfZnJlZV9hbmRfdGhyb3dfZXJyb3IoYWRkcmVzc19wb29sKTtcblx0XHRcblx0fVxuXG5cdGZ1bmN0aW9uIGNyeXB0b19zaWduX29wZW4oc2lnbmVkTWVzc2FnZSwgcHVibGljS2V5LCBvdXRwdXRGb3JtYXQpIHtcblx0XHR2YXIgYWRkcmVzc19wb29sID0gW107XG5cdFx0X2NoZWNrX291dHB1dF9mb3JtYXQob3V0cHV0Rm9ybWF0KTtcblxuXHRcdC8vIC0tLS0tLS0tLS0gaW5wdXQ6IHNpZ25lZE1lc3NhZ2UgKHVuc2l6ZWRfYnVmKVxuXHRcdFxuXHRcdHNpZ25lZE1lc3NhZ2UgPSBfYW55X3RvX1VpbnQ4QXJyYXkoYWRkcmVzc19wb29sLCBzaWduZWRNZXNzYWdlLCBcInNpZ25lZE1lc3NhZ2VcIik7XG5cdFx0dmFyIHNpZ25lZE1lc3NhZ2VfYWRkcmVzcyA9IF90b19hbGxvY2F0ZWRfYnVmX2FkZHJlc3Moc2lnbmVkTWVzc2FnZSksXG5cdFx0ICAgIHNpZ25lZE1lc3NhZ2VfbGVuZ3RoID0gc2lnbmVkTWVzc2FnZS5sZW5ndGg7XG5cdFx0YWRkcmVzc19wb29sLnB1c2goc2lnbmVkTWVzc2FnZV9hZGRyZXNzKTtcblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBwdWJsaWNLZXkgKGJ1Zilcblx0XHRcblx0XHRwdWJsaWNLZXkgPSBfYW55X3RvX1VpbnQ4QXJyYXkoYWRkcmVzc19wb29sLCBwdWJsaWNLZXksIFwicHVibGljS2V5XCIpO1xuXHRcdHZhciBwdWJsaWNLZXlfYWRkcmVzcywgcHVibGljS2V5X2xlbmd0aCA9IChsaWJzb2RpdW0uX2NyeXB0b19zaWduX3B1YmxpY2tleWJ5dGVzKCkpIHwgMDtcblx0XHRpZiAocHVibGljS2V5Lmxlbmd0aCAhPT0gcHVibGljS2V5X2xlbmd0aCkge1xuXHRcdFx0X2ZyZWVfYW5kX3Rocm93X3R5cGVfZXJyb3IoYWRkcmVzc19wb29sLCBcImludmFsaWQgcHVibGljS2V5IGxlbmd0aFwiKTtcblx0XHR9XG5cdFx0cHVibGljS2V5X2FkZHJlc3MgPSBfdG9fYWxsb2NhdGVkX2J1Zl9hZGRyZXNzKHB1YmxpY0tleSk7XG5cdFx0YWRkcmVzc19wb29sLnB1c2gocHVibGljS2V5X2FkZHJlc3MpO1xuXHRcdFxuXHRcdC8vIC0tLS0tLS0tLS0gb3V0cHV0IG1lc3NhZ2UgKGJ1Zilcblx0XHRcblx0XHR2YXIgbWVzc2FnZV9sZW5ndGggPSAoc2lnbmVkTWVzc2FnZV9sZW5ndGggLSBsaWJzb2RpdW0uX2NyeXB0b19zaWduX2J5dGVzKCkpIHwgMCxcblx0XHQgICAgbWVzc2FnZSA9IG5ldyBBbGxvY2F0ZWRCdWYobWVzc2FnZV9sZW5ndGgpLFxuXHRcdCAgICBtZXNzYWdlX2FkZHJlc3MgPSBtZXNzYWdlLmFkZHJlc3M7XG5cdFx0XG5cdFx0YWRkcmVzc19wb29sLnB1c2gobWVzc2FnZV9hZGRyZXNzKTtcblx0XHRcblx0XHRpZiAoKGxpYnNvZGl1bS5fY3J5cHRvX3NpZ25fb3BlbihtZXNzYWdlX2FkZHJlc3MsIG51bGwsIHNpZ25lZE1lc3NhZ2VfYWRkcmVzcywgc2lnbmVkTWVzc2FnZV9sZW5ndGgsIDAsIHB1YmxpY0tleV9hZGRyZXNzKSB8IDApID09PSAwKSB7XG5cdFx0XHR2YXIgcmV0ID0gX2Zvcm1hdF9vdXRwdXQobWVzc2FnZSwgb3V0cHV0Rm9ybWF0KTtcblx0XHRcdF9mcmVlX2FsbChhZGRyZXNzX3Bvb2wpO1xuXHRcdFx0cmV0dXJuIHJldDtcblx0XHR9XG5cdFx0X2ZyZWVfYW5kX3Rocm93X2Vycm9yKGFkZHJlc3NfcG9vbCk7XG5cdFx0XG5cdH1cblxuXHRmdW5jdGlvbiBjcnlwdG9fc2lnbl9zZWVkX2tleXBhaXIoc2VlZCwgb3V0cHV0Rm9ybWF0KSB7XG5cdFx0dmFyIGFkZHJlc3NfcG9vbCA9IFtdO1xuXHRcdF9jaGVja19vdXRwdXRfZm9ybWF0KG91dHB1dEZvcm1hdCk7XG5cblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBzZWVkIChidWYpXG5cdFx0XG5cdFx0c2VlZCA9IF9hbnlfdG9fVWludDhBcnJheShhZGRyZXNzX3Bvb2wsIHNlZWQsIFwic2VlZFwiKTtcblx0XHR2YXIgc2VlZF9hZGRyZXNzLCBzZWVkX2xlbmd0aCA9IChsaWJzb2RpdW0uX2NyeXB0b19zaWduX3NlZWRieXRlcygpKSB8IDA7XG5cdFx0aWYgKHNlZWQubGVuZ3RoICE9PSBzZWVkX2xlbmd0aCkge1xuXHRcdFx0X2ZyZWVfYW5kX3Rocm93X3R5cGVfZXJyb3IoYWRkcmVzc19wb29sLCBcImludmFsaWQgc2VlZCBsZW5ndGhcIik7XG5cdFx0fVxuXHRcdHNlZWRfYWRkcmVzcyA9IF90b19hbGxvY2F0ZWRfYnVmX2FkZHJlc3Moc2VlZCk7XG5cdFx0YWRkcmVzc19wb29sLnB1c2goc2VlZF9hZGRyZXNzKTtcblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIG91dHB1dCBwdWJsaWNLZXkgKGJ1Zilcblx0XHRcblx0XHR2YXIgcHVibGljS2V5X2xlbmd0aCA9IChsaWJzb2RpdW0uX2NyeXB0b19zaWduX3B1YmxpY2tleWJ5dGVzKCkpIHwgMCxcblx0XHQgICAgcHVibGljS2V5ID0gbmV3IEFsbG9jYXRlZEJ1ZihwdWJsaWNLZXlfbGVuZ3RoKSxcblx0XHQgICAgcHVibGljS2V5X2FkZHJlc3MgPSBwdWJsaWNLZXkuYWRkcmVzcztcblx0XHRcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChwdWJsaWNLZXlfYWRkcmVzcyk7XG5cdFx0XG5cdFx0Ly8gLS0tLS0tLS0tLSBvdXRwdXQgcHJpdmF0ZUtleSAoYnVmKVxuXHRcdFxuXHRcdHZhciBwcml2YXRlS2V5X2xlbmd0aCA9IChsaWJzb2RpdW0uX2NyeXB0b19zaWduX3NlY3JldGtleWJ5dGVzKCkpIHwgMCxcblx0XHQgICAgcHJpdmF0ZUtleSA9IG5ldyBBbGxvY2F0ZWRCdWYocHJpdmF0ZUtleV9sZW5ndGgpLFxuXHRcdCAgICBwcml2YXRlS2V5X2FkZHJlc3MgPSBwcml2YXRlS2V5LmFkZHJlc3M7XG5cdFx0XG5cdFx0YWRkcmVzc19wb29sLnB1c2gocHJpdmF0ZUtleV9hZGRyZXNzKTtcblx0XHRcblx0XHRpZiAoKGxpYnNvZGl1bS5fY3J5cHRvX3NpZ25fc2VlZF9rZXlwYWlyKHB1YmxpY0tleV9hZGRyZXNzLCBwcml2YXRlS2V5X2FkZHJlc3MsIHNlZWRfYWRkcmVzcykgfCAwKSA9PT0gMCkge1xuXHRcdFx0dmFyIHJldCA9IF9mb3JtYXRfb3V0cHV0KHtwdWJsaWNLZXk6IHB1YmxpY0tleSwgcHJpdmF0ZUtleTogcHJpdmF0ZUtleSwga2V5VHlwZTogXCJlZDI1NTE5XCJ9LCBvdXRwdXRGb3JtYXQpO1xuXHRcdFx0X2ZyZWVfYWxsKGFkZHJlc3NfcG9vbCk7XG5cdFx0XHRyZXR1cm4gcmV0O1xuXHRcdH1cblx0XHRfZnJlZV9hbmRfdGhyb3dfZXJyb3IoYWRkcmVzc19wb29sKTtcblx0XHRcblx0fVxuXG5cdGZ1bmN0aW9uIGNyeXB0b19zaWduX3ZlcmlmeV9kZXRhY2hlZChzaWduYXR1cmUsIG1lc3NhZ2UsIHB1YmxpY0tleSkge1xuXHRcdHZhciBhZGRyZXNzX3Bvb2wgPSBbXTtcblxuXHRcdC8vIC0tLS0tLS0tLS0gaW5wdXQ6IHNpZ25hdHVyZSAoYnVmKVxuXHRcdFxuXHRcdHNpZ25hdHVyZSA9IF9hbnlfdG9fVWludDhBcnJheShhZGRyZXNzX3Bvb2wsIHNpZ25hdHVyZSwgXCJzaWduYXR1cmVcIik7XG5cdFx0dmFyIHNpZ25hdHVyZV9hZGRyZXNzLCBzaWduYXR1cmVfbGVuZ3RoID0gKGxpYnNvZGl1bS5fY3J5cHRvX3NpZ25fYnl0ZXMoKSkgfCAwO1xuXHRcdGlmIChzaWduYXR1cmUubGVuZ3RoICE9PSBzaWduYXR1cmVfbGVuZ3RoKSB7XG5cdFx0XHRfZnJlZV9hbmRfdGhyb3dfdHlwZV9lcnJvcihhZGRyZXNzX3Bvb2wsIFwiaW52YWxpZCBzaWduYXR1cmUgbGVuZ3RoXCIpO1xuXHRcdH1cblx0XHRzaWduYXR1cmVfYWRkcmVzcyA9IF90b19hbGxvY2F0ZWRfYnVmX2FkZHJlc3Moc2lnbmF0dXJlKTtcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChzaWduYXR1cmVfYWRkcmVzcyk7XG5cdFx0XG5cdFx0Ly8gLS0tLS0tLS0tLSBpbnB1dDogbWVzc2FnZSAodW5zaXplZF9idWYpXG5cdFx0XG5cdFx0bWVzc2FnZSA9IF9hbnlfdG9fVWludDhBcnJheShhZGRyZXNzX3Bvb2wsIG1lc3NhZ2UsIFwibWVzc2FnZVwiKTtcblx0XHR2YXIgbWVzc2FnZV9hZGRyZXNzID0gX3RvX2FsbG9jYXRlZF9idWZfYWRkcmVzcyhtZXNzYWdlKSxcblx0XHQgICAgbWVzc2FnZV9sZW5ndGggPSBtZXNzYWdlLmxlbmd0aDtcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChtZXNzYWdlX2FkZHJlc3MpO1xuXHRcdFxuXHRcdC8vIC0tLS0tLS0tLS0gaW5wdXQ6IHB1YmxpY0tleSAoYnVmKVxuXHRcdFxuXHRcdHB1YmxpY0tleSA9IF9hbnlfdG9fVWludDhBcnJheShhZGRyZXNzX3Bvb2wsIHB1YmxpY0tleSwgXCJwdWJsaWNLZXlcIik7XG5cdFx0dmFyIHB1YmxpY0tleV9hZGRyZXNzLCBwdWJsaWNLZXlfbGVuZ3RoID0gKGxpYnNvZGl1bS5fY3J5cHRvX3NpZ25fcHVibGlja2V5Ynl0ZXMoKSkgfCAwO1xuXHRcdGlmIChwdWJsaWNLZXkubGVuZ3RoICE9PSBwdWJsaWNLZXlfbGVuZ3RoKSB7XG5cdFx0XHRfZnJlZV9hbmRfdGhyb3dfdHlwZV9lcnJvcihhZGRyZXNzX3Bvb2wsIFwiaW52YWxpZCBwdWJsaWNLZXkgbGVuZ3RoXCIpO1xuXHRcdH1cblx0XHRwdWJsaWNLZXlfYWRkcmVzcyA9IF90b19hbGxvY2F0ZWRfYnVmX2FkZHJlc3MocHVibGljS2V5KTtcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChwdWJsaWNLZXlfYWRkcmVzcyk7XG5cdFx0XG5cdFx0dmFyIHZlcmlmaWNhdGlvblJlc3VsdCA9IGxpYnNvZGl1bS5fY3J5cHRvX3NpZ25fdmVyaWZ5X2RldGFjaGVkKHNpZ25hdHVyZV9hZGRyZXNzLCBtZXNzYWdlX2FkZHJlc3MsIG1lc3NhZ2VfbGVuZ3RoLCAwLCBwdWJsaWNLZXlfYWRkcmVzcykgfCAwO1xuXHRcdHZhciByZXQgPSAodmVyaWZpY2F0aW9uUmVzdWx0ID09PSAwKTtcblx0XHRfZnJlZV9hbGwoYWRkcmVzc19wb29sKTtcblx0XHRyZXR1cm4gcmV0O1xuXHRcdFxuXHR9XG5cblx0ZnVuY3Rpb24gcmFuZG9tYnl0ZXNfYnVmKGxlbmd0aCwgb3V0cHV0Rm9ybWF0KSB7XG5cdFx0dmFyIGFkZHJlc3NfcG9vbCA9IFtdO1xuXHRcdF9jaGVja19vdXRwdXRfZm9ybWF0KG91dHB1dEZvcm1hdCk7XG5cblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBsZW5ndGggKHVpbnQpXG5cdFx0XG5cdFx0X3JlcXVpcmVfZGVmaW5lZChhZGRyZXNzX3Bvb2wsIGxlbmd0aCwgXCJsZW5ndGhcIik7XG5cdFx0XG5cdFx0aWYgKCEodHlwZW9mIGxlbmd0aCA9PT0gXCJudW1iZXJcIiAmJiAobGVuZ3RoIHwgMCkgPT09IGxlbmd0aCkgJiYgKGxlbmd0aCB8IDApID4gMCkge1xuXHRcdFx0X2ZyZWVfYW5kX3Rocm93X3R5cGVfZXJyb3IoYWRkcmVzc19wb29sLCBcImxlbmd0aCBtdXN0IGJlIGFuIHVuc2lnbmVkIGludGVnZXJcIik7XG5cdFx0fVxuXHRcdFxuXHRcdC8vIC0tLS0tLS0tLS0gb3V0cHV0IG91dHB1dCAoYnVmKVxuXHRcdFxuXHRcdHZhciBvdXRwdXRfbGVuZ3RoID0gKGxlbmd0aCkgfCAwLFxuXHRcdCAgICBvdXRwdXQgPSBuZXcgQWxsb2NhdGVkQnVmKG91dHB1dF9sZW5ndGgpLFxuXHRcdCAgICBvdXRwdXRfYWRkcmVzcyA9IG91dHB1dC5hZGRyZXNzO1xuXHRcdFxuXHRcdGFkZHJlc3NfcG9vbC5wdXNoKG91dHB1dF9hZGRyZXNzKTtcblx0XHRcblx0XHRsaWJzb2RpdW0uX3JhbmRvbWJ5dGVzX2J1ZihvdXRwdXRfYWRkcmVzcywgbGVuZ3RoKTtcblx0XHR2YXIgcmV0ID0gKF9mb3JtYXRfb3V0cHV0KG91dHB1dCwgb3V0cHV0Rm9ybWF0KSk7XG5cdFx0X2ZyZWVfYWxsKGFkZHJlc3NfcG9vbCk7XG5cdFx0cmV0dXJuIHJldDtcblx0XHRcblx0fVxuXG5cdGZ1bmN0aW9uIHJhbmRvbWJ5dGVzX2Nsb3NlKG91dHB1dEZvcm1hdCkge1xuXHRcdHZhciBhZGRyZXNzX3Bvb2wgPSBbXTtcblx0XHRfY2hlY2tfb3V0cHV0X2Zvcm1hdChvdXRwdXRGb3JtYXQpO1xuXG5cdFx0bGlic29kaXVtLl9yYW5kb21ieXRlc19jbG9zZSgpO1xuXHRcdFxuXHR9XG5cblx0ZnVuY3Rpb24gcmFuZG9tYnl0ZXNfcmFuZG9tKG91dHB1dEZvcm1hdCkge1xuXHRcdHZhciBhZGRyZXNzX3Bvb2wgPSBbXTtcblx0XHRfY2hlY2tfb3V0cHV0X2Zvcm1hdChvdXRwdXRGb3JtYXQpO1xuXG5cdFx0dmFyIHJhbmRvbV92YWx1ZSA9IGxpYnNvZGl1bS5fcmFuZG9tYnl0ZXNfcmFuZG9tKCkgPj4+IDA7XG5cdFx0dmFyIHJldCA9IChyYW5kb21fdmFsdWUpO1xuXHRcdF9mcmVlX2FsbChhZGRyZXNzX3Bvb2wpO1xuXHRcdHJldHVybiByZXQ7XG5cdFx0XG5cdH1cblxuXHRmdW5jdGlvbiByYW5kb21ieXRlc19zZXRfaW1wbGVtZW50YXRpb24oaW1wbGVtZW50YXRpb24sIG91dHB1dEZvcm1hdCkge1xuXHRcdHZhciBhZGRyZXNzX3Bvb2wgPSBbXTtcblx0XHRfY2hlY2tfb3V0cHV0X2Zvcm1hdChvdXRwdXRGb3JtYXQpO1xuXG5cdFx0Ly8gLS0tLS0tLS0tLSBpbnB1dDogaW1wbGVtZW50YXRpb24gKHJhbmRvbWJ5dGVzX2ltcGxlbWVudGF0aW9uKVxuXHRcdFxuXHRcdHZhciBpbXBsZW1lbnRhdGlvbl9hZGRyZXNzID0gbGlic29kaXVtLl9tYWxsb2MoNiAqIDQpO1xuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgNjsgaSsrKSB7XG5cdFx0XHRsaWJzb2RpdW0uc2V0VmFsdWUoaW1wbGVtZW50YXRpb25fYWRkcmVzcyArIGkgKiA0LFxuXHRcdFx0ICAgIGxpYnNvZGl1bS5SdW50aW1lLmFkZEZ1bmN0aW9uKGltcGxlbWVudGF0aW9uXG5cdFx0XHQgICAgW1tcImltcGxlbWVudGF0aW9uX25hbWVcIiwgXCJyYW5kb21cIiwgXCJzdGlyXCIsIFwidW5pZm9ybVwiLCBcImJ1ZlwiLCBcImNsb3NlXCJdW2ldXSksXG5cdFx0XHQgICAgXCJpMzJcIik7XG5cdFx0fVxuXHRcdFxuXHRcdGlmICgobGlic29kaXVtLl9yYW5kb21ieXRlc19zZXRfaW1wbGVtZW50YXRpb24oaW1wbGVtZW50YXRpb25fYWRkcmVzcykgfCAwKSA9PT0gMCkge1xuXHRcdFx0X2ZyZWVfYWxsKGFkZHJlc3NfcG9vbCk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdF9mcmVlX2FuZF90aHJvd19lcnJvcihhZGRyZXNzX3Bvb2wpO1xuXHRcdFxuXHR9XG5cblx0ZnVuY3Rpb24gcmFuZG9tYnl0ZXNfc3RpcihvdXRwdXRGb3JtYXQpIHtcblx0XHR2YXIgYWRkcmVzc19wb29sID0gW107XG5cdFx0X2NoZWNrX291dHB1dF9mb3JtYXQob3V0cHV0Rm9ybWF0KTtcblxuXHRcdGxpYnNvZGl1bS5fcmFuZG9tYnl0ZXNfc3RpcigpO1xuXHRcdFxuXHR9XG5cblx0ZnVuY3Rpb24gcmFuZG9tYnl0ZXNfdW5pZm9ybSh1cHBlcl9ib3VuZCwgb3V0cHV0Rm9ybWF0KSB7XG5cdFx0dmFyIGFkZHJlc3NfcG9vbCA9IFtdO1xuXHRcdF9jaGVja19vdXRwdXRfZm9ybWF0KG91dHB1dEZvcm1hdCk7XG5cblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiB1cHBlcl9ib3VuZCAodWludClcblx0XHRcblx0XHRfcmVxdWlyZV9kZWZpbmVkKGFkZHJlc3NfcG9vbCwgdXBwZXJfYm91bmQsIFwidXBwZXJfYm91bmRcIik7XG5cdFx0XG5cdFx0aWYgKCEodHlwZW9mIHVwcGVyX2JvdW5kID09PSBcIm51bWJlclwiICYmICh1cHBlcl9ib3VuZCB8IDApID09PSB1cHBlcl9ib3VuZCkgJiYgKHVwcGVyX2JvdW5kIHwgMCkgPiAwKSB7XG5cdFx0XHRfZnJlZV9hbmRfdGhyb3dfdHlwZV9lcnJvcihhZGRyZXNzX3Bvb2wsIFwidXBwZXJfYm91bmQgbXVzdCBiZSBhbiB1bnNpZ25lZCBpbnRlZ2VyXCIpO1xuXHRcdH1cblx0XHRcblx0XHR2YXIgcmFuZG9tX3ZhbHVlID0gbGlic29kaXVtLl9yYW5kb21ieXRlc191bmlmb3JtKHVwcGVyX2JvdW5kKSA+Pj4gMDtcblx0XHR2YXIgcmV0ID0gKHJhbmRvbV92YWx1ZSk7XG5cdFx0X2ZyZWVfYWxsKGFkZHJlc3NfcG9vbCk7XG5cdFx0cmV0dXJuIHJldDtcblx0XHRcblx0fVxuXG5cdGZ1bmN0aW9uIHNvZGl1bV92ZXJzaW9uX3N0cmluZygpIHtcblx0XHR2YXIgYWRkcmVzc19wb29sID0gW107XG5cblx0XHR2YXIgdmVyc2lvbiA9IGxpYnNvZGl1bS5fc29kaXVtX3ZlcnNpb25fc3RyaW5nKCk7XG5cdFx0dmFyIHJldCA9IChsaWJzb2RpdW0uUG9pbnRlcl9zdHJpbmdpZnkodmVyc2lvbikpO1xuXHRcdF9mcmVlX2FsbChhZGRyZXNzX3Bvb2wpO1xuXHRcdHJldHVybiByZXQ7XG5cdFx0XG5cdH1cblxuXG5cdGV4cG9ydHMuY29tcGFyZSA9IGNvbXBhcmU7XG5cdGV4cG9ydHMuZnJvbV9iYXNlNjQgPSBmcm9tX2Jhc2U2NDtcblx0ZXhwb3J0cy5mcm9tX2hleCA9IGZyb21faGV4O1xuXHRleHBvcnRzLmZyb21fc3RyaW5nID0gZnJvbV9zdHJpbmc7XG5cdGV4cG9ydHMuaW5jcmVtZW50ID0gaW5jcmVtZW50O1xuXHRleHBvcnRzLmxpYnNvZGl1bSA9IGxpYnNvZGl1bTtcblx0ZXhwb3J0cy5tZW1jbXAgPSBtZW1jbXA7XG5cdGV4cG9ydHMubWVtemVybyA9IG1lbXplcm87XG5cdGV4cG9ydHMub3V0cHV0X2Zvcm1hdHMgPSBvdXRwdXRfZm9ybWF0cztcblx0ZXhwb3J0cy5zeW1ib2xzID0gc3ltYm9scztcblx0ZXhwb3J0cy50b19iYXNlNjQgPSB0b19iYXNlNjQ7XG5cdGV4cG9ydHMudG9faGV4ID0gdG9faGV4O1xuXHRleHBvcnRzLnRvX3N0cmluZyA9IHRvX3N0cmluZztcblxuXHRcblx0dmFyIGV4cG9ydGVkX2Z1bmN0aW9ucyA9IFtcImNyeXB0b19hZWFkX2NoYWNoYTIwcG9seTEzMDVfZGVjcnlwdFwiLCBcImNyeXB0b19hZWFkX2NoYWNoYTIwcG9seTEzMDVfZW5jcnlwdFwiLCBcImNyeXB0b19hZWFkX2NoYWNoYTIwcG9seTEzMDVfaWV0Zl9kZWNyeXB0XCIsIFwiY3J5cHRvX2FlYWRfY2hhY2hhMjBwb2x5MTMwNV9pZXRmX2VuY3J5cHRcIiwgXCJjcnlwdG9fYXV0aFwiLCBcImNyeXB0b19hdXRoX2htYWNzaGEyNTZcIiwgXCJjcnlwdG9fYXV0aF9obWFjc2hhMjU2X3ZlcmlmeVwiLCBcImNyeXB0b19hdXRoX2htYWNzaGE1MTJcIiwgXCJjcnlwdG9fYXV0aF9obWFjc2hhNTEyX3ZlcmlmeVwiLCBcImNyeXB0b19hdXRoX3ZlcmlmeVwiLCBcImNyeXB0b19ib3hfYmVmb3Jlbm1cIiwgXCJjcnlwdG9fYm94X2RldGFjaGVkXCIsIFwiY3J5cHRvX2JveF9lYXN5XCIsIFwiY3J5cHRvX2JveF9lYXN5X2FmdGVybm1cIiwgXCJjcnlwdG9fYm94X2tleXBhaXJcIiwgXCJjcnlwdG9fYm94X29wZW5fZGV0YWNoZWRcIiwgXCJjcnlwdG9fYm94X29wZW5fZWFzeVwiLCBcImNyeXB0b19ib3hfb3Blbl9lYXN5X2FmdGVybm1cIiwgXCJjcnlwdG9fYm94X3NlYWxcIiwgXCJjcnlwdG9fYm94X3NlYWxfb3BlblwiLCBcImNyeXB0b19ib3hfc2VlZF9rZXlwYWlyXCIsIFwiY3J5cHRvX2dlbmVyaWNoYXNoXCIsIFwiY3J5cHRvX2dlbmVyaWNoYXNoX2ZpbmFsXCIsIFwiY3J5cHRvX2dlbmVyaWNoYXNoX2luaXRcIiwgXCJjcnlwdG9fZ2VuZXJpY2hhc2hfdXBkYXRlXCIsIFwiY3J5cHRvX2hhc2hcIiwgXCJjcnlwdG9faGFzaF9zaGEyNTZcIiwgXCJjcnlwdG9faGFzaF9zaGE1MTJcIiwgXCJjcnlwdG9fb25ldGltZWF1dGhcIiwgXCJjcnlwdG9fb25ldGltZWF1dGhfZmluYWxcIiwgXCJjcnlwdG9fb25ldGltZWF1dGhfaW5pdFwiLCBcImNyeXB0b19vbmV0aW1lYXV0aF91cGRhdGVcIiwgXCJjcnlwdG9fb25ldGltZWF1dGhfdmVyaWZ5XCIsIFwiY3J5cHRvX3B3aGFzaF9zY3J5cHRzYWxzYTIwOHNoYTI1NlwiLCBcImNyeXB0b19wd2hhc2hfc2NyeXB0c2Fsc2EyMDhzaGEyNTZfbGxcIiwgXCJjcnlwdG9fcHdoYXNoX3NjcnlwdHNhbHNhMjA4c2hhMjU2X3N0clwiLCBcImNyeXB0b19wd2hhc2hfc2NyeXB0c2Fsc2EyMDhzaGEyNTZfc3RyX3ZlcmlmeVwiLCBcImNyeXB0b19zY2FsYXJtdWx0XCIsIFwiY3J5cHRvX3NjYWxhcm11bHRfYmFzZVwiLCBcImNyeXB0b19zZWNyZXRib3hfZGV0YWNoZWRcIiwgXCJjcnlwdG9fc2VjcmV0Ym94X2Vhc3lcIiwgXCJjcnlwdG9fc2VjcmV0Ym94X29wZW5fZGV0YWNoZWRcIiwgXCJjcnlwdG9fc2VjcmV0Ym94X29wZW5fZWFzeVwiLCBcImNyeXB0b19zaG9ydGhhc2hcIiwgXCJjcnlwdG9fc2lnblwiLCBcImNyeXB0b19zaWduX2RldGFjaGVkXCIsIFwiY3J5cHRvX3NpZ25fZWQyNTUxOV9wa190b19jdXJ2ZTI1NTE5XCIsIFwiY3J5cHRvX3NpZ25fZWQyNTUxOV9za190b19jdXJ2ZTI1NTE5XCIsIFwiY3J5cHRvX3NpZ25fZWQyNTUxOV9za190b19wa1wiLCBcImNyeXB0b19zaWduX2VkMjU1MTlfc2tfdG9fc2VlZFwiLCBcImNyeXB0b19zaWduX2tleXBhaXJcIiwgXCJjcnlwdG9fc2lnbl9vcGVuXCIsIFwiY3J5cHRvX3NpZ25fc2VlZF9rZXlwYWlyXCIsIFwiY3J5cHRvX3NpZ25fdmVyaWZ5X2RldGFjaGVkXCIsIFwicmFuZG9tYnl0ZXNfYnVmXCIsIFwicmFuZG9tYnl0ZXNfY2xvc2VcIiwgXCJyYW5kb21ieXRlc19yYW5kb21cIiwgXCJyYW5kb21ieXRlc19zZXRfaW1wbGVtZW50YXRpb25cIiwgXCJyYW5kb21ieXRlc19zdGlyXCIsIFwicmFuZG9tYnl0ZXNfdW5pZm9ybVwiLCBcInNvZGl1bV92ZXJzaW9uX3N0cmluZ1wiXSxcblx0XHRmdW5jdGlvbnMgPSBbY3J5cHRvX2FlYWRfY2hhY2hhMjBwb2x5MTMwNV9kZWNyeXB0LCBjcnlwdG9fYWVhZF9jaGFjaGEyMHBvbHkxMzA1X2VuY3J5cHQsIGNyeXB0b19hZWFkX2NoYWNoYTIwcG9seTEzMDVfaWV0Zl9kZWNyeXB0LCBjcnlwdG9fYWVhZF9jaGFjaGEyMHBvbHkxMzA1X2lldGZfZW5jcnlwdCwgY3J5cHRvX2F1dGgsIGNyeXB0b19hdXRoX2htYWNzaGEyNTYsIGNyeXB0b19hdXRoX2htYWNzaGEyNTZfdmVyaWZ5LCBjcnlwdG9fYXV0aF9obWFjc2hhNTEyLCBjcnlwdG9fYXV0aF9obWFjc2hhNTEyX3ZlcmlmeSwgY3J5cHRvX2F1dGhfdmVyaWZ5LCBjcnlwdG9fYm94X2JlZm9yZW5tLCBjcnlwdG9fYm94X2RldGFjaGVkLCBjcnlwdG9fYm94X2Vhc3ksIGNyeXB0b19ib3hfZWFzeV9hZnRlcm5tLCBjcnlwdG9fYm94X2tleXBhaXIsIGNyeXB0b19ib3hfb3Blbl9kZXRhY2hlZCwgY3J5cHRvX2JveF9vcGVuX2Vhc3ksIGNyeXB0b19ib3hfb3Blbl9lYXN5X2FmdGVybm0sIGNyeXB0b19ib3hfc2VhbCwgY3J5cHRvX2JveF9zZWFsX29wZW4sIGNyeXB0b19ib3hfc2VlZF9rZXlwYWlyLCBjcnlwdG9fZ2VuZXJpY2hhc2gsIGNyeXB0b19nZW5lcmljaGFzaF9maW5hbCwgY3J5cHRvX2dlbmVyaWNoYXNoX2luaXQsIGNyeXB0b19nZW5lcmljaGFzaF91cGRhdGUsIGNyeXB0b19oYXNoLCBjcnlwdG9faGFzaF9zaGEyNTYsIGNyeXB0b19oYXNoX3NoYTUxMiwgY3J5cHRvX29uZXRpbWVhdXRoLCBjcnlwdG9fb25ldGltZWF1dGhfZmluYWwsIGNyeXB0b19vbmV0aW1lYXV0aF9pbml0LCBjcnlwdG9fb25ldGltZWF1dGhfdXBkYXRlLCBjcnlwdG9fb25ldGltZWF1dGhfdmVyaWZ5LCBjcnlwdG9fcHdoYXNoX3NjcnlwdHNhbHNhMjA4c2hhMjU2LCBjcnlwdG9fcHdoYXNoX3NjcnlwdHNhbHNhMjA4c2hhMjU2X2xsLCBjcnlwdG9fcHdoYXNoX3NjcnlwdHNhbHNhMjA4c2hhMjU2X3N0ciwgY3J5cHRvX3B3aGFzaF9zY3J5cHRzYWxzYTIwOHNoYTI1Nl9zdHJfdmVyaWZ5LCBjcnlwdG9fc2NhbGFybXVsdCwgY3J5cHRvX3NjYWxhcm11bHRfYmFzZSwgY3J5cHRvX3NlY3JldGJveF9kZXRhY2hlZCwgY3J5cHRvX3NlY3JldGJveF9lYXN5LCBjcnlwdG9fc2VjcmV0Ym94X29wZW5fZGV0YWNoZWQsIGNyeXB0b19zZWNyZXRib3hfb3Blbl9lYXN5LCBjcnlwdG9fc2hvcnRoYXNoLCBjcnlwdG9fc2lnbiwgY3J5cHRvX3NpZ25fZGV0YWNoZWQsIGNyeXB0b19zaWduX2VkMjU1MTlfcGtfdG9fY3VydmUyNTUxOSwgY3J5cHRvX3NpZ25fZWQyNTUxOV9za190b19jdXJ2ZTI1NTE5LCBjcnlwdG9fc2lnbl9lZDI1NTE5X3NrX3RvX3BrLCBjcnlwdG9fc2lnbl9lZDI1NTE5X3NrX3RvX3NlZWQsIGNyeXB0b19zaWduX2tleXBhaXIsIGNyeXB0b19zaWduX29wZW4sIGNyeXB0b19zaWduX3NlZWRfa2V5cGFpciwgY3J5cHRvX3NpZ25fdmVyaWZ5X2RldGFjaGVkLCByYW5kb21ieXRlc19idWYsIHJhbmRvbWJ5dGVzX2Nsb3NlLCByYW5kb21ieXRlc19yYW5kb20sIHJhbmRvbWJ5dGVzX3NldF9pbXBsZW1lbnRhdGlvbiwgcmFuZG9tYnl0ZXNfc3RpciwgcmFuZG9tYnl0ZXNfdW5pZm9ybSwgc29kaXVtX3ZlcnNpb25fc3RyaW5nXTtcblx0Zm9yICh2YXIgaSA9IDA7IGkgPCBmdW5jdGlvbnMubGVuZ3RoOyBpKyspIHtcblx0XHRpZiAodHlwZW9mIGxpYnNvZGl1bVtcIl9cIiArIGV4cG9ydGVkX2Z1bmN0aW9uc1tpXV0gPT09IFwiZnVuY3Rpb25cIikge1xuXHRcdFx0ZXhwb3J0c1tleHBvcnRlZF9mdW5jdGlvbnNbaV1dID0gZnVuY3Rpb25zW2ldO1xuXHRcdH1cblx0fVxuXHR2YXIgY29uc3RhbnRzID0gW1wiU09ESVVNX0xJQlJBUllfVkVSU0lPTl9NQUpPUlwiLCBcIlNPRElVTV9MSUJSQVJZX1ZFUlNJT05fTUlOT1JcIiwgXCJjcnlwdG9fYWVhZF9jaGFjaGEyMHBvbHkxMzA1X0FCWVRFU1wiLCBcImNyeXB0b19hZWFkX2NoYWNoYTIwcG9seTEzMDVfS0VZQllURVNcIiwgXCJjcnlwdG9fYWVhZF9jaGFjaGEyMHBvbHkxMzA1X05QVUJCWVRFU1wiLCBcImNyeXB0b19hZWFkX2NoYWNoYTIwcG9seTEzMDVfTlNFQ0JZVEVTXCIsIFwiY3J5cHRvX2FlYWRfY2hhY2hhMjBwb2x5MTMwNV9pZXRmX05QVUJCWVRFU1wiLCBcImNyeXB0b19hdXRoX0JZVEVTXCIsIFwiY3J5cHRvX2F1dGhfS0VZQllURVNcIiwgXCJjcnlwdG9fYXV0aF9obWFjc2hhMjU2X0JZVEVTXCIsIFwiY3J5cHRvX2F1dGhfaG1hY3NoYTI1Nl9LRVlCWVRFU1wiLCBcImNyeXB0b19hdXRoX2htYWNzaGE1MTJfQllURVNcIiwgXCJjcnlwdG9fYXV0aF9obWFjc2hhNTEyX0tFWUJZVEVTXCIsIFwiY3J5cHRvX2JveF9CRUZPUkVOTUJZVEVTXCIsIFwiY3J5cHRvX2JveF9NQUNCWVRFU1wiLCBcImNyeXB0b19ib3hfTk9OQ0VCWVRFU1wiLCBcImNyeXB0b19ib3hfUFVCTElDS0VZQllURVNcIiwgXCJjcnlwdG9fYm94X1NFQUxCWVRFU1wiLCBcImNyeXB0b19ib3hfU0VDUkVUS0VZQllURVNcIiwgXCJjcnlwdG9fYm94X1NFRURCWVRFU1wiLCBcImNyeXB0b19nZW5lcmljaGFzaF9CWVRFU1wiLCBcImNyeXB0b19nZW5lcmljaGFzaF9CWVRFU19NQVhcIiwgXCJjcnlwdG9fZ2VuZXJpY2hhc2hfQllURVNfTUlOXCIsIFwiY3J5cHRvX2dlbmVyaWNoYXNoX0tFWUJZVEVTXCIsIFwiY3J5cHRvX2dlbmVyaWNoYXNoX0tFWUJZVEVTX01BWFwiLCBcImNyeXB0b19nZW5lcmljaGFzaF9LRVlCWVRFU19NSU5cIiwgXCJjcnlwdG9faGFzaF9CWVRFU1wiLCBcImNyeXB0b19vbmV0aW1lYXV0aF9CWVRFU1wiLCBcImNyeXB0b19vbmV0aW1lYXV0aF9LRVlCWVRFU1wiLCBcImNyeXB0b19wd2hhc2hfc2NyeXB0c2Fsc2EyMDhzaGEyNTZfTUVNTElNSVRfSU5URVJBQ1RJVkVcIiwgXCJjcnlwdG9fcHdoYXNoX3NjcnlwdHNhbHNhMjA4c2hhMjU2X01FTUxJTUlUX1NFTlNJVElWRVwiLCBcImNyeXB0b19wd2hhc2hfc2NyeXB0c2Fsc2EyMDhzaGEyNTZfT1BTTElNSVRfSU5URVJBQ1RJVkVcIiwgXCJjcnlwdG9fcHdoYXNoX3NjcnlwdHNhbHNhMjA4c2hhMjU2X09QU0xJTUlUX1NFTlNJVElWRVwiLCBcImNyeXB0b19wd2hhc2hfc2NyeXB0c2Fsc2EyMDhzaGEyNTZfU0FMVEJZVEVTXCIsIFwiY3J5cHRvX3B3aGFzaF9zY3J5cHRzYWxzYTIwOHNoYTI1Nl9TVFJCWVRFU1wiLCBcImNyeXB0b19wd2hhc2hfc2NyeXB0c2Fsc2EyMDhzaGEyNTZfU1RSX1ZFUklGWVwiLCBcImNyeXB0b19zY2FsYXJtdWx0X0JZVEVTXCIsIFwiY3J5cHRvX3NjYWxhcm11bHRfU0NBTEFSQllURVNcIiwgXCJjcnlwdG9fc2VjcmV0Ym94X0tFWUJZVEVTXCIsIFwiY3J5cHRvX3NlY3JldGJveF9NQUNCWVRFU1wiLCBcImNyeXB0b19zZWNyZXRib3hfTk9OQ0VCWVRFU1wiLCBcImNyeXB0b19zaG9ydGhhc2hfQllURVNcIiwgXCJjcnlwdG9fc2hvcnRoYXNoX0tFWUJZVEVTXCIsIFwiY3J5cHRvX3NpZ25fQllURVNcIiwgXCJjcnlwdG9fc2lnbl9QVUJMSUNLRVlCWVRFU1wiLCBcImNyeXB0b19zaWduX1NFQ1JFVEtFWUJZVEVTXCIsIFwiY3J5cHRvX3NpZ25fU0VFREJZVEVTXCJdO1xuXHRmb3IgKHZhciBpID0gMDsgaSA8IGNvbnN0YW50cy5sZW5ndGg7IGkrKykge1xuXHRcdHZhciByYXcgPSBsaWJzb2RpdW1bXCJfXCIgKyBjb25zdGFudHNbaV0udG9Mb3dlckNhc2UoKV07XG5cdFx0aWYgKHR5cGVvZiByYXcgPT09IFwiZnVuY3Rpb25cIikgZXhwb3J0c1tjb25zdGFudHNbaV1dID0gcmF3KCl8MDtcblx0fVxuXHR2YXIgY29uc3RhbnRzX3N0ciA9IFtcIlNPRElVTV9WRVJTSU9OX1NUUklOR1wiLCBcImNyeXB0b19wd2hhc2hfc2NyeXB0c2Fsc2EyMDhzaGEyNTZfU1RSUFJFRklYXCJdO1xuXHRmb3IgKHZhciBpID0gMDsgaSA8IGNvbnN0YW50c19zdHIubGVuZ3RoOyBpKyspIHtcblx0XHR2YXIgcmF3ID0gbGlic29kaXVtW1wiX1wiICsgY29uc3RhbnRzX3N0cltpXS50b0xvd2VyQ2FzZSgpXTtcblx0XHRpZiAodHlwZW9mIHJhdyA9PT0gXCJmdW5jdGlvblwiKSBleHBvcnRzW2NvbnN0YW50c19zdHJbaV1dID0gbGlic29kaXVtLlBvaW50ZXJfc3RyaW5naWZ5KHJhdygpKTtcblx0fVxuXG5cdHJldHVybiBleHBvcnRzO1xufSkpO1xuIiwiKGZ1bmN0aW9uIChyb290LCBmYWN0b3J5KSB7XG4gICAgaWYgKHR5cGVvZiBkZWZpbmUgPT09IFwiZnVuY3Rpb25cIiAmJiBkZWZpbmUuYW1kKSB7XG4gICAgICAgIGRlZmluZShbXCJleHBvcnRzXCJdLCBmYWN0b3J5KTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgICAgICAgdHlwZW9mIGV4cG9ydHMubm9kZU5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGZhY3RvcnkoZXhwb3J0cyk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZmFjdG9yeShyb290LmxpYnNvZGl1bSA9IHt9KTtcbiAgICB9XG59KSh0aGlzLCBmdW5jdGlvbiAoZXhwb3J0cykge1xuICAgIFwidXNlIHN0cmljdFwiO1xuICAgIHZhciBNb2R1bGUgPSBleHBvcnRzO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG52YXIgTW9kdWxlO2lmKCFNb2R1bGUpTW9kdWxlPSh0eXBlb2YgTW9kdWxlIT09XCJ1bmRlZmluZWRcIj9Nb2R1bGU6bnVsbCl8fHt9O3ZhciBtb2R1bGVPdmVycmlkZXM9e307Zm9yKHZhciBrZXkgaW4gTW9kdWxlKXtpZihNb2R1bGUuaGFzT3duUHJvcGVydHkoa2V5KSl7bW9kdWxlT3ZlcnJpZGVzW2tleV09TW9kdWxlW2tleV19fXZhciBFTlZJUk9OTUVOVF9JU19XRUI9dHlwZW9mIHdpbmRvdz09PVwib2JqZWN0XCI7dmFyIEVOVklST05NRU5UX0lTX1dPUktFUj10eXBlb2YgaW1wb3J0U2NyaXB0cz09PVwiZnVuY3Rpb25cIjt2YXIgRU5WSVJPTk1FTlRfSVNfTk9ERT10eXBlb2YgcHJvY2Vzcz09PVwib2JqZWN0XCImJnR5cGVvZiByZXF1aXJlPT09XCJmdW5jdGlvblwiJiYhRU5WSVJPTk1FTlRfSVNfV0VCJiYhRU5WSVJPTk1FTlRfSVNfV09SS0VSO3ZhciBFTlZJUk9OTUVOVF9JU19TSEVMTD0hRU5WSVJPTk1FTlRfSVNfV0VCJiYhRU5WSVJPTk1FTlRfSVNfTk9ERSYmIUVOVklST05NRU5UX0lTX1dPUktFUjtpZihFTlZJUk9OTUVOVF9JU19OT0RFKXtpZighTW9kdWxlW1wicHJpbnRcIl0pTW9kdWxlW1wicHJpbnRcIl09ZnVuY3Rpb24gcHJpbnQoeCl7cHJvY2Vzc1tcInN0ZG91dFwiXS53cml0ZSh4K1wiXFxuXCIpfTtpZighTW9kdWxlW1wicHJpbnRFcnJcIl0pTW9kdWxlW1wicHJpbnRFcnJcIl09ZnVuY3Rpb24gcHJpbnRFcnIoeCl7cHJvY2Vzc1tcInN0ZGVyclwiXS53cml0ZSh4K1wiXFxuXCIpfTt2YXIgbm9kZUZTPXJlcXVpcmUoXCJmc1wiKTt2YXIgbm9kZVBhdGg9cmVxdWlyZShcInBhdGhcIik7TW9kdWxlW1wicmVhZFwiXT1mdW5jdGlvbiByZWFkKGZpbGVuYW1lLGJpbmFyeSl7ZmlsZW5hbWU9bm9kZVBhdGhbXCJub3JtYWxpemVcIl0oZmlsZW5hbWUpO3ZhciByZXQ9bm9kZUZTW1wicmVhZEZpbGVTeW5jXCJdKGZpbGVuYW1lKTtpZighcmV0JiZmaWxlbmFtZSE9bm9kZVBhdGhbXCJyZXNvbHZlXCJdKGZpbGVuYW1lKSl7ZmlsZW5hbWU9cGF0aC5qb2luKF9fZGlybmFtZSxcIi4uXCIsXCJzcmNcIixmaWxlbmFtZSk7cmV0PW5vZGVGU1tcInJlYWRGaWxlU3luY1wiXShmaWxlbmFtZSl9aWYocmV0JiYhYmluYXJ5KXJldD1yZXQudG9TdHJpbmcoKTtyZXR1cm4gcmV0fTtNb2R1bGVbXCJyZWFkQmluYXJ5XCJdPWZ1bmN0aW9uIHJlYWRCaW5hcnkoZmlsZW5hbWUpe3ZhciByZXQ9TW9kdWxlW1wicmVhZFwiXShmaWxlbmFtZSx0cnVlKTtpZighcmV0LmJ1ZmZlcil7cmV0PW5ldyBVaW50OEFycmF5KHJldCl9YXNzZXJ0KHJldC5idWZmZXIpO3JldHVybiByZXR9O01vZHVsZVtcImxvYWRcIl09ZnVuY3Rpb24gbG9hZChmKXtnbG9iYWxFdmFsKHJlYWQoZikpfTtpZighTW9kdWxlW1widGhpc1Byb2dyYW1cIl0pe2lmKHByb2Nlc3NbXCJhcmd2XCJdLmxlbmd0aD4xKXtNb2R1bGVbXCJ0aGlzUHJvZ3JhbVwiXT1wcm9jZXNzW1wiYXJndlwiXVsxXS5yZXBsYWNlKC9cXFxcL2csXCIvXCIpfWVsc2V7TW9kdWxlW1widGhpc1Byb2dyYW1cIl09XCJ1bmtub3duLXByb2dyYW1cIn19TW9kdWxlW1wiYXJndW1lbnRzXCJdPXByb2Nlc3NbXCJhcmd2XCJdLnNsaWNlKDIpO2lmKHR5cGVvZiBtb2R1bGUhPT1cInVuZGVmaW5lZFwiKXttb2R1bGVbXCJleHBvcnRzXCJdPU1vZHVsZX1wcm9jZXNzW1wib25cIl0oXCJ1bmNhdWdodEV4Y2VwdGlvblwiLChmdW5jdGlvbihleCl7aWYoIShleCBpbnN0YW5jZW9mIEV4aXRTdGF0dXMpKXt0aHJvdyBleH19KSk7TW9kdWxlW1wiaW5zcGVjdFwiXT0oZnVuY3Rpb24oKXtyZXR1cm5cIltFbXNjcmlwdGVuIE1vZHVsZSBvYmplY3RdXCJ9KX1lbHNlIGlmKEVOVklST05NRU5UX0lTX1NIRUxMKXtpZighTW9kdWxlW1wicHJpbnRcIl0pTW9kdWxlW1wicHJpbnRcIl09cHJpbnQ7aWYodHlwZW9mIHByaW50RXJyIT1cInVuZGVmaW5lZFwiKU1vZHVsZVtcInByaW50RXJyXCJdPXByaW50RXJyO2lmKHR5cGVvZiByZWFkIT1cInVuZGVmaW5lZFwiKXtNb2R1bGVbXCJyZWFkXCJdPXJlYWR9ZWxzZXtNb2R1bGVbXCJyZWFkXCJdPWZ1bmN0aW9uIHJlYWQoKXt0aHJvd1wibm8gcmVhZCgpIGF2YWlsYWJsZSAoanNjPylcIn19TW9kdWxlW1wicmVhZEJpbmFyeVwiXT1mdW5jdGlvbiByZWFkQmluYXJ5KGYpe2lmKHR5cGVvZiByZWFkYnVmZmVyPT09XCJmdW5jdGlvblwiKXtyZXR1cm4gbmV3IFVpbnQ4QXJyYXkocmVhZGJ1ZmZlcihmKSl9dmFyIGRhdGE9cmVhZChmLFwiYmluYXJ5XCIpO2Fzc2VydCh0eXBlb2YgZGF0YT09PVwib2JqZWN0XCIpO3JldHVybiBkYXRhfTtpZih0eXBlb2Ygc2NyaXB0QXJncyE9XCJ1bmRlZmluZWRcIil7TW9kdWxlW1wiYXJndW1lbnRzXCJdPXNjcmlwdEFyZ3N9ZWxzZSBpZih0eXBlb2YgYXJndW1lbnRzIT1cInVuZGVmaW5lZFwiKXtNb2R1bGVbXCJhcmd1bWVudHNcIl09YXJndW1lbnRzfX1lbHNlIGlmKEVOVklST05NRU5UX0lTX1dFQnx8RU5WSVJPTk1FTlRfSVNfV09SS0VSKXtNb2R1bGVbXCJyZWFkXCJdPWZ1bmN0aW9uIHJlYWQodXJsKXt2YXIgeGhyPW5ldyBYTUxIdHRwUmVxdWVzdDt4aHIub3BlbihcIkdFVFwiLHVybCxmYWxzZSk7eGhyLnNlbmQobnVsbCk7cmV0dXJuIHhoci5yZXNwb25zZVRleHR9O2lmKHR5cGVvZiBhcmd1bWVudHMhPVwidW5kZWZpbmVkXCIpe01vZHVsZVtcImFyZ3VtZW50c1wiXT1hcmd1bWVudHN9aWYodHlwZW9mIGNvbnNvbGUhPT1cInVuZGVmaW5lZFwiKXtpZighTW9kdWxlW1wicHJpbnRcIl0pTW9kdWxlW1wicHJpbnRcIl09ZnVuY3Rpb24gcHJpbnQoeCl7Y29uc29sZS5sb2coeCl9O2lmKCFNb2R1bGVbXCJwcmludEVyclwiXSlNb2R1bGVbXCJwcmludEVyclwiXT1mdW5jdGlvbiBwcmludEVycih4KXtjb25zb2xlLmxvZyh4KX19ZWxzZXt2YXIgVFJZX1VTRV9EVU1QPWZhbHNlO2lmKCFNb2R1bGVbXCJwcmludFwiXSlNb2R1bGVbXCJwcmludFwiXT1UUllfVVNFX0RVTVAmJnR5cGVvZiBkdW1wIT09XCJ1bmRlZmluZWRcIj8oZnVuY3Rpb24oeCl7ZHVtcCh4KX0pOihmdW5jdGlvbih4KXt9KX1pZihFTlZJUk9OTUVOVF9JU19XT1JLRVIpe01vZHVsZVtcImxvYWRcIl09aW1wb3J0U2NyaXB0c31pZih0eXBlb2YgTW9kdWxlW1wic2V0V2luZG93VGl0bGVcIl09PT1cInVuZGVmaW5lZFwiKXtNb2R1bGVbXCJzZXRXaW5kb3dUaXRsZVwiXT0oZnVuY3Rpb24odGl0bGUpe2RvY3VtZW50LnRpdGxlPXRpdGxlfSl9fWVsc2V7dGhyb3dcIlVua25vd24gcnVudGltZSBlbnZpcm9ubWVudC4gV2hlcmUgYXJlIHdlP1wifWZ1bmN0aW9uIGdsb2JhbEV2YWwoeCl7dGhyb3dcIk5PX0RZTkFNSUNfRVhFQ1VUSU9OIHdhcyBzZXQsIGNhbm5vdCBldmFsXCJ9aWYoIU1vZHVsZVtcImxvYWRcIl0mJk1vZHVsZVtcInJlYWRcIl0pe01vZHVsZVtcImxvYWRcIl09ZnVuY3Rpb24gbG9hZChmKXtnbG9iYWxFdmFsKE1vZHVsZVtcInJlYWRcIl0oZikpfX1pZighTW9kdWxlW1wicHJpbnRcIl0pe01vZHVsZVtcInByaW50XCJdPShmdW5jdGlvbigpe30pfWlmKCFNb2R1bGVbXCJwcmludEVyclwiXSl7TW9kdWxlW1wicHJpbnRFcnJcIl09TW9kdWxlW1wicHJpbnRcIl19aWYoIU1vZHVsZVtcImFyZ3VtZW50c1wiXSl7TW9kdWxlW1wiYXJndW1lbnRzXCJdPVtdfWlmKCFNb2R1bGVbXCJ0aGlzUHJvZ3JhbVwiXSl7TW9kdWxlW1widGhpc1Byb2dyYW1cIl09XCIuL3RoaXMucHJvZ3JhbVwifU1vZHVsZS5wcmludD1Nb2R1bGVbXCJwcmludFwiXTtNb2R1bGUucHJpbnRFcnI9TW9kdWxlW1wicHJpbnRFcnJcIl07TW9kdWxlW1wicHJlUnVuXCJdPVtdO01vZHVsZVtcInBvc3RSdW5cIl09W107Zm9yKHZhciBrZXkgaW4gbW9kdWxlT3ZlcnJpZGVzKXtpZihtb2R1bGVPdmVycmlkZXMuaGFzT3duUHJvcGVydHkoa2V5KSl7TW9kdWxlW2tleV09bW9kdWxlT3ZlcnJpZGVzW2tleV19fXZhciBSdW50aW1lPXtzZXRUZW1wUmV0MDooZnVuY3Rpb24odmFsdWUpe3RlbXBSZXQwPXZhbHVlfSksZ2V0VGVtcFJldDA6KGZ1bmN0aW9uKCl7cmV0dXJuIHRlbXBSZXQwfSksc3RhY2tTYXZlOihmdW5jdGlvbigpe3JldHVybiBTVEFDS1RPUH0pLHN0YWNrUmVzdG9yZTooZnVuY3Rpb24oc3RhY2tUb3Ape1NUQUNLVE9QPXN0YWNrVG9wfSksZ2V0TmF0aXZlVHlwZVNpemU6KGZ1bmN0aW9uKHR5cGUpe3N3aXRjaCh0eXBlKXtjYXNlXCJpMVwiOmNhc2VcImk4XCI6cmV0dXJuIDE7Y2FzZVwiaTE2XCI6cmV0dXJuIDI7Y2FzZVwiaTMyXCI6cmV0dXJuIDQ7Y2FzZVwiaTY0XCI6cmV0dXJuIDg7Y2FzZVwiZmxvYXRcIjpyZXR1cm4gNDtjYXNlXCJkb3VibGVcIjpyZXR1cm4gODtkZWZhdWx0OntpZih0eXBlW3R5cGUubGVuZ3RoLTFdPT09XCIqXCIpe3JldHVybiBSdW50aW1lLlFVQU5UVU1fU0laRX1lbHNlIGlmKHR5cGVbMF09PT1cImlcIil7dmFyIGJpdHM9cGFyc2VJbnQodHlwZS5zdWJzdHIoMSkpO2Fzc2VydChiaXRzJTg9PT0wKTtyZXR1cm4gYml0cy84fWVsc2V7cmV0dXJuIDB9fX19KSxnZXROYXRpdmVGaWVsZFNpemU6KGZ1bmN0aW9uKHR5cGUpe3JldHVybiBNYXRoLm1heChSdW50aW1lLmdldE5hdGl2ZVR5cGVTaXplKHR5cGUpLFJ1bnRpbWUuUVVBTlRVTV9TSVpFKX0pLFNUQUNLX0FMSUdOOjE2LHByZXBWYXJhcmc6KGZ1bmN0aW9uKHB0cix0eXBlKXtpZih0eXBlPT09XCJkb3VibGVcInx8dHlwZT09PVwiaTY0XCIpe2lmKHB0ciY3KXthc3NlcnQoKHB0ciY3KT09PTQpO3B0cis9NH19ZWxzZXthc3NlcnQoKHB0ciYzKT09PTApfXJldHVybiBwdHJ9KSxnZXRBbGlnblNpemU6KGZ1bmN0aW9uKHR5cGUsc2l6ZSx2YXJhcmcpe2lmKCF2YXJhcmcmJih0eXBlPT1cImk2NFwifHx0eXBlPT1cImRvdWJsZVwiKSlyZXR1cm4gODtpZighdHlwZSlyZXR1cm4gTWF0aC5taW4oc2l6ZSw4KTtyZXR1cm4gTWF0aC5taW4oc2l6ZXx8KHR5cGU/UnVudGltZS5nZXROYXRpdmVGaWVsZFNpemUodHlwZSk6MCksUnVudGltZS5RVUFOVFVNX1NJWkUpfSksZHluQ2FsbDooZnVuY3Rpb24oc2lnLHB0cixhcmdzKXtpZihhcmdzJiZhcmdzLmxlbmd0aCl7aWYoIWFyZ3Muc3BsaWNlKWFyZ3M9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJncyk7YXJncy5zcGxpY2UoMCwwLHB0cik7cmV0dXJuIE1vZHVsZVtcImR5bkNhbGxfXCIrc2lnXS5hcHBseShudWxsLGFyZ3MpfWVsc2V7cmV0dXJuIE1vZHVsZVtcImR5bkNhbGxfXCIrc2lnXS5jYWxsKG51bGwscHRyKX19KSxmdW5jdGlvblBvaW50ZXJzOltudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGxdLGFkZEZ1bmN0aW9uOihmdW5jdGlvbihmdW5jKXtmb3IodmFyIGk9MDtpPFJ1bnRpbWUuZnVuY3Rpb25Qb2ludGVycy5sZW5ndGg7aSsrKXtpZighUnVudGltZS5mdW5jdGlvblBvaW50ZXJzW2ldKXtSdW50aW1lLmZ1bmN0aW9uUG9pbnRlcnNbaV09ZnVuYztyZXR1cm4gMiooMStpKX19dGhyb3dcIkZpbmlzaGVkIHVwIGFsbCByZXNlcnZlZCBmdW5jdGlvbiBwb2ludGVycy4gVXNlIGEgaGlnaGVyIHZhbHVlIGZvciBSRVNFUlZFRF9GVU5DVElPTl9QT0lOVEVSUy5cIn0pLHJlbW92ZUZ1bmN0aW9uOihmdW5jdGlvbihpbmRleCl7UnVudGltZS5mdW5jdGlvblBvaW50ZXJzWyhpbmRleC0yKS8yXT1udWxsfSksd2Fybk9uY2U6KGZ1bmN0aW9uKHRleHQpe2lmKCFSdW50aW1lLndhcm5PbmNlLnNob3duKVJ1bnRpbWUud2Fybk9uY2Uuc2hvd249e307aWYoIVJ1bnRpbWUud2Fybk9uY2Uuc2hvd25bdGV4dF0pe1J1bnRpbWUud2Fybk9uY2Uuc2hvd25bdGV4dF09MTtNb2R1bGUucHJpbnRFcnIodGV4dCl9fSksZnVuY1dyYXBwZXJzOnt9LGdldEZ1bmNXcmFwcGVyOihmdW5jdGlvbihmdW5jLHNpZyl7YXNzZXJ0KHNpZyk7aWYoIVJ1bnRpbWUuZnVuY1dyYXBwZXJzW3NpZ10pe1J1bnRpbWUuZnVuY1dyYXBwZXJzW3NpZ109e319dmFyIHNpZ0NhY2hlPVJ1bnRpbWUuZnVuY1dyYXBwZXJzW3NpZ107aWYoIXNpZ0NhY2hlW2Z1bmNdKXtzaWdDYWNoZVtmdW5jXT1mdW5jdGlvbiBkeW5DYWxsX3dyYXBwZXIoKXtyZXR1cm4gUnVudGltZS5keW5DYWxsKHNpZyxmdW5jLGFyZ3VtZW50cyl9fXJldHVybiBzaWdDYWNoZVtmdW5jXX0pLGdldENvbXBpbGVyU2V0dGluZzooZnVuY3Rpb24obmFtZSl7dGhyb3dcIllvdSBtdXN0IGJ1aWxkIHdpdGggLXMgUkVUQUlOX0NPTVBJTEVSX1NFVFRJTkdTPTEgZm9yIFJ1bnRpbWUuZ2V0Q29tcGlsZXJTZXR0aW5nIG9yIGVtc2NyaXB0ZW5fZ2V0X2NvbXBpbGVyX3NldHRpbmcgdG8gd29ya1wifSksc3RhY2tBbGxvYzooZnVuY3Rpb24oc2l6ZSl7dmFyIHJldD1TVEFDS1RPUDtTVEFDS1RPUD1TVEFDS1RPUCtzaXplfDA7U1RBQ0tUT1A9U1RBQ0tUT1ArMTUmLTE2O3JldHVybiByZXR9KSxzdGF0aWNBbGxvYzooZnVuY3Rpb24oc2l6ZSl7dmFyIHJldD1TVEFUSUNUT1A7U1RBVElDVE9QPVNUQVRJQ1RPUCtzaXplfDA7U1RBVElDVE9QPVNUQVRJQ1RPUCsxNSYtMTY7cmV0dXJuIHJldH0pLGR5bmFtaWNBbGxvYzooZnVuY3Rpb24oc2l6ZSl7dmFyIHJldD1EWU5BTUlDVE9QO0RZTkFNSUNUT1A9RFlOQU1JQ1RPUCtzaXplfDA7RFlOQU1JQ1RPUD1EWU5BTUlDVE9QKzE1Ji0xNjtpZihEWU5BTUlDVE9QPj1UT1RBTF9NRU1PUlkpe3ZhciBzdWNjZXNzPWVubGFyZ2VNZW1vcnkoKTtpZighc3VjY2Vzcyl7RFlOQU1JQ1RPUD1yZXQ7cmV0dXJuIDB9fXJldHVybiByZXR9KSxhbGlnbk1lbW9yeTooZnVuY3Rpb24oc2l6ZSxxdWFudHVtKXt2YXIgcmV0PXNpemU9TWF0aC5jZWlsKHNpemUvKHF1YW50dW0/cXVhbnR1bToxNikpKihxdWFudHVtP3F1YW50dW06MTYpO3JldHVybiByZXR9KSxtYWtlQmlnSW50OihmdW5jdGlvbihsb3csaGlnaCx1bnNpZ25lZCl7dmFyIHJldD11bnNpZ25lZD8rKGxvdz4+PjApKyArKGhpZ2g+Pj4wKSorNDI5NDk2NzI5NjorKGxvdz4+PjApKyArKGhpZ2h8MCkqKzQyOTQ5NjcyOTY7cmV0dXJuIHJldH0pLEdMT0JBTF9CQVNFOjgsUVVBTlRVTV9TSVpFOjQsX19kdW1teV9fOjB9O01vZHVsZVtcIlJ1bnRpbWVcIl09UnVudGltZTt2YXIgX19USFJFV19fPTA7dmFyIEFCT1JUPWZhbHNlO3ZhciBFWElUU1RBVFVTPTA7dmFyIHVuZGVmPTA7dmFyIHRlbXBWYWx1ZSx0ZW1wSW50LHRlbXBCaWdJbnQsdGVtcEludDIsdGVtcEJpZ0ludDIsdGVtcFBhaXIsdGVtcEJpZ0ludEksdGVtcEJpZ0ludFIsdGVtcEJpZ0ludFMsdGVtcEJpZ0ludFAsdGVtcEJpZ0ludEQsdGVtcERvdWJsZSx0ZW1wRmxvYXQ7dmFyIHRlbXBJNjQsdGVtcEk2NGI7dmFyIHRlbXBSZXQwLHRlbXBSZXQxLHRlbXBSZXQyLHRlbXBSZXQzLHRlbXBSZXQ0LHRlbXBSZXQ1LHRlbXBSZXQ2LHRlbXBSZXQ3LHRlbXBSZXQ4LHRlbXBSZXQ5O2Z1bmN0aW9uIGFzc2VydChjb25kaXRpb24sdGV4dCl7aWYoIWNvbmRpdGlvbil7YWJvcnQoXCJBc3NlcnRpb24gZmFpbGVkOiBcIit0ZXh0KX19dmFyIGdsb2JhbFNjb3BlPXRoaXM7ZnVuY3Rpb24gZ2V0Q0Z1bmMoaWRlbnQpe3ZhciBmdW5jPU1vZHVsZVtcIl9cIitpZGVudF07aWYoIWZ1bmMpe2Fib3J0KFwiTk9fRFlOQU1JQ19FWEVDVVRJT04gd2FzIHNldCwgY2Fubm90IGV2YWwgLSBjY2FsbC9jd3JhcCBhcmUgbm90IGZ1bmN0aW9uYWxcIil9YXNzZXJ0KGZ1bmMsXCJDYW5ub3QgY2FsbCB1bmtub3duIGZ1bmN0aW9uIFwiK2lkZW50K1wiIChwZXJoYXBzIExMVk0gb3B0aW1pemF0aW9ucyBvciBjbG9zdXJlIHJlbW92ZWQgaXQ/KVwiKTtyZXR1cm4gZnVuY312YXIgY3dyYXAsY2NhbGw7KChmdW5jdGlvbigpe3ZhciBKU2Z1bmNzPXtcInN0YWNrU2F2ZVwiOihmdW5jdGlvbigpe1J1bnRpbWUuc3RhY2tTYXZlKCl9KSxcInN0YWNrUmVzdG9yZVwiOihmdW5jdGlvbigpe1J1bnRpbWUuc3RhY2tSZXN0b3JlKCl9KSxcImFycmF5VG9DXCI6KGZ1bmN0aW9uKGFycil7dmFyIHJldD1SdW50aW1lLnN0YWNrQWxsb2MoYXJyLmxlbmd0aCk7d3JpdGVBcnJheVRvTWVtb3J5KGFycixyZXQpO3JldHVybiByZXR9KSxcInN0cmluZ1RvQ1wiOihmdW5jdGlvbihzdHIpe3ZhciByZXQ9MDtpZihzdHIhPT1udWxsJiZzdHIhPT11bmRlZmluZWQmJnN0ciE9PTApe3JldD1SdW50aW1lLnN0YWNrQWxsb2MoKHN0ci5sZW5ndGg8PDIpKzEpO3dyaXRlU3RyaW5nVG9NZW1vcnkoc3RyLHJldCl9cmV0dXJuIHJldH0pfTt2YXIgdG9DPXtcInN0cmluZ1wiOkpTZnVuY3NbXCJzdHJpbmdUb0NcIl0sXCJhcnJheVwiOkpTZnVuY3NbXCJhcnJheVRvQ1wiXX07Y2NhbGw9ZnVuY3Rpb24gY2NhbGxGdW5jKGlkZW50LHJldHVyblR5cGUsYXJnVHlwZXMsYXJncyxvcHRzKXt2YXIgZnVuYz1nZXRDRnVuYyhpZGVudCk7dmFyIGNBcmdzPVtdO3ZhciBzdGFjaz0wO2lmKGFyZ3Mpe2Zvcih2YXIgaT0wO2k8YXJncy5sZW5ndGg7aSsrKXt2YXIgY29udmVydGVyPXRvQ1thcmdUeXBlc1tpXV07aWYoY29udmVydGVyKXtpZihzdGFjaz09PTApc3RhY2s9UnVudGltZS5zdGFja1NhdmUoKTtjQXJnc1tpXT1jb252ZXJ0ZXIoYXJnc1tpXSl9ZWxzZXtjQXJnc1tpXT1hcmdzW2ldfX19dmFyIHJldD1mdW5jLmFwcGx5KG51bGwsY0FyZ3MpO2lmKHJldHVyblR5cGU9PT1cInN0cmluZ1wiKXJldD1Qb2ludGVyX3N0cmluZ2lmeShyZXQpO2lmKHN0YWNrIT09MCl7aWYob3B0cyYmb3B0cy5hc3luYyl7RW10ZXJwcmV0ZXJBc3luYy5hc3luY0ZpbmFsaXplcnMucHVzaCgoZnVuY3Rpb24oKXtSdW50aW1lLnN0YWNrUmVzdG9yZShzdGFjayl9KSk7cmV0dXJufVJ1bnRpbWUuc3RhY2tSZXN0b3JlKHN0YWNrKX1yZXR1cm4gcmV0fTtjd3JhcD1mdW5jdGlvbiBjd3JhcChpZGVudCxyZXR1cm5UeXBlLGFyZ1R5cGVzKXtyZXR1cm4oZnVuY3Rpb24oKXtyZXR1cm4gY2NhbGwoaWRlbnQscmV0dXJuVHlwZSxhcmdUeXBlcyxhcmd1bWVudHMpfSl9fSkpKCk7TW9kdWxlW1wiY2NhbGxcIl09Y2NhbGw7TW9kdWxlW1wiY3dyYXBcIl09Y3dyYXA7ZnVuY3Rpb24gc2V0VmFsdWUocHRyLHZhbHVlLHR5cGUsbm9TYWZlKXt0eXBlPXR5cGV8fFwiaThcIjtpZih0eXBlLmNoYXJBdCh0eXBlLmxlbmd0aC0xKT09PVwiKlwiKXR5cGU9XCJpMzJcIjtzd2l0Y2godHlwZSl7Y2FzZVwiaTFcIjpIRUFQOFtwdHI+PjBdPXZhbHVlO2JyZWFrO2Nhc2VcImk4XCI6SEVBUDhbcHRyPj4wXT12YWx1ZTticmVhaztjYXNlXCJpMTZcIjpIRUFQMTZbcHRyPj4xXT12YWx1ZTticmVhaztjYXNlXCJpMzJcIjpIRUFQMzJbcHRyPj4yXT12YWx1ZTticmVhaztjYXNlXCJpNjRcIjp0ZW1wSTY0PVt2YWx1ZT4+PjAsKHRlbXBEb3VibGU9dmFsdWUsK01hdGhfYWJzKHRlbXBEb3VibGUpPj0rMT90ZW1wRG91YmxlPiswPyhNYXRoX21pbigrTWF0aF9mbG9vcih0ZW1wRG91YmxlLys0Mjk0OTY3Mjk2KSwrNDI5NDk2NzI5NSl8MCk+Pj4wOn5+K01hdGhfY2VpbCgodGVtcERvdWJsZS0gKyh+fnRlbXBEb3VibGU+Pj4wKSkvKzQyOTQ5NjcyOTYpPj4+MDowKV0sSEVBUDMyW3B0cj4+Ml09dGVtcEk2NFswXSxIRUFQMzJbcHRyKzQ+PjJdPXRlbXBJNjRbMV07YnJlYWs7Y2FzZVwiZmxvYXRcIjpIRUFQRjMyW3B0cj4+Ml09dmFsdWU7YnJlYWs7Y2FzZVwiZG91YmxlXCI6SEVBUEY2NFtwdHI+PjNdPXZhbHVlO2JyZWFrO2RlZmF1bHQ6YWJvcnQoXCJpbnZhbGlkIHR5cGUgZm9yIHNldFZhbHVlOiBcIit0eXBlKX19TW9kdWxlW1wic2V0VmFsdWVcIl09c2V0VmFsdWU7ZnVuY3Rpb24gZ2V0VmFsdWUocHRyLHR5cGUsbm9TYWZlKXt0eXBlPXR5cGV8fFwiaThcIjtpZih0eXBlLmNoYXJBdCh0eXBlLmxlbmd0aC0xKT09PVwiKlwiKXR5cGU9XCJpMzJcIjtzd2l0Y2godHlwZSl7Y2FzZVwiaTFcIjpyZXR1cm4gSEVBUDhbcHRyPj4wXTtjYXNlXCJpOFwiOnJldHVybiBIRUFQOFtwdHI+PjBdO2Nhc2VcImkxNlwiOnJldHVybiBIRUFQMTZbcHRyPj4xXTtjYXNlXCJpMzJcIjpyZXR1cm4gSEVBUDMyW3B0cj4+Ml07Y2FzZVwiaTY0XCI6cmV0dXJuIEhFQVAzMltwdHI+PjJdO2Nhc2VcImZsb2F0XCI6cmV0dXJuIEhFQVBGMzJbcHRyPj4yXTtjYXNlXCJkb3VibGVcIjpyZXR1cm4gSEVBUEY2NFtwdHI+PjNdO2RlZmF1bHQ6YWJvcnQoXCJpbnZhbGlkIHR5cGUgZm9yIHNldFZhbHVlOiBcIit0eXBlKX1yZXR1cm4gbnVsbH1Nb2R1bGVbXCJnZXRWYWx1ZVwiXT1nZXRWYWx1ZTt2YXIgQUxMT0NfTk9STUFMPTA7dmFyIEFMTE9DX1NUQUNLPTE7dmFyIEFMTE9DX1NUQVRJQz0yO3ZhciBBTExPQ19EWU5BTUlDPTM7dmFyIEFMTE9DX05PTkU9NDtNb2R1bGVbXCJBTExPQ19OT1JNQUxcIl09QUxMT0NfTk9STUFMO01vZHVsZVtcIkFMTE9DX1NUQUNLXCJdPUFMTE9DX1NUQUNLO01vZHVsZVtcIkFMTE9DX1NUQVRJQ1wiXT1BTExPQ19TVEFUSUM7TW9kdWxlW1wiQUxMT0NfRFlOQU1JQ1wiXT1BTExPQ19EWU5BTUlDO01vZHVsZVtcIkFMTE9DX05PTkVcIl09QUxMT0NfTk9ORTtmdW5jdGlvbiBhbGxvY2F0ZShzbGFiLHR5cGVzLGFsbG9jYXRvcixwdHIpe3ZhciB6ZXJvaW5pdCxzaXplO2lmKHR5cGVvZiBzbGFiPT09XCJudW1iZXJcIil7emVyb2luaXQ9dHJ1ZTtzaXplPXNsYWJ9ZWxzZXt6ZXJvaW5pdD1mYWxzZTtzaXplPXNsYWIubGVuZ3RofXZhciBzaW5nbGVUeXBlPXR5cGVvZiB0eXBlcz09PVwic3RyaW5nXCI/dHlwZXM6bnVsbDt2YXIgcmV0O2lmKGFsbG9jYXRvcj09QUxMT0NfTk9ORSl7cmV0PXB0cn1lbHNle3JldD1bX21hbGxvYyxSdW50aW1lLnN0YWNrQWxsb2MsUnVudGltZS5zdGF0aWNBbGxvYyxSdW50aW1lLmR5bmFtaWNBbGxvY11bYWxsb2NhdG9yPT09dW5kZWZpbmVkP0FMTE9DX1NUQVRJQzphbGxvY2F0b3JdKE1hdGgubWF4KHNpemUsc2luZ2xlVHlwZT8xOnR5cGVzLmxlbmd0aCkpfWlmKHplcm9pbml0KXt2YXIgcHRyPXJldCxzdG9wO2Fzc2VydCgocmV0JjMpPT0wKTtzdG9wPXJldCsoc2l6ZSZ+Myk7Zm9yKDtwdHI8c3RvcDtwdHIrPTQpe0hFQVAzMltwdHI+PjJdPTB9c3RvcD1yZXQrc2l6ZTt3aGlsZShwdHI8c3RvcCl7SEVBUDhbcHRyKys+PjBdPTB9cmV0dXJuIHJldH1pZihzaW5nbGVUeXBlPT09XCJpOFwiKXtpZihzbGFiLnN1YmFycmF5fHxzbGFiLnNsaWNlKXtIRUFQVTguc2V0KHNsYWIscmV0KX1lbHNle0hFQVBVOC5zZXQobmV3IFVpbnQ4QXJyYXkoc2xhYikscmV0KX1yZXR1cm4gcmV0fXZhciBpPTAsdHlwZSx0eXBlU2l6ZSxwcmV2aW91c1R5cGU7d2hpbGUoaTxzaXplKXt2YXIgY3Vycj1zbGFiW2ldO2lmKHR5cGVvZiBjdXJyPT09XCJmdW5jdGlvblwiKXtjdXJyPVJ1bnRpbWUuZ2V0RnVuY3Rpb25JbmRleChjdXJyKX10eXBlPXNpbmdsZVR5cGV8fHR5cGVzW2ldO2lmKHR5cGU9PT0wKXtpKys7Y29udGludWV9aWYodHlwZT09XCJpNjRcIil0eXBlPVwiaTMyXCI7c2V0VmFsdWUocmV0K2ksY3Vycix0eXBlKTtpZihwcmV2aW91c1R5cGUhPT10eXBlKXt0eXBlU2l6ZT1SdW50aW1lLmdldE5hdGl2ZVR5cGVTaXplKHR5cGUpO3ByZXZpb3VzVHlwZT10eXBlfWkrPXR5cGVTaXplfXJldHVybiByZXR9TW9kdWxlW1wiYWxsb2NhdGVcIl09YWxsb2NhdGU7ZnVuY3Rpb24gZ2V0TWVtb3J5KHNpemUpe2lmKCFzdGF0aWNTZWFsZWQpcmV0dXJuIFJ1bnRpbWUuc3RhdGljQWxsb2Moc2l6ZSk7aWYodHlwZW9mIF9zYnJrIT09XCJ1bmRlZmluZWRcIiYmIV9zYnJrLmNhbGxlZHx8IXJ1bnRpbWVJbml0aWFsaXplZClyZXR1cm4gUnVudGltZS5keW5hbWljQWxsb2Moc2l6ZSk7cmV0dXJuIF9tYWxsb2Moc2l6ZSl9TW9kdWxlW1wiZ2V0TWVtb3J5XCJdPWdldE1lbW9yeTtmdW5jdGlvbiBQb2ludGVyX3N0cmluZ2lmeShwdHIsbGVuZ3RoKXtpZihsZW5ndGg9PT0wfHwhcHRyKXJldHVyblwiXCI7dmFyIGhhc1V0Zj0wO3ZhciB0O3ZhciBpPTA7d2hpbGUoMSl7dD1IRUFQVThbcHRyK2k+PjBdO2hhc1V0Znw9dDtpZih0PT0wJiYhbGVuZ3RoKWJyZWFrO2krKztpZihsZW5ndGgmJmk9PWxlbmd0aClicmVha31pZighbGVuZ3RoKWxlbmd0aD1pO3ZhciByZXQ9XCJcIjtpZihoYXNVdGY8MTI4KXt2YXIgTUFYX0NIVU5LPTEwMjQ7dmFyIGN1cnI7d2hpbGUobGVuZ3RoPjApe2N1cnI9U3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsSEVBUFU4LnN1YmFycmF5KHB0cixwdHIrTWF0aC5taW4obGVuZ3RoLE1BWF9DSFVOSykpKTtyZXQ9cmV0P3JldCtjdXJyOmN1cnI7cHRyKz1NQVhfQ0hVTks7bGVuZ3RoLT1NQVhfQ0hVTkt9cmV0dXJuIHJldH1yZXR1cm4gTW9kdWxlW1wiVVRGOFRvU3RyaW5nXCJdKHB0cil9TW9kdWxlW1wiUG9pbnRlcl9zdHJpbmdpZnlcIl09UG9pbnRlcl9zdHJpbmdpZnk7ZnVuY3Rpb24gQXNjaWlUb1N0cmluZyhwdHIpe3ZhciBzdHI9XCJcIjt3aGlsZSgxKXt2YXIgY2g9SEVBUDhbcHRyKys+PjBdO2lmKCFjaClyZXR1cm4gc3RyO3N0cis9U3RyaW5nLmZyb21DaGFyQ29kZShjaCl9fU1vZHVsZVtcIkFzY2lpVG9TdHJpbmdcIl09QXNjaWlUb1N0cmluZztmdW5jdGlvbiBzdHJpbmdUb0FzY2lpKHN0cixvdXRQdHIpe3JldHVybiB3cml0ZUFzY2lpVG9NZW1vcnkoc3RyLG91dFB0cixmYWxzZSl9TW9kdWxlW1wic3RyaW5nVG9Bc2NpaVwiXT1zdHJpbmdUb0FzY2lpO2Z1bmN0aW9uIFVURjhBcnJheVRvU3RyaW5nKHU4QXJyYXksaWR4KXt2YXIgdTAsdTEsdTIsdTMsdTQsdTU7dmFyIHN0cj1cIlwiO3doaWxlKDEpe3UwPXU4QXJyYXlbaWR4KytdO2lmKCF1MClyZXR1cm4gc3RyO2lmKCEodTAmMTI4KSl7c3RyKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHUwKTtjb250aW51ZX11MT11OEFycmF5W2lkeCsrXSY2MztpZigodTAmMjI0KT09MTkyKXtzdHIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKHUwJjMxKTw8Nnx1MSk7Y29udGludWV9dTI9dThBcnJheVtpZHgrK10mNjM7aWYoKHUwJjI0MCk9PTIyNCl7dTA9KHUwJjE1KTw8MTJ8dTE8PDZ8dTJ9ZWxzZXt1Mz11OEFycmF5W2lkeCsrXSY2MztpZigodTAmMjQ4KT09MjQwKXt1MD0odTAmNyk8PDE4fHUxPDwxMnx1Mjw8Nnx1M31lbHNle3U0PXU4QXJyYXlbaWR4KytdJjYzO2lmKCh1MCYyNTIpPT0yNDgpe3UwPSh1MCYzKTw8MjR8dTE8PDE4fHUyPDwxMnx1Mzw8Nnx1NH1lbHNle3U1PXU4QXJyYXlbaWR4KytdJjYzO3UwPSh1MCYxKTw8MzB8dTE8PDI0fHUyPDwxOHx1Mzw8MTJ8dTQ8PDZ8dTV9fX1pZih1MDw2NTUzNil7c3RyKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHUwKX1lbHNle3ZhciBjaD11MC02NTUzNjtzdHIrPVN0cmluZy5mcm9tQ2hhckNvZGUoNTUyOTZ8Y2g+PjEwLDU2MzIwfGNoJjEwMjMpfX19TW9kdWxlW1wiVVRGOEFycmF5VG9TdHJpbmdcIl09VVRGOEFycmF5VG9TdHJpbmc7ZnVuY3Rpb24gVVRGOFRvU3RyaW5nKHB0cil7cmV0dXJuIFVURjhBcnJheVRvU3RyaW5nKEhFQVBVOCxwdHIpfU1vZHVsZVtcIlVURjhUb1N0cmluZ1wiXT1VVEY4VG9TdHJpbmc7ZnVuY3Rpb24gc3RyaW5nVG9VVEY4QXJyYXkoc3RyLG91dFU4QXJyYXksb3V0SWR4LG1heEJ5dGVzVG9Xcml0ZSl7aWYoIShtYXhCeXRlc1RvV3JpdGU+MCkpcmV0dXJuIDA7dmFyIHN0YXJ0SWR4PW91dElkeDt2YXIgZW5kSWR4PW91dElkeCttYXhCeXRlc1RvV3JpdGUtMTtmb3IodmFyIGk9MDtpPHN0ci5sZW5ndGg7KytpKXt2YXIgdT1zdHIuY2hhckNvZGVBdChpKTtpZih1Pj01NTI5NiYmdTw9NTczNDMpdT02NTUzNisoKHUmMTAyMyk8PDEwKXxzdHIuY2hhckNvZGVBdCgrK2kpJjEwMjM7aWYodTw9MTI3KXtpZihvdXRJZHg+PWVuZElkeClicmVhaztvdXRVOEFycmF5W291dElkeCsrXT11fWVsc2UgaWYodTw9MjA0Nyl7aWYob3V0SWR4KzE+PWVuZElkeClicmVhaztvdXRVOEFycmF5W291dElkeCsrXT0xOTJ8dT4+NjtvdXRVOEFycmF5W291dElkeCsrXT0xMjh8dSY2M31lbHNlIGlmKHU8PTY1NTM1KXtpZihvdXRJZHgrMj49ZW5kSWR4KWJyZWFrO291dFU4QXJyYXlbb3V0SWR4KytdPTIyNHx1Pj4xMjtvdXRVOEFycmF5W291dElkeCsrXT0xMjh8dT4+NiY2MztvdXRVOEFycmF5W291dElkeCsrXT0xMjh8dSY2M31lbHNlIGlmKHU8PTIwOTcxNTEpe2lmKG91dElkeCszPj1lbmRJZHgpYnJlYWs7b3V0VThBcnJheVtvdXRJZHgrK109MjQwfHU+PjE4O291dFU4QXJyYXlbb3V0SWR4KytdPTEyOHx1Pj4xMiY2MztvdXRVOEFycmF5W291dElkeCsrXT0xMjh8dT4+NiY2MztvdXRVOEFycmF5W291dElkeCsrXT0xMjh8dSY2M31lbHNlIGlmKHU8PTY3MTA4ODYzKXtpZihvdXRJZHgrND49ZW5kSWR4KWJyZWFrO291dFU4QXJyYXlbb3V0SWR4KytdPTI0OHx1Pj4yNDtvdXRVOEFycmF5W291dElkeCsrXT0xMjh8dT4+MTgmNjM7b3V0VThBcnJheVtvdXRJZHgrK109MTI4fHU+PjEyJjYzO291dFU4QXJyYXlbb3V0SWR4KytdPTEyOHx1Pj42JjYzO291dFU4QXJyYXlbb3V0SWR4KytdPTEyOHx1JjYzfWVsc2V7aWYob3V0SWR4KzU+PWVuZElkeClicmVhaztvdXRVOEFycmF5W291dElkeCsrXT0yNTJ8dT4+MzA7b3V0VThBcnJheVtvdXRJZHgrK109MTI4fHU+PjI0JjYzO291dFU4QXJyYXlbb3V0SWR4KytdPTEyOHx1Pj4xOCY2MztvdXRVOEFycmF5W291dElkeCsrXT0xMjh8dT4+MTImNjM7b3V0VThBcnJheVtvdXRJZHgrK109MTI4fHU+PjYmNjM7b3V0VThBcnJheVtvdXRJZHgrK109MTI4fHUmNjN9fW91dFU4QXJyYXlbb3V0SWR4XT0wO3JldHVybiBvdXRJZHgtc3RhcnRJZHh9TW9kdWxlW1wic3RyaW5nVG9VVEY4QXJyYXlcIl09c3RyaW5nVG9VVEY4QXJyYXk7ZnVuY3Rpb24gc3RyaW5nVG9VVEY4KHN0cixvdXRQdHIsbWF4Qnl0ZXNUb1dyaXRlKXtyZXR1cm4gc3RyaW5nVG9VVEY4QXJyYXkoc3RyLEhFQVBVOCxvdXRQdHIsbWF4Qnl0ZXNUb1dyaXRlKX1Nb2R1bGVbXCJzdHJpbmdUb1VURjhcIl09c3RyaW5nVG9VVEY4O2Z1bmN0aW9uIGxlbmd0aEJ5dGVzVVRGOChzdHIpe3ZhciBsZW49MDtmb3IodmFyIGk9MDtpPHN0ci5sZW5ndGg7KytpKXt2YXIgdT1zdHIuY2hhckNvZGVBdChpKTtpZih1Pj01NTI5NiYmdTw9NTczNDMpdT02NTUzNisoKHUmMTAyMyk8PDEwKXxzdHIuY2hhckNvZGVBdCgrK2kpJjEwMjM7aWYodTw9MTI3KXsrK2xlbn1lbHNlIGlmKHU8PTIwNDcpe2xlbis9Mn1lbHNlIGlmKHU8PTY1NTM1KXtsZW4rPTN9ZWxzZSBpZih1PD0yMDk3MTUxKXtsZW4rPTR9ZWxzZSBpZih1PD02NzEwODg2Myl7bGVuKz01fWVsc2V7bGVuKz02fX1yZXR1cm4gbGVufU1vZHVsZVtcImxlbmd0aEJ5dGVzVVRGOFwiXT1sZW5ndGhCeXRlc1VURjg7ZnVuY3Rpb24gVVRGMTZUb1N0cmluZyhwdHIpe3ZhciBpPTA7dmFyIHN0cj1cIlwiO3doaWxlKDEpe3ZhciBjb2RlVW5pdD1IRUFQMTZbcHRyK2kqMj4+MV07aWYoY29kZVVuaXQ9PTApcmV0dXJuIHN0cjsrK2k7c3RyKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGNvZGVVbml0KX19TW9kdWxlW1wiVVRGMTZUb1N0cmluZ1wiXT1VVEYxNlRvU3RyaW5nO2Z1bmN0aW9uIHN0cmluZ1RvVVRGMTYoc3RyLG91dFB0cixtYXhCeXRlc1RvV3JpdGUpe2lmKG1heEJ5dGVzVG9Xcml0ZT09PXVuZGVmaW5lZCl7bWF4Qnl0ZXNUb1dyaXRlPTIxNDc0ODM2NDd9aWYobWF4Qnl0ZXNUb1dyaXRlPDIpcmV0dXJuIDA7bWF4Qnl0ZXNUb1dyaXRlLT0yO3ZhciBzdGFydFB0cj1vdXRQdHI7dmFyIG51bUNoYXJzVG9Xcml0ZT1tYXhCeXRlc1RvV3JpdGU8c3RyLmxlbmd0aCoyP21heEJ5dGVzVG9Xcml0ZS8yOnN0ci5sZW5ndGg7Zm9yKHZhciBpPTA7aTxudW1DaGFyc1RvV3JpdGU7KytpKXt2YXIgY29kZVVuaXQ9c3RyLmNoYXJDb2RlQXQoaSk7SEVBUDE2W291dFB0cj4+MV09Y29kZVVuaXQ7b3V0UHRyKz0yfUhFQVAxNltvdXRQdHI+PjFdPTA7cmV0dXJuIG91dFB0ci1zdGFydFB0cn1Nb2R1bGVbXCJzdHJpbmdUb1VURjE2XCJdPXN0cmluZ1RvVVRGMTY7ZnVuY3Rpb24gbGVuZ3RoQnl0ZXNVVEYxNihzdHIpe3JldHVybiBzdHIubGVuZ3RoKjJ9TW9kdWxlW1wibGVuZ3RoQnl0ZXNVVEYxNlwiXT1sZW5ndGhCeXRlc1VURjE2O2Z1bmN0aW9uIFVURjMyVG9TdHJpbmcocHRyKXt2YXIgaT0wO3ZhciBzdHI9XCJcIjt3aGlsZSgxKXt2YXIgdXRmMzI9SEVBUDMyW3B0citpKjQ+PjJdO2lmKHV0ZjMyPT0wKXJldHVybiBzdHI7KytpO2lmKHV0ZjMyPj02NTUzNil7dmFyIGNoPXV0ZjMyLTY1NTM2O3N0cis9U3RyaW5nLmZyb21DaGFyQ29kZSg1NTI5NnxjaD4+MTAsNTYzMjB8Y2gmMTAyMyl9ZWxzZXtzdHIrPVN0cmluZy5mcm9tQ2hhckNvZGUodXRmMzIpfX19TW9kdWxlW1wiVVRGMzJUb1N0cmluZ1wiXT1VVEYzMlRvU3RyaW5nO2Z1bmN0aW9uIHN0cmluZ1RvVVRGMzIoc3RyLG91dFB0cixtYXhCeXRlc1RvV3JpdGUpe2lmKG1heEJ5dGVzVG9Xcml0ZT09PXVuZGVmaW5lZCl7bWF4Qnl0ZXNUb1dyaXRlPTIxNDc0ODM2NDd9aWYobWF4Qnl0ZXNUb1dyaXRlPDQpcmV0dXJuIDA7dmFyIHN0YXJ0UHRyPW91dFB0cjt2YXIgZW5kUHRyPXN0YXJ0UHRyK21heEJ5dGVzVG9Xcml0ZS00O2Zvcih2YXIgaT0wO2k8c3RyLmxlbmd0aDsrK2kpe3ZhciBjb2RlVW5pdD1zdHIuY2hhckNvZGVBdChpKTtpZihjb2RlVW5pdD49NTUyOTYmJmNvZGVVbml0PD01NzM0Myl7dmFyIHRyYWlsU3Vycm9nYXRlPXN0ci5jaGFyQ29kZUF0KCsraSk7Y29kZVVuaXQ9NjU1MzYrKChjb2RlVW5pdCYxMDIzKTw8MTApfHRyYWlsU3Vycm9nYXRlJjEwMjN9SEVBUDMyW291dFB0cj4+Ml09Y29kZVVuaXQ7b3V0UHRyKz00O2lmKG91dFB0cis0PmVuZFB0cilicmVha31IRUFQMzJbb3V0UHRyPj4yXT0wO3JldHVybiBvdXRQdHItc3RhcnRQdHJ9TW9kdWxlW1wic3RyaW5nVG9VVEYzMlwiXT1zdHJpbmdUb1VURjMyO2Z1bmN0aW9uIGxlbmd0aEJ5dGVzVVRGMzIoc3RyKXt2YXIgbGVuPTA7Zm9yKHZhciBpPTA7aTxzdHIubGVuZ3RoOysraSl7dmFyIGNvZGVVbml0PXN0ci5jaGFyQ29kZUF0KGkpO2lmKGNvZGVVbml0Pj01NTI5NiYmY29kZVVuaXQ8PTU3MzQzKSsraTtsZW4rPTR9cmV0dXJuIGxlbn1Nb2R1bGVbXCJsZW5ndGhCeXRlc1VURjMyXCJdPWxlbmd0aEJ5dGVzVVRGMzI7ZnVuY3Rpb24gZGVtYW5nbGUoZnVuYyl7dmFyIGhhc0xpYmN4eGFiaT0hIU1vZHVsZVtcIl9fX2N4YV9kZW1hbmdsZVwiXTtpZihoYXNMaWJjeHhhYmkpe3RyeXt2YXIgYnVmPV9tYWxsb2MoZnVuYy5sZW5ndGgpO3dyaXRlU3RyaW5nVG9NZW1vcnkoZnVuYy5zdWJzdHIoMSksYnVmKTt2YXIgc3RhdHVzPV9tYWxsb2MoNCk7dmFyIHJldD1Nb2R1bGVbXCJfX19jeGFfZGVtYW5nbGVcIl0oYnVmLDAsMCxzdGF0dXMpO2lmKGdldFZhbHVlKHN0YXR1cyxcImkzMlwiKT09PTAmJnJldCl7cmV0dXJuIFBvaW50ZXJfc3RyaW5naWZ5KHJldCl9fWNhdGNoKGUpe31maW5hbGx5e2lmKGJ1ZilfZnJlZShidWYpO2lmKHN0YXR1cylfZnJlZShzdGF0dXMpO2lmKHJldClfZnJlZShyZXQpfX12YXIgaT0zO3ZhciBiYXNpY1R5cGVzPXtcInZcIjpcInZvaWRcIixcImJcIjpcImJvb2xcIixcImNcIjpcImNoYXJcIixcInNcIjpcInNob3J0XCIsXCJpXCI6XCJpbnRcIixcImxcIjpcImxvbmdcIixcImZcIjpcImZsb2F0XCIsXCJkXCI6XCJkb3VibGVcIixcIndcIjpcIndjaGFyX3RcIixcImFcIjpcInNpZ25lZCBjaGFyXCIsXCJoXCI6XCJ1bnNpZ25lZCBjaGFyXCIsXCJ0XCI6XCJ1bnNpZ25lZCBzaG9ydFwiLFwialwiOlwidW5zaWduZWQgaW50XCIsXCJtXCI6XCJ1bnNpZ25lZCBsb25nXCIsXCJ4XCI6XCJsb25nIGxvbmdcIixcInlcIjpcInVuc2lnbmVkIGxvbmcgbG9uZ1wiLFwielwiOlwiLi4uXCJ9O3ZhciBzdWJzPVtdO3ZhciBmaXJzdD10cnVlO2Z1bmN0aW9uIGR1bXAoeCl7aWYoeClNb2R1bGUucHJpbnQoeCk7TW9kdWxlLnByaW50KGZ1bmMpO3ZhciBwcmU9XCJcIjtmb3IodmFyIGE9MDthPGk7YSsrKXByZSs9XCIgXCI7TW9kdWxlLnByaW50KHByZStcIl5cIil9ZnVuY3Rpb24gcGFyc2VOZXN0ZWQoKXtpKys7aWYoZnVuY1tpXT09PVwiS1wiKWkrKzt2YXIgcGFydHM9W107d2hpbGUoZnVuY1tpXSE9PVwiRVwiKXtpZihmdW5jW2ldPT09XCJTXCIpe2krKzt2YXIgbmV4dD1mdW5jLmluZGV4T2YoXCJfXCIsaSk7dmFyIG51bT1mdW5jLnN1YnN0cmluZyhpLG5leHQpfHwwO3BhcnRzLnB1c2goc3Vic1tudW1dfHxcIj9cIik7aT1uZXh0KzE7Y29udGludWV9aWYoZnVuY1tpXT09PVwiQ1wiKXtwYXJ0cy5wdXNoKHBhcnRzW3BhcnRzLmxlbmd0aC0xXSk7aSs9Mjtjb250aW51ZX12YXIgc2l6ZT1wYXJzZUludChmdW5jLnN1YnN0cihpKSk7dmFyIHByZT1zaXplLnRvU3RyaW5nKCkubGVuZ3RoO2lmKCFzaXplfHwhcHJlKXtpLS07YnJlYWt9dmFyIGN1cnI9ZnVuYy5zdWJzdHIoaStwcmUsc2l6ZSk7cGFydHMucHVzaChjdXJyKTtzdWJzLnB1c2goY3Vycik7aSs9cHJlK3NpemV9aSsrO3JldHVybiBwYXJ0c31mdW5jdGlvbiBwYXJzZShyYXdMaXN0LGxpbWl0LGFsbG93Vm9pZCl7bGltaXQ9bGltaXR8fEluZmluaXR5O3ZhciByZXQ9XCJcIixsaXN0PVtdO2Z1bmN0aW9uIGZsdXNoTGlzdCgpe3JldHVyblwiKFwiK2xpc3Quam9pbihcIiwgXCIpK1wiKVwifXZhciBuYW1lO2lmKGZ1bmNbaV09PT1cIk5cIil7bmFtZT1wYXJzZU5lc3RlZCgpLmpvaW4oXCI6OlwiKTtsaW1pdC0tO2lmKGxpbWl0PT09MClyZXR1cm4gcmF3TGlzdD9bbmFtZV06bmFtZX1lbHNle2lmKGZ1bmNbaV09PT1cIktcInx8Zmlyc3QmJmZ1bmNbaV09PT1cIkxcIilpKys7dmFyIHNpemU9cGFyc2VJbnQoZnVuYy5zdWJzdHIoaSkpO2lmKHNpemUpe3ZhciBwcmU9c2l6ZS50b1N0cmluZygpLmxlbmd0aDtuYW1lPWZ1bmMuc3Vic3RyKGkrcHJlLHNpemUpO2krPXByZStzaXplfX1maXJzdD1mYWxzZTtpZihmdW5jW2ldPT09XCJJXCIpe2krKzt2YXIgaUxpc3Q9cGFyc2UodHJ1ZSk7dmFyIGlSZXQ9cGFyc2UodHJ1ZSwxLHRydWUpO3JldCs9aVJldFswXStcIiBcIituYW1lK1wiPFwiK2lMaXN0LmpvaW4oXCIsIFwiKStcIj5cIn1lbHNle3JldD1uYW1lfXBhcmFtTG9vcDp3aGlsZShpPGZ1bmMubGVuZ3RoJiZsaW1pdC0tPjApe3ZhciBjPWZ1bmNbaSsrXTtpZihjIGluIGJhc2ljVHlwZXMpe2xpc3QucHVzaChiYXNpY1R5cGVzW2NdKX1lbHNle3N3aXRjaChjKXtjYXNlXCJQXCI6bGlzdC5wdXNoKHBhcnNlKHRydWUsMSx0cnVlKVswXStcIipcIik7YnJlYWs7Y2FzZVwiUlwiOmxpc3QucHVzaChwYXJzZSh0cnVlLDEsdHJ1ZSlbMF0rXCImXCIpO2JyZWFrO2Nhc2VcIkxcIjp7aSsrO3ZhciBlbmQ9ZnVuYy5pbmRleE9mKFwiRVwiLGkpO3ZhciBzaXplPWVuZC1pO2xpc3QucHVzaChmdW5jLnN1YnN0cihpLHNpemUpKTtpKz1zaXplKzI7YnJlYWt9O2Nhc2VcIkFcIjp7dmFyIHNpemU9cGFyc2VJbnQoZnVuYy5zdWJzdHIoaSkpO2krPXNpemUudG9TdHJpbmcoKS5sZW5ndGg7aWYoZnVuY1tpXSE9PVwiX1wiKXRocm93XCI/XCI7aSsrO2xpc3QucHVzaChwYXJzZSh0cnVlLDEsdHJ1ZSlbMF0rXCIgW1wiK3NpemUrXCJdXCIpO2JyZWFrfTtjYXNlXCJFXCI6YnJlYWsgcGFyYW1Mb29wO2RlZmF1bHQ6cmV0Kz1cIj9cIitjO2JyZWFrIHBhcmFtTG9vcH19fWlmKCFhbGxvd1ZvaWQmJmxpc3QubGVuZ3RoPT09MSYmbGlzdFswXT09PVwidm9pZFwiKWxpc3Q9W107aWYocmF3TGlzdCl7aWYocmV0KXtsaXN0LnB1c2gocmV0K1wiP1wiKX1yZXR1cm4gbGlzdH1lbHNle3JldHVybiByZXQrZmx1c2hMaXN0KCl9fXZhciBwYXJzZWQ9ZnVuYzt0cnl7aWYoZnVuYz09XCJPYmplY3QuX21haW5cInx8ZnVuYz09XCJfbWFpblwiKXtyZXR1cm5cIm1haW4oKVwifWlmKHR5cGVvZiBmdW5jPT09XCJudW1iZXJcIilmdW5jPVBvaW50ZXJfc3RyaW5naWZ5KGZ1bmMpO2lmKGZ1bmNbMF0hPT1cIl9cIilyZXR1cm4gZnVuYztpZihmdW5jWzFdIT09XCJfXCIpcmV0dXJuIGZ1bmM7aWYoZnVuY1syXSE9PVwiWlwiKXJldHVybiBmdW5jO3N3aXRjaChmdW5jWzNdKXtjYXNlXCJuXCI6cmV0dXJuXCJvcGVyYXRvciBuZXcoKVwiO2Nhc2VcImRcIjpyZXR1cm5cIm9wZXJhdG9yIGRlbGV0ZSgpXCJ9cGFyc2VkPXBhcnNlKCl9Y2F0Y2goZSl7cGFyc2VkKz1cIj9cIn1pZihwYXJzZWQuaW5kZXhPZihcIj9cIik+PTAmJiFoYXNMaWJjeHhhYmkpe1J1bnRpbWUud2Fybk9uY2UoXCJ3YXJuaW5nOiBhIHByb2JsZW0gb2NjdXJyZWQgaW4gYnVpbHRpbiBDKysgbmFtZSBkZW1hbmdsaW5nOyBidWlsZCB3aXRoICAtcyBERU1BTkdMRV9TVVBQT1JUPTEgIHRvIGxpbmsgaW4gbGliY3h4YWJpIGRlbWFuZ2xpbmdcIil9cmV0dXJuIHBhcnNlZH1mdW5jdGlvbiBkZW1hbmdsZUFsbCh0ZXh0KXtyZXR1cm4gdGV4dC5yZXBsYWNlKC9fX1pbXFx3XFxkX10rL2csKGZ1bmN0aW9uKHgpe3ZhciB5PWRlbWFuZ2xlKHgpO3JldHVybiB4PT09eT94OngrXCIgW1wiK3krXCJdXCJ9KSl9ZnVuY3Rpb24ganNTdGFja1RyYWNlKCl7dmFyIGVycj1uZXcgRXJyb3I7aWYoIWVyci5zdGFjayl7dHJ5e3Rocm93IG5ldyBFcnJvcigwKX1jYXRjaChlKXtlcnI9ZX1pZighZXJyLnN0YWNrKXtyZXR1cm5cIihubyBzdGFjayB0cmFjZSBhdmFpbGFibGUpXCJ9fXJldHVybiBlcnIuc3RhY2sudG9TdHJpbmcoKX1mdW5jdGlvbiBzdGFja1RyYWNlKCl7cmV0dXJuIGRlbWFuZ2xlQWxsKGpzU3RhY2tUcmFjZSgpKX1Nb2R1bGVbXCJzdGFja1RyYWNlXCJdPXN0YWNrVHJhY2U7dmFyIFBBR0VfU0laRT00MDk2O2Z1bmN0aW9uIGFsaWduTWVtb3J5UGFnZSh4KXtpZih4JTQwOTY+MCl7eCs9NDA5Ni14JTQwOTZ9cmV0dXJuIHh9dmFyIEhFQVA7dmFyIEhFQVA4LEhFQVBVOCxIRUFQMTYsSEVBUFUxNixIRUFQMzIsSEVBUFUzMixIRUFQRjMyLEhFQVBGNjQ7dmFyIFNUQVRJQ19CQVNFPTAsU1RBVElDVE9QPTAsc3RhdGljU2VhbGVkPWZhbHNlO3ZhciBTVEFDS19CQVNFPTAsU1RBQ0tUT1A9MCxTVEFDS19NQVg9MDt2YXIgRFlOQU1JQ19CQVNFPTAsRFlOQU1JQ1RPUD0wO2Z1bmN0aW9uIGFib3J0T25DYW5ub3RHcm93TWVtb3J5KCl7YWJvcnQoXCJDYW5ub3QgZW5sYXJnZSBtZW1vcnkgYXJyYXlzLiBFaXRoZXIgKDEpIGNvbXBpbGUgd2l0aCAgLXMgVE9UQUxfTUVNT1JZPVggIHdpdGggWCBoaWdoZXIgdGhhbiB0aGUgY3VycmVudCB2YWx1ZSBcIitUT1RBTF9NRU1PUlkrXCIsICgyKSBjb21waWxlIHdpdGggIC1zIEFMTE9XX01FTU9SWV9HUk9XVEg9MSAgd2hpY2ggYWRqdXN0cyB0aGUgc2l6ZSBhdCBydW50aW1lIGJ1dCBwcmV2ZW50cyBzb21lIG9wdGltaXphdGlvbnMsICgzKSBzZXQgTW9kdWxlLlRPVEFMX01FTU9SWSB0byBhIGhpZ2hlciB2YWx1ZSBiZWZvcmUgdGhlIHByb2dyYW0gcnVucywgb3IgaWYgeW91IHdhbnQgbWFsbG9jIHRvIHJldHVybiBOVUxMICgwKSBpbnN0ZWFkIG9mIHRoaXMgYWJvcnQsIGNvbXBpbGUgd2l0aCAgLXMgQUJPUlRJTkdfTUFMTE9DPTAgXCIpfWZ1bmN0aW9uIGVubGFyZ2VNZW1vcnkoKXthYm9ydE9uQ2Fubm90R3Jvd01lbW9yeSgpfXZhciBUT1RBTF9TVEFDSz1Nb2R1bGVbXCJUT1RBTF9TVEFDS1wiXXx8NTI0Mjg4MDt2YXIgVE9UQUxfTUVNT1JZPU1vZHVsZVtcIlRPVEFMX01FTU9SWVwiXXx8MzM1NTQ0MzI7dmFyIHRvdGFsTWVtb3J5PTY0KjEwMjQ7d2hpbGUodG90YWxNZW1vcnk8VE9UQUxfTUVNT1JZfHx0b3RhbE1lbW9yeTwyKlRPVEFMX1NUQUNLKXtpZih0b3RhbE1lbW9yeTwxNioxMDI0KjEwMjQpe3RvdGFsTWVtb3J5Kj0yfWVsc2V7dG90YWxNZW1vcnkrPTE2KjEwMjQqMTAyNH19aWYodG90YWxNZW1vcnkhPT1UT1RBTF9NRU1PUlkpe1RPVEFMX01FTU9SWT10b3RhbE1lbW9yeX1hc3NlcnQodHlwZW9mIEludDMyQXJyYXkhPT1cInVuZGVmaW5lZFwiJiZ0eXBlb2YgRmxvYXQ2NEFycmF5IT09XCJ1bmRlZmluZWRcIiYmISEobmV3IEludDMyQXJyYXkoMSkpW1wic3ViYXJyYXlcIl0mJiEhKG5ldyBJbnQzMkFycmF5KDEpKVtcInNldFwiXSxcIkpTIGVuZ2luZSBkb2VzIG5vdCBwcm92aWRlIGZ1bGwgdHlwZWQgYXJyYXkgc3VwcG9ydFwiKTt2YXIgYnVmZmVyO2J1ZmZlcj1uZXcgQXJyYXlCdWZmZXIoVE9UQUxfTUVNT1JZKTtIRUFQOD1uZXcgSW50OEFycmF5KGJ1ZmZlcik7SEVBUDE2PW5ldyBJbnQxNkFycmF5KGJ1ZmZlcik7SEVBUDMyPW5ldyBJbnQzMkFycmF5KGJ1ZmZlcik7SEVBUFU4PW5ldyBVaW50OEFycmF5KGJ1ZmZlcik7SEVBUFUxNj1uZXcgVWludDE2QXJyYXkoYnVmZmVyKTtIRUFQVTMyPW5ldyBVaW50MzJBcnJheShidWZmZXIpO0hFQVBGMzI9bmV3IEZsb2F0MzJBcnJheShidWZmZXIpO0hFQVBGNjQ9bmV3IEZsb2F0NjRBcnJheShidWZmZXIpO0hFQVAzMlswXT0yNTU7YXNzZXJ0KEhFQVBVOFswXT09PTI1NSYmSEVBUFU4WzNdPT09MCxcIlR5cGVkIGFycmF5cyAyIG11c3QgYmUgcnVuIG9uIGEgbGl0dGxlLWVuZGlhbiBzeXN0ZW1cIik7TW9kdWxlW1wiSEVBUFwiXT1IRUFQO01vZHVsZVtcImJ1ZmZlclwiXT1idWZmZXI7TW9kdWxlW1wiSEVBUDhcIl09SEVBUDg7TW9kdWxlW1wiSEVBUDE2XCJdPUhFQVAxNjtNb2R1bGVbXCJIRUFQMzJcIl09SEVBUDMyO01vZHVsZVtcIkhFQVBVOFwiXT1IRUFQVTg7TW9kdWxlW1wiSEVBUFUxNlwiXT1IRUFQVTE2O01vZHVsZVtcIkhFQVBVMzJcIl09SEVBUFUzMjtNb2R1bGVbXCJIRUFQRjMyXCJdPUhFQVBGMzI7TW9kdWxlW1wiSEVBUEY2NFwiXT1IRUFQRjY0O2Z1bmN0aW9uIGNhbGxSdW50aW1lQ2FsbGJhY2tzKGNhbGxiYWNrcyl7d2hpbGUoY2FsbGJhY2tzLmxlbmd0aD4wKXt2YXIgY2FsbGJhY2s9Y2FsbGJhY2tzLnNoaWZ0KCk7aWYodHlwZW9mIGNhbGxiYWNrPT1cImZ1bmN0aW9uXCIpe2NhbGxiYWNrKCk7Y29udGludWV9dmFyIGZ1bmM9Y2FsbGJhY2suZnVuYztpZih0eXBlb2YgZnVuYz09PVwibnVtYmVyXCIpe2lmKGNhbGxiYWNrLmFyZz09PXVuZGVmaW5lZCl7UnVudGltZS5keW5DYWxsKFwidlwiLGZ1bmMpfWVsc2V7UnVudGltZS5keW5DYWxsKFwidmlcIixmdW5jLFtjYWxsYmFjay5hcmddKX19ZWxzZXtmdW5jKGNhbGxiYWNrLmFyZz09PXVuZGVmaW5lZD9udWxsOmNhbGxiYWNrLmFyZyl9fX12YXIgX19BVFBSRVJVTl9fPVtdO3ZhciBfX0FUSU5JVF9fPVtdO3ZhciBfX0FUTUFJTl9fPVtdO3ZhciBfX0FURVhJVF9fPVtdO3ZhciBfX0FUUE9TVFJVTl9fPVtdO3ZhciBydW50aW1lSW5pdGlhbGl6ZWQ9ZmFsc2U7dmFyIHJ1bnRpbWVFeGl0ZWQ9ZmFsc2U7ZnVuY3Rpb24gcHJlUnVuKCl7aWYoTW9kdWxlW1wicHJlUnVuXCJdKXtpZih0eXBlb2YgTW9kdWxlW1wicHJlUnVuXCJdPT1cImZ1bmN0aW9uXCIpTW9kdWxlW1wicHJlUnVuXCJdPVtNb2R1bGVbXCJwcmVSdW5cIl1dO3doaWxlKE1vZHVsZVtcInByZVJ1blwiXS5sZW5ndGgpe2FkZE9uUHJlUnVuKE1vZHVsZVtcInByZVJ1blwiXS5zaGlmdCgpKX19Y2FsbFJ1bnRpbWVDYWxsYmFja3MoX19BVFBSRVJVTl9fKX1mdW5jdGlvbiBlbnN1cmVJbml0UnVudGltZSgpe2lmKHJ1bnRpbWVJbml0aWFsaXplZClyZXR1cm47cnVudGltZUluaXRpYWxpemVkPXRydWU7Y2FsbFJ1bnRpbWVDYWxsYmFja3MoX19BVElOSVRfXyl9ZnVuY3Rpb24gcHJlTWFpbigpe2NhbGxSdW50aW1lQ2FsbGJhY2tzKF9fQVRNQUlOX18pfWZ1bmN0aW9uIGV4aXRSdW50aW1lKCl7Y2FsbFJ1bnRpbWVDYWxsYmFja3MoX19BVEVYSVRfXyk7cnVudGltZUV4aXRlZD10cnVlfWZ1bmN0aW9uIHBvc3RSdW4oKXtpZihNb2R1bGVbXCJwb3N0UnVuXCJdKXtpZih0eXBlb2YgTW9kdWxlW1wicG9zdFJ1blwiXT09XCJmdW5jdGlvblwiKU1vZHVsZVtcInBvc3RSdW5cIl09W01vZHVsZVtcInBvc3RSdW5cIl1dO3doaWxlKE1vZHVsZVtcInBvc3RSdW5cIl0ubGVuZ3RoKXthZGRPblBvc3RSdW4oTW9kdWxlW1wicG9zdFJ1blwiXS5zaGlmdCgpKX19Y2FsbFJ1bnRpbWVDYWxsYmFja3MoX19BVFBPU1RSVU5fXyl9ZnVuY3Rpb24gYWRkT25QcmVSdW4oY2Ipe19fQVRQUkVSVU5fXy51bnNoaWZ0KGNiKX1Nb2R1bGVbXCJhZGRPblByZVJ1blwiXT1hZGRPblByZVJ1bjtmdW5jdGlvbiBhZGRPbkluaXQoY2Ipe19fQVRJTklUX18udW5zaGlmdChjYil9TW9kdWxlW1wiYWRkT25Jbml0XCJdPWFkZE9uSW5pdDtmdW5jdGlvbiBhZGRPblByZU1haW4oY2Ipe19fQVRNQUlOX18udW5zaGlmdChjYil9TW9kdWxlW1wiYWRkT25QcmVNYWluXCJdPWFkZE9uUHJlTWFpbjtmdW5jdGlvbiBhZGRPbkV4aXQoY2Ipe19fQVRFWElUX18udW5zaGlmdChjYil9TW9kdWxlW1wiYWRkT25FeGl0XCJdPWFkZE9uRXhpdDtmdW5jdGlvbiBhZGRPblBvc3RSdW4oY2Ipe19fQVRQT1NUUlVOX18udW5zaGlmdChjYil9TW9kdWxlW1wiYWRkT25Qb3N0UnVuXCJdPWFkZE9uUG9zdFJ1bjtmdW5jdGlvbiBpbnRBcnJheUZyb21TdHJpbmcoc3RyaW5neSxkb250QWRkTnVsbCxsZW5ndGgpe3ZhciBsZW49bGVuZ3RoPjA/bGVuZ3RoOmxlbmd0aEJ5dGVzVVRGOChzdHJpbmd5KSsxO3ZhciB1OGFycmF5PW5ldyBBcnJheShsZW4pO3ZhciBudW1CeXRlc1dyaXR0ZW49c3RyaW5nVG9VVEY4QXJyYXkoc3RyaW5neSx1OGFycmF5LDAsdThhcnJheS5sZW5ndGgpO2lmKGRvbnRBZGROdWxsKXU4YXJyYXkubGVuZ3RoPW51bUJ5dGVzV3JpdHRlbjtyZXR1cm4gdThhcnJheX1Nb2R1bGVbXCJpbnRBcnJheUZyb21TdHJpbmdcIl09aW50QXJyYXlGcm9tU3RyaW5nO2Z1bmN0aW9uIGludEFycmF5VG9TdHJpbmcoYXJyYXkpe3ZhciByZXQ9W107Zm9yKHZhciBpPTA7aTxhcnJheS5sZW5ndGg7aSsrKXt2YXIgY2hyPWFycmF5W2ldO2lmKGNocj4yNTUpe2NociY9MjU1fXJldC5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoY2hyKSl9cmV0dXJuIHJldC5qb2luKFwiXCIpfU1vZHVsZVtcImludEFycmF5VG9TdHJpbmdcIl09aW50QXJyYXlUb1N0cmluZztmdW5jdGlvbiB3cml0ZVN0cmluZ1RvTWVtb3J5KHN0cmluZyxidWZmZXIsZG9udEFkZE51bGwpe3ZhciBhcnJheT1pbnRBcnJheUZyb21TdHJpbmcoc3RyaW5nLGRvbnRBZGROdWxsKTt2YXIgaT0wO3doaWxlKGk8YXJyYXkubGVuZ3RoKXt2YXIgY2hyPWFycmF5W2ldO0hFQVA4W2J1ZmZlcitpPj4wXT1jaHI7aT1pKzF9fU1vZHVsZVtcIndyaXRlU3RyaW5nVG9NZW1vcnlcIl09d3JpdGVTdHJpbmdUb01lbW9yeTtmdW5jdGlvbiB3cml0ZUFycmF5VG9NZW1vcnkoYXJyYXksYnVmZmVyKXtmb3IodmFyIGk9MDtpPGFycmF5Lmxlbmd0aDtpKyspe0hFQVA4W2J1ZmZlcisrPj4wXT1hcnJheVtpXX19TW9kdWxlW1wid3JpdGVBcnJheVRvTWVtb3J5XCJdPXdyaXRlQXJyYXlUb01lbW9yeTtmdW5jdGlvbiB3cml0ZUFzY2lpVG9NZW1vcnkoc3RyLGJ1ZmZlcixkb250QWRkTnVsbCl7Zm9yKHZhciBpPTA7aTxzdHIubGVuZ3RoOysraSl7SEVBUDhbYnVmZmVyKys+PjBdPXN0ci5jaGFyQ29kZUF0KGkpfWlmKCFkb250QWRkTnVsbClIRUFQOFtidWZmZXI+PjBdPTB9TW9kdWxlW1wid3JpdGVBc2NpaVRvTWVtb3J5XCJdPXdyaXRlQXNjaWlUb01lbW9yeTtmdW5jdGlvbiB1blNpZ24odmFsdWUsYml0cyxpZ25vcmUpe2lmKHZhbHVlPj0wKXtyZXR1cm4gdmFsdWV9cmV0dXJuIGJpdHM8PTMyPzIqTWF0aC5hYnMoMTw8Yml0cy0xKSt2YWx1ZTpNYXRoLnBvdygyLGJpdHMpK3ZhbHVlfWZ1bmN0aW9uIHJlU2lnbih2YWx1ZSxiaXRzLGlnbm9yZSl7aWYodmFsdWU8PTApe3JldHVybiB2YWx1ZX12YXIgaGFsZj1iaXRzPD0zMj9NYXRoLmFicygxPDxiaXRzLTEpOk1hdGgucG93KDIsYml0cy0xKTtpZih2YWx1ZT49aGFsZiYmKGJpdHM8PTMyfHx2YWx1ZT5oYWxmKSl7dmFsdWU9LTIqaGFsZit2YWx1ZX1yZXR1cm4gdmFsdWV9aWYoIU1hdGhbXCJpbXVsXCJdfHxNYXRoW1wiaW11bFwiXSg0Mjk0OTY3Mjk1LDUpIT09LTUpTWF0aFtcImltdWxcIl09ZnVuY3Rpb24gaW11bChhLGIpe3ZhciBhaD1hPj4+MTY7dmFyIGFsPWEmNjU1MzU7dmFyIGJoPWI+Pj4xNjt2YXIgYmw9YiY2NTUzNTtyZXR1cm4gYWwqYmwrKGFoKmJsK2FsKmJoPDwxNil8MH07TWF0aC5pbXVsPU1hdGhbXCJpbXVsXCJdO2lmKCFNYXRoW1wiY2x6MzJcIl0pTWF0aFtcImNsejMyXCJdPShmdW5jdGlvbih4KXt4PXg+Pj4wO2Zvcih2YXIgaT0wO2k8MzI7aSsrKXtpZih4JjE8PDMxLWkpcmV0dXJuIGl9cmV0dXJuIDMyfSk7TWF0aC5jbHozMj1NYXRoW1wiY2x6MzJcIl07dmFyIE1hdGhfYWJzPU1hdGguYWJzO3ZhciBNYXRoX2Nvcz1NYXRoLmNvczt2YXIgTWF0aF9zaW49TWF0aC5zaW47dmFyIE1hdGhfdGFuPU1hdGgudGFuO3ZhciBNYXRoX2Fjb3M9TWF0aC5hY29zO3ZhciBNYXRoX2FzaW49TWF0aC5hc2luO3ZhciBNYXRoX2F0YW49TWF0aC5hdGFuO3ZhciBNYXRoX2F0YW4yPU1hdGguYXRhbjI7dmFyIE1hdGhfZXhwPU1hdGguZXhwO3ZhciBNYXRoX2xvZz1NYXRoLmxvZzt2YXIgTWF0aF9zcXJ0PU1hdGguc3FydDt2YXIgTWF0aF9jZWlsPU1hdGguY2VpbDt2YXIgTWF0aF9mbG9vcj1NYXRoLmZsb29yO3ZhciBNYXRoX3Bvdz1NYXRoLnBvdzt2YXIgTWF0aF9pbXVsPU1hdGguaW11bDt2YXIgTWF0aF9mcm91bmQ9TWF0aC5mcm91bmQ7dmFyIE1hdGhfbWluPU1hdGgubWluO3ZhciBNYXRoX2NsejMyPU1hdGguY2x6MzI7dmFyIHJ1bkRlcGVuZGVuY2llcz0wO3ZhciBydW5EZXBlbmRlbmN5V2F0Y2hlcj1udWxsO3ZhciBkZXBlbmRlbmNpZXNGdWxmaWxsZWQ9bnVsbDtmdW5jdGlvbiBnZXRVbmlxdWVSdW5EZXBlbmRlbmN5KGlkKXtyZXR1cm4gaWR9ZnVuY3Rpb24gYWRkUnVuRGVwZW5kZW5jeShpZCl7cnVuRGVwZW5kZW5jaWVzKys7aWYoTW9kdWxlW1wibW9uaXRvclJ1bkRlcGVuZGVuY2llc1wiXSl7TW9kdWxlW1wibW9uaXRvclJ1bkRlcGVuZGVuY2llc1wiXShydW5EZXBlbmRlbmNpZXMpfX1Nb2R1bGVbXCJhZGRSdW5EZXBlbmRlbmN5XCJdPWFkZFJ1bkRlcGVuZGVuY3k7ZnVuY3Rpb24gcmVtb3ZlUnVuRGVwZW5kZW5jeShpZCl7cnVuRGVwZW5kZW5jaWVzLS07aWYoTW9kdWxlW1wibW9uaXRvclJ1bkRlcGVuZGVuY2llc1wiXSl7TW9kdWxlW1wibW9uaXRvclJ1bkRlcGVuZGVuY2llc1wiXShydW5EZXBlbmRlbmNpZXMpfWlmKHJ1bkRlcGVuZGVuY2llcz09MCl7aWYocnVuRGVwZW5kZW5jeVdhdGNoZXIhPT1udWxsKXtjbGVhckludGVydmFsKHJ1bkRlcGVuZGVuY3lXYXRjaGVyKTtydW5EZXBlbmRlbmN5V2F0Y2hlcj1udWxsfWlmKGRlcGVuZGVuY2llc0Z1bGZpbGxlZCl7dmFyIGNhbGxiYWNrPWRlcGVuZGVuY2llc0Z1bGZpbGxlZDtkZXBlbmRlbmNpZXNGdWxmaWxsZWQ9bnVsbDtjYWxsYmFjaygpfX19TW9kdWxlW1wicmVtb3ZlUnVuRGVwZW5kZW5jeVwiXT1yZW1vdmVSdW5EZXBlbmRlbmN5O01vZHVsZVtcInByZWxvYWRlZEltYWdlc1wiXT17fTtNb2R1bGVbXCJwcmVsb2FkZWRBdWRpb3NcIl09e307dmFyIG1lbW9yeUluaXRpYWxpemVyPW51bGw7dmFyIEFTTV9DT05TVFM9WyhmdW5jdGlvbigpe3tyZXR1cm4gTW9kdWxlLmdldFJhbmRvbVZhbHVlKCl9fSksKGZ1bmN0aW9uKCl7e2lmKE1vZHVsZS5nZXRSYW5kb21WYWx1ZT09PXVuZGVmaW5lZCl7dHJ5e3ZhciB3aW5kb3dfPVwib2JqZWN0XCI9PT10eXBlb2Ygd2luZG93P3dpbmRvdzpzZWxmLGNyeXB0b189dHlwZW9mIHdpbmRvd18uY3J5cHRvIT09XCJ1bmRlZmluZWRcIj93aW5kb3dfLmNyeXB0bzp3aW5kb3dfLm1zQ3J5cHRvLHJhbmRvbVZhbHVlc1N0YW5kYXJkPShmdW5jdGlvbigpe3ZhciBidWY9bmV3IFVpbnQzMkFycmF5KDEpO2NyeXB0b18uZ2V0UmFuZG9tVmFsdWVzKGJ1Zik7cmV0dXJuIGJ1ZlswXT4+PjB9KTtyYW5kb21WYWx1ZXNTdGFuZGFyZCgpO01vZHVsZS5nZXRSYW5kb21WYWx1ZT1yYW5kb21WYWx1ZXNTdGFuZGFyZH1jYXRjaChlKXt0cnl7dmFyIGNyeXB0bz1yZXF1aXJlKFwiY3J5cHRvXCIpLHJhbmRvbVZhbHVlTm9kZUpTPShmdW5jdGlvbigpe3ZhciBidWY9Y3J5cHRvLnJhbmRvbUJ5dGVzKDQpO3JldHVybihidWZbMF08PDI0fGJ1ZlsxXTw8MTZ8YnVmWzJdPDw4fGJ1ZlszXSk+Pj4wfSk7cmFuZG9tVmFsdWVOb2RlSlMoKTtNb2R1bGUuZ2V0UmFuZG9tVmFsdWU9cmFuZG9tVmFsdWVOb2RlSlN9Y2F0Y2goZSl7dGhyb3dcIk5vIHNlY3VyZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBmb3VuZFwifX19fX0pXTtmdW5jdGlvbiBfZW1zY3JpcHRlbl9hc21fY29uc3RfMChjb2RlKXtyZXR1cm4gQVNNX0NPTlNUU1tjb2RlXSgpfVNUQVRJQ19CQVNFPTg7U1RBVElDVE9QPVNUQVRJQ19CQVNFKzM0OTQ0O19fQVRJTklUX18ucHVzaCgpO2FsbG9jYXRlKFs4LDIwMSwxODgsMjQzLDEwMywyMzAsOSwxMDYsNTksMTY3LDIwMiwxMzIsMTMzLDE3NCwxMDMsMTg3LDQzLDI0OCwxNDgsMjU0LDExNCwyNDMsMTEwLDYwLDI0MSw1NCwyOSw5NSw1OCwyNDUsNzksMTY1LDIwOSwxMzAsMjMwLDE3MywxMjcsODIsMTQsODEsMzEsMTA4LDYyLDQzLDE0MCwxMDQsNSwxNTUsMTA3LDE4OSw2NSwyNTEsMTcxLDIxNywxMzEsMzEsMTIxLDMzLDEyNiwxOSwyNSwyMDUsMjI0LDkxLDEwMywyMzAsOSwxMDYsMTMzLDE3NCwxMDMsMTg3LDExNCwyNDMsMTEwLDYwLDU4LDI0NSw3OSwxNjUsMTI3LDgyLDE0LDgxLDE0MCwxMDQsNSwxNTUsMTcxLDIxNywxMzEsMzEsMjUsMjA1LDIyNCw5MSwxMzMsNTksMTQwLDEsMTg5LDI0MSwzNiwyNTUsMjQ4LDM3LDE5NSwxLDk2LDIyMCw1NSwwLDE4Myw3Niw2MiwyNTUsMTk1LDY2LDYxLDAsNTAsNzYsMTY0LDEsMjI1LDE2NCw3NiwyNTUsNzYsNjEsMTYzLDI1NSwxMTcsNjIsMzEsMCw4MSwxNDUsNjQsMjU1LDExOCw2NSwxNCwwLDE2MiwxMTUsMjE0LDI1NSw2LDEzOCw0NiwwLDEyNCwyMzAsMjQ0LDI1NSwxMCwxMzgsMTQzLDAsNTIsMjYsMTk0LDAsMTg0LDI0NCw3NiwwLDEyOSwxNDMsNDEsMSwxOTAsMjQ0LDE5LDI1NSwxMjMsMTcwLDEyMiwyNTUsOTgsMTI5LDY4LDAsMTIxLDIxMywxNDcsMCw4NiwxMDEsMzAsMjU1LDE2MSwxMDMsMTU1LDAsMTQwLDg5LDY3LDI1NSwyMzksMjI5LDE5MCwxLDY3LDExLDE4MSwwLDE5OCwyNDAsMTM3LDI1NCwyMzgsNjksMTg4LDI1NSw2NywxNTEsMjM4LDAsMTksNDIsMTA4LDI1NSwyMjksODUsMTEzLDEsNTAsNjgsMTM1LDI1NSwxNywxMDYsOSwwLDUwLDEwMywxLDI1NSw4MCwxLDE2OCwxLDM1LDE1MiwzMCwyNTUsMTYsMTY4LDE4NSwxLDU2LDg5LDIzMiwyNTUsMTAxLDIxMCwyNTIsMCw0MSwyNTAsNzEsMCwyMDQsMTcwLDc5LDI1NSwxNCw0NiwyMzksMjU1LDgwLDc3LDIzOSwwLDE4OSwyMTQsNzUsMjU1LDE3LDE0MSwyNDksMCwzOCw4MCw3NiwyNTUsMTkwLDg1LDExNywwLDg2LDIyOCwxNzAsMCwxNTYsMjE2LDIwOCwxLDE5NSwyMDcsMTY0LDI1NSwxNTAsNjYsNzYsMjU1LDE3NSwyMjUsMTYsMjU1LDE0MSw4MCw5OCwxLDc2LDIxOSwyNDIsMCwxOTgsMTYyLDExNCwwLDQ2LDIxOCwxNTIsMCwxNTUsNDMsMjQxLDI1NCwxNTUsMTYwLDEwNCwyNTUsNTEsMTg3LDE2NSwwLDIsMTcsMTc1LDAsNjYsODQsMTYwLDEsMjQ3LDU4LDMwLDAsMzUsNjUsNTMsMjU0LDY5LDIzNiwxOTEsMCw0NSwxMzQsMjQ1LDEsMTYzLDEyMywyMjEsMCwzMiwxMTAsMjAsMjU1LDUyLDIzLDE2NSwwLDE4NiwyMTQsNzEsMCwyMzMsMTc2LDk2LDAsMjQyLDIzOSw1NCwxLDU3LDg5LDEzOCwwLDgzLDAsODQsMjU1LDEzNiwxNjAsMTAwLDAsOTIsMTQyLDEyMCwyNTQsMTA0LDEyNCwxOTAsMCwxODEsMTc3LDYyLDI1NSwyNTAsNDEsODUsMCwxNTIsMTMwLDQyLDEsOTYsMjUyLDI0NiwwLDE1MSwxNTEsNjMsMjU0LDIzOSwxMzMsNjIsMCwzMiw1NiwxNTYsMCw0NSwxNjcsMTg5LDI1NSwxNDIsMTMzLDE3OSwxLDEzMSw4NiwyMTEsMCwxODcsMTc5LDE1MCwyNTQsMjUwLDE3MCwxNCwyNTUsMjEwLDE2Myw3OCwwLDM3LDUyLDE1MSwwLDk5LDc3LDI2LDAsMjM4LDE1NiwyMTMsMjU1LDIxMywxOTIsMjA5LDEsNzMsNDYsODQsMCwyMCw2NSw0MSwxLDU0LDIwNiw3OSwwLDIwMSwxMzEsMTQ2LDI1NCwxNzAsMTExLDI0LDI1NSwxNzcsMzMsNTAsMjU0LDE3MSwzOCwyMDMsMjU1LDc4LDI0NywxMTYsMCwyMDksMjIxLDE1MywwLDEzMywxMjgsMTc4LDEsNTgsNDQsMjUsMCwyMDEsMzksNTksMSwxODksMTksMjUyLDAsNDksMjI5LDIxMCwxLDExNywxODcsMTE3LDAsMTgxLDE3OSwxODQsMSwwLDExNCwyMTksMCw0OCw5NCwxNDcsMCwyNDUsNDEsNTYsMCwxMjUsMTMsMjA0LDI1NCwyNDQsMTczLDExOSwwLDQ0LDIyMSwzMiwyNTQsODQsMjM0LDIwLDAsMjQ5LDE2MCwxOTgsMSwyMzYsMTI2LDIzNCwyNTUsNDcsOTksMTY4LDI1NCwxNzAsMjI2LDE1MywyNTUsMTAyLDE3OSwyMTYsMCwyMjYsMTQxLDEyMiwyNTUsMTIyLDY2LDE1MywyNTQsMTgyLDI0NSwxMzQsMCwyMjcsMjI4LDI1LDEsMjE0LDU3LDIzNSwyNTUsMjE2LDE3Myw1NiwyNTUsMTgxLDIzMSwyMTAsMCwxMTksMTI4LDE1NywyNTUsMTI5LDk1LDEzNiwyNTUsMTEwLDEyNiw1MSwwLDIsMTY5LDE4MywyNTUsNywxMzAsOTgsMjU0LDY5LDE3Niw5NCwyNTUsMTE2LDQsMjI3LDEsMjE3LDI0MiwxNDUsMjU1LDIwMiwxNzMsMzEsMSwxMDUsMSwzOSwyNTUsNDYsMTc1LDY5LDAsMjI4LDQ3LDU4LDI1NSwyMTUsMjI0LDY5LDI1NCwyMDcsNTYsNjksMjU1LDE2LDI1NCwxMzksMjU1LDIzLDIwNywyMTIsMjU1LDIwMiwyMCwxMjYsMjU1LDk1LDIxMyw5NiwyNTUsOSwxNzYsMzMsMCwyMDAsNSwyMDcsMjU1LDI0MSw0MiwxMjgsMjU0LDM1LDMzLDE5MiwyNTUsMjQ4LDIyOSwxOTYsMSwxMjksMTcsMTIwLDAsMjUxLDEwMywxNTEsMjU1LDcsNTIsMTEyLDI1NSwxNDAsNTYsNjYsMjU1LDQwLDIyNiwyNDUsMjU1LDIxNyw3MCwzNywyNTQsMTcyLDIxNCw5LDI1NSw3Miw2NywxMzQsMSwxNDYsMTkyLDIxNCwyNTUsNDQsMzgsMTEyLDAsNjgsMTg0LDc1LDI1NSwyMDYsOTAsMjUxLDAsMTQ5LDIzNSwxNDEsMCwxODEsMTcwLDU4LDAsMTE2LDI0NCwyMzksMCw5MiwxNTcsMiwwLDEwMiwxNzMsOTgsMCwyMzMsMTM3LDk2LDEsMTI3LDQ5LDIwMywwLDUsMTU1LDE0OCwwLDIzLDE0OCw5LDI1NSwyMTEsMTIyLDEyLDAsMzQsMTM0LDI2LDI1NSwyMTksMjA0LDEzNiwwLDEzNCw4LDQxLDI1NSwyMjQsODMsNDMsMjU0LDg1LDI1LDI0NywwLDEwOSwxMjcsMCwyNTQsMTY5LDEzNiw0OCwwLDIzOCwxMTksMjE5LDI1NSwyMzEsMTczLDIxMywwLDIwNiwxOCwyNTQsMjU0LDgsMTg2LDcsMjU1LDEyNiw5LDcsMSwxMTEsNDIsNzIsMCwxMTEsNTIsMjM2LDI1NCw5Niw2MywxNDEsMCwxNDcsMTkxLDEyNywyNTQsMjA1LDc4LDE5MiwyNTUsMTQsMTA2LDIzNywxLDE4NywyMTksNzYsMCwxNzUsMjQzLDE4NywyNTQsMTA1LDg5LDE3MywwLDg1LDI1LDg5LDEsMTYyLDI0MywxNDgsMCwyLDExOCwyMDksMjU0LDMzLDE1OCw5LDAsMTM5LDE2Myw0NiwyNTUsOTMsNzAsNDAsMCwxMDgsNDIsMTQyLDI1NCwxMTEsMjUyLDE0MiwyNTUsMTU1LDIyMywxNDQsMCw1MSwyMjksMTY3LDI1NSw3MywyNTIsMTU1LDI1NSw5NCwxMTYsMTIsMjU1LDE1MiwxNjAsMjE4LDI1NSwxNTYsMjM4LDM3LDI1NSwxNzksMjM0LDIwNywyNTUsMTk3LDAsMTc5LDI1NSwxNTQsMTY0LDE0MSwwLDIyNSwxOTYsMTA0LDAsMTAsMzUsMjUsMjU0LDIwOSwyMTIsMjQyLDI1NSw5NywyNTMsMjIyLDI1NCwxODQsMTAxLDIyOSwwLDIyMiwxOCwxMjcsMSwxNjQsMTM2LDEzNSwyNTUsMzAsMjA3LDE0MCwyNTQsMTQ2LDk3LDI0MywwLDEyOSwxOTIsMjYsMjU0LDIwMSw4NCwzMywyNTUsMTExLDEwLDc4LDI1NSwxNDcsODEsMTc4LDI1NSw0LDQsMjQsMCwxNjEsMjM4LDIxNSwyNTUsNiwxNDEsMzMsMCw1MywyMTUsMTQsMjU1LDQxLDE4MSwyMDgsMjU1LDIzMSwxMzksMTU3LDAsMTc5LDIwMywyMjEsMjU1LDI1NSwxODUsMTEzLDAsMTg5LDIyNiwxNzIsMjU1LDExMyw2NiwyMTQsMjU1LDIwMiw2Miw0NSwyNTUsMTAyLDY0LDgsMjU1LDc4LDE3NCwxNiwyNTQsMTMzLDExNyw2OCwyNTUsMTgyLDEyMCw4OSwyNTUsMTMzLDExNCwyMTEsMCwxODksMTEwLDIxLDI1NSwxNSwxMCwxMDYsMCw0MSwxOTIsMSwwLDE1MiwyMzIsMTIxLDI1NSwxODgsNjAsMTYwLDI1NSwxNTMsMTEzLDIwNiwyNTUsMCwxODMsMjI2LDI1NCwxODAsMTMsNzIsMjU1LDE3NiwxNjAsMTQsMjU0LDIxMSwyMDEsMTM0LDI1NSwxNTgsMjQsMTQzLDAsMTI3LDEwNSw1MywwLDk2LDEyLDE4OSwwLDE2NywyMTUsMjUxLDI1NSwxNTksNzYsMTI4LDI1NCwxMDYsMTAxLDIyNSwyNTUsMzAsMjUyLDQsMCwxNDYsMTIsMTc0LDAsODksMjQxLDE3OCwyNTQsMTAsMjI5LDE2NiwyNTUsMTIzLDIyMSw0MiwyNTQsMzAsMjAsMjEyLDAsODIsMTI4LDMsMCw0OCwyMDksMjQzLDAsMTE5LDEyMSw2NCwyNTUsNTAsMjI3LDE1NiwyNTUsMCwxMTAsMTk3LDEsMTAzLDI3LDE0NCwwLDEzMyw1OSwxNDAsMSwxODksMjQxLDM2LDI1NSwyNDgsMzcsMTk1LDEsOTYsMjIwLDU1LDAsMTgzLDc2LDYyLDI1NSwxOTUsNjYsNjEsMCw1MCw3NiwxNjQsMSwyMjUsMTY0LDc2LDI1NSw3Niw2MSwxNjMsMjU1LDExNyw2MiwzMSwwLDgxLDE0NSw2NCwyNTUsMTE4LDY1LDE0LDAsMTYyLDExNSwyMTQsMjU1LDYsMTM4LDQ2LDAsMTI0LDIzMCwyNDQsMjU1LDEwLDEzOCwxNDMsMCw1MiwyNiwxOTQsMCwxODQsMjQ0LDc2LDAsMTI5LDE0Myw0MSwxLDE5MCwyNDQsMTksMjU1LDEyMywxNzAsMTIyLDI1NSw5OCwxMjksNjgsMCwxMjEsMjEzLDE0NywwLDg2LDEwMSwzMCwyNTUsMTYxLDEwMywxNTUsMCwxNDAsODksNjcsMjU1LDIzOSwyMjksMTkwLDEsNjcsMTEsMTgxLDAsMTk4LDI0MCwxMzcsMjU0LDIzOCw2OSwxODgsMjU1LDIzNCwxMTMsNjAsMjU1LDM3LDI1NSw1NywyNTUsNjksMTc4LDE4MiwyNTQsMTI4LDIwOCwxNzksMCwxMTgsMjYsMTI1LDI1NCwzLDcsMjE0LDI1NSwyNDEsNTAsNzcsMjU1LDg1LDIwMywxOTcsMjU1LDIxMSwxMzUsMjUwLDI1NSwyNSw0OCwxMDAsMjU1LDE4NywyMTMsMTgwLDI1NCwxNyw4OCwxMDUsMCw4MywyMDksMTU4LDEsNSwxMTUsOTgsMCw0LDE3NCw2MCwyNTQsMTcxLDU1LDExMCwyNTUsMjE3LDE4MSwxNywyNTUsMjAsMTg4LDE3MCwwLDE0NiwxNTYsMTAyLDI1NCw4NywyMTQsMTc0LDI1NSwxMTQsMTIyLDE1NSwxLDIzMyw0NCwxNzAsMCwxMjcsOCwyMzksMSwyMTQsMjM2LDIzNCwwLDE3NSw1LDIxOSwwLDQ5LDEwNiw2MSwyNTUsNiw2NiwyMDgsMjU1LDIsMTA2LDExMCwyNTUsODEsMjM0LDE5LDI1NSwyMTUsMTA3LDE5MiwyNTUsNjcsMTUxLDIzOCwwLDE5LDQyLDEwOCwyNTUsMjI5LDg1LDExMywxLDUwLDY4LDEzNSwyNTUsMTcsMTA2LDksMCw1MCwxMDMsMSwyNTUsODAsMSwxNjgsMSwzNSwxNTIsMzAsMjU1LDE2LDE2OCwxODUsMSw1Niw4OSwyMzIsMjU1LDEwMSwyMTAsMjUyLDAsNDEsMjUwLDcxLDAsMjA0LDE3MCw3OSwyNTUsMTQsNDYsMjM5LDI1NSw4MCw3NywyMzksMCwxODksMjE0LDc1LDI1NSwxNywxNDEsMjQ5LDAsMzgsODAsNzYsMjU1LDE5MCw4NSwxMTcsMCw4NiwyMjgsMTcwLDAsMTU2LDIxNiwyMDgsMSwxOTUsMjA3LDE2NCwyNTUsMTUwLDY2LDc2LDI1NSwxNzUsMjI1LDE2LDI1NSwxNDEsODAsOTgsMSw3NiwyMTksMjQyLDAsMTk4LDE2MiwxMTQsMCw0NiwyMTgsMTUyLDAsMTU1LDQzLDI0MSwyNTQsMTU1LDE2MCwxMDQsMjU1LDE3OCw5LDI1MiwyNTQsMTAwLDExMCwyMTIsMCwxNCw1LDE2NywwLDIzMywyMzksMTYzLDI1NSwyOCwxNTEsMTU3LDEsMTAxLDE0NiwxMCwyNTUsMjU0LDE1OCw3MCwyNTQsNzEsMjQ5LDIyOCwwLDg4LDMwLDUwLDAsNjgsNTgsMTYwLDI1NSwxOTEsMjQsMTA0LDEsMTI5LDY2LDEyOSwyNTUsMTkyLDUwLDg1LDI1NSw4LDE3OSwxMzgsMjU1LDM4LDI1MCwyMDEsMCwxMTUsODAsMTYwLDAsMTMxLDIzMCwxMTMsMCwxMjUsODgsMTQ3LDAsOTAsNjgsMTk5LDAsMjUzLDc2LDE1OCwwLDI4LDI1NSwxMTgsMCwxMTMsMjUwLDI1NCwwLDY2LDc1LDQ2LDAsMjMwLDIxOCw0MywwLDIyOSwxMjAsMTg2LDEsMTQ4LDY4LDQzLDAsMTM2LDEyNCwyMzgsMSwxODcsMTA3LDE5NywyNTUsODQsNTMsMjQ2LDI1NSw1MSwxMTYsMjU0LDI1NSw1MSwxODcsMTY1LDAsMiwxNywxNzUsMCw2Niw4NCwxNjAsMSwyNDcsNTgsMzAsMCwzNSw2NSw1MywyNTQsNjksMjM2LDE5MSwwLDQ1LDEzNCwyNDUsMSwxNjMsMTIzLDIyMSwwLDMyLDExMCwyMCwyNTUsNTIsMjMsMTY1LDAsMTg2LDIxNCw3MSwwLDIzMywxNzYsOTYsMCwyNDIsMjM5LDU0LDEsNTcsODksMTM4LDAsODMsMCw4NCwyNTUsMTM2LDE2MCwxMDAsMCw5MiwxNDIsMTIwLDI1NCwxMDQsMTI0LDE5MCwwLDE4MSwxNzcsNjIsMjU1LDI1MCw0MSw4NSwwLDE1MiwxMzAsNDIsMSw5NiwyNTIsMjQ2LDAsMTUxLDE1MSw2MywyNTQsMjM5LDEzMyw2MiwwLDMyLDU2LDE1NiwwLDQ1LDE2NywxODksMjU1LDE0MiwxMzMsMTc5LDEsMTMxLDg2LDIxMSwwLDE4NywxNzksMTUwLDI1NCwyNTAsMTcwLDE0LDI1NSw2OCwxMTMsMjEsMjU1LDIyMiwxODYsNTksMjU1LDY2LDcsMjQxLDEsNjksNiw3MiwwLDg2LDE1NiwxMDgsMjU0LDU1LDE2Nyw4OSwwLDEwOSw1MiwyMTksMjU0LDEzLDE3NiwyMywyNTUsMTk2LDQ0LDEwNiwyNTUsMjM5LDE0OSw3MSwyNTUsMTY0LDE0MCwxMjUsMjU1LDE1OSwxNzMsMSwwLDUxLDQxLDIzMSwwLDE0NSw2MiwzMywwLDEzOCwxMTEsOTMsMSwxODUsODMsNjksMCwxNDQsMTE1LDQ2LDAsOTcsMTUxLDE2LDI1NSwyNCwyMjgsMjYsMCw0OSwyMTcsMjI2LDAsMTEzLDc1LDIzNCwyNTQsMTkzLDE1MywxMiwyNTUsMTgyLDQ4LDk2LDI1NSwxNCwxMywyNiwwLDEyOCwxOTUsMjQ5LDI1NCw2OSwxOTMsNTksMCwxMzIsMzcsODEsMjU0LDEyNSwxMDYsNjAsMCwyMTQsMjQwLDE2OSwxLDE2NCwyMjcsNjYsMCwyMTAsMTYzLDc4LDAsMzcsNTIsMTUxLDAsOTksNzcsMjYsMCwyMzgsMTU2LDIxMywyNTUsMjEzLDE5MiwyMDksMSw3Myw0Niw4NCwwLDIwLDY1LDQxLDEsNTQsMjA2LDc5LDAsMjAxLDEzMSwxNDYsMjU0LDE3MCwxMTEsMjQsMjU1LDE3NywzMyw1MCwyNTQsMTcxLDM4LDIwMywyNTUsNzgsMjQ3LDExNiwwLDIwOSwyMjEsMTUzLDAsMTMzLDEyOCwxNzgsMSw1OCw0NCwyNSwwLDIwMSwzOSw1OSwxLDE4OSwxOSwyNTIsMCw0OSwyMjksMjEwLDEsMTE3LDE4NywxMTcsMCwxODEsMTc5LDE4NCwxLDAsMTE0LDIxOSwwLDQ4LDk0LDE0NywwLDI0NSw0MSw1NiwwLDEyNSwxMywyMDQsMjU0LDI0NCwxNzMsMTE5LDAsNDQsMjIxLDMyLDI1NCw4NCwyMzQsMjAsMCwyNDksMTYwLDE5OCwxLDIzNiwxMjYsMjM0LDI1NSwxNDMsNjIsMjIxLDAsMTI5LDg5LDIxNCwyNTUsNTUsMTM5LDUsMjU0LDY4LDIwLDE5MSwyNTUsMTQsMjA0LDE3OCwxLDM1LDE5NSwyMTcsMCw0Nyw1MSwyMDYsMSwzOCwyNDYsMTY1LDAsMjA2LDI3LDYsMjU0LDE1OCw4NywzNiwwLDIxNyw1MiwxNDYsMjU1LDEyNSwxMjMsMjE1LDI1NSw4NSw2MCwzMSwyNTUsMTcxLDEzLDcsMCwyMTgsMjQ1LDg4LDI1NCwyNTIsMzUsNjAsMCw1NSwyMTQsMTYwLDI1NSwxMzMsMTAxLDU2LDAsMjI0LDMyLDE5LDI1NCwxNDcsNjQsMjM0LDAsMjYsMTQ1LDE2MiwxLDExNCwxMTgsMTI1LDAsMjQ4LDI1MiwyNTAsMCwxMDEsOTQsMTk2LDI1NSwxOTgsMTQxLDIyNiwyNTQsNTEsNDIsMTgyLDAsMTM1LDEyLDksMjU0LDEwOSwxNzIsMjEwLDI1NSwxOTcsMjM2LDE5NCwxLDI0MSw2NSwxNTQsMCw0OCwxNTYsNDcsMjU1LDE1Myw2Nyw1NSwyNTUsMjE4LDE2NSwzNCwyNTQsNzQsMTgwLDE3OSwwLDIxOCw2Niw3MSwxLDg4LDEyMiw5OSwwLDIxMiwxODEsMjE5LDI1NSw5Miw0MiwyMzEsMjU1LDIzOSwwLDE1NCwwLDI0NSw3NywxODMsMjU1LDk0LDgxLDE3MCwxLDE4LDIxMywyMTYsMCwxNzEsOTMsNzEsMCw1Miw5NCwyNDgsMCwxOCwxNTEsMTYxLDI1NCwxOTcsMjA5LDY2LDI1NSwxNzQsMjQ0LDE1LDI1NCwxNjIsNDgsMTgzLDAsNDksNjEsMjQwLDI1NCwxODIsOTMsMTk1LDAsMTk5LDIyOCw2LDEsMjAwLDUsMTcsMjU1LDEzNyw0NSwyMzcsMjU1LDEwOCwxNDgsNCwwLDkwLDc5LDIzNywyNTUsMzksNjMsNzcsMjU1LDUzLDgyLDIwNywxLDE0MiwyMiwxMTgsMjU1LDEwMSwyMzIsMTgsMSw5MiwyNiw2NywwLDUsMjAwLDg4LDI1NSwzMywxNjgsMTM4LDI1NSwxNDksMjI1LDcyLDAsMiwyMDksMjcsMjU1LDQ0LDI0NSwxNjgsMSwyMjAsMjM3LDE3LDI1NSwzMCwyMTEsMTA1LDI1NCwxNDEsMjM4LDIyMSwwLDEyOCw4MCwyNDUsMjU0LDExMSwyNTQsMTQsMCwyMjIsOTUsMTkwLDEsMjIzLDksMjQxLDAsMTQ2LDc2LDIxMiwyNTUsMTA4LDIwNSwxMDQsMjU1LDYzLDExNywxNTMsMCwxNDQsNjksNDgsMCwzNSwyMjgsMTExLDAsMTkyLDMzLDE5MywyNTUsMTEyLDIxNCwxOTAsMjU0LDExNSwxNTIsMTUxLDAsMjMsMTAyLDg4LDAsNTEsNzQsMjQ4LDAsMjI2LDE5OSwxNDMsMjU0LDIwNCwxNjIsMTAxLDI1NSwyMDgsOTcsMTg5LDEsMjQ1LDEwNCwxOCwwLDIzMCwyNDYsMzAsMjU1LDIzLDE0OCw2OSwwLDExMCw4OCw1MiwyNTQsMjI2LDE4MSw4OSwyNTUsMjA4LDQ3LDkwLDI1NCwxMTQsMTYxLDgwLDI1NSwzMywxMTYsMjQ4LDAsMTc5LDE1Miw4NywyNTUsNjksMTQ0LDE3NywxLDg4LDIzOCwyNiwyNTUsNTgsMzIsMTEzLDEsMSw3Nyw2OSwwLDU5LDEyMSw1MiwyNTUsMTUyLDIzOCw4MywwLDUyLDgsMTkzLDAsMjMxLDM5LDIzMywyNTUsMTk5LDM0LDEzOCwwLDIyMiw2OCwxNzMsMCw5MSw1NywyNDIsMjU0LDIyMCwyMTAsMTI3LDI1NSwxOTIsNywyNDYsMjU0LDE1MSwzNSwxODcsMCwxOTUsMjM2LDE2NSwwLDExMSw5MywyMDYsMCwyMTIsMjQ3LDEzMywxLDE1NCwxMzMsMjA5LDI1NSwxNTUsMjMxLDEwLDAsNjQsNzgsMzgsMCwxMjIsMjQ5LDEwMCwxLDMwLDE5LDk3LDI1NSw2Miw5MSwyNDksMSwyNDgsMTMzLDc3LDAsMTk3LDYzLDE2OCwyNTQsMTE2LDEwLDgyLDAsMTg0LDIzNiwxMTMsMjU0LDIxMiwyMDMsMTk0LDI1NSw2MSwxMDAsMjUyLDI1NCwzNiw1LDIwMiwyNTUsMTE5LDkxLDE1MywyNTUsMTI5LDc5LDI5LDAsMTAzLDEwMywxNzEsMjU0LDIzNywyMTUsMTExLDI1NSwyMTYsNTMsNjksMCwyMzksMjQwLDIzLDAsMTk0LDE0OSwyMjEsMjU1LDM4LDIyNSwyMjIsMCwyMzIsMjU1LDE4MCwyNTQsMTE4LDgyLDEzMywyNTUsNTcsMjA5LDE3NywxLDEzOSwyMzIsMTMzLDAsMTU4LDE3Niw0NiwyNTQsMTk0LDExNSw0NiwwLDg4LDI0NywyMjksMSwyOCwxMDMsMTkxLDAsMjIxLDIyMiwxNzUsMjU0LDE0OSwyMzUsNDQsMCwxNTEsMjI4LDI1LDI1NCwyMTgsMTA1LDEwMywwLDE0Miw4NSwyMTAsMCwxNDksMTI5LDE5MCwyNTUsMjEzLDY1LDk0LDI1NCwxMTcsMTM0LDIyNCwyNTUsODIsMTk4LDExNywwLDE1NywyMjEsMjIwLDAsMTYzLDEwMSwzNiwwLDE5NywxMTQsMzcsMCwxMDQsMTcyLDE2NiwyNTQsMTEsMTgyLDAsMCw4MSw3MiwxODgsMjU1LDk3LDE4OCwxNiwyNTUsNjksNiwxMCwwLDE5OSwxNDcsMTQ1LDI1NSw4LDksMTE1LDEsNjUsMjE0LDE3NSwyNTUsMjE3LDE3MywyMDksMCw4MCwxMjcsMTY2LDAsMjQ3LDIyOSw0LDI1NCwxNjcsMTgzLDEyNCwyNTUsOTAsMjgsMjA0LDI1NCwxNzUsNTksMjQwLDI1NSwxMSw0MSwyNDgsMSwxMDgsNDAsNTEsMjU1LDE0NCwxNzcsMTk1LDI1NCwxNTAsMjUwLDEyNiwwLDEzOCw5MSw2NSwxLDEyMCw2MCwyMjIsMjU1LDI0NSwxOTMsMjM5LDAsMjksMjE0LDE4OSwyNTUsMTI4LDIsMjUsMCw4MCwxNTQsMTYyLDAsNzcsMjIwLDEwNywxLDIzNCwyMDUsNzQsMjU1LDU0LDE2NiwxMDMsMjU1LDExNiw3Miw5LDAsMjI4LDk0LDQ3LDI1NSwzMCwyMDAsMjUsMjU1LDM1LDIxNCw4OSwyNTUsNjEsMTc2LDE0MCwyNTUsODMsMjI2LDE2MywyNTUsNzUsMTMwLDE3MiwwLDEyOCwzOCwxNywwLDk1LDEzNywxNTIsMjU1LDIxNSwxMjQsMTU5LDEsNzksOTMsMCwwLDE0OCw4MiwxNTcsMjU0LDE5NSwxMzAsMjUxLDI1NSw0MCwyMDIsNzYsMjU1LDI1MSwxMjYsMjI0LDAsMTU3LDk5LDYyLDI1NCwyMDcsNywyMjUsMjU1LDk2LDY4LDE5NSwwLDE0MCwxODYsMTU3LDI1NSwxMzEsMTksMjMxLDI1NSw0MiwxMjgsMjU0LDAsNTIsMjE5LDYxLDI1NCwxMDIsMjAzLDcyLDAsMTQxLDcsMTEsMjU1LDE4NiwxNjQsMjEzLDAsMzEsMTIyLDExOSwwLDEzMywyNDIsMTQ1LDAsMjA4LDI1MiwyMzIsMjU1LDkxLDIxMywxODIsMjU1LDE0Myw0LDI1MCwyNTQsMjQ5LDIxNSw3NCwwLDE2NSwzMCwxMTEsMSwxNzEsOSwyMjMsMCwyMjksMTIzLDM0LDEsOTIsMTMwLDI2LDI1NSw3NywxNTUsNDUsMSwxOTUsMTM5LDI4LDI1NSw1OSwyMjQsNzgsMCwxMzYsMTcsMjQ3LDAsMTA4LDEyMSwzMiwwLDc5LDI1MCwxODksMjU1LDk2LDIyNywyNTIsMjU0LDM4LDI0MSw2MiwwLDYyLDE3NCwxMjUsMjU1LDE1NSwxMTEsOTMsMjU1LDEwLDIzMCwyMDYsMSw5NywxOTcsNDAsMjU1LDAsNDksNTcsMjU0LDY1LDI1MCwxMywwLDE4LDI1MSwxNTAsMjU1LDIyMCwxMDksMjEwLDI1NSw1LDE3NCwxNjYsMjU0LDQ0LDEyOSwxODksMCwyMzUsMzUsMTQ3LDI1NSwzNywyNDcsMTQxLDI1NSw3MiwxNDEsNCwyNTUsMTAzLDEwNywyNTUsMCwyNDcsOTAsNCwwLDUzLDQ0LDQyLDAsMiwzMCwyNDAsMCw0LDU5LDYzLDAsODgsNzgsMzYsMCwxMTMsMTY3LDE4MCwwLDE5MCw3MSwxOTMsMjU1LDE5OSwxNTgsMTY0LDI1NSw1OCw4LDE3MiwwLDc3LDMzLDEyLDAsNjUsNjMsMywwLDE1Myw3NywzMywyNTUsMTcyLDI1NCwxMDIsMSwyMjgsMjIxLDQsMjU1LDg3LDMwLDI1NCwxLDE0Niw0MSw4NiwyNTUsMTM4LDIwNCwyMzksMjU0LDEwOCwxNDEsMTcsMjU1LDE4NywyNDIsMTM1LDAsMjEwLDIwOCwxMjcsMCw2OCw0NSwxNCwyNTQsNzMsOTYsNjIsMCw4MSw2MCwyNCwyNTUsMTcwLDYsMzYsMjU1LDMsMjQ5LDI2LDAsMzUsMjEzLDEwOSwwLDIyLDEyOSw1NCwyNTUsMjEsMzUsMjI1LDI1NSwyMzQsNjEsNTYsMjU1LDU4LDIxNyw2LDAsMTQzLDEyNCw4OCwwLDIzNiwxMjYsNjYsMCwyMDksMzgsMTgzLDI1NSwzNCwyMzgsNiwyNTUsMTc0LDE0NSwxMDIsMCw5NSwyMiwyMTEsMCwxOTYsMTUsMTUzLDI1NCw0Niw4NCwyMzIsMjU1LDExNywzNCwxNDYsMSwyMzEsMjUwLDc0LDI1NSwyNywxMzQsMTAwLDEsOTIsMTg3LDE5NSwyNTUsMTcwLDE5OCwxMTIsMCwxMjAsMjgsNDIsMCwyMDksNzAsNjcsMCwyOSw4MSwzMSwwLDI5LDE2OCwxMDAsMSwxNjksMTczLDE2MCwwLDEwNywzNSwxMTcsMCw2Miw5Niw1OSwyNTUsODEsMTIsNjksMSwxMzUsMjM5LDE5MCwyNTUsMjIwLDI1MiwxOCwwLDE2MywyMjAsNTgsMjU1LDEzNywxMzcsMTg4LDI1NSw4MywxMDIsMTA5LDAsOTYsNiw3NiwwLDIzNCwyMjIsMjEwLDI1NSwxODUsMTc0LDIwNSwxLDYwLDE1OCwyMTMsMjU1LDEzLDI0MSwyMTQsMCwxNzIsMTI5LDE0MCwwLDkzLDEwNCwyNDIsMCwxOTIsMTU2LDI1MSwwLDQzLDExNywzMCwwLDIyNSw4MSwxNTgsMCwxMjcsMjMyLDIxOCwwLDIyNiwyOCwyMDMsMCwyMzMsMjcsMTUxLDI1NSwxMTcsNDMsNSwyNTUsMjQyLDE0LDQ3LDI1NSwzMywyMCw2LDAsMTM3LDI1MSw0NCwyNTQsMjcsMzEsMjQ1LDI1NSwxODMsMjE0LDEyNSwyNTQsNDAsMTIxLDE0OSwwLDE4NiwxNTgsMjEzLDI1NSw4OSw4LDIyNywwLDY5LDg4LDAsMjU0LDIwMywxMzUsMjI1LDAsMjAxLDE3NCwyMDMsMCwxNDcsNzEsMTg0LDAsMTgsMTIxLDQxLDI1NCw5NCw1LDc4LDAsMjI0LDIxNCwyNDAsMjU0LDM2LDUsMTgwLDAsMjUxLDEzNSwyMzEsMSwxNjMsMTM4LDIxMiwwLDIxMCwyNDksMTE2LDI1NCw4OCwxMjksMTg3LDAsMTksOCw0OSwyNTQsNjIsMTQsMTQ0LDI1NSwxNTksNzYsMjExLDAsMjE0LDUxLDgyLDAsMTA5LDExNywyMjgsMjU0LDEwMywyMjMsMjAzLDI1NSw3NSwyNTIsMTUsMSwxNTQsNzEsMjIwLDI1NSwyMywxMyw5MSwxLDE0MSwxNjgsOTYsMjU1LDE4MSwxODIsMTMzLDAsMjUwLDUxLDU1LDAsMjM0LDIzNCwyMTIsMjU0LDE3NSw2MywxNTgsMCwzOSwyNDAsNTIsMSwxNTgsMTg5LDM2LDI1NSwyMTMsNDAsODUsMSwzMiwxODAsMjQ3LDI1NSwxOSwxMDIsMjYsMSw4NCwyNCw5NywyNTUsNjksMjEsMjIyLDAsMTQ4LDEzOSwxMjIsMjU1LDIyMCwyMTMsMjM1LDEsMjMyLDIwMywyNTUsMCwxMjEsNTcsMTQ3LDAsMjI3LDcsMTU0LDAsNTMsMjIsMTQ3LDEsNzIsMSwyMjUsMCw4MiwxMzQsNDgsMjU0LDgzLDYwLDE1NywyNTUsMTQ1LDcyLDE2OSwwLDM0LDEwMywyMzksMCwxOTgsMjMzLDQ3LDAsMTE2LDE5LDQsMjU1LDE4NCwxMDYsOSwyNTUsMTgzLDEyOSw4MywwLDM2LDE3NiwyMzAsMSwzNCwxMDMsNzIsMCwyMTksMTYyLDEzNCwwLDI0NSw0MiwxNTgsMCwzMiwxNDksOTYsMjU0LDE2NSw0NCwxNDQsMCwyMDIsMjM5LDcyLDI1NCwyMTUsMTUwLDUsMCw0Miw2NiwzNiwxLDEzMiwyMTUsMTc1LDAsODYsMTc0LDg2LDI1NSwyNiwxOTcsMTU2LDI1NSw0OSwyMzIsMTM1LDI1NCwxMDMsMTgyLDgyLDAsMjUzLDEyOCwxNzYsMSwxNTMsMTc4LDEyMiwwLDI0NSwyNTAsMTAsMCwyMzYsMjQsMTc4LDAsMTM3LDEwNiwxMzIsMCw0MCwyOSw0MSwwLDUwLDMwLDE1MiwyNTUsMTI0LDEwNSwzOCwwLDIzMCwxOTEsNzUsMCwxNDMsNDMsMTcwLDAsNDQsMTMxLDIwLDI1NSw0NCwxMywyMywyNTUsMjM3LDI1NSwxNTUsMSwxNTksMTA5LDEwMCwyNTUsMTEyLDE4MSwyNCwyNTUsMTA0LDIyMCwxMDgsMCw1NSwyMTEsMTMxLDAsOTksMTIsMjEzLDI1NSwxNTIsMTUxLDE0NSwyNTUsMjM4LDUsMTU5LDAsOTcsMTU1LDgsMCwzMywxMDgsODEsMCwxLDMsMTAzLDAsNjIsMTA5LDM0LDI1NSwyNTAsMTU1LDE4MCwwLDMyLDcxLDE5NSwyNTUsMzgsNzAsMTQ1LDEsMTU5LDk1LDI0NSwwLDY5LDIyOSwxMDEsMSwxMzYsMjgsMjQwLDAsNzksMjI0LDI1LDAsNzgsMTEwLDEyMSwyNTUsMjQ4LDE2OCwxMjQsMCwxODcsMTI4LDI0NywwLDIsMTQ3LDIzNSwyNTQsNzksMTEsMTMyLDAsNzAsNTgsMTIsMSwxODEsOCwxNjMsMjU1LDc5LDEzNywxMzMsMjU1LDM3LDE3MCwxMSwyNTUsMTQxLDI0Myw4NSwyNTUsMTc2LDIzMSwyMTUsMjU1LDIwNCwxNTAsMTY0LDI1NSwyMzksMjE1LDM5LDI1NSw0Niw4NywxNTYsMjU0LDgsMTYzLDg4LDI1NSwxNzIsMzQsMjMyLDAsNjYsNDQsMTAyLDI1NSwyNyw1NCw0MSwyNTQsMjM2LDk5LDg3LDI1NSw0MSwxMjMsMTY5LDEsNTIsMTE0LDQzLDAsMTE3LDEzNCw0MCwwLDE1NSwxMzQsMjYsMCwyMzEsMjA3LDkxLDI1NCwzNSwxMzIsMzgsMjU1LDE5LDEwMiwxMjUsMjU0LDM2LDIyNywxMzMsMjU1LDExOCwzLDExMywyNTUsMjksMTMsMTI0LDAsMTUyLDk2LDc0LDEsODgsMTQ2LDIwNiwyNTUsMTY3LDE5MSwyMjAsMjU0LDE2MiwxOCw4OCwyNTUsMTgyLDEwMCwyMywwLDMxLDExNyw1MiwwLDgxLDQ2LDEwNiwxLDEyLDIsNywwLDY5LDgwLDIwMSwxLDIwOSwyNDYsMTcyLDAsMTIsNDgsMTQxLDEsMjI0LDIxMSw4OCwwLDExNiwyMjYsMTU5LDAsMTIyLDk4LDEzMCwwLDY1LDIzNiwyMzQsMSwyMjUsMjI2LDksMjU1LDIwNywyMjYsMTIzLDEsODksMjE0LDU5LDAsMTEyLDEzNSw4OCwxLDkwLDI0NCwyMDMsMjU1LDQ5LDExLDM4LDEsMTI5LDEwOCwxODYsMCw4OSwxMTIsMTUsMSwxMDEsNDYsMjA0LDI1NSwxMjcsMjA0LDQ1LDI1NCw3OSwyNTUsMjIxLDI1NSw1MSw3MywxOCwyNTUsMTI3LDQyLDEwMSwyNTUsMjQxLDIxLDIwMiwwLDE2MCwyMjcsNywwLDEwNSw1MCwyMzYsMCw3OSw1MiwxOTcsMjU1LDEwNCwyMDIsMjA4LDEsMTgwLDE1LDE2LDAsMTAxLDE5Nyw3OCwyNTUsOTgsNzcsMjAzLDAsNDEsMTg1LDI0MSwxLDM1LDE5MywxMjQsMCwzNSwxNTUsMjMsMjU1LDIwNyw1MywxOTIsMCwxMSwxMjUsMTYzLDEsMjQ5LDE1OCwxODUsMjU1LDQsMTMxLDQ4LDAsMjEsOTMsMTExLDI1NSw2MSwxMjEsMjMxLDEsNjksMjAwLDM2LDI1NSwxODUsNDgsMTg1LDI1NSwxMTEsMjM4LDIxLDI1NSwzOSw1MCwyNSwyNTUsOTksMjE1LDE2MywyNTUsODcsMjEyLDMwLDI1NSwxNjQsMTQ3LDUsMjU1LDEyOCw2LDM1LDEsMTA4LDIyMywxMTAsMjU1LDE5NCw3NiwxNzgsMCw3NCwxMDEsMTgwLDAsMjQzLDQ3LDQ4LDAsMTc0LDI1LDQzLDI1NSw4MiwxNzMsMjUzLDEsNTQsMTE0LDE5MiwyNTUsNDAsNTUsOTEsMCwyMTUsMTA4LDE3NiwyNTUsMTEsNTYsNywwLDIyNCwyMzMsNzYsMCwyMDksOTgsMjAyLDI1NCwyNDIsMjUsMTI1LDAsNDQsMTkzLDkzLDI1NCwyMDMsOCwxNzcsMCwxMzUsMTc2LDE5LDAsMTEyLDcxLDIxMywyNTUsMjA2LDU5LDE3NiwxLDQsNjcsMjYsMCwxNCwxNDMsMjEzLDI1NCw0Miw1NSwyMDgsMjU1LDYwLDY3LDEyMCwwLDE5MywyMSwxNjMsMCw5OSwxNjQsMTE1LDAsMTAsMjAsMTE4LDAsMTU2LDIxMiwyMjIsMjU0LDE2MCw3LDIxNywyNTUsMTE0LDI0NSw3NiwxLDExNyw1OSwxMjMsMCwxNzYsMTk0LDg2LDI1NCwyMTMsMTUsMTc2LDAsNzgsMjA2LDIwNywyNTQsMjEzLDEyOSw1OSwwLDIzMywyNTEsMjIsMSw5Niw1NSwxNTIsMjU1LDIzNiwyNTUsMTUsMjU1LDE5Nyw4OSw4NCwyNTUsOTMsMTQ5LDEzMywwLDE3NCwxNjAsMTEzLDAsMjM0LDk5LDE2OSwyNTUsMTUyLDExNiw4OCwwLDE0NCwxNjQsODMsMjU1LDk1LDI5LDE5OCwyNTUsMzQsNDcsMTUsMjU1LDk5LDEyMCwxMzQsMjU1LDUsMjM2LDE5MywwLDI0OSwyNDcsMTI2LDI1NSwxNDcsMTg3LDMwLDAsNTAsMjMwLDExNywyNTUsMTA4LDIxNywyMTksMjU1LDE2Myw4MSwxNjYsMjU1LDcyLDI1LDE2OSwyNTQsMTU1LDEyMSw3OSwyNTUsMjgsMTU1LDg5LDI1NCw3LDEyNiwxNywwLDE0Nyw2NSwzMywxLDQ3LDIzNCwyNTMsMCwyNiw1MSwxOCwwLDEwNSw4MywxOTksMjU1LDE2MywxOTYsMjMwLDAsMTEzLDI0OCwxNjQsMCwyMjYsMjU0LDIxOCwwLDE4OSwyMDksMjAzLDI1NSwxNjQsMjQ3LDIyMiwyNTQsMjU1LDM1LDE2NSwwLDQsMTg4LDI0MywxLDEyNywxNzksNzEsMCwzNywyMzcsMjU0LDI1NSwxMDAsMTg2LDI0MCwwLDUsNTcsNzEsMjU0LDEwMyw3Miw3MywyNTUsMjQ0LDE4LDgxLDI1NCwyMjksMjEwLDEzMiwyNTUsMjM4LDYsMTgwLDI1NSwxMSwyMjksMTc0LDI1NSwyMjcsMjIxLDE5MiwxLDE3LDQ5LDI4LDAsMTYzLDIxNSwxOTYsMjU0LDksMTE4LDQsMjU1LDUxLDI0MCw3MSwwLDExMywxMjksMTA5LDI1NSw3NiwyNDAsMjMxLDAsMTg4LDE3NywxMjcsMCwxMjUsNzEsNDQsMSwyNiwxNzUsMjQzLDAsOTQsMTY5LDI1LDI1NCwyNywyMzAsMjksMCwxNSwxMzksMTE5LDEsMTY4LDE3MCwxODYsMjU1LDE3MiwxOTcsNzYsMjU1LDI1Miw3NSwxODgsMCwxMzcsMTI0LDE5NiwwLDcyLDIyLDk2LDI1NSw0NSwxNTEsMjQ5LDEsMjIwLDE0NSwxMDAsMCw2NCwxOTIsMTU5LDI1NSwxMjAsMjM5LDIyNiwwLDEyOSwxNzgsMTQ2LDAsMCwxOTIsMTI1LDAsMjM1LDEzOCwyMzQsMCwxODMsMTU3LDE0NiwwLDgzLDE5OSwxOTIsMjU1LDE4NCwxNzIsNzIsMjU1LDczLDIyNSwxMjgsMCw3Nyw2LDI1MCwyNTUsMTg2LDY1LDY3LDAsMTA0LDI0NiwyMDcsMCwxODgsMzIsMTM4LDI1NSwyMTgsMjQsMjQyLDAsNjcsMTM4LDgxLDI1NCwyMzcsMTI5LDEyMSwyNTUsMjAsMjA3LDE1MCwxLDQxLDE5OSwxNiwyNTUsNiwyMCwxMjgsMCwxNTksMTE4LDUsMCwxODEsMTYsMTQzLDI1NSwyMjAsMzgsMTUsMCwyMyw2NCwxNDcsMjU0LDczLDI2LDEzLDAsODcsMjI4LDU3LDEsMjA0LDEyNCwxMjgsMCw0MywyNCwyMjMsMCwyMTksOTksMTk5LDAsMjIsNzUsMjAsMjU1LDE5LDI3LDEyNiwwLDE1Nyw2MiwyMTUsMCwxMTAsMjksMjMwLDAsMTc5LDE2NywyNTUsMSw1NCwyNTIsMTkwLDAsMjIxLDIwNCwxODIsMjU0LDE3OSwxNTgsNjUsMjU1LDgxLDE1NywzLDAsMTk0LDIxOCwxNTksMCwxNzAsMjIzLDAsMCwyMjQsMTEsMzIsMjU1LDM4LDE5Nyw5OCwwLDE2OCwxNjQsMzcsMCwyMyw4OCw3LDEsMTY0LDE4NiwxMTAsMCw5NiwzNiwxMzQsMCwyMzQsMjQyLDIyOSwwLDI1MCwxMjEsMTksMCwyNDIsMjU0LDExMiwyNTUsMyw0Nyw5NCwxLDksMjM5LDYsMjU1LDgxLDEzNCwxNTMsMjU0LDIxNCwyNTMsMTY4LDI1NSw2NywxMjQsMjI0LDAsMjQ1LDk1LDc0LDAsMjgsMzAsNDQsMjU0LDEsMTA5LDIyMCwyNTUsMTc4LDg5LDg5LDAsMjUyLDM2LDc2LDAsMjQsMTk4LDQ2LDI1NSw3Niw3NywxMTEsMCwxMzQsMjM0LDEzNiwyNTUsMzksOTQsMjksMCwxODUsNzIsMjM0LDI1NSw3MCw2OCwxMzUsMjU1LDIzMSwxMDIsNywyNTQsNzcsMjMxLDE0MCwwLDE2Nyw0Nyw1OCwxLDE0OCw5NywxMTgsMjU1LDE2LDI3LDIyNSwxLDE2NiwyMDYsMTQzLDI1NSwxMTAsMTc4LDIxNCwyNTUsMTgwLDEzMSwxNjIsMCwxNDMsMTQxLDIyNSwxLDEzLDIxOCw3OCwyNTUsMTE0LDE1MywzMywxLDk4LDEwNCwyMDQsMCwxNzUsMTE0LDExNywxLDE2NywyMDYsNzUsMCwyMDIsMTk2LDgzLDEsNTgsNjQsNjcsMCwxMzgsNDcsMTExLDEsMTk2LDI0NywxMjgsMjU1LDEzNywyMjQsMjI0LDI1NCwxNTgsMTEyLDIwNywwLDE1NCwxMDAsMjU1LDEsMTM0LDM3LDEwNywwLDE5OCwxMjgsNzksMjU1LDEyNywyMDksMTU1LDI1NSwxNjMsMjU0LDE4NSwyNTQsNjAsMTQsMjQzLDAsMzEsMjE5LDExMiwyNTQsMjksMjE3LDY1LDAsMjAwLDEzLDExNiwyNTQsMTIzLDYwLDE5NiwyNTUsMjI0LDU5LDE4NCwyNTQsMjQyLDg5LDE5NiwwLDEyMywxNiw3NSwyNTQsMTQ5LDE2LDIwNiwwLDY5LDI1NCw0OCwxLDIzMSwxMTYsMjIzLDI1NSwyMDksMTYwLDY1LDEsMjAwLDgwLDk4LDAsMzcsMTk0LDE4NCwyNTQsMTQ4LDYzLDM0LDAsMTM5LDI0MCw2NSwyNTUsMjE3LDE0NCwxMzIsMjU1LDU2LDM4LDQ1LDI1NCwxOTksMTIwLDIxMCwwLDEwOCwxNzcsMTY2LDI1NSwxNjAsMjIyLDQsMCwyMjAsMTI2LDExOSwyNTQsMTY1LDEwNywxNjAsMjU1LDgyLDIyMCwyNDgsMSwyNDEsMTc1LDEzNiwwLDE0NCwxNDEsMjMsMjU1LDE2OSwxMzgsODQsMCwxNjAsMTM3LDc4LDI1NSwyMjYsMTE4LDgwLDI1NSw1MiwyNywxMzIsMjU1LDYzLDk2LDEzOSwyNTUsMTUyLDI1MCwzOSwwLDE4OCwxNTUsMTUsMCwyMzIsNTEsMTUwLDI1NCw0MCwxNSwyMzIsMjU1LDI0MCwyMjksOSwyNTUsMTM3LDE3NSwyNywyNTUsNzUsNzMsOTcsMSwyMTgsMjEyLDExLDAsMTM1LDUsMTYyLDEsMTA3LDE4NSwyMTMsMCwyLDI0OSwxMDcsMjU1LDQwLDI0Miw3MCwwLDIxOSwyMDAsMjUsMCwyNSwxNTcsMTMsMCw2Nyw4Miw4MCwyNTUsMTk2LDI0OSwyMywyNTUsMTQ1LDIwLDE0OSwwLDUwLDcyLDE0NiwwLDk0LDc2LDE0OCwxLDI0LDI1MSw2NSwwLDMxLDE5MiwyMywwLDE4NCwyMTIsMjAxLDI1NSwxMjMsMjMzLDE2MiwxLDI0NywxNzMsNzIsMCwxNjIsODcsMjE5LDI1NCwxMjYsMTM0LDg5LDAsMTU5LDExLDEyLDI1NCwxNjYsMTA1LDI5LDAsNzMsMjcsMjI4LDEsMTEzLDEyMCwxODMsMjU1LDY2LDE2MywxMDksMSwyMTIsMTQzLDExLDI1NSwxNTksMjMxLDE2OCwxLDI1NSwxMjgsOTAsMCw1NywxNCw1OCwyNTQsODksNTIsMTAsMjU1LDI1Myw4LDE2MywxLDAsMTQ1LDIxMCwyNTUsMTAsMTI5LDg1LDEsNDYsMTgxLDI3LDAsMTAzLDEzNiwxNjAsMjU0LDEyNiwxODgsMjA5LDI1NSwzNCwzNSwxMTEsMCwyMTUsMjE5LDI0LDI1NSwyMTIsMTEsMjE0LDI1NCwxMDEsNSwxMTgsMCwyMzIsMTk3LDEzMywyNTUsMjIzLDE2NywxMDksMjU1LDIzNyw4MCw4NiwyNTUsNzAsMTM5LDk0LDAsMTU4LDE5MywxOTEsMSwxNTUsMTUsNTEsMjU1LDE1LDE5MCwxMTUsMCw3OCwxMzUsMjA3LDI1NSwyNDksMTAsMjcsMSwxODEsMTI1LDIzMywwLDk1LDE3MiwxMywyNTQsMTcwLDIxMywxNjEsMjU1LDM5LDIzNiwxMzgsMjU1LDk1LDkzLDg3LDI1NSwxOTAsMTI4LDk1LDAsMTI1LDE1LDIwNiwwLDE2NiwxNTAsMTU5LDAsMjI3LDE1LDE1OCwyNTUsMjA2LDE1OCwxMjAsMjU1LDQyLDE0MSwxMjgsMCwxMDEsMTc4LDEyMCwxLDE1NiwxMDksMTMxLDAsMjE4LDE0LDQ0LDI1NCwyNDcsMTY4LDIwNiwyNTUsMjEyLDExMiwyOCwwLDExMiwxNywyMjgsMjU1LDkwLDE2LDM3LDEsMTk3LDIyMiwxMDgsMCwyNTQsMjA3LDgzLDI1NSw5LDkwLDI0MywyNTUsMjQzLDI0NCwxNzIsMCwyNiw4OCwxMTUsMjU1LDIwNSwxMTYsMTIyLDAsMTkxLDIzMCwxOTMsMCwxODAsMTAwLDExLDEsMjE3LDM3LDk2LDI1NSwxNTQsNzgsMTU2LDAsMjM1LDIzNCwzMSwyNTUsMjA2LDE3OCwxNzgsMjU1LDE0OSwxOTIsMjUxLDAsMTgyLDI1MCwxMzUsMCwyNDYsMjIsMTA1LDAsMTI0LDE5MywxMDksMjU1LDIsMjEwLDE0OSwyNTUsMTY5LDE3LDE3MCwwLDAsOTYsMTEwLDI1NSwxMTcsOSw4LDEsNTAsMTIzLDQwLDI1NSwxOTMsMTg5LDk5LDAsMzQsMjI3LDE2MCwwLDQ4LDgwLDcwLDI1NCwyMTEsNTEsMjM2LDAsNDUsMTIyLDI0NSwyNTQsNDQsMTc0LDgsMCwxNzMsMzcsMjMzLDI1NSwxNTgsNjUsMTcxLDAsMTIyLDY5LDIxNSwyNTUsOTAsODAsMiwyNTUsMTMxLDEwNiw5NiwyNTQsMjI3LDExNCwxMzUsMCwyMDUsNDksMTE5LDI1NCwxNzYsNjIsNjQsMjU1LDgyLDUxLDE3LDI1NSwyNDEsMjAsMjQzLDI1NSwxMzAsMTMsOCwyNTQsMTI4LDIxNywyNDMsMjU1LDE2MiwyNywxLDI1NCw5MCwxMTgsMjQxLDAsMjQ2LDE5OCwyNDYsMjU1LDU1LDE2LDExOCwyNTUsMjAwLDE1OSwxNTcsMCwxNjMsMTcsMSwwLDE0MCwxMDcsMTIxLDAsODUsMTYxLDExOCwyNTUsMzgsMCwxNDksMCwxNTYsNDcsMjM4LDAsOSwxNjYsMTY2LDEsNzUsOTgsMTgxLDI1NSw1MCw3NCwyNSwwLDY2LDE1LDQ3LDAsMTM5LDIyNSwxNTksMCw3NiwzLDE0MiwyNTUsMTQsMjM4LDE4NCwwLDExLDIwNyw1MywyNTUsMTgzLDE5MiwxODYsMSwxNzEsMzIsMTc0LDI1NSwxOTEsNzYsMjIxLDEsMjQ3LDE3MCwyMTksMCwyNSwxNzIsNTAsMjU0LDIxNyw5LDIzMywwLDIwMywxMjYsNjgsMjU1LDE4Myw5Miw0OCwwLDEyNywxNjcsMTgzLDEsNjUsNDksMjU0LDAsMTYsNjMsMTI3LDEsMjU0LDIxLDE3MCwyNTUsNTksMjI0LDEyNywyNTQsMjIsNDgsNjMsMjU1LDI3LDc4LDEzMCwyNTQsNDAsMTk1LDI5LDAsMjUwLDEzMiwxMTIsMjU0LDM1LDIwMywxNDQsMCwxMDQsMTY5LDE2OCwwLDIwNywyNTMsMzAsMjU1LDEwNCw0MCwzOCwyNTQsOTQsMjI4LDg4LDAsMjA2LDE2LDEyOCwyNTUsMjEyLDU1LDEyMiwyNTUsMjIzLDIyLDIzNCwwLDIyMywxOTcsMTI3LDAsMjUzLDE4MSwxODEsMSwxNDUsMTAyLDExOCwwLDIzNiwxNTMsMzYsMjU1LDIxMiwyMTcsNzIsMjU1LDIwLDM4LDI0LDI1NCwxMzgsNjIsNjIsMCwxNTIsMTQwLDQsMCwyMzAsMjIwLDk5LDI1NSwxLDIxLDIxMiwyNTUsMTQ4LDIwMSwyMzEsMCwyNDQsMTIzLDksMjU0LDAsMTcxLDIxMCwwLDUxLDU4LDM3LDI1NSwxLDI1NSwxNCwyNTUsMjQ0LDE4MywxNDUsMjU0LDAsMjQyLDE2NiwwLDIyLDc0LDEzMiwwLDEyMSwyMTYsNDEsMCw5NSwxOTUsMTE0LDI1NCwxMzMsMjQsMTUxLDI1NSwxNTYsMjI2LDIzMSwyNTUsMjQ3LDUsNzcsMjU1LDI0NiwxNDgsMTE1LDI1NCwyMjUsOTIsODEsMjU1LDIyMiw4MCwyNDYsMjU0LDE3MCwxMjMsODksMjU1LDc0LDE5OSwxNDEsMCwyOSwyMCw4LDI1NSwxMzgsMTM2LDcwLDI1NSw5Myw3NSw5MiwwLDIyMSwxNDcsNDksMjU0LDUyLDEyNiwyMjYsMCwyMjksMTI0LDIzLDAsNDYsOSwxODEsMCwyMDUsNjQsNTIsMSwxMzEsMjU0LDI4LDAsMTUxLDE1OCwyMTIsMCwxMzEsNjQsNzgsMCwyMDYsMjUsMTcxLDAsMCwyMzAsMTM5LDAsMTkxLDI1MywxMTAsMjU0LDEwMywyNDcsMTY3LDAsNjQsNDAsNDAsMSw0MiwxNjUsMjQxLDI1NSw1OSw3NSwyMjgsMjU0LDEyNCwyNDMsMTg5LDI1NSwxOTYsOTIsMTc4LDI1NSwxMzAsMTQwLDg2LDI1NSwxNDEsODksNTYsMSwxNDcsMTk4LDUsMjU1LDIwMywyNDgsMTU4LDI1NCwxNDQsMTYyLDE0MSwwLDExLDE3MiwyMjYsMCwxMzAsNDIsMjEsMjU1LDEsMTY3LDE0MywyNTUsMTQ0LDM2LDM2LDI1NSw0OCw4OCwxNjQsMjU0LDE2OCwxNzAsMjIwLDAsOTgsNzEsMjE0LDAsOTEsMjA4LDc5LDAsMTU5LDc2LDIwMSwxLDE2Niw0MiwyMTQsMjU1LDY5LDI1NSwwLDI1NSw2LDEyOCwxMjUsMjU1LDE5MCwxLDE0MCwwLDE0Niw4MywyMTgsMjU1LDIxNSwyMzgsNzIsMSwxMjIsMTI3LDUzLDAsMTg5LDExNiwxNjUsMjU1LDg0LDgsNjYsMjU1LDIxNCwzLDIwOCwyNTUsMjEzLDExMCwxMzMsMCwxOTUsMTY4LDQ0LDEsMTU4LDIzMSw2OSwwLDE2Miw2NCwyMDAsMjU0LDkxLDU4LDEwNCwwLDE4Miw1OCwxODcsMjU0LDI0OSwyMjgsMTM2LDAsMjAzLDEzNCw3NiwyNTQsOTksMjIxLDIzMywwLDc1LDI1NCwyMTQsMjU0LDgwLDY5LDE1NCwwLDY0LDE1MiwyNDgsMjU0LDIzNiwxMzYsMjAyLDI1NSwxNTcsMTA1LDE1MywyNTQsMTQ5LDE3NSwyMCwwLDIyLDM1LDE5LDI1NSwxMjQsMTIxLDIzMywwLDE4NiwyNTAsMTk4LDI1NCwxMzIsMjI5LDEzOSwwLDEzNyw4MCwxNzQsMjU1LDE2NSwxMjUsNjgsMCwxNDQsMjAyLDE0OCwyNTQsMjM1LDIzOSwyNDgsMCwxMzUsMTg0LDExOCwwLDEwMSw5NCwxNywyNTUsMTIyLDcyLDcwLDI1NCw2OSwxMzAsMTQ2LDAsMTI3LDIyMiwyNDgsMSw2OSwxMjcsMTE4LDI1NSwzMCw4MiwyMTUsMjU0LDE4OCw3NCwxOSwyNTUsMjI5LDE2NywxOTQsMjU0LDExNywyNSw2NiwyNTUsNjUsMjM0LDU2LDI1NCwyMTMsMjIsMTU2LDAsMTUxLDU5LDkzLDI1NCw0NSwyOCwyNywyNTUsMTg2LDEyNiwxNjQsMjU1LDMyLDYsMjM5LDAsMTI3LDExNCw5OSwxLDIxOSw1MiwyLDI1NSw5OSw5NiwxNjYsMjU0LDYyLDE5MCwxMjYsMjU1LDEwOCwyMjIsMTY4LDEsNzUsMjI2LDE3NCwwLDIzMCwyMjYsMTk5LDAsNjAsMTE3LDIxOCwyNTUsMjUyLDI0OCwyMCwxLDIxNCwxODgsMjA0LDAsMzEsMTk0LDEzNCwyNTQsMTIzLDY5LDE5MiwyNTUsMTY5LDE3MywzNiwyNTQsNTUsOTgsOTEsMCwyMjMsNDIsMTAyLDI1NCwxMzcsMSwxMDIsMCwxNTcsOTAsMjUsMCwyMzksMTIyLDY0LDI1NSwyNTIsNiwyMzMsMCw3LDU0LDIwLDI1NSw4MiwxMTYsMTc0LDAsMTM1LDM3LDU0LDI1NSwxNSwxODYsMTI1LDAsMjI3LDExMiwxNzUsMjU1LDEwMCwxODAsMjI1LDI1NSw0MiwyMzcsMjQ0LDI1NSwyNDQsMTczLDIyNiwyNTQsMjQ4LDE4LDMzLDAsMTcxLDk5LDE1MCwyNTUsNzQsMjM1LDUwLDI1NSwxMTcsODIsMzIsMjU0LDEwNiwxNjgsMjM3LDAsMjA3LDEwOSwyMDgsMSwyMjgsOSwxODYsMCwxMzUsNjAsMTY5LDI1NCwxNzksOTIsMTQzLDAsMjQ0LDE3MCwxMDQsMjU1LDIzNSw0NSwxMjQsMjU1LDcwLDk5LDE4NiwwLDExNywxMzcsMTgzLDAsMjI0LDMxLDIxNSwwLDQwLDksMTAwLDAsMjYsMTYsOTUsMSw2OCwyMTcsODcsMCw4LDE1MSwyMCwyNTUsMjYsMTAwLDU4LDI1NSwxNzYsMTY1LDIwMywxLDUyLDExOCw3MCwwLDcsMzIsMjU0LDI1NCwyNDQsMjU0LDI0NSwyNTUsMTY3LDE0NCwxOTQsMjU1LDEyNSwxMTMsMjMsMjU1LDE3NiwxMjEsMTgxLDAsMTM2LDg0LDIwOSwwLDEzOCw2LDMwLDI1NSw4OSw0OCwyOCwwLDMzLDE1NSwxNCwyNTUsMjUsMjQwLDE1NCwwLDE0MSwyMDUsMTA5LDEsNzAsMTE1LDYyLDI1NSwyMCw0MCwxMDcsMjU0LDEzOCwxNTQsMTk5LDI1NSw5NCwyMjMsMjI2LDI1NSwxNTcsMTcxLDM4LDAsMTYzLDE3NywyNSwyNTQsNDUsMTE4LDMsMjU1LDE0LDIyMiwyMywxLDIwOSwxOTAsODEsMjU1LDExOCwxMjMsMjMyLDEsMTMsMjEzLDEwMSwyNTUsMTIzLDU1LDEyMywyNTQsMjcsMjQ2LDE2NSwwLDUwLDk5LDc2LDI1NSwxNDAsMjE0LDMyLDI1NSw5Nyw2NSw2NywyNTUsMjQsMTIsMjgsMCwxNzQsODYsNzgsMSw2NCwyNDcsOTYsMCwxNjAsMTM1LDY3LDAsNjYsNTUsMjQzLDI1NSwxNDcsMjA0LDk2LDI1NSwyNiw2LDMzLDI1NSw5OCw1MSw4MywxLDE1MywyMTMsMjA4LDI1NSwyLDE4NCw1NCwyNTUsMjUsMjE4LDExLDAsNDksNjcsMjQ2LDI1NCwxOCwxNDksNzIsMjU1LDEzLDI1LDcyLDAsNDIsNzksMjE0LDAsNDIsNCwzOCwxLDI3LDEzOSwxNDQsMjU1LDE0OSwxODcsMjMsMCwxOCwxNjQsMTMyLDAsMjQ1LDg0LDE4NCwyNTQsMTIwLDE5OCwxMDQsMjU1LDEyNiwyMTgsOTYsMCw1NiwxMTcsMjM0LDI1NSwxMywyOSwyMTQsMjU0LDY4LDQ3LDEwLDI1NSwxNjcsMTU0LDEzMiwyNTQsMTUyLDM4LDE5OCwwLDY2LDE3OCw4OSwyNTUsMjAwLDQ2LDE3MSwyNTUsMTMsOTksODMsMjU1LDIxMCwxODcsMjUzLDI1NSwxNzAsNDUsNDIsMSwxMzgsMjA5LDEyNCwwLDIxNCwxNjIsMTQxLDAsMTIsMjMwLDE1NiwwLDEwMiwzNiwxMTIsMjU0LDMsMTQ3LDY3LDAsNTIsMjE1LDEyMywyNTUsMjMzLDE3MSw1NCwyNTUsOTgsMTM3LDYyLDAsMjQ3LDIxOCwzOSwyNTUsMjMxLDIxOCwyMzYsMCwyNDcsMTkxLDEyNywwLDE5NSwxNDYsODQsMCwxNjUsMTc2LDkyLDI1NSwxOSwyMTIsOTQsMjU1LDE3LDc0LDIyNywwLDg4LDQwLDE1MywxLDE5OCwxNDcsMSwyNTUsMjA2LDY3LDI0NSwyNTQsMjQwLDMsMjE4LDI1NSw2MSwxNDEsMjEzLDI1NSw5NywxODMsMTA2LDAsMTk1LDIzMiwyMzUsMjU0LDk1LDg2LDE1NCwwLDIwOSw0OCwyMDUsMjU0LDExOCwyMDksMjQxLDI1NSwyNDAsMTIwLDIyMywxLDIxMywyOSwxNTksMCwxNjMsMTI3LDE0NywyNTUsMTMsMjE4LDkzLDAsODUsMjQsNjgsMjU0LDcwLDIwLDgwLDI1NSwxODksNSwxNDAsMSw4Miw5NywyNTQsMjU1LDk5LDk5LDE5MSwyNTUsMTMyLDg0LDEzMywyNTUsMTA3LDIxOCwxMTYsMjU1LDExMiwxMjIsNDYsMCwxMDUsMTcsMzIsMCwxOTQsMTYwLDYzLDI1NSw2OCwyMjIsMzksMSwyMTYsMjUzLDkyLDAsMTc3LDEwNSwyMDUsMjU1LDE0OSwyMDEsMTk1LDAsNDIsMjI1LDExLDI1NSw0MCwxNjIsMTE1LDAsOSw3LDgxLDAsMTY1LDIxOCwyMTksMCwxODAsMjIsMCwyNTQsMjksMTQ2LDI1MiwyNTUsMTQ2LDIwNywyMjUsMSwxODAsMTM1LDk2LDAsMzEsMTYzLDExMiwwLDE3NywxMSwyMTksMjU1LDEzMywxMiwxOTMsMjU0LDQzLDc4LDUwLDAsNjUsMTEzLDEyMSwxLDU5LDIxNyw2LDI1NSwxMTAsOTQsMjQsMSwxMTIsMTcyLDExMSwwLDcsMTUsOTYsMCwzNiw4NSwxMjMsMCw3MSwxNTAsMjEsMjU1LDIwOCw3MywxODgsMCwxOTIsMTEsMTY3LDEsMjEzLDI0NSwzNCwwLDksMjMwLDkyLDAsMTYyLDE0MiwzOSwyNTUsMjE1LDkwLDI3LDAsOTgsOTcsODksMCw5NCw3OSwyMTEsMCw5MCwxNTcsMjQwLDAsOTUsMjIwLDEyNiwxLDEwMiwxNzYsMjI2LDAsMzYsMzAsMjI0LDI1NCwzNSwzMSwxMjcsMCwyMzEsMjMyLDExNSwxLDg1LDgzLDEzMCwwLDIxMCw3MywyNDUsMjU1LDQ3LDE0MywxMTQsMjU1LDY4LDY1LDE5NywwLDU5LDcyLDYyLDI1NSwxODMsMTMzLDE3MywyNTQsOTMsMTIxLDExOCwyNTUsNTksMTc3LDgxLDI1NSwyMzQsNjksMTczLDI1NSwyMDUsMTI4LDE3NywwLDIyMCwyNDQsNTEsMCwyNiwyNDQsMjA5LDEsNzMsMjIyLDc3LDI1NSwxNjMsOCw5NiwyNTQsMTUwLDE0OSwyMTEsMCwxNTgsMjU0LDIwMywxLDU0LDEyNywxMzksMCwxNjEsMjI0LDU5LDAsNCwxMDksMjIsMjU1LDIyMiw0Miw0NSwyNTUsMjA4LDE0NiwxMDIsMjU1LDIzNiwxNDIsMTg3LDAsNTAsMjA1LDI0NSwyNTUsMTAsNzQsODksMjU0LDQ4LDc5LDE0MiwwLDIyMiw3NiwxMzAsMjU1LDMwLDE2Niw2MywwLDIzNiwxMiwxMywyNTUsNDksMTg0LDI0NCwwLDE4NywxMTMsMTAyLDAsMjE4LDEwMSwyNTMsMCwxNTMsNTcsMTgyLDI1NCwzMiwxNTAsNDIsMCwyNSwxOTgsMTQ2LDEsMjM3LDI0MSw1NiwwLDE0MCw2OCw1LDAsOTEsMTY0LDE3MiwyNTUsNzgsMTQ1LDE4NiwyNTQsNjcsNTIsMjA1LDAsMjE5LDIwNywxMjksMSwxMDksMTE1LDE3LDAsNTQsMTQzLDU4LDEsMjEsMjQ4LDEyMCwyNTUsMTc5LDI1NSwzMCwwLDE5MywyMzYsNjYsMjU1LDEsMjU1LDcsMjU1LDI1MywxOTIsNDgsMjU1LDE5LDY5LDIxNywxLDMsMjE0LDAsMjU1LDY0LDEwMSwxNDYsMSwyMjMsMTI1LDM1LDI1NSwyMzUsNzMsMTc5LDI1NSwyNDksMTY3LDIyNiwwLDIyNSwxNzUsMTAsMSw5NywxNjIsNTgsMCwxMDYsMTEyLDE3MSwxLDg0LDE3Miw1LDI1NSwxMzMsMTQwLDE3OCwyNTUsMTM0LDI0NSwxNDIsMCw5Nyw5MCwxMjUsMjU1LDE4NiwyMDMsMTg1LDI1NSwyMjMsNzcsMjMsMjU1LDE5Miw5MiwxMDYsMCwxNSwxOTgsMTE1LDI1NSwyMTcsMTUyLDI0OCwwLDE3MSwxNzgsMTIwLDI1NSwyMjgsMTM0LDUzLDAsMTc2LDU0LDE5MywxLDI1MCwyNTEsNTMsMCwyMTMsMTAsMTAwLDEsMzQsMTk5LDEwNiwwLDE1MSwzMSwyNDQsMjU0LDE3MiwyMjQsODcsMjU1LDE0LDIzNywyMywyNTUsMjUzLDg1LDI2LDI1NSwxMjcsMzksMTE2LDI1NSwxNzIsMTA0LDEwMCwwLDI1MSwxNCw3MCwyNTUsMjEyLDIwOCwxMzgsMjU1LDI1MywyMTEsMjUwLDAsMTc2LDQ5LDE2NSwwLDE1LDc2LDEyMywyNTUsMzcsMjE4LDE2MCwyNTUsOTIsMTM1LDE2LDEsMTAsMTI2LDExNCwyNTUsNzAsNSwyMjQsMjU1LDI0NywyNDksMTQxLDAsNjgsMjAsNjAsMSwyNDEsMjEwLDE4OSwyNTUsMTk1LDIxNywxODcsMSwxNTEsMywxMTMsMCwxNTEsOTIsMTc0LDAsMjMxLDYyLDE3OCwyNTUsMjE5LDE4MywyMjUsMCwyMywyMywzMywyNTUsMjA1LDE4MSw4MCwwLDU3LDE4NCwyNDgsMjU1LDY3LDE4MCwxLDI1NSw5MCwxMjMsOTMsMjU1LDM5LDAsMTYyLDI1NSw5NiwyNDgsNTIsMjU1LDg0LDY2LDE0MCwwLDM0LDEyNywyMjgsMjU1LDE5NCwxMzgsNywxLDE2NiwxMTAsMTg4LDAsMjEsMTcsMTU1LDEsMTU0LDE5MCwxOTgsMjU1LDIxNCw4MCw1OSwyNTUsMTgsNywxNDMsMCw3MiwyOSwyMjYsMSwxOTksMjE3LDI0OSwwLDIzMiwxNjEsNzEsMSwxNDksMTkwLDIwMSwwLDIxNywxNzUsOTUsMjU0LDExMywxNDcsNjcsMjU1LDEzOCwxNDMsMTk5LDI1NSwxMjcsMjA0LDEsMCwyOSwxODIsODMsMSwyMDYsMjMwLDE1NSwyNTUsMTg2LDIwNCw2MCwwLDEwLDEyNSw4NSwyNTUsMjMyLDk2LDI1LDI1NSwyNTUsODksMjQ3LDI1NSwyMTMsMjU0LDE3NSwxLDIzMiwxOTMsODEsMCwyOCw0MywxNTYsMjU0LDEyLDY5LDgsMCwxNDcsMjQsMjQ4LDAsMTgsMTk4LDQ5LDAsMTM0LDYwLDM1LDAsMTE4LDI0NiwxOCwyNTUsNDksODgsMjU0LDI1NCwyMjgsMjEsMTg2LDI1NSwxODIsNjUsMTEyLDEsMjE5LDIyLDEsMjU1LDIyLDEyNiw1MiwyNTUsMTg5LDUzLDQ5LDI1NSwxMTIsMjUsMTQzLDAsMzgsMTI3LDU1LDI1NSwyMjYsMTAxLDE2MywyNTQsMjA4LDEzMyw2MSwyNTUsMTM3LDY5LDE3NCwxLDE5MCwxMTgsMTQ1LDI1NSw2MCw5OCwyMTksMjU1LDIxNywxMywyNDUsMjU1LDI1MCwxMzYsMTAsMCw4NCwyNTQsMjI2LDAsMjAxLDMxLDEyNSwxLDI0MCw1MSwyNTEsMjU1LDMxLDEzMSwxMzAsMjU1LDIsMTM4LDUwLDI1NSwyMTUsMjE1LDE3NywxLDIyMywxMiwyMzgsMjU1LDI1MiwxNDksNTYsMjU1LDEyNCw5MSw2OCwyNTUsNzIsMTI2LDE3MCwyNTQsMTE5LDI1NSwxMDAsMCwxMzAsMTM1LDIzMiwyNTUsMTQsNzksMTc4LDAsMjUwLDEzMSwxOTcsMCwxMzgsMTk4LDIwOCwwLDEyMSwyMTYsMTM5LDI1NCwxMTksMTgsMzYsMjU1LDI5LDE5MywxMjIsMCwxNiw0Miw0NSwyNTUsMjEzLDI0MCwyMzUsMSwyMzAsMTkwLDE2OSwyNTUsMTk4LDM1LDIyOCwyNTQsMTEwLDE3Myw3MiwwLDIxNCwyMjEsMjQxLDI1NSw1NiwxNDgsMTM1LDAsMTkyLDExNyw3OCwyNTQsMTQxLDkzLDIwNywyNTUsMTQzLDY1LDE0OSwwLDIxLDE4LDk4LDI1NSw5NSw0NCwyNDQsMSwxMDYsMTkxLDc3LDAsMjU0LDg1LDgsMjU0LDIxNCwxMTAsMTc2LDI1NSw3MywxNzMsMTksMjU0LDE2MCwxOTYsMTk5LDI1NSwyMzcsOTAsMTQ0LDAsMTkzLDE3MiwxMTMsMjU1LDIwMCwxNTUsMTM2LDI1NCwyMjgsOTAsMjIxLDAsMTM3LDQ5LDc0LDEsMTY0LDIyMSwyMTUsMjU1LDIwOSwxODksNSwyNTUsMTA1LDIzNiw1NSwyNTUsNDIsMzEsMTI5LDEsMTkzLDI1NSwyMzYsMCw0NiwyMTcsNjAsMCwxMzgsODgsMTg3LDI1NSwyMjYsODIsMjM2LDI1NSw4MSw2OSwxNTEsMjU1LDE0MiwxOTAsMTYsMSwxMywxMzQsOCwwLDEyNywxMjIsNDgsMjU1LDgxLDY0LDE1NiwwLDE3MSwyNDMsMTM5LDAsMjM3LDM1LDI0NiwwLDEyMiwxNDMsMTkzLDI1NCwyMTIsMTIyLDE0NiwwLDk1LDQxLDI1NSwxLDg3LDEzMiw3NywwLDQsMjEyLDMxLDAsMTcsMzEsNzgsMCwzOSw0NSwxNzMsMjU0LDI0LDE0MiwyMTcsMjU1LDk1LDksNiwyNTUsMjI3LDgzLDYsMCw5OCw1OSwxMzAsMjU0LDYyLDMwLDMzLDAsOCwxMTUsMjExLDEsMTYyLDk3LDEyOCwyNTUsNywxODQsMjMsMjU0LDExNiwyOCwxNjgsMjU1LDI0OCwxMzgsMTUxLDI1NSw5OCwyNDQsMjQwLDAsMTg2LDExOCwxMzAsMCwxMTQsMjQ4LDIzNSwyNTUsMTA1LDE3MywyMDAsMSwxNjAsMTI0LDcxLDI1NSw5NCwzNiwxNjQsMSwxNzUsNjUsMTQ2LDI1NSwyMzgsMjQxLDE3MCwyNTQsMjAyLDE5OCwxOTcsMCwyMjgsNzEsMTM4LDI1NCw0NSwyNDYsMTA5LDI1NSwxOTQsNTIsMTU4LDAsMTMzLDE4NywxNzYsMCw4MywyNTIsMTU0LDI1NCw4OSwxODksMjIxLDI1NSwxNzAsNzMsMjUyLDAsMTQ4LDU4LDEyNSwwLDM2LDY4LDUxLDI1NCw0Miw2OSwxNzcsMjU1LDE2OCw3Niw4NiwyNTUsMzgsMTAwLDIwNCwyNTUsMzgsNTMsMzUsMCwxNzUsMTksOTcsMCwyMjUsMjM4LDI1MywyNTUsODEsODEsMTM1LDAsMjEwLDI3LDI1NSwyNTQsMjM1LDczLDEwNywwLDgsMjA3LDExNSwwLDgyLDEyNywxMzYsMCw4NCw5OSwyMSwyNTQsMjA3LDE5LDEzNiwwLDEwMCwxNjQsMTAxLDAsODAsMjA4LDc3LDI1NSwxMzIsMjA3LDIzNywyNTUsMTUsMywxNSwyNTUsMzMsMTY2LDExMCwwLDE1Niw5NSw4NSwyNTUsMzcsMTg1LDExMSwxLDE1MCwxMDYsMzUsMjU1LDE2NiwxNTEsNzYsMCwxMTQsODcsMTM1LDI1NSwxNTksMTk0LDY0LDAsMTIsMTIyLDMxLDI1NSwyMzIsNywxMDEsMjU0LDE3MywxMTksOTgsMCwxNTQsNzEsMjIwLDI1NCwxOTEsNTcsNTMsMjU1LDE2OCwyMzIsMTYwLDI1NSwyMjQsMzIsOTksMjU1LDIxOCwxNTYsMTY1LDAsMTUxLDE1MywxNjMsMCwyMTcsMTMsMTQ4LDEsMTk3LDExMyw4OSwwLDE0OSwyOCwxNjEsMjU0LDIwNywyMywzMCwwLDEwNSwxMzIsMjI3LDI1NSw1NCwyMzAsOTQsMjU1LDEzMywxNzMsMjA0LDI1NSw5MiwxODMsMTU3LDI1NSw4OCwxNDQsMjUyLDI1NCwxMDIsMzMsOTAsMCwxNTksOTcsMywwLDE4MSwyMTgsMTU1LDI1NSwyNDAsMTE0LDExOSwwLDEwNiwyMTQsNTMsMjU1LDE2NSwxOTAsMTE1LDEsMTUyLDkxLDIyNSwyNTUsODgsMTA2LDQ0LDI1NSwyMDgsNjEsMTEzLDAsMTUxLDUyLDEyNCwwLDE5MSwyNywxNTYsMjU1LDExMCw1NCwyMzYsMSwxNCwzMCwxNjYsMjU1LDM5LDEyNywyMDcsMSwyMjksMTk5LDI4LDAsMTg4LDIyOCwxODgsMjU0LDEwMCwxNTcsMjM1LDAsMjQ2LDIxOCwxODMsMSwxMDcsMjIsMTkzLDI1NSwyMDYsMTYwLDk1LDAsNzYsMjM5LDE0NywwLDIwNywxNjEsMTE3LDAsNTEsMTY2LDIsMjU1LDUyLDExNywxMCwyNTQsNzMsNTYsMjI3LDI1NSwxNTIsMTkzLDIyNSwwLDEzMiw5NCwxMzYsMjU1LDEwMSwxOTEsMjA5LDAsMzIsMTA3LDIyOSwyNTUsMTk4LDQzLDE4MCwxLDEwMCwyMTAsMTE4LDAsMTE0LDY3LDE1MywyNTUsMjMsODgsMjYsMjU1LDg5LDE1NCw5MiwxLDIyMCwxMjAsMTQwLDI1NSwxNDQsMTE0LDIwNywyNTUsMjUyLDExNSwyNTAsMjU1LDM0LDIwNiw3MiwwLDEzOCwxMzMsMTI3LDI1NSw4LDE3OCwxMjQsMSw4Nyw3NSw5NywwLDE1LDIyOSw5MiwyNTQsMjQwLDY3LDEzMSwyNTUsMTE4LDEyMywyMjcsMjU0LDE0NiwxMjAsMTA0LDI1NSwxNDUsMjEzLDI1NSwxLDEyOSwxODcsNzAsMjU1LDIxOSwxMTksNTQsMCwxLDE5LDE3MywwLDQ1LDE1MCwxNDgsMSwyNDgsODMsNzIsMCwyMDMsMjMzLDE2OSwxLDE0MiwxMDcsNTYsMCwyNDcsMjQ5LDM4LDEsNDUsMjQyLDgwLDI1NSwzMCwyMzMsMTAzLDAsOTYsODIsNzAsMCwyMywyMDEsMTExLDAsODEsMzksMzAsMjU1LDE2MSwxODMsNzgsMjU1LDE5NCwyMzQsMzMsMjU1LDY4LDIyNywxNDAsMjU0LDIxNiwyMDYsMTE2LDAsNzAsMjcsMjM1LDI1NSwxMDQsMTQ0LDc5LDAsMTY0LDIzMCw5MywyNTQsMjE0LDEzNSwxNTYsMCwxNTQsMTg3LDI0MiwyNTQsMTg4LDIwLDEzMSwyNTUsMzYsMTA5LDE3NCwwLDE1OSwxMTIsMjQxLDAsNSwxMTAsMTQ5LDEsMzYsMTY1LDIxOCwwLDE2NiwyOSwxOSwxLDE3OCw0Niw3MywwLDkzLDQzLDMyLDI1NCwyNDgsMTg5LDIzNywwLDEwMiwxNTUsMTQxLDAsMjAxLDkzLDE5NSwyNTUsMjQxLDEzOSwyNTMsMjU1LDE1LDExMSw5OCwyNTUsMTA4LDY1LDE2MywyNTQsMTU1LDc5LDE5MCwyNTUsNzMsMTc0LDE5MywyNTQsMjQ2LDQwLDQ4LDI1NSwxMDcsODgsMTEsMjU0LDIwMiw5Nyw4NSwyNTUsMjUzLDIwNCwxOCwyNTUsMTEzLDI0Miw2NiwwLDExMCwxNjAsMTk0LDI1NCwyMDgsMTgsMTg2LDAsODEsMjEsNjAsMCwxODgsMTA0LDE2NywyNTUsMTI0LDE2Niw5NywyNTQsMjEwLDEzMywxNDIsMCw1NiwyNDIsMTM3LDI1NCw0MSwxMTEsMTMwLDAsMTExLDE1MSw1OCwxLDExMSwyMTMsMTQxLDI1NSwxODMsMTcyLDI0MSwyNTUsMzgsNiwxOTYsMjU1LDE4NSw3LDEyMywyNTUsNDYsMTEsMjQ2LDAsMjQ1LDEwNSwxMTksMSwxNSwyLDE2MSwyNTUsOCwyMDYsNDUsMjU1LDE4LDIwMiw3NCwyNTUsODMsMTI0LDExNSwxLDIxMiwxNDEsMTU3LDAsODMsOCwyMDksMjU0LDEzOSwxNSwyMzIsMjU1LDE3Miw1NCwxNzMsMjU0LDUwLDI0NywxMzIsMCwyMTQsMTg5LDIxMywwLDE0NCwxODQsMTA1LDAsMjIzLDI1NCwyNDgsMCwyNTUsMTQ3LDI0MCwyNTUsMjMsMTg4LDcyLDAsNyw1MSw1NCwwLDE4OCwyNSwxODAsMjU0LDIyMCwxODAsMCwyNTUsODMsMTYwLDIwLDAsMTYzLDE4OSwyNDMsMjU1LDU4LDIwOSwxOTQsMjU1LDg3LDczLDYwLDAsMTA2LDI0LDQ5LDAsMjQ1LDI0OSwyMjAsMCwyMiwxNzMsMTY3LDAsMTE4LDExLDE5NSwyNTUsMTksMTI2LDIzNywwLDExMCwxNTksMzcsMjU1LDU5LDgyLDQ3LDAsMTgwLDE4Nyw4NiwwLDE4OCwxNDgsMjA4LDEsMTAwLDM3LDEzMywyNTUsNywxMTIsMTkzLDAsMTI5LDE4OCwxNTYsMjU1LDg0LDEwNiwxMjksMjU1LDEzMywyMjUsMjAyLDAsMTQsMjM2LDExMSwyNTUsNDAsMjAsMTAxLDAsMTcyLDE3Miw0OSwyNTQsNTEsNTQsNzQsMjU1LDI1MSwxODUsMTg0LDI1NSw5MywxNTUsMjI0LDI1NSwxODAsMjQ5LDIyNCwxLDIzMCwxNzgsMTQ2LDAsNzIsNTcsNTQsMjU0LDE3OCw2MiwxODQsMCwxMTksMjA1LDcyLDAsMTg1LDIzOSwyNTMsMjU1LDYxLDE1LDIxOCwwLDE5Niw2Nyw1NiwyNTUsMjM0LDMyLDE3MSwxLDQ2LDIxOSwyMjgsMCwyMDgsMTA4LDIzNCwyNTUsMjAsNjMsMjMyLDI1NSwxNjUsNTMsMTk5LDEsMTMzLDIyOCw1LDI1NSw1MiwyMDUsMTA3LDAsNzQsMjM4LDE0MCwyNTUsMTUwLDE1NiwyMTksMjU0LDIzOSwxNzIsMTc4LDI1NSwyNTEsMTg5LDIyMywyNTQsMzIsMTQyLDIxMSwyNTUsMjE4LDE1LDEzOCwxLDI0MSwxOTYsODAsMCwyOCwzNiw5OCwyNTQsMjIsMjM0LDE5OSwwLDYxLDIzNywyMjAsMjU1LDI0Niw1NywzNywwLDE0MiwxNywxNDIsMjU1LDE1Nyw2MiwyNiwwLDQzLDIzOCw5NSwyNTQsMywyMTcsNiwyNTUsMjEzLDI1LDI0MCwxLDM5LDIyMCwxNzQsMjU1LDE1NCwyMDUsNDgsMjU0LDE5LDEzLDE5MiwyNTUsMjQ0LDM0LDU0LDI1NCwxNDAsMTYsMTU1LDAsMjQwLDE4MSw1LDI1NCwxNTUsMTkzLDYwLDAsMTY2LDEyOCw0LDI1NSwzNiwxNDUsNTYsMjU1LDE1MCwyNDAsMjE5LDAsMTIwLDUxLDE0NSwwLDgyLDE1Myw0MiwxLDE0MCwyMzYsMTQ2LDAsMTA3LDkyLDI0OCwxLDE4OSwxMCwzLDAsNjMsMTM2LDI0MiwwLDIxMSwzOSwyNCwwLDE5LDIwMiwxNjEsMSwxNzMsMjcsMTg2LDI1NSwyMTAsMjA0LDIzOSwyNTQsNDEsMjA5LDE2MiwyNTUsMTgyLDI1NCwxNTksMjU1LDE3MiwxMTYsNTIsMCwxOTUsMTAzLDIyMiwyNTQsMjA1LDY5LDU5LDAsNTMsMjIsNDEsMSwyMTgsNDgsMTk0LDAsODAsMjEwLDI0MiwwLDIxMCwxODgsMjA3LDAsMTg3LDE2MSwxNjEsMjU0LDIxNiwxNywxLDAsMTM2LDIyNSwxMTMsMCwyNTAsMTg0LDYzLDAsMjIzLDMwLDk4LDI1NCw3NywxNjgsMTYyLDAsNTksNTMsMTc1LDAsMTksMjAxLDEwLDI1NSwxMzksMjI0LDE5NCwwLDE0NywxOTMsMTU0LDI1NSwyMTIsMTg5LDEyLDI1NCwxLDIwMCwxNzQsMjU1LDUwLDEzMywxMTMsMSw5NCwxNzksOTAsMCwxNzMsMTgyLDEzNSwwLDk0LDE3NywxMTMsMCw0Myw4OSwyMTUsMjU1LDEzNiwyNTIsMTA2LDI1NSwxMjMsMTM0LDgzLDI1NCw1LDI0NSw2NiwyNTUsODIsNDksMzksMSwyMjAsMiwyMjQsMCw5NywxMjksMTc3LDAsNzcsNTksODksMCw2MSwyOSwxNTUsMSwyMDMsMTcxLDIyMCwyNTUsOTIsNzgsMTM5LDAsMTQ1LDMzLDE4MSwyNTUsMTY5LDI0LDE0MSwxLDU1LDE1MCwxNzksMCwxMzksNjAsODAsMjU1LDIxOCwzOSw5NywwLDIsMTQ3LDEwNywyNTUsNjAsMjQ4LDcyLDAsMTczLDIzMCw0NywxLDYsODMsMTgyLDI1NSwxNiwxMDUsMTYyLDI1NCwxMzcsMjEyLDgxLDI1NSwxODAsMTg0LDEzNCwxLDM5LDIyMiwxNjQsMjU1LDIyMSwxMDUsMjUxLDEsMjM5LDExMiwxMjUsMCw2Myw3LDk3LDAsNjMsMTA0LDIyNywyNTUsMTQ4LDU4LDEyLDAsOTAsNjAsMjI0LDI1NSw4NCwyMTIsMjUyLDAsNzksMjE1LDE2OCwwLDI0OCwyMjEsMTk5LDEsMTE1LDEyMSwxLDAsMzYsMTcyLDEyMCwwLDMyLDE2MiwxODcsMjU1LDU3LDEwNyw0OSwyNTUsMTQ3LDQyLDIxLDAsMTA2LDE5OCw0MywxLDU3LDc0LDg3LDAsMTI2LDIwMyw4MSwyNTUsMTI5LDEzNSwxOTUsMCwxNDAsMzEsMTc3LDAsMjIxLDEzOSwxOTQsMCwzLDIyMiwyMTUsMCwxMzEsNjgsMjMxLDAsMTc3LDg2LDE3OCwyNTQsMTI0LDE1MSwxODAsMCwxODQsMTI0LDM4LDEsNzAsMTYzLDE3LDAsMjQ5LDI1MSwxODEsMSw0Miw1NSwyMjcsMCwyMjYsMTYxLDQ0LDAsMjMsMjM2LDExMCwwLDUxLDE0OSwxNDIsMSw5Myw1LDIzNiwwLDIxOCwxODMsMTA2LDI1NCw2NywyNCw3NywwLDQwLDI0NSwyMDksMjU1LDIyMiwxMjEsMTUzLDAsMTY1LDU3LDMwLDAsODMsMTI1LDYwLDAsNzAsMzgsODIsMSwyMjksNiwxODgsMCwxMDksMjIyLDE1NywyNTUsNTUsMTE4LDYzLDI1NSwyMDUsMTUxLDE4NiwwLDIyNywzMywxNDksMjU1LDI1NCwxNzYsMjQ2LDEsMjI3LDE3NywyMjcsMCwzNCwxMDYsMTYzLDI1NCwxNzYsNDMsNzksMCwxMDYsOTUsNzgsMSwxODUsMjQxLDEyMiwyNTUsMTg1LDE0LDYxLDAsMzYsMSwyMDIsMCwxMywxNzgsMTYyLDI1NSwyNDcsMTEsMTMyLDAsMTYxLDIzMCw5MiwxLDY1LDEsMTg1LDI1NSwyMTIsNTAsMTY1LDEsMTQxLDE0Niw2NCwyNTUsMTU4LDI0MiwyMTgsMCwyMSwxNjQsMTI1LDAsMjEzLDEzOSwxMjIsMSw2Nyw3MSw4NywwLDIwMywxNTgsMTc4LDEsMTUxLDkyLDQzLDAsMTUyLDExMSw1LDI1NSwzOSwzLDIzOSwyNTUsMjE3LDI1NSwyNTAsMjU1LDE3Niw2Myw3MSwyNTUsNzQsMjQ1LDc3LDEsMjUwLDE3NCwxOCwyNTUsMzQsNDksMjI3LDI1NSwyNDYsNDYsMjUxLDI1NSwxNTQsMzUsNDgsMSwxMjUsMTU3LDYxLDI1NSwxMDYsMzYsNzgsMjU1LDk3LDIzNiwxNTMsMCwxMzYsMTg3LDEyMCwyNTUsMTEzLDEzNCwxNzEsMjU1LDE5LDIxMywyMTcsMjU0LDIxNiw5NCwyMDksMjU1LDI1Miw1LDYxLDAsOTQsMywyMDIsMCwzLDI2LDE4MywyNTUsNjQsMTkxLDQzLDI1NSwzMCwyMywyMSwwLDEyOSwxNDEsNzcsMjU1LDEwMiwxMjAsNywxLDE5NCw3NiwxNDAsMCwxODgsMTc1LDUyLDI1NSwxNyw4MSwxNDgsMCwyMzIsODYsNTUsMSwyMjUsNDgsMTcyLDAsMTM0LDQyLDQyLDI1NSwyMzgsNTAsNDcsMCwxNjksMTgsMjU0LDAsMjAsMTQ3LDg3LDI1NSwxNCwxOTUsMjM5LDI1NSw2OSwyNDcsMjMsMCwyMzgsMjI5LDEyOCwyNTUsMTc3LDQ5LDExMiwwLDE2OCw5OCwyNTEsMjU1LDEyMSw3MSwyNDgsMCwyNDMsOCwxNDUsMjU0LDI0NiwyMjcsMTUzLDI1NSwyMTksMTY5LDE3NywyNTQsMjUxLDEzOSwxNjUsMjU1LDEyLDE2MywxODUsMjU1LDE2NCw0MCwxNzEsMjU1LDE1MywxNTksMjcsMjU0LDI0MywxMDksOTEsMjU1LDIyMiwyNCwxMTIsMSwxOCwyMTQsMjMxLDAsMTA3LDE1NywxODEsMjU0LDE5NSwxNDcsMCwyNTUsMTk0LDk5LDEwNCwyNTUsODksMTQwLDE5MCwyNTUsMTc3LDY2LDEyNiwyNTQsMTA2LDE4NSw2NiwwLDQ5LDIxOCwzMSwwLDI1MiwxNzQsMTU4LDAsMTg4LDc5LDIzMCwxLDIzOCw0MSwyMjQsMCwyMTIsMjM0LDgsMSwxMzYsMTEsMTgxLDAsMTY2LDExNyw4MywyNTUsNjgsMTk1LDk0LDAsNDYsMTMyLDIwMSwwLDI0MCwxNTIsODgsMCwxNjQsNTcsNjksMjU0LDE2MCwyMjQsNDIsMjU1LDU5LDIxNSw2NywyNTUsMTE5LDE5NSwxNDEsMjU1LDM2LDE4MCwxMjEsMjU0LDIwNyw0Nyw4LDI1NSwxNzQsMjEwLDIyMywwLDEwMSwxOTcsNjgsMjU1LDI1NSw4MiwxNDEsMSwyNTAsMTM3LDIzMywwLDk3LDg2LDEzMywxLDE2LDgwLDY5LDAsMTMyLDEzMSwxNTksMCwxMTYsOTMsMTAwLDAsNDUsMTQxLDEzOSwwLDE1MiwxNzIsMTU3LDI1NSw5MCw0Myw5MSwwLDcxLDE1Myw0NiwwLDM5LDE2LDExMiwyNTUsMjE3LDEzNiw5NywyNTUsMjIwLDE5OCwyNSwyNTQsMTc3LDUzLDQ5LDAsMjIyLDg4LDEzNCwyNTUsMTI4LDE1LDYwLDAsMjA3LDE5MiwxNjksMjU1LDE5MiwxMTYsMjA5LDI1NSwxMDYsNzgsMjExLDEsMjAwLDIxMywxODMsMjU1LDcsMTIsMTIyLDI1NCwyMjIsMjAzLDYwLDI1NSwzMywxMTAsMTk5LDI1NCwyNTEsMTA2LDExNywwLDIyOCwyMjUsNCwxLDEyMCw1OCw3LDI1NSwyMjEsMTkzLDg0LDI1NCwxMTIsMTMzLDI3LDAsMTg5LDIwMCwyMDEsMjU1LDEzOSwxMzUsMTUwLDAsMjM0LDU1LDE3NiwyNTUsNjEsNTAsNjUsMCwxNTIsMTA4LDE2OSwyNTUsMjIwLDg1LDEsMjU1LDExMiwxMzUsMjI3LDAsMTYyLDI2LDE4NiwwLDIwNyw5NiwxODUsMjU0LDI0NCwxMzYsMTA3LDAsOTMsMTUzLDUwLDEsMTk4LDk3LDE1MSwwLDExMCwxMSw4NiwyNTUsMTQzLDExNywxNzQsMjU1LDExNSwyMTIsMjAwLDAsNSwyMDIsMTgzLDAsMjM3LDE2NCwxMCwyNTQsMTg1LDIzOSw2MiwwLDIzNiwxMjAsMTgsMjU0LDk4LDEyMyw5OSwyNTUsMTY4LDIwMSwxOTQsMjU0LDQ2LDIzNCwyMTQsMCwxOTEsMTMzLDQ5LDI1NSw5OSwxNjksMTE5LDAsMTkwLDE4NywzNSwxLDExNSwyMSw0NSwyNTUsMjQ5LDEzMSw3MiwwLDExMiw2LDEyMywyNTUsMjE0LDQ5LDE4MSwyNTQsMTY2LDIzMywzNCwwLDkyLDE5NywxMDIsMjU0LDI1MywyMjgsMjA1LDI1NSwzLDU5LDIwMSwxLDQyLDk4LDQ2LDAsMjE5LDM3LDM1LDI1NSwxNjksMTk1LDM4LDAsOTQsMTI0LDE5MywxLDE1Niw0MywyMjMsMCw5NSw3MiwxMzMsMjU0LDEyMCwyMDYsMTkxLDAsMTIyLDE5NywyMzksMjU1LDE3NywxODcsNzksMjU1LDI1NCw0NiwyLDEsMjUwLDE2NywxOTAsMCw4NCwxMjksMTksMCwyMDMsMTEzLDE2NiwyNTUsMjQ5LDMxLDE4OSwyNTQsNzIsMTU3LDIwMiwyNTUsMjA4LDcxLDczLDI1NSwyMDcsMjQsNzIsMCwxMCwxNiwxOCwxLDIxMCw4MSw3NiwyNTUsODgsMjA4LDE5MiwyNTUsMTI2LDI0MywxMDcsMjU1LDIzOCwxNDEsMTIwLDI1NSwxOTksMTIxLDIzNCwyNTUsMTM3LDEyLDU5LDI1NSwzNiwyMjAsMTIzLDI1NSwxNDgsMTc5LDYwLDI1NCwyNDAsMTIsMjksMCw2NiwwLDk3LDEsMzYsMzAsMzgsMjU1LDExNSwxLDkzLDI1NSw5NiwxMDMsMjMxLDI1NSwxOTcsMTU4LDU5LDEsMTkyLDE2NCwyNDAsMCwyMDIsMjAyLDU3LDI1NSwyNCwxNzQsNDgsMCw4OSw3NywxNTUsMSw0Miw3NiwyMTUsMCwyNDQsMTUxLDIzMywwLDIzLDQ4LDgxLDAsMjM5LDEyNyw1MiwyNTQsMjI3LDEzMCwzNywyNTUsMjQ4LDExNiw5MywxLDEyNCwxMzIsMTE4LDAsMTczLDI1NCwxOTIsMSw2LDIzNSw4MywyNTUsMTEwLDE3NSwyMzEsMSwyNTEsMjgsMTgyLDAsMTI5LDI0OSw5MywyNTQsODQsMTg0LDEyOCwwLDc2LDE4MSw2MiwwLDE3NSwxMjgsMTg2LDAsMTAwLDUzLDEzNiwyNTQsMTA5LDI5LDIyNiwwLDIyMSwyMzMsNTgsMSwyMCw5OSw3NCwwLDAsMjIsMTYwLDAsMTM0LDEzLDIxLDAsOSw1Miw1NSwyNTUsMTcsODksMTQwLDAsMTc1LDM0LDU5LDAsODQsMTY1LDExOSwyNTUsMjI0LDIyNiwyMzQsMjU1LDcsNzIsMTY2LDI1NSwxMjMsMTE1LDI1NSwxLDE4LDIxNCwyNDYsMCwyNTAsNyw3MSwxLDIxNywyMjAsMTg1LDAsMjEyLDM1LDc2LDI1NSwzOCwxMjUsMTc1LDAsMTg5LDk3LDIxMCwwLDExNCwyMzgsNDQsMjU1LDQxLDE4OCwxNjksMjU0LDQ1LDE4NiwxNTQsMCw4MSw5MiwyMiwwLDEzMiwxNjAsMTkzLDAsMTIxLDIwOCw5OCwyNTUsMTMsODEsNDQsMjU1LDIwMywxNTYsODIsMCw3MSw1OCwyMSwyNTUsMjA4LDExNCwxOTEsMjU0LDUwLDM4LDE0NywwLDE1NCwyMTYsMTk1LDAsMTAxLDI1LDE4LDAsNjAsMjUwLDIxNSwyNTUsMjMzLDEzMiwyMzUsMjU1LDEwMywxNzUsMTQyLDEsMTYsMTQsOTIsMCwxNDEsMzEsMTEwLDI1NCwyMzgsMjQxLDQ1LDI1NSwxNTMsMjE3LDIzOSwxLDk3LDE2OCw0NywyNTUsMjQ5LDg1LDE2LDEsMjgsMTc1LDYyLDI1NSw1NywyNTQsNTQsMCwyMjIsMjMxLDEyNiwwLDE2Niw0NSwxMTcsMjU0LDE4LDE4OSw5NiwyNTUsMjI4LDc2LDUwLDAsMjAwLDI0NCw5NCwwLDE5OCwxNTIsMTIwLDEsNjgsMzQsNjksMjU1LDEyLDY1LDE2MCwyNTQsMTAxLDE5LDkwLDAsMTY3LDE5NywxMjAsMjU1LDY4LDU0LDE4NSwyNTUsNDEsMjE4LDE4OCwwLDExMywxNjgsNDgsMCw4OCwxMDUsMTg5LDEsMjYsODIsMzIsMjU1LDE4NSw5MywxNjQsMSwyMjgsMjQwLDIzNywyNTUsNjYsMTgyLDUzLDAsMTcxLDE5Nyw5MiwyNTUsMTA3LDksMjMzLDEsMTk5LDEyMCwxNDQsMjU1LDc4LDQ5LDEwLDI1NSwxMDksMTcwLDEwNSwyNTUsOTAsNCwzMSwyNTUsMjgsMjQ0LDExMywyNTUsNzQsNTgsMTEsMCw2MiwyMjAsMjQ2LDI1NSwxMjEsMTU0LDIwMCwyNTQsMTQ0LDIxMCwxNzgsMjU1LDEyNiw1NywxMjksMSw0MywyNTAsMTQsMjU1LDEwMSwxMTEsMjgsMSw0Nyw4NiwyNDEsMjU1LDYxLDcwLDE1MCwyNTUsNTMsNzMsNSwyNTUsMzAsMjYsMTU4LDAsMjA5LDI2LDg2LDAsMTM4LDIzNyw3NCwwLDE2NCw5NSwxODgsMCwxNDIsNjAsMjksMjU0LDE2MiwxMTYsMjQ4LDI1NSwxODcsMTc1LDE2MCwwLDE1MSwxOCwxNiwwLDIwOSwxMTEsNjUsMjU0LDIwMywxMzQsMzksMjU1LDg4LDEwOCw0OSwyNTUsMTMxLDI2LDcxLDI1NSwyMjEsMjcsMjE1LDI1NCwxMDQsMTA1LDkzLDI1NSwzMSwyMzYsMzEsMjU0LDEzNSwwLDIxMSwyNTUsMTQzLDEyNywxMTAsMSwyMTIsNzMsMjI5LDAsMjMzLDY3LDE2NywyNTQsMTk1LDEsMjA4LDI1NSwxMzIsMTcsMjIxLDI1NSw1MSwyMTcsOTAsMCw2NywyMzUsNTAsMjU1LDIyMywyMTAsMTQzLDAsMTc5LDUzLDEzMCwxLDIzMywxMDYsMTk4LDAsMjE3LDE3MywyMjAsMjU1LDExMiwyMjksMjQsMjU1LDE3NSwxNTQsOTMsMjU0LDcxLDIwMywyNDYsMjU1LDQ4LDY2LDEzMywyNTUsMywxMzYsMjMwLDI1NSwyMywyMjEsMTEzLDI1NCwyMzUsMTExLDIxMywwLDE3MCwxMjAsOTUsMjU0LDI1MSwyMjEsMiwwLDQ1LDEzMCwxNTgsMjU0LDEwNSw5NCwyMTcsMjU1LDI0Miw1MiwxODAsMjU0LDIxMyw2OCw0NSwyNTUsMTA0LDM4LDI4LDAsMjQ0LDE1OCw3NiwwLDE2MSwyMDAsOTYsMjU1LDIwNyw1MywxMywyNTUsMTg3LDY3LDE0OCwwLDE3MCw1NCwyNDgsMCwxMTksMTYyLDE3OCwyNTUsODMsMjAsMTEsMCw0Miw0MiwxOTIsMSwxNDYsMTU5LDE2MywyNTUsMTgzLDIzMiwxMTEsMCw3NywyMjksMjEsMjU1LDcxLDUzLDE0MywwLDI3LDc2LDM0XSxcImk4XCIsQUxMT0NfTk9ORSxSdW50aW1lLkdMT0JBTF9CQVNFKTthbGxvY2F0ZShbMjQ2LDEzNiw0NywyNTUsMjE5LDM5LDE4MiwyNTUsOTIsMjI0LDIwMSwxLDE5LDE0MiwxNCwyNTUsNjksMTgyLDI0MSwyNTUsMTYzLDExOCwyNDUsMCw5LDEwOSwxMDYsMSwxNzAsMTgxLDI0NywyNTUsNzgsNDcsMjM4LDI1NSw4NCwyMTAsMTc2LDI1NSwyMTMsMTA3LDEzOSwwLDM5LDM4LDExLDAsNzIsMjEsMTUwLDAsNzIsMTMwLDY5LDAsMjA1LDc3LDE1NSwyNTQsMTQyLDEzMywyMSwwLDcxLDExMSwxNzIsMjU0LDIyNiw0Miw1OSwyNTUsMTc5LDAsMjE1LDEsMzMsMTI4LDI0MSwwLDIzNCwyNTIsMTMsMSwxODQsNzksOCwwLDExMCwzMCw3MywyNTUsMjQ2LDE0MSwxODksMCwxNzAsMjA3LDIxOCwxLDc0LDE1NCw2OSwyNTUsMTM4LDI0Niw0OSwyNTUsMTU1LDMyLDEwMCwwLDEyNSw3NCwxMDUsMjU1LDkwLDg1LDYxLDI1NSwzNSwyMjksMTc3LDI1NSw2MiwxMjUsMTkzLDI1NSwxNTMsODYsMTg4LDEsNzMsMTIwLDIxMiwwLDIwOSwxMjMsMjQ2LDI1NCwxMzUsMjA5LDM4LDI1NSwxNTEsNTgsNDQsMSw5Miw2OSwyMTQsMjU1LDE0LDEyLDg4LDI1NSwyNTIsMTUzLDE2NiwyNTUsMjUzLDIwNywxMTIsMjU1LDYwLDc4LDgzLDI1NSwyMjcsMTI0LDExMCwwLDE4MCw5NiwyNTIsMjU1LDUzLDExNywzMywyNTQsMTY0LDIyMCw4MiwyNTUsNDEsMSwyNywyNTUsMzgsMTY0LDE2NiwyNTUsMTY0LDk5LDE2OSwyNTQsNjEsMTQ0LDcwLDI1NSwxOTIsMTY2LDE4LDAsMTA3LDI1MCw2NiwwLDE5Nyw2NSw1MCwwLDEsMTc5LDE4LDI1NSwyNTUsMTA0LDEsMjU1LDQzLDE1MywzNSwyNTUsODAsMTExLDE2OCwwLDExMCwxNzUsMTY4LDAsNDEsMTA1LDQ1LDI1NSwyMTksMTQsMjA1LDI1NSwxNjQsMjMzLDE0MCwyNTQsNDMsMSwxMTgsMCwyMzMsNjcsMTk1LDAsMTc4LDgyLDE1OSwyNTUsMTM4LDg3LDEyMiwyNTUsMjEyLDIzOCw5MCwyNTUsMTQ0LDM1LDEyNCwyNTQsMjUsMTQwLDE2NCwwLDI1MSwyMTUsNDQsMjU0LDEzMyw3MCwxMDcsMjU1LDEwMSwyMjcsODAsMjU0LDkyLDE2OSw1NSwwLDIxNSw0Miw0OSwwLDExNCwxODAsODUsMjU1LDMzLDIzMiwyNywxLDE3MiwyMTMsMjUsMCw2MiwxNzYsMTIzLDI1NCwzMiwxMzMsMjQsMjU1LDIyNSwxOTEsNjIsMCw5Myw3MCwxNTMsMCwxODEsNDIsMTA0LDEsMjIsMTkxLDIyNCwyNTUsMjAwLDIwMCwxNDAsMjU1LDI0OSwyMzQsMzcsMCwxNDksNTcsMTQxLDAsMTk1LDU2LDIwOCwyNTUsMjU0LDEzMCw3MCwyNTUsMzIsMTczLDI0MCwyNTUsMjksMjIwLDE5OSwwLDExMCwxMDAsMTE1LDI1NSwxMzIsMjI5LDI0OSwwLDIyOCwyMzMsMjIzLDI1NSwzNywyMTYsMjA5LDI1NCwxNzgsMTc3LDIwOSwyNTUsMTgzLDQ1LDE2NSwyNTQsMjI0LDk3LDExNCwwLDEzNyw5NywxNjgsMjU1LDIyNSwyMjIsMTcyLDAsMTY1LDEzLDQ5LDEsMjEwLDIzNSwyMDQsMjU1LDI1Miw0LDI4LDI1NCw3MCwxNjAsMTUxLDAsMjMyLDE5MCw1MiwyNTQsODMsMjQ4LDkzLDI1NSw2MiwyMTUsNzcsMSwxNzUsMTc1LDE3OSwyNTUsMTYwLDUwLDY2LDAsMTIxLDQ4LDIwOCwwLDYzLDE2OSwyMDksMjU1LDAsMjEwLDIwMCwwLDIyNCwxODcsNDQsMSw3MywxNjIsODIsMCw5LDE3NiwxNDMsMjU1LDE5LDc2LDE5MywyNTUsMjksNTksMTY3LDEsMjQsNDMsMTU0LDAsMjgsMTkwLDE5MCwwLDE0MSwxODgsMTI5LDAsMjMyLDIzNSwyMDMsMjU1LDIzNCwwLDEwOSwyNTUsNTQsNjUsMTU5LDAsNjAsODgsMjMyLDI1NSwxMjEsMjUzLDE1MCwyNTQsMjUyLDIzMywxMzEsMjU1LDE5OCwxMTAsNDEsMSw4Myw3Nyw3MSwyNTUsMjAwLDIyLDU5LDI1NCwxMDYsMjUzLDI0MiwyNTUsMjEsMTIsMjA3LDI1NSwyMzcsNjYsMTg5LDAsOTAsMTk4LDIwMiwxLDIyNSwxNzIsMTI3LDAsNTMsMjIsMjAyLDAsNTYsMjMwLDEzMiwwLDEsODYsMTgzLDAsMTA5LDE5MCw0MiwwLDI0Myw2OCwxNzQsMSwxMDksMjI4LDE1NCwwLDIwMCwxNzcsMTIyLDEsMzUsMTYwLDE4MywyNTUsMTc3LDQ4LDg1LDI1NSw5MCwyMTgsMTY5LDI1NSwyNDgsMTUyLDc4LDAsMjAyLDI1NCwxMTAsMCw2LDUyLDQzLDAsMTQyLDk4LDY1LDI1NSw2MywxNDUsMjIsMCw3MCwxMDYsOTMsMCwyMzIsMTM4LDEwNywxLDExMCwxNzksNjEsMjU1LDIxMSwxMjksMjE4LDEsMjQyLDIwOSw5MiwwLDM1LDkwLDIxNywxLDE4MiwxNDMsMTA2LDI1NSwxMTYsMTAxLDIxNywyNTUsMTE0LDI1MCwyMjEsMjU1LDE3MywyMDQsNiwwLDYwLDE1MCwxNjMsMCw3MywxNzIsNDQsMjU1LDIzOSwxMTAsODAsMjU1LDIzNyw3NiwxNTMsMjU0LDE2MSwxNDAsMjQ5LDAsMTQ5LDIzMiwyMjksMCwxMzMsMzEsNDAsMjU1LDE3NCwxNjQsMTE5LDAsMTEzLDUxLDIxNCwwLDEyOSwyMjgsMiwyNTQsNjQsMzQsMjQzLDAsMTA3LDIyNywyNDQsMjU1LDE3NCwxMDYsMjAwLDI1NSw4NCwxNTMsNzAsMSw1MCwzNSwxNiwwLDI1MCw3NCwyMTYsMjU0LDIzNiwxODksNjYsMjU1LDE1MywyNDksMTMsMCwyMzAsMTc4LDQsMjU1LDIyMSw0MSwyMzgsMCwxMTgsMjI3LDEyMSwyNTUsOTQsODcsMTQwLDI1NCwyNTQsMTE5LDkyLDAsNzMsMjM5LDI0NiwyNTQsMTE3LDg3LDEyOCwwLDE5LDIxMSwxNDUsMjU1LDE3Nyw0NiwyNTIsMCwyMjksOTEsMjQ2LDEsNjksMTI4LDI0NywyNTUsMjAyLDc3LDU0LDEsOCwxMSw5LDI1NSwxNTMsOTYsMTY2LDAsMjE3LDIxNCwxNzMsMjU1LDEzNCwxOTIsMiwxLDAsMjA3LDAsMCwxODksMTc0LDEwNywxLDE0MCwxMzQsMTAwLDAsMTU4LDE5MywyNDMsMSwxODIsMTAyLDE3MSwwLDIzNSwxNTQsNTEsMCwxNDIsNSwxMjMsMjU1LDYwLDE2OCw4OSwxLDIxNywxNCw5MiwyNTUsMTksMjE0LDUsMSwyMTEsMTY3LDI1NCwwLDQ0LDYsMjAyLDI1NCwxMjAsMTgsMjM2LDI1NSwxNSwxMTMsMTg0LDI1NSwxODQsMjIzLDEzOSwwLDQwLDE3NywxMTksMjU0LDE4MiwxMjMsOTAsMjU1LDE3NiwxNjUsMTc2LDAsMjQ3LDc3LDE5NCwwLDI3LDIzNCwxMjAsMCwyMzEsMCwyMTQsMjU1LDU5LDM5LDMwLDAsMTI1LDk5LDE0NSwyNTUsMTUwLDY4LDY4LDEsMTQxLDIyMiwyNDgsMCwxNTMsMTIzLDIxMCwyNTUsMTEwLDEyNywxNTIsMjU1LDIyOSwzMywyMTQsMSwxMzUsMjIxLDE5NywwLDEzNyw5NywyLDAsMTIsMTQzLDIwNCwyNTUsODEsNDEsMTg4LDAsMTE1LDc5LDEzMCwyNTUsOTQsMywxMzIsMCwxNTIsMTc1LDE4NywyNTUsMTI0LDE0MSwxMCwyNTUsMTI2LDE5MiwxNzksMjU1LDExLDEwMywxOTgsMCwxNDksNiw0NSwwLDIxOSw4NSwxODcsMSwyMzAsMTgsMTc4LDI1NSw3MiwxODIsMTUyLDAsMywxOTgsMTg0LDI1NSwxMjgsMTEyLDIyNCwxLDk3LDE2MSwyMzAsMCwyNTQsOTksMzgsMjU1LDU4LDE1OSwxOTcsMCwxNTEsNjYsMjE5LDAsNTksNjksMTQzLDI1NSwxODUsMTEyLDI0OSwwLDExOSwxMzYsNDcsMjU1LDEyMywxMzAsMTMyLDAsMTY4LDcxLDk1LDI1NSwxMTMsMTc2LDQwLDEsMjMyLDE4NSwxNzMsMCwyMDcsOTMsMTE3LDEsNjgsMTU3LDEwOCwyNTUsMTAyLDUsMTQ3LDI1NCw0OSw5NywzMywwLDg5LDY1LDExMSwyNTQsMjQ3LDMwLDE2MywyNTUsMTI0LDIxNywyMjEsMSwxMDIsMjUwLDIxNiwwLDE5OCwxNzQsNzUsMjU0LDU3LDU1LDE4LDAsMjI3LDUsMjM2LDEsMjI5LDIxMywxNzMsMCwyMDEsMTA5LDIxOCwxLDQ5LDIzMywyMzksMCwzMCw1NSwxNTgsMSwyNSwxNzgsMTA2LDAsMTU1LDExMSwxODgsMSw5NCwxMjYsMTQwLDAsMjE1LDMxLDIzOCwxLDc3LDI0MCwxNiwwLDIxMywyNDIsMjUsMSwzOCw3MSwxNjgsMCwyMDUsMTg2LDkzLDI1NCw0OSwyMTEsMTQwLDI1NSwyMTksMCwxODAsMjU1LDEzNCwxMTgsMTY1LDAsMTYwLDE0NywxMzQsMjU1LDExMCwxODYsMzUsMjU1LDE5OCwyNDMsNDIsMCwyNDMsMTQ2LDExOSwwLDEzNCwyMzUsMTYzLDEsNCwyNDEsMTM1LDI1NSwxOTMsNDYsMTkzLDI1NCwxMDMsMTgwLDc5LDI1NSwyMjUsNCwxODQsMjU0LDI0MiwxMTgsMTMwLDAsMTQ2LDEzNSwxNzYsMSwyMzQsMTExLDMwLDAsNjksNjYsMjEzLDI1NCw0MSw5NiwxMjMsMCwxMjEsOTQsNDIsMjU1LDE3OCwxOTEsMTk1LDI1NSw0NiwxMzAsNDIsMCwxMTcsODQsOCwyNTUsMjMzLDQ5LDIxNCwyNTQsMjM4LDEyMiwxMDksMCw2LDcxLDg5LDEsMjM2LDIxMSwxMjMsMCwyNDQsMTMsNDgsMjU0LDExOSwxNDgsMTQsMCwxMTQsMjgsODYsMjU1LDc1LDIzNywyNSwyNTUsMTQ1LDIyOSwxNiwyNTQsMTI5LDEwMCw1MywyNTUsMTM0LDE1MCwxMjAsMjU0LDE2OCwxNTcsNTAsMCwyMyw3MiwxMDQsMjU1LDIyNCw0OSwxNCwwLDI1NSwxMjMsMjIsMjU1LDE1MSwxODUsMTUxLDI1NSwxNzAsODAsMTg0LDEsMTM0LDE4MiwyMCwwLDQxLDEwMCwxMDEsMSwxNTMsMzMsMTYsMCw3NiwxNTQsMTExLDEsODYsMjA2LDIzNCwyNTUsMTkyLDE2MCwxNjQsMjU0LDE2NSwxMjMsOTMsMjU1LDEsMjE2LDE2NCwyNTQsNjcsMTcsMTc1LDI1NSwxNjksMTEsNTksMjU1LDE1OCw0MSw2MSwyNTUsNzMsMTg4LDE0LDI1NSwxOTUsNiwxMzcsMjU1LDIyLDE0NywyOSwyNTUsMjAsMTAzLDMsMjU1LDI0NiwxMzAsMjI3LDI1NSwxMjIsNDAsMTI4LDAsMjI2LDQ3LDI0LDI1NCwzNSwzNiwzMiwwLDE1MiwxODYsMTgzLDI1NSw2OSwyMDIsMjAsMCwxOTUsMTMzLDE5NSwwLDIyMiw1MSwyNDcsMCwxNjksMTcxLDk0LDEsMTgzLDAsMTYwLDI1NSw2NCwyMDUsMTgsMSwxNTYsODMsMTUsMjU1LDE5Nyw1OCwyNDksMjU0LDI1MSw4OSwxMTAsMjU1LDUwLDEwLDg4LDI1NCw1MSw0MywyMTYsMCw5OCwyNDIsMTk4LDEsMjQ1LDE1MSwxMTMsMCwxNzEsMjM2LDE5NCwxLDE5NywzMSwxOTksMjU1LDIyOSw4MSwzOCwxLDQxLDU5LDIwLDAsMjUzLDEwNCwyMzAsMCwxNTIsOTMsMTQsMjU1LDI0NiwyNDIsMTQ2LDI1NCwyMTQsMTY5LDI0MCwyNTUsMjQwLDEwMiwxMDgsMjU0LDE2MCwxNjcsMjM2LDAsMTU0LDIxOCwxODgsMCwxNTAsMjMzLDIwMiwyNTUsMjcsMTksMjUwLDEsMiw3MSwxMzMsMjU1LDE3NSwxMiw2MywxLDE0NSwxODMsMTk4LDAsMTA0LDEyMCwxMTUsMjU1LDEzMCwyNTEsMjQ3LDAsMTcsMjEyLDE2NywyNTUsNjIsMTIzLDEzMiwyNTUsMjQ3LDEwMCwxODksMCwxNTUsMjIzLDE1MiwwLDE0MywxOTcsMzMsMCwxNTUsNTksNDQsMjU1LDE1MCw5MywyNDAsMSwxMjcsMyw4NywyNTUsOTUsNzEsMjA3LDEsMTY3LDg1LDEsMjU1LDE4OCwxNTIsMTE2LDI1NSwxMCwyMywyMywwLDEzNywxOTUsOTMsMSw1NCw5OCw5NywwLDI0MCwwLDE2OCwyNTUsMTQ4LDE4OCwxMjcsMCwxMzQsMTA3LDE1MSwwLDc2LDI1MywxNzEsMCw5MCwxMzIsMTkyLDAsMTQ2LDIyLDU0LDAsMjI0LDY2LDU0LDI1NCwyMzAsMTg2LDIyOSwyNTUsMzksMTgyLDE5NiwwLDE0OCwyNTEsMTMwLDI1NSw2NSwxMzEsMTA4LDI1NCwxMjgsMSwxNjAsMCwxNjksNDksMTY3LDI1NCwxOTksMjU0LDE0OCwyNTUsMjUxLDYsMTMxLDAsMTg3LDI1NCwxMjksMjU1LDg1LDgyLDYyLDAsMTc4LDIzLDU4LDI1NSwyNTQsMTMyLDUsMCwxNjQsMjEzLDM5LDAsMTM0LDI1MiwxNDYsMjU0LDM3LDUzLDgxLDI1NSwxNTUsMTM0LDgyLDAsMjA1LDE2NywyMzgsMjU1LDk0LDQ1LDE4MCwyNTUsMTMyLDQwLDE2MSwwLDI1NCwxMTEsMTEyLDEsNTQsNzUsMjE3LDAsMTc5LDIzMCwyMjEsMSwyMzUsOTQsMTkxLDI1NSwyMywyNDMsNDgsMSwyMDIsMTQ1LDIwMywyNTUsMzksMTE4LDQyLDI1NSwxMTcsMTQxLDI1MywwLDI1NCwwLDIyMiwwLDQzLDI1MSw1MCwwLDU0LDE2OSwyMzQsMSw4MCw2OCwyMDgsMCwxNDgsMjAzLDI0MywyNTQsMTQ1LDcsMTM1LDAsNiwyNTQsMCwwLDI1MiwxODUsMTI3LDAsOTgsOCwxMjksMjU1LDM4LDM1LDcyLDI1NSwyMTEsMzYsMjIwLDEsNDAsMjYsODksMCwxNjgsNjQsMTk3LDI1NCwzLDIyMiwyMzksMjU1LDIsODMsMjE1LDI1NCwxODAsMTU5LDEwNSwwLDU4LDExNSwxOTQsMCwxODYsMTE2LDEwNiwyNTUsMjI5LDI0NywyMTksMjU1LDEyOSwxMTgsMTkzLDAsMjAyLDE3NCwxODMsMSwxNjYsMTYxLDcyLDAsMjAxLDEwNywxNDcsMjU0LDIzNywxMzYsNzQsMCwyMzMsMjMwLDEwNiwxLDEwNSwxMTEsMTY4LDAsNjQsMjI0LDMwLDEsMSwyMjksMywwLDEwMiwxNTEsMTc1LDI1NSwxOTQsMjM4LDIyOCwyNTUsMjU0LDI1MCwyMTIsMCwxODcsMjM3LDEyMSwwLDY3LDI1MSw5NiwxLDE5NywzMCwxMSwwLDE4Myw5NSwyMDQsMCwyMDUsODksMTM4LDAsNjQsMjIxLDM3LDEsMjU1LDIyMywzMCwyNTUsMTc4LDQ4LDIxMSwyNTUsMjQxLDIwMCw5MCwyNTUsMTY3LDIwOSw5NiwyNTUsNTcsMTMwLDIyMSwwLDQ2LDExNCwyMDAsMjU1LDYxLDE4NCw2NiwwLDU1LDE4MiwyNCwyNTQsMTEwLDE4MiwzMywwLDE3MSwxOTAsMjMyLDI1NSwxMTQsOTQsMzEsMCwxOCwyMjEsOCwwLDQ3LDIzMSwyNTQsMCwyNTUsMTEyLDgzLDAsMTE4LDE1LDIxNSwyNTUsMTczLDI1LDQwLDI1NCwxOTIsMTkzLDMxLDI1NSwyMzgsMjEsMTQ2LDI1NSwxNzEsMTkzLDExOCwyNTUsMTAxLDIzNCw1MywyNTQsMTMxLDIxMiwxMTIsMCw4OSwxOTIsMTA3LDEsOCwyMDgsMjcsMCwxODEsMjE3LDE1LDI1NSwyMzEsMTQ5LDIzMiwwLDE0MCwyMzYsMTI2LDAsMTQ0LDksMTk5LDI1NSwxMiw3OSwxODEsMjU0LDE0NywxODIsMjAyLDI1NSwxOSwxMDksMTgyLDI1NSw0OSwyMTIsMjI1LDAsNzQsMTYzLDIwMywwLDE3NSwyMzMsMTQ4LDAsMjYsMTEyLDUxLDAsMTkzLDE5Myw5LDI1NSwxNSwxMzUsMjQ5LDAsMTUwLDIyNywxMzAsMCwyMDQsMCwyMTksMSwyNCwyNDIsMjA1LDAsMjM4LDIwOCwxMTcsMjU1LDIyLDI0NCwxMTIsMCwyNiwyMjksMzQsMCwzNyw4MCwxODgsMjU1LDM4LDQ1LDIwNiwyNTQsMjQwLDkwLDIyNSwyNTUsMjksMyw0NywyNTUsNDIsMjI0LDc2LDAsMTg2LDI0MywxNjcsMCwzMiwxMzIsMTUsMjU1LDUsNTEsMTI1LDAsMTM5LDEzNSwyNCwwLDYsMjQxLDIxOSwwLDE3MiwyMjksMTMzLDI1NSwyNDYsMjE0LDUwLDAsMjMxLDExLDIwNywyNTUsMTkxLDEyNiw4MywxLDE4MCwxNjMsMTcwLDI1NSwyNDUsNTYsMjQsMSwxNzgsMTY0LDIxMSwyNTUsMywxNiwyMDIsMSw5OCw1NywxMTgsMjU1LDE0MSwxMzEsODksMjU0LDMzLDUxLDI0LDAsMjQzLDE0OSw5MSwyNTUsMjUzLDUyLDE0LDAsMzUsMTY5LDY3LDI1NCw0OSwzMCw4OCwyNTUsMTc5LDI3LDM2LDI1NSwxNjUsMTQwLDE4MywwLDU4LDE4OSwxNTEsMCw4OCwzMSwwLDAsNzUsMTY5LDY2LDAsNjYsMTAxLDE5OSwyNTUsMjQsMjE2LDE5OSwxLDEyMSwxOTYsMjYsMjU1LDE0LDc5LDIwMywyNTQsMjQwLDIyNiw4MSwyNTUsOTQsMjgsMTAsMjU1LDgzLDE5MywyNDAsMjU1LDIwNCwxOTMsMTMxLDI1NSw5NCwxNSw4NiwwLDIxOCw0MCwxNTcsMCw1MSwxOTMsMjA5LDAsMCwyNDIsMTc3LDAsMTAyLDE4NSwyNDcsMCwxNTgsMTA5LDExNiwwLDM4LDEzNSw5MSwwLDIyMywxNzUsMTQ5LDAsMjIwLDY2LDEsMjU1LDg2LDYwLDIzMiwwLDI1LDk2LDM3LDI1NSwyMjUsMTIyLDE2MiwxLDIxNSwxODcsMTY4LDI1NSwxNTgsMTU3LDQ2LDAsNTYsMTcxLDE2MiwwLDIzMiwyNDAsMTAxLDEsMTIyLDIyLDksMCw1MSw5LDIxLDI1NSw1MywyNSwyMzgsMjU1LDIxNywzMCwyMzIsMjU0LDEyNSwxNjksMTQ4LDAsMTMsMjMyLDEwMiwwLDE0OCw5LDM3LDAsMTY1LDk3LDE0MSwxLDIyOCwxMzEsNDEsMCwyMjIsMTUsMjQzLDI1NSwyNTQsMTgsMTcsMCw2LDYwLDIzNywxLDEwNiwzLDExMywwLDU5LDEzMiwxODksMCw5MiwxMTIsMzAsMCwxMDUsMjA4LDIxMywwLDQ4LDg0LDE3OSwyNTUsMTg3LDEyMSwyMzEsMjU0LDI3LDIxNiwxMDksMjU1LDE2MiwyMjEsMTA3LDI1NCw3MywyMzksMTk1LDI1NSwyNTAsMzEsNTcsMjU1LDE0OSwxMzUsODksMjU1LDE4NSwyMywxMTUsMSwzLDE2MywxNTcsMjU1LDE4LDExMiwyNTAsMCwyNSw1NywxODcsMjU1LDE2MSw5NiwxNjQsMCw0NywxNiwyNDMsMCwxMiwxNDEsMjUxLDI1NCw2NywyMzQsMTg0LDI1NSw0MSwxOCwxNjEsMCwxNzUsNiw5NiwyNTUsMTYwLDE3Miw1MiwyNTQsMjQsMTc2LDE4MywyNTUsMTk4LDE5Myw4NSwxLDEyNCwxMjEsMTM3LDI1NSwxNTEsNTAsMTE0LDI1NSwyMjAsMjAzLDYwLDI1NSwyMDcsMjM5LDUsMSwwLDM4LDEwNywyNTUsNTUsMjM4LDk0LDI1NCw3MCwxNTIsOTQsMCwyMTMsMjIwLDc3LDEsMTIwLDE3LDY5LDI1NSw4NSwxNjQsMTkwLDI1NSwyMDMsMjM0LDgxLDAsMzgsNDksMzcsMjU0LDYxLDE0NCwxMjQsMCwxMzcsNzgsNDksMjU0LDE2OCwyNDcsNDgsMCw5NSwxNjQsMjUyLDAsMTA1LDE2OSwxMzUsMCwyNTMsMjI4LDEzNCwwLDY0LDE2Niw3NSwwLDgxLDczLDIwLDI1NSwyMDcsMjEwLDEwLDAsMjM0LDEwNiwxNTAsMjU1LDk0LDM0LDkwLDI1NSwyNTQsMTU5LDU3LDI1NCwyMjAsMTMzLDk5LDAsMTM5LDE0NywxODAsMjU0LDI0LDIzLDE4NSwwLDQxLDU3LDMwLDI1NSwxODksOTcsNzYsMCw2NSwxODcsMjIzLDI1NSwyMjQsMTcyLDM3LDI1NSwzNCw2Miw5NSwxLDIzMSwxNDQsMjQwLDAsNzcsMTA2LDEyNiwyNTQsNjQsMTUyLDkxLDAsMjksOTgsMTU1LDAsMjI2LDI1MSw1MywyNTUsMjM0LDIxMSw1LDI1NSwxNDQsMjAzLDIyMiwyNTUsMTY0LDE3NiwyMjEsMjU0LDUsMjMxLDI0LDAsMTc5LDEyMiwyMDUsMCwzNiwxLDEzNCwyNTUsMTI1LDcwLDE1MSwyNTQsOTcsMjI4LDI1MiwwLDE3MiwxMjksMjMsMjU0LDQ4LDkwLDIwOSwyNTUsMTUwLDIyNCw4MiwxLDg0LDEzNCwzMCwwLDI0MSwxOTYsNDYsMCwxMDMsMTEzLDIzNCwyNTUsNDYsMTAxLDEyMSwyNTQsNDAsMTI0LDI1MCwyNTUsMTM1LDQ1LDI0MiwyNTQsOSwyNDksMTY4LDI1NSwxNDAsMTA4LDEzMSwyNTUsMTQzLDE2MywxNzEsMCw1MCwxNzMsMTk5LDI1NSw4OCwyMjIsMTQyLDI1NSwyMDAsOTUsMTU4LDAsMTQyLDE5MiwxNjMsMjU1LDcsMTE3LDEzNSwwLDExMSwxMjQsMjIsMCwyMzYsMTIsNjUsMjU0LDY4LDM4LDY1LDI1NSwyMjcsMTc0LDI1NCwwLDI0NCwyNDUsMzgsMCwyNDAsNTAsMjA4LDI1NSwxNjEsNjMsMjUwLDAsNjAsMjA5LDIzOSwwLDEyMiwzNSwxOSwwLDE0LDMzLDIzMCwyNTQsMiwxNTksMTEzLDAsMTA2LDIwLDEyNywyNTUsMjI4LDIwNSw5NiwwLDEzNywyMTAsMTc0LDI1NCwxODAsMjEyLDE0NCwyNTUsODksOTgsMTU0LDEsMzQsODgsMTM5LDAsMTY3LDE2MiwxMTIsMSw2NSwxMTAsMTk3LDAsMjQxLDM3LDE2OSwwLDY2LDU2LDEzMSwyNTUsMTAsMjAxLDgzLDI1NCwxMzMsMjUzLDE4NywyNTUsMTc3LDExMiw0NSwyNTQsMTk2LDI1MSwwLDAsMTk2LDI1MCwxNTEsMjU1LDIzOCwyMzIsMjE0LDI1NSwxNTAsMjA5LDIwNSwwLDI4LDI0MCwxMTgsMCw3MSw3Niw4MywxLDIzNiw5OSw5MSwwLDQyLDI1MCwxMzEsMSw5NiwxOCw2NCwyNTUsMTE4LDIyMiwzNSwwLDExMywyMTQsMjAzLDI1NSwxMjIsMTE5LDE4NCwyNTUsNjYsMTksMzYsMCwyMDQsNjQsMjQ5LDAsMTQ2LDg5LDEzOSwwLDEzNCw2MiwxMzUsMSwxMDQsMjMzLDEwMSwwLDE4OCw4NCwyNiwwLDQ5LDI0OSwxMjksMCwyMDgsMjE0LDc1LDI1NSwyMDcsMTMwLDc3LDI1NSwxMTUsMTc1LDIzNSwwLDE3MSwyLDEzNywyNTUsMTc1LDE0NSwxODYsMSw1NSwyNDUsMTM1LDI1NSwxNTQsODYsMTgxLDEsMTAwLDU4LDI0NiwyNTUsMTA5LDE5OSw2MCwyNTUsODIsMjA0LDEzNCwyNTUsMjE1LDQ5LDIzMCwxLDE0MCwyMjksMTkyLDI1NSwyMjIsMTkzLDI1MSwyNTUsODEsMTM2LDE1LDI1NSwxNzksMTQ5LDE2MiwyNTUsMjMsMzksMjksMjU1LDcsOTUsNzUsMjU0LDE5MSw4MSwyMjIsMCwyNDEsODEsOTAsMjU1LDEwNyw0OSwyMDEsMjU1LDI0NCwyMTEsMTU3LDAsMjIyLDE0MCwxNDksMjU1LDY1LDIxOSw1NiwyNTQsMTg5LDI0Niw5MCwyNTUsMTc4LDU5LDE1NywxLDQ4LDIxOSw1MiwwLDk4LDM0LDIxNSwwLDI4LDE3LDE4NywyNTUsMTc1LDE2OSwyNCwwLDkyLDc5LDE2MSwyNTUsMjM2LDIwMCwxOTQsMSwxNDcsMTQzLDIzNCwwLDIyOSwyMjUsNywxLDE5NywxNjgsMTQsMCwyMzUsNTEsNTMsMSwyNTMsMTIwLDE3NCwwLDE5Nyw2LDE2OCwyNTUsMjAyLDExNywxNzEsMCwxNjMsMjEsMjA2LDAsMTE0LDg1LDkwLDI1NSwxNSw0MSwxMCwyNTUsMTk0LDE5LDk5LDAsNjUsNTUsMjE2LDI1NCwxNjIsMTQ2LDExNiwwLDUwLDIwNiwyMTIsMjU1LDY0LDE0NiwyOSwyNTUsMTU4LDE1OCwxMzEsMSwxMDAsMTY1LDEzMCwyNTUsMTcyLDIzLDEyOSwyNTUsMTI1LDUzLDksMjU1LDE1LDE5MywxOCwxLDI2LDQ5LDExLDI1NSwxODEsMTc0LDIwMSwxLDEzNSwyMDEsMTQsMjU1LDEwMCwxOSwxNDksMCwyMTksOTgsNzksMCw0Miw5OSwxNDMsMjU0LDk2LDAsNDgsMjU1LDE5NywyNDksODMsMjU0LDEwNCwxNDksNzksMjU1LDIzNSwxMTAsMTM2LDI1NCw4MiwxMjgsNDQsMjU1LDY1LDQxLDM2LDI1NCw4OCwyMTEsMTAsMCwxODcsMTIxLDE4NywwLDk4LDEzNCwxOTksMCwxNzEsMTg4LDE3OSwyNTQsMjEwLDExLDIzOCwyNTUsNjYsMTIzLDEzMCwyNTQsNTIsMjM0LDYxLDAsNDgsMTEzLDIzLDI1NCw2LDg2LDEyMCwyNTUsMTE5LDE3OCwyNDUsMCw4NywxMjksMjAxLDAsMjQyLDE0MSwyMDksMCwyMDIsMTE0LDg1LDAsMTQ4LDIyLDE2MSwwLDEwMywxOTUsNDgsMCwyNSw0OSwxNzEsMjU1LDEzOCw2NywxMzAsMCwxODIsNzMsMTIyLDI1NCwxNDgsMjQsMTMwLDAsMjExLDIyOSwxNTQsMCwzMiwxNTUsMTU4LDAsODQsMTA1LDYxLDAsMTc3LDE5NCw5LDI1NSwxNjYsODksODYsMSw1NCw4MywxODcsMCwyNDksNDAsMTE3LDI1NSwxMDksMywyMTUsMjU1LDUzLDE0Niw0NCwxLDYzLDQ3LDE3OSwwLDE5NCwyMTYsMywyNTQsMTQsODQsMTM2LDAsMTM2LDE3NywxMywyNTUsNzIsMjQzLDE4NiwyNTUsMTE3LDE3LDEyNSwyNTUsMjExLDU4LDIxMSwyNTUsOTMsNzksMjIzLDAsOTAsODgsMjQ1LDI1NSwxMzksMjA5LDExMSwyNTUsNzAsMjIyLDQ3LDAsMTAsMjQ2LDc5LDI1NSwxOTgsMjE3LDE3OCwwLDIyNywyMjUsMTEsMSw3OCwxMjYsMTc5LDI1NSw2Miw0MywxMjYsMCwxMDMsMTQ4LDM1LDAsMTI5LDgsMTY1LDI1NCwyNDUsMjQwLDE0OCwwLDYxLDUxLDE0MiwwLDgxLDIwOCwxMzQsMCwxNSwxMzcsMTE1LDI1NSwyMTEsMTE5LDIzNiwyNTUsMTU5LDI0NSwyNDgsMjU1LDIsMTM0LDEzNiwyNTUsMjMwLDEzOSw1OCwxLDE2MCwxNjQsMjU0LDAsMTE0LDg1LDE0MSwyNTUsNDksMTY2LDE4MiwyNTUsMTQ0LDcwLDg0LDEsODUsMTgyLDcsMCw0Niw1Myw5MywwLDksMTY2LDE2MSwyNTUsNTUsMTYyLDE3OCwyNTUsNDUsMTg0LDE4OCwwLDE0NiwyOCw0NCwyNTQsMTY5LDkwLDQ5LDAsMTIwLDE3OCwyNDEsMSwxNCwxMjMsMTI3LDI1NSw3LDI0MSwxOTksMSwxODksNjYsNTAsMjU1LDE5OCwxNDMsMTAxLDI1NCwxODksMjQzLDEzNSwyNTUsMTQxLDI0LDI0LDI1NCw3NSw5Nyw4NywwLDExOCwyNTEsMTU0LDEsMjM3LDU0LDE1NiwwLDE3MSwxNDYsMjA3LDI1NSwxMzEsMTk2LDI0NiwyNTUsMTM2LDY0LDExMywxLDE1MSwyMzIsNTcsMCwyNDAsMjE4LDExNSwwLDQ5LDYxLDI3LDI1NSw2NCwxMjksNzMsMSwyNTIsMTY5LDI3LDI1NSw0MCwxMzIsMTAsMSw5MCwyMDEsMTkzLDI1NSwyNTIsMTIxLDI0MCwxLDE4NiwyMDYsNDEsMCw0MywxOTgsOTcsMCwxNDUsMTAwLDE4MywwLDIwNCwyMTYsODAsMjU0LDE3MiwxNTAsNjUsMCwyNDksMjI5LDE5NiwyNTQsMTA0LDEyMyw3MywyNTUsNzcsMTA0LDk2LDI1NCwxMzAsMTgwLDgsMCwxMDQsMTIzLDU3LDAsMjIwLDIwMiwyMjksMjU1LDEwMiwyNDksMjExLDAsODYsMTQsMjMyLDI1NSwxODIsNzgsMjA5LDAsMjM5LDIyNSwxNjQsMCwxMDYsMTMsMzIsMjU1LDEyMCw3MywxNywyNTUsMTM0LDY3LDIzMywwLDgzLDI1NCwxODEsMCwxODMsMjM2LDExMiwxLDQ4LDY0LDEzMSwyNTUsMjQxLDIxNiwyNDMsMjU1LDY1LDE5MywyMjYsMCwyMDYsMjQxLDEwMCwyNTQsMTAwLDEzNCwxNjYsMjU1LDIzNywyMDIsMTk3LDAsNTUsMTMsODEsMCwzMiwxMjQsMTAyLDI1NSw0MCwyMjgsMTc3LDAsMTE4LDE4MSwzMSwxLDIzMSwxNjAsMTM0LDI1NSwxMTksMTg3LDIwMiwwLDAsMTQyLDYwLDI1NSwxMjgsMzgsMTg5LDI1NSwxNjYsMjAxLDE1MCwwLDIwNywxMjAsMjYsMSw1NCwxODQsMTcyLDAsMTIsMjQyLDIwNCwyNTQsMTMzLDY2LDIzMCwwLDM0LDM4LDMxLDEsMTg0LDExMiw4MCwwLDMyLDUxLDE2NSwyNTQsMTkxLDI0Myw1NSwwLDU4LDczLDE0NiwyNTQsMTU1LDE2NywyMDUsMjU1LDEwMCwxMDQsMTUyLDI1NSwxOTcsMjU0LDIwNywyNTUsMTczLDE5LDI0NywwLDIzOCwxMCwyMDIsMCwyMzksMTUxLDI0MiwwLDk0LDU5LDM5LDI1NSwyNDAsMjksMTAyLDI1NSwxMCw5MiwxNTQsMjU1LDIyOSw4NCwyMTksMjU1LDE2MSwxMjksODAsMCwyMDgsOTAsMjA0LDEsMjQwLDIxOSwxNzQsMjU1LDE1OCwxMDIsMTQ1LDEsNTMsMTc4LDc2LDI1NSw1MiwxMDgsMTY4LDEsODMsMjIyLDEwNywwLDIxMSwzNiwxMDksMCwxMTgsNTgsNTYsMCw4LDI5LDIyLDAsMjM3LDE2MCwxOTksMCwxNzAsMjA5LDE1NywwLDEzNyw3MSw0NywwLDE0Myw4NiwzMiwwLDE5OCwyNDIsMiwwLDIxMiw0OCwxMzYsMSw5MiwxNzIsMTg2LDAsMjMwLDE1MSwxMDUsMSw5NiwxOTEsMjI5LDAsMTM4LDgwLDE5MSwyNTQsMjQwLDIxNiwxMzAsMjU1LDk4LDQzLDYsMjU0LDE2OCwxOTYsNDksMCwyNTMsMTgsOTEsMSwxNDQsNzMsMTIxLDAsNjEsMTQ2LDM5LDEsNjMsMTA0LDI0LDI1NSwxODQsMTY1LDExMiwyNTQsMTI2LDIzNSw5OCwwLDgwLDIxMyw5OCwyNTUsMTIzLDYwLDg3LDI1NSw4MiwxNDAsMjQ1LDEsMjIzLDEyMCwxNzMsMjU1LDE1LDE5OCwxMzQsMSwyMDYsNjAsMjM5LDAsMjMxLDIzNCw5MiwyNTUsMzMsMjM4LDE5LDI1NSwxNjUsMTEzLDE0MiwxLDE3NiwxMTksMzgsMCwxNjAsNDMsMTY2LDI1NCwyMzksOTEsMTA1LDAsMTA3LDYxLDE5NCwxLDI1LDQsNjgsMCwxNSwxMzksNTEsMCwxNjQsMTMyLDEwNiwyNTUsMzQsMTE2LDQ2LDI1NCwxNjgsOTUsMTk3LDAsMTM3LDIxMiwyMywwLDcyLDE1Niw1OCwwLDEzNywxMTIsNjksMjU0LDE1MCwxMDUsMTU0LDI1NSwyMzYsMjAxLDE1NywwLDIzLDIxMiwxNTQsMjU1LDEzNiw4MiwyMjcsMjU0LDIyNiw1OSwyMjEsMjU1LDk1LDE0OSwxOTIsMCw4MSwxMTgsNTIsMjU1LDMzLDQzLDIxNSwxLDE0LDE0Nyw3NSwyNTUsODksMTU2LDEyMSwyNTQsMTQsMTgsNzksMCwxNDcsMjA4LDEzOSwxLDE1MSwyMTgsNjIsMjU1LDE1Niw4OCw4LDEsMjEwLDE4NCw5OCwyNTUsMjAsMTc1LDEyMywyNTUsMTAyLDgzLDIyOSwwLDIyMCw2NSwxMTYsMSwxNTAsMjUwLDQsMjU1LDkyLDE0MiwyMjAsMjU1LDM0LDI0Nyw2NiwyNTUsMjA0LDIyNSwxNzksMjU0LDE1MSw4MSwxNTEsMCw3MSw0MCwyMzYsMjU1LDEzOCw2Myw2MiwwLDYsNzksMjQwLDI1NSwxODMsMTg1LDE4MSwwLDExOCw1MCwyNywwLDYzLDIyNywxOTIsMCwxMjMsOTksNTgsMSw1MCwyMjQsMTU1LDI1NSwxNywyMjUsMjIzLDI1NCwyMjAsMjI0LDc3LDI1NSwxNCw0NCwxMjMsMSwxNDEsMTI4LDE3NSwwLDI0OCwyMTIsMjAwLDAsMTUwLDU5LDE4MywyNTUsMTQ3LDk3LDI5LDAsMTUwLDIwNCwxODEsMCwyNTMsMzcsNzEsMCwxNDUsODUsMTE5LDAsMTU0LDIwMCwxODYsMCwyLDEyOCwyNDksMjU1LDgzLDI0LDEyNCwwLDE0LDg3LDE0MywwLDE2OCw1MSwyNDUsMSwxMjQsMTUxLDIzMSwyNTUsMjA4LDI0MCwxOTcsMSwxMjQsMTkwLDE4NSwwLDQ4LDU4LDI0NiwwLDIwLDIzMywyMzIsMCwxMjUsMTgsOTgsMjU1LDEzLDI1NCwzMSwyNTUsMjQ1LDE3NywxMzAsMjU1LDEwOCwxNDIsMzUsMCwxNzEsMTI1LDI0MiwyNTQsMTQwLDEyLDM0LDI1NSwxNjUsMTYxLDE2MiwwLDIwNiwyMDUsMTAxLDAsMjQ3LDI1LDM0LDEsMTAwLDE0NSw1NywwLDM5LDcwLDU3LDAsMTE4LDIwNCwyMDMsMjU1LDI0MiwwLDE2MiwwLDE2NSwyNDQsMzAsMCwxOTgsMTE2LDIyNiwwLDEyOCwxMTEsMTUzLDI1NSwxNDAsNTQsMTgyLDEsNjAsMTIyLDE1LDI1NSwxNTUsNTgsNTcsMSw1NCw1MCwxOTgsMCwxNzEsMjExLDI5LDI1NSwxMDcsMTM4LDE2NywyNTUsMTczLDEwNywxOTksMjU1LDEwOSwxNjEsMTkzLDAsODksNzIsMjQyLDI1NSwyMDYsMTE1LDg5LDI1NSwyNTAsMjU0LDE0MiwyNTQsMTc3LDIwMiw5NCwyNTUsODEsODksNTAsMCw3LDEwNSw2NiwyNTUsMjUsMjU0LDI1NSwyNTQsMjAzLDY0LDIzLDI1NSw3OSwyMjIsMTA4LDI1NSwzOSwyNDksNzUsMCwyNDEsMTI0LDUwLDAsMjM5LDE1MiwxMzMsMCwyMjEsMjQxLDEwNSwwLDE0NywxNTEsOTgsMCwyMTMsMTYxLDEyMSwyNTQsMjQyLDQ5LDEzNywwLDIzMywzNywyNDksMjU0LDQyLDE4MywyNywwLDE4NCwxMTksMjMwLDI1NSwyMTcsMzIsMTYzLDI1NSwyMDgsMjUxLDIyOCwxLDEzNyw2MiwxMzEsMjU1LDc5LDY0LDksMjU0LDk0LDQ4LDExMywwLDE3LDEzOCw1MCwyNTQsMTkzLDI1NSwyMiwwLDI0NywxOCwxOTcsMSw2Nyw1NSwxMDQsMCwxNiwyMDUsOTUsMjU1LDQ4LDM3LDY2LDAsNTUsMTU2LDYzLDEsNjQsODIsNzQsMjU1LDIwMCw1Myw3MSwyNTQsMjM5LDY3LDEyNSwwLDI2LDIyNCwyMjIsMCwyMjMsMTM3LDkzLDI1NSwzMCwyMjQsMjAyLDI1NSw5LDIyMCwxMzIsMCwxOTgsMzgsMjM1LDEsMTAyLDE0MSw4NiwwLDYwLDQzLDgxLDEsMTM2LDI4LDI2LDAsMjMzLDM2LDgsMjU0LDIwNywyNDIsMTQ4LDAsMTY0LDE2Miw2MywwLDUxLDQ2LDIyNCwyNTUsMTE0LDQ4LDc5LDI1NSw5LDE3NSwyMjYsMCwyMjIsMywxOTMsMjU1LDQ3LDE2MCwyMzIsMjU1LDI1NSw5MywxMDUsMjU0LDE0LDQyLDIzMCwwLDI2LDEzOCw4MiwxLDIwOCw0MywyNDQsMCwyNywzOSwzOCwyNTUsOTgsMjA4LDEyNywyNTUsNjQsMTQ5LDE4MiwyNTUsNSwyNTAsMjA5LDAsMTg3LDYwLDI4LDI1NCw0OSwyNSwyMTgsMjU1LDE2OSwxMTYsMjA1LDI1NSwxMTksMTgsMTIwLDAsMTU2LDExNiwxNDcsMjU1LDEzMiw1MywxMDksMjU1LDEzLDEwLDIwMiwwLDExMCw4MywxNjcsMCwxNTcsMjE5LDEzNywyNTUsNiwzLDEzMCwyNTUsNTAsMTY3LDMwLDI1NSw2MCwxNTksNDcsMjU1LDEyOSwxMjgsMTU3LDI1NCw5NCwzLDE4OSwwLDMsMTY2LDY4LDAsODMsMjIzLDIxNSwwLDE1MCw5MCwxOTQsMSwxNSwxNjgsNjUsMCwyMjcsODMsNTEsMjU1LDIwNSwxNzEsNjYsMjU1LDU0LDE4Nyw2MCwxLDE1MiwxMDIsNDUsMjU1LDExOSwxNTQsMjI1LDAsMjQwLDI0NywxMzYsMCwxMDAsMTk3LDE3OCwyNTUsMTM5LDcxLDIyMywyNTUsMjA0LDgyLDE2LDEsNDEsMjA2LDQyLDI1NSwxNTYsMTkyLDIyMSwyNTUsMjE2LDEyMywyNDQsMjU1LDIxOCwyMTgsMTg1LDI1NSwxODcsMTg2LDIzOSwyNTUsMjUyLDE3MiwxNjAsMjU1LDE5NSw1MiwyMiwwLDE0NCwxNzQsMTgxLDI1NCwxODcsMTAwLDExNSwyNTUsMjExLDc4LDE3NiwyNTUsMjcsNywxOTMsMCwxNDcsMjEzLDEwNCwyNTUsOTAsMjAxLDEwLDI1NSw4MCwxMjMsNjYsMSwyMiwzMywxODYsMCwxLDcsOTksMjU0LDMwLDIwNiwxMCwwLDIyOSwyMzQsNSwwLDUzLDMwLDIxMCwwLDEzOCw4LDIyMCwyNTQsNzEsNTUsMTY3LDAsNzIsMjI1LDg2LDEsMTE4LDE5MCwxODgsMCwyNTQsMTkzLDEwMSwxLDE3MSwyNDksMTcyLDI1NSw5NCwxNTgsMTgzLDI1NCw5MywyLDEwOCwyNTUsMTc2LDkzLDc2LDI1NSw3Myw5OSw3OSwyNTUsNzQsNjQsMTI5LDI1NCwyNDYsNDYsNjUsMCw5OSwyNDEsMTI3LDI1NCwyNDYsMTUxLDEwMiwyNTUsNDQsNTMsMjA4LDI1NCw1OSwxMDIsMjM0LDAsMTU0LDE3NSwxNjQsMjU1LDg4LDI0MiwzMiwwLDExMSwzOCwxLDAsMjU1LDE4MiwxOTAsMjU1LDExNSwxNzYsMTUsMjU0LDE2OSw2MCwxMjksMCwxMjIsMjM3LDI0MSwwLDkwLDc2LDYzLDAsNjIsNzQsMTIwLDI1NSwxMjIsMTk1LDExMCwwLDExOSw0LDE3OCwwLDIyMiwyNDIsMjEwLDAsMTMwLDMzLDQ2LDI1NCwxNTYsNDAsNDEsMCwxNjcsMTQ2LDExMiwxLDQ5LDE2MywxMTEsMjU1LDEyMSwxNzYsMjM1LDAsNzYsMjA3LDE0LDI1NSwzLDI1LDE5OCwxLDQxLDIzNSwyMTMsMCw4NSwzNiwyMTQsMSw0OSw5MiwxMDksMjU1LDIwMCwyNCwzMCwyNTQsMTY4LDIzNiwxOTUsMCwxNDUsMzksMTI0LDEsMjM2LDE5NSwxNDksMCw5MCwzNiwxODQsMjU1LDY3LDg1LDE3MCwyNTUsMzgsMzUsMjYsMjU0LDEzMSwxMjQsNjgsMjU1LDIzOSwxNTUsMzUsMjU1LDU0LDIwMSwxNjQsMCwxOTYsMjIsMTE3LDI1NSw0OSwxNSwyMDUsMCwyNCwyMjQsMjksMSwxMjYsMTEzLDE0NCwwLDExNywyMSwxODIsMCwyMDMsMTU5LDE0MSwwLDIyMywxMzUsNzcsMCwxNzYsMjMwLDE3NiwyNTUsMTkwLDIyOSwyMTUsMjU1LDk5LDM3LDE4MSwyNTUsNTEsMjEsMTM4LDI1NSwyNSwxODksODksMjU1LDQ5LDQ4LDE2NSwyNTQsMTUyLDQ1LDI0NywwLDE3MCwxMDgsMjIyLDAsODAsMjAyLDUsMCwyNyw2OSwxMDMsMjU0LDIwNCwyMiwxMjksMjU1LDE4MCwyNTIsNjIsMjU0LDIxMCwxLDkxLDI1NSwxNDYsMTEwLDI1NCwyNTUsMjE5LDE2MiwyOCwwLDIyMywyNTIsMjEzLDEsNTksOCwzMywwLDIwNiwxNiwyNDQsMCwxMjksMjExLDQ4LDAsMTA3LDE2MCwyMDgsMCwxMTIsNTksMjA5LDAsMTA5LDc3LDIxNiwyNTQsMzQsMjEsMTg1LDI1NSwyNDYsOTksNTYsMjU1LDE3OSwxMzksMTksMjU1LDE4NSwyOSw1MCwyNTUsODQsODksMTksMCw3NCwyNTAsOTgsMjU1LDIyNSw0MiwyMDAsMjU1LDE5MiwyMTcsMjA1LDI1NSwyMTAsMTYsMTY3LDAsOTksMTMyLDk1LDEsNDMsMjMwLDU3LDAsMjU0LDExLDIwMywyNTUsOTksMTg4LDYzLDI1NSwxMTksMTkzLDI1MSwyNTQsODAsMTA1LDU0LDAsMjMyLDE4MSwxODksMSwxODMsNjksMTEyLDI1NSwyMDgsMTcxLDE2NSwyNTUsNDcsMTA5LDE4MCwyNTUsMTIzLDgzLDE2NSwwLDE0NiwxNjIsNTIsMjU1LDE1NCwxMSw0LDI1NSwxNTEsMjI3LDkwLDI1NSwxNDYsMTM3LDk3LDI1NCw2MSwyMzMsNDEsMjU1LDk0LDQyLDU1LDI1NSwxMDgsMTY0LDIzNiwwLDE1Miw2OCwyNTQsMCwxMCwxNDAsMTMxLDI1NSwxMCwxMDYsNzksMjU0LDI0MywxNTgsMTM3LDAsNjcsMTc4LDY2LDI1NCwxNzcsMTIzLDE5OCwyNTUsMTUsNjIsMzQsMCwxOTcsODgsNDIsMjU1LDE0OSw5NSwxNzcsMjU1LDE1MiwwLDE5OCwyNTUsMTQ5LDI1NCwxMTMsMjU1LDIyNSw5MCwxNjMsMjU1LDEyNSwyMTcsMjQ3LDAsMTgsMTcsMjI0LDAsMTI4LDY2LDEyMCwyNTQsMTkyLDI1LDksMjU1LDUwLDIyMSwyMDUsMCw0OSwyMTIsNzAsMCwyMzMsMjU1LDE2NCwwLDIsMjA5LDksMCwyMjEsNTIsMjE5LDI1NCwxNzIsMjI0LDI0NCwyNTUsOTQsNTYsMjA2LDEsMjQyLDE3OSwyLDI1NSwzMSw5MSwxNjQsMSwyMzAsNDYsMTM4LDI1NSwxODksMjMwLDIyMCwwLDU3LDQ3LDYxLDI1NSwxMTEsMTEsMTU3LDAsMTc3LDkxLDE1MiwwLDI4LDIzMCw5OCwwLDk3LDg3LDEyNiwwLDE5OCw4OSwxNDUsMjU1LDE2Nyw3OSwxMDcsMCwyNDksNzcsMTYwLDEsMjksMjMzLDIzMCwyNTUsMTUwLDIxLDg2LDI1NCw2MCwxMSwxOTMsMCwxNTEsMzcsMzYsMjU0LDE4NSwxNTAsMjQzLDI1NSwyMjgsMjEyLDgzLDEsMTcyLDE1MSwxODAsMCwyMDEsMTY5LDE1NSwwLDI0NCw2MCwyMzQsMCwxNDIsMjM1LDQsMSw2NywyMTgsNjAsMCwxOTIsMTEzLDc1LDEsMTE2LDI0MywyMDcsMjU1LDY1LDE3MiwxNTUsMCw4MSwzMCwxNTYsMjU1LDgwLDcyLDMzLDI1NCwxOCwyMzEsMTA5LDI1NSwxNDIsMTA3LDIxLDI1NCwxMjUsMjYsMTMyLDI1NSwxNzYsMTYsNTksMjU1LDE1MCwyMDEsNTgsMCwyMDYsMTY5LDIwMSwwLDIwOCwxMjEsMjI2LDAsNDAsMTcyLDE0LDI1NSwxNTAsNjEsOTQsMjU1LDU2LDU3LDE1NiwyNTUsMTQxLDYwLDE0NSwyNTUsNDUsMTA4LDE0OSwyNTUsMjM4LDE0NSwxNTUsMjU1LDIwOSw4NSwzMSwyNTQsMTkyLDEyLDIxMCwwLDk5LDk4LDkzLDI1NCwxNTIsMTYsMTUxLDAsMjI1LDE4NSwyMjAsMCwxNDEsMjM1LDQ0LDI1NSwxNjAsMTcyLDIxLDI1NCw3MSwyNiwzMSwyNTUsMTMsNjQsOTMsMjU0LDI4LDU2LDE5OCwwLDE3Nyw2MiwyNDgsMSwxODIsOCwyNDEsMCwxNjYsMTAxLDE0OCwyNTUsNzgsODEsMTMzLDI1NSwxMjksMjIyLDIxNSwxLDE4OCwxNjksMTI5LDI1NSwyMzIsNyw5NywwLDQ5LDExMiw2MCwyNTUsMjE3LDIyOSwyNTEsMCwxMTksMTA4LDEzOCwwLDM5LDE5LDEyMywyNTQsMTMxLDQ5LDIzNSwwLDEzMiw4NCwxNDUsMCwxMzAsMjMwLDE0OCwyNTUsMjUsNzQsMTg3LDAsNSwyNDUsNTQsMjU1LDE4NSwyMTksMjQxLDEsMTgsMTk0LDIyOCwyNTUsMjQxLDIwMiwxMDIsMCwxMDUsMTEzLDIwMiwwLDE1NSwyMzUsNzksMCwyMSw5LDE3OCwyNTUsMTU2LDEsMjM5LDAsMjAwLDE0OCw2MSwwLDExNSwyNDcsMjEwLDI1NSw0OSwyMjEsMTM1LDAsNTgsMTg5LDgsMSwzNSw0Niw5LDAsODEsNjUsNSwyNTUsNTIsMTU4LDE4NSwyNTUsMTI1LDExNiw0NiwyNTUsNzQsMTQwLDEzLDI1NSwyMTAsOTIsMTcyLDI1NCwxNDcsMjMsNzEsMCwyMTcsMjI0LDI1MywyNTQsMTE1LDEwOCwxODAsMjU1LDE0NSw1OCw0OCwyNTQsMjE5LDE3NywyNCwyNTUsMTU2LDI1NSw2MCwxLDE1NCwxNDcsMjQyLDAsMjUzLDEzNCw4NywwLDUzLDc1LDIyOSwwLDQ4LDE5NSwyMjIsMjU1LDMxLDE3NSw1MCwyNTUsMTU2LDIxMCwxMjAsMjU1LDIwOCwzNSwyMjIsMjU1LDE4LDI0OCwxNzksMSwyLDEwLDEwMSwyNTUsMTU3LDE5NCwyNDgsMjU1LDE1OCwyMDQsMTAxLDI1NSwxMDQsMjU0LDE5NywyNTUsNzksNjIsNCwwLDE3OCwxNzIsMTAxLDEsOTYsMTQ2LDI1MSwyNTUsNjUsMTAsMTU2LDAsMiwxMzcsMTY1LDI1NSwxMTYsNCwyMzEsMCwyNDIsMjE1LDEsMCwxOSwzNSwyOSwyNTUsNDMsMTYxLDc5LDAsNTksMTQ5LDI0NiwxLDI1MSw2NiwxNzYsMCwyMDAsMzMsMywyNTUsODAsMTEwLDE0MiwyNTUsMTk1LDE2MSwxNywxLDIyOCw1Niw2NiwyNTUsMTIzLDQ3LDE0NSwyNTQsMTMyLDQsMTY0LDAsNjcsMTc0LDE3MiwwLDI1LDI1MywxMTQsMCw4Nyw5Nyw4NywxLDI1MCwyMjAsODQsMCw5Niw5MSwyMDAsMjU1LDM3LDEyNSw1OSwwLDE5LDY1LDExOCwwLDE2MSw1MiwyNDEsMjU1LDIzNywxNzIsNiwyNTUsMTc2LDE5MSwyNTUsMjU1LDEsNjUsMTMwLDI1NCwyMjMsMTkwLDIzMCwwLDEwMSwyNTMsMjMxLDI1NSwxNDYsMzUsMTA5LDAsMjUwLDI5LDc3LDEsNDksMCwxOSwwLDEyMyw5MCwxNTUsMSwyMiw4NiwzMiwyNTUsMjE4LDIxMyw2NSwwLDExMSw5MywxMjcsMCw2MCw5MywxNjksMjU1LDgsMTI3LDE4MiwwLDE3LDE4NiwxNCwyNTQsMjUzLDEzNywyNDYsMjU1LDIxMywyNSw0OCwyNTQsNzYsMjM4LDAsMjU1LDI0OCw5Miw3MCwyNTUsOTksMjI0LDEzOSwwLDE4NCw5LDI1NSwxLDcsMTY0LDIwOCwwLDIwNSwxMzEsMTk4LDEsODcsMjE0LDE5OSwwLDEzMCwyMTQsOTUsMCwyMjEsMTQ5LDIyMiwwLDIzLDM4LDE3MSwyNTQsMTk3LDExMCwyMTMsMCw0MywxMTUsMTQwLDI1NCwyMTUsMTc3LDExOCwwLDk2LDUyLDY2LDEsMTE3LDE1OCwyMzcsMCwxNCw2NCwxODIsMjU1LDQ2LDYzLDE3NCwyNTUsMTU4LDk1LDE5MCwyNTUsMjI1LDIwNSwxNzcsMjU1LDQzLDUsMTQyLDI1NSwxNzIsOTksMjEyLDI1NSwyNDQsMTg3LDE0NywwLDI5LDUxLDE1MywyNTUsMjI4LDExNiwyNCwyNTQsMzAsMTAxLDIwNywwLDE5LDI0NiwxNTAsMjU1LDEzNCwyMzEsNSwwLDEyNSwxMzQsMjI2LDEsNzcsNjUsOTgsMCwyMzYsMTMwLDMzLDI1NSw1LDExMCw2MiwwLDY5LDEwOCwxMjcsMjU1LDcsMTEzLDIyLDAsMTQ1LDIwLDgzLDI1NCwxOTQsMTYxLDIzMSwyNTUsMTMxLDE4MSw2MCwwLDIxNywyMDksMTc3LDI1NSwyMjksMTQ4LDIxMiwyNTQsMywxMzEsMTg0LDAsMTE3LDE3NywxODcsMSwyOCwxNCwzMSwyNTUsMTc2LDEwMiw4MCwwLDUwLDg0LDE1MSwyNTUsMTI1LDMxLDU0LDI1NSwyMSwxNTcsMTMzLDI1NSwxOSwxNzksMTM5LDEsMjI0LDIzMiwyNiwwLDM0LDExNywxNzAsMjU1LDE2NywyNTIsMTcxLDI1NSw3MywxNDEsMjA2LDI1NCwxMjksMjUwLDM1LDAsNzIsNzksMjM2LDEsMjIwLDIyOSwyMCwyNTUsNDEsMjAyLDE3MywyNTUsOTksNzYsMjM4LDI1NSwxOTgsMjIsMjI0LDI1NSwxMDgsMTk4LDE5NSwyNTUsMzYsMTQxLDk2LDEsMjM2LDE1OCw1OSwyNTUsMTA2LDEwMCw4NywwLDExMCwyMjYsMiwwLDIyNywyMzQsMjIyLDAsMTU0LDkzLDExOSwyNTUsNzQsMTEyLDE2NCwyNTUsNjcsOTEsMiwyNTUsMjEsMTQ1LDMzLDI1NSwxMDIsMjE0LDEzNywyNTUsMTc1LDIzMCwxMDMsMjU0LDE2MywyNDYsMTY2LDAsOTMsMjQ3LDExNiwyNTQsMTY3LDIyNCwyOCwyNTUsMjIwLDIsNTcsMSwxNzEsMjA2LDg0LDAsMTIzLDIyOCwxNywyNTUsMjcsMTIwLDExOSwwLDExOSwxMSwxNDcsMSwxODAsNDcsMjI1LDI1NSwxMDQsMjAwLDE4NSwyNTQsMTY1LDIsMTE0LDAsNzcsNzgsMjEyLDAsNDUsMTU0LDE3NywyNTUsMjQsMTk2LDEyMSwyNTQsODIsMTU3LDE4MiwwLDkwLDE2LDE5MCwxLDEyLDE0NywxOTcsMCw5NSwyMzksMTUyLDI1NSwxMSwyMzUsNzEsMCw4NiwxNDYsMTE5LDI1NSwxNzIsMTM0LDIxNCwwLDYwLDEzMSwxOTYsMCwxNjEsMjI1LDEyOSwwLDMxLDEzMCwxMjAsMjU0LDk1LDIwMCw1MSwwLDEwNSwyMzEsMjEwLDI1NSw1OCw5LDE0OCwyNTUsNDMsMTY4LDIyMSwyNTUsMTI0LDIzNywxNDIsMCwxOTgsMjExLDUwLDI1NCw0NiwyNDUsMTAzLDAsMTY0LDI0OCw4NCwwLDE1Miw3MCwyMDgsMjU1LDE4MCwxMTcsMTc3LDAsNzAsNzksMTg1LDAsMjQzLDc0LDMyLDAsMTQ5LDE1NiwyMDcsMCwxOTcsMTk2LDE2MSwxLDI0NSw1MywyMzksMCwxNSw5MywyNDYsMjU0LDEzOSwyNDAsNDksMjU1LDE5Niw4OCwzNiwyNTUsMTYyLDM4LDEyMywwLDEyOCwyMDAsMTU3LDEsMTc0LDc2LDEwMywyNTUsMTczLDE2OSwzNCwyNTQsMjE2LDEsMTcxLDI1NSwxMTQsNTEsMTcsMCwxMzYsMjI4LDE5NCwwLDExMCwxNTAsNTYsMjU0LDEwNiwyNDYsMTU5LDAsMTksMTg0LDc5LDI1NSwxNTAsNzcsMjQwLDI1NSwxNTUsODAsMTYyLDAsMCw1MywxNjksMjU1LDI5LDE1MSw4NiwwLDY4LDk0LDE2LDAsOTIsNywxMTAsMjU0LDk4LDExNywxNDksMjU1LDI0OSw3NywyMzAsMjU1LDI1MywxMCwxNDAsMCwyMTQsMTI0LDkyLDI1NCwzNSwxMTgsMjM1LDAsODksNDgsNTcsMSwyMiw1MywxNjYsMCwxODQsMTQ0LDYxLDI1NSwxNzksMjU1LDE5NCwwLDIxNCwyNDgsNjEsMjU0LDU5LDExMCwyNDYsMCwxMjEsMjEsODEsMjU0LDE2NiwzLDIyOCwwLDEwNiw2NCwyNiwyNTUsNjksMjMyLDEzNCwyNTUsMjQyLDIyMCw1MywyNTQsNDYsMjIwLDg1LDAsMTEzLDE0OSwyNDcsMjU1LDk3LDE3OSwxMDMsMjU1LDE5MCwxMjcsMTEsMCwxMzUsMjA5LDE4MiwwLDk1LDUyLDEyOSwxLDE3MCwxNDQsMjA2LDI1NSwxMjIsMjAwLDIwNCwyNTUsMTY4LDEwMCwxNDYsMCw2MCwxNDQsMTQ5LDI1NCw3MCw2MCw0MCwwLDEyMiw1MiwxNzcsMjU1LDI0NiwyMTEsMTAxLDI1NSwxNzQsMjM3LDgsMCw3LDUxLDEyMCwwLDE5LDMxLDE3MywwLDEyNiwyMzksMTU2LDI1NSwxNDMsMTg5LDIwMywwLDE5NiwxMjgsODgsMjU1LDIzMywxMzMsMjI2LDI1NSwzMCwxMjUsMTczLDI1NSwyMDEsMTA4LDUwLDAsMTIzLDEwMCw1OSwyNTUsMjU0LDE2MywzLDEsMjIxLDE0OCwxODEsMjU1LDIxNCwxMzYsNTcsMjU0LDIyMiwxODAsMTM3LDI1NSwyMDcsODgsNTQsMjU1LDI4LDMzLDI1MSwyNTUsNjcsMjE0LDUyLDEsMjEwLDIwOCwxMDAsMCw4MSwxNzAsOTQsMCwxNDUsNDAsNTMsMCwyMjQsMTExLDIzMSwyNTQsMzUsMjgsMjQ0LDI1NSwyMjYsMTk5LDE5NSwyNTQsMjM4LDE3LDIzMCwwLDIxNywyMTcsMTY0LDI1NCwxNjksMTU3LDIyMSwwLDIxOCw0NiwxNjIsMSwxOTksMjA3LDE2MywyNTUsMTA4LDExNSwxNjIsMSwxNCw5NiwxODcsMjU1LDExOCw2MCw3NiwwLDE4NCwxNTksMTUyLDAsMjA5LDIzMSw3MSwyNTQsNDIsMTY0LDE4NiwyNTUsMTg2LDE1Myw1MSwyNTQsMjIxLDE3MSwxODIsMjU1LDE2MiwxNDIsMTczLDAsMjM1LDQ3LDE5MywwLDcsMTM5LDE2LDEsOTUsMTY0LDY0LDI1NSwxNiwyMjEsMTY2LDAsMjE5LDE5NywxNiwwLDEzMiwyOSw0NCwyNTUsMTAwLDY5LDExNywyNTUsNjAsMjM1LDg4LDI1NCw0MCw4MSwxNzMsMCw3MSwxOTAsNjEsMjU1LDE4Nyw4OCwxNTcsMCwyMzEsMTEsMjMsMCwyMzcsMTE3LDE2NCwwLDIyNSwxNjgsMjIzLDI1NSwxNTQsMTE0LDExNiwyNTUsMTYzLDE1MiwyNDIsMSwyNCwzMiwxNzAsMCwxMjUsOTgsMTEzLDI1NCwxNjgsMTksNzYsMCwxNywxNTcsMjIwLDI1NCwxNTUsNTIsNSwwLDE5LDExMSwxNjEsMjU1LDcxLDkwLDI1MiwyNTUsMTczLDExMCwyNDAsMCwxMCwxOTgsMTIxLDI1NSwyNTMsMjU1LDI0MCwyNTUsNjYsMTIzLDIxMCwwLDIyMSwxOTQsMjE1LDI1NCwxMjEsMTYzLDE3LDI1NSwyMjUsNyw5OSwwLDE5MCw0OSwxODIsMCwxMTUsOSwxMzMsMSwyMzIsMjYsMTM4LDI1NSwyMTMsNjgsMTMyLDAsNDQsMTE5LDEyMiwyNTUsMTc5LDk4LDUxLDAsMTQ5LDkwLDEwNiwwLDcxLDUwLDIzMCwyNTUsMTAsMTUzLDExOCwyNTUsMTc3LDcwLDI1LDAsMTY1LDg3LDIwNSwwLDU1LDEzOCwyMzQsMCwyMzgsMzAsOTcsMCwxMTMsMTU1LDIwNywwLDk4LDE1MywxMjcsMCwzNCwxMDcsMjE5LDI1NCwxMTcsMTE0LDE3MiwyNTUsNzYsMTgwLDI1NSwyNTQsMjQyLDU3LDE3OSwyNTUsMjIxLDM0LDE3MiwyNTQsNTYsMTYyLDQ5LDI1NSw4MywzLDI1NSwyNTUsMTEzLDIyMSwxODksMjU1LDE4OCwyNSwyMjgsMjU0LDE2LDg4LDg5LDI1NSw3MSwyOCwxOTgsMjU0LDIyLDE3LDE0OSwyNTUsMjQzLDEyMSwyNTQsMjU1LDEwNywyMDIsOTksMjU1LDksMjA2LDE0LDEsMjIwLDQ3LDE1MywwLDEwNywxMzcsMzksMSw5Nyw0OSwxOTQsMjU1LDE0OSw1MSwxOTcsMjU0LDE4Niw1OCwxMSwyNTUsMTA3LDQzLDIzMiwxLDIwMCw2LDE0LDI1NSwxODEsMTMzLDY1LDI1NCwyMjEsMjI4LDE3MSwyNTUsMTIzLDYyLDIzMSwxLDIyNywyMzQsMTc5LDI1NSwzNCwxODksMjEyLDI1NCwyNDQsMTg3LDI0OSwwLDE5MCwxMyw4MCwxLDEzMCw4OSwxLDAsMjIzLDEzMywxNzMsMCw5LDIyMiwxOTgsMjU1LDY2LDEyNyw3NCwwLDE2NywyMTYsOTMsMjU1LDE1NSwxNjgsMTk4LDEsNjYsMTQ1LDAsMCw2OCwxMDIsNDYsMSwxNzIsOTAsMTU0LDAsMjE2LDEyOCw3NSwyNTUsMTYwLDQwLDUxLDAsMTU4LDE3LDI3LDEsMTI0LDI0MCw0OSwwLDIzNiwyMDIsMTc2LDI1NSwxNTEsMTI0LDE5MiwyNTUsMzgsMTkzLDE5MCwwLDk1LDE4Miw2MSwwLDE2MywxNDcsMTI0LDI1NSwyNTUsMTY1LDUxLDI1NSwyOCw0MCwxNywyNTQsMjE1LDk2LDc4LDAsODYsMTQ1LDIxOCwyNTQsMzEsMzYsMjAyLDI1NSw4Niw5LDUsMCwxMTEsNDEsMjAwLDI1NSwyMzcsMTA4LDk3LDAsNTcsNjIsNDQsMCwxMTcsMTg0LDE1LDEsNDUsMjQxLDExNiwwLDE1MiwxLDIyMCwyNTUsMTU3LDE2NSwxODgsMCwyNTAsMTUsMTMxLDEsNjAsNDQsMTI1LDI1NSw2NSwyMjAsMjUxLDI1NSw3NSw1MCwxODQsMCw1Myw5MCwxMjgsMjU1LDIzMSw4MCwxOTQsMjU1LDEzNiwxMjksMTI3LDEsMjEsMTgsMTg3LDI1NSw0NSw1OCwxNjEsMjU1LDcxLDE0NywzNCwwLDE3NCwyNDksMTEsMjU0LDM1LDE0MSwyOSwwLDIzOSw2OCwxNzcsMjU1LDExNSwxMTAsNTgsMCwyMzgsMTkwLDE3NywxLDg3LDI0NSwxNjYsMjU1LDE5MCw0OSwyNDcsMjU1LDE0Niw4MywxODQsMjU1LDE3MywxNCwzOSwyNTUsMTQ2LDIxNSwxMDQsMCwxNDIsMjIzLDEyMCwwLDE0OSwyMDAsMTU1LDI1NSwyMTIsMjA3LDE0NSwxLDE2LDE4MSwyMTcsMCwxNzMsMzIsODcsMjU1LDI1NSwzNSwxODEsMCwxMTksMjIzLDE2MSwxLDIwMCwyMjMsOTQsMjU1LDcwLDYsMTg2LDI1NSwxOTIsNjcsODUsMjU1LDUwLDE2OSwxNTIsMCwxNDQsMjYsMTIzLDI1NSw1NiwyNDMsMTc5LDI1NCwyMCw2OCwxMzYsMCwzOSwxNDAsMTg4LDI1NCwyNTMsMjA4LDUsMjU1LDIwMCwxMTUsMTM1LDEsNDMsMTcyLDIyOSwyNTUsMTU2LDEwNCwxODcsMCwxNTEsMjUxLDE2NywwLDUyLDEzNSwyMywwLDE1MSwxNTMsNzIsMCwxNDcsMTk3LDEwNywyNTQsMTQ4LDE1OCw1LDI1NSwyMzgsMTQzLDIwNiwwLDEyNiwxNTMsMTM3LDI1NSw4OCwxNTIsMTk3LDI1NCw3LDY4LDE2NywwLDI1MiwxNTksMTY1LDI1NSwyMzksNzgsNTQsMjU1LDI0LDYzLDU1LDI1NSwzOCwyMjIsOTQsMCwyMzcsMTgzLDEyLDI1NSwyMDYsMjA0LDIxMCwwLDE5LDM5LDI0NiwyNTQsMzAsNzQsMjMxLDAsMTM1LDEwOCwyOSwxLDE3OSwxMTUsMCwwLDExNywxMTgsMTE2LDEsMTMyLDYsMjUyLDI1NSwxNDUsMTI5LDE2MSwxLDEwNSw2NywxNDEsMCw4MiwzNywyMjYsMjU1LDIzOCwyMjYsMjI4LDI1NSwyMDQsMjE0LDEyOSwyNTQsMTYyLDEyMywxMDAsMjU1LDE4NSwxMjEsMjM0LDAsNDUsMTA4LDIzMSwwLDY2LDgsNTYsMjU1LDEzMiwxMzYsMTI4LDAsMTcyLDIyNCw2NiwyNTQsMTc1LDE1NywxODgsMCwyMzAsMjIzLDIyNiwyNTQsMjQyLDIxOSw2OSwwLDE4NCwxNCwxMTksMSw4MiwxNjIsNTYsMCwxMTQsMTIzLDIwLDAsMTYyLDEwMyw4NSwyNTUsNDksMjM5LDk5LDI1NCwxNTYsMTM1LDIxNSwwLDExMSwyNTUsMTY3LDI1NCwzOSwxOTYsMjE0LDAsMTQ0LDM4LDc5LDEsMjQ5LDE2OCwxMjUsMCwxNTUsOTcsMTU2LDI1NSwyMyw1MiwyMTksMjU1LDE1MCwyMiwxNDQsMCw0NCwxNDksMTY1LDI1NSw0MCwxMjcsMTgzLDAsMTk2LDc3LDIzMywyNTUsMTE4LDEyOSwyMTAsMjU1LDE3MCwxMzUsMjMwLDI1NSwyMTQsMTE5LDE5OCwwLDIzMywyNDAsMzUsMCwyNTMsNTIsNywyNTUsMTE3LDEwMiw0OCwyNTUsMjEsMjA0LDE1NCwyNTUsMTc5LDEzNiwxNzcsMjU1LDIzLDIsMywxLDE0OSwxMzAsODksMjU1LDI1MiwxNywxNTksMSw3MCw2MCwyNiwwLDE0NCwxMDcsMTcsMCwxODAsMTkwLDYwLDI1NSw1NiwxODIsNTksMjU1LDExMCw3MSw1NCwyNTUsMTk4LDE4LDEyOSwyNTUsMTQ5LDIyNCw4NywyNTUsMjIzLDIxLDE1MiwyNTUsMTM4LDIyLDE4MiwyNTUsMjUwLDE1NiwyMDUsMCwyMzYsNDUsMjA4LDI1NSw3OSwxNDgsMjQyLDEsMTAxLDcwLDIwOSwwLDEwMyw3OCwxNzQsMCwxMDEsMTQ0LDE3MiwyNTUsMTUyLDEzNiwyMzcsMSwxOTEsMTk0LDEzNiwwLDExMyw4MCwxMjUsMSwxNTIsNCwxNDEsMCwxNTUsMTUwLDUzLDI1NSwxOTYsMTE2LDI0NSwwLDIzOSwxMTQsNzMsMjU0LDE5LDgyLDE3LDI1NSwxMjQsMTI1LDIzNCwyNTUsNDAsNTIsMTkxLDAsNDIsMjEwLDE1OCwyNTUsMTU1LDEzMiwxNjUsMCwxNzgsNSw0MiwxLDY0LDkyLDQwLDI1NSwzNiw4NSw3NywyNTUsMTc4LDIyOCwxMTgsMCwxMzcsNjYsOTYsMjU0LDExNSwyMjYsNjYsMCwxMTAsMjQwLDY5LDI1NCwxNTEsMTExLDgwLDAsMTY3LDE3NCwyMzYsMjU1LDIyNywxMDgsMTA3LDI1NSwxODgsMjQyLDY1LDI1NSwxODMsODEsMjU1LDAsNTcsMjA2LDE4MSwyNTUsNDcsMzQsMTgxLDI1NSwyMTMsMjQwLDE1OCwxLDcxLDc1LDk1LDAsMTU2LDQwLDI0LDI1NSwxMDIsMjEwLDgxLDAsMTcxLDE5OSwyMjgsMjU1LDE1NCwzNCw0MSwwLDIyNywxNzUsNzUsMCwyMSwyMzksMTk1LDAsMTM4LDIyOSw5NSwxLDc2LDE5Miw0OSwwLDExNywxMjMsODcsMSwyMjcsMjI1LDEzMCwwLDEyNSw2Miw2MywyNTUsMiwxOTgsMTcxLDAsMjU0LDM2LDEzLDI1NCwxNDUsMTg2LDIwNiwwLDE0OCwyNTUsMjQ0LDI1NSwzNSwwLDE2NiwwLDMwLDE1MCwyMTksMSw5MiwyMjgsMjEyLDAsOTIsMTk4LDYwLDI1NCw2MiwxMzMsMjAwLDI1NSwyMDEsNDEsNTksMCwxMjUsMjM4LDEwOSwyNTUsMTgwLDE2MywyMzgsMSwxNDAsMTIyLDgyLDAsOSwyMiw4OCwyNTUsMTk3LDE1Nyw0NywyNTUsMTUzLDk0LDU3LDAsODgsMzAsMTgyLDAsODQsMTYxLDg1LDAsMTc4LDE0NiwxMjQsMCwxNjYsMTY2LDcsMjU1LDIxLDIwOCwyMjMsMCwxNTYsMTgyLDI0MiwwLDE1NSwxMjEsMTg1LDAsODMsMTU2LDE3NCwyNTQsMTU0LDE2LDExOCwyNTUsMTg2LDgzLDIzMiwxLDIyMyw1OCwxMjEsMjU1LDI5LDIzLDg4LDAsMzUsMTI1LDEyNywyNTUsMTcwLDUsMTQ5LDI1NCwxNjQsMTIsMTMwLDI1NSwxNTUsMTk2LDI5LDAsMTYxLDk2LDEzNiwwLDcsMzUsMjksMSwxNjIsMzcsMjUxLDAsMyw0NiwyNDIsMjU1LDAsMjE3LDE4OCwwLDU3LDE3NCwyMjYsMSwyMDYsMjMzLDIsMCw1NywxODcsMTM2LDI1NCwxMjMsMTg5LDksMjU1LDIwMSwxMTcsMTI3LDI1NSwxODYsMzYsMjA0LDAsMjMxLDI1LDIxNiwwLDgwLDc4LDEwNSwwLDE5LDEzNCwxMjksMjU1LDE0OCwyMDMsNjgsMCwxNDEsODEsMTI1LDI1NCwyNDgsMTY1LDIwMCwyNTUsMjE0LDE0NCwxMzUsMCwxNTEsNTUsMTY2LDI1NSwzOCwyMzUsOTEsMCwyMSw0NiwxNTQsMCwyMjMsMjU0LDE1MCwyNTUsMzUsMTUzLDE4MCwyNTUsMTI1LDE3NiwyOSwxLDQzLDk4LDMwLDI1NSwyMTYsMTIyLDIzMCwyNTUsMjMzLDE2MCwxMiwwLDU3LDE4NSwxMiwyNTQsMjQwLDExMyw3LDI1NSw1LDksMTYsMjU0LDI2LDkxLDEwOCwwLDEwOSwxOTgsMjAzLDAsOCwxNDcsNDAsMCwxMjksMTM0LDIyOCwyNTUsMTI0LDE4Niw0MCwyNTUsMTE0LDk4LDEzMiwyNTQsMTY2LDEzMiwyMywwLDk5LDY5LDQ0LDAsOSwyNDIsMjM4LDI1NSwxODQsNTMsNTksMCwxMzIsMTI5LDEwMiwyNTUsNTIsMzIsMjQzLDI1NCwxNDcsMjIzLDIwMCwyNTUsMTIzLDgzLDE3OSwyNTQsMTM1LDE0NCwyMDEsMjU1LDE0MSwzNyw1NiwxLDE1MSw2MCwyMjcsMjU1LDkwLDczLDE1NiwxLDIwMywxNzIsMTg3LDAsODAsMTUxLDQ3LDI1NSw5NCwxMzcsMjMxLDI1NSwzNiwxOTEsNTksMjU1LDIyNSwyMDksMTgxLDI1NSw3NCwyMTUsMjEzLDI1NCw2LDExOCwxNzksMjU1LDE1Myw1NCwxOTMsMSw1MCwwLDIzMSwwLDEwNCwxNTcsNzIsMSwxNDAsMjI3LDE1NCwyNTUsMTgyLDIyNiwxNiwyNTQsOTYsMjI1LDkyLDI1NSwxMTUsMjAsMTcwLDI1NCw2LDI1MCw3OCwwLDI0OCw3NSwxNzMsMjU1LDUzLDg5LDYsMjU1LDAsMTgwLDExOCwwLDcyLDE3MywxLDAsNjQsOCwyMDYsMSwxNzQsMTMzLDIyMywwLDE4NSw2MiwxMzMsMjU1LDIxNCwxMSw5OCwwLDE5NywzMSwyMDgsMCwxNzEsMTY3LDI0NCwyNTUsMjIsMjMxLDE4MSwxLDE1MCwyMTgsMTg1LDAsMjQ3LDE2OSw5NywxLDE2NSwxMzksMjQ3LDI1NSw0NywxMjAsMTQ5LDEsMTAzLDI0OCw1MSwwLDYwLDY5LDI4LDI1NCwyNSwxNzksMTk2LDAsMTI0LDcsMjE4LDI1NCw1OCwxMDcsODEsMCwxODQsMjMzLDE1NiwyNTUsMjUyLDc0LDM2LDAsMTE4LDE4OCw2NywwLDE0MSw5NSw1MywyNTUsMjIyLDk0LDE2NSwyNTQsNDYsNjEsNTMsMCwyMDYsNTksMTE1LDI1NSw0NywyMzYsMjUwLDI1NSw3NCw1LDMyLDEsMTI5LDE1NCwyMzgsMjU1LDEwNiwzMiwyMjYsMCwxMjEsMTg3LDYxLDI1NSwzLDE2NiwyNDEsMjU0LDY3LDE3MCwxNzIsMjU1LDI5LDIxNiwxNzgsMjU1LDIzLDIwMSwyNTIsMCwyNTMsMTEwLDI0MywwLDIwMCwxMjUsNTcsMCwxMDksMTkyLDk2LDI1NSw1MiwxMTUsMjM4LDAsMzgsMTIxLDI0MywyNTUsMjAxLDU2LDMzLDAsMTk0LDExOCwxMzAsMCw3NSw5NiwyNSwyNTUsMTcwLDMwLDIzMCwyNTQsMzksNjMsMjUzLDAsMzYsNDUsMjUwLDI1NSwyNTEsMSwyMzksMCwxNjAsMjEyLDkyLDEsNDUsMjA5LDIzNywwLDI0MywzMyw4NywyNTQsMjM3LDg0LDIwMSwyNTUsMjEyLDE4LDE1NywyNTQsMjEyLDk5LDEyNywyNTUsMjE3LDk4LDE2LDI1NCwxMzksMTcyLDIzOSwwLDE2OCwyMDEsMTMwLDI1NSwxNDMsMTkzLDE2OSwyNTUsMjM4LDE1MSwxOTMsMSwyMTUsMTA0LDQxLDAsMjM5LDYxLDE2NSwyNTQsMiwzLDI0MiwwLDIyLDIwMywxNzcsMjU0LDE3NywyMDQsMjIsMCwxNDksMTI5LDIxMywyNTQsMzEsMTEsNDEsMjU1LDAsMTU5LDEyMSwyNTQsMTYwLDI1LDExNCwyNTUsMTYyLDgwLDIwMCwwLDE1NywxNTEsMTEsMCwxNTQsMTM0LDc4LDEsMjE2LDU0LDI1MiwwLDQ4LDEwMywxMzMsMCwxMDUsMjIwLDE5NywwLDI1MywxNjgsNzcsMjU0LDUzLDE3OSwyMywwLDI0LDEyMSwyNDAsMSwyNTUsNDYsOTYsMjU1LDEwNyw2MCwxMzUsMjU0LDk4LDIwNSwyNDksMjU1LDYzLDI0OSwxMTksMjU1LDEyMCw1OSwyMTEsMjU1LDExNCwxODAsNTUsMjU0LDkxLDg1LDIzNywwLDE0OSwyMTIsNzcsMSw1Niw3Myw0OSwwLDg2LDE5OCwxNTAsMCw5MywyMDksMTYwLDAsNjksMjA1LDE4MiwyNTUsMjQ0LDkwLDQzLDAsMjAsMzYsMTc2LDAsMTIyLDExNiwyMjEsMCw1MSwxNjcsMzksMSwyMzEsMSw2MywyNTUsMTMsMTk3LDEzNCwwLDMsMjA5LDM0LDI1NSwxMzUsNTksMjAyLDAsMTY3LDEwMCw3OCwwLDQ3LDIyMyw3NiwwLDE4NSw2MCw2MiwwLDE3OCwxNjYsMTIzLDEsMTMyLDEyLDE2MSwyNTUsNjEsMTc0LDQzLDAsMTk1LDY5LDE0NCwwLDEyNyw0NywxOTEsMSwzNCw0NCw3OCwwLDU3LDIzNCw1MiwxLDI1NSwyMiw0MCwyNTUsMjQ2LDk0LDE0NiwwLDgzLDIyOCwxMjgsMCw2MCw3OCwyMjQsMjU1LDAsOTYsMjEwLDI1NSwxNTMsMTc1LDIzNiwwLDE1OSwyMSw3MywwLDE4MCwxMTUsMTk2LDI1NCwxMzEsMjI1LDEwNiwwLDI1NSwxNjcsMTM0LDAsMTU5LDgsMTEyLDI1NSwxMjAsNjgsMTk0LDI1NSwxNzYsMTk2LDE5OCwyNTUsMTE4LDQ4LDE2OCwyNTUsOTMsMTY5LDEsMCwxMTIsMjAwLDEwMiwxLDc0LDI0LDI1NCwwLDE5LDE0MSw0LDI1NCwxNDIsNjIsNjMsMCwxMzEsMTc5LDE4NywyNTUsNzcsMTU2LDE1NSwyNTUsMTE5LDg2LDE2NCwwLDE3MCwyMDgsMTQ2LDI1NSwyMDgsMTMzLDE1NCwyNTUsMTQ4LDE1NSw1OCwyNTUsMTYyLDEyMCwyMzIsMjU0LDI1MiwyMTMsMTU1LDAsMjQxLDEzLDQyLDAsOTQsNTAsMTMxLDAsMTc5LDE3MCwxMTIsMCwxNDAsODMsMTUxLDI1NSw1NSwxMTksODQsMSwxNDAsMzUsMjM5LDI1NSwxNTMsNDUsNjcsMSwyMzYsMTc1LDM5LDAsNTQsMTUxLDEwMywyNTUsMTU4LDQyLDY1LDI1NSwxOTYsMjM5LDEzNSwyNTQsODYsNTMsMjAzLDAsMTQ5LDk3LDQ3LDI1NCwyMTYsMzUsMTcsMjU1LDcwLDMsNzAsMSwxMDMsMzYsOTAsMjU1LDQwLDI2LDE3MywwLDE4NCw0OCwxMywwLDE2MywyMTksMjE3LDI1NSw4MSw2LDEsMjU1LDIyMSwxNzAsMTA4LDI1NCwyMzMsMjA4LDkzLDAsMTAwLDIwMSwyNDksMjU0LDg2LDM2LDM1LDI1NSwyMDksMTU0LDMwLDEsMjI3LDIwMSwyNTEsMjU1LDIsMTg5LDE2NywyNTQsMTAwLDU3LDMsMCwxMywxMjgsNDEsMCwxOTcsMTAwLDc1LDAsMTUwLDIwNCwyMzUsMjU1LDE0NSwxNzQsNTksMCwxMjAsMjQ4LDE0OSwyNTUsODUsNTUsMjI1LDAsMTE0LDIxMCw1MywyNTQsMTk5LDIwNCwxMTksMCwxNCwyNDcsNzQsMSw2MywyNTEsMTI5LDAsNjcsMTA0LDE1MSwxLDEzNSwxMzAsODAsMCw3OSw4OSw1NSwyNTUsMTE3LDIzMCwxNTcsMjU1LDI1LDk2LDE0MywwLDIxMywxNDUsNSwwLDY5LDI0MSwxMjAsMSwxNDksMjQzLDk1LDI1NSwxMTQsNDIsMjAsMCwxMzEsNzIsMiwwLDE1NCw1MywyMCwyNTUsNzMsNjIsMTA5LDAsMTk2LDEwMiwxNTIsMCw0MSwxMiwyMDQsMjU1LDEyMiwzOCwxMSwxLDI1MCwxMCwxNDUsMCwyMDcsMTI1LDE0OCwwLDI0NiwyNDQsMjIyLDI1NSw0MSwzMiw4NSwxLDExMiwyMTMsMTI2LDAsMTYyLDI0OSw4NiwxLDcxLDE5OCwxMjcsMjU1LDgxLDksMjEsMSw5OCwzOSw0LDI1NSwyMDQsNzEsNDUsMSw3NSwxMTEsMTM3LDAsMjM0LDU5LDIzMSwwLDMyLDQ4LDk1LDI1NSwyMDQsMzEsMTE0LDEsMjksMTk2LDE4MSwyNTUsNTEsMjQxLDE2NywyNTQsOTMsMTA5LDE0MiwwLDEwNCwxNDQsNDUsMCwyMzUsMTIsMTgxLDI1NSw1MiwxMTIsMTY0LDAsNzYsMjU0LDIwMiwyNTUsMTc0LDE0LDE2MiwwLDYxLDIzNSwxNDcsMjU1LDQzLDY0LDE4NSwyNTQsMjMzLDEyNSwyMTcsMCwyNDMsODgsMTY3LDI1NCw3NCw0OSw4LDAsMTU2LDIwNCw2NiwwLDEyNCwyMTQsMTIzLDAsMzgsMjIxLDExOCwxLDE0NiwxMTIsMjM2LDAsMTE0LDk4LDE3NywwLDE1MSw4OSwxOTksMCw4NywxOTcsMTEyLDAsMTg1LDE0OSwxNjEsMCw0NCw5NiwxNjUsMCwyNDgsMTc5LDIwLDI1NSwxODgsMjE5LDIxNiwyNTQsNDAsNjIsMTMsMCwyNDMsMTQyLDE0MSwwLDIyOSwyMjcsMjA2LDI1NSwxNzIsMjAyLDM1LDI1NSwxMTcsMTc2LDIyNSwyNTUsODIsMTEwLDM4LDEsNDIsMjQ1LDE0LDI1NSwyMCw4Myw5NywwLDQ5LDE3MSwxMCwwLDI0MiwxMTksMTIwLDAsMjUsMjMyLDYxLDAsMjEyLDI0MCwxNDcsMjU1LDQsMTE1LDU2LDI1NSwxNDUsMTcsMjM5LDI1NCwyMDIsMTcsMjUxLDI1NSwyNDksMTgsMjQ1LDI1NSw5OSwxMTcsMjM5LDAsMTg0LDQsMTc5LDI1NSwyNDYsMjM3LDUxLDI1NSwzNywyMzksMTM3LDI1NSwxNjYsMTEyLDE2NiwyNTUsODEsMTg4LDMzLDI1NSwxODUsMjUwLDE0MiwyNTUsNTQsMTg3LDE3MywwLDIwOCwxMTIsMjAxLDAsMjQ2LDQzLDIyOCwxLDEwNCwxODQsODgsMjU1LDIxMiw1MiwxOTYsMjU1LDUxLDExNywxMDgsMjU1LDI1NCwxMTcsMTU1LDAsNDYsOTEsMTUsMjU1LDg3LDE0LDE0NCwyNTUsODcsMjI3LDIwNCwwLDgzLDI2LDgzLDEsMTU5LDc2LDIyNywwLDE1OSwyNywyMTMsMSwyNCwxNTEsMTA4LDAsMTE3LDE0NCwxNzksMjU0LDEzNywyMDksODIsMCwzOCwxNTksMTAsMCwxMTUsMTMzLDIwMSwwLDIyMywxODIsMTU2LDEsMTEwLDE5Niw5MywyNTUsNTcsNjAsMjMzLDAsNSwxNjcsMTA1LDI1NSwxNTQsMTk3LDE2NCwwLDk2LDM0LDE4NiwyNTUsMTQ3LDEzMywzNywxLDIyMCw5OSwxOTAsMCwxLDE2Nyw4NCwyNTUsMjAsMTQ1LDE3MSwwLDE5NCwxOTcsMjUxLDI1NCw5NSw3OCwxMzMsMjU1LDI1MiwyNDgsMjQzLDI1NSwyMjUsOTMsMTMxLDI1NSwxODcsMTM0LDE5NiwyNTUsMjE2LDE1MywxNzAsMCwyMCwxMTgsMTU4LDI1NCwxNDAsMSwxMTgsMCw4NiwxNTgsMTUsMSw0NSwyMTEsNDEsMjU1LDE0NywxLDEwMCwyNTQsMTEzLDExNiw3NiwyNTUsMjExLDEyNywxMDgsMSwxMDMsMTUsNDgsMCwxOTMsMTYsMTAyLDEsNjksNTEsOTUsMjU1LDEwNywxMjgsMTU3LDAsMTM3LDE3MSwyMzMsMCw5MCwxMjQsMTQ0LDEsMTA2LDE2MSwxODIsMCwxNzUsNzYsMjM2LDEsMjAwLDE0MSwxNzIsMjU1LDE2Myw1OCwxMDQsMCwyMzMsMTgwLDUyLDI1NSwyNDAsMjUzLDE0LDI1NSwxNjIsMTEzLDI1NCwyNTUsMzgsMjM5LDEzOCwyNTQsNTIsNDYsMTY2LDAsMjQxLDEwMSwzMywyNTQsMTMxLDE4NiwxNTYsMCwxMTEsMjA4LDYyLDI1NSwxMjQsOTQsMTYwLDI1NSwzMSwxNzIsMjU0LDAsMTEyLDE3NCw1NiwyNTUsMTg4LDk5LDI3LDI1NSw2NywxMzgsMjUxLDAsMTI1LDU4LDEyOCwxLDE1NiwxNTIsMTc0LDI1NSwxNzgsMTIsMjQ3LDI1NSwyNTIsODQsMTU4LDAsODIsMTk3LDE0LDI1NCwxNzIsMjAwLDgzLDI1NSwzNywzOSw0NiwxLDEwNiwyMDcsMTY3LDAsMjQsMTg5LDM0LDAsMTMxLDE3OCwxNDQsMCwyMDYsMjEzLDQsMCwxNjEsMjI2LDIxMCwwLDcyLDUxLDEwNSwyNTUsOTcsNDUsMTg3LDI1NSw3OCwxODQsMjIzLDI1NSwxNzYsMjksMjUxLDAsNzksMTYwLDg2LDI1NSwxMTYsMzcsMTc4LDAsODIsNzcsMjEzLDEsODIsODQsMTQxLDI1NSwyMjYsMTAxLDIxMiwxLDE3NSw4OCwxOTksMjU1LDI0NSw5NCwyNDcsMSwxNzIsMTE4LDEwOSwyNTUsMTY2LDE4NSwxOTAsMCwxMzEsMTgxLDEyMCwwLDg3LDI1NCw5MywyNTUsMTM0LDI0MCw3MywyNTUsMzIsMjQ1LDE0MywyNTUsMTM5LDE2MiwxMDMsMjU1LDE3OSw5OCwxOCwyNTQsMjE3LDIwNCwxMTIsMCwxNDcsMjIzLDEyMCwyNTUsNTMsMTAsMjQzLDAsMTY2LDE0MCwxNTAsMCwxMjUsODAsMjAwLDI1NSwxNCwxMDksMjE5LDI1NSw5MSwyMTgsMSwyNTUsMjUyLDI1Miw0NywyNTQsMTA5LDE1NiwxMTYsMjU1LDExNSw0OSwxMjcsMSwyMDQsODcsMjExLDI1NSwxNDgsMjAyLDIxNywyNTUsMjYsODUsMjQ5LDI1NSwxNCwyNDUsMTM0LDEsNzYsODksMTY5LDI1NSwyNDIsNDUsMjMwLDAsNTksOTgsMTcyLDI1NSwxMTQsNzMsMTMyLDI1NCw3OCwxNTUsNDksMjU1LDE1OCwxMjYsODQsMCw0OSwxNzUsNDMsMjU1LDE2LDE4Miw4NCwyNTUsMTU3LDEwMywzNSwwLDEwNCwxOTMsMTA5LDI1NSw2NywyMjEsMTU0LDAsMjAxLDE3MiwxLDI1NCw4LDE2Miw4OCwwLDE2NSwxLDI5LDI1NSwxMjUsMTU1LDIyOSwyNTUsMzAsMTU0LDIyMCwxLDEwMywyMzksOTIsMCwyMjAsMSwxMDksMjU1LDIwMiwxOTgsMSwwLDk0LDIsMTQyLDEsMzYsNTQsNDQsMCwyMzUsMjI2LDE1OCwyNTUsMTcwLDI1MSwyMTQsMjU1LDE4NSw3Nyw5LDAsOTcsNzQsMjQyLDAsMjE5LDE2MywxNDksMjU1LDI0MCwzNSwxMTgsMjU1LDIyMywxMTQsODgsMjU0LDE5MiwxOTksMywwLDEwNiwzNywyNCwyNTUsMjAxLDE2MSwxMTgsMjU1LDk3LDg5LDk5LDEsMjI0LDU4LDEwMywyNTUsMTAxLDE5OSwxNDcsMjU0LDIyMiw2MCw5OSwwLDIzNCwyNSw1OSwxLDUyLDEzNSwyNywwLDEwMiwzLDkxLDI1NCwxNjgsMjE2LDIzNSwwLDIyOSwyMzIsMTM2LDAsMTA0LDYwLDEyOSwwLDQ2LDE2OCwyMzgsMCwzOSwxOTEsNjcsMCw3NSwxNjMsNDcsMCwxNDMsOTcsOTgsMjU1LDU2LDIxNiwxNjgsMSwxNjgsMjMzLDI1MiwyNTUsMzUsMTExLDIyLDI1NSw5Miw4NCw0MywwLDI2LDIwMCw4NywxLDkxLDI1MywxNTIsMCwyMDIsNTYsNzAsMCwxNDIsOCw3NywwLDgwLDEwLDE3NSwxLDI1MiwxOTksNzYsMCwyMiwxMTAsODIsMjU1LDEyOSwxLDE5NCwwLDExLDEyOCw2MSwxLDg3LDE0LDE0NSwyNTUsMjUzLDIyMiwxOTAsMSwxNSw3MiwxNzQsMCw4NSwxNjMsODYsMjU0LDU4LDk5LDQ0LDI1NSw0NSwyNCwxODgsMjU0LDI2LDIwNSwxNSwwLDE5LDIyOSwyMTAsMjU0LDI0OCw2NywxOTUsMCw5OSw3MSwxODQsMCwxNTQsMTk5LDM3LDI1NSwxNTEsMjQzLDEyMSwyNTUsMzgsNTEsNzUsMjU1LDIwMSw4NSwxMzAsMjU0LDQ0LDY1LDI1MCwwLDU3LDE0NywyNDMsMjU0LDE0Niw0Myw1OSwyNTUsODksMjgsNTMsMCwzMyw4NCwyNCwyNTUsMTc5LDUxLDE4LDI1NCwxODksNzAsODMsMCwxMSwxNTYsMTc5LDEsOTgsMTM0LDExOSwwLDE1OCwxMTEsMTExLDAsMTE5LDE1NCw3MywyNTUsMjAwLDYzLDE0MCwyNTQsNDUsMTMsMTMsMjU1LDE1NCwxOTIsMiwyNTQsODEsNzIsNDIsMCw0NiwxNjAsMTg1LDI1NCw0NCwxMTIsNiwwLDE0NiwyMTUsMTQ5LDEsMjYsMTc2LDEwNCwwLDY4LDI4LDg3LDEsMjM2LDUwLDE1MywyNTUsMTc5LDEyOCwyNTAsMjU0LDIwNiwxOTMsMTkxLDI1NSwxNjYsOTIsMTM3LDI1NCw1Myw0MCwyMzksMCwyMTAsMSwyMDQsMjU0LDE2OCwxNzMsMzUsMCwxNDEsMjQzLDQ1LDEsMzYsNTAsMTA5LDI1NSwxNSwyNDIsMTk0LDI1NSwyMjcsMTU5LDEyMiwyNTUsMTc2LDE3NSwyMDIsMjU0LDcwLDU3LDcyLDAsNDAsMjIzLDU2LDAsMjA4LDE2Miw1OCwyNTUsMTgzLDk4LDkzLDAsMTUsMTExLDEyLDAsMzAsOCw3NiwyNTUsMTMyLDEyNywyNDYsMjU1LDQ1LDI0MiwxMDMsMCw2OSwxODEsMTUsMjU1LDEwLDIwOSwzMCwwLDMsMTc5LDEyMSwwLDI0MSwyMzIsMjE4LDEsMTIzLDE5OSw4OCwyNTUsMiwyMTAsMjAyLDEsMTg4LDEzMCw4MSwyNTUsOTQsMTAxLDIwOCwxLDEwMywzNiw0NSwwLDc2LDE5MywyNCwxLDk1LDI2LDI0MSwyNTUsMTY1LDE2MiwxODcsMCwzNiwxMTQsMTQwLDAsMjAyLDY2LDUsMjU1LDM3LDU2LDE0NywwLDE1MiwxMSwyNDMsMSwxMjcsODUsMjMyLDI1NSwyNTAsMTM1LDIxMiwxLDE4NSwxNzcsMTEzLDAsOTAsMjIwLDc1LDI1NSw2OSwyNDgsMTQ2LDAsNTAsMTExLDUwLDAsOTIsMjIsODAsMCwyNDQsMzYsMTE1LDI1NCwxNjMsMTAwLDgyLDI1NSwyNSwxOTMsNiwxLDEyNyw2MSwzNiwwLDI1Myw2NywzMCwyNTQsNjUsMjM2LDE3MCwyNTUsMTYxLDE3LDIxNSwyNTQsNjMsMTc1LDE0MCwwLDU1LDEyNyw0LDAsNzksMTEyLDIzMywwLDEwOSwxNjAsNDAsMCwxNDMsODMsNywyNTUsNjUsMjYsMjM4LDI1NSwyMTcsMTY5LDE0MCwyNTUsNzgsOTQsMTg5LDI1NSwwLDE0NywxOTAsMjU1LDE0Nyw3MSwxODYsMjU0LDEwNiw3NywxMjcsMjU1LDIzMywxNTcsMjMzLDEsMTM1LDg3LDIzNywyNTUsMjA4LDEzLDIzNiwxLDE1NSwxMDksMzYsMjU1LDE4MCwxMDAsMjE4LDAsMTgwLDE2MywxOCwwLDE5MCwxMTAsOSwxLDE3LDYzLDEyMywyNTUsMTc5LDEzNiwxODAsMjU1LDE2NSwxMjMsMTIzLDI1NSwxNDQsMTg4LDgxLDI1NCw3MSwyNDAsMTA4LDI1NSwyNSwxMTIsMTEsMjU1LDIyNywyMTgsNTEsMjU1LDE2Nyw1MCwyMzQsMjU1LDExNCw3OSwxMDgsMjU1LDMxLDE5LDExNSwyNTUsMTgzLDI0MCw5OSwwLDIyNyw4NywxNDMsMjU1LDcyLDIxNywyNDgsMjU1LDEwMiwxNjksOTUsMSwxMjksMTQ5LDE0OSwwLDIzOCwxMzMsMTIsMSwyMjcsMjA0LDM1LDAsMjA4LDExNSwyNiwxLDEwMiw4LDIzNCwwLDExMiw4OCwxNDMsMSwxNDQsMjQ5LDE0LDAsMjQwLDE1OCwxNzIsMjU0LDEwMCwxMTIsMTE5LDAsMTk0LDE0MSwxNTMsMjU0LDQwLDU2LDgzLDI1NSwxMjEsMTc2LDQ2LDAsNDIsNTMsNzYsMjU1LDE1OCwxOTEsMTU0LDAsOTEsMjA5LDkyLDAsMTczLDEzLDE2LDEsNSw3MiwyMjYsMjU1LDIwNCwyNTQsMTQ5LDAsODAsMTg0LDIwNywwLDEwMCw5LDEyMiwyNTQsMTE4LDEwMSwxNzEsMjU1LDI1MiwyMDMsMCwyNTQsMTYwLDIwNyw1NCwwLDU2LDcyLDI0OSwxLDU2LDE0MCwxMywyNTUsMTAsNjQsMTA3LDI1NCw5MSwxMDEsNTIsMjU1LDIyNSwxODEsMjQ4LDEsMTM5LDI1NSwxMzIsMCwyMzAsMTQ1LDE3LDAsMjMzLDU2LDIzLDAsMTE5LDEsMjQxLDI1NSwyMTMsMTY5LDE1MSwyNTUsOTksOTksOSwyNTQsMTg1LDE1LDE5MSwyNTUsMTczLDEwMywxMDksMSwxNzQsMTMsMjUxLDI1NSwxNzgsODgsNywyNTQsMjcsNTksNjgsMjU1LDEwLDMzLDIsMjU1LDI0OCw5Nyw1OSwwLDI2LDMwLDE0NiwxLDE3NiwxNDcsMTAsMCw5NSwxMjEsMjA3LDEsMTg4LDg4LDI0LDAsMTg1LDk0LDI1NCwyNTQsMTE1LDU1LDIwMSwwLDI0LDUwLDcwLDAsMTIwLDUzLDYsMCwxNDIsNjYsMTQ2LDAsMjI4LDIyNiwyNDksMjU1LDEwNCwxOTIsMjIyLDEsMTczLDY4LDIxOSwwLDE2MiwxODQsMzYsMjU1LDE0MywxMDIsMTM3LDI1NSwxNTcsMTEsMjMsMCwxMjUsNDUsOTgsMCwyMzUsOTMsMjI1LDI1NCw1NiwxMTIsMTYwLDI1NSw3MCwxMTYsMjQzLDEsMTUzLDI0OSw1NSwyNTUsMTI5LDM5LDE3LDEsMjQxLDgwLDI0NCwwLDg3LDY5LDIxLDEsOTQsMjI4LDczLDI1NSw3OCw2Niw2NSwyNTUsMTk0LDIyNywyMzEsMCw2MSwxNDYsODcsMjU1LDE3MywxNTUsMjMsMjU1LDExMiwxMTYsMjE5LDI1NCwyMTYsMzgsMTEsMjU1LDEzMSwxODYsMTMzLDAsOTQsMjEyLDE4NywwLDEwMCw0Nyw5MSwwLDIwNCwyNTQsMTc1LDI1NSwyMjIsMTgsMjE1LDI1NCwxNzMsNjgsMTA4LDI1NSwyMjcsMjI4LDc5LDI1NSwzOCwyMjEsMjEzLDAsMTYzLDIyNywxNTAsMjU0LDMxLDE5MCwxOCwwLDE2MCwxNzksMTEsMSwxMCw5MCw5NCwyNTUsMjIwLDE3NCw4OCwwLDE2MywyMTEsMjI5LDI1NSwxOTksMTM2LDUyLDAsMTMwLDk1LDIyMSwyNTUsMTQwLDE4OCwyMzEsMjU0LDEzOSwxMTMsMTI4LDI1NSwxMTcsMTcxLDIzNiwyNTQsNDksMjIwLDIwLDI1NSw1OSwyMCwxNzEsMjU1LDIyOCwxMDksMTg4LDAsMjAsMjI1LDMyLDI1NCwxOTUsMTYsMTc0LDAsMjI3LDI1NCwxMzYsMSwxMzUsMzksMTA1LDAsMTUwLDc3LDIwNiwyNTUsMjEwLDIzOCwyMjZdLFwiaThcIixBTExPQ19OT05FLFJ1bnRpbWUuR0xPQkFMX0JBU0UrMTAyNDApO2FsbG9jYXRlKFs1NSwyMTIsMTMyLDI1NCwyMzksNTcsMTI0LDAsMTcwLDE5NCw5MywyNTUsMjQ5LDE2LDI0NywyNTUsMjQsMTUxLDYyLDI1NSwxMCwxNTEsMTAsMCw3OSwxMzksMTc4LDI1NSwxMjAsMjQyLDIwMiwwLDI2LDIxOSwyMTMsMCw2MiwxMjUsMzUsMjU1LDE0NCwyLDEwOCwyNTUsMjMwLDMzLDgzLDI1NSw4MSw0NSwyMTYsMSwyMjQsNjIsMTcsMCwyMTQsMjE3LDEyNSwwLDk4LDE1MywxNTMsMjU1LDE3OSwxNzYsMTA2LDI1NCwxMzEsOTMsMTM4LDI1NSwxMDksNjIsMzYsMjU1LDE3OCwxMjEsMzIsMjU1LDEyMCwyNTIsNzAsMCwyMjAsMjQ4LDM3LDAsMjA0LDg4LDEwMywxLDEyOCwyMjAsMjUxLDI1NSwyMzYsMjI3LDcsMSwxMDYsNDksMTk4LDI1NSw2MCw1NiwxMDcsMCw5OSwxMTQsMjM4LDAsMjIwLDIwNCw5NCwxLDczLDE4NywxLDAsODksMTU0LDM0LDAsNzgsMjE3LDE2NSwyNTUsMTQsMTk1LDI0OSwyNTUsOSwyMzAsMjUzLDI1NSwyMDUsMTM1LDI0NSwwLDI2LDI1Miw3LDI1NSw4NCwyMDUsMjcsMSwxMzQsMiwxMTIsMCwzNywxNTgsMzIsMCwyMzEsOTEsMjM3LDI1NSwxOTEsMTcwLDIwNCwyNTUsMTUyLDcsMjIyLDAsMTA5LDE5Miw0OSwwLDE5MywxNjYsMTQ2LDI1NSwyMzIsMTksMTgxLDI1NSwxMDUsMTQyLDUyLDI1NSwxMDMsMTYsMjcsMSwyNTMsMjAwLDE2NSwwLDE5NSwyMTcsNCwyNTUsNTIsMTg5LDE0NCwyNTUsMTIzLDE1NSwxNjAsMjU0LDg3LDEzMCw1NCwyNTUsNzgsMTIwLDYxLDI1NSwxNCw1Niw0MSwwLDI1LDQxLDEyNSwyNTUsODcsMTY4LDI0NSwwLDIxNCwxNjUsNzAsMCwyMTIsMTY5LDYsMjU1LDIxOSwyMTEsMTk0LDI1NCw3Miw5MywxNjQsMjU1LDE5NywzMywxMDMsMjU1LDQzLDE0MiwxNDEsMCwxMzEsMjI1LDE3MiwwLDI0NCwxMDUsMjgsMCw2OCw2OCwyMjUsMCwxMzYsODQsMTMsMjU1LDEzMCw1Nyw0MCwyNTQsMTM5LDc3LDU2LDAsODQsMTUwLDUzLDAsNTQsOTUsMTU3LDAsMTQ0LDEzLDE3NywyNTQsOTUsMTE1LDE4NiwwLDExNywyMywxMTgsMjU1LDI0NCwxNjYsMjQxLDI1NSwxMSwxODYsMTM1LDAsMTc4LDEwNiwyMDMsMjU1LDk3LDIxOCw5MywwLDQzLDI1Myw0NSwwLDE2NCwxNTIsNCwwLDEzOSwxMTgsMjM5LDAsOTYsMSwyNCwyNTQsMjM1LDE1MywyMTEsMjU1LDE2OCwxMTAsMjAsMjU1LDUwLDIzOSwxNzYsMCwxMTQsNDEsMjMyLDAsMTkzLDI1MCw1MywwLDI1NCwxNjAsMTExLDI1NCwxMzYsMTIyLDQxLDI1NSw5NywxMDgsNjcsMCwyMTUsMTUyLDIzLDI1NSwxNDAsMjA5LDIxMiwwLDQyLDE4OSwxNjMsMCwyMDIsNDIsNTAsMjU1LDEwNiwxMDYsMTg5LDI1NSwxOTAsNjgsMjE3LDI1NSwyMzMsNTgsMTE3LDAsMjI5LDIyMCwyNDMsMSwxOTcsMyw0LDAsMzcsMTIwLDU0LDI1NCw0LDE1NiwxMzQsMjU1LDM2LDYxLDE3MSwyNTQsMTY1LDEzNiwxMDAsMjU1LDIxMiwyMzIsMTQsMCw5MCwxNzQsMTAsMCwyMTYsMTk4LDY1LDI1NSwxMiwzLDY0LDAsMTE2LDExMywxMTUsMjU1LDI0OCwxMDMsOCwwLDIzMSwxMjUsMTgsMjU1LDE2MCwyOCwxOTcsMCwzMCwxODQsMzUsMSwyMjMsNzMsMjQ5LDI1NSwxMjMsMjAsNDYsMjU0LDEzNSw1NiwzNywyNTUsMTczLDEzLDIyOSwxLDExOSwxNjEsMzQsMjU1LDI0NSw2MSw3MywwLDIwNSwxMjUsMTEyLDAsMTM3LDEwNCwxMzQsMCwyMTcsMjQ2LDMwLDI1NSwyMzcsMTQyLDE0MywwLDY1LDE1OSwxMDIsMjU1LDEwOCwxNjQsMTkwLDAsMjE5LDExNywxNzMsMjU1LDM0LDM3LDEyMCwyNTQsMjAwLDY5LDgwLDAsMzEsMTI0LDIxOCwyNTQsNzQsMjcsMTYwLDI1NSwxODYsMTU0LDE5OSwyNTUsNzEsMTk5LDI1MiwwLDEwNCw4MSwxNTksMSwxNywyMDAsMzksMCwyMTEsNjEsMTkyLDEsMjYsMjM4LDkxLDAsMTQ4LDIxNywxMiwwLDU5LDkxLDIxMywyNTUsMTEsODEsMTgzLDI1NSwxMjksMjMwLDEyMiwyNTUsMTE0LDIwMywxNDUsMSwxMTksMTgwLDY2LDI1NSw3MiwxMzgsMTgwLDAsMjI0LDE0OSwxMDYsMCwxMTksODIsMTA0LDI1NSwyMDgsMTQwLDQzLDAsOTgsOSwxODIsMjU1LDIwNSwxMDEsMTM0LDI1NSwxOCwxMDEsMzgsMCw5NSwxOTcsMTY2LDI1NSwyMDMsMjQxLDE0NywwLDYyLDIwOCwxNDUsMjU1LDEzMywyNDYsMjUxLDAsMiwxNjksMTQsMCwxMywyNDcsMTg0LDAsMTQyLDcsMjU0LDAsMzYsMjAwLDIzLDI1NSw4OCwyMDUsMjIzLDAsOTEsMTI5LDUyLDI1NSwyMSwxODYsMzAsMCwxNDMsMjI4LDIxMCwxLDI0NywyMzQsMjQ4LDI1NSwyMzAsNjksMzEsMjU0LDE3NiwxODYsMTM1LDI1NSwyMzgsMjA1LDUyLDEsMTM5LDc5LDQzLDAsMTcsMTc2LDIxNywyNTQsMzIsMjQzLDY3LDAsMjQyLDExMSwyMzMsMCw0NCwzNSw5LDI1NSwyMjcsMTE0LDgxLDEsNCw3MSwxMiwyNTUsMzgsMTA1LDE5MSwwLDcsMTE3LDUwLDI1NSw4MSw3OSwxNiwwLDYzLDY4LDY1LDI1NSwxNTcsMzYsMTEwLDI1NSw3NywyNDEsMywyNTUsMjI2LDQ1LDI1MSwxLDE0MiwyNSwyMDYsMCwxMjAsMTIzLDIwOSwxLDI4LDI1NCwyMzgsMjU1LDUsMTI4LDEyNiwyNTUsOTEsMjIyLDIxNSwyNTUsMTYyLDE1LDE5MSwwLDg2LDI0MCw3MywwLDEzNSwxODUsODEsMjU0LDQ0LDI0MSwxNjMsMCwyMTIsMjE5LDIxMCwyNTUsMTEyLDE2MiwxNTUsMCwyMDcsMTAxLDExOCwwLDE2OCw3Miw1NiwyNTUsMTk2LDUsNTIsMCw3MiwxNzIsMjQyLDI1NSwxMjYsMjIsMTU3LDI1NSwxNDYsOTYsNTksMjU1LDE2MiwxMjEsMTUyLDI1NCwxNDAsMTYsOTUsMCwxOTUsMjU0LDIwMCwyNTQsODIsMTUwLDE2MiwwLDExOSw0MywxNDUsMjU0LDIwNCwxNzIsNzgsMjU1LDE2NiwyMjQsMTU5LDAsMTA0LDE5LDIzNywyNTUsMjQ1LDEyNiwyMDgsMjU1LDIyNiw1OSwyMTMsMCwxMTcsMjE3LDE5NywwLDE1Miw3MiwyMzcsMCwyMjAsMzEsMjMsMjU0LDE0LDkwLDIzMSwyNTUsMTg4LDIxMiw2NCwxLDYwLDEwMSwyNDYsMjU1LDg1LDI0LDg2LDAsMSwxNzcsMTA5LDAsMTQ2LDgzLDMyLDEsNzUsMTgyLDE5MiwwLDExOSwyNDEsMjI0LDAsMTg1LDIzNywyNywyNTUsMTg0LDEwMSw4MiwxLDIzNSwzNyw3NywyNTUsMjUzLDEzNCwxOSwwLDIzMiwyNDYsMTIyLDAsNjAsMTA2LDE3OSwwLDE5NSwxMSwxMiwwLDEwOSw2NiwyMzUsMSwxMjUsMTEzLDU5LDAsNjEsNDAsMTY0LDAsMTc1LDEwNCwyNDAsMCwyLDQ3LDE4NywyNTUsNTAsMTIsMTQxLDAsMTk0LDEzOSwxODEsMjU1LDEzNSwyNTAsMTA0LDAsOTcsOTIsMjIyLDI1NSwyMTcsMTQ5LDIwMSwyNTUsMjAzLDI0MSwxMTgsMjU1LDc5LDE1MSw2NywwLDEyMiwxNDIsMjE4LDI1NSwxNDksMjQ1LDIzOSwwLDEzOCw0MiwyMDAsMjU0LDgwLDM3LDk3LDI1NSwxMjQsMTEyLDE2NywyNTUsMzYsMTM4LDg3LDI1NSwxMzAsMjksMTQ3LDI1NSwyNDEsODcsNzgsMjU1LDIwNCw5NywxOSwxLDE3NywyMDksMjIsMjU1LDI0NywyMjcsMTI3LDI1NCw5OSwxMTksODMsMjU1LDIxMiwyNSwxOTgsMSwxNiwxNzksMTc5LDAsMTQ1LDc3LDE3MiwyNTQsODksMTUzLDE0LDI1NSwyMTgsMTg5LDE2NywwLDEwNywyMzMsNTksMjU1LDM1LDMzLDI0MywyNTQsNDQsMTEyLDExMiwyNTUsMTYxLDEyNyw3OSwxLDIwNCwxNzUsMTAsMCw0MCwyMSwxMzgsMjU0LDEwNCwxMTYsMjI4LDAsMTk5LDk1LDEzNywyNTUsMTMzLDE5MCwxNjgsMjU1LDE0NiwxNjUsMjM0LDEsMTgzLDk5LDM5LDAsMTgzLDIyMCw1NCwyNTQsMjU1LDIyMiwxMzMsMCwxNjIsMjE5LDEyMSwyNTQsNjMsMjM5LDYsMCwyMjUsMTAyLDU0LDI1NSwyNTEsMTgsMjQ2LDAsNCwzNCwxMjksMSwxMzUsMzYsMTMxLDAsMjA2LDUwLDU5LDEsMTUsOTcsMTgzLDAsMTcxLDIxNiwxMzUsMjU1LDEwMSwxNTIsNDMsMjU1LDE1MCwyNTEsOTEsMCwzOCwxNDUsOTUsMCwzNCwyMDQsMzgsMjU0LDE3OCwxNDAsODMsMjU1LDI1LDEyOSwyNDMsMjU1LDc2LDE0NCwzNywwLDEwNiwzNiwyNiwyNTQsMTE4LDE0NCwxNzIsMjU1LDY4LDE4NiwyMjksMjU1LDEwNywxNjEsMjEzLDI1NSw0NiwxNjMsNjgsMjU1LDE0OSwxNzAsMjUzLDAsMTg3LDE3LDE1LDAsMjE4LDE2MCwxNjUsMjU1LDE3MSwzNSwyNDYsMSw5NiwxMywxOSwwLDE2NSwyMDMsMTE3LDAsMjE0LDEwNywxOTIsMjU1LDI0NCwxMjMsMTc3LDEsMTAwLDMsMTA0LDAsMTc4LDI0Miw5NywyNTUsMjUxLDc2LDEzMCwyNTUsMjExLDc3LDQyLDEsMjUwLDc5LDcwLDI1NSw2MywyNDQsODAsMSwxMDUsMTAxLDI0NiwwLDYxLDEzNiw1OCwxLDIzOCw5MSwyMTMsMCwxNCw1OSw5OCwyNTUsMTY3LDg0LDc3LDAsMTcsMTMyLDQ2LDI1NCw1NywxNzUsMTk3LDI1NSwxODUsNjIsMTg0LDAsNzYsNjQsMjA3LDAsMTcyLDE3NSwyMDgsMjU0LDE3NSw3NCwzNywwLDEzOCwyNywyMTEsMjU0LDE0OCwxMjUsMTk0LDAsMTAsODksODEsMCwxNjgsMjAzLDEwMSwyNTUsNDMsMjEzLDIwOSwxLDIzNSwyNDUsNTQsMCwzMCwzNSwyMjYsMjU1LDksMTI2LDcwLDAsMjI2LDEyNSw5NCwyNTQsMTU2LDExNywyMCwyNTUsNTcsMjQ4LDExMiwxLDIzMCw0OCw2NCwyNTUsMTY0LDkyLDE2NiwxLDIyNCwyMTQsMjMwLDI1NSwzNiwxMjAsMTQzLDAsNTUsOCw0MywyNTUsMjUxLDEsMjQ1LDEsMTA2LDk4LDE2NSwwLDc0LDEwNywxMDYsMjU0LDUzLDQsNTQsMjU1LDkwLDE3OCwxNTAsMSwzLDEyMCwxMjMsMjU1LDI0NCw1LDg5LDEsMTE0LDI1MCw2MSwyNTUsMjU0LDE1Myw4MiwxLDc3LDE1LDE3LDAsNTcsMjM4LDkwLDEsOTUsMjIzLDIzMCwwLDIzNiw1Miw0NywyNTQsMTAzLDE0OCwxNjQsMjU1LDEyMSwyMDcsMzYsMSwxOCwxNiwxODUsMjU1LDc1LDIwLDc0LDAsMTg3LDExLDEwMSwwLDQ2LDQ4LDEyOSwyNTUsMjIsMjM5LDIxMCwyNTUsNzcsMjM2LDEyOSwyNTUsMTExLDc3LDIwNCwyNTUsNjEsNzIsOTcsMjU1LDE5OSwyMTcsMjUxLDI1NSw0MiwyMTUsMjA0LDAsMTMzLDE0NSwyMDEsMjU1LDU3LDIzMCwxNDYsMSwyMzUsMTAwLDE5OCwwLDE0Niw3MywzNSwyNTQsMTA4LDE5OCwyMCwyNTUsMTgyLDc5LDIxMCwyNTUsODIsMTAzLDEzNiwwLDI0NiwxMDgsMTc2LDAsMzQsMTcsNjAsMjU1LDE5LDc0LDExNCwyNTQsMTY4LDE3MCw3OCwyNTUsMTU3LDIzOSwyMCwyNTUsMTQ5LDQxLDE2OCwwLDU4LDEyMSwyOCwwLDc5LDE3OSwxMzQsMjU1LDIzMSwxMjEsMTM1LDI1NSwxNzQsMjA5LDk4LDI1NSwyNDMsMTIyLDE5MCwwLDE3MSwxNjYsMjA1LDAsMjEyLDExNiw0OCwwLDI5LDEwOCw2NiwyNTUsMTYyLDIyMiwxODIsMSwxNCwxMTksMjEsMCwyMTMsMzksMjQ5LDI1NSwyNTQsMjIzLDIyOCwyNTUsMTgzLDE2NSwxOTgsMCwxMzMsMTkwLDQ4LDAsMTI0LDIwOCwxMDksMjU1LDExOSwxNzUsODUsMjU1LDksMjA5LDEyMSwxLDQ4LDE3MSwxODksMjU1LDE5NSw3MSwxMzQsMSwxMzYsMjE5LDUxLDI1NSwxODIsOTEsMTQxLDI1NCw0OSwxNTksNzIsMCwzNSwxMTgsMjQ1LDI1NSwxMTIsMTg2LDIyNywyNTUsNTksMTM3LDMxLDAsMTM3LDQ0LDE2MywwLDExNCwxMDMsNjAsMjU0LDgsMjEzLDE1MCwwLDE2MiwxMCwxMTMsMjU1LDE5NCwxMDQsNzIsMCwyMjAsMTMxLDExNiwyNTUsMTc4LDc5LDkyLDAsMjAzLDI1MCwyMTMsMjU0LDkzLDE5MywxODksMjU1LDEzMCwyNTUsMzQsMjU0LDIxMiwxODgsMTUxLDAsMTM2LDE3LDIwLDI1NSwyMCwxMDEsODMsMjU1LDIxMiwyMDYsMTY2LDAsMjI5LDIzOCw3MywyNTUsMTUxLDc0LDMsMjU1LDE2OCw4NywyMTUsMCwxNTUsMTg4LDEzMywyNTUsMTY2LDEyOSw3MywwLDI0MCw3OSwxMzMsMjU1LDE3OCwyMTEsODEsMjU1LDIwMyw3MiwxNjMsMjU0LDE5MywxNjgsMTY1LDAsMTQsMTY0LDE5OSwyNTQsMzAsMjU1LDIwNCwwLDY1LDcyLDkxLDEsMTY2LDc0LDEwMiwyNTUsMjAwLDQyLDAsMjU1LDE5NCwxMTMsMjI3LDI1NSw2NiwyMywyMDgsMCwyMjksMjE2LDEwMCwyNTUsMjQsMjM5LDI2LDAsMTAsMjMzLDYyLDI1NSwxMjMsMTAsMTc4LDEsMjYsMzYsMTc0LDI1NSwxMTksMjE5LDE5OSwxLDQ1LDE2MywxOTAsMCwxNiwxNjgsNDIsMCwxNjYsNTcsMTk4LDI1NSwyOCwyNiwyNiwwLDEyNiwxNjUsMjMxLDAsMjUxLDEwOCwxMDAsMjU1LDYxLDIyOSwxMjEsMjU1LDU4LDExOCwxMzgsMCw3NiwyMDcsMTcsMCwxMywzNCwxMTIsMjU0LDg5LDE2LDE2OCwwLDM3LDIwOCwxMDUsMjU1LDM1LDIwMSwyMTUsMjU1LDQwLDEwNiwxMDEsMjU0LDYsMjM5LDExNCwwLDQwLDEwMywyMjYsMjU0LDI0NiwxMjcsMTEwLDI1NSw2MywxNjcsNTgsMCwxMzIsMjQwLDE0MiwwLDUsMTU4LDg4LDI1NSwxMjksNzMsMTU4LDI1NSw5NCw4OSwxNDYsMCwyMzAsNTQsMTQ2LDAsOCw0NSwxNzMsMCw3OSwxNjksMSwwLDExNSwxODYsMjQ3LDAsODQsNjQsMTMxLDAsNjcsMjI0LDI1MywyNTUsMjA3LDE4OSw2NCwwLDE1NCwyOCw4MSwxLDQ1LDE4NCw1NCwyNTUsODcsMjEyLDIyNCwyNTUsMCw5Niw3MywyNTUsMTI5LDMzLDIzNSwxLDUyLDY2LDgwLDI1NSwyNTEsMTc0LDE1NSwyNTUsNCwxNzksMzcsMCwyMzQsMTY0LDkzLDI1NCw5MywxNzUsMjUzLDAsMTk4LDY5LDg3LDI1NSwyMjQsMTA2LDQ2LDAsOTksMjksMjEwLDAsNjIsMTg4LDExNCwyNTUsNDQsMjM0LDgsMCwxNjksMTc1LDI0NywyNTUsMjMsMTA5LDEzNywyNTUsMjI5LDE4MiwzOSwwLDE5MiwxNjUsOTQsMjU0LDI0NSwxMDEsMjE3LDAsMTkxLDg4LDk2LDAsMTk2LDk0LDk5LDI1NSwxMDYsMjM4LDExLDI1NCw1MywxMjYsMjQzLDAsOTQsMSwxMDEsMjU1LDQ2LDE0NywyLDAsMjAxLDEyNCwxMjQsMjU1LDE0MSwxMiwyMTgsMCwxMywxNjYsMTU3LDEsNDgsMjUxLDIzNywyNTUsMTU1LDI1MCwxMjQsMjU1LDEwNiwxNDgsMTQ2LDI1NSwxODIsMTMsMjAyLDAsMjgsNjEsMTY3LDAsMjE3LDE1Miw4LDI1NCwyMjAsMTMwLDQ1LDI1NSwyMDAsMjMwLDI1NSwxLDU1LDY1LDg3LDI1NSw5MywxOTEsOTcsMjU0LDExNCwyNTEsMTQsMCwzMiwxMDUsOTIsMSwyNiwyMDcsMTQxLDAsMjQsMjA3LDEzLDI1NCwyMSw1MCw0OCwyNTUsMTg2LDE0OCwxMTYsMjU1LDIxMSw0MywyMjUsMCwzNywzNCwxNjIsMjU0LDE2NCwyMTAsNDIsMjU1LDY4LDIzLDk2LDI1NSwxODIsMjE0LDgsMjU1LDI0NSwxMTcsMTM3LDI1NSw2NiwxOTUsNTAsMCw3NSwxMiw4MywyNTQsODAsMTQwLDE2NCwwLDksMTY1LDM2LDEsMjI4LDExMCwyMjcsMCwyNDEsMTcsOTAsMSwyNSw1MiwyMTIsMCw2LDIyMywxMiwyNTUsMTM5LDI0Myw1NywwLDEyLDExMyw3NSwxLDI0NiwxODMsMTkxLDI1NSwyMTMsMTkxLDY5LDI1NSwyMzAsMTUsMTQyLDAsMSwxOTUsMTk2LDI1NSwxMzgsMTcxLDQ3LDI1NSw2NCw2MywxMDYsMSwxNiwxNjksMjE0LDI1NSwyMDcsMTc0LDU2LDEsODgsNzMsMTMzLDI1NSwxODIsMTMzLDE0MCwwLDE3NywxNCwyNSwyNTUsMTQ3LDE4NCw1MywyNTUsMTAsMjI3LDE2MSwyNTUsMTIwLDIxNiwyNDQsMjU1LDczLDc3LDIzMywwLDE1NywyMzgsMTM5LDEsNTksNjUsMjMzLDAsNzAsMjUxLDIxNiwxLDQxLDE4NCwxNTMsMjU1LDMyLDIwMywxMTIsMCwxNDYsMTQ3LDI1MywwLDg3LDEwMSwxMDksMSw0NCw4MiwxMzMsMjU1LDI0NCwxNTAsNTMsMjU1LDk0LDE1MiwyMzIsMjU1LDU5LDkzLDM5LDI1NSw4OCwxNDcsMjIwLDI1NSw3OCw4MSwxMywxLDMyLDQ3LDI1MiwyNTUsMTYwLDE5LDExNCwyNTUsOTMsMTA3LDM5LDI1NSwxMTgsMTYsMjExLDEsMTg1LDExOSwyMDksMjU1LDIyNywyMTksMTI3LDI1NCw4OCwxMDUsMjM2LDI1NSwxNjIsMTEwLDIzLDI1NSwzNiwxNjYsMTEwLDI1NSw5MSwyMzYsMjIxLDI1NSw2NiwyMzQsMTE2LDAsMTExLDE5LDI0NCwyNTQsMTAsMjMzLDI2LDAsMzIsMTgzLDYsMjU0LDIsMTkxLDI0MiwwLDIxOCwxNTYsNTMsMjU0LDQxLDYwLDcwLDI1NSwxNjgsMjM2LDExMSwwLDEyMSwxODUsMTI2LDI1NSwyMzgsMTQyLDIwNywyNTUsNTUsMTI2LDUyLDAsMjIwLDEyOSwyMDgsMjU0LDgwLDIwNCwxNjQsMjU1LDY3LDIzLDE0NCwyNTQsMjE4LDQwLDEwOCwyNTUsMTI3LDIwMiwxNjQsMCwyMDMsMzMsMywyNTUsMiwxNTgsMCwwLDM3LDk2LDE4OCwyNTUsMTkyLDQ5LDc0LDAsMTA5LDQsMCwwLDExMSwxNjcsMTAsMjU0LDkxLDIxOCwxMzUsMjU1LDIwMyw2NiwxNzMsMjU1LDE1MCwxOTQsMjI2LDAsMjAxLDI1Myw2LDI1NSwxNzQsMTAyLDEyMSwwLDIwNSwxOTEsMTEwLDAsNTMsMTk0LDQsMCw4MSw0MCw0NSwyNTQsMzUsMTAyLDE0MywyNTUsMTIsMTA4LDE5OCwyNTUsMTYsMjcsMjMyLDI1NSwyNTIsNzEsMTg2LDEsMTc2LDExMCwxMTQsMCwxNDIsMywxMTcsMSwxMTMsNzcsMTQyLDAsMTksMTU2LDE5NywxLDkyLDQ3LDI1MiwwLDUzLDIzMiwyMiwxLDU0LDE4LDIzNSwwLDQ2LDM1LDE4OSwyNTUsMjM2LDIxMiwxMjksMCwyLDk2LDIwOCwyNTQsMjAwLDIzOCwxOTksMjU1LDU5LDE3NSwxNjQsMjU1LDE0Niw0MywyMzEsMCwxOTQsMjE3LDUyLDI1NSwzLDIyMywxMiwwLDEzOCw1NCwxNzgsMjU0LDg1LDIzNSwyMDcsMCwyMzIsMjA3LDM0LDAsNDksNTIsNTAsMjU1LDE2NiwxMTMsODksMjU1LDEwLDQ1LDIxNiwyNTUsNjIsMTczLDI4LDAsMTExLDE2NSwyNDYsMCwxMTgsMTE1LDkxLDI1NSwxMjgsODQsNjAsMCwxNjcsMTQ0LDIwMywwLDg3LDEzLDI0MywwLDIyLDMwLDIyOCwxLDE3NywxMTMsMTQ2LDI1NSwxMjksMTcwLDIzMCwyNTQsMjUyLDE1MywxMjksMjU1LDE0NSwyMjUsNDMsMCw3MCwyMzEsNSwyNTUsMTIyLDEwNSwxMjYsMjU0LDg2LDI0NiwxNDgsMjU1LDExMCwzNywxNTQsMjU0LDIwOSwzLDkxLDAsNjgsMTQ1LDYyLDAsMjI4LDE2LDE2NSwyNTUsNTUsMjIxLDI0OSwyNTQsMTc4LDIxMCw5MSwwLDgzLDE0NiwyMjYsMjU0LDY5LDE0NiwxODYsMCw5MywyMTAsMTA0LDI1NCwxNiwyNSwxNzMsMCwyMzEsMTg2LDM4LDAsMTg5LDEyMiwxNDAsMjU1LDI1MSwxMywxMTIsMjU1LDEwNSwxMTAsOTMsMCwyNTEsNzIsMTcwLDAsMTkyLDIzLDIyMywyNTUsMjQsMywyMDIsMSwyMjUsOTMsMjI4LDAsMTUzLDE0NywxOTksMjU0LDEwOSwxNzAsMjIsMCwyNDgsMTAxLDI0NiwyNTUsMTc4LDEyNCwxMiwyNTUsMTc4LDI1NCwxMDIsMjU0LDU1LDQsNjUsMCwxMjUsMjE0LDE4MCwwLDE4Myw5NiwxNDcsMCw0NSwxMTcsMjMsMjU0LDEzMiwxOTEsMjQ5LDAsMTQzLDE3NiwyMDMsMjU0LDEzNiwxODMsNTQsMjU1LDE0NiwyMzQsMTc3LDAsMTQ2LDEwMSw4NiwyNTUsNDQsMTIzLDE0MywxLDMzLDIwOSwxNTIsMCwxOTIsOTAsNDEsMjU0LDgzLDE1LDEyNSwyNTUsMjEzLDE3Miw4MiwwLDIxNSwxNjksMTQ0LDAsMTYsMTMsMzQsMCwzMiwyMDksMTAwLDI1NSw4NCwxOCwyNDksMSwxOTcsMTcsMjM2LDI1NSwyMTcsMTg2LDIzMCwwLDQ5LDE2MCwxNzYsMjU1LDExMSwxMTgsOTcsMjU1LDIzNywxMDQsMjM1LDAsNzksNTksOTIsMjU0LDY5LDI0OSwxMSwyNTUsMzUsMTcyLDc0LDEsMTksMTE4LDY4LDAsMjIyLDEyNCwxNjUsMjU1LDE4MCw2NiwzNSwyNTUsODYsMTc0LDI0NiwwLDQzLDc0LDExMSwyNTUsMTI2LDE0NCw4NiwyNTUsMjI4LDIzNCw5MSwwLDI0MiwyMTMsMjQsMjU0LDY5LDQ0LDIzNSwyNTUsMjIwLDE4MCwzNSwwLDgsMjQ4LDcsMjU1LDEwMiw0Nyw5MiwyNTUsMjQwLDIwNSwxMDIsMjU1LDExMywyMzAsMTcxLDEsMzEsMTg1LDIwMSwyNTUsMTk0LDI0Niw3MCwyNTUsMTIyLDE3LDE4NywwLDEzNCw3MCwxOTksMjU1LDE0OSwzLDE1MCwyNTUsMTE3LDYzLDEwMywwLDY1LDEwNCwxMjMsMjU1LDIxMiw1NCwxOSwxLDYsMTQxLDg4LDAsODMsMTM0LDI0MywyNTUsMTM2LDUzLDEwMywwLDE2OSwyNywxODAsMCwxNzcsNDksMjQsMCwxMTEsNTQsMTY3LDAsMTk1LDYxLDIxNSwyNTUsMzEsMSwxMDgsMSw2MCw0Miw3MCwwLDE4NSwzLDE2MiwyNTUsMTk0LDE0OSw0MCwyNTUsMjQ2LDEyNywzOCwyNTQsMTkwLDExOSwzOCwyNTUsNjEsMTE5LDgsMSw5NiwxNjEsMjE5LDI1NSw0MiwyMDMsMjIxLDEsMTc3LDI0MiwxNjQsMjU1LDI0NSwxNTksMTAsMCwxMTYsMTk2LDAsMCw1LDkzLDIwNSwyNTQsMTI4LDEyNywxNzksMCwxMjUsMjM3LDI0NiwyNTUsMTQ5LDE2MiwyMTcsMjU1LDg3LDM3LDIwLDI1NCwxNDAsMjM4LDE5MiwwLDksOSwxOTMsMCw5NywxLDIyNiwwLDI5LDM4LDEwLDAsMCwxMzYsNjMsMjU1LDIyOSw3MiwyMTAsMjU0LDM4LDEzNCw5MiwyNTUsNzgsMjE4LDIwOCwxLDEwNCwzNiw4NCwyNTUsMTIsNSwxOTMsMjU1LDI0MiwxNzUsNjEsMjU1LDE5MSwxNjksNDYsMSwxNzksMTQ3LDE0NywyNTUsMTEzLDE5MCwxMzksMjU0LDEyNSwxNzIsMzEsMCwzLDc1LDI1MiwyNTQsMjE1LDM2LDE1LDAsMTkzLDI3LDI0LDEsMjU1LDY5LDE0OSwyNTUsMTEwLDEyOSwxMTgsMCwyMDMsOTMsMjQ5LDAsMTM4LDEzNyw2NCwyNTQsMzgsNzAsNiwwLDE1MywxMTYsMjIyLDAsMTYxLDc0LDEyMywwLDE5Myw5OSw3OSwyNTUsMTE4LDU5LDk0LDI1NSw2MSwxMiw0MywxLDE0NiwxNzcsMTU3LDAsNDYsMTQ3LDE5MSwwLDE2LDI1NSwzOCwwLDExLDUxLDMxLDEsNjAsNTgsOTgsMjU1LDExMSwxOTQsNzcsMSwxNTQsOTEsMjQ0LDAsMTQwLDQwLDE0NCwxLDE3MywxMCwyNTEsMCwyMDMsMjA5LDUwLDI1NCwxMDgsMTMwLDc4LDAsMjI4LDE4MCw5MCwwLDE3NCw3LDI1MCwwLDMxLDE3NCw2MCwwLDQxLDE3MSwzMCwwLDExNiw5OSw4MiwyNTUsMTE4LDE5MywxMzksMjU1LDE4NywxNzMsMTk4LDI1NCwyMTgsMTExLDU2LDAsMTg1LDEyMywyMTYsMCwyNDksMTU4LDUyLDAsNTIsMTgwLDkzLDI1NSwyMDEsOSw5MSwyNTUsNTYsNDUsMTY2LDI1NCwxMzIsMTU1LDIwMywyNTUsNTgsMjMyLDExMCwwLDUyLDIxMSw4OSwyNTUsMjUzLDAsMTYyLDEsOSw4NywxODMsMCwxNDUsMTM2LDQ0LDEsOTQsMTIyLDI0NSwwLDg1LDE4OCwxNzEsMSwxNDcsOTIsMTk4LDAsMCw4LDEwNCwwLDMwLDk1LDE3NCwwLDIyMSwyMzAsNTIsMSwyNDcsMjQ3LDIzNSwyNTUsMTM3LDE3NCw1MywyNTUsMzUsMjEsMjA0LDI1NSw3MSwyMjcsMjE0LDEsMjMyLDgyLDE5NCwwLDExLDQ4LDIyNywyNTUsMTcwLDczLDE4NCwyNTUsMTk4LDI1MSwyNTIsMjU0LDQ0LDExMiwzNCwwLDEzMSwxMDEsMTMxLDI1NSw3MiwxNjgsMTg3LDAsMTMyLDEzNSwxMjUsMjU1LDEzOCwxMDQsOTcsMjU1LDIzOCwxODQsMTY4LDI1NSwyNDMsMTA0LDg0LDI1NSwxMzUsMjE2LDIyNiwyNTUsMTM5LDE0NCwyMzcsMCwxODgsMTM3LDE1MCwxLDgwLDU2LDE0MCwyNTUsODYsMTY5LDE2NywyNTUsMTk0LDc4LDI1LDI1NSwyMjAsMTcsMTgwLDI1NSwxNywxMywxOTMsMCwxMTcsMTM3LDIxMiwyNTUsMTQxLDIyNCwxNTEsMCw0OSwyNDQsMTc1LDAsMTkzLDk5LDE3NSwyNTUsMTksOTksMTU0LDEsMjU1LDY1LDYyLDI1NSwxNTYsMjEwLDU1LDI1NSwyNDIsMjQ0LDMsMjU1LDI1MCwxNCwxNDksMCwxNTgsODgsMjE3LDI1NSwxNTcsMjA3LDEzNCwyNTQsMjUxLDIzMiwyOCwwLDQ2LDE1NiwyNTEsMjU1LDE3MSw1NiwxODQsMjU1LDIzOSw1MSwyMzQsMCwxNDIsMTM4LDEzMSwyNTUsMjUsMjU0LDI0MywxLDEwLDIwMSwxOTQsMCw2Myw5Nyw3NSwwLDIxMCwyMzksMTYyLDAsMTkyLDIwMCwzMSwxLDExNywyMTQsMjQzLDAsMjQsNzEsMjIyLDI1NCw1NCw0MCwyMzIsMjU1LDc2LDE4MywxMTEsMjU0LDE0NCwxNCw4NywyNTUsMjE0LDc5LDEzNiwyNTUsMjE2LDE5NiwyMTIsMCwxMzIsMjcsMTQwLDI1NCwxMzEsNSwyNTMsMCwxMjQsMTA4LDE5LDI1NSwyOCwyMTUsNzUsMCw3NiwyMjIsNTUsMjU0LDIzMywxODIsNjMsMCw2OCwxNzEsMTkxLDI1NCw1MiwxMTEsMjIyLDI1NSwxMCwxMDUsNzcsMjU1LDgwLDE3MCwyMzUsMCwxNDMsMjQsODgsMjU1LDQ1LDIzMSwxMjEsMCwxNDgsMTI5LDIyNCwxLDYxLDI0Niw4NCwwLDI1Myw0NiwyMTksMjU1LDIzOSw3NiwzMywwLDQ5LDE0OCwxOCwyNTQsMjMwLDM3LDY5LDAsNjcsMTM0LDIyLDI1NCwxNDIsMTU1LDk0LDAsMzEsMTU3LDIxMSwyNTQsMjEzLDQyLDMwLDI1NSw0LDIyOCwyNDcsMjU0LDI1MiwxNzYsMTMsMjU1LDM5LDAsMzEsMjU0LDI0MSwyNDQsMjU1LDI1NSwxNzAsNDUsMTAsMjU0LDI1MywyMjIsMjQ5LDAsMjIyLDExNCwxMzIsMCwyNTUsNDcsNiwyNTUsMTgwLDE2MywxNzksMSw4NCw5NCwxNTEsMjU1LDg5LDIwOSw4MiwyNTQsMjI5LDUyLDE2OSwyNTUsMjEzLDIzNiwwLDEsMjE0LDU2LDIyOCwyNTUsMTM1LDExOSwxNTEsMjU1LDExMiwyMDEsMTkzLDAsODMsMTYwLDUzLDI1NCw2LDE1MSw2NiwwLDE4LDE2MiwxNywwLDIzMyw5Nyw5MSwwLDEzMSw1LDc4LDEsMTgxLDEyMCw1MywyNTUsMTE3LDk1LDYzLDI1NSwyMzcsMTE3LDE4NSwwLDE5MSwxMjYsMTM2LDI1NSwxNDQsMTE5LDIzMywwLDE4Myw1Nyw5NywxLDQ3LDIwMSwxODcsMjU1LDE2NywxNjUsMTE5LDEsNDUsMTAwLDEyNiwwLDIxLDk4LDYsMjU0LDE0NSwxNTAsOTUsMjU1LDEyMCw1NCwxNTIsMCwyMDksOTgsMTA0LDAsMTQzLDExMSwzMCwyNTQsMTg0LDE0OCwyNDksMCwyMzUsMjE2LDQ2LDAsMjQ4LDIwMiwxNDgsMjU1LDU3LDk1LDIyLDAsMjQyLDIyNSwxNjMsMCwyMzMsMjQ3LDIzMiwyNTUsNzEsMTcxLDE5LDI1NSwxMDMsMjQ0LDQ5LDI1NSw4NCwxMDMsOTMsMjU1LDY4LDEyMSwyNDQsMSw4MiwyMjQsMTMsMCw0MSw3OSw0MywyNTUsMjQ5LDIwNiwxNjcsMjU1LDIxNSw1MiwyMSwyNTQsMTkyLDMyLDIyLDI1NSwyNDcsMTExLDYwLDAsMTAxLDc0LDM4LDI1NSwyMiw5MSw4NCwyNTQsMjksMjgsMTMsMjU1LDE5OCwyMzEsMjE1LDI1NCwyNDQsMTU0LDIwMCwwLDIyMywxMzcsMjM3LDAsMjExLDEzMiwxNCwwLDk1LDY0LDIwNiwyNTUsMTcsNjIsMjQ3LDI1NSwyMzMsMTMxLDEyMSwxLDkzLDIzLDc3LDAsMjA1LDIwNCw1MiwyNTQsODEsMTg5LDEzNiwwLDE4MCwyMTksMTM4LDEsMTQzLDE4LDk0LDAsMjA0LDQzLDE0MCwyNTQsMTg4LDE3NSwyMTksMCwxMTEsOTgsMTQzLDI1NSwxNTEsNjMsMTYyLDI1NSwyMTEsNTAsNzEsMjU0LDE5LDE0Niw1MywwLDE0Niw0NSw4MywyNTQsMTc4LDgyLDIzOCwyNTUsMTYsMTMzLDg0LDI1NSwyMjYsMTk4LDkzLDI1NSwyMDEsOTcsMjAsMjU1LDEyMCwxMTgsMzUsMjU1LDExNCw1MCwyMzEsMjU1LDE2MiwyMjksMTU2LDI1NSwyMTEsMjYsMTIsMCwxMTQsMzksMTE1LDI1NSwyMDYsMjEyLDEzNCwwLDE5NywyMTcsMTYwLDI1NSwxMTYsMTI5LDk0LDI1NCwxOTksMjE1LDIxOSwyNTUsNzUsMjIzLDI0OSwxLDI1MywxMTYsMTgxLDI1NSwyMzIsMjE1LDEwNCwyNTUsMjI4LDEzMCwyNDYsMjU1LDE4NSwxMTcsODYsMCwxNCw1LDgsMCwyMzksMjksNjEsMSwyMzcsODcsMTMzLDI1NSwxMjUsMTQ2LDEzNywyNTQsMjA0LDE2OCwyMjMsMCw0NiwxNjgsMjQ1LDAsMTU0LDEwNSwyMiwwLDIyMCwyMTIsMTYxLDI1NSwxMDcsNjksMjQsMjU1LDEzNywyMTgsMTgxLDI1NSwyNDEsODQsMTk4LDI1NSwxMzAsMTIyLDIxMSwyNTUsMTQxLDgsMTUzLDI1NSwxOTAsMTc3LDExOCwwLDk2LDg5LDE3OCwwLDI1NSwxNiw0OCwyNTQsMTIyLDk2LDEwNSwyNTUsMTE3LDU0LDIzMiwyNTUsMzQsMTI2LDEwNSwyNTUsMjA0LDY3LDE2NiwwLDIzMiw1MiwxMzgsMjU1LDIxMSwxNDcsMTIsMCwyNSw1NCw3LDAsNDQsMTUsMjE1LDI1NCw1MSwyMzYsNDUsMCwxOTAsNjgsMTI5LDEsMTA2LDE0NywyMjUsMCwyOCw5Myw0NSwyNTQsMjM2LDE0MSwxNSwyNTUsMTcsNjEsMTYxLDAsMjIwLDExNSwxOTIsMCwyMzYsMTQ1LDI0LDI1NCwxMTEsMTY4LDE2OSwwLDIyNCw1OCw2MywyNTUsMTI3LDE2NCwxODgsMCw4MiwyMzQsNzUsMSwyMjQsMTU4LDEzNCwwLDIwOSw2OCwxMTAsMSwyMTcsMTY2LDIxNywwLDcwLDIyNSwxNjYsMSwxODcsMTkzLDE0MywyNTUsMTYsNyw4OCwyNTUsMTAsMjA1LDE0MCwwLDExNywxOTIsMTU2LDEsMTcsNTYsMzgsMCwyNywxMjQsMTA4LDEsMTcxLDIxNSw1NSwyNTUsOTUsMjUzLDIxMiwwLDE1NSwxMzUsMTY4LDI1NSwyNDYsMTc4LDE1MywyNTQsMTU0LDY4LDc0LDAsMjMyLDYxLDk2LDI1NCwxMDUsMTMyLDU5LDAsMzMsNzYsMTk5LDEsMTg5LDE3NiwxMzAsMjU1LDksMTA0LDI1LDI1NCw3NSwxOTgsMTAyLDI1NSwyMzMsMSwxMTIsMCwxMDgsMjIwLDIwLDI1NSwxMTQsMjMwLDcwLDAsMTQwLDE5NCwxMzMsMjU1LDU3LDE1OCwxNjQsMjU0LDE0Niw2LDgwLDI1NSwxNjksMTk2LDk3LDEsODUsMTgzLDEzMCwwLDcwLDE1OCwyMjIsMSw1OSwyMzcsMjM0LDI1NSw5NiwyNSwyNiwyNTUsMjMyLDE3NSw5NywyNTUsMTEsMTIxLDI0OCwyNTQsODgsMzUsMTk0LDAsMjE5LDE4MCwyNTIsMjU0LDc0LDgsMjI3LDAsMTk1LDIyNyw3MywxLDE4NCwxMTAsMTYxLDI1NSw0OSwyMzMsMTY0LDEsMTI4LDUzLDQ3LDAsODIsMTQsMTIxLDI1NSwxOTMsMTkwLDU4LDAsNDgsMTc0LDExNywyNTUsMTMyLDIzLDMyLDAsNDAsMTAsMTM0LDEsMjIsNTEsMjUsMjU1LDI0MCwxMSwxNzYsMjU1LDExMCw1NywxNDYsMCwxMTcsMTQzLDIzOSwxLDE1NywxMDEsMTE4LDI1NSw1NCw4NCw3NiwwLDIwNSwxODQsMTgsMjU1LDQ3LDQsNzIsMjU1LDc4LDExMiw4NSwyNTUsMTkzLDUwLDY2LDEsOTMsMTYsNTIsMjU1LDgsMTA1LDEzNCwwLDEyLDEwOSw3MiwyNTUsNTgsMTU2LDI1MSwwLDE0NCwzNSwyMDQsMCw0NCwxNjAsMTE3LDI1NCw1MCwxMDcsMTk0LDAsMSw2OCwxNjUsMjU1LDExMSwxMTAsMTYyLDAsMTU4LDgzLDQwLDI1NCw3NiwyMTQsMjM0LDAsNTgsMjE2LDIwNSwyNTUsMTcxLDk2LDE0NywyNTUsNDAsMjI3LDExNCwxLDE3NiwyMjcsMjQxLDAsNzAsMjQ5LDE4MywxLDEzNiw4NCwxMzksMjU1LDYwLDEyMiwyNDcsMjU0LDE0Myw5LDExNywyNTUsMTc3LDE3NCwxMzcsMjU0LDczLDI0NywxNDMsMCwyMzYsMTg1LDEyNiwyNTUsNjIsMjUsMjQ3LDI1NSw0NSw2NCw1NiwyNTUsMTYxLDI0NCw2LDAsMzQsNTcsNTYsMSwxMDUsMjAyLDgzLDAsMTI4LDE0NywyMDgsMCw2LDEwMywxMCwyNTUsNzQsMTM4LDY1LDI1NSw5Nyw4MCwxMDAsMjU1LDIxNCwxNzQsMzMsMjU1LDUwLDEzNCw3NCwyNTUsMTEwLDE1MSwxMzAsMjU0LDExMSw4NCwxNzIsMCw4NCwxOTksNzUsMjU0LDI0OCw1OSwxMTIsMjU1LDgsMjE2LDE3OCwxLDksMTgzLDk1LDAsMjM4LDI3LDgsMjU0LDE3MCwyMDUsMjIwLDAsMTk1LDIyOSwxMzUsMCw5OCw3NiwyMzcsMjU1LDIyNiw5MSwyNiwxLDgyLDIxOSwzOSwyNTUsMjI1LDE5MCwxOTksMSwyMTcsMjAwLDEyMSwyNTUsODEsMTc5LDgsMjU1LDE0MCw2NSwyMDYsMCwxNzgsMjA3LDg3LDI1NCwyNTAsMjUyLDQ2LDI1NSwxMDQsODksMTEwLDEsMjUzLDE4OSwxNTgsMjU1LDE0NCwyMTQsMTU4LDI1NSwxNjAsMjQ1LDU0LDI1NSw1MywxODMsOTIsMSwyMSwyMDAsMTk0LDI1NSwxNDYsMzMsMTEzLDEsMjA5LDEsMjU1LDAsMjM1LDEwNiw0MywyNTUsMTY3LDUyLDIzMiwwLDE1NywyMjksMjIxLDAsNTEsMzAsMjUsMCwyNTAsMjIxLDI3LDEsNjUsMTQ3LDg3LDI1NSw3OSwxMjMsMTk2LDAsNjUsMTk2LDIyMywyNTUsNzYsNDQsMTcsMSw4NSwyNDEsNjgsMCwyMDIsMTgzLDI0OSwyNTUsNjUsMjEyLDIxMiwyNTUsOSwzMywxNTQsMSw3MSw1OSw4MCwwLDE3NSwxOTQsNTksMjU1LDE0MSw3Miw5LDAsMTAwLDE2MCwyNDQsMCwyMzAsMjA4LDU2LDAsNTksMjUsNzUsMjU0LDgwLDE5NCwxOTQsMCwxOCwzLDIwMCwyNTQsMTYwLDE1OSwxMTUsMCwxMzIsMTQzLDI0NywxLDExMSw5Myw1NywyNTUsNTgsMjM3LDExLDEsMTM0LDIyMiwxMzUsMjU1LDEyMiwxNjMsMTA4LDEsMTIzLDQzLDE5MCwyNTUsMjUxLDE4OSwyMDYsMjU0LDgwLDE4Miw3MiwyNTUsMjA4LDI0NiwyMjQsMSwxNyw2MCw5LDAsMTYxLDIwNywzOCwwLDE0MSwxMDksOTEsMCwyMTYsMTUsMjExLDI1NSwxMzYsNzgsMTEwLDAsOTgsMTYzLDEwNCwyNTUsMjEsODAsMTIxLDI1NSwxNzMsMTc4LDE4MywxLDEyNywxNDMsNCwwLDEwNCw2MCw4MiwyNTQsMjE0LDE2LDEzLDI1NSw5NiwyMzgsMzMsMSwxNTgsMTQ4LDIzMCwyNTUsMTI3LDEyOSw2MiwyNTUsNTEsMjU1LDIxMCwyNTUsNjIsMTQxLDIzNiwyNTQsMTU3LDU1LDIyNCwyNTUsMTE0LDM5LDI0NCwwLDE5MiwxODgsMjUwLDI1NSwyMjgsNzYsNTMsMCw5OCw4NCw4MSwyNTUsMTczLDIwMyw2MSwyNTQsMTQ3LDUwLDU1LDI1NSwyMDQsMjM1LDE5MSwwLDUyLDE5NywyNDQsMCw4OCw0MywyMTEsMjU0LDI3LDE5MSwxMTksMCwxODgsMjMxLDE1NCwwLDY2LDgxLDE2MSwwLDkyLDE5MywxNjAsMSwyNTAsMjI3LDEyMCwwLDEyMyw1NSwyMjYsMCwxODQsMTcsNzIsMCwxMzMsMTY4LDEwLDI1NCwyMiwxMzUsMTU2LDI1NSw0MSwyNSwxMDMsMjU1LDQ4LDIwMiw1OCwwLDE4NiwxNDksODEsMjU1LDE4OCwxMzQsMjM5LDAsMjM1LDE4MSwxODksMjU0LDIxNywxMzksMTg4LDI1NSw3NCw0OCw4MiwwLDQ2LDIxOCwyMjksMCwxODksMjUzLDI1MSwwLDUwLDIyOSwxMiwyNTUsMjExLDE0MSwxOTEsMSwxMjgsMjQ0LDI1LDI1NSwxNjksMjMxLDEyMiwyNTQsODYsNDcsMTg5LDI1NSwxMzIsMTgzLDIzLDI1NSwzNywxNzgsMTUwLDI1NSw1MSwxMzcsMjUzLDAsMjAwLDc4LDMxLDAsMjIsMTA1LDUwLDAsMTMwLDYwLDAsMCwxMzIsMTYzLDkxLDI1NCwyMywyMzEsMTg3LDAsMTkyLDc5LDIzOSwwLDE1NywxMDIsMTY0LDI1NSwxOTIsODIsMjAsMSwyNCwxODEsMTAzLDI1NSwyNDAsOSwyMzQsMCwxLDEyMywxNjQsMjU1LDEzMywyMzMsMCwyNTUsMjAyLDI0MiwyNDIsMCw2MCwxODYsMjQ1LDAsMjQxLDE2LDE5OSwyNTUsMjI0LDExNiwxNTgsMjU0LDE5MSwxMjUsOTEsMjU1LDIyNCw4NiwyMDcsMCwxMjEsMzcsMjMxLDI1NSwyMjcsOSwxOTgsMjU1LDE1LDE1MywyMzksMjU1LDEyMSwyMzIsMjE3LDI1NCw3NSwxMTIsODIsMCw5NSwxMiw1NywyNTQsNTEsMjE0LDEwNSwyNTUsMTQ4LDIyMCw5NywxLDE5OSw5OCwzNiwwLDE1NiwyMDksMTIsMjU0LDEwLDIxMiw1MiwwLDIxNywxODAsNTUsMjU0LDIxMiwxNzAsMjMyLDI1NSwyMTYsMjAsODQsMjU1LDE1NywyNTAsMTM1LDAsMTU3LDk5LDEyNywyNTQsMSwyMDYsNDEsMCwxNDksMzYsNzAsMSw1NCwxOTYsMjAxLDI1NSw4NywxMTYsMCwyNTQsMjM1LDE3MSwxNTAsMCwyNywxNjMsMjM0LDAsMjAyLDEzNSwxODAsMCwyMDgsOTUsMCwyNTQsMTIzLDE1Niw5MywwLDE4Myw2Miw3NSwwLDEzNywyMzUsMTgyLDAsMjA0LDIyNSwyNTUsMjU1LDIxNCwxMzksMjEwLDI1NSwyLDExNSw4LDI1NSwyOSwxMiwxMTEsMCw1MiwxNTYsMSwwLDI1MywyMSwyNTEsMjU1LDM3LDE2NSwzMSwyNTQsMTIsMTMwLDIxMSwwLDEwNiwxOCw1MywyNTQsNDIsOTksMTU0LDAsMTQsMjE3LDYxLDI1NCwyMTYsMTEsOTIsMjU1LDIwMCwxOTcsMTEyLDI1NCwxNDcsMzgsMTk5LDAsMzYsMjUyLDEyMCwyNTQsMTA3LDE2OSw3NywwLDEsMTIzLDE1OSwyNTUsMjA3LDc1LDEwMiwwLDE2MywxNzUsMTk2LDAsNDQsMSwyNDAsMCwxMjAsMTg2LDE3NiwyNTQsMTMsOTgsNzYsMjU1LDIzNywxMjQsMjQxLDI1NSwyMzIsMTQ2LDE4OCwyNTUsMjAwLDk2LDIyNCwwLDIwNCwzMSw0MSwwLDIwOCwyMDAsMTMsMCwyMSwyMjUsOTYsMjU1LDE3NSwxNTYsMTk2LDAsMjQ3LDIwOCwxMjYsMCw2MiwxODQsMjQ0LDI1NCwyLDE3MSw4MSwwLDg1LDExNSwxNTgsMCw1NCw2NCw0NSwyNTUsMTksMTM4LDExNCwwLDEzNSw3MSwyMDUsMCwyMjcsNDcsMTQ3LDEsMjE4LDIzMSw2NiwwLDI1MywyMDksMjgsMCwyNDQsMTUsMTczLDI1NSw2LDE1LDExOCwyNTQsMTYsMTUwLDIwOCwyNTUsMTg1LDIyLDUwLDI1NSw4NiwxMTIsMjA3LDI1NSw3NSwxMTMsMjE1LDEsNjMsMTQ2LDQzLDI1NSw0LDIyNSwxOSwyNTQsMjI3LDIzLDYyLDI1NSwxNCwyNTUsMjE0LDI1NCw0NSw4LDIwNSwyNTUsODcsMTk3LDE1MSwyNTQsMjEwLDgyLDIxNSwyNTUsMjQ1LDI0OCwyNDcsMjU1LDEyOCwyNDgsNzAsMCwyMjUsMjQ3LDg3LDAsOTAsMTIwLDcwLDAsMjEzLDI0NSw5MiwwLDEzLDEzMywyMjYsMCw0NywxODEsNSwxLDkyLDE2MywxMDUsMjU1LDYsMzAsMTMzLDI1NCwyMzIsMTc4LDYxLDI1NSwyMzAsMTQ5LDI0LDI1NSwxOCw0OSwxNTgsMCwyMjgsMTAwLDYxLDI1NCwxMTYsMjQzLDI1MSwyNTUsNzcsNzUsOTIsMSw4MSwyMTksMTQ3LDI1NSw3NiwxNjMsMjU0LDI1NCwxNDEsMjEzLDI0NiwwLDIzMiwzNywxNTIsMjU0LDk3LDQ0LDEwMCwwLDIwMSwzNyw1MCwxLDIxMiwyNDQsNTcsMCwxNzQsMTcxLDE4MywyNTUsMjQ5LDc0LDExMiwwLDE2NiwxNTYsMzAsMCwyMjIsMjIxLDk3LDI1NSwyNDMsOTMsNzMsMjU0LDI1MSwxMDEsMTAwLDI1NSwyMTYsMjE3LDkzLDI1NSwyNTQsMTM4LDE4NywyNTUsMTQyLDE5MCw1MiwyNTUsNTksMjAzLDE3NywyNTUsMjAwLDk0LDUyLDAsMTE1LDExNCwxNTgsMjU1LDE2NSwxNTIsMTA0LDEsMTI2LDk5LDIyNiwyNTUsMTE4LDE1NywyNDQsMSwxMDcsMjAwLDE2LDAsMTkzLDkwLDIyOSwwLDEyMSw2LDg4LDAsMTU2LDMyLDkzLDI1NCwxMjUsMjQxLDIxMSwyNTUsMTQsMjM3LDE1NywyNTUsMTY1LDE1NCwyMSwyNTUsMTg0LDIyNCwyMiwyNTUsMjUwLDI0LDE1MiwyNTUsMTEzLDc3LDMxLDAsMjQ3LDE3MSwyMywyNTUsMjM3LDE3NywyMDQsMjU1LDUyLDEzNywxNDUsMjU1LDE5NCwxODIsMTE0LDAsMjI0LDIzNCwxNDksMCwxMCwxMTEsMTAzLDEsMjAxLDEyOSw0LDAsMjM4LDE0Miw3OCwwLDUyLDYsNDAsMjU1LDExMCwyMTMsMTY1LDI1NCw2MCwyMDcsMjUzLDAsNjIsMjE1LDY5LDAsOTYsOTcsMCwyNTUsNDksNDUsMjAyLDAsMTIwLDEyMSwyMiwyNTUsMjM1LDEzOSw0OCwxLDE5OCw0NSwzNCwyNTUsMTgyLDUwLDI3LDEsMTMxLDIxMCw5MSwyNTUsNDYsNTQsMTI4LDAsMTc1LDEyMywxMDUsMjU1LDE5OCwxNDEsNzgsMjU0LDY3LDI0NCwyMzksMjU1LDI0NSw1NCwxMDMsMjU0LDc4LDM4LDI0MiwyNTUsMiw5MiwyNDksMjU0LDI1MSwxNzQsODcsMjU1LDEzOSw2MywxNDQsMCwyNCwxMDgsMjcsMjU1LDM0LDEwMiwxOCwxLDM0LDIyLDE1MiwwLDY2LDIyOSwxMTgsMjU0LDUwLDE0Myw5OSwwLDE0NCwxNjksMTQ5LDEsMTE4LDMwLDE1MiwwLDE3OCw4LDEyMSwxLDgsMTU5LDE4LDAsOTAsMTAxLDIzMCwyNTUsMTI5LDI5LDExOSwwLDY4LDM2LDExLDEsMjMyLDE4Myw1NSwwLDIzLDI1NSw5NiwyNTUsMTYxLDQxLDE5MywyNTUsNjMsMTM5LDIyMiwwLDE1LDE3OSwyNDMsMCwyNTUsMTAwLDE1LDI1NSw4Miw1MywxMzUsMCwxMzcsNTcsMTQ5LDEsOTksMjQwLDE3MCwyNTUsMjIsMjMwLDIyOCwyNTQsNDksMTgwLDgyLDI1NSw2MSw4Miw0MywwLDExMCwyNDUsMjE3LDAsMTk5LDEyNSw2MSwwLDQ2LDI1Myw1MiwwLDE0MSwxOTcsMjE5LDAsMjExLDE1OSwxOTMsMCw1NSwxMjEsMTA1LDI1NCwxODMsMjAsMTI5LDAsMTY5LDExOSwxNzAsMjU1LDIwMywxNzgsMTM5LDI1NSwxMzUsNDAsMTgyLDI1NSwxNzIsMTMsMjAyLDI1NSw2NSwxNzgsMTQ4LDAsOCwyMDcsNDMsMCwxMjIsNTMsMTI3LDEsNzQsMTYxLDQ4LDAsMjI3LDIxNCwxMjgsMjU0LDg2LDExLDI0MywyNTUsMTAwLDg2LDcsMSwyNDUsNjgsMTM0LDI1NSw2MSw0MywyMSwxLDE1Miw4NCw5NCwyNTUsMTkwLDYwLDI1MCwyNTQsMjM5LDExOCwyMzIsMjU1LDIxNCwxMzYsMzcsMSwxMTMsNzYsMTA3LDI1NSw5MywxMDQsMTAwLDEsMTQ0LDIwNiwyMywyNTUsMTEwLDE1MCwxNTQsMSwyMjgsMTAzLDE4NSwwLDIxOCw0OSw1MCwyNTQsMTM1LDc3LDEzOSwyNTUsMTg1LDEsNzgsMCwwLDE2MSwxNDgsMjU1LDk3LDI5LDIzMywyNTUsMjA3LDE0OCwxNDksMjU1LDE2MCwxNjgsMCwwLDkxLDEyOCwxNzEsMjU1LDYsMjgsMTksMjU0LDExLDExMSwyNDcsMCwzOSwxODcsMTUwLDI1NSwxMzgsMjMyLDE0OSwwLDExNyw2Miw2OCwyNTUsNjMsMjE2LDE4OCwyNTUsMjM1LDIzNCwzMiwyNTQsMjksNTcsMTYwLDI1NSwyNSwxMiwyNDEsMSwxNjksNjAsMTkxLDAsMzIsMTMxLDE0MSwyNTUsMjM3LDE1OSwxMjMsMjU1LDk0LDE5Nyw5NCwyNTQsMTE2LDI1NCwzLDI1NSw5MiwxNzksOTcsMjU0LDEyMSw5Nyw5MiwyNTUsMTcwLDExMiwxNCwwLDIxLDE0OSwyNDgsMCwyNDgsMjI3LDMsMCw4MCw5NiwxMDksMCw3NSwxOTIsNzQsMSwxMiw5MCwyMjYsMjU1LDE2MSwxMDYsNjgsMSwyMDgsMTE0LDEyNywyNTUsMTE0LDQyLDI1NSwyNTQsNzQsMjYsNzQsMjU1LDI0NywxNzksMTUwLDI1NCwxMjEsMTQwLDYwLDAsMTQ3LDcwLDIwMCwyNTUsMjE0LDQwLDE2MSwyNTUsMTYxLDE4OCwyMDEsMjU1LDE0MSw2NSwxMzUsMjU1LDI0MiwxMTUsMjUyLDAsNjIsNDcsMjAyLDAsMTgwLDE0OSwyNTUsMjU0LDEzMCw1NSwyMzcsMCwxNjUsMTcsMTg2LDI1NSwxMCwxNjksMTk0LDAsMTU2LDEwOSwyMTgsMjU1LDExMiwxNDAsMTIzLDI1NSwxMDQsMTI4LDIyMywyNTQsMTc3LDE0MiwxMDgsMjU1LDEyMSwzNywyMTksMjU1LDEyOCw3NywxOCwyNTUsMTExLDEwOCwyMywxLDkxLDE5Miw3NSwwLDE3NCwyNDUsMjIsMjU1LDQsMjM2LDYyLDI1NSw0Myw2NCwxNTMsMSwyMjcsMTczLDI1NCwwLDIzNywxMjIsMTMyLDEsMTI3LDg5LDE4NiwyNTUsMTQyLDgyLDEyOCwyNTQsMjUyLDg0LDE3NCwwLDkwLDE3OSwxNzcsMSwyNDMsMjE0LDg3LDI1NSwxMDMsNjAsMTYyLDI1NSwyMDgsMTMwLDE0LDI1NSwxMSwxMzAsMTM5LDAsMjA2LDEyOSwyMTksMjU1LDk0LDIxNywxNTcsMjU1LDIzOSwyMzAsMjMwLDI1NSwxMTYsMTE1LDE1OSwyNTQsMTY0LDEwNyw5NSwwLDUxLDIxOCwyLDEsMjE2LDEyNSwxOTgsMjU1LDE0MCwyMDIsMTI4LDI1NCwxMSw5NSw2OCwyNTUsNTUsOSw5MywyNTQsMTc0LDE1Myw2LDI1NSwyMDQsMTcyLDk2LDAsNjksMTYwLDExMCwwLDIxMywzOCw0OSwyNTQsMjcsODAsMjEzLDAsMTE4LDEyNSwxMTQsMCw3MCw3MCw2NywyNTUsMTUsMTQyLDczLDI1NSwxMzEsMTIyLDE4NSwyNTUsMjQzLDIwLDUwLDI1NCwxMzAsMjM3LDQwLDAsMjEwLDE1OSwxNDAsMSwxOTcsMTUxLDY1LDI1NSw4NCwxNTMsNjYsMCwxOTUsMTI2LDkwLDAsMTYsMjM4LDIzNiwxLDExOCwxODcsMTAyLDI1NSwzLDI0LDEzMywyNTUsMTg3LDY5LDIzMCwwLDU2LDE5Nyw5MiwxLDIxMyw2OSw5NCwyNTUsODAsMTM4LDIyOSwxLDIwNiw3LDIzMCwwLDIyMiwxMTEsMjMwLDEsOTEsMjMzLDExOSwyNTUsOSw4OSw3LDEsMiw5OCwxLDAsMTQ4LDc0LDEzMywyNTUsNTEsMjQ2LDE4MCwyNTUsMjI4LDE3NywxMTIsMSw1OCwxODksMTA4LDI1NSwxOTQsMjAzLDIzNywyNTQsMjEsMjA5LDE5NSwwLDE0NywxMCwzNSwxLDg2LDE1NywyMjYsMCwzMSwxNjMsMTM5LDI1NCw1Niw3LDc1LDI1NSw2Miw5MCwxMTYsMCwxODEsNjAsMTY5LDAsMTM4LDE2MiwyMTIsMjU0LDgxLDE2NywzMSwwLDIwNSw5MCwxMTIsMjU1LDMzLDExMiwyMjcsMCw4MywxNTEsMTE3LDEsMTc3LDIyNCw3MywyNTUsMTc0LDE0NCwyMTcsMjU1LDIzMCwyMDQsNzksMjU1LDIyLDc3LDIzMiwyNTUsMTE0LDc4LDIzNCwwLDIyNCw1NywxMjYsMjU0LDksNDksMTQxLDAsMjQyLDE0NywxNjUsMSwxMDQsMTgyLDE0MCwyNTUsMTY3LDEzMiwxMiwxLDEyMyw2OCwxMjcsMCwyMjUsODcsMzksMSwyNTEsMTA4LDgsMCwxOTgsMTkzLDE0MywxLDEyMSwxMzUsMjA3LDI1NSwxNzIsMjIsNzAsMCw1MCw2OCwxMTYsMjU1LDEwMSwxNzUsNDAsMjU1LDI0OCwxMDUsMjMzLDAsMTY2LDIwMyw3LDAsMTEwLDE5NywyMTgsMCwyMTUsMjU0LDI2LDI1NCwxNjgsMjI2LDI1MywwLDMxLDE0Myw5NiwwLDExLDEwMyw0MSwwLDE4MywxMjksMjAzLDI1NCwxMDAsMjQ3LDc0LDI1NSwyMTMsMTI2LDEzMiwwLDIxMCwxNDcsNDQsMCwxOTksMjM0LDI3LDEsMTQ4LDQ3LDE4MSwwLDE1NSw5MSwxNTgsMSw1NCwxMDUsMTc1LDI1NSwyLDc4LDE0NSwyNTQsMTAyLDE1NCw5NSwwLDEyOCwyMDcsMTI3LDI1NCw1MiwxMjQsMjM2LDI1NSwxMzAsODQsNzEsMCwyMjEsMjQzLDIxMSwwLDE1MiwxNzAsMjA3LDAsMjIyLDEwNiwxOTksMCwxODMsODQsOTQsMjU0LDkyLDIwMCw1NiwyNTUsMTM4LDE4MiwxMTUsMSwxNDIsOTYsMTQ2LDAsMTMzLDEzNiwyMjgsMCw5NywxOCwxNTAsMCw1NSwyNTEsNjYsMCwxNDAsMTAyLDQsMCwyMDIsMTAzLDE1MSwwLDMwLDE5LDI0OCwyNTUsNTEsMTg0LDIwNywwLDIwMiwxOTgsODksMCw1NSwxOTcsMjI1LDI1NCwxNjksOTUsMjQ5LDI1NSw2Niw2NSw2OCwyNTUsMTg4LDIzNCwxMjYsMCwxNjYsMjIzLDEwMCwxLDExMiwyMzksMjQ0LDAsMTQ0LDIzLDE5NCwwLDU4LDM5LDE4MiwwLDI0NCw0NCwyNCwyNTQsMTc1LDY4LDE3OSwyNTUsMTUyLDExOCwxNTQsMSwxNzYsMTYyLDEzMCwwLDIxNywxMTQsMjA0LDI1NCwxNzMsMTI2LDc4LDI1NSwzMywyMjIsMzAsMjU1LDM2LDIsOTEsMjU1LDIsMTQzLDI0MywwLDksMjM1LDIxNSwwLDMsMTcxLDE1MSwxLDI0LDIxNSwyNDUsMjU1LDE2OCw0NywxNjQsMjU0LDI0MSwxNDYsMjA3LDAsNjksMTI5LDE4MCwwLDY4LDI0MywxMTMsMCwxNDQsNTMsNzIsMjU0LDI1MSw0NSwxNCwwLDIzLDExMCwxNjgsMCw2OCw2OCw3OSwyNTUsMTEwLDcwLDk1LDI1NCwxNzQsOTEsMTQ0LDI1NSwzMywyMDYsOTUsMjU1LDEzNyw0MSw3LDI1NSwxOSwxODcsMTUzLDI1NCwzNSwyNTUsMTEyLDI1NSw5LDE0NSwxODUsMjU0LDUwLDE1NywzNywwLDExLDExMiw0OSwxLDEwMiw4LDE5MCwyNTUsMjM0LDI0MywxNjksMSw2MCw4NSwyMywwLDc0LDM5LDE4OSwwLDExNiw0OSwyMzksMCwxNzMsMjEzLDIxMCwwLDQ2LDE2MSwxMDgsMjU1LDE1OSwxNTAsMzcsMCwxOTYsMTIwLDE4NSwyNTUsMzQsOTgsNiwyNTUsMTUzLDE5NSw2MiwyNTUsOTcsMjMwLDcxLDI1NSwxMDIsNjEsNzYsMCwyNiwyMTIsMjM2LDI1NSwxNjQsOTcsMTYsMCwxOTgsNTksMTQ2LDAsMTYzLDIzLDE5NiwwLDU2LDI0LDYxLDAsMTgxLDk4LDE5MywwLDI1MSwxNDcsMjI5LDI1NSw5OCwxODksMjQsMjU1LDQ2LDU0LDIwNiwyNTUsMjM0LDgyLDI0NiwwLDE4MywxMDMsMzgsMSwxMDksNjIsMjA0LDAsMTAsMjQwLDIyNCwwLDE0NiwyMiwxMTcsMjU1LDE0MiwxNTQsMTIwLDAsNjksMjEyLDM1LDAsMjA4LDk5LDExOCwxLDEyMSwyNTUsMywyNTUsNzIsNiwxOTQsMCwxMTcsMTcsMTk3LDI1NSwxMjUsMTUsMjMsMCwxNTQsNzksMTUzLDAsMjE0LDk0LDE5NywyNTUsMTg1LDU1LDE0NywyNTUsNjIsMjU0LDc4LDI1NCwxMjcsODIsMTUzLDAsMTEwLDEwMiw2MywyNTUsMTA4LDgyLDE2MSwyNTUsMTA1LDE4NywyMTIsMSw4MCwxMzgsMzksMCw2MCwyNTUsOTMsMjU1LDcyLDEyLDE4NiwwLDIxMCwyNTEsMzEsMSwxOTAsMTY3LDE0NCwyNTUsMjI4LDQ0LDE5LDI1NCwxMjgsNjcsMjMyLDAsMjE0LDI0OSwxMDcsMjU0LDEzNiwxNDUsODYsMjU1LDEzMiw0NiwxNzYsMCwxODksMTg3LDIyNywyNTUsMjA4LDIyLDE0MCwwLDIxNywyMTEsMTE2LDAsNTAsODEsMTg2LDI1NCwxMzksMjUwLDMxLDAsMzAsNjQsMTk4LDEsMTM1LDE1NSwxMDAsMCwxNjAsMjA2LDIzLDI1NCwxODcsMTYyLDIxMSwyNTUsMTYsMTg4LDYzLDAsMjU0LDIwOCw0OSwwLDg1LDg0LDE5MSwwLDI0MSwxOTIsMjQyLDI1NSwxNTMsMTI2LDE0NSwxLDIzNCwxNjIsMTYyLDI1NSwyMzAsOTcsMjE2LDEsNjQsMTM1LDEyNiwwLDE5MCwxNDgsMjIzLDEsNTIsMCw0MywyNTUsMjgsMzksMTg5LDEsNjQsMTM2LDIzOCwwLDE3NSwxOTYsMTg1LDAsOTgsMjI2LDIxMywyNTUsMTI3LDE1OSwyNDQsMSwyMjYsMTc1LDYwLDAsMTYwLDIzMywxNDIsMSwxODAsMjQzLDIwNywyNTUsNjksMTUyLDg5LDEsMzEsMTAxLDIxLDAsMTQ0LDI1LDE2NCwyNTQsMTM5LDE5MSwyMDksMCw5MSwyNSwxMjEsMCwzMiwxNDcsNSwwLDM5LDE4NiwxMjMsMjU1LDYzLDExNSwyMzAsMjU1LDkzLDE2NywxOTgsMjU1LDE0MywyMTMsMjIwLDI1NSwxNzksMTU2LDE5LDI1NSwyNSw2NiwxMjIsMCwyMTQsMTYwLDIxNywyNTUsMiw0NSw2MiwyNTUsMTA2LDc5LDE0NiwyNTQsNTEsMTM3LDk5LDI1NSw4NywxMDAsMjMxLDI1NSwxNzUsMTQ1LDIzMiwyNTUsMTAxLDE4NCwxLDI1NSwxNzQsOSwxMjUsMCw4MiwzNywxNjEsMSwzNiwxMTQsMTQxLDI1NSw0OCwyMjIsMTQyLDI1NSwyNDUsMTg2LDE1NCwwLDUsMTc0LDIyMSwyNTQsNjMsMTE0LDE1NSwyNTUsMTM1LDU1LDE2MCwxLDgwLDMxLDEzNSwwLDEyNiwyNTAsMTc5LDEsMjM2LDIxOCw0NSwwLDIwLDI4LDE0NSwxLDE2LDE0Nyw3MywwLDI0OSwxODksMTMyLDEsMTcsMTg5LDE5MiwyNTUsMjIzLDE0MiwxOTgsMjU1LDcyLDIwLDE1LDI1NSwyNTAsNTMsMjM3LDI1NCwxNSwxMSwxOCwwLDI3LDIxMSwxMTMsMjU0LDIxMywxMDcsNTYsMjU1LDE3NCwxNDcsMTQ2LDI1NSw5NiwxMjYsNDgsMCwyMywxOTMsMTA5LDEsMzcsMTYyLDk0LDAsMTk5LDE1NywyNDksMjU0LDI0LDEyOCwxODcsMjU1LDIwNSw0OSwxNzgsMjU0LDkzLDE2NCw0MiwyNTUsNDMsMTE5LDIzNSwxLDg4LDE4MywyMzcsMjU1LDIxOCwyMTAsMSwyNTUsMTA3LDI1NCw0MiwwLDIzMCwxMCw5OSwyNTUsMTYyLDAsMjI2LDAsMjE5LDIzNyw5MSwwLDEyOSwxNzgsMjAzLDAsMjA4LDUwLDk1LDI1NCwyMDYsMjA4LDk1LDI1NSwyNDcsMTkxLDg5LDI1NCwxMTAsMjM0LDc5LDI1NSwxNjUsNjEsMjQzLDAsMjAsMTIyLDExMiwyNTUsMjQ2LDI0NiwxODUsMjU0LDEwMyw0LDEyMywwLDIzMyw5OSwyMzAsMSwyMTksOTEsMjUyLDI1NSwxOTksMjIyLDIyLDI1NSwxNzksMjQ1LDIzMywyNTUsMjExLDI0MSwyMzQsMCwxMTEsMjUwLDE5MiwyNTUsODUsODQsMTM2LDAsMTAxLDU4LDUwLDI1NSwxMzEsMTczLDE1NiwyNTQsMTE5LDQ1LDUxLDI1NSwxMTgsMjMzLDE2LDI1NCwyNDIsOTAsMjE0LDAsOTQsMTU5LDIxOSwxLDMsMywyMzQsMjU1LDk4LDc2LDkyLDI1NCw4MCw1NCwyMzAsMCw1LDIyOCwyMzEsMjU0LDUzLDI0LDIyMywyNTUsMTEzLDU2LDExOCwxLDIwLDEzMiwxLDI1NSwxNzEsMjEwLDIzNiwwLDU2LDI0MSwxNTgsMjU1LDE4NiwxMTUsMTksMjU1LDgsMjI5LDE3NCwwLDQ4LDQ0LDAsMSwxMTQsMTE0LDE2NiwyNTUsNiw3MywyMjYsMjU1LDIwNSw4OSwyNDQsMCwxMzcsMjI3LDc1LDEsMjQ4LDE3Myw1NiwwLDc0LDEyMCwyNDYsMjU0LDExOSwzLDExLDI1NSw4MSwxMjAsMTk4LDI1NSwxMzYsMTIyLDk4LDI1NSwxNDYsMjQxLDIyMSwxLDEwOSwxOTQsNzgsMjU1LDIyMywyNDEsNzAsMSwyMTQsMjAwLDE2OSwyNTUsOTcsMTkwLDQ3LDI1NSw0NywxMDMsMTc0LDI1NSw5OSw5Miw3MiwyNTQsMTE4LDIzMywxODAsMjU1LDE5MywzNSwyMzMsMjU0LDI2LDIyOSwzMiwyNTUsMjIyLDI1MiwxOTgsMCwyMDQsNDMsNzEsMjU1LDE5OSw4NCwxNzIsMCwxMzQsMTAyLDE5MCwwLDExMSwyMzgsOTcsMjU0LDIzMCw0MCwyMzAsMCwyMjcsMjA1LDY0LDI1NCwyMDAsMTIsMjI1LDAsMTY2LDI1LDIyMiwwLDExMyw2OSw1MSwyNTUsMTQzLDE1OSwyNCwwLDE2NywxODQsNzQsMCwyOSwyMjQsMTE2LDI1NCwxNTgsMjA4LDIzMywwLDE5MywxMTYsMTI2LDI1NSwyMTIsMTEsMTMzLDI1NSwyMiw1OCwxNDAsMSwyMDQsMzYsNTEsMjU1LDIzMiwzMCw0MywwLDIzNSw3MCwxODEsMjU1LDY0LDU2LDE0NiwyNTQsMTY5LDE4LDg0LDI1NSwyMjYsMSwxMywyNTUsMjAwLDUwLDE3NiwyNTUsNTIsMjEzLDI0NSwyNTQsMTY4LDIwOSw5NywwLDE5MSw3MSw1NSwwLDM0LDc4LDE1NiwwLDIzMiwxNDQsNTgsMSwxODUsNzQsMTg5LDAsMTg2LDE0MiwxNDksMjU0LDY0LDY5LDEyNywyNTUsMTYxLDIwMywxNDcsMjU1LDE3NiwxNTEsMTkxLDAsMTM2LDIzMSwyMDMsMjU0LDE2MywxODIsMTM3LDAsMTYxLDEyNiwyNTEsMjU0LDIzMywzMiw2NiwwLDY4LDIwNyw2NiwwLDMwLDI4LDM3LDAsOTMsMTE0LDk2LDEsMjU0LDkyLDI0NywyNTUsNDQsMTcxLDY5LDAsMjAyLDExOSwxMSwyNTUsMTg4LDExOCw1MCwxLDI1NSw4MywxMzYsMjU1LDcxLDgyLDI2LDAsNzAsMjI3LDIsMCwzMiwyMzUsMTIxLDEsMTgxLDQxLDE1NCwwLDcxLDEzNCwyMjksMjU0LDIwMiwyNTUsMzYsMCw0MSwxNTIsNSwwLDE1NCw2Myw3MywyNTUsMzQsMTgyLDEyNCwwLDEyMSwyMjEsMTUwLDI1NSwyNiwyMDQsMjEzLDEsNDEsMTcyLDg3LDAsOTAsMTU3LDE0NiwyNTUsMTA5LDEzMCwyMCwwLDcxLDEwNywyMDAsMjU1LDI0MywxMDIsMTg5LDAsMSwxOTUsMTQ1LDI1NCw0Niw4OCwxMTcsMCw4LDIwNiwyMjcsMCwxOTEsMTEwLDI1MywyNTUsMTA5LDEyOCwyMCwyNTQsMTM0LDg1LDUxLDI1NSwxMzcsMTc3LDExMiwxLDIxNiwzNCwyMiwyNTUsMTMxLDE2LDIwOCwyNTUsMTIxLDE0OSwxNzAsMCwxMTQsMTksMjMsMSwxNjYsODAsMzEsMjU1LDExMywyNDAsMTIyLDAsMjMyLDE3OSwyNTAsMCw2OCwxMTAsMTgwLDI1NCwyMTAsMTcwLDExOSwwLDIyMywxMDgsMTY0LDI1NSwyMDcsNzksMjMzLDI1NSwyNywyMjksMjI2LDI1NCwyMDksOTgsODEsMjU1LDc5LDY4LDcsMCwxMzEsMTg1LDEwMCwwLDE3MCwyOSwxNjIsMjU1LDE3LDE2MiwxMDcsMjU1LDU3LDIxLDExLDEsMTAwLDIwMCwxODEsMjU1LDEyNyw2NSwxNjYsMSwxNjUsMTM0LDIwNCwwLDEwNCwxNjcsMTY4LDAsMSwxNjQsNzksMCwxNDYsMTM1LDU5LDEsNzAsNTAsMTI4LDI1NSwxMDIsMTE5LDEzLDI1NCwyMjcsNiwxMzUsMCwxNjIsMTQyLDE3OSwyNTUsMTYwLDEwMCwyMjIsMCwyNywyMjQsMjE5LDEsMTU4LDkzLDE5NSwyNTUsMjM0LDE0MSwxMzcsMCwxNiwyNCwxMjUsMjU1LDIzOCwyMDYsNDcsMjU1LDk3LDE3LDk4LDI1NSwxMTYsMTEwLDEyLDI1NSw5NiwxMTUsNzcsMCw5MSwyMjcsMjMyLDI1NSwyNDgsMjU0LDc5LDI1NSw5MiwyMjksNiwyNTQsODgsMTk4LDEzOSwwLDIwNiw3NSwxMjksMCwyNTAsNzcsMjA2LDI1NSwxNDEsMjQ0LDEyMywxLDEzOCw2OSwyMjAsMCwzMiwxNTEsNiwxLDEzMSwxNjcsMjIsMjU1LDIzNyw2OCwxNjcsMjU0LDE5OSwxODksMTUwLDAsMTYzLDE3MSwxMzgsMjU1LDUxLDE4OCw2LDI1NSw5NSwyOSwxMzcsMjU0LDE0OCwyMjYsMTc5LDAsMTgxLDEwNywyMDgsMjU1LDEzNCwzMSw4MiwyNTUsMTUxLDEwMSw0NSwyNTUsMTI5LDIwMiwyMjUsMCwyMjQsNzIsMTQ3LDAsNDgsMTM4LDE1MSwyNTUsMTk1LDY0LDIwNiwyNTQsMjM3LDIxOCwxNTgsMCwxMDYsMjksMTM3LDI1NCwyNTMsMTg5LDIzMywyNTUsMTAzLDE1LDE3LDI1NSwxOTQsOTcsMjU1LDAsMTc4LDQ1LDE2OSwyNTQsMTk4LDIyNSwxNTUsMCwzOSw0OCwxMTcsMjU1LDEzNSwxMDYsMTE1LDAsOTcsMzgsMTgxLDAsMTUwLDQ3LDY1LDI1NSw4MywxMzAsMjI5LDI1NCwyNDYsMzgsMTI5LDAsOTIsMjM5LDE1NCwyNTQsOTEsOTksMTI3LDAsMTYxLDExMSwzMywyNTUsMjM4LDIxNywyNDIsMjU1LDEzMSwxODUsMTk1LDI1NSwyMTMsMTkxLDE1OCwyNTUsNDEsMTUwLDIxOCwwLDEzMiwxNjksMTMxLDAsODksODQsMjUyLDEsMTcxLDcwLDEyOCwyNTUsMTYzLDI0OCwyMDMsMjU0LDEsNTAsMTgwLDI1NSwxMjQsNzYsODUsMSwyNTEsMTExLDgwLDAsOTksNjYsMjM5LDI1NSwxNTQsMjM3LDE4MiwyNTUsMjIxLDEyNiwxMzMsMjU0LDc0LDIwNCw5OSwyNTUsNjUsMTQ3LDExOSwyNTUsOTksNTYsMTY3LDI1NSw3OSwyNDgsMTQ5LDI1NSwxMTYsMTU1LDIyOCwyNTUsMjM3LDQzLDE0LDI1NCw2OSwxMzcsMTEsMjU1LDIyLDI1MCwyNDEsMSw5MSwxMjIsMTQzLDI1NSwyMDUsMjQ5LDI0MywwLDIxMiwyNiw2MCwyNTUsNDgsMTgyLDE3NiwxLDQ4LDIzLDE5MSwyNTUsMjAzLDEyMSwxNTIsMjU0LDQ1LDc0LDIxMywyNTUsNjIsOTAsMTgsMjU0LDI0NSwxNjMsMjMwLDI1NSwxODUsMTA2LDExNiwyNTUsODMsMzUsMTU5LDAsMTIsMzMsMiwyNTUsODAsMzQsNjIsMCwxNiw4NywxNzQsMjU1LDE3MywxMDEsODUsMCwyMDIsMzYsODEsMjU0LDE2MCw2OSwyMDQsMjU1LDY0LDIyNSwxODcsMCw1OCwyMDYsOTQsMCw4NiwxNDQsNDcsMCwyMjksODYsMjQ1LDAsNjMsMTQ1LDE5MCwxLDM3LDUsMzksMCwxMDksMjUxLDI2LDAsMTM3LDE0NywyMzQsMCwxNjIsMTIxLDE0NSwyNTUsMTQ0LDExNiwyMDYsMjU1LDE5NywyMzIsMTg1LDI1NSwxODMsMTkwLDE0MCwyNTUsNzMsMTIsMjU0LDI1NSwxMzksMjAsMjQyLDI1NSwxNzAsOTAsMjM5LDI1NSw5Nyw2NiwxODcsMjU1LDI0NSwxODEsMTM1LDI1NCwyMjIsMTM2LDUyLDAsMjQ1LDUsNTEsMjU0LDIwMyw0Nyw3OCwwLDE1MiwxMDEsMjE2LDAsNzMsMjMsMTI1LDAsMjU0LDk2LDMzLDEsMjM1LDIxMCw3MywyNTUsNDMsMjA5LDg4LDEsNywxMjksMTA5LDAsMTIyLDEwNCwyMjgsMjU0LDE3MCwyNDIsMjAzLDAsMjQyLDIwNCwxMzUsMjU1LDIwMiwyOCwyMzMsMjU1LDY1LDYsMTI3LDAsMTU5LDE0NCw3MSwwLDEwMCwxNDAsOTUsMCw3OCwxNTAsMTMsMCwyNTEsMTA3LDExOCwxLDE4Miw1OCwxMjUsMjU1LDEsMzgsMTA4LDI1NSwxNDEsMTg5LDIwOSwyNTUsOCwxNTUsMTI1LDEsMTEzLDE2Myw5MSwyNTUsMTIxLDc5LDE5MCwyNTUsMTM0LDIzOSwxMDgsMjU1LDc2LDQ3LDI0OCwwLDE2MywyMjgsMjM5LDAsMTcsMTExLDEwLDAsODgsMTQ5LDc1LDI1NSwyMTUsMjM1LDIzOSwwLDE2NywxNTksMjQsMjU1LDQ3LDE1MSwxMDgsMjU1LDEwNywyMDksMTg4LDAsMjMzLDIzMSw5OSwyNTQsMjgsMjAyLDE0OCwyNTUsMTc0LDM1LDEzOCwyNTUsMTEwLDI0LDY4LDI1NSwyLDY5LDE4MSwwLDEwNywxMDIsODIsMCwxMDIsMjM3LDcsMCw5MiwzNiwyMzcsMjU1LDIyMSwxNjIsODMsMSw1NSwyMDIsNiwyNTUsMTM1LDIzNCwxMzUsMjU1LDI0LDI1MCwyMjIsMCw2NSw5NCwxNjgsMjU0LDI0NSwyNDgsMjEwLDI1NSwxNjcsMTA4LDIwMSwyNTQsMjU1LDE2MSwxMTEsMCwyMDUsOCwyNTQsMCwxMzYsMTMsMTE2LDAsMTAwLDE3NiwxMzIsMjU1LDQzLDIxNSwxMjYsMjU1LDE3NywxMzMsMTMwLDI1NSwxNTgsNzksMTQ4LDAsNjcsMjI0LDM3LDEsMTIsMjA2LDIxLDI1NSw2MiwzNCwxMTAsMSwyMzcsMTA0LDE3NSwyNTUsODAsMTMyLDExMSwyNTUsMTQyLDE3NCw3MiwwLDg0LDIyOSwxODAsMjU0LDEwNSwxNzksMTQwLDAsNjQsMjQ4LDE1LDI1NSwyMzMsMTM4LDE2LDAsMjQ1LDY3LDEyMywyNTQsMjE4LDEyMSwyMTIsMjU1LDYzLDk1LDIxOCwxLDIxMywxMzMsMTM3LDI1NSwxNDMsMTgyLDgyLDI1NSw0OCwyOCwxMSwwLDI0NCwxMTQsMTQxLDEsMjA5LDE3NSw3NiwyNTUsMTU3LDE4MSwxNTAsMjU1LDE4NiwyMjksMywyNTUsMTY0LDE1NywxMTEsMSwyMzEsMTg5LDEzOSwwLDExOSwyMDIsMTkwLDI1NSwyMTgsMTA2LDY0LDI1NSw2OCwyMzUsNjMsMjU0LDk2LDI2LDE3MiwyNTUsMTg3LDQ3LDExLDEsMjE1LDE4LDI1MSwyNTUsODEsODQsODksMCw2OCw1OCwxMjgsMCw5NCwxMTMsNSwxLDkyLDEyOSwyMDgsMjU1LDk3LDE1LDgzLDI1NCw5LDI4LDE4OCwwLDIzOSw5LDE2NCwwLDYwLDIwNSwxNTIsMCwxOTIsMTYzLDk4LDI1NSwxODQsMTgsNjAsMCwyMTcsMTgyLDEzOSwwLDEwOSw1OSwxMjAsMjU1LDQsMTkyLDI1MSwwLDE2OSwyMTAsMjQwLDI1NSwzNywxNzIsOTIsMjU0LDE0OCwyMTEsMjQ1LDI1NSwxNzksNjUsNTIsMCwyNTMsMTMsMTE1LDAsMTg1LDE3NCwyMDYsMSwxMTQsMTg4LDE0OSwyNTUsMjM3LDkwLDE3MywwLDQzLDE5OSwxOTIsMjU1LDg4LDEwOCwxMTMsMCw1MiwzNSw3NiwwLDY2LDI1LDE0OCwyNTUsMjIxLDQsNywyNTUsMTUxLDI0MSwxMTQsMjU1LDE5MCwyMDksMjMyLDAsOTgsNTAsMTk5LDAsMTUxLDE1MCwyMTMsMjU1LDE4LDc0LDM2LDEsNTMsNDAsNywwLDE5LDEzNSw2NSwyNTUsMjYsMTcyLDY5LDAsMTc0LDIzNyw4NSwwLDk5LDk1LDQxLDAsMyw1NiwxNiwwLDM5LDE2MCwxNzcsMjU1LDIwMCwxMDYsMjE4LDI1NCwxODUsNjgsODQsMjU1LDkxLDE4Niw2MSwyNTQsNjcsMTQzLDE0MSwyNTUsMTMsMjQ0LDE2NiwyNTUsOTksMTE0LDE5OCwwLDE5OSwxMTAsMTYzLDI1NSwxOTMsMTgsMTg2LDAsMTI0LDIzOSwyNDYsMSwxMTAsNjgsMjIsMCwyLDIzNSw0NiwxLDIxMiw2MCwxMDcsMCwxMDUsNDIsMTA1LDEsMTQsMjMwLDE1MiwwLDcsNSwxMzEsMCwxNDEsMTA0LDE1NCwyNTUsMjEzLDMsNiwwLDEzMSwyMjgsMTYyLDI1NSwxNzksMTAwLDI4LDEsMjMxLDEyMyw4NSwyNTUsMjA2LDE0LDIyMywxLDI1Myw5NiwyMzAsMCwzOCwxNTIsMTQ5LDEsOTgsMTM3LDEyMiwwLDIxNCwyMDUsMywyNTUsMjI2LDE1MiwxNzksMjU1LDYsMTMzLDEzNywwLDE1OCw2OSwxNDAsMjU1LDExMywxNjIsMTU0LDI1NSwxODAsMjQzLDE3MiwyNTUsMjcsMTg5LDExNSwyNTUsMTQzLDQ2LDIyMCwyNTUsMjEzLDEzNCwyMjUsMjU1LDEyNiwyOSw2OSwwLDE4OCw0MywxMzcsMSwyNDIsNzAsOSwwLDkwLDIwNCwyNTUsMjU1LDIzMSwxNzAsMTQ3LDAsMjMsNTYsMTksMjU0LDU2LDEyNSwxNTcsMjU1LDQ4LDE3OSwyMTgsMjU1LDc5LDE4MiwyNTMsMjU1LDM4LDIxMiwxOTEsMSw0MSwyMzUsMTI0LDAsOTYsMTUxLDI4LDAsMTM1LDE0OCwxOTAsMCwyMDUsMjQ5LDM5LDI1NCw1Miw5NiwxMzYsMjU1LDIxMiw0NCwxMzYsMjU1LDY3LDIwOSwxMzEsMjU1LDI1MiwxMzAsMjMsMjU1LDIxOSwxMjgsMjAsMjU1LDE5OCwxMjksMTE4LDAsMTA4LDEwMSwxMSwwLDE3OCw1LDE0NiwxLDYyLDcsMTAwLDI1NSwxODEsMjM2LDk0LDI1NCwyOCwyNiwxNjQsMCw3NiwyMiwxMTIsMjU1LDEyMCwxMDIsNzksMCwyMDIsMTkyLDIyOSwxLDIwMCwxNzYsMjE1LDAsNDEsNjQsMjQ0LDI1NSwyMDYsMTg0LDc4LDAsMTY3LDQ1LDYzLDEsMTYwLDM1LDAsMjU1LDU5LDEyLDE0MiwyNTUsMjA0LDksMTQ0LDI1NSwyMTksOTQsMjI5LDEsMTIyLDI3LDExMiwwLDE4OSwxMDUsMTA5LDI1NSw2NCwyMDgsNzQsMjU1LDI1MSwxMjcsNTUsMSwyLDIyNiwxOTgsMCw0NCw3NiwyMDksMCwxNTEsMTUyLDc3LDI1NSwyMTAsMjMsNDYsMSwyMDEsMTcxLDY5LDI1NSw0NCwyMTEsMjMxLDAsMTkwLDM3LDIyNCwyNTUsMjQ1LDE5Niw2MiwyNTUsMTY5LDE4MSwyMjIsMjU1LDM0LDIxMSwxNywwLDExOSwyNDEsMTk3LDI1NSwyMjksMzUsMTUyLDEsMjEsNjksNDAsMjU1LDE3OCwyMjYsMTYxLDAsMTQ4LDE3OSwxOTMsMCwyMTksMTk0LDI1NCwxLDQwLDIwNiw1MSwyNTUsMjMxLDkyLDI1MCwxLDY3LDE1MywxNzAsMCwyMSwxNDgsMjQxLDAsMTcwLDY5LDgyLDI1NSwxMjEsMTgsMjMxLDI1NSw5MiwxMTQsMywwLDE4NCw2MiwyMzAsMCwyMjUsMjAxLDg3LDI1NSwxNDYsOTYsMTYyLDI1NSwxODEsMjQyLDIyMCwwLDE3MywxODcsMjIxLDEsMjI2LDYyLDE3MCwyNTUsNTYsMTI2LDIxNywxLDExNywxMywyMjcsMjU1LDE3OSw0NCwyMzksMCwxNTcsMTQxLDE1NSwyNTUsMTQ0LDIyMSw4MywwLDIzNSwyMDksMjA4LDAsNDIsMTcsMTY1LDEsMjUxLDgxLDEzMywwLDEyNCwyNDUsMjAxLDI1NCw5NywyMTEsMjQsMjU1LDgzLDIxNCwxNjYsMCwxNTQsMzYsOSwyNTUsMjQ4LDQ3LDEyNywwLDkwLDIxOSwxNDAsMjU1LDE2MSwyMTcsMzgsMjU0LDIxMiwxNDcsNjMsMjU1LDY2LDg0LDE0OCwxLDIwNywzLDEsMCwyMzAsMTM0LDg5LDEsMTI3LDc4LDEyMiwyNTUsMjI0LDE1NSwxLDI1NSw4MiwxMzYsNzQsMCwxNzgsMTU2LDIwOCwyNTUsMTg2LDI1LDQ5LDI1NSwyMjIsMywyMTAsMSwyMjksMTUwLDE5MCwyNTUsODUsMTYyLDUyLDI1NSw0MSw4NCwxNDEsMjU1LDczLDEyMyw4NCwyNTQsOTMsMTcsMTUwLDAsMTE5LDE5LDI4LDEsMzIsMjIsMjE1LDI1NSwyOCwyMywyMDQsMjU1LDE0MiwyNDEsNTIsMjU1LDIyOCw1MiwxMjUsMCwyOSw3NiwyMDcsMCwyMTUsMTY3LDI1MCwyNTQsMTc1LDE2NCwyMzAsMCw1NSwyMDcsMTA1LDEsMTA5LDE4NywyNDUsMjU1LDE2MSw0NCwyMjAsMSw0MSwxMDEsMTI4LDI1NSwxNjcsMTYsOTQsMCw5MywyMTQsMTA3LDI1NSwxMTgsNzIsMCwyNTQsODAsNjEsMjM0LDI1NSwxMjEsMTc1LDEyNSwwLDEzOSwxNjksMjUxLDAsOTcsMzksMTQ3LDI1NCwyNTAsMTk2LDQ5LDI1NSwxNjUsMTc5LDExMCwyNTQsMjIzLDcwLDE4NywyNTUsMjIsMTQyLDEyNSwxLDE1NCwxNzksMTM4LDI1NSwxMTgsMTc2LDQyLDEsMTAsMTc0LDE1MywwLDE1Niw5MiwxMDIsMCwxNjgsMTMsMTYxLDI1NSwxNDMsMTYsMzIsMCwyNTAsMTk3LDE4MCwyNTUsMjAzLDE2Myw0NCwxLDg3LDMyLDM2LDAsMTYxLDE1MywyMCwyNTUsMTIzLDI1MiwxNSwwLDI1LDIyNyw4MCwwLDYwLDg4LDE0MiwwLDE3LDIyLDIwMSwxLDE1NCwyMDUsNzcsMjU1LDM5LDYzLDQ3LDAsOCwxMjIsMTQxLDAsMTI4LDIzLDE4MiwyNTQsMjA0LDM5LDE5LDI1NSw0LDExMiwyOSwyNTUsMjMsMzYsMTQwLDI1NSwyMTAsMjM0LDExNiwyNTQsNTMsNTAsNjMsMjU1LDEyMSwxNzEsMTA0LDI1NSwxNjAsMjE5LDk0LDAsODcsODIsMTQsMjU0LDIzMSw0Miw1LDAsMTY1LDEzOSwxMjcsMjU0LDg2LDc4LDM4LDAsMTMwLDYwLDY2LDI1NCwyMDMsMzAsNDUsMjU1LDQ2LDE5NiwxMjIsMSwyNDksNTMsMTYyLDI1NSwxMzYsMTQzLDEwMywyNTQsMjE1LDIxMCwxMTQsMCwyMzEsNywxNjAsMjU0LDE2OSwxNTIsNDIsMjU1LDExMSw0NSwyNDYsMCwxNDIsMTMxLDEzNSwyNTUsMTMxLDcxLDIwNCwyNTUsMzYsMjI2LDExLDAsMCwyOCwyNDIsMjU1LDIyNSwxMzgsMjEzLDI1NSwyNDcsNDYsMjE2LDI1NCwyNDUsMywxODMsMCwxMDgsMjUyLDc0LDEsMjA2LDI2LDQ4LDI1NSwyMDUsNTQsMjQ2LDI1NSwyMTEsMTk4LDM2LDI1NSwxMjEsMzUsNTAsMCw1MiwyMTYsMjAyLDI1NSwzOCwxMzksMTI5LDI1NCwyNDIsNzMsMTQ4LDAsNjcsMjMxLDE0MSwyNTUsNDIsNDcsMjA0LDAsNzgsMTE2LDI1LDEsNCwyMjUsMTkxLDI1NSw2LDE0NywyMjgsMCw1OCw4OCwxNzcsMCwxMjIsMTY1LDIyOSwyNTUsMjUyLDgzLDIwMSwyNTUsMjI0LDE2Nyw5NiwxLDE3NywxODQsMTU4LDI1NSwyNDIsMTA1LDE3OSwxLDI0OCwxOTgsMjQwLDAsMTMzLDY2LDIwMywxLDI1NCwzNiw0NywwLDQ1LDI0LDExNSwyNTUsMTE5LDYyLDI1NCwwLDE5NiwyMjUsMTg2LDI1NCwxMjMsMTQxLDE3MiwwLDI2LDg1LDQxLDI1NSwyMjYsMTExLDE4MywwLDIxMywyMzEsMTUxLDAsNCw1OSw3LDI1NSwyMzgsMTM4LDE0OCwwLDY2LDE0NywzMywyNTUsMzEsMjQ2LDE0MSwyNTUsMjA5LDE0MSwxMTYsMjU1LDEwNCwxMTIsMzEsMCw4OCwxNjEsMTcyLDAsODMsMjE1LDIzMCwyNTQsNDcsMTExLDE1MSwwLDQ1LDM4LDUyLDEsMTMyLDQ1LDIwNCwwLDEzOCwxMjgsMTA5LDI1NCwyMzMsMTE3LDEzNCwyNTUsMjQzLDE5MCwxNzMsMjU0LDI0MSwyMzYsMjQwLDAsODIsMTI3LDIzNiwyNTQsNDAsMjIzLDE2MSwyNTUsMTEwLDE4MiwyMjUsMjU1LDEyMywxNzQsMjM5LDAsMTM1LDI0MiwxNDUsMSw1MSwyMDksMTU0LDAsMTUwLDMsMTE1LDI1NCwyMTcsMTY0LDI1MiwyNTUsNTUsMTU2LDY5LDEsODQsOTQsMjU1LDI1NSwyMzIsNzMsNDUsMSwyMCwxOSwyMTIsMjU1LDk2LDE5Nyw1OSwyNTQsOTYsMjUxLDMzLDAsMzgsMTk5LDczLDEsNjQsMTcyLDI0NywyNTUsMTE3LDExNiw1NiwyNTUsMjI4LDE3LDE4LDAsNjIsMTM4LDEwMywxLDI0NiwyMjksMTY0LDI1NSwyNDQsMTE4LDIwMSwyNTQsODYsMzIsMTU5LDI1NSwxMDksMzQsMTM3LDEsODUsMjExLDE4NiwwLDEwLDE5MywxOTMsMjU0LDEyMiwxOTQsMTc3LDAsMTIyLDIzOCwxMDIsMjU1LDE2MiwyMTgsMTcxLDAsMTA4LDIxNywxNjEsMSwxNTgsMTcwLDM0LDAsMTc2LDQ3LDE1NSwxLDE4MSwyMjgsMTEsMjU1LDgsMTU2LDAsMCwxNiw3NSw5MywwLDIwNiw5OCwyNTUsMSw1OCwxNTQsMzUsMCwxMiwyNDMsMTg0LDI1NCw2NywxMTcsNjYsMjU1LDIzMCwyMjksMTIzLDAsMjAxLDQyLDExMCwwLDEzNCwyMjgsMTc4LDI1NCwxODYsMTA4LDExOCwyNTUsNTgsMTksMTU0LDI1NSw4MiwxNjksNjIsMjU1LDExNCwxNDMsMTE1LDEsMjM5LDE5Niw1MCwyNTUsMTczLDQ4LDE5MywyNTUsMTQ3LDIsODQsMjU1LDE1MCwxMzQsMTQ3LDI1NCw5NSwyMzIsNzMsMCwxMDksMjI3LDUyLDI1NCwxOTEsMTM3LDEwLDAsNDAsMjA0LDMwLDI1NCw3Niw1Miw5NywyNTUsMTY0LDIzNSwxMjYsMCwyNTQsMTI0LDE4OCwwLDc0LDE4MiwyMSwxLDEyMSwyOSwzNSwyNTUsMjQxLDMwLDcsMjU0LDg1LDIxOCwyMTQsMjU1LDcsODQsMTUwLDI1NCw4MSwyNywxMTcsMjU1LDE2MCwxNTksMTUyLDI1NCw2NiwyNCwyMjEsMjU1LDIyNywxMCw2MCwxLDE0MSwxMzUsMTAyLDAsMjA4LDE4OSwxNTAsMSwxMTcsMTc5LDkyLDAsMTMyLDIyLDEzNiwyNTUsMTIwLDE5OSwyOCwwLDIxLDEyOSw3OSwyNTQsMTgyLDksNjUsMCwyMTgsMTYzLDE2OSwwLDI0NiwxNDcsMTk4LDI1NSwxMDcsMzgsMTQ0LDEsNzgsMTc1LDIwNSwyNTUsMjE0LDUsMjUwLDI1NCw0Nyw4OCwyOSwyNTUsMTY0LDQ3LDIwNCwyNTUsNDMsNTUsNiwyNTUsMTMxLDEzNCwyMDcsMjU0LDExNiwxMDAsMjE0LDAsOTYsMTQwLDc1LDEsMTA2LDIyMCwxNDQsMCwxOTUsMzIsMjgsMSwxNzIsODEsNSwyNTUsMTk5LDE3OSw1MiwyNTUsMzcsODQsMjAzLDAsMTcwLDExMiwxNzQsMCwxMSw0LDkxLDAsNjksMjQ0LDI3LDEsMTE3LDEzMSw5MiwwLDMzLDE1MiwxNzUsMjU1LDE0MCwxNTMsMTA3LDI1NSwyNTEsMTM1LDQzLDI1NCw4NywxMzgsNCwyNTUsMTk4LDIzNCwxNDcsMjU0LDEyMSwxNTIsODQsMjU1LDIwNSwxMDEsMTU1LDEsMTU3LDksMjUsMCw3MiwxMDYsMTcsMjU0LDEwOCwxNTMsMCwyNTUsMTg5LDIyOSwxODYsMCwxOTMsOCwxNzYsMjU1LDE3NCwxNDksMjA5LDAsMjM4LDEzMCwyOSwwLDIzMywyMTQsMTI2LDEsNjEsMjI2LDEwMiwwLDU3LDE2Myw0LDEsMTk4LDExMSw1MSwyNTUsNDUsNzksNzgsMSwxMTUsMjEwLDEwLDI1NSwyMTgsOSwyNSwyNTUsMTU4LDEzOSwxOTgsMjU1LDIxMSw4MiwxODcsMjU0LDgwLDEzMyw4MywwLDE1NywxMjksMjMwLDEsMjQzLDEzMywxMzQsMjU1LDQwLDEzNiwxNiwwLDc3LDEwNyw3OSwyNTUsMTgzLDg1LDkyLDEsMTc3LDIwNCwyMDIsMCwxNjMsNzEsMTQ3LDI1NSwxNTIsNjksMTkwLDAsMTcyLDUxLDE4OCwxLDI1MCwyMTAsMTcyLDI1NSwyMTEsMjQyLDExMywxLDg5LDg5LDI2LDI1NSw2NCw2NiwxMTEsMjU0LDExNiwxNTIsNDIsMCwxNjEsMzksMjcsMjU1LDU0LDgwLDI1NCwwLDEwNiwyMDksMTE1LDEsMTAzLDEyNCw5NywwLDIyMSwyMzAsOTgsMjU1LDMxLDIzMSw2LDAsMTc4LDE5MiwxMjAsMjU0LDE1LDIxNywyMDMsMjU1LDEyNCwxNTgsNzksMCwxMTIsMTQ1LDI0NywwLDkyLDI1MCw0OCwxLDE2MywxODEsMTkzLDI1NSwzNyw0NywxNDIsMjU0LDE0NCwxODksMTY1LDI1NSw0NiwxNDYsMjQwLDAsNiw3NSwxMjgsMCw0MSwxNTcsMjAwLDI1NCw4NywxMjEsMjEzLDAsMSwxMTMsMjM2LDAsNSw0NSwyNTAsMCwxNDQsMTIsODIsMCwzMSwxMDgsMjMxLDAsMjI1LDIzOSwxMTksMjU1LDE2Nyw3LDE4OSwyNTUsMTg3LDIyOCwxMzIsMjU1LDExMCwxODksMzQsMCw5NCw0NCwyMDQsMSwxNjIsNTIsMTk3LDAsNzgsMTg4LDI0MSwyNTQsNTcsMjAsMTQxLDAsMjQ0LDE0Niw0NywxLDIwNiwxMDAsNTEsMCwxMjUsMTA3LDE0OCwyNTQsMjcsMTk1LDc3LDAsMTUyLDI1Myw5MCwxLDcsMTQzLDE0NCwyNTUsNTEsMzcsMzEsMCwzNCwxMTksMzgsMjU1LDcsMTk3LDExOCwwLDE1MywxODgsMjExLDAsMTUxLDIwLDExNiwyNTQsMjQ1LDY1LDUyLDI1NSwxODAsMjUzLDExMCwxLDQ3LDE3NywyMDksMCwxNjEsOTksMTcsMjU1LDExOCwyMjIsMjAyLDAsMTI1LDE3OSwyNTIsMSwxMjMsNTQsMTI2LDI1NSwxNDUsNTcsMTkxLDAsNTUsMTg2LDEyMSwwLDEwLDI0MywxMzgsMCwyMDUsMjExLDIyOSwyNTUsMTI1LDE1NiwyNDEsMjU0LDE0OCwxNTYsMTg1LDI1NSwyMjcsMTksMTg4LDI1NSwxMjQsNDEsMzIsMjU1LDMxLDM0LDIwNiwyNTQsMTcsNTcsODMsMCwyMDQsMjIsMzcsMjU1LDQyLDk2LDk4LDAsMTE5LDEwMiwxODQsMSwzLDE5MCwyOF0sXCJpOFwiLEFMTE9DX05PTkUsUnVudGltZS5HTE9CQUxfQkFTRSsyMDQ4MCk7YWxsb2NhdGUoWzExMCw4MiwyMTgsMjU1LDIwMCwyMDQsMTkyLDI1NSwyMDEsMTQ1LDExOCwwLDExNywyMDQsMTQ2LDAsMTMyLDMyLDk4LDEsMTkyLDE5NCwxMjEsMCwxMDYsMTYxLDI0OCwxLDIzNyw4OCwxMjQsMCwyMywyMTIsMjYsMCwyMDUsMTcxLDkwLDI1NSwyNDgsNDgsMjE2LDEsMTQxLDM3LDIzMCwyNTUsMTI0LDIwMywwLDI1NCwxNTgsMTY4LDMwLDI1NSwyMTQsMjQ4LDIxLDAsMTEyLDE4Nyw3LDI1NSw3NSwxMzMsMjM5LDI1NSw3NCwyMjcsMjQzLDI1NSwyNTAsMTQ3LDcwLDAsMjE0LDEyMCwxNjIsMCwxNjcsOSwxNzksMjU1LDIyLDE1OCwxOCwwLDIxOCw3NywyMDksMSw5NywxMDksODEsMjU1LDI0NCwzMywxNzksMjU1LDU3LDUyLDU3LDI1NSw2NSwxNzIsMjEwLDI1NSwyNDksNzEsMjA5LDI1NSwxNDIsMTY5LDIzOCwwLDE1OCwxODksMTUzLDI1NSwxNzQsMjU0LDEwMywyNTQsOTgsMzMsMTQsMCwxNDEsNzYsMjMwLDI1NSwxMTMsMTM5LDUyLDI1NSwxNSw1OCwyMTIsMCwxNjgsMjE1LDIwMSwyNTUsMjQ4LDIwNCwyMTUsMSwyMjMsNjgsMTYwLDI1NSw1NywxNTQsMTgzLDI1NCw0NywyMzEsMTIxLDAsMTA2LDE2NiwxMzcsMCw4MSwxMzYsMTM4LDAsMTY1LDQzLDUxLDAsMjMxLDEzOSw2MSwwLDU3LDk1LDU5LDI1NCwxMTgsOTgsMjUsMjU1LDE1MSw2MywyMzYsMSw5NCwxOTAsMjUwLDI1NSwxNjksMTg1LDExNCwxLDUsMjUwLDU4LDI1NSw3NSwxMDUsOTcsMSwyMTUsMjIzLDEzNCwwLDExMyw5OSwxNjMsMSwxMjgsNjIsMTEyLDAsOTksMTA2LDE0NywwLDE2MywxOTUsMTAsMCwzMywyMDUsMTgyLDAsMjE0LDE0LDE3NCwyNTUsMTI5LDM4LDIzMSwyNTUsNTMsMTgyLDIyMywwLDk4LDQyLDE1OSwyNTUsMjQ3LDEzLDQwLDAsMTg4LDIxMCwxNzcsMSw2LDIxLDAsMjU1LDI1NSw2MSwxNDgsMjU0LDEzNyw0NSwxMjksMjU1LDg5LDI2LDExNiwyNTQsMTI2LDM4LDExNCwwLDI1MSw1MCwyNDIsMjU0LDEyMSwxMzQsMTI4LDI1NSwyMDQsMjQ5LDE2NywyNTQsMTY1LDIzNSwyMTUsMCwyMDIsMTc3LDI0MywwLDEzMywxNDEsNjIsMCwyNDAsMTMwLDE5MCwxLDExMCwxNzUsMjU1LDAsMCwyMCwxNDYsMSwzNywyMTAsMTIxLDI1NSw3LDM5LDEzMCwwLDE0MiwyNTAsODQsMjU1LDE0MSwyMDAsMjA3LDAsOSw5NSwxMDQsMjU1LDExLDI0NCwxNzQsMCwxMzQsMjMyLDEyNiwwLDE2NywxLDEyMywyNTQsMTYsMTkzLDE0OSwyNTUsMjMyLDIzMywyMzksMSwyMTMsNzAsMTEyLDI1NSwyNTIsMTE2LDE2MCwyNTQsMjQyLDIyMiwyMjAsMjU1LDIwNSw4NSwyMjcsMCw3LDE4NSw1OCwwLDExOCwyNDcsNjMsMSwxMTYsNzcsMTc3LDI1NSw2MiwyNDUsMjAwLDI1NCw2MywxOCwzNywyNTUsMTA3LDUzLDIzMiwyNTQsNTAsMjIxLDIxMSwwLDE2MiwyMTksNywyNTQsMiw5NCw0MywwLDE4Miw2MiwxODIsMjU0LDE2MCw3OCwyMDAsMjU1LDEzNSwxNDAsMTcwLDAsMjM1LDE4NCwyMjgsMCwxNzUsNTMsMTM4LDI1NCw4MCw1OCw3NywyNTUsMTUyLDIwMSwyLDEsNjMsMTk2LDM0LDAsNSwzMCwxODQsMCwxNzEsMTc2LDE1NCwwLDEyMSw1OSwyMDYsMCwzOCw5OSwzOSwwLDE3Miw4MCw3NywyNTQsMCwxMzQsMTUxLDAsMTg2LDMzLDI0MSwyNTQsOTQsMjUzLDIyMywyNTUsNDQsMTE0LDI1MiwwLDEwOCwxMjYsNTcsMjU1LDIwMSw0MCwxMywyNTUsMzksMjI5LDI3LDI1NSwzOSwyMzksMjMsMSwxNTEsMTIxLDUxLDI1NSwxNTMsMTUwLDI0OCwwLDEwLDIzNCwxNzQsMjU1LDExOCwyNDYsNCwyNTQsMjAwLDI0NSwzOCwwLDY5LDE2MSwyNDIsMSwxNiwxNzgsMTUwLDAsMTEzLDU2LDEzMCwwLDE3MSwzMSwxMDUsMCwyNiw4OCwxMDgsMjU1LDQ5LDQyLDEwNiwwLDI1MSwxNjksNjYsMCw2OSw5MywxNDksMCwyMCw1NywyNTQsMCwxNjQsMjUsMTExLDAsOTAsMTg4LDkwLDI1NSwyMDQsNCwxOTcsMCw0MCwyMTMsNTAsMSwyMTIsOTYsMTMyLDI1NSw4OCwxMzgsMTgwLDI1NCwyMjgsMTQ2LDEyNCwyNTUsMTg0LDI0NiwyNDcsMCw2NSwxMTcsODYsMjU1LDI1MywxMDIsMjEwLDI1NCwyNTQsMTIxLDM2LDAsMTM3LDExNSwzLDI1NSw2MCwyNCwyMTYsMCwxMzQsMTgsMjksMCw1OSwyMjYsOTcsMCwxNzYsMTQyLDcxLDAsNywyMDksMTYxLDAsMTg5LDg0LDUxLDI1NCwxNTUsMjUwLDcyLDAsMjEzLDg0LDIzNSwyNTUsNDUsMjIyLDIyNCwwLDIzOCwxNDgsMTQzLDI1NSwxNzAsNDIsNTMsMjU1LDc4LDE2NywxMTcsMCwxODYsMCw0MCwyNTUsMTI1LDE3NywxMDMsMjU1LDY5LDIyNSw2NiwwLDIyNyw3LDg4LDEsNzUsMTcyLDYsMCwxNjksNDUsMjI3LDEsMTYsMzYsNzAsMjU1LDUwLDIsOSwyNTUsMTM5LDE5MywyMiwwLDE0MywxODMsMjMxLDI1NCwyMTgsNjksNTAsMCwyMzYsNTYsMTYxLDEsMjEzLDEzMSw0MiwwLDEzOCwxNDUsNDQsMjU0LDEzNiwyMjksNDAsMjU1LDQ5LDYzLDM1LDI1NSw2MSwxNDUsMjQ1LDI1NSwxMDEsMTkyLDIsMjU0LDIzMiwxNjcsMTEzLDAsMTUyLDEwNCwzOCwxLDEyMSwxODUsMjE4LDAsMTIxLDEzOSwyMTEsMjU0LDExOSwyNDAsMzUsMCw2NSwxODksMjE3LDI1NCwxODcsMTc5LDE2MiwyNTUsMTYwLDE4NywyMzAsMCw2MiwyNDgsMTQsMjU1LDYwLDc4LDk3LDAsMjU1LDI0NywxNjMsMjU1LDIyNSw1OSw5MSwyNTUsMTA3LDcxLDU4LDI1NSwyNDEsNDcsMzMsMSw1MCwxMTcsMjM2LDAsMjE5LDE3Nyw2MywyNTQsMjQ0LDkwLDE3OSwwLDM1LDE5NCwyMTUsMjU1LDE4OSw2Nyw1MCwyNTUsMjMsMTM1LDEyOSwwLDEwNCwxODksMzcsMjU1LDE4NSw1NywxOTQsMCwzNSw2MiwyMzEsMjU1LDIyMCwyNDgsMTA4LDAsMTIsMjMxLDE3OCwwLDE0Myw4MCw5MSwxLDEzMSw5MywxMDEsMjU1LDE0NCwzOSwyLDEsMjU1LDI1MCwxNzgsMCw1LDE3LDIzNiwyNTQsMTM5LDMyLDQ2LDAsMjA0LDE4OCwzOCwyNTQsMjQ1LDExNSw1MiwyNTUsMTkxLDExMyw3MywyNTQsMTkxLDEwOCw2OSwyNTUsMjIsNjksMjQ1LDEsMjMsMjAzLDE3OCwwLDE3MCw5OSwxNzAsMCw2NSwyNDgsMTExLDAsMzcsMTA4LDE1MywyNTUsNjQsMzcsNjksMCwwLDg4LDYyLDI1NCw4OSwxNDgsMTQ0LDI1NSwxOTEsNjgsMjI0LDEsMjQxLDM5LDUzLDAsNDEsMjAzLDIzNywyNTUsMTQ1LDEyNiwxOTQsMjU1LDIyMSw0MiwyNTMsMjU1LDI1LDk5LDE1MSwwLDk3LDI1MywyMjMsMSw3NCwxMTUsNDksMjU1LDYsMTc1LDcyLDI1NSw1OSwxNzYsMjAzLDAsMTI0LDE4MywyNDksMSwyMjgsMjI4LDk5LDAsMTI5LDEyLDIwNywyNTQsMTY4LDE5MiwxOTUsMjU1LDIwNCwxNzYsMTYsMjU0LDE1MiwyMzQsMTcxLDAsNzcsMzcsODUsMjU1LDMzLDEyMCwxMzUsMjU1LDE0MiwxOTQsMjI3LDEsMzEsMjE0LDU4LDAsMjEzLDE4NywxMjUsMjU1LDIzMiw0Niw2MCwyNTUsMTkwLDExNiw0MiwyNTQsMTUxLDE3OCwxOSwyNTUsNTEsNjIsMjM3LDI1NCwyMDQsMjM2LDE5MywwLDE5NCwyMzIsNjAsMCwxNzIsMzQsMTU3LDI1NSwxODksMTYsMTg0LDI1NCwxMDMsMyw5NSwyNTUsMTQxLDIzMywzNiwyNTQsNDEsMjUsMTEsMjU1LDIxLDE5NSwxNjYsMCwxMTgsMjQ1LDQ1LDAsNjcsMjEzLDE0OSwyNTUsMTU5LDEyLDE4LDI1NSwxODcsMTY0LDIyNywxLDE2MCwyNSw1LDAsMTIsNzgsMTk1LDEsNDMsMTk3LDIyNSwwLDQ4LDE0Miw0MSwyNTQsMTk2LDE1NSw2MCwyNTUsMjIzLDE5OSwxOCwxLDE0NSwxMzYsMTU2LDAsMjUyLDExNywxNjksMjU0LDE0NSwyMjYsMjM4LDAsMjM5LDIzLDEwNywwLDEwOSwxODEsMTg4LDI1NSwyMzAsMTEyLDQ5LDI1NCw3MywxNzAsMjM3LDI1NSwyMzEsMTgzLDIyNywyNTUsODAsMjIwLDIwLDAsMTk0LDEwNywxMjcsMSwxMjcsMjA1LDEwMSwwLDQ2LDUyLDE5NywxLDIxMCwxNzEsMzYsMjU1LDg4LDMsOTAsMjU1LDU2LDE1MSwxNDEsMCw5NiwxODcsMjU1LDI1NSw0Miw3OCwyMDAsMCwyNTQsNzAsNzAsMSwyNDQsMTI1LDE2OCwwLDIwNCw2OCwxMzgsMSwxMjQsMjE1LDcwLDAsMTAyLDY2LDIwMCwyNTQsMTcsNTIsMjI4LDAsMTE3LDIyMCwxNDMsMjU0LDIwMywyNDgsMTIzLDAsNTYsMTgsMTc0LDI1NSwxODYsMTUxLDE2NCwyNTUsNTEsMjMyLDIwOCwxLDE2MCwyMjgsNDMsMjU1LDI0OSwyOSwyNSwxLDY4LDE5MCw2MywwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyMjQsMTI0LDAsMCwwLDAsMCwwLDUsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDE4LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxOCwwLDAsMCwxOSwwLDAsMCw2NSwxMzIsMCwwLDAsNCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEwLDI1NSwyNTUsMjU1LDI1NSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEwMSwxMjAsMTEyLDk3LDExMCwxMDAsMzIsNTEsNTAsNDUsOTgsMTIxLDExNiwxMDEsMzIsMTA3LDExMSwxMTcsMTE2LDEwOCwxMDEsMTEwLDMyLDYwLDYxLDMyLDg1LDczLDc4LDg0LDU2LDk1LDc3LDY1LDg4LDAsOTksMTE0LDEyMSwxMTIsMTE2LDExMSw5NSwxMDMsMTAxLDExMCwxMDEsMTE0LDEwNSw5OSwxMDQsOTcsMTE1LDEwNCw0Nyw5OCwxMDgsOTcsMTA3LDEwMSw1MCw0NywxMTQsMTAxLDEwMiw0NywxMDMsMTAxLDExMCwxMDEsMTE0LDEwNSw5OSwxMDQsOTcsMTE1LDEwNCw5NSw5OCwxMDgsOTcsMTA3LDEwMSw1MCw5OCw0Niw5OSwwLDk5LDExNCwxMjEsMTEyLDExNiwxMTEsOTUsMTAzLDEwMSwxMTAsMTAxLDExNCwxMDUsOTksMTA0LDk3LDExNSwxMDQsOTUsOTgsMTA4LDk3LDEwNywxMDEsNTAsOTgsMCwxMDcsMTAxLDEyMSwxMDgsMTAxLDExMCwzMiw2MCw2MSwzMiw4NSw3Myw3OCw4NCw1Niw5NSw3Nyw2NSw4OCwwLDk5LDExNCwxMjEsMTEyLDExNiwxMTEsOTUsMTAzLDEwMSwxMTAsMTAxLDExNCwxMDUsOTksMTA0LDk3LDExNSwxMDQsOTUsOTgsMTA4LDk3LDEwNywxMDEsNTAsOTgsOTUsMTA1LDExMCwxMDUsMTE2LDAsOTksMTE0LDEyMSwxMTIsMTE2LDExMSw5NSwxMDMsMTAxLDExMCwxMDEsMTE0LDEwNSw5OSwxMDQsOTcsMTE1LDEwNCw5NSw5OCwxMDgsOTcsMTA3LDEwMSw1MCw5OCw5NSwxMDIsMTA1LDExMCw5NywxMDgsMCwxMjgsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMTI4LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMzYsNTUsMzYsMCwxMDEsMTIwLDExMiw5NywxMTAsMTAwLDMyLDUxLDUwLDQ1LDk4LDEyMSwxMTYsMTAxLDMyLDEwNywwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMTIzLDMyLDExNCwxMDEsMTE2LDExNywxMTQsMTEwLDMyLDc3LDExMSwxMDAsMTE3LDEwOCwxMDEsNDYsMTAzLDEwMSwxMTYsODIsOTcsMTEwLDEwMCwxMTEsMTA5LDg2LDk3LDEwOCwxMTcsMTAxLDQwLDQxLDU5LDMyLDEyNSwwLDEyMywzMiwxMDUsMTAyLDMyLDQwLDc3LDExMSwxMDAsMTE3LDEwOCwxMDEsNDYsMTAzLDEwMSwxMTYsODIsOTcsMTEwLDEwMCwxMTEsMTA5LDg2LDk3LDEwOCwxMTcsMTAxLDMyLDYxLDYxLDYxLDMyLDExNywxMTAsMTAwLDEwMSwxMDIsMTA1LDExMCwxMDEsMTAwLDQxLDMyLDEyMywzMiwxMTYsMTE0LDEyMSwzMiwxMjMsMzIsMTE4LDk3LDExNCwzMiwxMTksMTA1LDExMCwxMDAsMTExLDExOSw5NSwzMiw2MSwzMiwzNCwxMTEsOTgsMTA2LDEwMSw5OSwxMTYsMzQsMzIsNjEsNjEsNjEsMzIsMTE2LDEyMSwxMTIsMTAxLDExMSwxMDIsMzIsMTE5LDEwNSwxMTAsMTAwLDExMSwxMTksMzIsNjMsMzIsMTE5LDEwNSwxMTAsMTAwLDExMSwxMTksMzIsNTgsMzIsMTE1LDEwMSwxMDgsMTAyLDQ0LDMyLDk5LDExNCwxMjEsMTEyLDExNiwxMTEsOTUsMzIsNjEsMzIsMTE2LDEyMSwxMTIsMTAxLDExMSwxMDIsMzIsMTE5LDEwNSwxMTAsMTAwLDExMSwxMTksOTUsNDYsOTksMTE0LDEyMSwxMTIsMTE2LDExMSwzMiwzMyw2MSw2MSwzMiwzNCwxMTcsMTEwLDEwMCwxMDEsMTAyLDEwNSwxMTAsMTAxLDEwMCwzNCwzMiw2MywzMiwxMTksMTA1LDExMCwxMDAsMTExLDExOSw5NSw0Niw5OSwxMTQsMTIxLDExMiwxMTYsMTExLDMyLDU4LDMyLDExOSwxMDUsMTEwLDEwMCwxMTEsMTE5LDk1LDQ2LDEwOSwxMTUsNjcsMTE0LDEyMSwxMTIsMTE2LDExMSw0NCwzMiwxMTQsOTcsMTEwLDEwMCwxMTEsMTA5LDg2LDk3LDEwOCwxMTcsMTAxLDExNSw4MywxMTYsOTcsMTEwLDEwMCw5NywxMTQsMTAwLDMyLDYxLDMyLDEwMiwxMTcsMTEwLDk5LDExNiwxMDUsMTExLDExMCw0MCw0MSwzMiwxMjMsMzIsMTE4LDk3LDExNCwzMiw5OCwxMTcsMTAyLDMyLDYxLDMyLDExMCwxMDEsMTE5LDMyLDg1LDEwNSwxMTAsMTE2LDUxLDUwLDY1LDExNCwxMTQsOTcsMTIxLDQwLDQ5LDQxLDU5LDMyLDk5LDExNCwxMjEsMTEyLDExNiwxMTEsOTUsNDYsMTAzLDEwMSwxMTYsODIsOTcsMTEwLDEwMCwxMTEsMTA5LDg2LDk3LDEwOCwxMTcsMTAxLDExNSw0MCw5OCwxMTcsMTAyLDQxLDU5LDMyLDExNCwxMDEsMTE2LDExNywxMTQsMTEwLDMyLDk4LDExNywxMDIsOTEsNDgsOTMsMzIsNjIsNjIsNjIsMzIsNDgsNTksMzIsMTI1LDU5LDMyLDExNCw5NywxMTAsMTAwLDExMSwxMDksODYsOTcsMTA4LDExNywxMDEsMTE1LDgzLDExNiw5NywxMTAsMTAwLDk3LDExNCwxMDAsNDAsNDEsNTksMzIsNzcsMTExLDEwMCwxMTcsMTA4LDEwMSw0NiwxMDMsMTAxLDExNiw4Miw5NywxMTAsMTAwLDExMSwxMDksODYsOTcsMTA4LDExNywxMDEsMzIsNjEsMzIsMTE0LDk3LDExMCwxMDAsMTExLDEwOSw4Niw5NywxMDgsMTE3LDEwMSwxMTUsODMsMTE2LDk3LDExMCwxMDAsOTcsMTE0LDEwMCw1OSwzMiwxMjUsMzIsOTksOTcsMTE2LDk5LDEwNCwzMiw0MCwxMDEsNDEsMzIsMTIzLDMyLDExNiwxMTQsMTIxLDMyLDEyMywzMiwxMTgsOTcsMTE0LDMyLDk5LDExNCwxMjEsMTEyLDExNiwxMTEsMzIsNjEsMzIsMTE0LDEwMSwxMTMsMTE3LDEwNSwxMTQsMTAxLDQwLDM5LDk5LDExNCwxMjEsMTEyLDExNiwxMTEsMzksNDEsNDQsMzIsMTE0LDk3LDExMCwxMDAsMTExLDEwOSw4Niw5NywxMDgsMTE3LDEwMSw3OCwxMTEsMTAwLDEwMSw3NCw4MywzMiw2MSwzMiwxMDIsMTE3LDExMCw5OSwxMTYsMTA1LDExMSwxMTAsNDAsNDEsMzIsMTIzLDMyLDExOCw5NywxMTQsMzIsOTgsMTE3LDEwMiwzMiw2MSwzMiw5OSwxMTQsMTIxLDExMiwxMTYsMTExLDQ2LDExNCw5NywxMTAsMTAwLDExMSwxMDksNjYsMTIxLDExNiwxMDEsMTE1LDQwLDUyLDQxLDU5LDMyLDExNCwxMDEsMTE2LDExNywxMTQsMTEwLDMyLDQwLDk4LDExNywxMDIsOTEsNDgsOTMsMzIsNjAsNjAsMzIsNTAsNTIsMzIsMTI0LDMyLDk4LDExNywxMDIsOTEsNDksOTMsMzIsNjAsNjAsMzIsNDksNTQsMzIsMTI0LDMyLDk4LDExNywxMDIsOTEsNTAsOTMsMzIsNjAsNjAsMzIsNTYsMzIsMTI0LDMyLDk4LDExNywxMDIsOTEsNTEsOTMsNDEsMzIsNjIsNjIsNjIsMzIsNDgsNTksMzIsMTI1LDU5LDMyLDExNCw5NywxMTAsMTAwLDExMSwxMDksODYsOTcsMTA4LDExNywxMDEsNzgsMTExLDEwMCwxMDEsNzQsODMsNDAsNDEsNTksMzIsNzcsMTExLDEwMCwxMTcsMTA4LDEwMSw0NiwxMDMsMTAxLDExNiw4Miw5NywxMTAsMTAwLDExMSwxMDksODYsOTcsMTA4LDExNywxMDEsMzIsNjEsMzIsMTE0LDk3LDExMCwxMDAsMTExLDEwOSw4Niw5NywxMDgsMTE3LDEwMSw3OCwxMTEsMTAwLDEwMSw3NCw4Myw1OSwzMiwxMjUsMzIsOTksOTcsMTE2LDk5LDEwNCwzMiw0MCwxMDEsNDEsMzIsMTIzLDMyLDExNiwxMDQsMTE0LDExMSwxMTksMzIsMzksNzgsMTExLDMyLDExNSwxMDEsOTksMTE3LDExNCwxMDEsMzIsMTE0LDk3LDExMCwxMDAsMTExLDEwOSwzMiwxMTAsMTE3LDEwOSw5OCwxMDEsMTE0LDMyLDEwMywxMDEsMTEwLDEwMSwxMTQsOTcsMTE2LDExMSwxMTQsMzIsMTAyLDExMSwxMTcsMTEwLDEwMCwzOSw1OSwzMiwxMjUsMzIsMTI1LDMyLDEyNSwzMiwxMjUsMCw0OSw0Niw0OCw0Niw1NCwwLDksMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxMDEsMTIwLDExMiw5NywxMTAsMTAwLDMyLDUxLDUwLDQ1LDk4LDEyMSwxMTYsMTAxLDMyLDEwNywxMDEsMTIwLDExMiw5NywxMTAsMTAwLDMyLDUxLDUwLDQ1LDk4LDEyMSwxMTYsMTAxLDMyLDEwN10sXCJpOFwiLEFMTE9DX05PTkUsUnVudGltZS5HTE9CQUxfQkFTRSszMDcyMCk7YWxsb2NhdGUoWzQ2LDQ3LDQ4LDQ5LDUwLDUxLDUyLDUzLDU0LDU1LDU2LDU3LDY1LDY2LDY3LDY4LDY5LDcwLDcxLDcyLDczLDc0LDc1LDc2LDc3LDc4LDc5LDgwLDgxLDgyLDgzLDg0LDg1LDg2LDg3LDg4LDg5LDkwLDk3LDk4LDk5LDEwMCwxMDEsMTAyLDEwMywxMDQsMTA1LDEwNiwxMDcsMTA4LDEwOSwxMTAsMTExLDExMiwxMTMsMTE0LDExNSwxMTYsMTE3LDExOCwxMTksMTIwLDEyMSwxMjIsMF0sXCJpOFwiLEFMTE9DX05PTkUsUnVudGltZS5HTE9CQUxfQkFTRSszNDg3Myk7dmFyIHRlbXBEb3VibGVQdHI9UnVudGltZS5hbGlnbk1lbW9yeShhbGxvY2F0ZSgxMixcImk4XCIsQUxMT0NfU1RBVElDKSw4KTthc3NlcnQodGVtcERvdWJsZVB0ciU4PT0wKTtmdW5jdGlvbiBjb3B5VGVtcEZsb2F0KHB0cil7SEVBUDhbdGVtcERvdWJsZVB0cl09SEVBUDhbcHRyXTtIRUFQOFt0ZW1wRG91YmxlUHRyKzFdPUhFQVA4W3B0cisxXTtIRUFQOFt0ZW1wRG91YmxlUHRyKzJdPUhFQVA4W3B0cisyXTtIRUFQOFt0ZW1wRG91YmxlUHRyKzNdPUhFQVA4W3B0ciszXX1mdW5jdGlvbiBjb3B5VGVtcERvdWJsZShwdHIpe0hFQVA4W3RlbXBEb3VibGVQdHJdPUhFQVA4W3B0cl07SEVBUDhbdGVtcERvdWJsZVB0cisxXT1IRUFQOFtwdHIrMV07SEVBUDhbdGVtcERvdWJsZVB0cisyXT1IRUFQOFtwdHIrMl07SEVBUDhbdGVtcERvdWJsZVB0ciszXT1IRUFQOFtwdHIrM107SEVBUDhbdGVtcERvdWJsZVB0cis0XT1IRUFQOFtwdHIrNF07SEVBUDhbdGVtcERvdWJsZVB0cis1XT1IRUFQOFtwdHIrNV07SEVBUDhbdGVtcERvdWJsZVB0cis2XT1IRUFQOFtwdHIrNl07SEVBUDhbdGVtcERvdWJsZVB0cis3XT1IRUFQOFtwdHIrN119ZnVuY3Rpb24gX19fc2V0RXJyTm8odmFsdWUpe2lmKE1vZHVsZVtcIl9fX2Vycm5vX2xvY2F0aW9uXCJdKUhFQVAzMltNb2R1bGVbXCJfX19lcnJub19sb2NhdGlvblwiXSgpPj4yXT12YWx1ZTtyZXR1cm4gdmFsdWV9dmFyIEVSUk5PX0NPREVTPXtFUEVSTToxLEVOT0VOVDoyLEVTUkNIOjMsRUlOVFI6NCxFSU86NSxFTlhJTzo2LEUyQklHOjcsRU5PRVhFQzo4LEVCQURGOjksRUNISUxEOjEwLEVBR0FJTjoxMSxFV09VTERCTE9DSzoxMSxFTk9NRU06MTIsRUFDQ0VTOjEzLEVGQVVMVDoxNCxFTk9UQkxLOjE1LEVCVVNZOjE2LEVFWElTVDoxNyxFWERFVjoxOCxFTk9ERVY6MTksRU5PVERJUjoyMCxFSVNESVI6MjEsRUlOVkFMOjIyLEVORklMRToyMyxFTUZJTEU6MjQsRU5PVFRZOjI1LEVUWFRCU1k6MjYsRUZCSUc6MjcsRU5PU1BDOjI4LEVTUElQRToyOSxFUk9GUzozMCxFTUxJTks6MzEsRVBJUEU6MzIsRURPTTozMyxFUkFOR0U6MzQsRU5PTVNHOjQyLEVJRFJNOjQzLEVDSFJORzo0NCxFTDJOU1lOQzo0NSxFTDNITFQ6NDYsRUwzUlNUOjQ3LEVMTlJORzo0OCxFVU5BVENIOjQ5LEVOT0NTSTo1MCxFTDJITFQ6NTEsRURFQURMSzozNSxFTk9MQ0s6MzcsRUJBREU6NTIsRUJBRFI6NTMsRVhGVUxMOjU0LEVOT0FOTzo1NSxFQkFEUlFDOjU2LEVCQURTTFQ6NTcsRURFQURMT0NLOjM1LEVCRk9OVDo1OSxFTk9TVFI6NjAsRU5PREFUQTo2MSxFVElNRTo2MixFTk9TUjo2MyxFTk9ORVQ6NjQsRU5PUEtHOjY1LEVSRU1PVEU6NjYsRU5PTElOSzo2NyxFQURWOjY4LEVTUk1OVDo2OSxFQ09NTTo3MCxFUFJPVE86NzEsRU1VTFRJSE9QOjcyLEVET1RET1Q6NzMsRUJBRE1TRzo3NCxFTk9UVU5JUTo3NixFQkFERkQ6NzcsRVJFTUNIRzo3OCxFTElCQUNDOjc5LEVMSUJCQUQ6ODAsRUxJQlNDTjo4MSxFTElCTUFYOjgyLEVMSUJFWEVDOjgzLEVOT1NZUzozOCxFTk9URU1QVFk6MzksRU5BTUVUT09MT05HOjM2LEVMT09QOjQwLEVPUE5PVFNVUFA6OTUsRVBGTk9TVVBQT1JUOjk2LEVDT05OUkVTRVQ6MTA0LEVOT0JVRlM6MTA1LEVBRk5PU1VQUE9SVDo5NyxFUFJPVE9UWVBFOjkxLEVOT1RTT0NLOjg4LEVOT1BST1RPT1BUOjkyLEVTSFVURE9XTjoxMDgsRUNPTk5SRUZVU0VEOjExMSxFQUREUklOVVNFOjk4LEVDT05OQUJPUlRFRDoxMDMsRU5FVFVOUkVBQ0g6MTAxLEVORVRET1dOOjEwMCxFVElNRURPVVQ6MTEwLEVIT1NURE9XTjoxMTIsRUhPU1RVTlJFQUNIOjExMyxFSU5QUk9HUkVTUzoxMTUsRUFMUkVBRFk6MTE0LEVERVNUQUREUlJFUTo4OSxFTVNHU0laRTo5MCxFUFJPVE9OT1NVUFBPUlQ6OTMsRVNPQ0tUTk9TVVBQT1JUOjk0LEVBRERSTk9UQVZBSUw6OTksRU5FVFJFU0VUOjEwMixFSVNDT05OOjEwNixFTk9UQ09OTjoxMDcsRVRPT01BTllSRUZTOjEwOSxFVVNFUlM6ODcsRURRVU9UOjEyMixFU1RBTEU6MTE2LEVOT1RTVVA6OTUsRU5PTUVESVVNOjEyMyxFSUxTRVE6ODQsRU9WRVJGTE9XOjc1LEVDQU5DRUxFRDoxMjUsRU5PVFJFQ09WRVJBQkxFOjEzMSxFT1dORVJERUFEOjEzMCxFU1RSUElQRTo4Nn07ZnVuY3Rpb24gX3N5c2NvbmYobmFtZSl7c3dpdGNoKG5hbWUpe2Nhc2UgMzA6cmV0dXJuIFBBR0VfU0laRTtjYXNlIDg1OnJldHVybiB0b3RhbE1lbW9yeS9QQUdFX1NJWkU7Y2FzZSAxMzI6Y2FzZSAxMzM6Y2FzZSAxMjpjYXNlIDEzNzpjYXNlIDEzODpjYXNlIDE1OmNhc2UgMjM1OmNhc2UgMTY6Y2FzZSAxNzpjYXNlIDE4OmNhc2UgMTk6Y2FzZSAyMDpjYXNlIDE0OTpjYXNlIDEzOmNhc2UgMTA6Y2FzZSAyMzY6Y2FzZSAxNTM6Y2FzZSA5OmNhc2UgMjE6Y2FzZSAyMjpjYXNlIDE1OTpjYXNlIDE1NDpjYXNlIDE0OmNhc2UgNzc6Y2FzZSA3ODpjYXNlIDEzOTpjYXNlIDgwOmNhc2UgODE6Y2FzZSA4MjpjYXNlIDY4OmNhc2UgNjc6Y2FzZSAxNjQ6Y2FzZSAxMTpjYXNlIDI5OmNhc2UgNDc6Y2FzZSA0ODpjYXNlIDk1OmNhc2UgNTI6Y2FzZSA1MTpjYXNlIDQ2OnJldHVybiAyMDA4MDk7Y2FzZSA3OTpyZXR1cm4gMDtjYXNlIDI3OmNhc2UgMjQ2OmNhc2UgMTI3OmNhc2UgMTI4OmNhc2UgMjM6Y2FzZSAyNDpjYXNlIDE2MDpjYXNlIDE2MTpjYXNlIDE4MTpjYXNlIDE4MjpjYXNlIDI0MjpjYXNlIDE4MzpjYXNlIDE4NDpjYXNlIDI0MzpjYXNlIDI0NDpjYXNlIDI0NTpjYXNlIDE2NTpjYXNlIDE3ODpjYXNlIDE3OTpjYXNlIDQ5OmNhc2UgNTA6Y2FzZSAxNjg6Y2FzZSAxNjk6Y2FzZSAxNzU6Y2FzZSAxNzA6Y2FzZSAxNzE6Y2FzZSAxNzI6Y2FzZSA5NzpjYXNlIDc2OmNhc2UgMzI6Y2FzZSAxNzM6Y2FzZSAzNTpyZXR1cm4tMTtjYXNlIDE3NjpjYXNlIDE3NzpjYXNlIDc6Y2FzZSAxNTU6Y2FzZSA4OmNhc2UgMTU3OmNhc2UgMTI1OmNhc2UgMTI2OmNhc2UgOTI6Y2FzZSA5MzpjYXNlIDEyOTpjYXNlIDEzMDpjYXNlIDEzMTpjYXNlIDk0OmNhc2UgOTE6cmV0dXJuIDE7Y2FzZSA3NDpjYXNlIDYwOmNhc2UgNjk6Y2FzZSA3MDpjYXNlIDQ6cmV0dXJuIDEwMjQ7Y2FzZSAzMTpjYXNlIDQyOmNhc2UgNzI6cmV0dXJuIDMyO2Nhc2UgODc6Y2FzZSAyNjpjYXNlIDMzOnJldHVybiAyMTQ3NDgzNjQ3O2Nhc2UgMzQ6Y2FzZSAxOnJldHVybiA0NzgzOTtjYXNlIDM4OmNhc2UgMzY6cmV0dXJuIDk5O2Nhc2UgNDM6Y2FzZSAzNzpyZXR1cm4gMjA0ODtjYXNlIDA6cmV0dXJuIDIwOTcxNTI7Y2FzZSAzOnJldHVybiA2NTUzNjtjYXNlIDI4OnJldHVybiAzMjc2ODtjYXNlIDQ0OnJldHVybiAzMjc2NztjYXNlIDc1OnJldHVybiAxNjM4NDtjYXNlIDM5OnJldHVybiAxZTM7Y2FzZSA4OTpyZXR1cm4gNzAwO2Nhc2UgNzE6cmV0dXJuIDI1NjtjYXNlIDQwOnJldHVybiAyNTU7Y2FzZSAyOnJldHVybiAxMDA7Y2FzZSAxODA6cmV0dXJuIDY0O2Nhc2UgMjU6cmV0dXJuIDIwO2Nhc2UgNTpyZXR1cm4gMTY7Y2FzZSA2OnJldHVybiA2O2Nhc2UgNzM6cmV0dXJuIDQ7Y2FzZSA4NDp7aWYodHlwZW9mIG5hdmlnYXRvcj09PVwib2JqZWN0XCIpcmV0dXJuIG5hdmlnYXRvcltcImhhcmR3YXJlQ29uY3VycmVuY3lcIl18fDE7cmV0dXJuIDF9fV9fX3NldEVyck5vKEVSUk5PX0NPREVTLkVJTlZBTCk7cmV0dXJuLTF9TW9kdWxlW1wiX2k2NFN1YnRyYWN0XCJdPV9pNjRTdWJ0cmFjdDtNb2R1bGVbXCJfaTY0QWRkXCJdPV9pNjRBZGQ7TW9kdWxlW1wiX2JpdHNoaWZ0NjRBc2hyXCJdPV9iaXRzaGlmdDY0QXNocjtNb2R1bGVbXCJfbWVtc2V0XCJdPV9tZW1zZXQ7ZnVuY3Rpb24gX3B0aHJlYWRfY2xlYW51cF9wdXNoKHJvdXRpbmUsYXJnKXtfX0FURVhJVF9fLnB1c2goKGZ1bmN0aW9uKCl7UnVudGltZS5keW5DYWxsKFwidmlcIixyb3V0aW5lLFthcmddKX0pKTtfcHRocmVhZF9jbGVhbnVwX3B1c2gubGV2ZWw9X19BVEVYSVRfXy5sZW5ndGh9TW9kdWxlW1wiX2JpdHNoaWZ0NjRMc2hyXCJdPV9iaXRzaGlmdDY0THNocjtNb2R1bGVbXCJfYml0c2hpZnQ2NFNobFwiXT1fYml0c2hpZnQ2NFNobDtmdW5jdGlvbiBfcHRocmVhZF9jbGVhbnVwX3BvcCgpe2Fzc2VydChfcHRocmVhZF9jbGVhbnVwX3B1c2gubGV2ZWw9PV9fQVRFWElUX18ubGVuZ3RoLFwiY2Fubm90IHBvcCBpZiBzb21ldGhpbmcgZWxzZSBhZGRlZCBtZWFud2hpbGUhXCIpO19fQVRFWElUX18ucG9wKCk7X3B0aHJlYWRfY2xlYW51cF9wdXNoLmxldmVsPV9fQVRFWElUX18ubGVuZ3RofWZ1bmN0aW9uIF9hYm9ydCgpe01vZHVsZVtcImFib3J0XCJdKCl9ZnVuY3Rpb24gX19fbG9jaygpe31mdW5jdGlvbiBfX191bmxvY2soKXt9dmFyIEVSUk5PX01FU1NBR0VTPXswOlwiU3VjY2Vzc1wiLDE6XCJOb3Qgc3VwZXItdXNlclwiLDI6XCJObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5XCIsMzpcIk5vIHN1Y2ggcHJvY2Vzc1wiLDQ6XCJJbnRlcnJ1cHRlZCBzeXN0ZW0gY2FsbFwiLDU6XCJJL08gZXJyb3JcIiw2OlwiTm8gc3VjaCBkZXZpY2Ugb3IgYWRkcmVzc1wiLDc6XCJBcmcgbGlzdCB0b28gbG9uZ1wiLDg6XCJFeGVjIGZvcm1hdCBlcnJvclwiLDk6XCJCYWQgZmlsZSBudW1iZXJcIiwxMDpcIk5vIGNoaWxkcmVuXCIsMTE6XCJObyBtb3JlIHByb2Nlc3Nlc1wiLDEyOlwiTm90IGVub3VnaCBjb3JlXCIsMTM6XCJQZXJtaXNzaW9uIGRlbmllZFwiLDE0OlwiQmFkIGFkZHJlc3NcIiwxNTpcIkJsb2NrIGRldmljZSByZXF1aXJlZFwiLDE2OlwiTW91bnQgZGV2aWNlIGJ1c3lcIiwxNzpcIkZpbGUgZXhpc3RzXCIsMTg6XCJDcm9zcy1kZXZpY2UgbGlua1wiLDE5OlwiTm8gc3VjaCBkZXZpY2VcIiwyMDpcIk5vdCBhIGRpcmVjdG9yeVwiLDIxOlwiSXMgYSBkaXJlY3RvcnlcIiwyMjpcIkludmFsaWQgYXJndW1lbnRcIiwyMzpcIlRvbyBtYW55IG9wZW4gZmlsZXMgaW4gc3lzdGVtXCIsMjQ6XCJUb28gbWFueSBvcGVuIGZpbGVzXCIsMjU6XCJOb3QgYSB0eXBld3JpdGVyXCIsMjY6XCJUZXh0IGZpbGUgYnVzeVwiLDI3OlwiRmlsZSB0b28gbGFyZ2VcIiwyODpcIk5vIHNwYWNlIGxlZnQgb24gZGV2aWNlXCIsMjk6XCJJbGxlZ2FsIHNlZWtcIiwzMDpcIlJlYWQgb25seSBmaWxlIHN5c3RlbVwiLDMxOlwiVG9vIG1hbnkgbGlua3NcIiwzMjpcIkJyb2tlbiBwaXBlXCIsMzM6XCJNYXRoIGFyZyBvdXQgb2YgZG9tYWluIG9mIGZ1bmNcIiwzNDpcIk1hdGggcmVzdWx0IG5vdCByZXByZXNlbnRhYmxlXCIsMzU6XCJGaWxlIGxvY2tpbmcgZGVhZGxvY2sgZXJyb3JcIiwzNjpcIkZpbGUgb3IgcGF0aCBuYW1lIHRvbyBsb25nXCIsMzc6XCJObyByZWNvcmQgbG9ja3MgYXZhaWxhYmxlXCIsMzg6XCJGdW5jdGlvbiBub3QgaW1wbGVtZW50ZWRcIiwzOTpcIkRpcmVjdG9yeSBub3QgZW1wdHlcIiw0MDpcIlRvbyBtYW55IHN5bWJvbGljIGxpbmtzXCIsNDI6XCJObyBtZXNzYWdlIG9mIGRlc2lyZWQgdHlwZVwiLDQzOlwiSWRlbnRpZmllciByZW1vdmVkXCIsNDQ6XCJDaGFubmVsIG51bWJlciBvdXQgb2YgcmFuZ2VcIiw0NTpcIkxldmVsIDIgbm90IHN5bmNocm9uaXplZFwiLDQ2OlwiTGV2ZWwgMyBoYWx0ZWRcIiw0NzpcIkxldmVsIDMgcmVzZXRcIiw0ODpcIkxpbmsgbnVtYmVyIG91dCBvZiByYW5nZVwiLDQ5OlwiUHJvdG9jb2wgZHJpdmVyIG5vdCBhdHRhY2hlZFwiLDUwOlwiTm8gQ1NJIHN0cnVjdHVyZSBhdmFpbGFibGVcIiw1MTpcIkxldmVsIDIgaGFsdGVkXCIsNTI6XCJJbnZhbGlkIGV4Y2hhbmdlXCIsNTM6XCJJbnZhbGlkIHJlcXVlc3QgZGVzY3JpcHRvclwiLDU0OlwiRXhjaGFuZ2UgZnVsbFwiLDU1OlwiTm8gYW5vZGVcIiw1NjpcIkludmFsaWQgcmVxdWVzdCBjb2RlXCIsNTc6XCJJbnZhbGlkIHNsb3RcIiw1OTpcIkJhZCBmb250IGZpbGUgZm10XCIsNjA6XCJEZXZpY2Ugbm90IGEgc3RyZWFtXCIsNjE6XCJObyBkYXRhIChmb3Igbm8gZGVsYXkgaW8pXCIsNjI6XCJUaW1lciBleHBpcmVkXCIsNjM6XCJPdXQgb2Ygc3RyZWFtcyByZXNvdXJjZXNcIiw2NDpcIk1hY2hpbmUgaXMgbm90IG9uIHRoZSBuZXR3b3JrXCIsNjU6XCJQYWNrYWdlIG5vdCBpbnN0YWxsZWRcIiw2NjpcIlRoZSBvYmplY3QgaXMgcmVtb3RlXCIsNjc6XCJUaGUgbGluayBoYXMgYmVlbiBzZXZlcmVkXCIsNjg6XCJBZHZlcnRpc2UgZXJyb3JcIiw2OTpcIlNybW91bnQgZXJyb3JcIiw3MDpcIkNvbW11bmljYXRpb24gZXJyb3Igb24gc2VuZFwiLDcxOlwiUHJvdG9jb2wgZXJyb3JcIiw3MjpcIk11bHRpaG9wIGF0dGVtcHRlZFwiLDczOlwiQ3Jvc3MgbW91bnQgcG9pbnQgKG5vdCByZWFsbHkgZXJyb3IpXCIsNzQ6XCJUcnlpbmcgdG8gcmVhZCB1bnJlYWRhYmxlIG1lc3NhZ2VcIiw3NTpcIlZhbHVlIHRvbyBsYXJnZSBmb3IgZGVmaW5lZCBkYXRhIHR5cGVcIiw3NjpcIkdpdmVuIGxvZy4gbmFtZSBub3QgdW5pcXVlXCIsNzc6XCJmLmQuIGludmFsaWQgZm9yIHRoaXMgb3BlcmF0aW9uXCIsNzg6XCJSZW1vdGUgYWRkcmVzcyBjaGFuZ2VkXCIsNzk6XCJDYW4gICBhY2Nlc3MgYSBuZWVkZWQgc2hhcmVkIGxpYlwiLDgwOlwiQWNjZXNzaW5nIGEgY29ycnVwdGVkIHNoYXJlZCBsaWJcIiw4MTpcIi5saWIgc2VjdGlvbiBpbiBhLm91dCBjb3JydXB0ZWRcIiw4MjpcIkF0dGVtcHRpbmcgdG8gbGluayBpbiB0b28gbWFueSBsaWJzXCIsODM6XCJBdHRlbXB0aW5nIHRvIGV4ZWMgYSBzaGFyZWQgbGlicmFyeVwiLDg0OlwiSWxsZWdhbCBieXRlIHNlcXVlbmNlXCIsODY6XCJTdHJlYW1zIHBpcGUgZXJyb3JcIiw4NzpcIlRvbyBtYW55IHVzZXJzXCIsODg6XCJTb2NrZXQgb3BlcmF0aW9uIG9uIG5vbi1zb2NrZXRcIiw4OTpcIkRlc3RpbmF0aW9uIGFkZHJlc3MgcmVxdWlyZWRcIiw5MDpcIk1lc3NhZ2UgdG9vIGxvbmdcIiw5MTpcIlByb3RvY29sIHdyb25nIHR5cGUgZm9yIHNvY2tldFwiLDkyOlwiUHJvdG9jb2wgbm90IGF2YWlsYWJsZVwiLDkzOlwiVW5rbm93biBwcm90b2NvbFwiLDk0OlwiU29ja2V0IHR5cGUgbm90IHN1cHBvcnRlZFwiLDk1OlwiTm90IHN1cHBvcnRlZFwiLDk2OlwiUHJvdG9jb2wgZmFtaWx5IG5vdCBzdXBwb3J0ZWRcIiw5NzpcIkFkZHJlc3MgZmFtaWx5IG5vdCBzdXBwb3J0ZWQgYnkgcHJvdG9jb2wgZmFtaWx5XCIsOTg6XCJBZGRyZXNzIGFscmVhZHkgaW4gdXNlXCIsOTk6XCJBZGRyZXNzIG5vdCBhdmFpbGFibGVcIiwxMDA6XCJOZXR3b3JrIGludGVyZmFjZSBpcyBub3QgY29uZmlndXJlZFwiLDEwMTpcIk5ldHdvcmsgaXMgdW5yZWFjaGFibGVcIiwxMDI6XCJDb25uZWN0aW9uIHJlc2V0IGJ5IG5ldHdvcmtcIiwxMDM6XCJDb25uZWN0aW9uIGFib3J0ZWRcIiwxMDQ6XCJDb25uZWN0aW9uIHJlc2V0IGJ5IHBlZXJcIiwxMDU6XCJObyBidWZmZXIgc3BhY2UgYXZhaWxhYmxlXCIsMTA2OlwiU29ja2V0IGlzIGFscmVhZHkgY29ubmVjdGVkXCIsMTA3OlwiU29ja2V0IGlzIG5vdCBjb25uZWN0ZWRcIiwxMDg6XCJDYW4ndCBzZW5kIGFmdGVyIHNvY2tldCBzaHV0ZG93blwiLDEwOTpcIlRvbyBtYW55IHJlZmVyZW5jZXNcIiwxMTA6XCJDb25uZWN0aW9uIHRpbWVkIG91dFwiLDExMTpcIkNvbm5lY3Rpb24gcmVmdXNlZFwiLDExMjpcIkhvc3QgaXMgZG93blwiLDExMzpcIkhvc3QgaXMgdW5yZWFjaGFibGVcIiwxMTQ6XCJTb2NrZXQgYWxyZWFkeSBjb25uZWN0ZWRcIiwxMTU6XCJDb25uZWN0aW9uIGFscmVhZHkgaW4gcHJvZ3Jlc3NcIiwxMTY6XCJTdGFsZSBmaWxlIGhhbmRsZVwiLDEyMjpcIlF1b3RhIGV4Y2VlZGVkXCIsMTIzOlwiTm8gbWVkaXVtIChpbiB0YXBlIGRyaXZlKVwiLDEyNTpcIk9wZXJhdGlvbiBjYW5jZWxlZFwiLDEzMDpcIlByZXZpb3VzIG93bmVyIGRpZWRcIiwxMzE6XCJTdGF0ZSBub3QgcmVjb3ZlcmFibGVcIn07dmFyIFBBVEg9e3NwbGl0UGF0aDooZnVuY3Rpb24oZmlsZW5hbWUpe3ZhciBzcGxpdFBhdGhSZT0vXihcXC8/fCkoW1xcc1xcU10qPykoKD86XFwuezEsMn18W15cXC9dKz98KShcXC5bXi5cXC9dKnwpKSg/OltcXC9dKikkLztyZXR1cm4gc3BsaXRQYXRoUmUuZXhlYyhmaWxlbmFtZSkuc2xpY2UoMSl9KSxub3JtYWxpemVBcnJheTooZnVuY3Rpb24ocGFydHMsYWxsb3dBYm92ZVJvb3Qpe3ZhciB1cD0wO2Zvcih2YXIgaT1wYXJ0cy5sZW5ndGgtMTtpPj0wO2ktLSl7dmFyIGxhc3Q9cGFydHNbaV07aWYobGFzdD09PVwiLlwiKXtwYXJ0cy5zcGxpY2UoaSwxKX1lbHNlIGlmKGxhc3Q9PT1cIi4uXCIpe3BhcnRzLnNwbGljZShpLDEpO3VwKyt9ZWxzZSBpZih1cCl7cGFydHMuc3BsaWNlKGksMSk7dXAtLX19aWYoYWxsb3dBYm92ZVJvb3Qpe2Zvcig7dXAtLTt1cCl7cGFydHMudW5zaGlmdChcIi4uXCIpfX1yZXR1cm4gcGFydHN9KSxub3JtYWxpemU6KGZ1bmN0aW9uKHBhdGgpe3ZhciBpc0Fic29sdXRlPXBhdGguY2hhckF0KDApPT09XCIvXCIsdHJhaWxpbmdTbGFzaD1wYXRoLnN1YnN0cigtMSk9PT1cIi9cIjtwYXRoPVBBVEgubm9ybWFsaXplQXJyYXkocGF0aC5zcGxpdChcIi9cIikuZmlsdGVyKChmdW5jdGlvbihwKXtyZXR1cm4hIXB9KSksIWlzQWJzb2x1dGUpLmpvaW4oXCIvXCIpO2lmKCFwYXRoJiYhaXNBYnNvbHV0ZSl7cGF0aD1cIi5cIn1pZihwYXRoJiZ0cmFpbGluZ1NsYXNoKXtwYXRoKz1cIi9cIn1yZXR1cm4oaXNBYnNvbHV0ZT9cIi9cIjpcIlwiKStwYXRofSksZGlybmFtZTooZnVuY3Rpb24ocGF0aCl7dmFyIHJlc3VsdD1QQVRILnNwbGl0UGF0aChwYXRoKSxyb290PXJlc3VsdFswXSxkaXI9cmVzdWx0WzFdO2lmKCFyb290JiYhZGlyKXtyZXR1cm5cIi5cIn1pZihkaXIpe2Rpcj1kaXIuc3Vic3RyKDAsZGlyLmxlbmd0aC0xKX1yZXR1cm4gcm9vdCtkaXJ9KSxiYXNlbmFtZTooZnVuY3Rpb24ocGF0aCl7aWYocGF0aD09PVwiL1wiKXJldHVyblwiL1wiO3ZhciBsYXN0U2xhc2g9cGF0aC5sYXN0SW5kZXhPZihcIi9cIik7aWYobGFzdFNsYXNoPT09LTEpcmV0dXJuIHBhdGg7cmV0dXJuIHBhdGguc3Vic3RyKGxhc3RTbGFzaCsxKX0pLGV4dG5hbWU6KGZ1bmN0aW9uKHBhdGgpe3JldHVybiBQQVRILnNwbGl0UGF0aChwYXRoKVszXX0pLGpvaW46KGZ1bmN0aW9uKCl7dmFyIHBhdGhzPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywwKTtyZXR1cm4gUEFUSC5ub3JtYWxpemUocGF0aHMuam9pbihcIi9cIikpfSksam9pbjI6KGZ1bmN0aW9uKGwscil7cmV0dXJuIFBBVEgubm9ybWFsaXplKGwrXCIvXCIrcil9KSxyZXNvbHZlOihmdW5jdGlvbigpe3ZhciByZXNvbHZlZFBhdGg9XCJcIixyZXNvbHZlZEFic29sdXRlPWZhbHNlO2Zvcih2YXIgaT1hcmd1bWVudHMubGVuZ3RoLTE7aT49LTEmJiFyZXNvbHZlZEFic29sdXRlO2ktLSl7dmFyIHBhdGg9aT49MD9hcmd1bWVudHNbaV06RlMuY3dkKCk7aWYodHlwZW9mIHBhdGghPT1cInN0cmluZ1wiKXt0aHJvdyBuZXcgVHlwZUVycm9yKFwiQXJndW1lbnRzIHRvIHBhdGgucmVzb2x2ZSBtdXN0IGJlIHN0cmluZ3NcIil9ZWxzZSBpZighcGF0aCl7cmV0dXJuXCJcIn1yZXNvbHZlZFBhdGg9cGF0aCtcIi9cIityZXNvbHZlZFBhdGg7cmVzb2x2ZWRBYnNvbHV0ZT1wYXRoLmNoYXJBdCgwKT09PVwiL1wifXJlc29sdmVkUGF0aD1QQVRILm5vcm1hbGl6ZUFycmF5KHJlc29sdmVkUGF0aC5zcGxpdChcIi9cIikuZmlsdGVyKChmdW5jdGlvbihwKXtyZXR1cm4hIXB9KSksIXJlc29sdmVkQWJzb2x1dGUpLmpvaW4oXCIvXCIpO3JldHVybihyZXNvbHZlZEFic29sdXRlP1wiL1wiOlwiXCIpK3Jlc29sdmVkUGF0aHx8XCIuXCJ9KSxyZWxhdGl2ZTooZnVuY3Rpb24oZnJvbSx0byl7ZnJvbT1QQVRILnJlc29sdmUoZnJvbSkuc3Vic3RyKDEpO3RvPVBBVEgucmVzb2x2ZSh0bykuc3Vic3RyKDEpO2Z1bmN0aW9uIHRyaW0oYXJyKXt2YXIgc3RhcnQ9MDtmb3IoO3N0YXJ0PGFyci5sZW5ndGg7c3RhcnQrKyl7aWYoYXJyW3N0YXJ0XSE9PVwiXCIpYnJlYWt9dmFyIGVuZD1hcnIubGVuZ3RoLTE7Zm9yKDtlbmQ+PTA7ZW5kLS0pe2lmKGFycltlbmRdIT09XCJcIilicmVha31pZihzdGFydD5lbmQpcmV0dXJuW107cmV0dXJuIGFyci5zbGljZShzdGFydCxlbmQtc3RhcnQrMSl9dmFyIGZyb21QYXJ0cz10cmltKGZyb20uc3BsaXQoXCIvXCIpKTt2YXIgdG9QYXJ0cz10cmltKHRvLnNwbGl0KFwiL1wiKSk7dmFyIGxlbmd0aD1NYXRoLm1pbihmcm9tUGFydHMubGVuZ3RoLHRvUGFydHMubGVuZ3RoKTt2YXIgc2FtZVBhcnRzTGVuZ3RoPWxlbmd0aDtmb3IodmFyIGk9MDtpPGxlbmd0aDtpKyspe2lmKGZyb21QYXJ0c1tpXSE9PXRvUGFydHNbaV0pe3NhbWVQYXJ0c0xlbmd0aD1pO2JyZWFrfX12YXIgb3V0cHV0UGFydHM9W107Zm9yKHZhciBpPXNhbWVQYXJ0c0xlbmd0aDtpPGZyb21QYXJ0cy5sZW5ndGg7aSsrKXtvdXRwdXRQYXJ0cy5wdXNoKFwiLi5cIil9b3V0cHV0UGFydHM9b3V0cHV0UGFydHMuY29uY2F0KHRvUGFydHMuc2xpY2Uoc2FtZVBhcnRzTGVuZ3RoKSk7cmV0dXJuIG91dHB1dFBhcnRzLmpvaW4oXCIvXCIpfSl9O3ZhciBUVFk9e3R0eXM6W10saW5pdDooZnVuY3Rpb24oKXt9KSxzaHV0ZG93bjooZnVuY3Rpb24oKXt9KSxyZWdpc3RlcjooZnVuY3Rpb24oZGV2LG9wcyl7VFRZLnR0eXNbZGV2XT17aW5wdXQ6W10sb3V0cHV0OltdLG9wczpvcHN9O0ZTLnJlZ2lzdGVyRGV2aWNlKGRldixUVFkuc3RyZWFtX29wcyl9KSxzdHJlYW1fb3BzOntvcGVuOihmdW5jdGlvbihzdHJlYW0pe3ZhciB0dHk9VFRZLnR0eXNbc3RyZWFtLm5vZGUucmRldl07aWYoIXR0eSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRU5PREVWKX1zdHJlYW0udHR5PXR0eTtzdHJlYW0uc2Vla2FibGU9ZmFsc2V9KSxjbG9zZTooZnVuY3Rpb24oc3RyZWFtKXtzdHJlYW0udHR5Lm9wcy5mbHVzaChzdHJlYW0udHR5KX0pLGZsdXNoOihmdW5jdGlvbihzdHJlYW0pe3N0cmVhbS50dHkub3BzLmZsdXNoKHN0cmVhbS50dHkpfSkscmVhZDooZnVuY3Rpb24oc3RyZWFtLGJ1ZmZlcixvZmZzZXQsbGVuZ3RoLHBvcyl7aWYoIXN0cmVhbS50dHl8fCFzdHJlYW0udHR5Lm9wcy5nZXRfY2hhcil7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRU5YSU8pfXZhciBieXRlc1JlYWQ9MDtmb3IodmFyIGk9MDtpPGxlbmd0aDtpKyspe3ZhciByZXN1bHQ7dHJ5e3Jlc3VsdD1zdHJlYW0udHR5Lm9wcy5nZXRfY2hhcihzdHJlYW0udHR5KX1jYXRjaChlKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FSU8pfWlmKHJlc3VsdD09PXVuZGVmaW5lZCYmYnl0ZXNSZWFkPT09MCl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUFHQUlOKX1pZihyZXN1bHQ9PT1udWxsfHxyZXN1bHQ9PT11bmRlZmluZWQpYnJlYWs7Ynl0ZXNSZWFkKys7YnVmZmVyW29mZnNldCtpXT1yZXN1bHR9aWYoYnl0ZXNSZWFkKXtzdHJlYW0ubm9kZS50aW1lc3RhbXA9RGF0ZS5ub3coKX1yZXR1cm4gYnl0ZXNSZWFkfSksd3JpdGU6KGZ1bmN0aW9uKHN0cmVhbSxidWZmZXIsb2Zmc2V0LGxlbmd0aCxwb3Mpe2lmKCFzdHJlYW0udHR5fHwhc3RyZWFtLnR0eS5vcHMucHV0X2NoYXIpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVOWElPKX1mb3IodmFyIGk9MDtpPGxlbmd0aDtpKyspe3RyeXtzdHJlYW0udHR5Lm9wcy5wdXRfY2hhcihzdHJlYW0udHR5LGJ1ZmZlcltvZmZzZXQraV0pfWNhdGNoKGUpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVJTyl9fWlmKGxlbmd0aCl7c3RyZWFtLm5vZGUudGltZXN0YW1wPURhdGUubm93KCl9cmV0dXJuIGl9KX0sZGVmYXVsdF90dHlfb3BzOntnZXRfY2hhcjooZnVuY3Rpb24odHR5KXtpZighdHR5LmlucHV0Lmxlbmd0aCl7dmFyIHJlc3VsdD1udWxsO2lmKEVOVklST05NRU5UX0lTX05PREUpe3ZhciBCVUZTSVpFPTI1Njt2YXIgYnVmPW5ldyBCdWZmZXIoQlVGU0laRSk7dmFyIGJ5dGVzUmVhZD0wO3ZhciBmZD1wcm9jZXNzLnN0ZGluLmZkO3ZhciB1c2luZ0RldmljZT1mYWxzZTt0cnl7ZmQ9ZnMub3BlblN5bmMoXCIvZGV2L3N0ZGluXCIsXCJyXCIpO3VzaW5nRGV2aWNlPXRydWV9Y2F0Y2goZSl7fWJ5dGVzUmVhZD1mcy5yZWFkU3luYyhmZCxidWYsMCxCVUZTSVpFLG51bGwpO2lmKHVzaW5nRGV2aWNlKXtmcy5jbG9zZVN5bmMoZmQpfWlmKGJ5dGVzUmVhZD4wKXtyZXN1bHQ9YnVmLnNsaWNlKDAsYnl0ZXNSZWFkKS50b1N0cmluZyhcInV0Zi04XCIpfWVsc2V7cmVzdWx0PW51bGx9fWVsc2UgaWYodHlwZW9mIHdpbmRvdyE9XCJ1bmRlZmluZWRcIiYmdHlwZW9mIHdpbmRvdy5wcm9tcHQ9PVwiZnVuY3Rpb25cIil7cmVzdWx0PXdpbmRvdy5wcm9tcHQoXCJJbnB1dDogXCIpO2lmKHJlc3VsdCE9PW51bGwpe3Jlc3VsdCs9XCJcXG5cIn19ZWxzZSBpZih0eXBlb2YgcmVhZGxpbmU9PVwiZnVuY3Rpb25cIil7cmVzdWx0PXJlYWRsaW5lKCk7aWYocmVzdWx0IT09bnVsbCl7cmVzdWx0Kz1cIlxcblwifX1pZighcmVzdWx0KXtyZXR1cm4gbnVsbH10dHkuaW5wdXQ9aW50QXJyYXlGcm9tU3RyaW5nKHJlc3VsdCx0cnVlKX1yZXR1cm4gdHR5LmlucHV0LnNoaWZ0KCl9KSxwdXRfY2hhcjooZnVuY3Rpb24odHR5LHZhbCl7aWYodmFsPT09bnVsbHx8dmFsPT09MTApe01vZHVsZVtcInByaW50XCJdKFVURjhBcnJheVRvU3RyaW5nKHR0eS5vdXRwdXQsMCkpO3R0eS5vdXRwdXQ9W119ZWxzZXtpZih2YWwhPTApdHR5Lm91dHB1dC5wdXNoKHZhbCl9fSksZmx1c2g6KGZ1bmN0aW9uKHR0eSl7aWYodHR5Lm91dHB1dCYmdHR5Lm91dHB1dC5sZW5ndGg+MCl7TW9kdWxlW1wicHJpbnRcIl0oVVRGOEFycmF5VG9TdHJpbmcodHR5Lm91dHB1dCwwKSk7dHR5Lm91dHB1dD1bXX19KX0sZGVmYXVsdF90dHkxX29wczp7cHV0X2NoYXI6KGZ1bmN0aW9uKHR0eSx2YWwpe2lmKHZhbD09PW51bGx8fHZhbD09PTEwKXtNb2R1bGVbXCJwcmludEVyclwiXShVVEY4QXJyYXlUb1N0cmluZyh0dHkub3V0cHV0LDApKTt0dHkub3V0cHV0PVtdfWVsc2V7aWYodmFsIT0wKXR0eS5vdXRwdXQucHVzaCh2YWwpfX0pLGZsdXNoOihmdW5jdGlvbih0dHkpe2lmKHR0eS5vdXRwdXQmJnR0eS5vdXRwdXQubGVuZ3RoPjApe01vZHVsZVtcInByaW50RXJyXCJdKFVURjhBcnJheVRvU3RyaW5nKHR0eS5vdXRwdXQsMCkpO3R0eS5vdXRwdXQ9W119fSl9fTt2YXIgTUVNRlM9e29wc190YWJsZTpudWxsLG1vdW50OihmdW5jdGlvbihtb3VudCl7cmV0dXJuIE1FTUZTLmNyZWF0ZU5vZGUobnVsbCxcIi9cIiwxNjM4NHw1MTEsMCl9KSxjcmVhdGVOb2RlOihmdW5jdGlvbihwYXJlbnQsbmFtZSxtb2RlLGRldil7aWYoRlMuaXNCbGtkZXYobW9kZSl8fEZTLmlzRklGTyhtb2RlKSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRVBFUk0pfWlmKCFNRU1GUy5vcHNfdGFibGUpe01FTUZTLm9wc190YWJsZT17ZGlyOntub2RlOntnZXRhdHRyOk1FTUZTLm5vZGVfb3BzLmdldGF0dHIsc2V0YXR0cjpNRU1GUy5ub2RlX29wcy5zZXRhdHRyLGxvb2t1cDpNRU1GUy5ub2RlX29wcy5sb29rdXAsbWtub2Q6TUVNRlMubm9kZV9vcHMubWtub2QscmVuYW1lOk1FTUZTLm5vZGVfb3BzLnJlbmFtZSx1bmxpbms6TUVNRlMubm9kZV9vcHMudW5saW5rLHJtZGlyOk1FTUZTLm5vZGVfb3BzLnJtZGlyLHJlYWRkaXI6TUVNRlMubm9kZV9vcHMucmVhZGRpcixzeW1saW5rOk1FTUZTLm5vZGVfb3BzLnN5bWxpbmt9LHN0cmVhbTp7bGxzZWVrOk1FTUZTLnN0cmVhbV9vcHMubGxzZWVrfX0sZmlsZTp7bm9kZTp7Z2V0YXR0cjpNRU1GUy5ub2RlX29wcy5nZXRhdHRyLHNldGF0dHI6TUVNRlMubm9kZV9vcHMuc2V0YXR0cn0sc3RyZWFtOntsbHNlZWs6TUVNRlMuc3RyZWFtX29wcy5sbHNlZWsscmVhZDpNRU1GUy5zdHJlYW1fb3BzLnJlYWQsd3JpdGU6TUVNRlMuc3RyZWFtX29wcy53cml0ZSxhbGxvY2F0ZTpNRU1GUy5zdHJlYW1fb3BzLmFsbG9jYXRlLG1tYXA6TUVNRlMuc3RyZWFtX29wcy5tbWFwLG1zeW5jOk1FTUZTLnN0cmVhbV9vcHMubXN5bmN9fSxsaW5rOntub2RlOntnZXRhdHRyOk1FTUZTLm5vZGVfb3BzLmdldGF0dHIsc2V0YXR0cjpNRU1GUy5ub2RlX29wcy5zZXRhdHRyLHJlYWRsaW5rOk1FTUZTLm5vZGVfb3BzLnJlYWRsaW5rfSxzdHJlYW06e319LGNocmRldjp7bm9kZTp7Z2V0YXR0cjpNRU1GUy5ub2RlX29wcy5nZXRhdHRyLHNldGF0dHI6TUVNRlMubm9kZV9vcHMuc2V0YXR0cn0sc3RyZWFtOkZTLmNocmRldl9zdHJlYW1fb3BzfX19dmFyIG5vZGU9RlMuY3JlYXRlTm9kZShwYXJlbnQsbmFtZSxtb2RlLGRldik7aWYoRlMuaXNEaXIobm9kZS5tb2RlKSl7bm9kZS5ub2RlX29wcz1NRU1GUy5vcHNfdGFibGUuZGlyLm5vZGU7bm9kZS5zdHJlYW1fb3BzPU1FTUZTLm9wc190YWJsZS5kaXIuc3RyZWFtO25vZGUuY29udGVudHM9e319ZWxzZSBpZihGUy5pc0ZpbGUobm9kZS5tb2RlKSl7bm9kZS5ub2RlX29wcz1NRU1GUy5vcHNfdGFibGUuZmlsZS5ub2RlO25vZGUuc3RyZWFtX29wcz1NRU1GUy5vcHNfdGFibGUuZmlsZS5zdHJlYW07bm9kZS51c2VkQnl0ZXM9MDtub2RlLmNvbnRlbnRzPW51bGx9ZWxzZSBpZihGUy5pc0xpbmsobm9kZS5tb2RlKSl7bm9kZS5ub2RlX29wcz1NRU1GUy5vcHNfdGFibGUubGluay5ub2RlO25vZGUuc3RyZWFtX29wcz1NRU1GUy5vcHNfdGFibGUubGluay5zdHJlYW19ZWxzZSBpZihGUy5pc0NocmRldihub2RlLm1vZGUpKXtub2RlLm5vZGVfb3BzPU1FTUZTLm9wc190YWJsZS5jaHJkZXYubm9kZTtub2RlLnN0cmVhbV9vcHM9TUVNRlMub3BzX3RhYmxlLmNocmRldi5zdHJlYW19bm9kZS50aW1lc3RhbXA9RGF0ZS5ub3coKTtpZihwYXJlbnQpe3BhcmVudC5jb250ZW50c1tuYW1lXT1ub2RlfXJldHVybiBub2RlfSksZ2V0RmlsZURhdGFBc1JlZ3VsYXJBcnJheTooZnVuY3Rpb24obm9kZSl7aWYobm9kZS5jb250ZW50cyYmbm9kZS5jb250ZW50cy5zdWJhcnJheSl7dmFyIGFycj1bXTtmb3IodmFyIGk9MDtpPG5vZGUudXNlZEJ5dGVzOysraSlhcnIucHVzaChub2RlLmNvbnRlbnRzW2ldKTtyZXR1cm4gYXJyfXJldHVybiBub2RlLmNvbnRlbnRzfSksZ2V0RmlsZURhdGFBc1R5cGVkQXJyYXk6KGZ1bmN0aW9uKG5vZGUpe2lmKCFub2RlLmNvbnRlbnRzKXJldHVybiBuZXcgVWludDhBcnJheTtpZihub2RlLmNvbnRlbnRzLnN1YmFycmF5KXJldHVybiBub2RlLmNvbnRlbnRzLnN1YmFycmF5KDAsbm9kZS51c2VkQnl0ZXMpO3JldHVybiBuZXcgVWludDhBcnJheShub2RlLmNvbnRlbnRzKX0pLGV4cGFuZEZpbGVTdG9yYWdlOihmdW5jdGlvbihub2RlLG5ld0NhcGFjaXR5KXtpZihub2RlLmNvbnRlbnRzJiZub2RlLmNvbnRlbnRzLnN1YmFycmF5JiZuZXdDYXBhY2l0eT5ub2RlLmNvbnRlbnRzLmxlbmd0aCl7bm9kZS5jb250ZW50cz1NRU1GUy5nZXRGaWxlRGF0YUFzUmVndWxhckFycmF5KG5vZGUpO25vZGUudXNlZEJ5dGVzPW5vZGUuY29udGVudHMubGVuZ3RofWlmKCFub2RlLmNvbnRlbnRzfHxub2RlLmNvbnRlbnRzLnN1YmFycmF5KXt2YXIgcHJldkNhcGFjaXR5PW5vZGUuY29udGVudHM/bm9kZS5jb250ZW50cy5idWZmZXIuYnl0ZUxlbmd0aDowO2lmKHByZXZDYXBhY2l0eT49bmV3Q2FwYWNpdHkpcmV0dXJuO3ZhciBDQVBBQ0lUWV9ET1VCTElOR19NQVg9MTAyNCoxMDI0O25ld0NhcGFjaXR5PU1hdGgubWF4KG5ld0NhcGFjaXR5LHByZXZDYXBhY2l0eSoocHJldkNhcGFjaXR5PENBUEFDSVRZX0RPVUJMSU5HX01BWD8yOjEuMTI1KXwwKTtpZihwcmV2Q2FwYWNpdHkhPTApbmV3Q2FwYWNpdHk9TWF0aC5tYXgobmV3Q2FwYWNpdHksMjU2KTt2YXIgb2xkQ29udGVudHM9bm9kZS5jb250ZW50cztub2RlLmNvbnRlbnRzPW5ldyBVaW50OEFycmF5KG5ld0NhcGFjaXR5KTtpZihub2RlLnVzZWRCeXRlcz4wKW5vZGUuY29udGVudHMuc2V0KG9sZENvbnRlbnRzLnN1YmFycmF5KDAsbm9kZS51c2VkQnl0ZXMpLDApO3JldHVybn1pZighbm9kZS5jb250ZW50cyYmbmV3Q2FwYWNpdHk+MClub2RlLmNvbnRlbnRzPVtdO3doaWxlKG5vZGUuY29udGVudHMubGVuZ3RoPG5ld0NhcGFjaXR5KW5vZGUuY29udGVudHMucHVzaCgwKX0pLHJlc2l6ZUZpbGVTdG9yYWdlOihmdW5jdGlvbihub2RlLG5ld1NpemUpe2lmKG5vZGUudXNlZEJ5dGVzPT1uZXdTaXplKXJldHVybjtpZihuZXdTaXplPT0wKXtub2RlLmNvbnRlbnRzPW51bGw7bm9kZS51c2VkQnl0ZXM9MDtyZXR1cm59aWYoIW5vZGUuY29udGVudHN8fG5vZGUuY29udGVudHMuc3ViYXJyYXkpe3ZhciBvbGRDb250ZW50cz1ub2RlLmNvbnRlbnRzO25vZGUuY29udGVudHM9bmV3IFVpbnQ4QXJyYXkobmV3IEFycmF5QnVmZmVyKG5ld1NpemUpKTtpZihvbGRDb250ZW50cyl7bm9kZS5jb250ZW50cy5zZXQob2xkQ29udGVudHMuc3ViYXJyYXkoMCxNYXRoLm1pbihuZXdTaXplLG5vZGUudXNlZEJ5dGVzKSkpfW5vZGUudXNlZEJ5dGVzPW5ld1NpemU7cmV0dXJufWlmKCFub2RlLmNvbnRlbnRzKW5vZGUuY29udGVudHM9W107aWYobm9kZS5jb250ZW50cy5sZW5ndGg+bmV3U2l6ZSlub2RlLmNvbnRlbnRzLmxlbmd0aD1uZXdTaXplO2Vsc2Ugd2hpbGUobm9kZS5jb250ZW50cy5sZW5ndGg8bmV3U2l6ZSlub2RlLmNvbnRlbnRzLnB1c2goMCk7bm9kZS51c2VkQnl0ZXM9bmV3U2l6ZX0pLG5vZGVfb3BzOntnZXRhdHRyOihmdW5jdGlvbihub2RlKXt2YXIgYXR0cj17fTthdHRyLmRldj1GUy5pc0NocmRldihub2RlLm1vZGUpP25vZGUuaWQ6MTthdHRyLmlubz1ub2RlLmlkO2F0dHIubW9kZT1ub2RlLm1vZGU7YXR0ci5ubGluaz0xO2F0dHIudWlkPTA7YXR0ci5naWQ9MDthdHRyLnJkZXY9bm9kZS5yZGV2O2lmKEZTLmlzRGlyKG5vZGUubW9kZSkpe2F0dHIuc2l6ZT00MDk2fWVsc2UgaWYoRlMuaXNGaWxlKG5vZGUubW9kZSkpe2F0dHIuc2l6ZT1ub2RlLnVzZWRCeXRlc31lbHNlIGlmKEZTLmlzTGluayhub2RlLm1vZGUpKXthdHRyLnNpemU9bm9kZS5saW5rLmxlbmd0aH1lbHNle2F0dHIuc2l6ZT0wfWF0dHIuYXRpbWU9bmV3IERhdGUobm9kZS50aW1lc3RhbXApO2F0dHIubXRpbWU9bmV3IERhdGUobm9kZS50aW1lc3RhbXApO2F0dHIuY3RpbWU9bmV3IERhdGUobm9kZS50aW1lc3RhbXApO2F0dHIuYmxrc2l6ZT00MDk2O2F0dHIuYmxvY2tzPU1hdGguY2VpbChhdHRyLnNpemUvYXR0ci5ibGtzaXplKTtyZXR1cm4gYXR0cn0pLHNldGF0dHI6KGZ1bmN0aW9uKG5vZGUsYXR0cil7aWYoYXR0ci5tb2RlIT09dW5kZWZpbmVkKXtub2RlLm1vZGU9YXR0ci5tb2RlfWlmKGF0dHIudGltZXN0YW1wIT09dW5kZWZpbmVkKXtub2RlLnRpbWVzdGFtcD1hdHRyLnRpbWVzdGFtcH1pZihhdHRyLnNpemUhPT11bmRlZmluZWQpe01FTUZTLnJlc2l6ZUZpbGVTdG9yYWdlKG5vZGUsYXR0ci5zaXplKX19KSxsb29rdXA6KGZ1bmN0aW9uKHBhcmVudCxuYW1lKXt0aHJvdyBGUy5nZW5lcmljRXJyb3JzW0VSUk5PX0NPREVTLkVOT0VOVF19KSxta25vZDooZnVuY3Rpb24ocGFyZW50LG5hbWUsbW9kZSxkZXYpe3JldHVybiBNRU1GUy5jcmVhdGVOb2RlKHBhcmVudCxuYW1lLG1vZGUsZGV2KX0pLHJlbmFtZTooZnVuY3Rpb24ob2xkX25vZGUsbmV3X2RpcixuZXdfbmFtZSl7aWYoRlMuaXNEaXIob2xkX25vZGUubW9kZSkpe3ZhciBuZXdfbm9kZTt0cnl7bmV3X25vZGU9RlMubG9va3VwTm9kZShuZXdfZGlyLG5ld19uYW1lKX1jYXRjaChlKXt9aWYobmV3X25vZGUpe2Zvcih2YXIgaSBpbiBuZXdfbm9kZS5jb250ZW50cyl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRU5PVEVNUFRZKX19fWRlbGV0ZSBvbGRfbm9kZS5wYXJlbnQuY29udGVudHNbb2xkX25vZGUubmFtZV07b2xkX25vZGUubmFtZT1uZXdfbmFtZTtuZXdfZGlyLmNvbnRlbnRzW25ld19uYW1lXT1vbGRfbm9kZTtvbGRfbm9kZS5wYXJlbnQ9bmV3X2Rpcn0pLHVubGluazooZnVuY3Rpb24ocGFyZW50LG5hbWUpe2RlbGV0ZSBwYXJlbnQuY29udGVudHNbbmFtZV19KSxybWRpcjooZnVuY3Rpb24ocGFyZW50LG5hbWUpe3ZhciBub2RlPUZTLmxvb2t1cE5vZGUocGFyZW50LG5hbWUpO2Zvcih2YXIgaSBpbiBub2RlLmNvbnRlbnRzKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FTk9URU1QVFkpfWRlbGV0ZSBwYXJlbnQuY29udGVudHNbbmFtZV19KSxyZWFkZGlyOihmdW5jdGlvbihub2RlKXt2YXIgZW50cmllcz1bXCIuXCIsXCIuLlwiXTtmb3IodmFyIGtleSBpbiBub2RlLmNvbnRlbnRzKXtpZighbm9kZS5jb250ZW50cy5oYXNPd25Qcm9wZXJ0eShrZXkpKXtjb250aW51ZX1lbnRyaWVzLnB1c2goa2V5KX1yZXR1cm4gZW50cmllc30pLHN5bWxpbms6KGZ1bmN0aW9uKHBhcmVudCxuZXduYW1lLG9sZHBhdGgpe3ZhciBub2RlPU1FTUZTLmNyZWF0ZU5vZGUocGFyZW50LG5ld25hbWUsNTExfDQwOTYwLDApO25vZGUubGluaz1vbGRwYXRoO3JldHVybiBub2RlfSkscmVhZGxpbms6KGZ1bmN0aW9uKG5vZGUpe2lmKCFGUy5pc0xpbmsobm9kZS5tb2RlKSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUlOVkFMKX1yZXR1cm4gbm9kZS5saW5rfSl9LHN0cmVhbV9vcHM6e3JlYWQ6KGZ1bmN0aW9uKHN0cmVhbSxidWZmZXIsb2Zmc2V0LGxlbmd0aCxwb3NpdGlvbil7dmFyIGNvbnRlbnRzPXN0cmVhbS5ub2RlLmNvbnRlbnRzO2lmKHBvc2l0aW9uPj1zdHJlYW0ubm9kZS51c2VkQnl0ZXMpcmV0dXJuIDA7dmFyIHNpemU9TWF0aC5taW4oc3RyZWFtLm5vZGUudXNlZEJ5dGVzLXBvc2l0aW9uLGxlbmd0aCk7YXNzZXJ0KHNpemU+PTApO2lmKHNpemU+OCYmY29udGVudHMuc3ViYXJyYXkpe2J1ZmZlci5zZXQoY29udGVudHMuc3ViYXJyYXkocG9zaXRpb24scG9zaXRpb24rc2l6ZSksb2Zmc2V0KX1lbHNle2Zvcih2YXIgaT0wO2k8c2l6ZTtpKyspYnVmZmVyW29mZnNldCtpXT1jb250ZW50c1twb3NpdGlvbitpXX1yZXR1cm4gc2l6ZX0pLHdyaXRlOihmdW5jdGlvbihzdHJlYW0sYnVmZmVyLG9mZnNldCxsZW5ndGgscG9zaXRpb24sY2FuT3duKXtpZighbGVuZ3RoKXJldHVybiAwO3ZhciBub2RlPXN0cmVhbS5ub2RlO25vZGUudGltZXN0YW1wPURhdGUubm93KCk7aWYoYnVmZmVyLnN1YmFycmF5JiYoIW5vZGUuY29udGVudHN8fG5vZGUuY29udGVudHMuc3ViYXJyYXkpKXtpZihjYW5Pd24pe25vZGUuY29udGVudHM9YnVmZmVyLnN1YmFycmF5KG9mZnNldCxvZmZzZXQrbGVuZ3RoKTtub2RlLnVzZWRCeXRlcz1sZW5ndGg7cmV0dXJuIGxlbmd0aH1lbHNlIGlmKG5vZGUudXNlZEJ5dGVzPT09MCYmcG9zaXRpb249PT0wKXtub2RlLmNvbnRlbnRzPW5ldyBVaW50OEFycmF5KGJ1ZmZlci5zdWJhcnJheShvZmZzZXQsb2Zmc2V0K2xlbmd0aCkpO25vZGUudXNlZEJ5dGVzPWxlbmd0aDtyZXR1cm4gbGVuZ3RofWVsc2UgaWYocG9zaXRpb24rbGVuZ3RoPD1ub2RlLnVzZWRCeXRlcyl7bm9kZS5jb250ZW50cy5zZXQoYnVmZmVyLnN1YmFycmF5KG9mZnNldCxvZmZzZXQrbGVuZ3RoKSxwb3NpdGlvbik7cmV0dXJuIGxlbmd0aH19TUVNRlMuZXhwYW5kRmlsZVN0b3JhZ2Uobm9kZSxwb3NpdGlvbitsZW5ndGgpO2lmKG5vZGUuY29udGVudHMuc3ViYXJyYXkmJmJ1ZmZlci5zdWJhcnJheSlub2RlLmNvbnRlbnRzLnNldChidWZmZXIuc3ViYXJyYXkob2Zmc2V0LG9mZnNldCtsZW5ndGgpLHBvc2l0aW9uKTtlbHNle2Zvcih2YXIgaT0wO2k8bGVuZ3RoO2krKyl7bm9kZS5jb250ZW50c1twb3NpdGlvbitpXT1idWZmZXJbb2Zmc2V0K2ldfX1ub2RlLnVzZWRCeXRlcz1NYXRoLm1heChub2RlLnVzZWRCeXRlcyxwb3NpdGlvbitsZW5ndGgpO3JldHVybiBsZW5ndGh9KSxsbHNlZWs6KGZ1bmN0aW9uKHN0cmVhbSxvZmZzZXQsd2hlbmNlKXt2YXIgcG9zaXRpb249b2Zmc2V0O2lmKHdoZW5jZT09PTEpe3Bvc2l0aW9uKz1zdHJlYW0ucG9zaXRpb259ZWxzZSBpZih3aGVuY2U9PT0yKXtpZihGUy5pc0ZpbGUoc3RyZWFtLm5vZGUubW9kZSkpe3Bvc2l0aW9uKz1zdHJlYW0ubm9kZS51c2VkQnl0ZXN9fWlmKHBvc2l0aW9uPDApe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVJTlZBTCl9cmV0dXJuIHBvc2l0aW9ufSksYWxsb2NhdGU6KGZ1bmN0aW9uKHN0cmVhbSxvZmZzZXQsbGVuZ3RoKXtNRU1GUy5leHBhbmRGaWxlU3RvcmFnZShzdHJlYW0ubm9kZSxvZmZzZXQrbGVuZ3RoKTtzdHJlYW0ubm9kZS51c2VkQnl0ZXM9TWF0aC5tYXgoc3RyZWFtLm5vZGUudXNlZEJ5dGVzLG9mZnNldCtsZW5ndGgpfSksbW1hcDooZnVuY3Rpb24oc3RyZWFtLGJ1ZmZlcixvZmZzZXQsbGVuZ3RoLHBvc2l0aW9uLHByb3QsZmxhZ3Mpe2lmKCFGUy5pc0ZpbGUoc3RyZWFtLm5vZGUubW9kZSkpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVOT0RFVil9dmFyIHB0cjt2YXIgYWxsb2NhdGVkO3ZhciBjb250ZW50cz1zdHJlYW0ubm9kZS5jb250ZW50cztpZighKGZsYWdzJjIpJiYoY29udGVudHMuYnVmZmVyPT09YnVmZmVyfHxjb250ZW50cy5idWZmZXI9PT1idWZmZXIuYnVmZmVyKSl7YWxsb2NhdGVkPWZhbHNlO3B0cj1jb250ZW50cy5ieXRlT2Zmc2V0fWVsc2V7aWYocG9zaXRpb24+MHx8cG9zaXRpb24rbGVuZ3RoPHN0cmVhbS5ub2RlLnVzZWRCeXRlcyl7aWYoY29udGVudHMuc3ViYXJyYXkpe2NvbnRlbnRzPWNvbnRlbnRzLnN1YmFycmF5KHBvc2l0aW9uLHBvc2l0aW9uK2xlbmd0aCl9ZWxzZXtjb250ZW50cz1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChjb250ZW50cyxwb3NpdGlvbixwb3NpdGlvbitsZW5ndGgpfX1hbGxvY2F0ZWQ9dHJ1ZTtwdHI9X21hbGxvYyhsZW5ndGgpO2lmKCFwdHIpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVOT01FTSl9YnVmZmVyLnNldChjb250ZW50cyxwdHIpfXJldHVybntwdHI6cHRyLGFsbG9jYXRlZDphbGxvY2F0ZWR9fSksbXN5bmM6KGZ1bmN0aW9uKHN0cmVhbSxidWZmZXIsb2Zmc2V0LGxlbmd0aCxtbWFwRmxhZ3Mpe2lmKCFGUy5pc0ZpbGUoc3RyZWFtLm5vZGUubW9kZSkpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVOT0RFVil9aWYobW1hcEZsYWdzJjIpe3JldHVybiAwfXZhciBieXRlc1dyaXR0ZW49TUVNRlMuc3RyZWFtX29wcy53cml0ZShzdHJlYW0sYnVmZmVyLDAsbGVuZ3RoLG9mZnNldCxmYWxzZSk7cmV0dXJuIDB9KX19O3ZhciBJREJGUz17ZGJzOnt9LGluZGV4ZWREQjooZnVuY3Rpb24oKXtpZih0eXBlb2YgaW5kZXhlZERCIT09XCJ1bmRlZmluZWRcIilyZXR1cm4gaW5kZXhlZERCO3ZhciByZXQ9bnVsbDtpZih0eXBlb2Ygd2luZG93PT09XCJvYmplY3RcIilyZXQ9d2luZG93LmluZGV4ZWREQnx8d2luZG93Lm1vekluZGV4ZWREQnx8d2luZG93LndlYmtpdEluZGV4ZWREQnx8d2luZG93Lm1zSW5kZXhlZERCO2Fzc2VydChyZXQsXCJJREJGUyB1c2VkLCBidXQgaW5kZXhlZERCIG5vdCBzdXBwb3J0ZWRcIik7cmV0dXJuIHJldH0pLERCX1ZFUlNJT046MjEsREJfU1RPUkVfTkFNRTpcIkZJTEVfREFUQVwiLG1vdW50OihmdW5jdGlvbihtb3VudCl7cmV0dXJuIE1FTUZTLm1vdW50LmFwcGx5KG51bGwsYXJndW1lbnRzKX0pLHN5bmNmczooZnVuY3Rpb24obW91bnQscG9wdWxhdGUsY2FsbGJhY2spe0lEQkZTLmdldExvY2FsU2V0KG1vdW50LChmdW5jdGlvbihlcnIsbG9jYWwpe2lmKGVycilyZXR1cm4gY2FsbGJhY2soZXJyKTtJREJGUy5nZXRSZW1vdGVTZXQobW91bnQsKGZ1bmN0aW9uKGVycixyZW1vdGUpe2lmKGVycilyZXR1cm4gY2FsbGJhY2soZXJyKTt2YXIgc3JjPXBvcHVsYXRlP3JlbW90ZTpsb2NhbDt2YXIgZHN0PXBvcHVsYXRlP2xvY2FsOnJlbW90ZTtJREJGUy5yZWNvbmNpbGUoc3JjLGRzdCxjYWxsYmFjayl9KSl9KSl9KSxnZXREQjooZnVuY3Rpb24obmFtZSxjYWxsYmFjayl7dmFyIGRiPUlEQkZTLmRic1tuYW1lXTtpZihkYil7cmV0dXJuIGNhbGxiYWNrKG51bGwsZGIpfXZhciByZXE7dHJ5e3JlcT1JREJGUy5pbmRleGVkREIoKS5vcGVuKG5hbWUsSURCRlMuREJfVkVSU0lPTil9Y2F0Y2goZSl7cmV0dXJuIGNhbGxiYWNrKGUpfXJlcS5vbnVwZ3JhZGVuZWVkZWQ9KGZ1bmN0aW9uKGUpe3ZhciBkYj1lLnRhcmdldC5yZXN1bHQ7dmFyIHRyYW5zYWN0aW9uPWUudGFyZ2V0LnRyYW5zYWN0aW9uO3ZhciBmaWxlU3RvcmU7aWYoZGIub2JqZWN0U3RvcmVOYW1lcy5jb250YWlucyhJREJGUy5EQl9TVE9SRV9OQU1FKSl7ZmlsZVN0b3JlPXRyYW5zYWN0aW9uLm9iamVjdFN0b3JlKElEQkZTLkRCX1NUT1JFX05BTUUpfWVsc2V7ZmlsZVN0b3JlPWRiLmNyZWF0ZU9iamVjdFN0b3JlKElEQkZTLkRCX1NUT1JFX05BTUUpfWlmKCFmaWxlU3RvcmUuaW5kZXhOYW1lcy5jb250YWlucyhcInRpbWVzdGFtcFwiKSl7ZmlsZVN0b3JlLmNyZWF0ZUluZGV4KFwidGltZXN0YW1wXCIsXCJ0aW1lc3RhbXBcIix7dW5pcXVlOmZhbHNlfSl9fSk7cmVxLm9uc3VjY2Vzcz0oZnVuY3Rpb24oKXtkYj1yZXEucmVzdWx0O0lEQkZTLmRic1tuYW1lXT1kYjtjYWxsYmFjayhudWxsLGRiKX0pO3JlcS5vbmVycm9yPShmdW5jdGlvbihlKXtjYWxsYmFjayh0aGlzLmVycm9yKTtlLnByZXZlbnREZWZhdWx0KCl9KX0pLGdldExvY2FsU2V0OihmdW5jdGlvbihtb3VudCxjYWxsYmFjayl7dmFyIGVudHJpZXM9e307ZnVuY3Rpb24gaXNSZWFsRGlyKHApe3JldHVybiBwIT09XCIuXCImJnAhPT1cIi4uXCJ9ZnVuY3Rpb24gdG9BYnNvbHV0ZShyb290KXtyZXR1cm4oZnVuY3Rpb24ocCl7cmV0dXJuIFBBVEguam9pbjIocm9vdCxwKX0pfXZhciBjaGVjaz1GUy5yZWFkZGlyKG1vdW50Lm1vdW50cG9pbnQpLmZpbHRlcihpc1JlYWxEaXIpLm1hcCh0b0Fic29sdXRlKG1vdW50Lm1vdW50cG9pbnQpKTt3aGlsZShjaGVjay5sZW5ndGgpe3ZhciBwYXRoPWNoZWNrLnBvcCgpO3ZhciBzdGF0O3RyeXtzdGF0PUZTLnN0YXQocGF0aCl9Y2F0Y2goZSl7cmV0dXJuIGNhbGxiYWNrKGUpfWlmKEZTLmlzRGlyKHN0YXQubW9kZSkpe2NoZWNrLnB1c2guYXBwbHkoY2hlY2ssRlMucmVhZGRpcihwYXRoKS5maWx0ZXIoaXNSZWFsRGlyKS5tYXAodG9BYnNvbHV0ZShwYXRoKSkpfWVudHJpZXNbcGF0aF09e3RpbWVzdGFtcDpzdGF0Lm10aW1lfX1yZXR1cm4gY2FsbGJhY2sobnVsbCx7dHlwZTpcImxvY2FsXCIsZW50cmllczplbnRyaWVzfSl9KSxnZXRSZW1vdGVTZXQ6KGZ1bmN0aW9uKG1vdW50LGNhbGxiYWNrKXt2YXIgZW50cmllcz17fTtJREJGUy5nZXREQihtb3VudC5tb3VudHBvaW50LChmdW5jdGlvbihlcnIsZGIpe2lmKGVycilyZXR1cm4gY2FsbGJhY2soZXJyKTt2YXIgdHJhbnNhY3Rpb249ZGIudHJhbnNhY3Rpb24oW0lEQkZTLkRCX1NUT1JFX05BTUVdLFwicmVhZG9ubHlcIik7dHJhbnNhY3Rpb24ub25lcnJvcj0oZnVuY3Rpb24oZSl7Y2FsbGJhY2sodGhpcy5lcnJvcik7ZS5wcmV2ZW50RGVmYXVsdCgpfSk7dmFyIHN0b3JlPXRyYW5zYWN0aW9uLm9iamVjdFN0b3JlKElEQkZTLkRCX1NUT1JFX05BTUUpO3ZhciBpbmRleD1zdG9yZS5pbmRleChcInRpbWVzdGFtcFwiKTtpbmRleC5vcGVuS2V5Q3Vyc29yKCkub25zdWNjZXNzPShmdW5jdGlvbihldmVudCl7dmFyIGN1cnNvcj1ldmVudC50YXJnZXQucmVzdWx0O2lmKCFjdXJzb3Ipe3JldHVybiBjYWxsYmFjayhudWxsLHt0eXBlOlwicmVtb3RlXCIsZGI6ZGIsZW50cmllczplbnRyaWVzfSl9ZW50cmllc1tjdXJzb3IucHJpbWFyeUtleV09e3RpbWVzdGFtcDpjdXJzb3Iua2V5fTtjdXJzb3IuY29udGludWUoKX0pfSkpfSksbG9hZExvY2FsRW50cnk6KGZ1bmN0aW9uKHBhdGgsY2FsbGJhY2spe3ZhciBzdGF0LG5vZGU7dHJ5e3ZhciBsb29rdXA9RlMubG9va3VwUGF0aChwYXRoKTtub2RlPWxvb2t1cC5ub2RlO3N0YXQ9RlMuc3RhdChwYXRoKX1jYXRjaChlKXtyZXR1cm4gY2FsbGJhY2soZSl9aWYoRlMuaXNEaXIoc3RhdC5tb2RlKSl7cmV0dXJuIGNhbGxiYWNrKG51bGwse3RpbWVzdGFtcDpzdGF0Lm10aW1lLG1vZGU6c3RhdC5tb2RlfSl9ZWxzZSBpZihGUy5pc0ZpbGUoc3RhdC5tb2RlKSl7bm9kZS5jb250ZW50cz1NRU1GUy5nZXRGaWxlRGF0YUFzVHlwZWRBcnJheShub2RlKTtyZXR1cm4gY2FsbGJhY2sobnVsbCx7dGltZXN0YW1wOnN0YXQubXRpbWUsbW9kZTpzdGF0Lm1vZGUsY29udGVudHM6bm9kZS5jb250ZW50c30pfWVsc2V7cmV0dXJuIGNhbGxiYWNrKG5ldyBFcnJvcihcIm5vZGUgdHlwZSBub3Qgc3VwcG9ydGVkXCIpKX19KSxzdG9yZUxvY2FsRW50cnk6KGZ1bmN0aW9uKHBhdGgsZW50cnksY2FsbGJhY2spe3RyeXtpZihGUy5pc0RpcihlbnRyeS5tb2RlKSl7RlMubWtkaXIocGF0aCxlbnRyeS5tb2RlKX1lbHNlIGlmKEZTLmlzRmlsZShlbnRyeS5tb2RlKSl7RlMud3JpdGVGaWxlKHBhdGgsZW50cnkuY29udGVudHMse2VuY29kaW5nOlwiYmluYXJ5XCIsY2FuT3duOnRydWV9KX1lbHNle3JldHVybiBjYWxsYmFjayhuZXcgRXJyb3IoXCJub2RlIHR5cGUgbm90IHN1cHBvcnRlZFwiKSl9RlMuY2htb2QocGF0aCxlbnRyeS5tb2RlKTtGUy51dGltZShwYXRoLGVudHJ5LnRpbWVzdGFtcCxlbnRyeS50aW1lc3RhbXApfWNhdGNoKGUpe3JldHVybiBjYWxsYmFjayhlKX1jYWxsYmFjayhudWxsKX0pLHJlbW92ZUxvY2FsRW50cnk6KGZ1bmN0aW9uKHBhdGgsY2FsbGJhY2spe3RyeXt2YXIgbG9va3VwPUZTLmxvb2t1cFBhdGgocGF0aCk7dmFyIHN0YXQ9RlMuc3RhdChwYXRoKTtpZihGUy5pc0RpcihzdGF0Lm1vZGUpKXtGUy5ybWRpcihwYXRoKX1lbHNlIGlmKEZTLmlzRmlsZShzdGF0Lm1vZGUpKXtGUy51bmxpbmsocGF0aCl9fWNhdGNoKGUpe3JldHVybiBjYWxsYmFjayhlKX1jYWxsYmFjayhudWxsKX0pLGxvYWRSZW1vdGVFbnRyeTooZnVuY3Rpb24oc3RvcmUscGF0aCxjYWxsYmFjayl7dmFyIHJlcT1zdG9yZS5nZXQocGF0aCk7cmVxLm9uc3VjY2Vzcz0oZnVuY3Rpb24oZXZlbnQpe2NhbGxiYWNrKG51bGwsZXZlbnQudGFyZ2V0LnJlc3VsdCl9KTtyZXEub25lcnJvcj0oZnVuY3Rpb24oZSl7Y2FsbGJhY2sodGhpcy5lcnJvcik7ZS5wcmV2ZW50RGVmYXVsdCgpfSl9KSxzdG9yZVJlbW90ZUVudHJ5OihmdW5jdGlvbihzdG9yZSxwYXRoLGVudHJ5LGNhbGxiYWNrKXt2YXIgcmVxPXN0b3JlLnB1dChlbnRyeSxwYXRoKTtyZXEub25zdWNjZXNzPShmdW5jdGlvbigpe2NhbGxiYWNrKG51bGwpfSk7cmVxLm9uZXJyb3I9KGZ1bmN0aW9uKGUpe2NhbGxiYWNrKHRoaXMuZXJyb3IpO2UucHJldmVudERlZmF1bHQoKX0pfSkscmVtb3ZlUmVtb3RlRW50cnk6KGZ1bmN0aW9uKHN0b3JlLHBhdGgsY2FsbGJhY2spe3ZhciByZXE9c3RvcmUuZGVsZXRlKHBhdGgpO3JlcS5vbnN1Y2Nlc3M9KGZ1bmN0aW9uKCl7Y2FsbGJhY2sobnVsbCl9KTtyZXEub25lcnJvcj0oZnVuY3Rpb24oZSl7Y2FsbGJhY2sodGhpcy5lcnJvcik7ZS5wcmV2ZW50RGVmYXVsdCgpfSl9KSxyZWNvbmNpbGU6KGZ1bmN0aW9uKHNyYyxkc3QsY2FsbGJhY2spe3ZhciB0b3RhbD0wO3ZhciBjcmVhdGU9W107T2JqZWN0LmtleXMoc3JjLmVudHJpZXMpLmZvckVhY2goKGZ1bmN0aW9uKGtleSl7dmFyIGU9c3JjLmVudHJpZXNba2V5XTt2YXIgZTI9ZHN0LmVudHJpZXNba2V5XTtpZighZTJ8fGUudGltZXN0YW1wPmUyLnRpbWVzdGFtcCl7Y3JlYXRlLnB1c2goa2V5KTt0b3RhbCsrfX0pKTt2YXIgcmVtb3ZlPVtdO09iamVjdC5rZXlzKGRzdC5lbnRyaWVzKS5mb3JFYWNoKChmdW5jdGlvbihrZXkpe3ZhciBlPWRzdC5lbnRyaWVzW2tleV07dmFyIGUyPXNyYy5lbnRyaWVzW2tleV07aWYoIWUyKXtyZW1vdmUucHVzaChrZXkpO3RvdGFsKyt9fSkpO2lmKCF0b3RhbCl7cmV0dXJuIGNhbGxiYWNrKG51bGwpfXZhciBlcnJvcmVkPWZhbHNlO3ZhciBjb21wbGV0ZWQ9MDt2YXIgZGI9c3JjLnR5cGU9PT1cInJlbW90ZVwiP3NyYy5kYjpkc3QuZGI7dmFyIHRyYW5zYWN0aW9uPWRiLnRyYW5zYWN0aW9uKFtJREJGUy5EQl9TVE9SRV9OQU1FXSxcInJlYWR3cml0ZVwiKTt2YXIgc3RvcmU9dHJhbnNhY3Rpb24ub2JqZWN0U3RvcmUoSURCRlMuREJfU1RPUkVfTkFNRSk7ZnVuY3Rpb24gZG9uZShlcnIpe2lmKGVycil7aWYoIWRvbmUuZXJyb3JlZCl7ZG9uZS5lcnJvcmVkPXRydWU7cmV0dXJuIGNhbGxiYWNrKGVycil9cmV0dXJufWlmKCsrY29tcGxldGVkPj10b3RhbCl7cmV0dXJuIGNhbGxiYWNrKG51bGwpfX10cmFuc2FjdGlvbi5vbmVycm9yPShmdW5jdGlvbihlKXtkb25lKHRoaXMuZXJyb3IpO2UucHJldmVudERlZmF1bHQoKX0pO2NyZWF0ZS5zb3J0KCkuZm9yRWFjaCgoZnVuY3Rpb24ocGF0aCl7aWYoZHN0LnR5cGU9PT1cImxvY2FsXCIpe0lEQkZTLmxvYWRSZW1vdGVFbnRyeShzdG9yZSxwYXRoLChmdW5jdGlvbihlcnIsZW50cnkpe2lmKGVycilyZXR1cm4gZG9uZShlcnIpO0lEQkZTLnN0b3JlTG9jYWxFbnRyeShwYXRoLGVudHJ5LGRvbmUpfSkpfWVsc2V7SURCRlMubG9hZExvY2FsRW50cnkocGF0aCwoZnVuY3Rpb24oZXJyLGVudHJ5KXtpZihlcnIpcmV0dXJuIGRvbmUoZXJyKTtJREJGUy5zdG9yZVJlbW90ZUVudHJ5KHN0b3JlLHBhdGgsZW50cnksZG9uZSl9KSl9fSkpO3JlbW92ZS5zb3J0KCkucmV2ZXJzZSgpLmZvckVhY2goKGZ1bmN0aW9uKHBhdGgpe2lmKGRzdC50eXBlPT09XCJsb2NhbFwiKXtJREJGUy5yZW1vdmVMb2NhbEVudHJ5KHBhdGgsZG9uZSl9ZWxzZXtJREJGUy5yZW1vdmVSZW1vdGVFbnRyeShzdG9yZSxwYXRoLGRvbmUpfX0pKX0pfTt2YXIgTk9ERUZTPXtpc1dpbmRvd3M6ZmFsc2Usc3RhdGljSW5pdDooZnVuY3Rpb24oKXtOT0RFRlMuaXNXaW5kb3dzPSEhcHJvY2Vzcy5wbGF0Zm9ybS5tYXRjaCgvXndpbi8pfSksbW91bnQ6KGZ1bmN0aW9uKG1vdW50KXthc3NlcnQoRU5WSVJPTk1FTlRfSVNfTk9ERSk7cmV0dXJuIE5PREVGUy5jcmVhdGVOb2RlKG51bGwsXCIvXCIsTk9ERUZTLmdldE1vZGUobW91bnQub3B0cy5yb290KSwwKX0pLGNyZWF0ZU5vZGU6KGZ1bmN0aW9uKHBhcmVudCxuYW1lLG1vZGUsZGV2KXtpZighRlMuaXNEaXIobW9kZSkmJiFGUy5pc0ZpbGUobW9kZSkmJiFGUy5pc0xpbmsobW9kZSkpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVJTlZBTCl9dmFyIG5vZGU9RlMuY3JlYXRlTm9kZShwYXJlbnQsbmFtZSxtb2RlKTtub2RlLm5vZGVfb3BzPU5PREVGUy5ub2RlX29wcztub2RlLnN0cmVhbV9vcHM9Tk9ERUZTLnN0cmVhbV9vcHM7cmV0dXJuIG5vZGV9KSxnZXRNb2RlOihmdW5jdGlvbihwYXRoKXt2YXIgc3RhdDt0cnl7c3RhdD1mcy5sc3RhdFN5bmMocGF0aCk7aWYoTk9ERUZTLmlzV2luZG93cyl7c3RhdC5tb2RlPXN0YXQubW9kZXwoc3RhdC5tb2RlJjE0Nik+PjF9fWNhdGNoKGUpe2lmKCFlLmNvZGUpdGhyb3cgZTt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFU1tlLmNvZGVdKX1yZXR1cm4gc3RhdC5tb2RlfSkscmVhbFBhdGg6KGZ1bmN0aW9uKG5vZGUpe3ZhciBwYXJ0cz1bXTt3aGlsZShub2RlLnBhcmVudCE9PW5vZGUpe3BhcnRzLnB1c2gobm9kZS5uYW1lKTtub2RlPW5vZGUucGFyZW50fXBhcnRzLnB1c2gobm9kZS5tb3VudC5vcHRzLnJvb3QpO3BhcnRzLnJldmVyc2UoKTtyZXR1cm4gUEFUSC5qb2luLmFwcGx5KG51bGwscGFydHMpfSksZmxhZ3NUb1Blcm1pc3Npb25TdHJpbmdNYXA6ezA6XCJyXCIsMTpcInIrXCIsMjpcInIrXCIsNjQ6XCJyXCIsNjU6XCJyK1wiLDY2OlwicitcIiwxMjk6XCJyeCtcIiwxOTM6XCJyeCtcIiw1MTQ6XCJ3K1wiLDU3NzpcIndcIiw1Nzg6XCJ3K1wiLDcwNTpcInd4XCIsNzA2Olwid3grXCIsMTAyNDpcImFcIiwxMDI1OlwiYVwiLDEwMjY6XCJhK1wiLDEwODk6XCJhXCIsMTA5MDpcImErXCIsMTE1MzpcImF4XCIsMTE1NDpcImF4K1wiLDEyMTc6XCJheFwiLDEyMTg6XCJheCtcIiw0MDk2OlwicnNcIiw0MDk4OlwicnMrXCJ9LGZsYWdzVG9QZXJtaXNzaW9uU3RyaW5nOihmdW5jdGlvbihmbGFncyl7ZmxhZ3MmPX4zMjc2ODtpZihmbGFncyBpbiBOT0RFRlMuZmxhZ3NUb1Blcm1pc3Npb25TdHJpbmdNYXApe3JldHVybiBOT0RFRlMuZmxhZ3NUb1Blcm1pc3Npb25TdHJpbmdNYXBbZmxhZ3NdfWVsc2V7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUlOVkFMKX19KSxub2RlX29wczp7Z2V0YXR0cjooZnVuY3Rpb24obm9kZSl7dmFyIHBhdGg9Tk9ERUZTLnJlYWxQYXRoKG5vZGUpO3ZhciBzdGF0O3RyeXtzdGF0PWZzLmxzdGF0U3luYyhwYXRoKX1jYXRjaChlKXtpZighZS5jb2RlKXRocm93IGU7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVNbZS5jb2RlXSl9aWYoTk9ERUZTLmlzV2luZG93cyYmIXN0YXQuYmxrc2l6ZSl7c3RhdC5ibGtzaXplPTQwOTZ9aWYoTk9ERUZTLmlzV2luZG93cyYmIXN0YXQuYmxvY2tzKXtzdGF0LmJsb2Nrcz0oc3RhdC5zaXplK3N0YXQuYmxrc2l6ZS0xKS9zdGF0LmJsa3NpemV8MH1yZXR1cm57ZGV2OnN0YXQuZGV2LGlubzpzdGF0Lmlubyxtb2RlOnN0YXQubW9kZSxubGluazpzdGF0Lm5saW5rLHVpZDpzdGF0LnVpZCxnaWQ6c3RhdC5naWQscmRldjpzdGF0LnJkZXYsc2l6ZTpzdGF0LnNpemUsYXRpbWU6c3RhdC5hdGltZSxtdGltZTpzdGF0Lm10aW1lLGN0aW1lOnN0YXQuY3RpbWUsYmxrc2l6ZTpzdGF0LmJsa3NpemUsYmxvY2tzOnN0YXQuYmxvY2tzfX0pLHNldGF0dHI6KGZ1bmN0aW9uKG5vZGUsYXR0cil7dmFyIHBhdGg9Tk9ERUZTLnJlYWxQYXRoKG5vZGUpO3RyeXtpZihhdHRyLm1vZGUhPT11bmRlZmluZWQpe2ZzLmNobW9kU3luYyhwYXRoLGF0dHIubW9kZSk7bm9kZS5tb2RlPWF0dHIubW9kZX1pZihhdHRyLnRpbWVzdGFtcCE9PXVuZGVmaW5lZCl7dmFyIGRhdGU9bmV3IERhdGUoYXR0ci50aW1lc3RhbXApO2ZzLnV0aW1lc1N5bmMocGF0aCxkYXRlLGRhdGUpfWlmKGF0dHIuc2l6ZSE9PXVuZGVmaW5lZCl7ZnMudHJ1bmNhdGVTeW5jKHBhdGgsYXR0ci5zaXplKX19Y2F0Y2goZSl7aWYoIWUuY29kZSl0aHJvdyBlO3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTW2UuY29kZV0pfX0pLGxvb2t1cDooZnVuY3Rpb24ocGFyZW50LG5hbWUpe3ZhciBwYXRoPVBBVEguam9pbjIoTk9ERUZTLnJlYWxQYXRoKHBhcmVudCksbmFtZSk7dmFyIG1vZGU9Tk9ERUZTLmdldE1vZGUocGF0aCk7cmV0dXJuIE5PREVGUy5jcmVhdGVOb2RlKHBhcmVudCxuYW1lLG1vZGUpfSksbWtub2Q6KGZ1bmN0aW9uKHBhcmVudCxuYW1lLG1vZGUsZGV2KXt2YXIgbm9kZT1OT0RFRlMuY3JlYXRlTm9kZShwYXJlbnQsbmFtZSxtb2RlLGRldik7dmFyIHBhdGg9Tk9ERUZTLnJlYWxQYXRoKG5vZGUpO3RyeXtpZihGUy5pc0Rpcihub2RlLm1vZGUpKXtmcy5ta2RpclN5bmMocGF0aCxub2RlLm1vZGUpfWVsc2V7ZnMud3JpdGVGaWxlU3luYyhwYXRoLFwiXCIse21vZGU6bm9kZS5tb2RlfSl9fWNhdGNoKGUpe2lmKCFlLmNvZGUpdGhyb3cgZTt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFU1tlLmNvZGVdKX1yZXR1cm4gbm9kZX0pLHJlbmFtZTooZnVuY3Rpb24ob2xkTm9kZSxuZXdEaXIsbmV3TmFtZSl7dmFyIG9sZFBhdGg9Tk9ERUZTLnJlYWxQYXRoKG9sZE5vZGUpO3ZhciBuZXdQYXRoPVBBVEguam9pbjIoTk9ERUZTLnJlYWxQYXRoKG5ld0RpciksbmV3TmFtZSk7dHJ5e2ZzLnJlbmFtZVN5bmMob2xkUGF0aCxuZXdQYXRoKX1jYXRjaChlKXtpZighZS5jb2RlKXRocm93IGU7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVNbZS5jb2RlXSl9fSksdW5saW5rOihmdW5jdGlvbihwYXJlbnQsbmFtZSl7dmFyIHBhdGg9UEFUSC5qb2luMihOT0RFRlMucmVhbFBhdGgocGFyZW50KSxuYW1lKTt0cnl7ZnMudW5saW5rU3luYyhwYXRoKX1jYXRjaChlKXtpZighZS5jb2RlKXRocm93IGU7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVNbZS5jb2RlXSl9fSkscm1kaXI6KGZ1bmN0aW9uKHBhcmVudCxuYW1lKXt2YXIgcGF0aD1QQVRILmpvaW4yKE5PREVGUy5yZWFsUGF0aChwYXJlbnQpLG5hbWUpO3RyeXtmcy5ybWRpclN5bmMocGF0aCl9Y2F0Y2goZSl7aWYoIWUuY29kZSl0aHJvdyBlO3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTW2UuY29kZV0pfX0pLHJlYWRkaXI6KGZ1bmN0aW9uKG5vZGUpe3ZhciBwYXRoPU5PREVGUy5yZWFsUGF0aChub2RlKTt0cnl7cmV0dXJuIGZzLnJlYWRkaXJTeW5jKHBhdGgpfWNhdGNoKGUpe2lmKCFlLmNvZGUpdGhyb3cgZTt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFU1tlLmNvZGVdKX19KSxzeW1saW5rOihmdW5jdGlvbihwYXJlbnQsbmV3TmFtZSxvbGRQYXRoKXt2YXIgbmV3UGF0aD1QQVRILmpvaW4yKE5PREVGUy5yZWFsUGF0aChwYXJlbnQpLG5ld05hbWUpO3RyeXtmcy5zeW1saW5rU3luYyhvbGRQYXRoLG5ld1BhdGgpfWNhdGNoKGUpe2lmKCFlLmNvZGUpdGhyb3cgZTt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFU1tlLmNvZGVdKX19KSxyZWFkbGluazooZnVuY3Rpb24obm9kZSl7dmFyIHBhdGg9Tk9ERUZTLnJlYWxQYXRoKG5vZGUpO3RyeXtwYXRoPWZzLnJlYWRsaW5rU3luYyhwYXRoKTtwYXRoPU5PREVKU19QQVRILnJlbGF0aXZlKE5PREVKU19QQVRILnJlc29sdmUobm9kZS5tb3VudC5vcHRzLnJvb3QpLHBhdGgpO3JldHVybiBwYXRofWNhdGNoKGUpe2lmKCFlLmNvZGUpdGhyb3cgZTt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFU1tlLmNvZGVdKX19KX0sc3RyZWFtX29wczp7b3BlbjooZnVuY3Rpb24oc3RyZWFtKXt2YXIgcGF0aD1OT0RFRlMucmVhbFBhdGgoc3RyZWFtLm5vZGUpO3RyeXtpZihGUy5pc0ZpbGUoc3RyZWFtLm5vZGUubW9kZSkpe3N0cmVhbS5uZmQ9ZnMub3BlblN5bmMocGF0aCxOT0RFRlMuZmxhZ3NUb1Blcm1pc3Npb25TdHJpbmcoc3RyZWFtLmZsYWdzKSl9fWNhdGNoKGUpe2lmKCFlLmNvZGUpdGhyb3cgZTt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFU1tlLmNvZGVdKX19KSxjbG9zZTooZnVuY3Rpb24oc3RyZWFtKXt0cnl7aWYoRlMuaXNGaWxlKHN0cmVhbS5ub2RlLm1vZGUpJiZzdHJlYW0ubmZkKXtmcy5jbG9zZVN5bmMoc3RyZWFtLm5mZCl9fWNhdGNoKGUpe2lmKCFlLmNvZGUpdGhyb3cgZTt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFU1tlLmNvZGVdKX19KSxyZWFkOihmdW5jdGlvbihzdHJlYW0sYnVmZmVyLG9mZnNldCxsZW5ndGgscG9zaXRpb24pe2lmKGxlbmd0aD09PTApcmV0dXJuIDA7dmFyIG5idWZmZXI9bmV3IEJ1ZmZlcihsZW5ndGgpO3ZhciByZXM7dHJ5e3Jlcz1mcy5yZWFkU3luYyhzdHJlYW0ubmZkLG5idWZmZXIsMCxsZW5ndGgscG9zaXRpb24pfWNhdGNoKGUpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTW2UuY29kZV0pfWlmKHJlcz4wKXtmb3IodmFyIGk9MDtpPHJlcztpKyspe2J1ZmZlcltvZmZzZXQraV09bmJ1ZmZlcltpXX19cmV0dXJuIHJlc30pLHdyaXRlOihmdW5jdGlvbihzdHJlYW0sYnVmZmVyLG9mZnNldCxsZW5ndGgscG9zaXRpb24pe3ZhciBuYnVmZmVyPW5ldyBCdWZmZXIoYnVmZmVyLnN1YmFycmF5KG9mZnNldCxvZmZzZXQrbGVuZ3RoKSk7dmFyIHJlczt0cnl7cmVzPWZzLndyaXRlU3luYyhzdHJlYW0ubmZkLG5idWZmZXIsMCxsZW5ndGgscG9zaXRpb24pfWNhdGNoKGUpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTW2UuY29kZV0pfXJldHVybiByZXN9KSxsbHNlZWs6KGZ1bmN0aW9uKHN0cmVhbSxvZmZzZXQsd2hlbmNlKXt2YXIgcG9zaXRpb249b2Zmc2V0O2lmKHdoZW5jZT09PTEpe3Bvc2l0aW9uKz1zdHJlYW0ucG9zaXRpb259ZWxzZSBpZih3aGVuY2U9PT0yKXtpZihGUy5pc0ZpbGUoc3RyZWFtLm5vZGUubW9kZSkpe3RyeXt2YXIgc3RhdD1mcy5mc3RhdFN5bmMoc3RyZWFtLm5mZCk7cG9zaXRpb24rPXN0YXQuc2l6ZX1jYXRjaChlKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFU1tlLmNvZGVdKX19fWlmKHBvc2l0aW9uPDApe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVJTlZBTCl9cmV0dXJuIHBvc2l0aW9ufSl9fTt2YXIgV09SS0VSRlM9e0RJUl9NT0RFOjE2ODk1LEZJTEVfTU9ERTozMzI3OSxyZWFkZXI6bnVsbCxtb3VudDooZnVuY3Rpb24obW91bnQpe2Fzc2VydChFTlZJUk9OTUVOVF9JU19XT1JLRVIpO2lmKCFXT1JLRVJGUy5yZWFkZXIpV09SS0VSRlMucmVhZGVyPW5ldyBGaWxlUmVhZGVyU3luYzt2YXIgcm9vdD1XT1JLRVJGUy5jcmVhdGVOb2RlKG51bGwsXCIvXCIsV09SS0VSRlMuRElSX01PREUsMCk7dmFyIGNyZWF0ZWRQYXJlbnRzPXt9O2Z1bmN0aW9uIGVuc3VyZVBhcmVudChwYXRoKXt2YXIgcGFydHM9cGF0aC5zcGxpdChcIi9cIik7dmFyIHBhcmVudD1yb290O2Zvcih2YXIgaT0wO2k8cGFydHMubGVuZ3RoLTE7aSsrKXt2YXIgY3Vycj1wYXJ0cy5zbGljZSgwLGkrMSkuam9pbihcIi9cIik7aWYoIWNyZWF0ZWRQYXJlbnRzW2N1cnJdKXtjcmVhdGVkUGFyZW50c1tjdXJyXT1XT1JLRVJGUy5jcmVhdGVOb2RlKHBhcmVudCxjdXJyLFdPUktFUkZTLkRJUl9NT0RFLDApfXBhcmVudD1jcmVhdGVkUGFyZW50c1tjdXJyXX1yZXR1cm4gcGFyZW50fWZ1bmN0aW9uIGJhc2UocGF0aCl7dmFyIHBhcnRzPXBhdGguc3BsaXQoXCIvXCIpO3JldHVybiBwYXJ0c1twYXJ0cy5sZW5ndGgtMV19QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChtb3VudC5vcHRzW1wiZmlsZXNcIl18fFtdLChmdW5jdGlvbihmaWxlKXtXT1JLRVJGUy5jcmVhdGVOb2RlKGVuc3VyZVBhcmVudChmaWxlLm5hbWUpLGJhc2UoZmlsZS5uYW1lKSxXT1JLRVJGUy5GSUxFX01PREUsMCxmaWxlLGZpbGUubGFzdE1vZGlmaWVkRGF0ZSl9KSk7KG1vdW50Lm9wdHNbXCJibG9ic1wiXXx8W10pLmZvckVhY2goKGZ1bmN0aW9uKG9iail7V09SS0VSRlMuY3JlYXRlTm9kZShlbnN1cmVQYXJlbnQob2JqW1wibmFtZVwiXSksYmFzZShvYmpbXCJuYW1lXCJdKSxXT1JLRVJGUy5GSUxFX01PREUsMCxvYmpbXCJkYXRhXCJdKX0pKTsobW91bnQub3B0c1tcInBhY2thZ2VzXCJdfHxbXSkuZm9yRWFjaCgoZnVuY3Rpb24ocGFjayl7cGFja1tcIm1ldGFkYXRhXCJdLmZpbGVzLmZvckVhY2goKGZ1bmN0aW9uKGZpbGUpe3ZhciBuYW1lPWZpbGUuZmlsZW5hbWUuc3Vic3RyKDEpO1dPUktFUkZTLmNyZWF0ZU5vZGUoZW5zdXJlUGFyZW50KG5hbWUpLGJhc2UobmFtZSksV09SS0VSRlMuRklMRV9NT0RFLDAscGFja1tcImJsb2JcIl0uc2xpY2UoZmlsZS5zdGFydCxmaWxlLmVuZCkpfSkpfSkpO3JldHVybiByb290fSksY3JlYXRlTm9kZTooZnVuY3Rpb24ocGFyZW50LG5hbWUsbW9kZSxkZXYsY29udGVudHMsbXRpbWUpe3ZhciBub2RlPUZTLmNyZWF0ZU5vZGUocGFyZW50LG5hbWUsbW9kZSk7bm9kZS5tb2RlPW1vZGU7bm9kZS5ub2RlX29wcz1XT1JLRVJGUy5ub2RlX29wcztub2RlLnN0cmVhbV9vcHM9V09SS0VSRlMuc3RyZWFtX29wcztub2RlLnRpbWVzdGFtcD0obXRpbWV8fG5ldyBEYXRlKS5nZXRUaW1lKCk7YXNzZXJ0KFdPUktFUkZTLkZJTEVfTU9ERSE9PVdPUktFUkZTLkRJUl9NT0RFKTtpZihtb2RlPT09V09SS0VSRlMuRklMRV9NT0RFKXtub2RlLnNpemU9Y29udGVudHMuc2l6ZTtub2RlLmNvbnRlbnRzPWNvbnRlbnRzfWVsc2V7bm9kZS5zaXplPTQwOTY7bm9kZS5jb250ZW50cz17fX1pZihwYXJlbnQpe3BhcmVudC5jb250ZW50c1tuYW1lXT1ub2RlfXJldHVybiBub2RlfSksbm9kZV9vcHM6e2dldGF0dHI6KGZ1bmN0aW9uKG5vZGUpe3JldHVybntkZXY6MSxpbm86dW5kZWZpbmVkLG1vZGU6bm9kZS5tb2RlLG5saW5rOjEsdWlkOjAsZ2lkOjAscmRldjp1bmRlZmluZWQsc2l6ZTpub2RlLnNpemUsYXRpbWU6bmV3IERhdGUobm9kZS50aW1lc3RhbXApLG10aW1lOm5ldyBEYXRlKG5vZGUudGltZXN0YW1wKSxjdGltZTpuZXcgRGF0ZShub2RlLnRpbWVzdGFtcCksYmxrc2l6ZTo0MDk2LGJsb2NrczpNYXRoLmNlaWwobm9kZS5zaXplLzQwOTYpfX0pLHNldGF0dHI6KGZ1bmN0aW9uKG5vZGUsYXR0cil7aWYoYXR0ci5tb2RlIT09dW5kZWZpbmVkKXtub2RlLm1vZGU9YXR0ci5tb2RlfWlmKGF0dHIudGltZXN0YW1wIT09dW5kZWZpbmVkKXtub2RlLnRpbWVzdGFtcD1hdHRyLnRpbWVzdGFtcH19KSxsb29rdXA6KGZ1bmN0aW9uKHBhcmVudCxuYW1lKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FTk9FTlQpfSksbWtub2Q6KGZ1bmN0aW9uKHBhcmVudCxuYW1lLG1vZGUsZGV2KXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FUEVSTSl9KSxyZW5hbWU6KGZ1bmN0aW9uKG9sZE5vZGUsbmV3RGlyLG5ld05hbWUpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVQRVJNKX0pLHVubGluazooZnVuY3Rpb24ocGFyZW50LG5hbWUpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVQRVJNKX0pLHJtZGlyOihmdW5jdGlvbihwYXJlbnQsbmFtZSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRVBFUk0pfSkscmVhZGRpcjooZnVuY3Rpb24obm9kZSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRVBFUk0pfSksc3ltbGluazooZnVuY3Rpb24ocGFyZW50LG5ld05hbWUsb2xkUGF0aCl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRVBFUk0pfSkscmVhZGxpbms6KGZ1bmN0aW9uKG5vZGUpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVQRVJNKX0pfSxzdHJlYW1fb3BzOntyZWFkOihmdW5jdGlvbihzdHJlYW0sYnVmZmVyLG9mZnNldCxsZW5ndGgscG9zaXRpb24pe2lmKHBvc2l0aW9uPj1zdHJlYW0ubm9kZS5zaXplKXJldHVybiAwO3ZhciBjaHVuaz1zdHJlYW0ubm9kZS5jb250ZW50cy5zbGljZShwb3NpdGlvbixwb3NpdGlvbitsZW5ndGgpO3ZhciBhYj1XT1JLRVJGUy5yZWFkZXIucmVhZEFzQXJyYXlCdWZmZXIoY2h1bmspO2J1ZmZlci5zZXQobmV3IFVpbnQ4QXJyYXkoYWIpLG9mZnNldCk7cmV0dXJuIGNodW5rLnNpemV9KSx3cml0ZTooZnVuY3Rpb24oc3RyZWFtLGJ1ZmZlcixvZmZzZXQsbGVuZ3RoLHBvc2l0aW9uKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FSU8pfSksbGxzZWVrOihmdW5jdGlvbihzdHJlYW0sb2Zmc2V0LHdoZW5jZSl7dmFyIHBvc2l0aW9uPW9mZnNldDtpZih3aGVuY2U9PT0xKXtwb3NpdGlvbis9c3RyZWFtLnBvc2l0aW9ufWVsc2UgaWYod2hlbmNlPT09Mil7aWYoRlMuaXNGaWxlKHN0cmVhbS5ub2RlLm1vZGUpKXtwb3NpdGlvbis9c3RyZWFtLm5vZGUuc2l6ZX19aWYocG9zaXRpb248MCl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUlOVkFMKX1yZXR1cm4gcG9zaXRpb259KX19O3ZhciBfc3RkaW49YWxsb2NhdGUoMSxcImkzMipcIixBTExPQ19TVEFUSUMpO3ZhciBfc3Rkb3V0PWFsbG9jYXRlKDEsXCJpMzIqXCIsQUxMT0NfU1RBVElDKTt2YXIgX3N0ZGVycj1hbGxvY2F0ZSgxLFwiaTMyKlwiLEFMTE9DX1NUQVRJQyk7dmFyIEZTPXtyb290Om51bGwsbW91bnRzOltdLGRldmljZXM6W251bGxdLHN0cmVhbXM6W10sbmV4dElub2RlOjEsbmFtZVRhYmxlOm51bGwsY3VycmVudFBhdGg6XCIvXCIsaW5pdGlhbGl6ZWQ6ZmFsc2UsaWdub3JlUGVybWlzc2lvbnM6dHJ1ZSx0cmFja2luZ0RlbGVnYXRlOnt9LHRyYWNraW5nOntvcGVuRmxhZ3M6e1JFQUQ6MSxXUklURToyfX0sRXJybm9FcnJvcjpudWxsLGdlbmVyaWNFcnJvcnM6e30sZmlsZXN5c3RlbXM6bnVsbCxoYW5kbGVGU0Vycm9yOihmdW5jdGlvbihlKXtpZighKGUgaW5zdGFuY2VvZiBGUy5FcnJub0Vycm9yKSl0aHJvdyBlK1wiIDogXCIrc3RhY2tUcmFjZSgpO3JldHVybiBfX19zZXRFcnJObyhlLmVycm5vKX0pLGxvb2t1cFBhdGg6KGZ1bmN0aW9uKHBhdGgsb3B0cyl7cGF0aD1QQVRILnJlc29sdmUoRlMuY3dkKCkscGF0aCk7b3B0cz1vcHRzfHx7fTtpZighcGF0aClyZXR1cm57cGF0aDpcIlwiLG5vZGU6bnVsbH07dmFyIGRlZmF1bHRzPXtmb2xsb3dfbW91bnQ6dHJ1ZSxyZWN1cnNlX2NvdW50OjB9O2Zvcih2YXIga2V5IGluIGRlZmF1bHRzKXtpZihvcHRzW2tleV09PT11bmRlZmluZWQpe29wdHNba2V5XT1kZWZhdWx0c1trZXldfX1pZihvcHRzLnJlY3Vyc2VfY291bnQ+OCl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUxPT1ApfXZhciBwYXJ0cz1QQVRILm5vcm1hbGl6ZUFycmF5KHBhdGguc3BsaXQoXCIvXCIpLmZpbHRlcigoZnVuY3Rpb24ocCl7cmV0dXJuISFwfSkpLGZhbHNlKTt2YXIgY3VycmVudD1GUy5yb290O3ZhciBjdXJyZW50X3BhdGg9XCIvXCI7Zm9yKHZhciBpPTA7aTxwYXJ0cy5sZW5ndGg7aSsrKXt2YXIgaXNsYXN0PWk9PT1wYXJ0cy5sZW5ndGgtMTtpZihpc2xhc3QmJm9wdHMucGFyZW50KXticmVha31jdXJyZW50PUZTLmxvb2t1cE5vZGUoY3VycmVudCxwYXJ0c1tpXSk7Y3VycmVudF9wYXRoPVBBVEguam9pbjIoY3VycmVudF9wYXRoLHBhcnRzW2ldKTtpZihGUy5pc01vdW50cG9pbnQoY3VycmVudCkpe2lmKCFpc2xhc3R8fGlzbGFzdCYmb3B0cy5mb2xsb3dfbW91bnQpe2N1cnJlbnQ9Y3VycmVudC5tb3VudGVkLnJvb3R9fWlmKCFpc2xhc3R8fG9wdHMuZm9sbG93KXt2YXIgY291bnQ9MDt3aGlsZShGUy5pc0xpbmsoY3VycmVudC5tb2RlKSl7dmFyIGxpbms9RlMucmVhZGxpbmsoY3VycmVudF9wYXRoKTtjdXJyZW50X3BhdGg9UEFUSC5yZXNvbHZlKFBBVEguZGlybmFtZShjdXJyZW50X3BhdGgpLGxpbmspO3ZhciBsb29rdXA9RlMubG9va3VwUGF0aChjdXJyZW50X3BhdGgse3JlY3Vyc2VfY291bnQ6b3B0cy5yZWN1cnNlX2NvdW50fSk7Y3VycmVudD1sb29rdXAubm9kZTtpZihjb3VudCsrPjQwKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FTE9PUCl9fX19cmV0dXJue3BhdGg6Y3VycmVudF9wYXRoLG5vZGU6Y3VycmVudH19KSxnZXRQYXRoOihmdW5jdGlvbihub2RlKXt2YXIgcGF0aDt3aGlsZSh0cnVlKXtpZihGUy5pc1Jvb3Qobm9kZSkpe3ZhciBtb3VudD1ub2RlLm1vdW50Lm1vdW50cG9pbnQ7aWYoIXBhdGgpcmV0dXJuIG1vdW50O3JldHVybiBtb3VudFttb3VudC5sZW5ndGgtMV0hPT1cIi9cIj9tb3VudCtcIi9cIitwYXRoOm1vdW50K3BhdGh9cGF0aD1wYXRoP25vZGUubmFtZStcIi9cIitwYXRoOm5vZGUubmFtZTtub2RlPW5vZGUucGFyZW50fX0pLGhhc2hOYW1lOihmdW5jdGlvbihwYXJlbnRpZCxuYW1lKXt2YXIgaGFzaD0wO2Zvcih2YXIgaT0wO2k8bmFtZS5sZW5ndGg7aSsrKXtoYXNoPShoYXNoPDw1KS1oYXNoK25hbWUuY2hhckNvZGVBdChpKXwwfXJldHVybihwYXJlbnRpZCtoYXNoPj4+MCklRlMubmFtZVRhYmxlLmxlbmd0aH0pLGhhc2hBZGROb2RlOihmdW5jdGlvbihub2RlKXt2YXIgaGFzaD1GUy5oYXNoTmFtZShub2RlLnBhcmVudC5pZCxub2RlLm5hbWUpO25vZGUubmFtZV9uZXh0PUZTLm5hbWVUYWJsZVtoYXNoXTtGUy5uYW1lVGFibGVbaGFzaF09bm9kZX0pLGhhc2hSZW1vdmVOb2RlOihmdW5jdGlvbihub2RlKXt2YXIgaGFzaD1GUy5oYXNoTmFtZShub2RlLnBhcmVudC5pZCxub2RlLm5hbWUpO2lmKEZTLm5hbWVUYWJsZVtoYXNoXT09PW5vZGUpe0ZTLm5hbWVUYWJsZVtoYXNoXT1ub2RlLm5hbWVfbmV4dH1lbHNle3ZhciBjdXJyZW50PUZTLm5hbWVUYWJsZVtoYXNoXTt3aGlsZShjdXJyZW50KXtpZihjdXJyZW50Lm5hbWVfbmV4dD09PW5vZGUpe2N1cnJlbnQubmFtZV9uZXh0PW5vZGUubmFtZV9uZXh0O2JyZWFrfWN1cnJlbnQ9Y3VycmVudC5uYW1lX25leHR9fX0pLGxvb2t1cE5vZGU6KGZ1bmN0aW9uKHBhcmVudCxuYW1lKXt2YXIgZXJyPUZTLm1heUxvb2t1cChwYXJlbnQpO2lmKGVycil7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoZXJyLHBhcmVudCl9dmFyIGhhc2g9RlMuaGFzaE5hbWUocGFyZW50LmlkLG5hbWUpO2Zvcih2YXIgbm9kZT1GUy5uYW1lVGFibGVbaGFzaF07bm9kZTtub2RlPW5vZGUubmFtZV9uZXh0KXt2YXIgbm9kZU5hbWU9bm9kZS5uYW1lO2lmKG5vZGUucGFyZW50LmlkPT09cGFyZW50LmlkJiZub2RlTmFtZT09PW5hbWUpe3JldHVybiBub2RlfX1yZXR1cm4gRlMubG9va3VwKHBhcmVudCxuYW1lKX0pLGNyZWF0ZU5vZGU6KGZ1bmN0aW9uKHBhcmVudCxuYW1lLG1vZGUscmRldil7aWYoIUZTLkZTTm9kZSl7RlMuRlNOb2RlPShmdW5jdGlvbihwYXJlbnQsbmFtZSxtb2RlLHJkZXYpe2lmKCFwYXJlbnQpe3BhcmVudD10aGlzfXRoaXMucGFyZW50PXBhcmVudDt0aGlzLm1vdW50PXBhcmVudC5tb3VudDt0aGlzLm1vdW50ZWQ9bnVsbDt0aGlzLmlkPUZTLm5leHRJbm9kZSsrO3RoaXMubmFtZT1uYW1lO3RoaXMubW9kZT1tb2RlO3RoaXMubm9kZV9vcHM9e307dGhpcy5zdHJlYW1fb3BzPXt9O3RoaXMucmRldj1yZGV2fSk7RlMuRlNOb2RlLnByb3RvdHlwZT17fTt2YXIgcmVhZE1vZGU9MjkyfDczO3ZhciB3cml0ZU1vZGU9MTQ2O09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKEZTLkZTTm9kZS5wcm90b3R5cGUse3JlYWQ6e2dldDooZnVuY3Rpb24oKXtyZXR1cm4odGhpcy5tb2RlJnJlYWRNb2RlKT09PXJlYWRNb2RlfSksc2V0OihmdW5jdGlvbih2YWwpe3ZhbD90aGlzLm1vZGV8PXJlYWRNb2RlOnRoaXMubW9kZSY9fnJlYWRNb2RlfSl9LHdyaXRlOntnZXQ6KGZ1bmN0aW9uKCl7cmV0dXJuKHRoaXMubW9kZSZ3cml0ZU1vZGUpPT09d3JpdGVNb2RlfSksc2V0OihmdW5jdGlvbih2YWwpe3ZhbD90aGlzLm1vZGV8PXdyaXRlTW9kZTp0aGlzLm1vZGUmPX53cml0ZU1vZGV9KX0saXNGb2xkZXI6e2dldDooZnVuY3Rpb24oKXtyZXR1cm4gRlMuaXNEaXIodGhpcy5tb2RlKX0pfSxpc0RldmljZTp7Z2V0OihmdW5jdGlvbigpe3JldHVybiBGUy5pc0NocmRldih0aGlzLm1vZGUpfSl9fSl9dmFyIG5vZGU9bmV3IEZTLkZTTm9kZShwYXJlbnQsbmFtZSxtb2RlLHJkZXYpO0ZTLmhhc2hBZGROb2RlKG5vZGUpO3JldHVybiBub2RlfSksZGVzdHJveU5vZGU6KGZ1bmN0aW9uKG5vZGUpe0ZTLmhhc2hSZW1vdmVOb2RlKG5vZGUpfSksaXNSb290OihmdW5jdGlvbihub2RlKXtyZXR1cm4gbm9kZT09PW5vZGUucGFyZW50fSksaXNNb3VudHBvaW50OihmdW5jdGlvbihub2RlKXtyZXR1cm4hIW5vZGUubW91bnRlZH0pLGlzRmlsZTooZnVuY3Rpb24obW9kZSl7cmV0dXJuKG1vZGUmNjE0NDApPT09MzI3Njh9KSxpc0RpcjooZnVuY3Rpb24obW9kZSl7cmV0dXJuKG1vZGUmNjE0NDApPT09MTYzODR9KSxpc0xpbms6KGZ1bmN0aW9uKG1vZGUpe3JldHVybihtb2RlJjYxNDQwKT09PTQwOTYwfSksaXNDaHJkZXY6KGZ1bmN0aW9uKG1vZGUpe3JldHVybihtb2RlJjYxNDQwKT09PTgxOTJ9KSxpc0Jsa2RldjooZnVuY3Rpb24obW9kZSl7cmV0dXJuKG1vZGUmNjE0NDApPT09MjQ1NzZ9KSxpc0ZJRk86KGZ1bmN0aW9uKG1vZGUpe3JldHVybihtb2RlJjYxNDQwKT09PTQwOTZ9KSxpc1NvY2tldDooZnVuY3Rpb24obW9kZSl7cmV0dXJuKG1vZGUmNDkxNTIpPT09NDkxNTJ9KSxmbGFnTW9kZXM6e1wiclwiOjAsXCJyc1wiOjEwNTI2NzIsXCJyK1wiOjIsXCJ3XCI6NTc3LFwid3hcIjo3MDUsXCJ4d1wiOjcwNSxcIncrXCI6NTc4LFwid3grXCI6NzA2LFwieHcrXCI6NzA2LFwiYVwiOjEwODksXCJheFwiOjEyMTcsXCJ4YVwiOjEyMTcsXCJhK1wiOjEwOTAsXCJheCtcIjoxMjE4LFwieGErXCI6MTIxOH0sbW9kZVN0cmluZ1RvRmxhZ3M6KGZ1bmN0aW9uKHN0cil7dmFyIGZsYWdzPUZTLmZsYWdNb2Rlc1tzdHJdO2lmKHR5cGVvZiBmbGFncz09PVwidW5kZWZpbmVkXCIpe3Rocm93IG5ldyBFcnJvcihcIlVua25vd24gZmlsZSBvcGVuIG1vZGU6IFwiK3N0cil9cmV0dXJuIGZsYWdzfSksZmxhZ3NUb1Blcm1pc3Npb25TdHJpbmc6KGZ1bmN0aW9uKGZsYWcpe3ZhciBwZXJtcz1bXCJyXCIsXCJ3XCIsXCJyd1wiXVtmbGFnJjNdO2lmKGZsYWcmNTEyKXtwZXJtcys9XCJ3XCJ9cmV0dXJuIHBlcm1zfSksbm9kZVBlcm1pc3Npb25zOihmdW5jdGlvbihub2RlLHBlcm1zKXtpZihGUy5pZ25vcmVQZXJtaXNzaW9ucyl7cmV0dXJuIDB9aWYocGVybXMuaW5kZXhPZihcInJcIikhPT0tMSYmIShub2RlLm1vZGUmMjkyKSl7cmV0dXJuIEVSUk5PX0NPREVTLkVBQ0NFU31lbHNlIGlmKHBlcm1zLmluZGV4T2YoXCJ3XCIpIT09LTEmJiEobm9kZS5tb2RlJjE0Nikpe3JldHVybiBFUlJOT19DT0RFUy5FQUNDRVN9ZWxzZSBpZihwZXJtcy5pbmRleE9mKFwieFwiKSE9PS0xJiYhKG5vZGUubW9kZSY3Mykpe3JldHVybiBFUlJOT19DT0RFUy5FQUNDRVN9cmV0dXJuIDB9KSxtYXlMb29rdXA6KGZ1bmN0aW9uKGRpcil7dmFyIGVycj1GUy5ub2RlUGVybWlzc2lvbnMoZGlyLFwieFwiKTtpZihlcnIpcmV0dXJuIGVycjtpZighZGlyLm5vZGVfb3BzLmxvb2t1cClyZXR1cm4gRVJSTk9fQ09ERVMuRUFDQ0VTO3JldHVybiAwfSksbWF5Q3JlYXRlOihmdW5jdGlvbihkaXIsbmFtZSl7dHJ5e3ZhciBub2RlPUZTLmxvb2t1cE5vZGUoZGlyLG5hbWUpO3JldHVybiBFUlJOT19DT0RFUy5FRVhJU1R9Y2F0Y2goZSl7fXJldHVybiBGUy5ub2RlUGVybWlzc2lvbnMoZGlyLFwid3hcIil9KSxtYXlEZWxldGU6KGZ1bmN0aW9uKGRpcixuYW1lLGlzZGlyKXt2YXIgbm9kZTt0cnl7bm9kZT1GUy5sb29rdXBOb2RlKGRpcixuYW1lKX1jYXRjaChlKXtyZXR1cm4gZS5lcnJub312YXIgZXJyPUZTLm5vZGVQZXJtaXNzaW9ucyhkaXIsXCJ3eFwiKTtpZihlcnIpe3JldHVybiBlcnJ9aWYoaXNkaXIpe2lmKCFGUy5pc0Rpcihub2RlLm1vZGUpKXtyZXR1cm4gRVJSTk9fQ09ERVMuRU5PVERJUn1pZihGUy5pc1Jvb3Qobm9kZSl8fEZTLmdldFBhdGgobm9kZSk9PT1GUy5jd2QoKSl7cmV0dXJuIEVSUk5PX0NPREVTLkVCVVNZfX1lbHNle2lmKEZTLmlzRGlyKG5vZGUubW9kZSkpe3JldHVybiBFUlJOT19DT0RFUy5FSVNESVJ9fXJldHVybiAwfSksbWF5T3BlbjooZnVuY3Rpb24obm9kZSxmbGFncyl7aWYoIW5vZGUpe3JldHVybiBFUlJOT19DT0RFUy5FTk9FTlR9aWYoRlMuaXNMaW5rKG5vZGUubW9kZSkpe3JldHVybiBFUlJOT19DT0RFUy5FTE9PUH1lbHNlIGlmKEZTLmlzRGlyKG5vZGUubW9kZSkpe2lmKChmbGFncyYyMDk3MTU1KSE9PTB8fGZsYWdzJjUxMil7cmV0dXJuIEVSUk5PX0NPREVTLkVJU0RJUn19cmV0dXJuIEZTLm5vZGVQZXJtaXNzaW9ucyhub2RlLEZTLmZsYWdzVG9QZXJtaXNzaW9uU3RyaW5nKGZsYWdzKSl9KSxNQVhfT1BFTl9GRFM6NDA5NixuZXh0ZmQ6KGZ1bmN0aW9uKGZkX3N0YXJ0LGZkX2VuZCl7ZmRfc3RhcnQ9ZmRfc3RhcnR8fDA7ZmRfZW5kPWZkX2VuZHx8RlMuTUFYX09QRU5fRkRTO2Zvcih2YXIgZmQ9ZmRfc3RhcnQ7ZmQ8PWZkX2VuZDtmZCsrKXtpZighRlMuc3RyZWFtc1tmZF0pe3JldHVybiBmZH19dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRU1GSUxFKX0pLGdldFN0cmVhbTooZnVuY3Rpb24oZmQpe3JldHVybiBGUy5zdHJlYW1zW2ZkXX0pLGNyZWF0ZVN0cmVhbTooZnVuY3Rpb24oc3RyZWFtLGZkX3N0YXJ0LGZkX2VuZCl7aWYoIUZTLkZTU3RyZWFtKXtGUy5GU1N0cmVhbT0oZnVuY3Rpb24oKXt9KTtGUy5GU1N0cmVhbS5wcm90b3R5cGU9e307T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoRlMuRlNTdHJlYW0ucHJvdG90eXBlLHtvYmplY3Q6e2dldDooZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlfSksc2V0OihmdW5jdGlvbih2YWwpe3RoaXMubm9kZT12YWx9KX0saXNSZWFkOntnZXQ6KGZ1bmN0aW9uKCl7cmV0dXJuKHRoaXMuZmxhZ3MmMjA5NzE1NSkhPT0xfSl9LGlzV3JpdGU6e2dldDooZnVuY3Rpb24oKXtyZXR1cm4odGhpcy5mbGFncyYyMDk3MTU1KSE9PTB9KX0saXNBcHBlbmQ6e2dldDooZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5mbGFncyYxMDI0fSl9fSl9dmFyIG5ld1N0cmVhbT1uZXcgRlMuRlNTdHJlYW07Zm9yKHZhciBwIGluIHN0cmVhbSl7bmV3U3RyZWFtW3BdPXN0cmVhbVtwXX1zdHJlYW09bmV3U3RyZWFtO3ZhciBmZD1GUy5uZXh0ZmQoZmRfc3RhcnQsZmRfZW5kKTtzdHJlYW0uZmQ9ZmQ7RlMuc3RyZWFtc1tmZF09c3RyZWFtO3JldHVybiBzdHJlYW19KSxjbG9zZVN0cmVhbTooZnVuY3Rpb24oZmQpe0ZTLnN0cmVhbXNbZmRdPW51bGx9KSxjaHJkZXZfc3RyZWFtX29wczp7b3BlbjooZnVuY3Rpb24oc3RyZWFtKXt2YXIgZGV2aWNlPUZTLmdldERldmljZShzdHJlYW0ubm9kZS5yZGV2KTtzdHJlYW0uc3RyZWFtX29wcz1kZXZpY2Uuc3RyZWFtX29wcztpZihzdHJlYW0uc3RyZWFtX29wcy5vcGVuKXtzdHJlYW0uc3RyZWFtX29wcy5vcGVuKHN0cmVhbSl9fSksbGxzZWVrOihmdW5jdGlvbigpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVTUElQRSl9KX0sbWFqb3I6KGZ1bmN0aW9uKGRldil7cmV0dXJuIGRldj4+OH0pLG1pbm9yOihmdW5jdGlvbihkZXYpe3JldHVybiBkZXYmMjU1fSksbWFrZWRldjooZnVuY3Rpb24obWEsbWkpe3JldHVybiBtYTw8OHxtaX0pLHJlZ2lzdGVyRGV2aWNlOihmdW5jdGlvbihkZXYsb3BzKXtGUy5kZXZpY2VzW2Rldl09e3N0cmVhbV9vcHM6b3BzfX0pLGdldERldmljZTooZnVuY3Rpb24oZGV2KXtyZXR1cm4gRlMuZGV2aWNlc1tkZXZdfSksZ2V0TW91bnRzOihmdW5jdGlvbihtb3VudCl7dmFyIG1vdW50cz1bXTt2YXIgY2hlY2s9W21vdW50XTt3aGlsZShjaGVjay5sZW5ndGgpe3ZhciBtPWNoZWNrLnBvcCgpO21vdW50cy5wdXNoKG0pO2NoZWNrLnB1c2guYXBwbHkoY2hlY2ssbS5tb3VudHMpfXJldHVybiBtb3VudHN9KSxzeW5jZnM6KGZ1bmN0aW9uKHBvcHVsYXRlLGNhbGxiYWNrKXtpZih0eXBlb2YgcG9wdWxhdGU9PT1cImZ1bmN0aW9uXCIpe2NhbGxiYWNrPXBvcHVsYXRlO3BvcHVsYXRlPWZhbHNlfXZhciBtb3VudHM9RlMuZ2V0TW91bnRzKEZTLnJvb3QubW91bnQpO3ZhciBjb21wbGV0ZWQ9MDtmdW5jdGlvbiBkb25lKGVycil7aWYoZXJyKXtpZighZG9uZS5lcnJvcmVkKXtkb25lLmVycm9yZWQ9dHJ1ZTtyZXR1cm4gY2FsbGJhY2soZXJyKX1yZXR1cm59aWYoKytjb21wbGV0ZWQ+PW1vdW50cy5sZW5ndGgpe2NhbGxiYWNrKG51bGwpfX1tb3VudHMuZm9yRWFjaCgoZnVuY3Rpb24obW91bnQpe2lmKCFtb3VudC50eXBlLnN5bmNmcyl7cmV0dXJuIGRvbmUobnVsbCl9bW91bnQudHlwZS5zeW5jZnMobW91bnQscG9wdWxhdGUsZG9uZSl9KSl9KSxtb3VudDooZnVuY3Rpb24odHlwZSxvcHRzLG1vdW50cG9pbnQpe3ZhciByb290PW1vdW50cG9pbnQ9PT1cIi9cIjt2YXIgcHNldWRvPSFtb3VudHBvaW50O3ZhciBub2RlO2lmKHJvb3QmJkZTLnJvb3Qpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVCVVNZKX1lbHNlIGlmKCFyb290JiYhcHNldWRvKXt2YXIgbG9va3VwPUZTLmxvb2t1cFBhdGgobW91bnRwb2ludCx7Zm9sbG93X21vdW50OmZhbHNlfSk7bW91bnRwb2ludD1sb29rdXAucGF0aDtub2RlPWxvb2t1cC5ub2RlO2lmKEZTLmlzTW91bnRwb2ludChub2RlKSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUJVU1kpfWlmKCFGUy5pc0Rpcihub2RlLm1vZGUpKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FTk9URElSKX19dmFyIG1vdW50PXt0eXBlOnR5cGUsb3B0czpvcHRzLG1vdW50cG9pbnQ6bW91bnRwb2ludCxtb3VudHM6W119O3ZhciBtb3VudFJvb3Q9dHlwZS5tb3VudChtb3VudCk7bW91bnRSb290Lm1vdW50PW1vdW50O21vdW50LnJvb3Q9bW91bnRSb290O2lmKHJvb3Qpe0ZTLnJvb3Q9bW91bnRSb290fWVsc2UgaWYobm9kZSl7bm9kZS5tb3VudGVkPW1vdW50O2lmKG5vZGUubW91bnQpe25vZGUubW91bnQubW91bnRzLnB1c2gobW91bnQpfX1yZXR1cm4gbW91bnRSb290fSksdW5tb3VudDooZnVuY3Rpb24obW91bnRwb2ludCl7dmFyIGxvb2t1cD1GUy5sb29rdXBQYXRoKG1vdW50cG9pbnQse2ZvbGxvd19tb3VudDpmYWxzZX0pO2lmKCFGUy5pc01vdW50cG9pbnQobG9va3VwLm5vZGUpKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FSU5WQUwpfXZhciBub2RlPWxvb2t1cC5ub2RlO3ZhciBtb3VudD1ub2RlLm1vdW50ZWQ7dmFyIG1vdW50cz1GUy5nZXRNb3VudHMobW91bnQpO09iamVjdC5rZXlzKEZTLm5hbWVUYWJsZSkuZm9yRWFjaCgoZnVuY3Rpb24oaGFzaCl7dmFyIGN1cnJlbnQ9RlMubmFtZVRhYmxlW2hhc2hdO3doaWxlKGN1cnJlbnQpe3ZhciBuZXh0PWN1cnJlbnQubmFtZV9uZXh0O2lmKG1vdW50cy5pbmRleE9mKGN1cnJlbnQubW91bnQpIT09LTEpe0ZTLmRlc3Ryb3lOb2RlKGN1cnJlbnQpfWN1cnJlbnQ9bmV4dH19KSk7bm9kZS5tb3VudGVkPW51bGw7dmFyIGlkeD1ub2RlLm1vdW50Lm1vdW50cy5pbmRleE9mKG1vdW50KTthc3NlcnQoaWR4IT09LTEpO25vZGUubW91bnQubW91bnRzLnNwbGljZShpZHgsMSl9KSxsb29rdXA6KGZ1bmN0aW9uKHBhcmVudCxuYW1lKXtyZXR1cm4gcGFyZW50Lm5vZGVfb3BzLmxvb2t1cChwYXJlbnQsbmFtZSl9KSxta25vZDooZnVuY3Rpb24ocGF0aCxtb2RlLGRldil7dmFyIGxvb2t1cD1GUy5sb29rdXBQYXRoKHBhdGgse3BhcmVudDp0cnVlfSk7dmFyIHBhcmVudD1sb29rdXAubm9kZTt2YXIgbmFtZT1QQVRILmJhc2VuYW1lKHBhdGgpO2lmKCFuYW1lfHxuYW1lPT09XCIuXCJ8fG5hbWU9PT1cIi4uXCIpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVJTlZBTCl9dmFyIGVycj1GUy5tYXlDcmVhdGUocGFyZW50LG5hbWUpO2lmKGVycil7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoZXJyKX1pZighcGFyZW50Lm5vZGVfb3BzLm1rbm9kKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FUEVSTSl9cmV0dXJuIHBhcmVudC5ub2RlX29wcy5ta25vZChwYXJlbnQsbmFtZSxtb2RlLGRldil9KSxjcmVhdGU6KGZ1bmN0aW9uKHBhdGgsbW9kZSl7bW9kZT1tb2RlIT09dW5kZWZpbmVkP21vZGU6NDM4O21vZGUmPTQwOTU7bW9kZXw9MzI3Njg7cmV0dXJuIEZTLm1rbm9kKHBhdGgsbW9kZSwwKX0pLG1rZGlyOihmdW5jdGlvbihwYXRoLG1vZGUpe21vZGU9bW9kZSE9PXVuZGVmaW5lZD9tb2RlOjUxMTttb2RlJj01MTF8NTEyO21vZGV8PTE2Mzg0O3JldHVybiBGUy5ta25vZChwYXRoLG1vZGUsMCl9KSxta2RldjooZnVuY3Rpb24ocGF0aCxtb2RlLGRldil7aWYodHlwZW9mIGRldj09PVwidW5kZWZpbmVkXCIpe2Rldj1tb2RlO21vZGU9NDM4fW1vZGV8PTgxOTI7cmV0dXJuIEZTLm1rbm9kKHBhdGgsbW9kZSxkZXYpfSksc3ltbGluazooZnVuY3Rpb24ob2xkcGF0aCxuZXdwYXRoKXtpZighUEFUSC5yZXNvbHZlKG9sZHBhdGgpKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FTk9FTlQpfXZhciBsb29rdXA9RlMubG9va3VwUGF0aChuZXdwYXRoLHtwYXJlbnQ6dHJ1ZX0pO3ZhciBwYXJlbnQ9bG9va3VwLm5vZGU7aWYoIXBhcmVudCl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRU5PRU5UKX12YXIgbmV3bmFtZT1QQVRILmJhc2VuYW1lKG5ld3BhdGgpO3ZhciBlcnI9RlMubWF5Q3JlYXRlKHBhcmVudCxuZXduYW1lKTtpZihlcnIpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKGVycil9aWYoIXBhcmVudC5ub2RlX29wcy5zeW1saW5rKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FUEVSTSl9cmV0dXJuIHBhcmVudC5ub2RlX29wcy5zeW1saW5rKHBhcmVudCxuZXduYW1lLG9sZHBhdGgpfSkscmVuYW1lOihmdW5jdGlvbihvbGRfcGF0aCxuZXdfcGF0aCl7dmFyIG9sZF9kaXJuYW1lPVBBVEguZGlybmFtZShvbGRfcGF0aCk7dmFyIG5ld19kaXJuYW1lPVBBVEguZGlybmFtZShuZXdfcGF0aCk7dmFyIG9sZF9uYW1lPVBBVEguYmFzZW5hbWUob2xkX3BhdGgpO3ZhciBuZXdfbmFtZT1QQVRILmJhc2VuYW1lKG5ld19wYXRoKTt2YXIgbG9va3VwLG9sZF9kaXIsbmV3X2Rpcjt0cnl7bG9va3VwPUZTLmxvb2t1cFBhdGgob2xkX3BhdGgse3BhcmVudDp0cnVlfSk7b2xkX2Rpcj1sb29rdXAubm9kZTtsb29rdXA9RlMubG9va3VwUGF0aChuZXdfcGF0aCx7cGFyZW50OnRydWV9KTtuZXdfZGlyPWxvb2t1cC5ub2RlfWNhdGNoKGUpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVCVVNZKX1pZighb2xkX2Rpcnx8IW5ld19kaXIpdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRU5PRU5UKTtpZihvbGRfZGlyLm1vdW50IT09bmV3X2Rpci5tb3VudCl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRVhERVYpfXZhciBvbGRfbm9kZT1GUy5sb29rdXBOb2RlKG9sZF9kaXIsb2xkX25hbWUpO3ZhciByZWxhdGl2ZT1QQVRILnJlbGF0aXZlKG9sZF9wYXRoLG5ld19kaXJuYW1lKTtpZihyZWxhdGl2ZS5jaGFyQXQoMCkhPT1cIi5cIil7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUlOVkFMKX1yZWxhdGl2ZT1QQVRILnJlbGF0aXZlKG5ld19wYXRoLG9sZF9kaXJuYW1lKTtpZihyZWxhdGl2ZS5jaGFyQXQoMCkhPT1cIi5cIil7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRU5PVEVNUFRZKX12YXIgbmV3X25vZGU7dHJ5e25ld19ub2RlPUZTLmxvb2t1cE5vZGUobmV3X2RpcixuZXdfbmFtZSl9Y2F0Y2goZSl7fWlmKG9sZF9ub2RlPT09bmV3X25vZGUpe3JldHVybn12YXIgaXNkaXI9RlMuaXNEaXIob2xkX25vZGUubW9kZSk7dmFyIGVycj1GUy5tYXlEZWxldGUob2xkX2RpcixvbGRfbmFtZSxpc2Rpcik7aWYoZXJyKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihlcnIpfWVycj1uZXdfbm9kZT9GUy5tYXlEZWxldGUobmV3X2RpcixuZXdfbmFtZSxpc2Rpcik6RlMubWF5Q3JlYXRlKG5ld19kaXIsbmV3X25hbWUpO2lmKGVycil7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoZXJyKX1pZighb2xkX2Rpci5ub2RlX29wcy5yZW5hbWUpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVQRVJNKX1pZihGUy5pc01vdW50cG9pbnQob2xkX25vZGUpfHxuZXdfbm9kZSYmRlMuaXNNb3VudHBvaW50KG5ld19ub2RlKSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUJVU1kpfWlmKG5ld19kaXIhPT1vbGRfZGlyKXtlcnI9RlMubm9kZVBlcm1pc3Npb25zKG9sZF9kaXIsXCJ3XCIpO2lmKGVycil7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoZXJyKX19dHJ5e2lmKEZTLnRyYWNraW5nRGVsZWdhdGVbXCJ3aWxsTW92ZVBhdGhcIl0pe0ZTLnRyYWNraW5nRGVsZWdhdGVbXCJ3aWxsTW92ZVBhdGhcIl0ob2xkX3BhdGgsbmV3X3BhdGgpfX1jYXRjaChlKXtjb25zb2xlLmxvZyhcIkZTLnRyYWNraW5nRGVsZWdhdGVbJ3dpbGxNb3ZlUGF0aCddKCdcIitvbGRfcGF0aCtcIicsICdcIituZXdfcGF0aCtcIicpIHRocmV3IGFuIGV4Y2VwdGlvbjogXCIrZS5tZXNzYWdlKX1GUy5oYXNoUmVtb3ZlTm9kZShvbGRfbm9kZSk7dHJ5e29sZF9kaXIubm9kZV9vcHMucmVuYW1lKG9sZF9ub2RlLG5ld19kaXIsbmV3X25hbWUpfWNhdGNoKGUpe3Rocm93IGV9ZmluYWxseXtGUy5oYXNoQWRkTm9kZShvbGRfbm9kZSl9dHJ5e2lmKEZTLnRyYWNraW5nRGVsZWdhdGVbXCJvbk1vdmVQYXRoXCJdKUZTLnRyYWNraW5nRGVsZWdhdGVbXCJvbk1vdmVQYXRoXCJdKG9sZF9wYXRoLG5ld19wYXRoKX1jYXRjaChlKXtjb25zb2xlLmxvZyhcIkZTLnRyYWNraW5nRGVsZWdhdGVbJ29uTW92ZVBhdGgnXSgnXCIrb2xkX3BhdGgrXCInLCAnXCIrbmV3X3BhdGgrXCInKSB0aHJldyBhbiBleGNlcHRpb246IFwiK2UubWVzc2FnZSl9fSkscm1kaXI6KGZ1bmN0aW9uKHBhdGgpe3ZhciBsb29rdXA9RlMubG9va3VwUGF0aChwYXRoLHtwYXJlbnQ6dHJ1ZX0pO3ZhciBwYXJlbnQ9bG9va3VwLm5vZGU7dmFyIG5hbWU9UEFUSC5iYXNlbmFtZShwYXRoKTt2YXIgbm9kZT1GUy5sb29rdXBOb2RlKHBhcmVudCxuYW1lKTt2YXIgZXJyPUZTLm1heURlbGV0ZShwYXJlbnQsbmFtZSx0cnVlKTtpZihlcnIpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKGVycil9aWYoIXBhcmVudC5ub2RlX29wcy5ybWRpcil7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRVBFUk0pfWlmKEZTLmlzTW91bnRwb2ludChub2RlKSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUJVU1kpfXRyeXtpZihGUy50cmFja2luZ0RlbGVnYXRlW1wid2lsbERlbGV0ZVBhdGhcIl0pe0ZTLnRyYWNraW5nRGVsZWdhdGVbXCJ3aWxsRGVsZXRlUGF0aFwiXShwYXRoKX19Y2F0Y2goZSl7Y29uc29sZS5sb2coXCJGUy50cmFja2luZ0RlbGVnYXRlWyd3aWxsRGVsZXRlUGF0aCddKCdcIitwYXRoK1wiJykgdGhyZXcgYW4gZXhjZXB0aW9uOiBcIitlLm1lc3NhZ2UpfXBhcmVudC5ub2RlX29wcy5ybWRpcihwYXJlbnQsbmFtZSk7RlMuZGVzdHJveU5vZGUobm9kZSk7dHJ5e2lmKEZTLnRyYWNraW5nRGVsZWdhdGVbXCJvbkRlbGV0ZVBhdGhcIl0pRlMudHJhY2tpbmdEZWxlZ2F0ZVtcIm9uRGVsZXRlUGF0aFwiXShwYXRoKX1jYXRjaChlKXtjb25zb2xlLmxvZyhcIkZTLnRyYWNraW5nRGVsZWdhdGVbJ29uRGVsZXRlUGF0aCddKCdcIitwYXRoK1wiJykgdGhyZXcgYW4gZXhjZXB0aW9uOiBcIitlLm1lc3NhZ2UpfX0pLHJlYWRkaXI6KGZ1bmN0aW9uKHBhdGgpe3ZhciBsb29rdXA9RlMubG9va3VwUGF0aChwYXRoLHtmb2xsb3c6dHJ1ZX0pO3ZhciBub2RlPWxvb2t1cC5ub2RlO2lmKCFub2RlLm5vZGVfb3BzLnJlYWRkaXIpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVOT1RESVIpfXJldHVybiBub2RlLm5vZGVfb3BzLnJlYWRkaXIobm9kZSl9KSx1bmxpbms6KGZ1bmN0aW9uKHBhdGgpe3ZhciBsb29rdXA9RlMubG9va3VwUGF0aChwYXRoLHtwYXJlbnQ6dHJ1ZX0pO3ZhciBwYXJlbnQ9bG9va3VwLm5vZGU7dmFyIG5hbWU9UEFUSC5iYXNlbmFtZShwYXRoKTt2YXIgbm9kZT1GUy5sb29rdXBOb2RlKHBhcmVudCxuYW1lKTt2YXIgZXJyPUZTLm1heURlbGV0ZShwYXJlbnQsbmFtZSxmYWxzZSk7aWYoZXJyKXtpZihlcnI9PT1FUlJOT19DT0RFUy5FSVNESVIpZXJyPUVSUk5PX0NPREVTLkVQRVJNO3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKGVycil9aWYoIXBhcmVudC5ub2RlX29wcy51bmxpbmspe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVQRVJNKX1pZihGUy5pc01vdW50cG9pbnQobm9kZSkpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVCVVNZKX10cnl7aWYoRlMudHJhY2tpbmdEZWxlZ2F0ZVtcIndpbGxEZWxldGVQYXRoXCJdKXtGUy50cmFja2luZ0RlbGVnYXRlW1wid2lsbERlbGV0ZVBhdGhcIl0ocGF0aCl9fWNhdGNoKGUpe2NvbnNvbGUubG9nKFwiRlMudHJhY2tpbmdEZWxlZ2F0ZVsnd2lsbERlbGV0ZVBhdGgnXSgnXCIrcGF0aCtcIicpIHRocmV3IGFuIGV4Y2VwdGlvbjogXCIrZS5tZXNzYWdlKX1wYXJlbnQubm9kZV9vcHMudW5saW5rKHBhcmVudCxuYW1lKTtGUy5kZXN0cm95Tm9kZShub2RlKTt0cnl7aWYoRlMudHJhY2tpbmdEZWxlZ2F0ZVtcIm9uRGVsZXRlUGF0aFwiXSlGUy50cmFja2luZ0RlbGVnYXRlW1wib25EZWxldGVQYXRoXCJdKHBhdGgpfWNhdGNoKGUpe2NvbnNvbGUubG9nKFwiRlMudHJhY2tpbmdEZWxlZ2F0ZVsnb25EZWxldGVQYXRoJ10oJ1wiK3BhdGgrXCInKSB0aHJldyBhbiBleGNlcHRpb246IFwiK2UubWVzc2FnZSl9fSkscmVhZGxpbms6KGZ1bmN0aW9uKHBhdGgpe3ZhciBsb29rdXA9RlMubG9va3VwUGF0aChwYXRoKTt2YXIgbGluaz1sb29rdXAubm9kZTtpZighbGluayl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRU5PRU5UKX1pZighbGluay5ub2RlX29wcy5yZWFkbGluayl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUlOVkFMKX1yZXR1cm4gUEFUSC5yZXNvbHZlKEZTLmdldFBhdGgobGluay5wYXJlbnQpLGxpbmsubm9kZV9vcHMucmVhZGxpbmsobGluaykpfSksc3RhdDooZnVuY3Rpb24ocGF0aCxkb250Rm9sbG93KXt2YXIgbG9va3VwPUZTLmxvb2t1cFBhdGgocGF0aCx7Zm9sbG93OiFkb250Rm9sbG93fSk7dmFyIG5vZGU9bG9va3VwLm5vZGU7aWYoIW5vZGUpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVOT0VOVCl9aWYoIW5vZGUubm9kZV9vcHMuZ2V0YXR0cil7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRVBFUk0pfXJldHVybiBub2RlLm5vZGVfb3BzLmdldGF0dHIobm9kZSl9KSxsc3RhdDooZnVuY3Rpb24ocGF0aCl7cmV0dXJuIEZTLnN0YXQocGF0aCx0cnVlKX0pLGNobW9kOihmdW5jdGlvbihwYXRoLG1vZGUsZG9udEZvbGxvdyl7dmFyIG5vZGU7aWYodHlwZW9mIHBhdGg9PT1cInN0cmluZ1wiKXt2YXIgbG9va3VwPUZTLmxvb2t1cFBhdGgocGF0aCx7Zm9sbG93OiFkb250Rm9sbG93fSk7bm9kZT1sb29rdXAubm9kZX1lbHNle25vZGU9cGF0aH1pZighbm9kZS5ub2RlX29wcy5zZXRhdHRyKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FUEVSTSl9bm9kZS5ub2RlX29wcy5zZXRhdHRyKG5vZGUse21vZGU6bW9kZSY0MDk1fG5vZGUubW9kZSZ+NDA5NSx0aW1lc3RhbXA6RGF0ZS5ub3coKX0pfSksbGNobW9kOihmdW5jdGlvbihwYXRoLG1vZGUpe0ZTLmNobW9kKHBhdGgsbW9kZSx0cnVlKX0pLGZjaG1vZDooZnVuY3Rpb24oZmQsbW9kZSl7dmFyIHN0cmVhbT1GUy5nZXRTdHJlYW0oZmQpO2lmKCFzdHJlYW0pe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVCQURGKX1GUy5jaG1vZChzdHJlYW0ubm9kZSxtb2RlKX0pLGNob3duOihmdW5jdGlvbihwYXRoLHVpZCxnaWQsZG9udEZvbGxvdyl7dmFyIG5vZGU7aWYodHlwZW9mIHBhdGg9PT1cInN0cmluZ1wiKXt2YXIgbG9va3VwPUZTLmxvb2t1cFBhdGgocGF0aCx7Zm9sbG93OiFkb250Rm9sbG93fSk7bm9kZT1sb29rdXAubm9kZX1lbHNle25vZGU9cGF0aH1pZighbm9kZS5ub2RlX29wcy5zZXRhdHRyKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FUEVSTSl9bm9kZS5ub2RlX29wcy5zZXRhdHRyKG5vZGUse3RpbWVzdGFtcDpEYXRlLm5vdygpfSl9KSxsY2hvd246KGZ1bmN0aW9uKHBhdGgsdWlkLGdpZCl7RlMuY2hvd24ocGF0aCx1aWQsZ2lkLHRydWUpfSksZmNob3duOihmdW5jdGlvbihmZCx1aWQsZ2lkKXt2YXIgc3RyZWFtPUZTLmdldFN0cmVhbShmZCk7aWYoIXN0cmVhbSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUJBREYpfUZTLmNob3duKHN0cmVhbS5ub2RlLHVpZCxnaWQpfSksdHJ1bmNhdGU6KGZ1bmN0aW9uKHBhdGgsbGVuKXtpZihsZW48MCl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUlOVkFMKX12YXIgbm9kZTtpZih0eXBlb2YgcGF0aD09PVwic3RyaW5nXCIpe3ZhciBsb29rdXA9RlMubG9va3VwUGF0aChwYXRoLHtmb2xsb3c6dHJ1ZX0pO25vZGU9bG9va3VwLm5vZGV9ZWxzZXtub2RlPXBhdGh9aWYoIW5vZGUubm9kZV9vcHMuc2V0YXR0cil7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRVBFUk0pfWlmKEZTLmlzRGlyKG5vZGUubW9kZSkpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVJU0RJUil9aWYoIUZTLmlzRmlsZShub2RlLm1vZGUpKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FSU5WQUwpfXZhciBlcnI9RlMubm9kZVBlcm1pc3Npb25zKG5vZGUsXCJ3XCIpO2lmKGVycil7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoZXJyKX1ub2RlLm5vZGVfb3BzLnNldGF0dHIobm9kZSx7c2l6ZTpsZW4sdGltZXN0YW1wOkRhdGUubm93KCl9KX0pLGZ0cnVuY2F0ZTooZnVuY3Rpb24oZmQsbGVuKXt2YXIgc3RyZWFtPUZTLmdldFN0cmVhbShmZCk7aWYoIXN0cmVhbSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUJBREYpfWlmKChzdHJlYW0uZmxhZ3MmMjA5NzE1NSk9PT0wKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FSU5WQUwpfUZTLnRydW5jYXRlKHN0cmVhbS5ub2RlLGxlbil9KSx1dGltZTooZnVuY3Rpb24ocGF0aCxhdGltZSxtdGltZSl7dmFyIGxvb2t1cD1GUy5sb29rdXBQYXRoKHBhdGgse2ZvbGxvdzp0cnVlfSk7dmFyIG5vZGU9bG9va3VwLm5vZGU7bm9kZS5ub2RlX29wcy5zZXRhdHRyKG5vZGUse3RpbWVzdGFtcDpNYXRoLm1heChhdGltZSxtdGltZSl9KX0pLG9wZW46KGZ1bmN0aW9uKHBhdGgsZmxhZ3MsbW9kZSxmZF9zdGFydCxmZF9lbmQpe2lmKHBhdGg9PT1cIlwiKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FTk9FTlQpfWZsYWdzPXR5cGVvZiBmbGFncz09PVwic3RyaW5nXCI/RlMubW9kZVN0cmluZ1RvRmxhZ3MoZmxhZ3MpOmZsYWdzO21vZGU9dHlwZW9mIG1vZGU9PT1cInVuZGVmaW5lZFwiPzQzODptb2RlO2lmKGZsYWdzJjY0KXttb2RlPW1vZGUmNDA5NXwzMjc2OH1lbHNle21vZGU9MH12YXIgbm9kZTtpZih0eXBlb2YgcGF0aD09PVwib2JqZWN0XCIpe25vZGU9cGF0aH1lbHNle3BhdGg9UEFUSC5ub3JtYWxpemUocGF0aCk7dHJ5e3ZhciBsb29rdXA9RlMubG9va3VwUGF0aChwYXRoLHtmb2xsb3c6IShmbGFncyYxMzEwNzIpfSk7bm9kZT1sb29rdXAubm9kZX1jYXRjaChlKXt9fXZhciBjcmVhdGVkPWZhbHNlO2lmKGZsYWdzJjY0KXtpZihub2RlKXtpZihmbGFncyYxMjgpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVFWElTVCl9fWVsc2V7bm9kZT1GUy5ta25vZChwYXRoLG1vZGUsMCk7Y3JlYXRlZD10cnVlfX1pZighbm9kZSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRU5PRU5UKX1pZihGUy5pc0NocmRldihub2RlLm1vZGUpKXtmbGFncyY9fjUxMn1pZihmbGFncyY2NTUzNiYmIUZTLmlzRGlyKG5vZGUubW9kZSkpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVOT1RESVIpfWlmKCFjcmVhdGVkKXt2YXIgZXJyPUZTLm1heU9wZW4obm9kZSxmbGFncyk7aWYoZXJyKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihlcnIpfX1pZihmbGFncyY1MTIpe0ZTLnRydW5jYXRlKG5vZGUsMCl9ZmxhZ3MmPX4oMTI4fDUxMik7dmFyIHN0cmVhbT1GUy5jcmVhdGVTdHJlYW0oe25vZGU6bm9kZSxwYXRoOkZTLmdldFBhdGgobm9kZSksZmxhZ3M6ZmxhZ3Msc2Vla2FibGU6dHJ1ZSxwb3NpdGlvbjowLHN0cmVhbV9vcHM6bm9kZS5zdHJlYW1fb3BzLHVuZ290dGVuOltdLGVycm9yOmZhbHNlfSxmZF9zdGFydCxmZF9lbmQpO2lmKHN0cmVhbS5zdHJlYW1fb3BzLm9wZW4pe3N0cmVhbS5zdHJlYW1fb3BzLm9wZW4oc3RyZWFtKX1pZihNb2R1bGVbXCJsb2dSZWFkRmlsZXNcIl0mJiEoZmxhZ3MmMSkpe2lmKCFGUy5yZWFkRmlsZXMpRlMucmVhZEZpbGVzPXt9O2lmKCEocGF0aCBpbiBGUy5yZWFkRmlsZXMpKXtGUy5yZWFkRmlsZXNbcGF0aF09MTtNb2R1bGVbXCJwcmludEVyclwiXShcInJlYWQgZmlsZTogXCIrcGF0aCl9fXRyeXtpZihGUy50cmFja2luZ0RlbGVnYXRlW1wib25PcGVuRmlsZVwiXSl7dmFyIHRyYWNraW5nRmxhZ3M9MDtpZigoZmxhZ3MmMjA5NzE1NSkhPT0xKXt0cmFja2luZ0ZsYWdzfD1GUy50cmFja2luZy5vcGVuRmxhZ3MuUkVBRH1pZigoZmxhZ3MmMjA5NzE1NSkhPT0wKXt0cmFja2luZ0ZsYWdzfD1GUy50cmFja2luZy5vcGVuRmxhZ3MuV1JJVEV9RlMudHJhY2tpbmdEZWxlZ2F0ZVtcIm9uT3BlbkZpbGVcIl0ocGF0aCx0cmFja2luZ0ZsYWdzKX19Y2F0Y2goZSl7Y29uc29sZS5sb2coXCJGUy50cmFja2luZ0RlbGVnYXRlWydvbk9wZW5GaWxlJ10oJ1wiK3BhdGgrXCInLCBmbGFncykgdGhyZXcgYW4gZXhjZXB0aW9uOiBcIitlLm1lc3NhZ2UpfXJldHVybiBzdHJlYW19KSxjbG9zZTooZnVuY3Rpb24oc3RyZWFtKXtpZihzdHJlYW0uZ2V0ZGVudHMpc3RyZWFtLmdldGRlbnRzPW51bGw7dHJ5e2lmKHN0cmVhbS5zdHJlYW1fb3BzLmNsb3NlKXtzdHJlYW0uc3RyZWFtX29wcy5jbG9zZShzdHJlYW0pfX1jYXRjaChlKXt0aHJvdyBlfWZpbmFsbHl7RlMuY2xvc2VTdHJlYW0oc3RyZWFtLmZkKX19KSxsbHNlZWs6KGZ1bmN0aW9uKHN0cmVhbSxvZmZzZXQsd2hlbmNlKXtpZighc3RyZWFtLnNlZWthYmxlfHwhc3RyZWFtLnN0cmVhbV9vcHMubGxzZWVrKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FU1BJUEUpfXN0cmVhbS5wb3NpdGlvbj1zdHJlYW0uc3RyZWFtX29wcy5sbHNlZWsoc3RyZWFtLG9mZnNldCx3aGVuY2UpO3N0cmVhbS51bmdvdHRlbj1bXTtyZXR1cm4gc3RyZWFtLnBvc2l0aW9ufSkscmVhZDooZnVuY3Rpb24oc3RyZWFtLGJ1ZmZlcixvZmZzZXQsbGVuZ3RoLHBvc2l0aW9uKXtpZihsZW5ndGg8MHx8cG9zaXRpb248MCl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUlOVkFMKX1pZigoc3RyZWFtLmZsYWdzJjIwOTcxNTUpPT09MSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUJBREYpfWlmKEZTLmlzRGlyKHN0cmVhbS5ub2RlLm1vZGUpKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FSVNESVIpfWlmKCFzdHJlYW0uc3RyZWFtX29wcy5yZWFkKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FSU5WQUwpfXZhciBzZWVraW5nPXRydWU7aWYodHlwZW9mIHBvc2l0aW9uPT09XCJ1bmRlZmluZWRcIil7cG9zaXRpb249c3RyZWFtLnBvc2l0aW9uO3NlZWtpbmc9ZmFsc2V9ZWxzZSBpZighc3RyZWFtLnNlZWthYmxlKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FU1BJUEUpfXZhciBieXRlc1JlYWQ9c3RyZWFtLnN0cmVhbV9vcHMucmVhZChzdHJlYW0sYnVmZmVyLG9mZnNldCxsZW5ndGgscG9zaXRpb24pO2lmKCFzZWVraW5nKXN0cmVhbS5wb3NpdGlvbis9Ynl0ZXNSZWFkO3JldHVybiBieXRlc1JlYWR9KSx3cml0ZTooZnVuY3Rpb24oc3RyZWFtLGJ1ZmZlcixvZmZzZXQsbGVuZ3RoLHBvc2l0aW9uLGNhbk93bil7aWYobGVuZ3RoPDB8fHBvc2l0aW9uPDApe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVJTlZBTCl9aWYoKHN0cmVhbS5mbGFncyYyMDk3MTU1KT09PTApe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVCQURGKX1pZihGUy5pc0RpcihzdHJlYW0ubm9kZS5tb2RlKSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUlTRElSKX1pZighc3RyZWFtLnN0cmVhbV9vcHMud3JpdGUpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVJTlZBTCl9aWYoc3RyZWFtLmZsYWdzJjEwMjQpe0ZTLmxsc2VlayhzdHJlYW0sMCwyKX12YXIgc2Vla2luZz10cnVlO2lmKHR5cGVvZiBwb3NpdGlvbj09PVwidW5kZWZpbmVkXCIpe3Bvc2l0aW9uPXN0cmVhbS5wb3NpdGlvbjtzZWVraW5nPWZhbHNlfWVsc2UgaWYoIXN0cmVhbS5zZWVrYWJsZSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRVNQSVBFKX12YXIgYnl0ZXNXcml0dGVuPXN0cmVhbS5zdHJlYW1fb3BzLndyaXRlKHN0cmVhbSxidWZmZXIsb2Zmc2V0LGxlbmd0aCxwb3NpdGlvbixjYW5Pd24pO2lmKCFzZWVraW5nKXN0cmVhbS5wb3NpdGlvbis9Ynl0ZXNXcml0dGVuO3RyeXtpZihzdHJlYW0ucGF0aCYmRlMudHJhY2tpbmdEZWxlZ2F0ZVtcIm9uV3JpdGVUb0ZpbGVcIl0pRlMudHJhY2tpbmdEZWxlZ2F0ZVtcIm9uV3JpdGVUb0ZpbGVcIl0oc3RyZWFtLnBhdGgpfWNhdGNoKGUpe2NvbnNvbGUubG9nKFwiRlMudHJhY2tpbmdEZWxlZ2F0ZVsnb25Xcml0ZVRvRmlsZSddKCdcIitwYXRoK1wiJykgdGhyZXcgYW4gZXhjZXB0aW9uOiBcIitlLm1lc3NhZ2UpfXJldHVybiBieXRlc1dyaXR0ZW59KSxhbGxvY2F0ZTooZnVuY3Rpb24oc3RyZWFtLG9mZnNldCxsZW5ndGgpe2lmKG9mZnNldDwwfHxsZW5ndGg8PTApe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVJTlZBTCl9aWYoKHN0cmVhbS5mbGFncyYyMDk3MTU1KT09PTApe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVCQURGKX1pZighRlMuaXNGaWxlKHN0cmVhbS5ub2RlLm1vZGUpJiYhRlMuaXNEaXIobm9kZS5tb2RlKSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRU5PREVWKX1pZighc3RyZWFtLnN0cmVhbV9vcHMuYWxsb2NhdGUpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVPUE5PVFNVUFApfXN0cmVhbS5zdHJlYW1fb3BzLmFsbG9jYXRlKHN0cmVhbSxvZmZzZXQsbGVuZ3RoKX0pLG1tYXA6KGZ1bmN0aW9uKHN0cmVhbSxidWZmZXIsb2Zmc2V0LGxlbmd0aCxwb3NpdGlvbixwcm90LGZsYWdzKXtpZigoc3RyZWFtLmZsYWdzJjIwOTcxNTUpPT09MSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUFDQ0VTKX1pZighc3RyZWFtLnN0cmVhbV9vcHMubW1hcCl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRU5PREVWKX1yZXR1cm4gc3RyZWFtLnN0cmVhbV9vcHMubW1hcChzdHJlYW0sYnVmZmVyLG9mZnNldCxsZW5ndGgscG9zaXRpb24scHJvdCxmbGFncyl9KSxtc3luYzooZnVuY3Rpb24oc3RyZWFtLGJ1ZmZlcixvZmZzZXQsbGVuZ3RoLG1tYXBGbGFncyl7aWYoIXN0cmVhbXx8IXN0cmVhbS5zdHJlYW1fb3BzLm1zeW5jKXtyZXR1cm4gMH1yZXR1cm4gc3RyZWFtLnN0cmVhbV9vcHMubXN5bmMoc3RyZWFtLGJ1ZmZlcixvZmZzZXQsbGVuZ3RoLG1tYXBGbGFncyl9KSxtdW5tYXA6KGZ1bmN0aW9uKHN0cmVhbSl7cmV0dXJuIDB9KSxpb2N0bDooZnVuY3Rpb24oc3RyZWFtLGNtZCxhcmcpe2lmKCFzdHJlYW0uc3RyZWFtX29wcy5pb2N0bCl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRU5PVFRZKX1yZXR1cm4gc3RyZWFtLnN0cmVhbV9vcHMuaW9jdGwoc3RyZWFtLGNtZCxhcmcpfSkscmVhZEZpbGU6KGZ1bmN0aW9uKHBhdGgsb3B0cyl7b3B0cz1vcHRzfHx7fTtvcHRzLmZsYWdzPW9wdHMuZmxhZ3N8fFwiclwiO29wdHMuZW5jb2Rpbmc9b3B0cy5lbmNvZGluZ3x8XCJiaW5hcnlcIjtpZihvcHRzLmVuY29kaW5nIT09XCJ1dGY4XCImJm9wdHMuZW5jb2RpbmchPT1cImJpbmFyeVwiKXt0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZW5jb2RpbmcgdHlwZSBcIicrb3B0cy5lbmNvZGluZysnXCInKX12YXIgcmV0O3ZhciBzdHJlYW09RlMub3BlbihwYXRoLG9wdHMuZmxhZ3MpO3ZhciBzdGF0PUZTLnN0YXQocGF0aCk7dmFyIGxlbmd0aD1zdGF0LnNpemU7dmFyIGJ1Zj1uZXcgVWludDhBcnJheShsZW5ndGgpO0ZTLnJlYWQoc3RyZWFtLGJ1ZiwwLGxlbmd0aCwwKTtpZihvcHRzLmVuY29kaW5nPT09XCJ1dGY4XCIpe3JldD1VVEY4QXJyYXlUb1N0cmluZyhidWYsMCl9ZWxzZSBpZihvcHRzLmVuY29kaW5nPT09XCJiaW5hcnlcIil7cmV0PWJ1Zn1GUy5jbG9zZShzdHJlYW0pO3JldHVybiByZXR9KSx3cml0ZUZpbGU6KGZ1bmN0aW9uKHBhdGgsZGF0YSxvcHRzKXtvcHRzPW9wdHN8fHt9O29wdHMuZmxhZ3M9b3B0cy5mbGFnc3x8XCJ3XCI7b3B0cy5lbmNvZGluZz1vcHRzLmVuY29kaW5nfHxcInV0ZjhcIjtpZihvcHRzLmVuY29kaW5nIT09XCJ1dGY4XCImJm9wdHMuZW5jb2RpbmchPT1cImJpbmFyeVwiKXt0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZW5jb2RpbmcgdHlwZSBcIicrb3B0cy5lbmNvZGluZysnXCInKX12YXIgc3RyZWFtPUZTLm9wZW4ocGF0aCxvcHRzLmZsYWdzLG9wdHMubW9kZSk7aWYob3B0cy5lbmNvZGluZz09PVwidXRmOFwiKXt2YXIgYnVmPW5ldyBVaW50OEFycmF5KGxlbmd0aEJ5dGVzVVRGOChkYXRhKSsxKTt2YXIgYWN0dWFsTnVtQnl0ZXM9c3RyaW5nVG9VVEY4QXJyYXkoZGF0YSxidWYsMCxidWYubGVuZ3RoKTtGUy53cml0ZShzdHJlYW0sYnVmLDAsYWN0dWFsTnVtQnl0ZXMsMCxvcHRzLmNhbk93bil9ZWxzZSBpZihvcHRzLmVuY29kaW5nPT09XCJiaW5hcnlcIil7RlMud3JpdGUoc3RyZWFtLGRhdGEsMCxkYXRhLmxlbmd0aCwwLG9wdHMuY2FuT3duKX1GUy5jbG9zZShzdHJlYW0pfSksY3dkOihmdW5jdGlvbigpe3JldHVybiBGUy5jdXJyZW50UGF0aH0pLGNoZGlyOihmdW5jdGlvbihwYXRoKXt2YXIgbG9va3VwPUZTLmxvb2t1cFBhdGgocGF0aCx7Zm9sbG93OnRydWV9KTtpZighRlMuaXNEaXIobG9va3VwLm5vZGUubW9kZSkpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVOT1RESVIpfXZhciBlcnI9RlMubm9kZVBlcm1pc3Npb25zKGxvb2t1cC5ub2RlLFwieFwiKTtpZihlcnIpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKGVycil9RlMuY3VycmVudFBhdGg9bG9va3VwLnBhdGh9KSxjcmVhdGVEZWZhdWx0RGlyZWN0b3JpZXM6KGZ1bmN0aW9uKCl7RlMubWtkaXIoXCIvdG1wXCIpO0ZTLm1rZGlyKFwiL2hvbWVcIik7RlMubWtkaXIoXCIvaG9tZS93ZWJfdXNlclwiKX0pLGNyZWF0ZURlZmF1bHREZXZpY2VzOihmdW5jdGlvbigpe0ZTLm1rZGlyKFwiL2RldlwiKTtGUy5yZWdpc3RlckRldmljZShGUy5tYWtlZGV2KDEsMykse3JlYWQ6KGZ1bmN0aW9uKCl7cmV0dXJuIDB9KSx3cml0ZTooZnVuY3Rpb24oc3RyZWFtLGJ1ZmZlcixvZmZzZXQsbGVuZ3RoLHBvcyl7cmV0dXJuIGxlbmd0aH0pfSk7RlMubWtkZXYoXCIvZGV2L251bGxcIixGUy5tYWtlZGV2KDEsMykpO1RUWS5yZWdpc3RlcihGUy5tYWtlZGV2KDUsMCksVFRZLmRlZmF1bHRfdHR5X29wcyk7VFRZLnJlZ2lzdGVyKEZTLm1ha2VkZXYoNiwwKSxUVFkuZGVmYXVsdF90dHkxX29wcyk7RlMubWtkZXYoXCIvZGV2L3R0eVwiLEZTLm1ha2VkZXYoNSwwKSk7RlMubWtkZXYoXCIvZGV2L3R0eTFcIixGUy5tYWtlZGV2KDYsMCkpO3ZhciByYW5kb21fZGV2aWNlO2lmKHR5cGVvZiBjcnlwdG8hPT1cInVuZGVmaW5lZFwiKXt2YXIgcmFuZG9tQnVmZmVyPW5ldyBVaW50OEFycmF5KDEpO3JhbmRvbV9kZXZpY2U9KGZ1bmN0aW9uKCl7Y3J5cHRvLmdldFJhbmRvbVZhbHVlcyhyYW5kb21CdWZmZXIpO3JldHVybiByYW5kb21CdWZmZXJbMF19KX1lbHNlIGlmKEVOVklST05NRU5UX0lTX05PREUpe3JhbmRvbV9kZXZpY2U9KGZ1bmN0aW9uKCl7cmV0dXJuIHJlcXVpcmUoXCJjcnlwdG9cIikucmFuZG9tQnl0ZXMoMSlbMF19KX1lbHNle3JhbmRvbV9kZXZpY2U9KGZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucmFuZG9tKCkqMjU2fDB9KX1GUy5jcmVhdGVEZXZpY2UoXCIvZGV2XCIsXCJyYW5kb21cIixyYW5kb21fZGV2aWNlKTtGUy5jcmVhdGVEZXZpY2UoXCIvZGV2XCIsXCJ1cmFuZG9tXCIscmFuZG9tX2RldmljZSk7RlMubWtkaXIoXCIvZGV2L3NobVwiKTtGUy5ta2RpcihcIi9kZXYvc2htL3RtcFwiKX0pLGNyZWF0ZVNwZWNpYWxEaXJlY3RvcmllczooZnVuY3Rpb24oKXtGUy5ta2RpcihcIi9wcm9jXCIpO0ZTLm1rZGlyKFwiL3Byb2Mvc2VsZlwiKTtGUy5ta2RpcihcIi9wcm9jL3NlbGYvZmRcIik7RlMubW91bnQoe21vdW50OihmdW5jdGlvbigpe3ZhciBub2RlPUZTLmNyZWF0ZU5vZGUoXCIvcHJvYy9zZWxmXCIsXCJmZFwiLDE2Mzg0fDUxMSw3Myk7bm9kZS5ub2RlX29wcz17bG9va3VwOihmdW5jdGlvbihwYXJlbnQsbmFtZSl7dmFyIGZkPStuYW1lO3ZhciBzdHJlYW09RlMuZ2V0U3RyZWFtKGZkKTtpZighc3RyZWFtKXRocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVCQURGKTt2YXIgcmV0PXtwYXJlbnQ6bnVsbCxtb3VudDp7bW91bnRwb2ludDpcImZha2VcIn0sbm9kZV9vcHM6e3JlYWRsaW5rOihmdW5jdGlvbigpe3JldHVybiBzdHJlYW0ucGF0aH0pfX07cmV0LnBhcmVudD1yZXQ7cmV0dXJuIHJldH0pfTtyZXR1cm4gbm9kZX0pfSx7fSxcIi9wcm9jL3NlbGYvZmRcIil9KSxjcmVhdGVTdGFuZGFyZFN0cmVhbXM6KGZ1bmN0aW9uKCl7aWYoTW9kdWxlW1wic3RkaW5cIl0pe0ZTLmNyZWF0ZURldmljZShcIi9kZXZcIixcInN0ZGluXCIsTW9kdWxlW1wic3RkaW5cIl0pfWVsc2V7RlMuc3ltbGluayhcIi9kZXYvdHR5XCIsXCIvZGV2L3N0ZGluXCIpfWlmKE1vZHVsZVtcInN0ZG91dFwiXSl7RlMuY3JlYXRlRGV2aWNlKFwiL2RldlwiLFwic3Rkb3V0XCIsbnVsbCxNb2R1bGVbXCJzdGRvdXRcIl0pfWVsc2V7RlMuc3ltbGluayhcIi9kZXYvdHR5XCIsXCIvZGV2L3N0ZG91dFwiKX1pZihNb2R1bGVbXCJzdGRlcnJcIl0pe0ZTLmNyZWF0ZURldmljZShcIi9kZXZcIixcInN0ZGVyclwiLG51bGwsTW9kdWxlW1wic3RkZXJyXCJdKX1lbHNle0ZTLnN5bWxpbmsoXCIvZGV2L3R0eTFcIixcIi9kZXYvc3RkZXJyXCIpfXZhciBzdGRpbj1GUy5vcGVuKFwiL2Rldi9zdGRpblwiLFwiclwiKTthc3NlcnQoc3RkaW4uZmQ9PT0wLFwiaW52YWxpZCBoYW5kbGUgZm9yIHN0ZGluIChcIitzdGRpbi5mZCtcIilcIik7dmFyIHN0ZG91dD1GUy5vcGVuKFwiL2Rldi9zdGRvdXRcIixcIndcIik7YXNzZXJ0KHN0ZG91dC5mZD09PTEsXCJpbnZhbGlkIGhhbmRsZSBmb3Igc3Rkb3V0IChcIitzdGRvdXQuZmQrXCIpXCIpO3ZhciBzdGRlcnI9RlMub3BlbihcIi9kZXYvc3RkZXJyXCIsXCJ3XCIpO2Fzc2VydChzdGRlcnIuZmQ9PT0yLFwiaW52YWxpZCBoYW5kbGUgZm9yIHN0ZGVyciAoXCIrc3RkZXJyLmZkK1wiKVwiKX0pLGVuc3VyZUVycm5vRXJyb3I6KGZ1bmN0aW9uKCl7aWYoRlMuRXJybm9FcnJvcilyZXR1cm47RlMuRXJybm9FcnJvcj1mdW5jdGlvbiBFcnJub0Vycm9yKGVycm5vLG5vZGUpe3RoaXMubm9kZT1ub2RlO3RoaXMuc2V0RXJybm89KGZ1bmN0aW9uKGVycm5vKXt0aGlzLmVycm5vPWVycm5vO2Zvcih2YXIga2V5IGluIEVSUk5PX0NPREVTKXtpZihFUlJOT19DT0RFU1trZXldPT09ZXJybm8pe3RoaXMuY29kZT1rZXk7YnJlYWt9fX0pO3RoaXMuc2V0RXJybm8oZXJybm8pO3RoaXMubWVzc2FnZT1FUlJOT19NRVNTQUdFU1tlcnJub119O0ZTLkVycm5vRXJyb3IucHJvdG90eXBlPW5ldyBFcnJvcjtGUy5FcnJub0Vycm9yLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1GUy5FcnJub0Vycm9yO1tFUlJOT19DT0RFUy5FTk9FTlRdLmZvckVhY2goKGZ1bmN0aW9uKGNvZGUpe0ZTLmdlbmVyaWNFcnJvcnNbY29kZV09bmV3IEZTLkVycm5vRXJyb3IoY29kZSk7RlMuZ2VuZXJpY0Vycm9yc1tjb2RlXS5zdGFjaz1cIjxnZW5lcmljIGVycm9yLCBubyBzdGFjaz5cIn0pKX0pLHN0YXRpY0luaXQ6KGZ1bmN0aW9uKCl7RlMuZW5zdXJlRXJybm9FcnJvcigpO0ZTLm5hbWVUYWJsZT1uZXcgQXJyYXkoNDA5Nik7RlMubW91bnQoTUVNRlMse30sXCIvXCIpO0ZTLmNyZWF0ZURlZmF1bHREaXJlY3RvcmllcygpO0ZTLmNyZWF0ZURlZmF1bHREZXZpY2VzKCk7RlMuY3JlYXRlU3BlY2lhbERpcmVjdG9yaWVzKCk7RlMuZmlsZXN5c3RlbXM9e1wiTUVNRlNcIjpNRU1GUyxcIklEQkZTXCI6SURCRlMsXCJOT0RFRlNcIjpOT0RFRlMsXCJXT1JLRVJGU1wiOldPUktFUkZTfX0pLGluaXQ6KGZ1bmN0aW9uKGlucHV0LG91dHB1dCxlcnJvcil7YXNzZXJ0KCFGUy5pbml0LmluaXRpYWxpemVkLFwiRlMuaW5pdCB3YXMgcHJldmlvdXNseSBjYWxsZWQuIElmIHlvdSB3YW50IHRvIGluaXRpYWxpemUgbGF0ZXIgd2l0aCBjdXN0b20gcGFyYW1ldGVycywgcmVtb3ZlIGFueSBlYXJsaWVyIGNhbGxzIChub3RlIHRoYXQgb25lIGlzIGF1dG9tYXRpY2FsbHkgYWRkZWQgdG8gdGhlIGdlbmVyYXRlZCBjb2RlKVwiKTtGUy5pbml0LmluaXRpYWxpemVkPXRydWU7RlMuZW5zdXJlRXJybm9FcnJvcigpO01vZHVsZVtcInN0ZGluXCJdPWlucHV0fHxNb2R1bGVbXCJzdGRpblwiXTtNb2R1bGVbXCJzdGRvdXRcIl09b3V0cHV0fHxNb2R1bGVbXCJzdGRvdXRcIl07TW9kdWxlW1wic3RkZXJyXCJdPWVycm9yfHxNb2R1bGVbXCJzdGRlcnJcIl07RlMuY3JlYXRlU3RhbmRhcmRTdHJlYW1zKCl9KSxxdWl0OihmdW5jdGlvbigpe0ZTLmluaXQuaW5pdGlhbGl6ZWQ9ZmFsc2U7dmFyIGZmbHVzaD1Nb2R1bGVbXCJfZmZsdXNoXCJdO2lmKGZmbHVzaClmZmx1c2goMCk7Zm9yKHZhciBpPTA7aTxGUy5zdHJlYW1zLmxlbmd0aDtpKyspe3ZhciBzdHJlYW09RlMuc3RyZWFtc1tpXTtpZighc3RyZWFtKXtjb250aW51ZX1GUy5jbG9zZShzdHJlYW0pfX0pLGdldE1vZGU6KGZ1bmN0aW9uKGNhblJlYWQsY2FuV3JpdGUpe3ZhciBtb2RlPTA7aWYoY2FuUmVhZCltb2RlfD0yOTJ8NzM7aWYoY2FuV3JpdGUpbW9kZXw9MTQ2O3JldHVybiBtb2RlfSksam9pblBhdGg6KGZ1bmN0aW9uKHBhcnRzLGZvcmNlUmVsYXRpdmUpe3ZhciBwYXRoPVBBVEguam9pbi5hcHBseShudWxsLHBhcnRzKTtpZihmb3JjZVJlbGF0aXZlJiZwYXRoWzBdPT1cIi9cIilwYXRoPXBhdGguc3Vic3RyKDEpO3JldHVybiBwYXRofSksYWJzb2x1dGVQYXRoOihmdW5jdGlvbihyZWxhdGl2ZSxiYXNlKXtyZXR1cm4gUEFUSC5yZXNvbHZlKGJhc2UscmVsYXRpdmUpfSksc3RhbmRhcmRpemVQYXRoOihmdW5jdGlvbihwYXRoKXtyZXR1cm4gUEFUSC5ub3JtYWxpemUocGF0aCl9KSxmaW5kT2JqZWN0OihmdW5jdGlvbihwYXRoLGRvbnRSZXNvbHZlTGFzdExpbmspe3ZhciByZXQ9RlMuYW5hbHl6ZVBhdGgocGF0aCxkb250UmVzb2x2ZUxhc3RMaW5rKTtpZihyZXQuZXhpc3RzKXtyZXR1cm4gcmV0Lm9iamVjdH1lbHNle19fX3NldEVyck5vKHJldC5lcnJvcik7cmV0dXJuIG51bGx9fSksYW5hbHl6ZVBhdGg6KGZ1bmN0aW9uKHBhdGgsZG9udFJlc29sdmVMYXN0TGluayl7dHJ5e3ZhciBsb29rdXA9RlMubG9va3VwUGF0aChwYXRoLHtmb2xsb3c6IWRvbnRSZXNvbHZlTGFzdExpbmt9KTtwYXRoPWxvb2t1cC5wYXRofWNhdGNoKGUpe312YXIgcmV0PXtpc1Jvb3Q6ZmFsc2UsZXhpc3RzOmZhbHNlLGVycm9yOjAsbmFtZTpudWxsLHBhdGg6bnVsbCxvYmplY3Q6bnVsbCxwYXJlbnRFeGlzdHM6ZmFsc2UscGFyZW50UGF0aDpudWxsLHBhcmVudE9iamVjdDpudWxsfTt0cnl7dmFyIGxvb2t1cD1GUy5sb29rdXBQYXRoKHBhdGgse3BhcmVudDp0cnVlfSk7cmV0LnBhcmVudEV4aXN0cz10cnVlO3JldC5wYXJlbnRQYXRoPWxvb2t1cC5wYXRoO3JldC5wYXJlbnRPYmplY3Q9bG9va3VwLm5vZGU7cmV0Lm5hbWU9UEFUSC5iYXNlbmFtZShwYXRoKTtsb29rdXA9RlMubG9va3VwUGF0aChwYXRoLHtmb2xsb3c6IWRvbnRSZXNvbHZlTGFzdExpbmt9KTtyZXQuZXhpc3RzPXRydWU7cmV0LnBhdGg9bG9va3VwLnBhdGg7cmV0Lm9iamVjdD1sb29rdXAubm9kZTtyZXQubmFtZT1sb29rdXAubm9kZS5uYW1lO3JldC5pc1Jvb3Q9bG9va3VwLnBhdGg9PT1cIi9cIn1jYXRjaChlKXtyZXQuZXJyb3I9ZS5lcnJub31yZXR1cm4gcmV0fSksY3JlYXRlRm9sZGVyOihmdW5jdGlvbihwYXJlbnQsbmFtZSxjYW5SZWFkLGNhbldyaXRlKXt2YXIgcGF0aD1QQVRILmpvaW4yKHR5cGVvZiBwYXJlbnQ9PT1cInN0cmluZ1wiP3BhcmVudDpGUy5nZXRQYXRoKHBhcmVudCksbmFtZSk7dmFyIG1vZGU9RlMuZ2V0TW9kZShjYW5SZWFkLGNhbldyaXRlKTtyZXR1cm4gRlMubWtkaXIocGF0aCxtb2RlKX0pLGNyZWF0ZVBhdGg6KGZ1bmN0aW9uKHBhcmVudCxwYXRoLGNhblJlYWQsY2FuV3JpdGUpe3BhcmVudD10eXBlb2YgcGFyZW50PT09XCJzdHJpbmdcIj9wYXJlbnQ6RlMuZ2V0UGF0aChwYXJlbnQpO3ZhciBwYXJ0cz1wYXRoLnNwbGl0KFwiL1wiKS5yZXZlcnNlKCk7d2hpbGUocGFydHMubGVuZ3RoKXt2YXIgcGFydD1wYXJ0cy5wb3AoKTtpZighcGFydCljb250aW51ZTt2YXIgY3VycmVudD1QQVRILmpvaW4yKHBhcmVudCxwYXJ0KTt0cnl7RlMubWtkaXIoY3VycmVudCl9Y2F0Y2goZSl7fXBhcmVudD1jdXJyZW50fXJldHVybiBjdXJyZW50fSksY3JlYXRlRmlsZTooZnVuY3Rpb24ocGFyZW50LG5hbWUscHJvcGVydGllcyxjYW5SZWFkLGNhbldyaXRlKXt2YXIgcGF0aD1QQVRILmpvaW4yKHR5cGVvZiBwYXJlbnQ9PT1cInN0cmluZ1wiP3BhcmVudDpGUy5nZXRQYXRoKHBhcmVudCksbmFtZSk7dmFyIG1vZGU9RlMuZ2V0TW9kZShjYW5SZWFkLGNhbldyaXRlKTtyZXR1cm4gRlMuY3JlYXRlKHBhdGgsbW9kZSl9KSxjcmVhdGVEYXRhRmlsZTooZnVuY3Rpb24ocGFyZW50LG5hbWUsZGF0YSxjYW5SZWFkLGNhbldyaXRlLGNhbk93bil7dmFyIHBhdGg9bmFtZT9QQVRILmpvaW4yKHR5cGVvZiBwYXJlbnQ9PT1cInN0cmluZ1wiP3BhcmVudDpGUy5nZXRQYXRoKHBhcmVudCksbmFtZSk6cGFyZW50O3ZhciBtb2RlPUZTLmdldE1vZGUoY2FuUmVhZCxjYW5Xcml0ZSk7dmFyIG5vZGU9RlMuY3JlYXRlKHBhdGgsbW9kZSk7aWYoZGF0YSl7aWYodHlwZW9mIGRhdGE9PT1cInN0cmluZ1wiKXt2YXIgYXJyPW5ldyBBcnJheShkYXRhLmxlbmd0aCk7Zm9yKHZhciBpPTAsbGVuPWRhdGEubGVuZ3RoO2k8bGVuOysraSlhcnJbaV09ZGF0YS5jaGFyQ29kZUF0KGkpO2RhdGE9YXJyfUZTLmNobW9kKG5vZGUsbW9kZXwxNDYpO3ZhciBzdHJlYW09RlMub3Blbihub2RlLFwid1wiKTtGUy53cml0ZShzdHJlYW0sZGF0YSwwLGRhdGEubGVuZ3RoLDAsY2FuT3duKTtGUy5jbG9zZShzdHJlYW0pO0ZTLmNobW9kKG5vZGUsbW9kZSl9cmV0dXJuIG5vZGV9KSxjcmVhdGVEZXZpY2U6KGZ1bmN0aW9uKHBhcmVudCxuYW1lLGlucHV0LG91dHB1dCl7dmFyIHBhdGg9UEFUSC5qb2luMih0eXBlb2YgcGFyZW50PT09XCJzdHJpbmdcIj9wYXJlbnQ6RlMuZ2V0UGF0aChwYXJlbnQpLG5hbWUpO3ZhciBtb2RlPUZTLmdldE1vZGUoISFpbnB1dCwhIW91dHB1dCk7aWYoIUZTLmNyZWF0ZURldmljZS5tYWpvcilGUy5jcmVhdGVEZXZpY2UubWFqb3I9NjQ7dmFyIGRldj1GUy5tYWtlZGV2KEZTLmNyZWF0ZURldmljZS5tYWpvcisrLDApO0ZTLnJlZ2lzdGVyRGV2aWNlKGRldix7b3BlbjooZnVuY3Rpb24oc3RyZWFtKXtzdHJlYW0uc2Vla2FibGU9ZmFsc2V9KSxjbG9zZTooZnVuY3Rpb24oc3RyZWFtKXtpZihvdXRwdXQmJm91dHB1dC5idWZmZXImJm91dHB1dC5idWZmZXIubGVuZ3RoKXtvdXRwdXQoMTApfX0pLHJlYWQ6KGZ1bmN0aW9uKHN0cmVhbSxidWZmZXIsb2Zmc2V0LGxlbmd0aCxwb3Mpe3ZhciBieXRlc1JlYWQ9MDtmb3IodmFyIGk9MDtpPGxlbmd0aDtpKyspe3ZhciByZXN1bHQ7dHJ5e3Jlc3VsdD1pbnB1dCgpfWNhdGNoKGUpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVJTyl9aWYocmVzdWx0PT09dW5kZWZpbmVkJiZieXRlc1JlYWQ9PT0wKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FQUdBSU4pfWlmKHJlc3VsdD09PW51bGx8fHJlc3VsdD09PXVuZGVmaW5lZClicmVhaztieXRlc1JlYWQrKztidWZmZXJbb2Zmc2V0K2ldPXJlc3VsdH1pZihieXRlc1JlYWQpe3N0cmVhbS5ub2RlLnRpbWVzdGFtcD1EYXRlLm5vdygpfXJldHVybiBieXRlc1JlYWR9KSx3cml0ZTooZnVuY3Rpb24oc3RyZWFtLGJ1ZmZlcixvZmZzZXQsbGVuZ3RoLHBvcyl7Zm9yKHZhciBpPTA7aTxsZW5ndGg7aSsrKXt0cnl7b3V0cHV0KGJ1ZmZlcltvZmZzZXQraV0pfWNhdGNoKGUpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVJTyl9fWlmKGxlbmd0aCl7c3RyZWFtLm5vZGUudGltZXN0YW1wPURhdGUubm93KCl9cmV0dXJuIGl9KX0pO3JldHVybiBGUy5ta2RldihwYXRoLG1vZGUsZGV2KX0pLGNyZWF0ZUxpbms6KGZ1bmN0aW9uKHBhcmVudCxuYW1lLHRhcmdldCxjYW5SZWFkLGNhbldyaXRlKXt2YXIgcGF0aD1QQVRILmpvaW4yKHR5cGVvZiBwYXJlbnQ9PT1cInN0cmluZ1wiP3BhcmVudDpGUy5nZXRQYXRoKHBhcmVudCksbmFtZSk7cmV0dXJuIEZTLnN5bWxpbmsodGFyZ2V0LHBhdGgpfSksZm9yY2VMb2FkRmlsZTooZnVuY3Rpb24ob2JqKXtpZihvYmouaXNEZXZpY2V8fG9iai5pc0ZvbGRlcnx8b2JqLmxpbmt8fG9iai5jb250ZW50cylyZXR1cm4gdHJ1ZTt2YXIgc3VjY2Vzcz10cnVlO2lmKHR5cGVvZiBYTUxIdHRwUmVxdWVzdCE9PVwidW5kZWZpbmVkXCIpe3Rocm93IG5ldyBFcnJvcihcIkxhenkgbG9hZGluZyBzaG91bGQgaGF2ZSBiZWVuIHBlcmZvcm1lZCAoY29udGVudHMgc2V0KSBpbiBjcmVhdGVMYXp5RmlsZSwgYnV0IGl0IHdhcyBub3QuIExhenkgbG9hZGluZyBvbmx5IHdvcmtzIGluIHdlYiB3b3JrZXJzLiBVc2UgLS1lbWJlZC1maWxlIG9yIC0tcHJlbG9hZC1maWxlIGluIGVtY2Mgb24gdGhlIG1haW4gdGhyZWFkLlwiKX1lbHNlIGlmKE1vZHVsZVtcInJlYWRcIl0pe3RyeXtvYmouY29udGVudHM9aW50QXJyYXlGcm9tU3RyaW5nKE1vZHVsZVtcInJlYWRcIl0ob2JqLnVybCksdHJ1ZSk7b2JqLnVzZWRCeXRlcz1vYmouY29udGVudHMubGVuZ3RofWNhdGNoKGUpe3N1Y2Nlc3M9ZmFsc2V9fWVsc2V7dGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGxvYWQgd2l0aG91dCByZWFkKCkgb3IgWE1MSHR0cFJlcXVlc3QuXCIpfWlmKCFzdWNjZXNzKV9fX3NldEVyck5vKEVSUk5PX0NPREVTLkVJTyk7cmV0dXJuIHN1Y2Nlc3N9KSxjcmVhdGVMYXp5RmlsZTooZnVuY3Rpb24ocGFyZW50LG5hbWUsdXJsLGNhblJlYWQsY2FuV3JpdGUpe2Z1bmN0aW9uIExhenlVaW50OEFycmF5KCl7dGhpcy5sZW5ndGhLbm93bj1mYWxzZTt0aGlzLmNodW5rcz1bXX1MYXp5VWludDhBcnJheS5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uIExhenlVaW50OEFycmF5X2dldChpZHgpe2lmKGlkeD50aGlzLmxlbmd0aC0xfHxpZHg8MCl7cmV0dXJuIHVuZGVmaW5lZH12YXIgY2h1bmtPZmZzZXQ9aWR4JXRoaXMuY2h1bmtTaXplO3ZhciBjaHVua051bT1pZHgvdGhpcy5jaHVua1NpemV8MDtyZXR1cm4gdGhpcy5nZXR0ZXIoY2h1bmtOdW0pW2NodW5rT2Zmc2V0XX07TGF6eVVpbnQ4QXJyYXkucHJvdG90eXBlLnNldERhdGFHZXR0ZXI9ZnVuY3Rpb24gTGF6eVVpbnQ4QXJyYXlfc2V0RGF0YUdldHRlcihnZXR0ZXIpe3RoaXMuZ2V0dGVyPWdldHRlcn07TGF6eVVpbnQ4QXJyYXkucHJvdG90eXBlLmNhY2hlTGVuZ3RoPWZ1bmN0aW9uIExhenlVaW50OEFycmF5X2NhY2hlTGVuZ3RoKCl7dmFyIHhocj1uZXcgWE1MSHR0cFJlcXVlc3Q7eGhyLm9wZW4oXCJIRUFEXCIsdXJsLGZhbHNlKTt4aHIuc2VuZChudWxsKTtpZighKHhoci5zdGF0dXM+PTIwMCYmeGhyLnN0YXR1czwzMDB8fHhoci5zdGF0dXM9PT0zMDQpKXRocm93IG5ldyBFcnJvcihcIkNvdWxkbid0IGxvYWQgXCIrdXJsK1wiLiBTdGF0dXM6IFwiK3hoci5zdGF0dXMpO3ZhciBkYXRhbGVuZ3RoPU51bWJlcih4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoXCJDb250ZW50LWxlbmd0aFwiKSk7dmFyIGhlYWRlcjt2YXIgaGFzQnl0ZVNlcnZpbmc9KGhlYWRlcj14aHIuZ2V0UmVzcG9uc2VIZWFkZXIoXCJBY2NlcHQtUmFuZ2VzXCIpKSYmaGVhZGVyPT09XCJieXRlc1wiO3ZhciBjaHVua1NpemU9MTAyNCoxMDI0O2lmKCFoYXNCeXRlU2VydmluZyljaHVua1NpemU9ZGF0YWxlbmd0aDt2YXIgZG9YSFI9KGZ1bmN0aW9uKGZyb20sdG8pe2lmKGZyb20+dG8pdGhyb3cgbmV3IEVycm9yKFwiaW52YWxpZCByYW5nZSAoXCIrZnJvbStcIiwgXCIrdG8rXCIpIG9yIG5vIGJ5dGVzIHJlcXVlc3RlZCFcIik7aWYodG8+ZGF0YWxlbmd0aC0xKXRocm93IG5ldyBFcnJvcihcIm9ubHkgXCIrZGF0YWxlbmd0aCtcIiBieXRlcyBhdmFpbGFibGUhIHByb2dyYW1tZXIgZXJyb3IhXCIpO3ZhciB4aHI9bmV3IFhNTEh0dHBSZXF1ZXN0O3hoci5vcGVuKFwiR0VUXCIsdXJsLGZhbHNlKTtpZihkYXRhbGVuZ3RoIT09Y2h1bmtTaXplKXhoci5zZXRSZXF1ZXN0SGVhZGVyKFwiUmFuZ2VcIixcImJ5dGVzPVwiK2Zyb20rXCItXCIrdG8pO2lmKHR5cGVvZiBVaW50OEFycmF5IT1cInVuZGVmaW5lZFwiKXhoci5yZXNwb25zZVR5cGU9XCJhcnJheWJ1ZmZlclwiO2lmKHhoci5vdmVycmlkZU1pbWVUeXBlKXt4aHIub3ZlcnJpZGVNaW1lVHlwZShcInRleHQvcGxhaW47IGNoYXJzZXQ9eC11c2VyLWRlZmluZWRcIil9eGhyLnNlbmQobnVsbCk7aWYoISh4aHIuc3RhdHVzPj0yMDAmJnhoci5zdGF0dXM8MzAwfHx4aHIuc3RhdHVzPT09MzA0KSl0aHJvdyBuZXcgRXJyb3IoXCJDb3VsZG4ndCBsb2FkIFwiK3VybCtcIi4gU3RhdHVzOiBcIit4aHIuc3RhdHVzKTtpZih4aHIucmVzcG9uc2UhPT11bmRlZmluZWQpe3JldHVybiBuZXcgVWludDhBcnJheSh4aHIucmVzcG9uc2V8fFtdKX1lbHNle3JldHVybiBpbnRBcnJheUZyb21TdHJpbmcoeGhyLnJlc3BvbnNlVGV4dHx8XCJcIix0cnVlKX19KTt2YXIgbGF6eUFycmF5PXRoaXM7bGF6eUFycmF5LnNldERhdGFHZXR0ZXIoKGZ1bmN0aW9uKGNodW5rTnVtKXt2YXIgc3RhcnQ9Y2h1bmtOdW0qY2h1bmtTaXplO3ZhciBlbmQ9KGNodW5rTnVtKzEpKmNodW5rU2l6ZS0xO2VuZD1NYXRoLm1pbihlbmQsZGF0YWxlbmd0aC0xKTtpZih0eXBlb2YgbGF6eUFycmF5LmNodW5rc1tjaHVua051bV09PT1cInVuZGVmaW5lZFwiKXtsYXp5QXJyYXkuY2h1bmtzW2NodW5rTnVtXT1kb1hIUihzdGFydCxlbmQpfWlmKHR5cGVvZiBsYXp5QXJyYXkuY2h1bmtzW2NodW5rTnVtXT09PVwidW5kZWZpbmVkXCIpdGhyb3cgbmV3IEVycm9yKFwiZG9YSFIgZmFpbGVkIVwiKTtyZXR1cm4gbGF6eUFycmF5LmNodW5rc1tjaHVua051bV19KSk7dGhpcy5fbGVuZ3RoPWRhdGFsZW5ndGg7dGhpcy5fY2h1bmtTaXplPWNodW5rU2l6ZTt0aGlzLmxlbmd0aEtub3duPXRydWV9O2lmKHR5cGVvZiBYTUxIdHRwUmVxdWVzdCE9PVwidW5kZWZpbmVkXCIpe2lmKCFFTlZJUk9OTUVOVF9JU19XT1JLRVIpdGhyb3dcIkNhbm5vdCBkbyBzeW5jaHJvbm91cyBiaW5hcnkgWEhScyBvdXRzaWRlIHdlYndvcmtlcnMgaW4gbW9kZXJuIGJyb3dzZXJzLiBVc2UgLS1lbWJlZC1maWxlIG9yIC0tcHJlbG9hZC1maWxlIGluIGVtY2NcIjt2YXIgbGF6eUFycmF5PW5ldyBMYXp5VWludDhBcnJheTtPYmplY3QuZGVmaW5lUHJvcGVydHkobGF6eUFycmF5LFwibGVuZ3RoXCIse2dldDooZnVuY3Rpb24oKXtpZighdGhpcy5sZW5ndGhLbm93bil7dGhpcy5jYWNoZUxlbmd0aCgpfXJldHVybiB0aGlzLl9sZW5ndGh9KX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShsYXp5QXJyYXksXCJjaHVua1NpemVcIix7Z2V0OihmdW5jdGlvbigpe2lmKCF0aGlzLmxlbmd0aEtub3duKXt0aGlzLmNhY2hlTGVuZ3RoKCl9cmV0dXJuIHRoaXMuX2NodW5rU2l6ZX0pfSk7dmFyIHByb3BlcnRpZXM9e2lzRGV2aWNlOmZhbHNlLGNvbnRlbnRzOmxhenlBcnJheX19ZWxzZXt2YXIgcHJvcGVydGllcz17aXNEZXZpY2U6ZmFsc2UsdXJsOnVybH19dmFyIG5vZGU9RlMuY3JlYXRlRmlsZShwYXJlbnQsbmFtZSxwcm9wZXJ0aWVzLGNhblJlYWQsY2FuV3JpdGUpO2lmKHByb3BlcnRpZXMuY29udGVudHMpe25vZGUuY29udGVudHM9cHJvcGVydGllcy5jb250ZW50c31lbHNlIGlmKHByb3BlcnRpZXMudXJsKXtub2RlLmNvbnRlbnRzPW51bGw7bm9kZS51cmw9cHJvcGVydGllcy51cmx9T2JqZWN0LmRlZmluZVByb3BlcnR5KG5vZGUsXCJ1c2VkQnl0ZXNcIix7Z2V0OihmdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbnRlbnRzLmxlbmd0aH0pfSk7dmFyIHN0cmVhbV9vcHM9e307dmFyIGtleXM9T2JqZWN0LmtleXMobm9kZS5zdHJlYW1fb3BzKTtrZXlzLmZvckVhY2goKGZ1bmN0aW9uKGtleSl7dmFyIGZuPW5vZGUuc3RyZWFtX29wc1trZXldO3N0cmVhbV9vcHNba2V5XT1mdW5jdGlvbiBmb3JjZUxvYWRMYXp5RmlsZSgpe2lmKCFGUy5mb3JjZUxvYWRGaWxlKG5vZGUpKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FSU8pfXJldHVybiBmbi5hcHBseShudWxsLGFyZ3VtZW50cyl9fSkpO3N0cmVhbV9vcHMucmVhZD1mdW5jdGlvbiBzdHJlYW1fb3BzX3JlYWQoc3RyZWFtLGJ1ZmZlcixvZmZzZXQsbGVuZ3RoLHBvc2l0aW9uKXtpZighRlMuZm9yY2VMb2FkRmlsZShub2RlKSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUlPKX12YXIgY29udGVudHM9c3RyZWFtLm5vZGUuY29udGVudHM7aWYocG9zaXRpb24+PWNvbnRlbnRzLmxlbmd0aClyZXR1cm4gMDt2YXIgc2l6ZT1NYXRoLm1pbihjb250ZW50cy5sZW5ndGgtcG9zaXRpb24sbGVuZ3RoKTthc3NlcnQoc2l6ZT49MCk7aWYoY29udGVudHMuc2xpY2Upe2Zvcih2YXIgaT0wO2k8c2l6ZTtpKyspe2J1ZmZlcltvZmZzZXQraV09Y29udGVudHNbcG9zaXRpb24raV19fWVsc2V7Zm9yKHZhciBpPTA7aTxzaXplO2krKyl7YnVmZmVyW29mZnNldCtpXT1jb250ZW50cy5nZXQocG9zaXRpb24raSl9fXJldHVybiBzaXplfTtub2RlLnN0cmVhbV9vcHM9c3RyZWFtX29wcztyZXR1cm4gbm9kZX0pLGNyZWF0ZVByZWxvYWRlZEZpbGU6KGZ1bmN0aW9uKHBhcmVudCxuYW1lLHVybCxjYW5SZWFkLGNhbldyaXRlLG9ubG9hZCxvbmVycm9yLGRvbnRDcmVhdGVGaWxlLGNhbk93bixwcmVGaW5pc2gpe0Jyb3dzZXIuaW5pdCgpO3ZhciBmdWxsbmFtZT1uYW1lP1BBVEgucmVzb2x2ZShQQVRILmpvaW4yKHBhcmVudCxuYW1lKSk6cGFyZW50O3ZhciBkZXA9Z2V0VW5pcXVlUnVuRGVwZW5kZW5jeShcImNwIFwiK2Z1bGxuYW1lKTtmdW5jdGlvbiBwcm9jZXNzRGF0YShieXRlQXJyYXkpe2Z1bmN0aW9uIGZpbmlzaChieXRlQXJyYXkpe2lmKHByZUZpbmlzaClwcmVGaW5pc2goKTtpZighZG9udENyZWF0ZUZpbGUpe0ZTLmNyZWF0ZURhdGFGaWxlKHBhcmVudCxuYW1lLGJ5dGVBcnJheSxjYW5SZWFkLGNhbldyaXRlLGNhbk93bil9aWYob25sb2FkKW9ubG9hZCgpO3JlbW92ZVJ1bkRlcGVuZGVuY3koZGVwKX12YXIgaGFuZGxlZD1mYWxzZTtNb2R1bGVbXCJwcmVsb2FkUGx1Z2luc1wiXS5mb3JFYWNoKChmdW5jdGlvbihwbHVnaW4pe2lmKGhhbmRsZWQpcmV0dXJuO2lmKHBsdWdpbltcImNhbkhhbmRsZVwiXShmdWxsbmFtZSkpe3BsdWdpbltcImhhbmRsZVwiXShieXRlQXJyYXksZnVsbG5hbWUsZmluaXNoLChmdW5jdGlvbigpe2lmKG9uZXJyb3Ipb25lcnJvcigpO3JlbW92ZVJ1bkRlcGVuZGVuY3koZGVwKX0pKTtoYW5kbGVkPXRydWV9fSkpO2lmKCFoYW5kbGVkKWZpbmlzaChieXRlQXJyYXkpfWFkZFJ1bkRlcGVuZGVuY3koZGVwKTtpZih0eXBlb2YgdXJsPT1cInN0cmluZ1wiKXtCcm93c2VyLmFzeW5jTG9hZCh1cmwsKGZ1bmN0aW9uKGJ5dGVBcnJheSl7cHJvY2Vzc0RhdGEoYnl0ZUFycmF5KX0pLG9uZXJyb3IpfWVsc2V7cHJvY2Vzc0RhdGEodXJsKX19KSxpbmRleGVkREI6KGZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbmRleGVkREJ8fHdpbmRvdy5tb3pJbmRleGVkREJ8fHdpbmRvdy53ZWJraXRJbmRleGVkREJ8fHdpbmRvdy5tc0luZGV4ZWREQn0pLERCX05BTUU6KGZ1bmN0aW9uKCl7cmV0dXJuXCJFTV9GU19cIit3aW5kb3cubG9jYXRpb24ucGF0aG5hbWV9KSxEQl9WRVJTSU9OOjIwLERCX1NUT1JFX05BTUU6XCJGSUxFX0RBVEFcIixzYXZlRmlsZXNUb0RCOihmdW5jdGlvbihwYXRocyxvbmxvYWQsb25lcnJvcil7b25sb2FkPW9ubG9hZHx8KGZ1bmN0aW9uKCl7fSk7b25lcnJvcj1vbmVycm9yfHwoZnVuY3Rpb24oKXt9KTt2YXIgaW5kZXhlZERCPUZTLmluZGV4ZWREQigpO3RyeXt2YXIgb3BlblJlcXVlc3Q9aW5kZXhlZERCLm9wZW4oRlMuREJfTkFNRSgpLEZTLkRCX1ZFUlNJT04pfWNhdGNoKGUpe3JldHVybiBvbmVycm9yKGUpfW9wZW5SZXF1ZXN0Lm9udXBncmFkZW5lZWRlZD1mdW5jdGlvbiBvcGVuUmVxdWVzdF9vbnVwZ3JhZGVuZWVkZWQoKXtjb25zb2xlLmxvZyhcImNyZWF0aW5nIGRiXCIpO3ZhciBkYj1vcGVuUmVxdWVzdC5yZXN1bHQ7ZGIuY3JlYXRlT2JqZWN0U3RvcmUoRlMuREJfU1RPUkVfTkFNRSl9O29wZW5SZXF1ZXN0Lm9uc3VjY2Vzcz1mdW5jdGlvbiBvcGVuUmVxdWVzdF9vbnN1Y2Nlc3MoKXt2YXIgZGI9b3BlblJlcXVlc3QucmVzdWx0O3ZhciB0cmFuc2FjdGlvbj1kYi50cmFuc2FjdGlvbihbRlMuREJfU1RPUkVfTkFNRV0sXCJyZWFkd3JpdGVcIik7dmFyIGZpbGVzPXRyYW5zYWN0aW9uLm9iamVjdFN0b3JlKEZTLkRCX1NUT1JFX05BTUUpO3ZhciBvaz0wLGZhaWw9MCx0b3RhbD1wYXRocy5sZW5ndGg7ZnVuY3Rpb24gZmluaXNoKCl7aWYoZmFpbD09MClvbmxvYWQoKTtlbHNlIG9uZXJyb3IoKX1wYXRocy5mb3JFYWNoKChmdW5jdGlvbihwYXRoKXt2YXIgcHV0UmVxdWVzdD1maWxlcy5wdXQoRlMuYW5hbHl6ZVBhdGgocGF0aCkub2JqZWN0LmNvbnRlbnRzLHBhdGgpO3B1dFJlcXVlc3Qub25zdWNjZXNzPWZ1bmN0aW9uIHB1dFJlcXVlc3Rfb25zdWNjZXNzKCl7b2srKztpZihvaytmYWlsPT10b3RhbClmaW5pc2goKX07cHV0UmVxdWVzdC5vbmVycm9yPWZ1bmN0aW9uIHB1dFJlcXVlc3Rfb25lcnJvcigpe2ZhaWwrKztpZihvaytmYWlsPT10b3RhbClmaW5pc2goKX19KSk7dHJhbnNhY3Rpb24ub25lcnJvcj1vbmVycm9yfTtvcGVuUmVxdWVzdC5vbmVycm9yPW9uZXJyb3J9KSxsb2FkRmlsZXNGcm9tREI6KGZ1bmN0aW9uKHBhdGhzLG9ubG9hZCxvbmVycm9yKXtvbmxvYWQ9b25sb2FkfHwoZnVuY3Rpb24oKXt9KTtvbmVycm9yPW9uZXJyb3J8fChmdW5jdGlvbigpe30pO3ZhciBpbmRleGVkREI9RlMuaW5kZXhlZERCKCk7dHJ5e3ZhciBvcGVuUmVxdWVzdD1pbmRleGVkREIub3BlbihGUy5EQl9OQU1FKCksRlMuREJfVkVSU0lPTil9Y2F0Y2goZSl7cmV0dXJuIG9uZXJyb3IoZSl9b3BlblJlcXVlc3Qub251cGdyYWRlbmVlZGVkPW9uZXJyb3I7b3BlblJlcXVlc3Qub25zdWNjZXNzPWZ1bmN0aW9uIG9wZW5SZXF1ZXN0X29uc3VjY2Vzcygpe3ZhciBkYj1vcGVuUmVxdWVzdC5yZXN1bHQ7dHJ5e3ZhciB0cmFuc2FjdGlvbj1kYi50cmFuc2FjdGlvbihbRlMuREJfU1RPUkVfTkFNRV0sXCJyZWFkb25seVwiKX1jYXRjaChlKXtvbmVycm9yKGUpO3JldHVybn12YXIgZmlsZXM9dHJhbnNhY3Rpb24ub2JqZWN0U3RvcmUoRlMuREJfU1RPUkVfTkFNRSk7dmFyIG9rPTAsZmFpbD0wLHRvdGFsPXBhdGhzLmxlbmd0aDtmdW5jdGlvbiBmaW5pc2goKXtpZihmYWlsPT0wKW9ubG9hZCgpO2Vsc2Ugb25lcnJvcigpfXBhdGhzLmZvckVhY2goKGZ1bmN0aW9uKHBhdGgpe3ZhciBnZXRSZXF1ZXN0PWZpbGVzLmdldChwYXRoKTtnZXRSZXF1ZXN0Lm9uc3VjY2Vzcz1mdW5jdGlvbiBnZXRSZXF1ZXN0X29uc3VjY2Vzcygpe2lmKEZTLmFuYWx5emVQYXRoKHBhdGgpLmV4aXN0cyl7RlMudW5saW5rKHBhdGgpfUZTLmNyZWF0ZURhdGFGaWxlKFBBVEguZGlybmFtZShwYXRoKSxQQVRILmJhc2VuYW1lKHBhdGgpLGdldFJlcXVlc3QucmVzdWx0LHRydWUsdHJ1ZSx0cnVlKTtvaysrO2lmKG9rK2ZhaWw9PXRvdGFsKWZpbmlzaCgpfTtnZXRSZXF1ZXN0Lm9uZXJyb3I9ZnVuY3Rpb24gZ2V0UmVxdWVzdF9vbmVycm9yKCl7ZmFpbCsrO2lmKG9rK2ZhaWw9PXRvdGFsKWZpbmlzaCgpfX0pKTt0cmFuc2FjdGlvbi5vbmVycm9yPW9uZXJyb3J9O29wZW5SZXF1ZXN0Lm9uZXJyb3I9b25lcnJvcn0pfTt2YXIgU1lTQ0FMTFM9e0RFRkFVTFRfUE9MTE1BU0s6NSxtYXBwaW5nczp7fSx1bWFzazo1MTEsY2FsY3VsYXRlQXQ6KGZ1bmN0aW9uKGRpcmZkLHBhdGgpe2lmKHBhdGhbMF0hPT1cIi9cIil7dmFyIGRpcjtpZihkaXJmZD09PS0xMDApe2Rpcj1GUy5jd2QoKX1lbHNle3ZhciBkaXJzdHJlYW09RlMuZ2V0U3RyZWFtKGRpcmZkKTtpZighZGlyc3RyZWFtKXRocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVCQURGKTtkaXI9ZGlyc3RyZWFtLnBhdGh9cGF0aD1QQVRILmpvaW4yKGRpcixwYXRoKX1yZXR1cm4gcGF0aH0pLGRvU3RhdDooZnVuY3Rpb24oZnVuYyxwYXRoLGJ1Zil7dHJ5e3ZhciBzdGF0PWZ1bmMocGF0aCl9Y2F0Y2goZSl7aWYoZSYmZS5ub2RlJiZQQVRILm5vcm1hbGl6ZShwYXRoKSE9PVBBVEgubm9ybWFsaXplKEZTLmdldFBhdGgoZS5ub2RlKSkpe3JldHVybi1FUlJOT19DT0RFUy5FTk9URElSfXRocm93IGV9SEVBUDMyW2J1Zj4+Ml09c3RhdC5kZXY7SEVBUDMyW2J1Zis0Pj4yXT0wO0hFQVAzMltidWYrOD4+Ml09c3RhdC5pbm87SEVBUDMyW2J1ZisxMj4+Ml09c3RhdC5tb2RlO0hFQVAzMltidWYrMTY+PjJdPXN0YXQubmxpbms7SEVBUDMyW2J1ZisyMD4+Ml09c3RhdC51aWQ7SEVBUDMyW2J1ZisyND4+Ml09c3RhdC5naWQ7SEVBUDMyW2J1ZisyOD4+Ml09c3RhdC5yZGV2O0hFQVAzMltidWYrMzI+PjJdPTA7SEVBUDMyW2J1ZiszNj4+Ml09c3RhdC5zaXplO0hFQVAzMltidWYrNDA+PjJdPTQwOTY7SEVBUDMyW2J1Zis0ND4+Ml09c3RhdC5ibG9ja3M7SEVBUDMyW2J1Zis0OD4+Ml09c3RhdC5hdGltZS5nZXRUaW1lKCkvMWUzfDA7SEVBUDMyW2J1Zis1Mj4+Ml09MDtIRUFQMzJbYnVmKzU2Pj4yXT1zdGF0Lm10aW1lLmdldFRpbWUoKS8xZTN8MDtIRUFQMzJbYnVmKzYwPj4yXT0wO0hFQVAzMltidWYrNjQ+PjJdPXN0YXQuY3RpbWUuZ2V0VGltZSgpLzFlM3wwO0hFQVAzMltidWYrNjg+PjJdPTA7SEVBUDMyW2J1Zis3Mj4+Ml09c3RhdC5pbm87cmV0dXJuIDB9KSxkb01zeW5jOihmdW5jdGlvbihhZGRyLHN0cmVhbSxsZW4sZmxhZ3Mpe3ZhciBidWZmZXI9bmV3IFVpbnQ4QXJyYXkoSEVBUFU4LnN1YmFycmF5KGFkZHIsYWRkcitsZW4pKTtGUy5tc3luYyhzdHJlYW0sYnVmZmVyLDAsbGVuLGZsYWdzKX0pLGRvTWtkaXI6KGZ1bmN0aW9uKHBhdGgsbW9kZSl7cGF0aD1QQVRILm5vcm1hbGl6ZShwYXRoKTtpZihwYXRoW3BhdGgubGVuZ3RoLTFdPT09XCIvXCIpcGF0aD1wYXRoLnN1YnN0cigwLHBhdGgubGVuZ3RoLTEpO0ZTLm1rZGlyKHBhdGgsbW9kZSwwKTtyZXR1cm4gMH0pLGRvTWtub2Q6KGZ1bmN0aW9uKHBhdGgsbW9kZSxkZXYpe3N3aXRjaChtb2RlJjYxNDQwKXtjYXNlIDMyNzY4OmNhc2UgODE5MjpjYXNlIDI0NTc2OmNhc2UgNDA5NjpjYXNlIDQ5MTUyOmJyZWFrO2RlZmF1bHQ6cmV0dXJuLUVSUk5PX0NPREVTLkVJTlZBTH1GUy5ta25vZChwYXRoLG1vZGUsZGV2KTtyZXR1cm4gMH0pLGRvUmVhZGxpbms6KGZ1bmN0aW9uKHBhdGgsYnVmLGJ1ZnNpemUpe2lmKGJ1ZnNpemU8PTApcmV0dXJuLUVSUk5PX0NPREVTLkVJTlZBTDt2YXIgcmV0PUZTLnJlYWRsaW5rKHBhdGgpO3JldD1yZXQuc2xpY2UoMCxNYXRoLm1heCgwLGJ1ZnNpemUpKTt3cml0ZVN0cmluZ1RvTWVtb3J5KHJldCxidWYsdHJ1ZSk7cmV0dXJuIHJldC5sZW5ndGh9KSxkb0FjY2VzczooZnVuY3Rpb24ocGF0aCxhbW9kZSl7aWYoYW1vZGUmfjcpe3JldHVybi1FUlJOT19DT0RFUy5FSU5WQUx9dmFyIG5vZGU7dmFyIGxvb2t1cD1GUy5sb29rdXBQYXRoKHBhdGgse2ZvbGxvdzp0cnVlfSk7bm9kZT1sb29rdXAubm9kZTt2YXIgcGVybXM9XCJcIjtpZihhbW9kZSY0KXBlcm1zKz1cInJcIjtpZihhbW9kZSYyKXBlcm1zKz1cIndcIjtpZihhbW9kZSYxKXBlcm1zKz1cInhcIjtpZihwZXJtcyYmRlMubm9kZVBlcm1pc3Npb25zKG5vZGUscGVybXMpKXtyZXR1cm4tRVJSTk9fQ09ERVMuRUFDQ0VTfXJldHVybiAwfSksZG9EdXA6KGZ1bmN0aW9uKHBhdGgsZmxhZ3Msc3VnZ2VzdEZEKXt2YXIgc3VnZ2VzdD1GUy5nZXRTdHJlYW0oc3VnZ2VzdEZEKTtpZihzdWdnZXN0KUZTLmNsb3NlKHN1Z2dlc3QpO3JldHVybiBGUy5vcGVuKHBhdGgsZmxhZ3MsMCxzdWdnZXN0RkQsc3VnZ2VzdEZEKS5mZH0pLGRvUmVhZHY6KGZ1bmN0aW9uKHN0cmVhbSxpb3YsaW92Y250LG9mZnNldCl7dmFyIHJldD0wO2Zvcih2YXIgaT0wO2k8aW92Y250O2krKyl7dmFyIHB0cj1IRUFQMzJbaW92K2kqOD4+Ml07dmFyIGxlbj1IRUFQMzJbaW92KyhpKjgrNCk+PjJdO3ZhciBjdXJyPUZTLnJlYWQoc3RyZWFtLEhFQVA4LHB0cixsZW4sb2Zmc2V0KTtpZihjdXJyPDApcmV0dXJuLTE7cmV0Kz1jdXJyO2lmKGN1cnI8bGVuKWJyZWFrfXJldHVybiByZXR9KSxkb1dyaXRldjooZnVuY3Rpb24oc3RyZWFtLGlvdixpb3ZjbnQsb2Zmc2V0KXt2YXIgcmV0PTA7Zm9yKHZhciBpPTA7aTxpb3ZjbnQ7aSsrKXt2YXIgcHRyPUhFQVAzMltpb3YraSo4Pj4yXTt2YXIgbGVuPUhFQVAzMltpb3YrKGkqOCs0KT4+Ml07dmFyIGN1cnI9RlMud3JpdGUoc3RyZWFtLEhFQVA4LHB0cixsZW4sb2Zmc2V0KTtpZihjdXJyPDApcmV0dXJuLTE7cmV0Kz1jdXJyfXJldHVybiByZXR9KSx2YXJhcmdzOjAsZ2V0OihmdW5jdGlvbih2YXJhcmdzKXtTWVNDQUxMUy52YXJhcmdzKz00O3ZhciByZXQ9SEVBUDMyW1NZU0NBTExTLnZhcmFyZ3MtND4+Ml07cmV0dXJuIHJldH0pLGdldFN0cjooZnVuY3Rpb24oKXt2YXIgcmV0PVBvaW50ZXJfc3RyaW5naWZ5KFNZU0NBTExTLmdldCgpKTtyZXR1cm4gcmV0fSksZ2V0U3RyZWFtRnJvbUZEOihmdW5jdGlvbigpe3ZhciBzdHJlYW09RlMuZ2V0U3RyZWFtKFNZU0NBTExTLmdldCgpKTtpZighc3RyZWFtKXRocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVCQURGKTtyZXR1cm4gc3RyZWFtfSksZ2V0U29ja2V0RnJvbUZEOihmdW5jdGlvbigpe3ZhciBzb2NrZXQ9U09DS0ZTLmdldFNvY2tldChTWVNDQUxMUy5nZXQoKSk7aWYoIXNvY2tldCl0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FQkFERik7cmV0dXJuIHNvY2tldH0pLGdldFNvY2tldEFkZHJlc3M6KGZ1bmN0aW9uKGFsbG93TnVsbCl7dmFyIGFkZHJwPVNZU0NBTExTLmdldCgpLGFkZHJsZW49U1lTQ0FMTFMuZ2V0KCk7aWYoYWxsb3dOdWxsJiZhZGRycD09PTApcmV0dXJuIG51bGw7dmFyIGluZm89X19yZWFkX3NvY2thZGRyKGFkZHJwLGFkZHJsZW4pO2lmKGluZm8uZXJybm8pdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoaW5mby5lcnJubyk7aW5mby5hZGRyPUROUy5sb29rdXBfYWRkcihpbmZvLmFkZHIpfHxpbmZvLmFkZHI7cmV0dXJuIGluZm99KSxnZXQ2NDooZnVuY3Rpb24oKXt2YXIgbG93PVNZU0NBTExTLmdldCgpLGhpZ2g9U1lTQ0FMTFMuZ2V0KCk7aWYobG93Pj0wKWFzc2VydChoaWdoPT09MCk7ZWxzZSBhc3NlcnQoaGlnaD09PS0xKTtyZXR1cm4gbG93fSksZ2V0WmVybzooZnVuY3Rpb24oKXthc3NlcnQoU1lTQ0FMTFMuZ2V0KCk9PT0wKX0pfTtmdW5jdGlvbiBfX19zeXNjYWxsNih3aGljaCx2YXJhcmdzKXtTWVNDQUxMUy52YXJhcmdzPXZhcmFyZ3M7dHJ5e3ZhciBzdHJlYW09U1lTQ0FMTFMuZ2V0U3RyZWFtRnJvbUZEKCk7RlMuY2xvc2Uoc3RyZWFtKTtyZXR1cm4gMH1jYXRjaChlKXtpZih0eXBlb2YgRlM9PT1cInVuZGVmaW5lZFwifHwhKGUgaW5zdGFuY2VvZiBGUy5FcnJub0Vycm9yKSlhYm9ydChlKTtyZXR1cm4tZS5lcnJub319dmFyIF9lbXNjcmlwdGVuX2FzbV9jb25zdD10cnVlO2Z1bmN0aW9uIF9fX2Fzc2VydF9mYWlsKGNvbmRpdGlvbixmaWxlbmFtZSxsaW5lLGZ1bmMpe0FCT1JUPXRydWU7dGhyb3dcIkFzc2VydGlvbiBmYWlsZWQ6IFwiK1BvaW50ZXJfc3RyaW5naWZ5KGNvbmRpdGlvbikrXCIsIGF0OiBcIitbZmlsZW5hbWU/UG9pbnRlcl9zdHJpbmdpZnkoZmlsZW5hbWUpOlwidW5rbm93biBmaWxlbmFtZVwiLGxpbmUsZnVuYz9Qb2ludGVyX3N0cmluZ2lmeShmdW5jKTpcInVua25vd24gZnVuY3Rpb25cIl0rXCIgYXQgXCIrc3RhY2tUcmFjZSgpfWZ1bmN0aW9uIF9zYnJrKGJ5dGVzKXt2YXIgc2VsZj1fc2JyaztpZighc2VsZi5jYWxsZWQpe0RZTkFNSUNUT1A9YWxpZ25NZW1vcnlQYWdlKERZTkFNSUNUT1ApO3NlbGYuY2FsbGVkPXRydWU7YXNzZXJ0KFJ1bnRpbWUuZHluYW1pY0FsbG9jKTtzZWxmLmFsbG9jPVJ1bnRpbWUuZHluYW1pY0FsbG9jO1J1bnRpbWUuZHluYW1pY0FsbG9jPShmdW5jdGlvbigpe2Fib3J0KFwiY2Fubm90IGR5bmFtaWNhbGx5IGFsbG9jYXRlLCBzYnJrIG5vdyBoYXMgY29udHJvbFwiKX0pfXZhciByZXQ9RFlOQU1JQ1RPUDtpZihieXRlcyE9MCl7dmFyIHN1Y2Nlc3M9c2VsZi5hbGxvYyhieXRlcyk7aWYoIXN1Y2Nlc3MpcmV0dXJuLTE+Pj4wfXJldHVybiByZXR9ZnVuY3Rpb24gX2Vtc2NyaXB0ZW5fbWVtY3B5X2JpZyhkZXN0LHNyYyxudW0pe0hFQVBVOC5zZXQoSEVBUFU4LnN1YmFycmF5KHNyYyxzcmMrbnVtKSxkZXN0KTtyZXR1cm4gZGVzdH1Nb2R1bGVbXCJfbWVtY3B5XCJdPV9tZW1jcHk7TW9kdWxlW1wiX21lbW1vdmVcIl09X21lbW1vdmU7dmFyIF9lbXNjcmlwdGVuX2FzbV9jb25zdF9pbnQ9dHJ1ZTtmdW5jdGlvbiBfdGltZShwdHIpe3ZhciByZXQ9RGF0ZS5ub3coKS8xZTN8MDtpZihwdHIpe0hFQVAzMltwdHI+PjJdPXJldH1yZXR1cm4gcmV0fWZ1bmN0aW9uIF9wdGhyZWFkX3NlbGYoKXtyZXR1cm4gMH1mdW5jdGlvbiBfX19zeXNjYWxsMTQwKHdoaWNoLHZhcmFyZ3Mpe1NZU0NBTExTLnZhcmFyZ3M9dmFyYXJnczt0cnl7dmFyIHN0cmVhbT1TWVNDQUxMUy5nZXRTdHJlYW1Gcm9tRkQoKSxvZmZzZXRfaGlnaD1TWVNDQUxMUy5nZXQoKSxvZmZzZXRfbG93PVNZU0NBTExTLmdldCgpLHJlc3VsdD1TWVNDQUxMUy5nZXQoKSx3aGVuY2U9U1lTQ0FMTFMuZ2V0KCk7dmFyIG9mZnNldD1vZmZzZXRfbG93O2Fzc2VydChvZmZzZXRfaGlnaD09PTApO0ZTLmxsc2VlayhzdHJlYW0sb2Zmc2V0LHdoZW5jZSk7SEVBUDMyW3Jlc3VsdD4+Ml09c3RyZWFtLnBvc2l0aW9uO2lmKHN0cmVhbS5nZXRkZW50cyYmb2Zmc2V0PT09MCYmd2hlbmNlPT09MClzdHJlYW0uZ2V0ZGVudHM9bnVsbDtyZXR1cm4gMH1jYXRjaChlKXtpZih0eXBlb2YgRlM9PT1cInVuZGVmaW5lZFwifHwhKGUgaW5zdGFuY2VvZiBGUy5FcnJub0Vycm9yKSlhYm9ydChlKTtyZXR1cm4tZS5lcnJub319ZnVuY3Rpb24gX19fc3lzY2FsbDE0Nih3aGljaCx2YXJhcmdzKXtTWVNDQUxMUy52YXJhcmdzPXZhcmFyZ3M7dHJ5e3ZhciBzdHJlYW09U1lTQ0FMTFMuZ2V0U3RyZWFtRnJvbUZEKCksaW92PVNZU0NBTExTLmdldCgpLGlvdmNudD1TWVNDQUxMUy5nZXQoKTtyZXR1cm4gU1lTQ0FMTFMuZG9Xcml0ZXYoc3RyZWFtLGlvdixpb3ZjbnQpfWNhdGNoKGUpe2lmKHR5cGVvZiBGUz09PVwidW5kZWZpbmVkXCJ8fCEoZSBpbnN0YW5jZW9mIEZTLkVycm5vRXJyb3IpKWFib3J0KGUpO3JldHVybi1lLmVycm5vfX1mdW5jdGlvbiBfX19zeXNjYWxsNTQod2hpY2gsdmFyYXJncyl7U1lTQ0FMTFMudmFyYXJncz12YXJhcmdzO3RyeXt2YXIgc3RyZWFtPVNZU0NBTExTLmdldFN0cmVhbUZyb21GRCgpLG9wPVNZU0NBTExTLmdldCgpO3N3aXRjaChvcCl7Y2FzZSAyMTUwNTp7aWYoIXN0cmVhbS50dHkpcmV0dXJuLUVSUk5PX0NPREVTLkVOT1RUWTtyZXR1cm4gMH07Y2FzZSAyMTUwNjp7aWYoIXN0cmVhbS50dHkpcmV0dXJuLUVSUk5PX0NPREVTLkVOT1RUWTtyZXR1cm4gMH07Y2FzZSAyMTUxOTp7aWYoIXN0cmVhbS50dHkpcmV0dXJuLUVSUk5PX0NPREVTLkVOT1RUWTt2YXIgYXJncD1TWVNDQUxMUy5nZXQoKTtIRUFQMzJbYXJncD4+Ml09MDtyZXR1cm4gMH07Y2FzZSAyMTUyMDp7aWYoIXN0cmVhbS50dHkpcmV0dXJuLUVSUk5PX0NPREVTLkVOT1RUWTtyZXR1cm4tRVJSTk9fQ09ERVMuRUlOVkFMfTtjYXNlIDIxNTMxOnt2YXIgYXJncD1TWVNDQUxMUy5nZXQoKTtyZXR1cm4gRlMuaW9jdGwoc3RyZWFtLG9wLGFyZ3ApfTtkZWZhdWx0OmFib3J0KFwiYmFkIGlvY3RsIHN5c2NhbGwgXCIrb3ApfX1jYXRjaChlKXtpZih0eXBlb2YgRlM9PT1cInVuZGVmaW5lZFwifHwhKGUgaW5zdGFuY2VvZiBGUy5FcnJub0Vycm9yKSlhYm9ydChlKTtyZXR1cm4tZS5lcnJub319RlMuc3RhdGljSW5pdCgpO19fQVRJTklUX18udW5zaGlmdCgoZnVuY3Rpb24oKXtpZighTW9kdWxlW1wibm9GU0luaXRcIl0mJiFGUy5pbml0LmluaXRpYWxpemVkKUZTLmluaXQoKX0pKTtfX0FUTUFJTl9fLnB1c2goKGZ1bmN0aW9uKCl7RlMuaWdub3JlUGVybWlzc2lvbnM9ZmFsc2V9KSk7X19BVEVYSVRfXy5wdXNoKChmdW5jdGlvbigpe0ZTLnF1aXQoKX0pKTtNb2R1bGVbXCJGU19jcmVhdGVGb2xkZXJcIl09RlMuY3JlYXRlRm9sZGVyO01vZHVsZVtcIkZTX2NyZWF0ZVBhdGhcIl09RlMuY3JlYXRlUGF0aDtNb2R1bGVbXCJGU19jcmVhdGVEYXRhRmlsZVwiXT1GUy5jcmVhdGVEYXRhRmlsZTtNb2R1bGVbXCJGU19jcmVhdGVQcmVsb2FkZWRGaWxlXCJdPUZTLmNyZWF0ZVByZWxvYWRlZEZpbGU7TW9kdWxlW1wiRlNfY3JlYXRlTGF6eUZpbGVcIl09RlMuY3JlYXRlTGF6eUZpbGU7TW9kdWxlW1wiRlNfY3JlYXRlTGlua1wiXT1GUy5jcmVhdGVMaW5rO01vZHVsZVtcIkZTX2NyZWF0ZURldmljZVwiXT1GUy5jcmVhdGVEZXZpY2U7TW9kdWxlW1wiRlNfdW5saW5rXCJdPUZTLnVubGluaztfX0FUSU5JVF9fLnVuc2hpZnQoKGZ1bmN0aW9uKCl7VFRZLmluaXQoKX0pKTtfX0FURVhJVF9fLnB1c2goKGZ1bmN0aW9uKCl7VFRZLnNodXRkb3duKCl9KSk7aWYoRU5WSVJPTk1FTlRfSVNfTk9ERSl7dmFyIGZzPXJlcXVpcmUoXCJmc1wiKTt2YXIgTk9ERUpTX1BBVEg9cmVxdWlyZShcInBhdGhcIik7Tk9ERUZTLnN0YXRpY0luaXQoKX1TVEFDS19CQVNFPVNUQUNLVE9QPVJ1bnRpbWUuYWxpZ25NZW1vcnkoU1RBVElDVE9QKTtzdGF0aWNTZWFsZWQ9dHJ1ZTtTVEFDS19NQVg9U1RBQ0tfQkFTRStUT1RBTF9TVEFDSztEWU5BTUlDX0JBU0U9RFlOQU1JQ1RPUD1SdW50aW1lLmFsaWduTWVtb3J5KFNUQUNLX01BWCk7YXNzZXJ0KERZTkFNSUNfQkFTRTxUT1RBTF9NRU1PUlksXCJUT1RBTF9NRU1PUlkgbm90IGJpZyBlbm91Z2ggZm9yIHN0YWNrXCIpO3ZhciBjdHR6X2k4PWFsbG9jYXRlKFs4LDAsMSwwLDIsMCwxLDAsMywwLDEsMCwyLDAsMSwwLDQsMCwxLDAsMiwwLDEsMCwzLDAsMSwwLDIsMCwxLDAsNSwwLDEsMCwyLDAsMSwwLDMsMCwxLDAsMiwwLDEsMCw0LDAsMSwwLDIsMCwxLDAsMywwLDEsMCwyLDAsMSwwLDYsMCwxLDAsMiwwLDEsMCwzLDAsMSwwLDIsMCwxLDAsNCwwLDEsMCwyLDAsMSwwLDMsMCwxLDAsMiwwLDEsMCw1LDAsMSwwLDIsMCwxLDAsMywwLDEsMCwyLDAsMSwwLDQsMCwxLDAsMiwwLDEsMCwzLDAsMSwwLDIsMCwxLDAsNywwLDEsMCwyLDAsMSwwLDMsMCwxLDAsMiwwLDEsMCw0LDAsMSwwLDIsMCwxLDAsMywwLDEsMCwyLDAsMSwwLDUsMCwxLDAsMiwwLDEsMCwzLDAsMSwwLDIsMCwxLDAsNCwwLDEsMCwyLDAsMSwwLDMsMCwxLDAsMiwwLDEsMCw2LDAsMSwwLDIsMCwxLDAsMywwLDEsMCwyLDAsMSwwLDQsMCwxLDAsMiwwLDEsMCwzLDAsMSwwLDIsMCwxLDAsNSwwLDEsMCwyLDAsMSwwLDMsMCwxLDAsMiwwLDEsMCw0LDAsMSwwLDIsMCwxLDAsMywwLDEsMCwyLDAsMSwwXSxcImk4XCIsQUxMT0NfRFlOQU1JQyk7ZnVuY3Rpb24gaW52b2tlX2koaW5kZXgpe3RyeXtyZXR1cm4gTW9kdWxlW1wiZHluQ2FsbF9pXCJdKGluZGV4KX1jYXRjaChlKXtpZih0eXBlb2YgZSE9PVwibnVtYmVyXCImJmUhPT1cImxvbmdqbXBcIil0aHJvdyBlO2FzbVtcInNldFRocmV3XCJdKDEsMCl9fWZ1bmN0aW9uIGpzQ2FsbF9pKGluZGV4KXtyZXR1cm4gUnVudGltZS5mdW5jdGlvblBvaW50ZXJzW2luZGV4XSgpfWZ1bmN0aW9uIGludm9rZV9paShpbmRleCxhMSl7dHJ5e3JldHVybiBNb2R1bGVbXCJkeW5DYWxsX2lpXCJdKGluZGV4LGExKX1jYXRjaChlKXtpZih0eXBlb2YgZSE9PVwibnVtYmVyXCImJmUhPT1cImxvbmdqbXBcIil0aHJvdyBlO2FzbVtcInNldFRocmV3XCJdKDEsMCl9fWZ1bmN0aW9uIGpzQ2FsbF9paShpbmRleCxhMSl7cmV0dXJuIFJ1bnRpbWUuZnVuY3Rpb25Qb2ludGVyc1tpbmRleF0oYTEpfWZ1bmN0aW9uIGludm9rZV9paWlpKGluZGV4LGExLGEyLGEzKXt0cnl7cmV0dXJuIE1vZHVsZVtcImR5bkNhbGxfaWlpaVwiXShpbmRleCxhMSxhMixhMyl9Y2F0Y2goZSl7aWYodHlwZW9mIGUhPT1cIm51bWJlclwiJiZlIT09XCJsb25nam1wXCIpdGhyb3cgZTthc21bXCJzZXRUaHJld1wiXSgxLDApfX1mdW5jdGlvbiBqc0NhbGxfaWlpaShpbmRleCxhMSxhMixhMyl7cmV0dXJuIFJ1bnRpbWUuZnVuY3Rpb25Qb2ludGVyc1tpbmRleF0oYTEsYTIsYTMpfWZ1bmN0aW9uIGludm9rZV92aShpbmRleCxhMSl7dHJ5e01vZHVsZVtcImR5bkNhbGxfdmlcIl0oaW5kZXgsYTEpfWNhdGNoKGUpe2lmKHR5cGVvZiBlIT09XCJudW1iZXJcIiYmZSE9PVwibG9uZ2ptcFwiKXRocm93IGU7YXNtW1wic2V0VGhyZXdcIl0oMSwwKX19ZnVuY3Rpb24ganNDYWxsX3ZpKGluZGV4LGExKXtSdW50aW1lLmZ1bmN0aW9uUG9pbnRlcnNbaW5kZXhdKGExKX1Nb2R1bGUuYXNtR2xvYmFsQXJnPXtcIk1hdGhcIjpNYXRoLFwiSW50OEFycmF5XCI6SW50OEFycmF5LFwiSW50MTZBcnJheVwiOkludDE2QXJyYXksXCJJbnQzMkFycmF5XCI6SW50MzJBcnJheSxcIlVpbnQ4QXJyYXlcIjpVaW50OEFycmF5LFwiVWludDE2QXJyYXlcIjpVaW50MTZBcnJheSxcIlVpbnQzMkFycmF5XCI6VWludDMyQXJyYXksXCJGbG9hdDMyQXJyYXlcIjpGbG9hdDMyQXJyYXksXCJGbG9hdDY0QXJyYXlcIjpGbG9hdDY0QXJyYXksXCJOYU5cIjpOYU4sXCJJbmZpbml0eVwiOkluZmluaXR5fTtNb2R1bGUuYXNtTGlicmFyeUFyZz17XCJhYm9ydFwiOmFib3J0LFwiYXNzZXJ0XCI6YXNzZXJ0LFwiaW52b2tlX2lcIjppbnZva2VfaSxcImpzQ2FsbF9pXCI6anNDYWxsX2ksXCJpbnZva2VfaWlcIjppbnZva2VfaWksXCJqc0NhbGxfaWlcIjpqc0NhbGxfaWksXCJpbnZva2VfaWlpaVwiOmludm9rZV9paWlpLFwianNDYWxsX2lpaWlcIjpqc0NhbGxfaWlpaSxcImludm9rZV92aVwiOmludm9rZV92aSxcImpzQ2FsbF92aVwiOmpzQ2FsbF92aSxcIl9wdGhyZWFkX2NsZWFudXBfcG9wXCI6X3B0aHJlYWRfY2xlYW51cF9wb3AsXCJfX19sb2NrXCI6X19fbG9jayxcIl9zeXNjb25mXCI6X3N5c2NvbmYsXCJfcHRocmVhZF9zZWxmXCI6X3B0aHJlYWRfc2VsZixcIl9fX3N5c2NhbGw2XCI6X19fc3lzY2FsbDYsXCJfX19zZXRFcnJOb1wiOl9fX3NldEVyck5vLFwiX2Fib3J0XCI6X2Fib3J0LFwiX3NicmtcIjpfc2JyayxcIl90aW1lXCI6X3RpbWUsXCJfcHRocmVhZF9jbGVhbnVwX3B1c2hcIjpfcHRocmVhZF9jbGVhbnVwX3B1c2gsXCJfZW1zY3JpcHRlbl9tZW1jcHlfYmlnXCI6X2Vtc2NyaXB0ZW5fbWVtY3B5X2JpZyxcIl9fX3N5c2NhbGw1NFwiOl9fX3N5c2NhbGw1NCxcIl9fX3VubG9ja1wiOl9fX3VubG9jayxcIl9fX3N5c2NhbGwxNDBcIjpfX19zeXNjYWxsMTQwLFwiX19fYXNzZXJ0X2ZhaWxcIjpfX19hc3NlcnRfZmFpbCxcIl9fX3N5c2NhbGwxNDZcIjpfX19zeXNjYWxsMTQ2LFwiX2Vtc2NyaXB0ZW5fYXNtX2NvbnN0XzBcIjpfZW1zY3JpcHRlbl9hc21fY29uc3RfMCxcIlNUQUNLVE9QXCI6U1RBQ0tUT1AsXCJTVEFDS19NQVhcIjpTVEFDS19NQVgsXCJ0ZW1wRG91YmxlUHRyXCI6dGVtcERvdWJsZVB0cixcIkFCT1JUXCI6QUJPUlQsXCJjdHR6X2k4XCI6Y3R0el9pOH07Ly8gRU1TQ1JJUFRFTl9TVEFSVF9BU01cbnZhciBhc209KGZ1bmN0aW9uKGdsb2JhbCxlbnYsYnVmZmVyKSB7XG5cInVzZSBhc21cIjt2YXIgYT1uZXcgZ2xvYmFsLkludDhBcnJheShidWZmZXIpO3ZhciBiPW5ldyBnbG9iYWwuSW50MTZBcnJheShidWZmZXIpO3ZhciBjPW5ldyBnbG9iYWwuSW50MzJBcnJheShidWZmZXIpO3ZhciBkPW5ldyBnbG9iYWwuVWludDhBcnJheShidWZmZXIpO3ZhciBlPW5ldyBnbG9iYWwuVWludDE2QXJyYXkoYnVmZmVyKTt2YXIgZj1uZXcgZ2xvYmFsLlVpbnQzMkFycmF5KGJ1ZmZlcik7dmFyIGc9bmV3IGdsb2JhbC5GbG9hdDMyQXJyYXkoYnVmZmVyKTt2YXIgaD1uZXcgZ2xvYmFsLkZsb2F0NjRBcnJheShidWZmZXIpO3ZhciBpPWVudi5TVEFDS1RPUHwwO3ZhciBqPWVudi5TVEFDS19NQVh8MDt2YXIgaz1lbnYudGVtcERvdWJsZVB0cnwwO3ZhciBsPWVudi5BQk9SVHwwO3ZhciBtPWVudi5jdHR6X2k4fDA7dmFyIG49MDt2YXIgbz0wO3ZhciBwPTA7dmFyIHE9MDt2YXIgcj1nbG9iYWwuTmFOLHM9Z2xvYmFsLkluZmluaXR5O3ZhciB0PTAsdT0wLHY9MCx3PTAseD0wLjAseT0wLHo9MCxBPTAsQj0wLjA7dmFyIEM9MDt2YXIgRD0wO3ZhciBFPTA7dmFyIEY9MDt2YXIgRz0wO3ZhciBIPTA7dmFyIEk9MDt2YXIgSj0wO3ZhciBLPTA7dmFyIEw9MDt2YXIgTT1nbG9iYWwuTWF0aC5mbG9vcjt2YXIgTj1nbG9iYWwuTWF0aC5hYnM7dmFyIE89Z2xvYmFsLk1hdGguc3FydDt2YXIgUD1nbG9iYWwuTWF0aC5wb3c7dmFyIFE9Z2xvYmFsLk1hdGguY29zO3ZhciBSPWdsb2JhbC5NYXRoLnNpbjt2YXIgUz1nbG9iYWwuTWF0aC50YW47dmFyIFQ9Z2xvYmFsLk1hdGguYWNvczt2YXIgVT1nbG9iYWwuTWF0aC5hc2luO3ZhciBWPWdsb2JhbC5NYXRoLmF0YW47dmFyIFc9Z2xvYmFsLk1hdGguYXRhbjI7dmFyIFg9Z2xvYmFsLk1hdGguZXhwO3ZhciBZPWdsb2JhbC5NYXRoLmxvZzt2YXIgWj1nbG9iYWwuTWF0aC5jZWlsO3ZhciBfPWdsb2JhbC5NYXRoLmltdWw7dmFyICQ9Z2xvYmFsLk1hdGgubWluO3ZhciBhYT1nbG9iYWwuTWF0aC5jbHozMjt2YXIgYmE9ZW52LmFib3J0O3ZhciBjYT1lbnYuYXNzZXJ0O3ZhciBkYT1lbnYuaW52b2tlX2k7dmFyIGVhPWVudi5qc0NhbGxfaTt2YXIgZmE9ZW52Lmludm9rZV9paTt2YXIgZ2E9ZW52LmpzQ2FsbF9paTt2YXIgaGE9ZW52Lmludm9rZV9paWlpO3ZhciBpYT1lbnYuanNDYWxsX2lpaWk7dmFyIGphPWVudi5pbnZva2Vfdmk7dmFyIGthPWVudi5qc0NhbGxfdmk7dmFyIGxhPWVudi5fcHRocmVhZF9jbGVhbnVwX3BvcDt2YXIgbWE9ZW52Ll9fX2xvY2s7dmFyIG5hPWVudi5fc3lzY29uZjt2YXIgb2E9ZW52Ll9wdGhyZWFkX3NlbGY7dmFyIHBhPWVudi5fX19zeXNjYWxsNjt2YXIgcWE9ZW52Ll9fX3NldEVyck5vO3ZhciByYT1lbnYuX2Fib3J0O3ZhciBzYT1lbnYuX3Nicms7dmFyIHRhPWVudi5fdGltZTt2YXIgdWE9ZW52Ll9wdGhyZWFkX2NsZWFudXBfcHVzaDt2YXIgdmE9ZW52Ll9lbXNjcmlwdGVuX21lbWNweV9iaWc7dmFyIHdhPWVudi5fX19zeXNjYWxsNTQ7dmFyIHhhPWVudi5fX191bmxvY2s7dmFyIHlhPWVudi5fX19zeXNjYWxsMTQwO3ZhciB6YT1lbnYuX19fYXNzZXJ0X2ZhaWw7dmFyIEFhPWVudi5fX19zeXNjYWxsMTQ2O3ZhciBCYT1lbnYuX2Vtc2NyaXB0ZW5fYXNtX2NvbnN0XzA7dmFyIENhPTAuMDtcbi8vIEVNU0NSSVBURU5fU1RBUlRfRlVOQ1NcbmZ1bmN0aW9uIE5jKGIsZSl7Yj1ifDA7ZT1lfDA7dmFyIGY9MCxnPTAsaD0wLGo9MCxrPTAsbD0wLG09MCxuPTAsbz0wLHA9MCxxPTAscj0wLHM9MCx0PTAsdT0wLHY9MCx3PTAseD0wLHk9MCx6PTAsQT0wLEI9MCxEPTAsRT0wLEY9MCxHPTAsSD0wLEk9MCxKPTAsSz0wLEw9MCxNPTAsTj0wLE89MCxQPTAsUT0wLFI9MCxTPTAsVD0wO1I9aTtQPWk9aSs2MyYtNjQ7aT1pKzMyMHwwO1E9UCsyODB8MDtrPVArMjQwfDA7aj1QKzIwMHwwO3E9UCsxNjB8MDtsPVArMTIwfDA7bT1QKzgwfDA7bz1QKzQwfDA7Tz1iKzQwfDA7VD1kW2U+PjBdfDA7TT1IZChkW2UrMT4+MF18MHwwLDAsOCl8MDtKPUM7cj1IZChkW2UrMj4+MF18MHwwLDAsMTYpfDA7Sj1KfEM7cz1IZChkW2UrMz4+MF18MHwwLDAsMjQpfDA7Sj1KfEM7ST1hW2UrNj4+MF18MDtMPWRbZSs0Pj4wXXwwO3A9SGQoZFtlKzU+PjBdfDB8MCwwLDgpfDA7Sz1DO0k9SGQoSSYyNTV8MCwwLDE2KXwwO0s9SGQocHxMfEl8MCxLfEN8MCw2KXwwO0k9QztMPWFbZSs5Pj4wXXwwO3A9ZFtlKzc+PjBdfDA7Zj1IZChkW2UrOD4+MF18MHwwLDAsOCl8MDt3PUM7TD1IZChMJjI1NXwwLDAsMTYpfDA7dz1IZChmfHB8THwwLHd8Q3wwLDUpfDA7TD1DO3A9YVtlKzEyPj4wXXwwO2Y9ZFtlKzEwPj4wXXwwO3k9SGQoZFtlKzExPj4wXXwwfDAsMCw4KXwwO249QztwPUhkKHAmMjU1fDAsMCwxNil8MDtuPUhkKHl8ZnxwfDAsbnxDfDAsMyl8MDtwPUM7Zj1hW2UrMTU+PjBdfDA7eT1kW2UrMTM+PjBdfDA7Rj1IZChkW2UrMTQ+PjBdfDB8MCwwLDgpfDA7QT1DO2Y9SGQoZiYyNTV8MCwwLDE2KXwwO0E9SGQoRnx5fGZ8MCxBfEN8MCwyKXwwO2Y9Qzt5PWRbZSsxNj4+MF18MDtGPUhkKGRbZSsxNz4+MF18MHwwLDAsOCl8MDt1PUM7aD1IZChkW2UrMTg+PjBdfDB8MCwwLDE2KXwwO3U9dXxDO3Q9SGQoZFtlKzE5Pj4wXXwwfDAsMCwyNCl8MDt0PUZ8eXxofHQ7dT11fEM7aD1hW2UrMjI+PjBdfDA7eT1kW2UrMjA+PjBdfDA7Rj1IZChkW2UrMjE+PjBdfDB8MCwwLDgpfDA7RT1DO2g9SGQoaCYyNTV8MCwwLDE2KXwwO0U9SGQoRnx5fGh8MCxFfEN8MCw3KXwwO2g9Qzt5PWFbZSsyNT4+MF18MDtGPWRbZSsyMz4+MF18MDtOPUhkKGRbZSsyND4+MF18MHwwLDAsOCl8MDt4PUM7eT1IZCh5JjI1NXwwLDAsMTYpfDA7eD1IZChOfEZ8eXwwLHh8Q3wwLDUpfDA7eT1DO0Y9YVtlKzI4Pj4wXXwwO049ZFtlKzI2Pj4wXXwwO2c9SGQoZFtlKzI3Pj4wXXwwfDAsMCw4KXwwO0c9QztGPUhkKEYmMjU1fDAsMCwxNil8MDtHPUhkKGd8TnxGfDAsR3xDfDAsNCl8MDtGPUM7Tj1lKzMxfDA7Zz1hW04+PjBdfDA7RD1kW2UrMjk+PjBdfDA7dj1IZChkW2UrMzA+PjBdfDB8MCwwLDgpfDA7Qj1DO2c9SGQoZyYyNTV8MCwwLDE2KXwwO0I9SGQodnxEfGd8MCxCfEN8MCwyKXwwO0I9QiYzMzU1NDQyODtnPURkKEJ8MCwwLDE2Nzc3MjE2LDApfDA7Zz1HZChnfDAsQ3wwLDI1KXwwO0Q9Qzt2PUNkKDAsMCxnfDAsRHwwKXwwO0o9RGQodiYxOXwwLDAsTXxUfHJ8c3wwLEp8MCl8MDtzPUM7RD1IZChnfDAsRHwwLDI1KXwwO2c9QztyPURkKEt8MCxJfDAsMTY3NzcyMTYsMCl8MDtyPUdkKHJ8MCxDfDAsMjUpfDA7VD1DO0w9RGQod3wwLEx8MCxyfDAsVHwwKXwwO3c9QztUPUhkKHJ8MCxUfDAsMjUpfDA7VD1DZChLfDAsSXwwLFR8MCxDfDApfDA7ST1DO0s9RGQobnwwLHB8MCwxNjc3NzIxNiwwKXwwO0s9R2QoS3wwLEN8MCwyNSl8MDtyPUM7Zj1EZChBfDAsZnwwLEt8MCxyfDApfDA7QT1DO3I9SGQoS3wwLHJ8MCwyNSl8MDtLPUM7TT1EZCh0fDAsdXwwLDE2Nzc3MjE2LDApfDA7TT1HZChNfDAsQ3wwLDI1KXwwO3Y9QztoPURkKEV8MCxofDAsTXwwLHZ8MCl8MDtFPUM7dj1IZChNfDAsdnwwLDI1KXwwO009QztlPURkKHh8MCx5fDAsMTY3NzcyMTYsMCl8MDtlPUdkKGV8MCxDfDAsMjUpfDA7ej1DO0Y9RGQoR3wwLEZ8MCxlfDAsenwwKXwwO0c9Qzt6PUhkKGV8MCx6fDAsMjUpfDA7ZT1DO1M9RGQoSnwwLHN8MCwzMzU1NDQzMiwwKXwwO1M9RWQoU3wwLEN8MCwyNil8MDtIPUM7ST1EZChUfDAsSXwwLFN8MCxIfDApfDA7SD1IZChTfDAsSHwwLDI2KXwwO0g9Q2QoSnwwLHN8MCxIfDAsQ3wwKXwwO3M9RGQoTHwwLHd8MCwzMzU1NDQzMiwwKXwwO3M9RWQoc3wwLEN8MCwyNil8MDtKPUM7cD1EZChzfDAsSnwwLG58MCxwfDApfDA7Sz1DZChwfDAsQ3wwLHJ8MCxLfDApfDA7Sj1IZChzfDAsSnwwLDI2KXwwO0o9Q2QoTHwwLHd8MCxKfDAsQ3wwKXwwO3c9RGQoZnwwLEF8MCwzMzU1NDQzMiwwKXwwO3c9RWQod3wwLEN8MCwyNil8MDtMPUM7dT1EZCh3fDAsTHwwLHR8MCx1fDApfDA7TT1DZCh1fDAsQ3wwLHZ8MCxNfDApfDA7TD1IZCh3fDAsTHwwLDI2KXwwO0w9Q2QoZnwwLEF8MCxMfDAsQ3wwKXwwO0E9RGQoaHwwLEV8MCwzMzU1NDQzMiwwKXwwO0E9RWQoQXwwLEN8MCwyNil8MDtmPUM7eT1EZChBfDAsZnwwLHh8MCx5fDApfDA7ZT1DZCh5fDAsQ3wwLHp8MCxlfDApfDA7Zj1IZChBfDAsZnwwLDI2KXwwO2Y9Q2QoaHwwLEV8MCxmfDAsQ3wwKXwwO0U9RGQoRnwwLEd8MCwzMzU1NDQzMiwwKXwwO0U9RWQoRXwwLEN8MCwyNil8MDtoPUM7Qj1EZChCfDAsMCxFfDAsaHwwKXwwO2c9Q2QoQnwwLEN8MCxEfDAsZ3wwKXwwO2g9SGQoRXwwLGh8MCwyNil8MDtoPUNkKEZ8MCxHfDAsaHwwLEN8MCl8MDtjW08+PjJdPUg7Y1tiKzQ0Pj4yXT1JO2NbYis0OD4+Ml09SjtjW2IrNTI+PjJdPUs7Y1tiKzU2Pj4yXT1MO2NbYis2MD4+Ml09TTtjW2IrNjQ+PjJdPWY7Y1tiKzY4Pj4yXT1lO2NbYis3Mj4+Ml09aDtjW2IrNzY+PjJdPWc7Zz1iKzgwfDA7Y1tnPj4yXT0xO2g9Yis4NHwwO2U9aDtmPWUrMzZ8MDtkb3tjW2U+PjJdPTA7ZT1lKzR8MH13aGlsZSgoZXwwKTwoZnwwKSk7S2MocSxPKTtKYyhsLHEsMTA2NCk7Zj1xKzR8MDtuPXErOHwwO3A9cSsxMnwwO3I9cSsxNnwwO3M9cSsyMHwwO3Y9cSsyNHwwO3g9cSsyOHwwO3o9cSszMnwwO0I9cSszNnwwO2c9Y1tnPj4yXXwwO3Q9Y1toPj4yXXwwO3c9Y1tiKzg4Pj4yXXwwO0E9Y1tiKzkyPj4yXXwwO0U9Y1tiKzk2Pj4yXXwwO0c9Y1tiKzEwMD4+Ml18MDtJPWNbYisxMDQ+PjJdfDA7Sz1jW2IrMTA4Pj4yXXwwO009Y1tiKzExMj4+Ml18MDtUPWNbYisxMTY+PjJdfDA7ZT0oY1tmPj4yXXwwKS10fDA7Uz0oY1tuPj4yXXwwKS13fDA7TD0oY1twPj4yXXwwKS1BfDA7Sj0oY1tyPj4yXXwwKS1FfDA7SD0oY1tzPj4yXXwwKS1HfDA7Rj0oY1t2Pj4yXXwwKS1JfDA7RD0oY1t4Pj4yXXwwKS1LfDA7eT0oY1t6Pj4yXXwwKS1NfDA7dT0oY1tCPj4yXXwwKS1UfDA7Y1txPj4yXT0oY1txPj4yXXwwKS1nO2NbZj4+Ml09ZTtjW24+PjJdPVM7Y1twPj4yXT1MO2Nbcj4+Ml09SjtjW3M+PjJdPUg7Y1t2Pj4yXT1GO2NbeD4+Ml09RDtjW3o+PjJdPXk7Y1tCPj4yXT11O3U9bCs0fDA7eT1sKzh8MDtEPWwrMTJ8MDtGPWwrMTZ8MDtIPWwrMjB8MDtKPWwrMjR8MDtMPWwrMjh8MDtTPWwrMzJ8MDtlPWwrMzZ8MDt0PXQrKGNbdT4+Ml18MCl8MDt3PXcrKGNbeT4+Ml18MCl8MDtBPUErKGNbRD4+Ml18MCl8MDtFPUUrKGNbRj4+Ml18MCl8MDtHPUcrKGNbSD4+Ml18MCl8MDtJPUkrKGNbSj4+Ml18MCl8MDtLPUsrKGNbTD4+Ml18MCl8MDtNPU0rKGNbUz4+Ml18MCl8MDtUPVQrKGNbZT4+Ml18MCl8MDtjW2w+PjJdPWcrKGNbbD4+Ml18MCk7Y1t1Pj4yXT10O2NbeT4+Ml09dztjW0Q+PjJdPUE7Y1tGPj4yXT1FO2NbSD4+Ml09RztjW0o+PjJdPUk7Y1tMPj4yXT1LO2NbUz4+Ml09TTtjW2U+PjJdPVQ7S2MobSxsKTtKYyhtLG0sbCk7S2MoYixtKTtKYyhiLGIsbCk7SmMoYixiLHEpO0tjKFEsYik7S2MoayxRKTtLYyhrLGspO0pjKGssYixrKTtKYyhRLFEsayk7S2MoUSxRKTtKYyhRLGssUSk7S2MoayxRKTtLYyhrLGspO0tjKGssayk7S2MoayxrKTtLYyhrLGspO0pjKFEsayxRKTtLYyhrLFEpO0tjKGssayk7S2MoayxrKTtLYyhrLGspO0tjKGssayk7S2MoayxrKTtLYyhrLGspO0tjKGssayk7S2MoayxrKTtLYyhrLGspO0pjKGssayxRKTtLYyhqLGspO0tjKGosaik7S2MoaixqKTtLYyhqLGopO0tjKGosaik7S2MoaixqKTtLYyhqLGopO0tjKGosaik7S2MoaixqKTtLYyhqLGopO0tjKGosaik7S2MoaixqKTtLYyhqLGopO0tjKGosaik7S2MoaixqKTtLYyhqLGopO0tjKGosaik7S2MoaixqKTtLYyhqLGopO0tjKGosaik7SmMoayxqLGspO0tjKGssayk7S2MoayxrKTtLYyhrLGspO0tjKGssayk7S2MoayxrKTtLYyhrLGspO0tjKGssayk7S2MoayxrKTtLYyhrLGspO0tjKGssayk7SmMoUSxrLFEpO0tjKGssUSk7ZT0xO2Rve0tjKGssayk7ZT1lKzF8MH13aGlsZSgoZXwwKSE9NTApO0pjKGssayxRKTtLYyhqLGspO2U9MTtkb3tLYyhqLGopO2U9ZSsxfDB9d2hpbGUoKGV8MCkhPTEwMCk7SmMoayxqLGspO0tjKGssayk7ZT0xO2Rve0tjKGssayk7ZT1lKzF8MH13aGlsZSgoZXwwKSE9NTApO0pjKFEsayxRKTtLYyhRLFEpO0tjKFEsUSk7SmMoYixRLGIpO0pjKGIsYixtKTtKYyhiLGIscSk7S2MobyxiKTtKYyhvLG8sbCk7RT1jW28+PjJdfDA7Rj1jW28rND4+Ml18MDtHPWNbbys4Pj4yXXwwO0g9Y1tvKzEyPj4yXXwwO0k9Y1tvKzE2Pj4yXXwwO0o9Y1tvKzIwPj4yXXwwO0s9Y1tvKzI0Pj4yXXwwO0w9Y1tvKzI4Pj4yXXwwO009Y1tvKzMyPj4yXXwwO0Q9Y1tvKzM2Pj4yXXwwO0E9Y1txPj4yXXwwO3k9Y1tmPj4yXXwwO3c9Y1tuPj4yXXwwO3U9Y1twPj4yXXwwO3Q9Y1tyPj4yXXwwO3M9Y1tzPj4yXXwwO3I9Y1t2Pj4yXXwwO3E9Y1t4Pj4yXXwwO3A9Y1t6Pj4yXXwwO2U9Y1tCPj4yXXwwO2NbUD4+Ml09RS1BO2Y9UCs0fDA7Y1tmPj4yXT1GLXk7Zz1QKzh8MDtjW2c+PjJdPUctdztoPVArMTJ8MDtjW2g+PjJdPUgtdTtqPVArMTZ8MDtjW2o+PjJdPUktdDtrPVArMjB8MDtjW2s+PjJdPUotcztsPVArMjR8MDtjW2w+PjJdPUstcjttPVArMjh8MDtjW20+PjJdPUwtcTtuPVArMzJ8MDtjW24+PjJdPU0tcDtvPVArMzZ8MDtjW28+PjJdPUQtZTtMYyhRLFApO2RvIGlmKFljKFEsMzMwMDQpfDApe2NbUD4+Ml09QStFO2NbZj4+Ml09eStGO2NbZz4+Ml09dytHO2NbaD4+Ml09dStIO2Nbaj4+Ml09dCtJO2Nbaz4+Ml09cytKO2NbbD4+Ml09citLO2NbbT4+Ml09cStMO2Nbbj4+Ml09cCtNO2Nbbz4+Ml09ZStEO0xjKFEsUCk7aWYoIShZYyhRLDMzMDA0KXwwKSl7SmMoYixiLDExMDQpO2JyZWFrfWVsc2V7VD0tMTtpPVI7cmV0dXJuIFR8MH19d2hpbGUoMCk7TGMoUSxiKTtpZigoKGRbUT4+MF18MCkmMXwwKT09KChkW04+PjBdfDApPj4+N3wwKSl7QT1iKzR8MDtEPWIrOHwwO0Y9YisxMnwwO0g9YisxNnwwO0o9YisyMHwwO0w9YisyNHwwO049YisyOHwwO1E9YiszMnwwO1Q9YiszNnwwO3o9MC0oY1tBPj4yXXwwKXwwO0I9MC0oY1tEPj4yXXwwKXwwO0U9MC0oY1tGPj4yXXwwKXwwO0c9MC0oY1tIPj4yXXwwKXwwO0k9MC0oY1tKPj4yXXwwKXwwO0s9MC0oY1tMPj4yXXwwKXwwO009MC0oY1tOPj4yXXwwKXwwO1A9MC0oY1tRPj4yXXwwKXwwO1M9MC0oY1tUPj4yXXwwKXwwO2NbYj4+Ml09MC0oY1tiPj4yXXwwKTtjW0E+PjJdPXo7Y1tEPj4yXT1CO2NbRj4+Ml09RTtjW0g+PjJdPUc7Y1tKPj4yXT1JO2NbTD4+Ml09SztjW04+PjJdPU07Y1tRPj4yXT1QO2NbVD4+Ml09U31KYyhiKzEyMHwwLGIsTyk7VD0wO2k9UjtyZXR1cm4gVHwwfWZ1bmN0aW9uIE9jKGEsYixkKXthPWF8MDtiPWJ8MDtkPWR8MDt2YXIgZT0wLGY9MCxnPTAsaD0wLGk9MCxqPTAsaz0wLGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MCx2PTAsdz0wLHg9MCx5PTAsej0wLEE9MCxCPTAsQz0wLEQ9MCxFPTAsRj0wLEc9MCxIPTAsST0wLEo9MCxLPTAsTD0wLE09MCxOPTAsTz0wLFA9MCxRPTAsUj0wLFM9MCxUPTAsVT0wLFY9MCxXPTAsWD0wLFk9MCxaPTAsXz0wLCQ9MCxhYT0wLGJhPTAsY2E9MCxkYT0wLGVhPTAsZmE9MCxnYT0wLGhhPTA7Vj1iKzQwfDA7aj1iKzQ0fDA7bT1iKzQ4fDA7cD1iKzUyfDA7cz1iKzU2fDA7dj1iKzYwfDA7eT1iKzY0fDA7Qj1iKzY4fDA7RT1iKzcyfDA7Qz1iKzc2fDA7Uz1iKzR8MDtQPWIrOHwwO2U9YisxMnwwO2w9YisxNnwwO249YisyMHwwO3U9YisyNHwwO3c9YisyOHwwO0Q9YiszMnwwO089YiszNnwwO2dhPShjW1M+PjJdfDApKyhjW2o+PjJdfDApfDA7ZmE9KGNbUD4+Ml18MCkrKGNbbT4+Ml18MCl8MDtlYT0oY1tlPj4yXXwwKSsoY1twPj4yXXwwKXwwO2RhPShjW2w+PjJdfDApKyhjW3M+PjJdfDApfDA7Y2E9KGNbbj4+Ml18MCkrKGNbdj4+Ml18MCl8MDtiYT0oY1t1Pj4yXXwwKSsoY1t5Pj4yXXwwKXwwO2FhPShjW3c+PjJdfDApKyhjW0I+PjJdfDApfDA7JD0oY1tEPj4yXXwwKSsoY1tFPj4yXXwwKXwwO1k9KGNbTz4+Ml18MCkrKGNbQz4+Ml18MCl8MDtjW2E+PjJdPShjW2I+PjJdfDApKyhjW1Y+PjJdfDApO2hhPWErNHwwO2NbaGE+PjJdPWdhO2dhPWErOHwwO2NbZ2E+PjJdPWZhO2ZhPWErMTJ8MDtjW2ZhPj4yXT1lYTtlYT1hKzE2fDA7Y1tlYT4+Ml09ZGE7ZGE9YSsyMHwwO2NbZGE+PjJdPWNhO2NhPWErMjR8MDtjW2NhPj4yXT1iYTtiYT1hKzI4fDA7Y1tiYT4+Ml09YWE7YWE9YSszMnwwO2NbYWE+PjJdPSQ7JD1hKzM2fDA7Y1skPj4yXT1ZO1k9YSs0MHwwO1M9KGNbaj4+Ml18MCktKGNbUz4+Ml18MCl8MDtQPShjW20+PjJdfDApLShjW1A+PjJdfDApfDA7ZT0oY1twPj4yXXwwKS0oY1tlPj4yXXwwKXwwO2w9KGNbcz4+Ml18MCktKGNbbD4+Ml18MCl8MDtuPShjW3Y+PjJdfDApLShjW24+PjJdfDApfDA7dT0oY1t5Pj4yXXwwKS0oY1t1Pj4yXXwwKXwwO3c9KGNbQj4+Ml18MCktKGNbdz4+Ml18MCl8MDtEPShjW0U+PjJdfDApLShjW0Q+PjJdfDApfDA7Tz0oY1tDPj4yXXwwKS0oY1tPPj4yXXwwKXwwO2NbWT4+Ml09KGNbVj4+Ml18MCktKGNbYj4+Ml18MCk7Vj1hKzQ0fDA7Y1tWPj4yXT1TO1M9YSs0OHwwO2NbUz4+Ml09UDtQPWErNTJ8MDtjW1A+PjJdPWU7ZT1hKzU2fDA7Y1tlPj4yXT1sO2w9YSs2MHwwO2NbbD4+Ml09bjtuPWErNjR8MDtjW24+PjJdPXU7dT1hKzY4fDA7Y1t1Pj4yXT13O3c9YSs3MnwwO2Nbdz4+Ml09RDtEPWErNzZ8MDtjW0Q+PjJdPU87Tz1hKzgwfDA7SmMoTyxhLGQpO0pjKFksWSxkKzQwfDApO0M9YSsxMjB8MDtKYyhDLGQrODB8MCxiKzEyMHwwKTtFPWNbYis4MD4+Ml08PDE7Qj1jW2IrODQ+PjJdPDwxO3k9Y1tiKzg4Pj4yXTw8MTt2PWNbYis5Mj4+Ml08PDE7cz1jW2IrOTY+PjJdPDwxO3A9Y1tiKzEwMD4+Ml08PDE7bT1jW2IrMTA0Pj4yXTw8MTtqPWNbYisxMDg+PjJdPDwxO2c9Y1tiKzExMj4+Ml08PDE7Yj1jW2IrMTE2Pj4yXTw8MTtaPWNbTz4+Ml18MDtOPWErODR8MDtXPWNbTj4+Ml18MDtNPWErODh8MDtUPWNbTT4+Ml18MDtMPWErOTJ8MDtRPWNbTD4+Ml18MDtLPWErOTZ8MDtmPWNbSz4+Ml18MDtKPWErMTAwfDA7aD1jW0o+PjJdfDA7ST1hKzEwNHwwO289Y1tJPj4yXXwwO0g9YSsxMDh8MDtxPWNbSD4+Ml18MDtHPWErMTEyfDA7eD1jW0c+PjJdfDA7Rj1hKzExNnwwO3o9Y1tGPj4yXXwwO189Y1tZPj4yXXwwO1g9Y1tWPj4yXXwwO1U9Y1tTPj4yXXwwO1I9Y1tQPj4yXXwwO2Q9Y1tlPj4yXXwwO2k9Y1tsPj4yXXwwO2s9Y1tuPj4yXXwwO3I9Y1t1Pj4yXXwwO3Q9Y1t3Pj4yXXwwO0E9Y1tEPj4yXXwwO2NbYT4+Ml09Wi1fO2NbaGE+PjJdPVctWDtjW2dhPj4yXT1ULVU7Y1tmYT4+Ml09US1SO2NbZWE+PjJdPWYtZDtjW2RhPj4yXT1oLWk7Y1tjYT4+Ml09by1rO2NbYmE+PjJdPXEtcjtjW2FhPj4yXT14LXQ7Y1skPj4yXT16LUE7Y1tZPj4yXT1fK1o7Y1tWPj4yXT1YK1c7Y1tTPj4yXT1VK1Q7Y1tQPj4yXT1SK1E7Y1tlPj4yXT1kK2Y7Y1tsPj4yXT1pK2g7Y1tuPj4yXT1rK287Y1t1Pj4yXT1yK3E7Y1t3Pj4yXT10K3g7Y1tEPj4yXT1BK3o7RD1jW0M+PjJdfDA7ej1hKzEyNHwwO0E9Y1t6Pj4yXXwwO3c9YSsxMjh8MDt4PWNbdz4+Ml18MDt0PWErMTMyfDA7dT1jW3Q+PjJdfDA7cT1hKzEzNnwwO3I9Y1txPj4yXXwwO249YSsxNDB8MDtvPWNbbj4+Ml18MDtrPWErMTQ0fDA7bD1jW2s+PjJdfDA7aD1hKzE0OHwwO2k9Y1toPj4yXXwwO2U9YSsxNTJ8MDtmPWNbZT4+Ml18MDthPWErMTU2fDA7ZD1jW2E+PjJdfDA7Y1tPPj4yXT1EK0U7Y1tOPj4yXT1BK0I7Y1tNPj4yXT14K3k7Y1tMPj4yXT11K3Y7Y1tLPj4yXT1yK3M7Y1tKPj4yXT1vK3A7Y1tJPj4yXT1sK207Y1tIPj4yXT1pK2o7Y1tHPj4yXT1mK2c7Y1tGPj4yXT1kK2I7Y1tDPj4yXT1FLUQ7Y1t6Pj4yXT1CLUE7Y1t3Pj4yXT15LXg7Y1t0Pj4yXT12LXU7Y1txPj4yXT1zLXI7Y1tuPj4yXT1wLW87Y1trPj4yXT1tLWw7Y1toPj4yXT1qLWk7Y1tlPj4yXT1nLWY7Y1thPj4yXT1iLWQ7cmV0dXJufWZ1bmN0aW9uIFBjKGEsYil7YT1hfDA7Yj1ifDA7dmFyIGQ9MCxlPTAsZj0wLGc9MCxoPTAsaj0wLGs9MCxsPTAsbT0wLG49MCxvPTAscD0wLHE9MCxyPTAscz0wLHQ9MCx1PTAsdj0wLHc9MCx4PTAseT0wLHo9MCxBPTAsQj0wLEQ9MCxFPTAsRj0wLEc9MCxIPTAsST0wLEo9MCxLPTAsTD0wLE09MCxOPTAsTz0wLFA9MCxRPTAsUj0wLFM9MCxUPTAsVT0wLFY9MCxXPTAsWD0wLFk9MCxaPTAsXz0wLCQ9MCxhYT0wLGJhPTAsY2E9MCxkYT0wLGVhPTAsZmE9MCxnYT0wLGhhPTAsaWE9MCxqYT0wLGthPTAsbGE9MCxtYT0wLG5hPTAsb2E9MCxwYT0wLHFhPTAscmE9MCxzYT0wLHRhPTAsdWE9MCx2YT0wLHdhPTAseGE9MCx5YT0wLHphPTAsQWE9MCxCYT0wLENhPTAsRGE9MCxFYT0wLEZhPTAsR2E9MCxIYT0wLElhPTAsSmE9MCxLYT0wLExhPTAsTWE9MCxOYT0wLE9hPTAsUGE9MCxRYT0wLFJhPTAsU2E9MCxUYT0wLFVhPTAsVmE9MCxXYT0wLFhhPTAsWWE9MCxaYT0wLF9hPTAsJGE9MCxhYj0wLGJiPTAsY2I9MCxkYj0wLGViPTAsZmI9MCxnYj0wLGhiPTAsaWI9MCxqYj0wLGtiPTAsbGI9MCxtYj0wLG5iPTA7ZD1pO1M9aT1pKzYzJi02NDtpPWkrNDh8MDtLYyhhLGIpO2FhPWErODB8MDt0YT1iKzQwfDA7S2MoYWEsdGEpO3Y9YSsxMjB8MDtpYj1jW2IrODA+PjJdfDA7U2E9Y1tiKzg0Pj4yXXwwO3A9Y1tiKzg4Pj4yXXwwO3g9Y1tiKzkyPj4yXXwwO2Y9Y1tiKzk2Pj4yXXwwO2tiPWNbYisxMDA+PjJdfDA7Xz1jW2IrMTA0Pj4yXXwwO3dhPWNbYisxMDg+PjJdfDA7bD1jW2IrMTEyPj4yXXwwO3VhPWNbYisxMTY+PjJdfDA7dD1pYjw8MTtyYT1TYTw8MTtjYj1wPDwxO2c9eDw8MTtNYT1mPDwxO2U9a2I8PDE7dmE9Xzw8MTtuPXdhPDwxO2JiPWtiKjM4fDA7UWE9XyoxOXwwO1E9d2EqMzh8MDtIPWwqMTl8MDtuYj11YSozOHwwO2piPSgoaWJ8MCk8MCk8PDMxPj4zMTtqYj1PZChpYnwwLGpifDAsaWJ8MCxqYnwwKXwwO2liPUM7cWE9KCh0fDApPDApPDwzMT4+MzE7VGE9KChTYXwwKTwwKTw8MzE+PjMxOyRhPU9kKHR8MCxxYXwwLFNhfDAsVGF8MCl8MDtfYT1DO3I9KChwfDApPDApPDwzMT4+MzE7VmE9T2QocHwwLHJ8MCx0fDAscWF8MCl8MDtVYT1DO1I9KCh4fDApPDApPDwzMT4+MzE7TGE9T2QoeHwwLFJ8MCx0fDAscWF8MCl8MDtLYT1DO2thPSgoZnwwKTwwKTw8MzE+PjMxO3phPU9kKGZ8MCxrYXwwLHR8MCxxYXwwKXwwO3lhPUM7bGI9KChrYnwwKTwwKTw8MzE+PjMxO0s9T2Qoa2J8MCxsYnwwLHR8MCxxYXwwKXwwO009QztqPSgoX3wwKTwwKTw8MzE+PjMxO2s9T2QoX3wwLGp8MCx0fDAscWF8MCl8MDtGPUM7eGE9KCh3YXwwKTwwKTw8MzE+PjMxO3U9T2Qod2F8MCx4YXwwLHR8MCxxYXwwKXwwO1A9QzttYT0oKGx8MCk8MCk8PDMxPj4zMTtXPU9kKGx8MCxtYXwwLHR8MCxxYXwwKXwwO2ZhPUM7b2E9KCh1YXwwKTwwKTw8MzE+PjMxO3FhPU9kKHVhfDAsb2F8MCx0fDAscWF8MCl8MDt0PUM7cGE9KChyYXwwKTwwKTw8MzE+PjMxO1RhPU9kKHJhfDAscGF8MCxTYXwwLFRhfDApfDA7U2E9QztKYT1PZChyYXwwLHBhfDAscHwwLHJ8MCl8MDtJYT1DO2phPSgoZ3wwKTwwKTw8MzE+PjMxO0RhPU9kKGd8MCxqYXwwLHJhfDAscGF8MCl8MDtDYT1DO0I9T2QoZnwwLGthfDAscmF8MCxwYXwwKXwwO0U9QztsYT0oKGV8MCk8MCk8PDMxPj4zMTtoPU9kKGV8MCxsYXwwLHJhfDAscGF8MCl8MDtEPUM7cz1PZChffDAsanwwLHJhfDAscGF8MCl8MDtOPUM7JD0oKG58MCk8MCk8PDMxPj4zMTtWPU9kKG58MCwkfDAscmF8MCxwYXwwKXwwO2VhPUM7c2E9T2QobHwwLG1hfDAscmF8MCxwYXwwKXwwO25hPUM7bWI9KChuYnwwKTwwKTw8MzE+PjMxO3BhPU9kKG5ifDAsbWJ8MCxyYXwwLHBhfDApfDA7cmE9QztCYT1PZChwfDAscnwwLHB8MCxyfDApfDA7QWE9QztkYj0oKGNifDApPDApPDwzMT4+MzE7Rz1PZChjYnwwLGRifDAseHwwLFJ8MCl8MDtJPUM7eT1PZChmfDAsa2F8MCxjYnwwLGRifDApfDA7QT1DO289T2Qoa2J8MCxsYnwwLGNifDAsZGJ8MCl8MDtKPUM7dz1PZChffDAsanwwLGNifDAsZGJ8MCl8MDtiYT1DO1o9T2Qod2F8MCx4YXwwLGNifDAsZGJ8MCl8MDtpYT1DO209KChIfDApPDApPDwzMT4+MzE7ZGI9T2QoSHwwLG18MCxjYnwwLGRifDApfDA7Y2I9QztyPU9kKG5ifDAsbWJ8MCxwfDAscnwwKXwwO3A9QztSPU9kKGd8MCxqYXwwLHh8MCxSfDApfDA7eD1DO3E9T2QoZ3wwLGphfDAsZnwwLGthfDApfDA7TD1DO1U9T2QoZXwwLGxhfDAsZ3wwLGphfDApfDA7ZGE9QztYPU9kKF98MCxqfDAsZ3wwLGphfDApfDA7Z2E9QztPPSgoUXwwKTwwKTw8MzE+PjMxO2ZiPU9kKFF8MCxPfDAsZ3wwLGphfDApfDA7ZWI9QztYYT1PZChIfDAsbXwwLGd8MCxqYXwwKXwwO1dhPUM7amE9T2QobmJ8MCxtYnwwLGd8MCxqYXwwKXwwO2c9QztUPU9kKGZ8MCxrYXwwLGZ8MCxrYXwwKXwwO2NhPUM7TmE9KChNYXwwKTwwKTw8MzE+PjMxO1k9T2QoTWF8MCxOYXwwLGtifDAsbGJ8MCl8MDtoYT1DO1JhPSgoUWF8MCk8MCk8PDMxPj4zMTtoYj1PZChRYXwwLFJhfDAsTWF8MCxOYXwwKXwwO2diPUM7WmE9T2QoUXwwLE98MCxmfDAsa2F8MCl8MDtZYT1DO05hPU9kKEh8MCxtfDAsTWF8MCxOYXwwKXwwO01hPUM7a2E9T2QobmJ8MCxtYnwwLGZ8MCxrYXwwKXwwO2Y9QztsYj1PZChiYnwwLCgoYmJ8MCk8MCk8PDMxPj4zMXwwLGtifDAsbGJ8MCl8MDtrYj1DO2JiPU9kKFFhfDAsUmF8MCxlfDAsbGF8MCl8MDthYj1DO1BhPU9kKFF8MCxPfDAsZXwwLGxhfDApfDA7T2E9QztGYT1PZChIfDAsbXwwLGV8MCxsYXwwKXwwO0VhPUM7bGE9T2QobmJ8MCxtYnwwLGV8MCxsYXwwKXwwO2U9QztSYT1PZChRYXwwLFJhfDAsX3wwLGp8MCl8MDtRYT1DO0hhPU9kKFF8MCxPfDAsX3wwLGp8MCl8MDtHYT1DO3ZhPU9kKEh8MCxtfDAsdmF8MCwoKHZhfDApPDApPDwzMT4+MzF8MCl8MDt6PUM7aj1PZChuYnwwLG1ifDAsX3wwLGp8MCl8MDtfPUM7eGE9T2QoUXwwLE98MCx3YXwwLHhhfDApfDA7d2E9QztPPU9kKEh8MCxtfDAsbnwwLCR8MCl8MDtRPUM7JD1PZChuYnwwLG1ifDAsbnwwLCR8MCl8MDtuPUM7bT1PZChIfDAsbXwwLGx8MCxtYXwwKXwwO0g9QzttYT1PZChuYnwwLG1ifDAsbHwwLG1hfDApfDA7bD1DO29hPU9kKG5ifDAsbWJ8MCx1YXwwLG9hfDApfDA7dWE9QztpYj1EZChsYnwwLGtifDAsamJ8MCxpYnwwKXwwO2diPURkKGlifDAsQ3wwLGhifDAsZ2J8MCl8MDtlYj1EZChnYnwwLEN8MCxmYnwwLGVifDApfDA7Y2I9RGQoZWJ8MCxDfDAsZGJ8MCxjYnwwKXwwO3JhPURkKGNifDAsQ3wwLHBhfDAscmF8MCl8MDtwYT1DO19hPURkKGJifDAsYWJ8MCwkYXwwLF9hfDApfDA7WWE9RGQoX2F8MCxDfDAsWmF8MCxZYXwwKXwwO1dhPURkKFlhfDAsQ3wwLFhhfDAsV2F8MCl8MDtwPURkKFdhfDAsQ3wwLHJ8MCxwfDApfDA7cj1DO1NhPURkKFZhfDAsVWF8MCxUYXwwLFNhfDApfDA7UWE9RGQoU2F8MCxDfDAsUmF8MCxRYXwwKXwwO09hPURkKFFhfDAsQ3wwLFBhfDAsT2F8MCl8MDtNYT1EZChPYXwwLEN8MCxOYXwwLE1hfDApfDA7Zz1EZChNYXwwLEN8MCxqYXwwLGd8MCl8MDtqYT1DO0lhPURkKExhfDAsS2F8MCxKYXwwLElhfDApfDA7R2E9RGQoSWF8MCxDfDAsSGF8MCxHYXwwKXwwO0VhPURkKEdhfDAsQ3wwLEZhfDAsRWF8MCl8MDtmPURkKEVhfDAsQ3wwLGthfDAsZnwwKXwwO2thPUM7QWE9RGQoRGF8MCxDYXwwLEJhfDAsQWF8MCl8MDt5YT1EZChBYXwwLEN8MCx6YXwwLHlhfDApfDA7d2E9RGQoeWF8MCxDfDAseGF8MCx3YXwwKXwwO3o9RGQod2F8MCxDfDAsdmF8MCx6fDApfDA7ZT1EZCh6fDAsQ3wwLGxhfDAsZXwwKXwwO2xhPUM7ST1EZChCfDAsRXwwLEd8MCxJfDApfDA7TT1EZChJfDAsQ3wwLEt8MCxNfDApfDA7UT1EZChNfDAsQ3wwLE98MCxRfDApfDA7Xz1EZChRfDAsQ3wwLGp8MCxffDApfDA7aj1DO0E9RGQoUnwwLHh8MCx5fDAsQXwwKXwwO0Q9RGQoQXwwLEN8MCxofDAsRHwwKXwwO0Y9RGQoRHwwLEN8MCxrfDAsRnwwKXwwO0g9RGQoRnwwLEN8MCxtfDAsSHwwKXwwO249RGQoSHwwLEN8MCwkfDAsbnwwKXwwOyQ9QztMPURkKG98MCxKfDAscXwwLEx8MCl8MDtOPURkKEx8MCxDfDAsc3wwLE58MCl8MDtQPURkKE58MCxDfDAsdXwwLFB8MCl8MDtsPURkKFB8MCxDfDAsbWF8MCxsfDApfDA7bWE9QztjYT1EZCh3fDAsYmF8MCxUfDAsY2F8MCl8MDtkYT1EZChjYXwwLEN8MCxVfDAsZGF8MCl8MDtlYT1EZChkYXwwLEN8MCxWfDAsZWF8MCl8MDtmYT1EZChlYXwwLEN8MCxXfDAsZmF8MCl8MDt1YT1EZChmYXwwLEN8MCxvYXwwLHVhfDApfDA7b2E9QztoYT1EZChYfDAsZ2F8MCxZfDAsaGF8MCl8MDtpYT1EZChoYXwwLEN8MCxafDAsaWF8MCl8MDtuYT1EZChpYXwwLEN8MCxzYXwwLG5hfDApfDA7dD1EZChuYXwwLEN8MCxxYXwwLHR8MCl8MDtxYT1DO3BhPUhkKHJhfDAscGF8MCwxKXwwO3JhPUM7cj1IZChwfDAscnwwLDEpfDA7cD1DO2phPUhkKGd8MCxqYXwwLDEpfDA7Zz1DO2thPUhkKGZ8MCxrYXwwLDEpfDA7Zj1DO2xhPUhkKGV8MCxsYXwwLDEpfDA7ZT1DO2o9SGQoX3wwLGp8MCwxKXwwO189QzskPUhkKG58MCwkfDAsMSl8MDtuPUM7bWE9SGQobHwwLG1hfDAsMSl8MDtsPUM7b2E9SGQodWF8MCxvYXwwLDEpfDA7dWE9QztxYT1IZCh0fDAscWF8MCwxKXwwO3Q9QztuYT1EZChwYXwwLHJhfDAsMzM1NTQ0MzIsMCl8MDtuYT1FZChuYXwwLEN8MCwyNil8MDtzYT1DO3A9RGQobmF8MCxzYXwwLHJ8MCxwfDApfDA7cj1DO3NhPUhkKG5hfDAsc2F8MCwyNil8MDtzYT1DZChwYXwwLHJhfDAsc2F8MCxDfDApfDA7cmE9QztwYT1EZChsYXwwLGV8MCwzMzU1NDQzMiwwKXwwO3BhPUVkKHBhfDAsQ3wwLDI2KXwwO25hPUM7Xz1EZChwYXwwLG5hfDAsanwwLF98MCl8MDtqPUM7bmE9SGQocGF8MCxuYXwwLDI2KXwwO25hPUNkKGxhfDAsZXwwLG5hfDAsQ3wwKXwwO2U9QztsYT1EZChwfDAscnwwLDE2Nzc3MjE2LDApfDA7bGE9RWQobGF8MCxDfDAsMjUpfDA7cGE9QztnPURkKGxhfDAscGF8MCxqYXwwLGd8MCl8MDtqYT1DO3BhPUhkKGxhfDAscGF8MCwyNSl8MDtwYT1DZChwfDAscnwwLHBhfDAsQ3wwKXwwO3I9QztwPURkKF98MCxqfDAsMTY3NzcyMTYsMCl8MDtwPUVkKHB8MCxDfDAsMjUpfDA7bGE9QztuPURkKHB8MCxsYXwwLCR8MCxufDApfDA7JD1DO2xhPUhkKHB8MCxsYXwwLDI1KXwwO2xhPUNkKF98MCxqfDAsbGF8MCxDfDApfDA7aj1DO189RGQoZ3wwLGphfDAsMzM1NTQ0MzIsMCl8MDtfPUVkKF98MCxDfDAsMjYpfDA7cD1DO2Y9RGQoX3wwLHB8MCxrYXwwLGZ8MCl8MDtrYT1DO3A9SGQoX3wwLHB8MCwyNil8MDtwPUNkKGd8MCxqYXwwLHB8MCxDfDApfDA7amE9RGQobnwwLCR8MCwzMzU1NDQzMiwwKXwwO2phPUVkKGphfDAsQ3wwLDI2KXwwO2c9QztsPURkKGphfDAsZ3wwLG1hfDAsbHwwKXwwO21hPUM7Zz1IZChqYXwwLGd8MCwyNil8MDtnPUNkKG58MCwkfDAsZ3wwLEN8MCl8MDskPURkKGZ8MCxrYXwwLDE2Nzc3MjE2LDApfDA7JD1FZCgkfDAsQ3wwLDI1KXwwO249QztlPURkKCR8MCxufDAsbmF8MCxlfDApfDA7bmE9QztuPUhkKCR8MCxufDAsMjUpfDA7bj1DZChmfDAsa2F8MCxufDAsQ3wwKXwwO2thPURkKGx8MCxtYXwwLDE2Nzc3MjE2LDApfDA7a2E9RWQoa2F8MCxDfDAsMjUpfDA7Zj1DO3VhPURkKGthfDAsZnwwLG9hfDAsdWF8MCl8MDtvYT1DO2Y9SGQoa2F8MCxmfDAsMjUpfDA7Zj1DZChsfDAsbWF8MCxmfDAsQ3wwKXwwO21hPURkKGV8MCxuYXwwLDMzNTU0NDMyLDApfDA7bWE9RWQobWF8MCxDfDAsMjYpfDA7bD1DO2o9RGQobGF8MCxqfDAsbWF8MCxsfDApfDA7bD1IZChtYXwwLGx8MCwyNil8MDtsPUNkKGV8MCxuYXwwLGx8MCxDfDApfDA7bmE9RGQodWF8MCxvYXwwLDMzNTU0NDMyLDApfDA7bmE9RWQobmF8MCxDfDAsMjYpfDA7ZT1DO3Q9RGQobmF8MCxlfDAscWF8MCx0fDApfDA7cWE9QztlPUhkKG5hfDAsZXwwLDI2KXwwO2U9Q2QodWF8MCxvYXwwLGV8MCxDfDApfDA7b2E9RGQodHwwLHFhfDAsMTY3NzcyMTYsMCl8MDtvYT1FZChvYXwwLEN8MCwyNSl8MDt1YT1DO25hPU9kKG9hfDAsdWF8MCwxOSwwKXwwO3JhPURkKG5hfDAsQ3wwLHNhfDAscmF8MCl8MDtzYT1DO3VhPUhkKG9hfDAsdWF8MCwyNSl8MDt1YT1DZCh0fDAscWF8MCx1YXwwLEN8MCl8MDtxYT1EZChyYXwwLHNhfDAsMzM1NTQ0MzIsMCl8MDtxYT1FZChxYXwwLEN8MCwyNil8MDt0PUM7cj1EZChwYXwwLHJ8MCxxYXwwLHR8MCl8MDt0PUhkKHFhfDAsdHwwLDI2KXwwO3Q9Q2QocmF8MCxzYXwwLHR8MCxDfDApfDA7Y1t2Pj4yXT10O3Q9YSsxMjR8MDtjW3Q+PjJdPXI7cj1hKzEyOHwwO2Nbcj4+Ml09cDtwPWErMTMyfDA7Y1twPj4yXT1uO249YSsxMzZ8MDtjW24+PjJdPWw7bD1hKzE0MHwwO2NbbD4+Ml09ajtqPWErMTQ0fDA7Y1tqPj4yXT1nO2c9YSsxNDh8MDtjW2c+PjJdPWY7Zj1hKzE1MnwwO2NbZj4+Ml09ZTtlPWErMTU2fDA7Y1tlPj4yXT11YTt1YT1hKzQwfDA7c2E9KGNbYis0ND4+Ml18MCkrKGNbYis0Pj4yXXwwKXwwO3JhPShjW2IrNDg+PjJdfDApKyhjW2IrOD4+Ml18MCl8MDtxYT0oY1tiKzUyPj4yXXwwKSsoY1tiKzEyPj4yXXwwKXwwO3BhPShjW2IrNTY+PjJdfDApKyhjW2IrMTY+PjJdfDApfDA7b2E9KGNbYis2MD4+Ml18MCkrKGNbYisyMD4+Ml18MCl8MDtuYT0oY1tiKzY0Pj4yXXwwKSsoY1tiKzI0Pj4yXXwwKXwwO21hPShjW2IrNjg+PjJdfDApKyhjW2IrMjg+PjJdfDApfDA7bGE9KGNbYis3Mj4+Ml18MCkrKGNbYiszMj4+Ml18MCl8MDtrYT0oY1tiKzc2Pj4yXXwwKSsoY1tiKzM2Pj4yXXwwKXwwO2NbdWE+PjJdPShjW3RhPj4yXXwwKSsoY1tiPj4yXXwwKTt0YT1hKzQ0fDA7Y1t0YT4+Ml09c2E7c2E9YSs0OHwwO2Nbc2E+PjJdPXJhO3JhPWErNTJ8MDtjW3JhPj4yXT1xYTtxYT1hKzU2fDA7Y1txYT4+Ml09cGE7cGE9YSs2MHwwO2NbcGE+PjJdPW9hO29hPWErNjR8MDtjW29hPj4yXT1uYTtuYT1hKzY4fDA7Y1tuYT4+Ml09bWE7bWE9YSs3MnwwO2NbbWE+PjJdPWxhO2xhPWErNzZ8MDtjW2xhPj4yXT1rYTtLYyhTLHVhKTtrYT1jW2FhPj4yXXwwOyQ9YSs4NHwwO2phPWNbJD4+Ml18MDtfPWErODh8MDtpYT1jW18+PjJdfDA7Wj1hKzkyfDA7aGE9Y1taPj4yXXwwO1k9YSs5NnwwO2dhPWNbWT4+Ml18MDtYPWErMTAwfDA7ZmE9Y1tYPj4yXXwwO1c9YSsxMDR8MDtlYT1jW1c+PjJdfDA7Vj1hKzEwOHwwO2RhPWNbVj4+Ml18MDtVPWErMTEyfDA7Y2E9Y1tVPj4yXXwwO1Q9YSsxMTZ8MDtiYT1jW1Q+PjJdfDA7dz1jW2E+PjJdfDA7UD1hKzR8MDt1PWNbUD4+Ml18MDtOPWErOHwwO3M9Y1tOPj4yXXwwO0w9YSsxMnwwO3E9Y1tMPj4yXXwwO0o9YSsxNnwwO289Y1tKPj4yXXwwO0g9YSsyMHwwO209Y1tIPj4yXXwwO0Y9YSsyNHwwO2s9Y1tGPj4yXXwwO0Q9YSsyOHwwO2g9Y1tEPj4yXXwwO0E9YSszMnwwO2I9Y1tBPj4yXXwwO3k9YSszNnwwO3g9Y1t5Pj4yXXwwO1I9dytrYXwwO1E9dStqYXwwO089cytpYXwwO009cStoYXwwO0s9bytnYXwwO0k9bStmYXwwO0c9aytlYXwwO0U9aCtkYXwwO0I9YitjYXwwO3o9eCtiYXwwO2NbdWE+PjJdPVI7Y1t0YT4+Ml09UTtjW3NhPj4yXT1PO2NbcmE+PjJdPU07Y1txYT4+Ml09SztjW3BhPj4yXT1JO2Nbb2E+PjJdPUc7Y1tuYT4+Ml09RTtjW21hPj4yXT1CO2NbbGE+PjJdPXo7dz1rYS13fDA7dT1qYS11fDA7cz1pYS1zfDA7cT1oYS1xfDA7bz1nYS1vfDA7bT1mYS1tfDA7az1lYS1rfDA7aD1kYS1ofDA7Yj1jYS1ifDA7eD1iYS14fDA7Y1thYT4+Ml09dztjWyQ+PjJdPXU7Y1tfPj4yXT1zO2NbWj4+Ml09cTtjW1k+PjJdPW87Y1tYPj4yXT1tO2NbVz4+Ml09aztjW1Y+PjJdPWg7Y1tVPj4yXT1iO2NbVD4+Ml09eDtRPShjW1MrND4+Ml18MCktUXwwO089KGNbUys4Pj4yXXwwKS1PfDA7TT0oY1tTKzEyPj4yXXwwKS1NfDA7Sz0oY1tTKzE2Pj4yXXwwKS1LfDA7ST0oY1tTKzIwPj4yXXwwKS1JfDA7Rz0oY1tTKzI0Pj4yXXwwKS1HfDA7RT0oY1tTKzI4Pj4yXXwwKS1FfDA7Qj0oY1tTKzMyPj4yXXwwKS1CfDA7ej0oY1tTKzM2Pj4yXXwwKS16fDA7Y1thPj4yXT0oY1tTPj4yXXwwKS1SO2NbUD4+Ml09UTtjW04+PjJdPU87Y1tMPj4yXT1NO2NbSj4+Ml09SztjW0g+PjJdPUk7Y1tGPj4yXT1HO2NbRD4+Ml09RTtjW0E+PjJdPUI7Y1t5Pj4yXT16O3U9KGNbdD4+Ml18MCktdXwwO3M9KGNbcj4+Ml18MCktc3wwO3E9KGNbcD4+Ml18MCktcXwwO289KGNbbj4+Ml18MCktb3wwO209KGNbbD4+Ml18MCktbXwwO2s9KGNbaj4+Ml18MCkta3wwO2g9KGNbZz4+Ml18MCktaHwwO2I9KGNbZj4+Ml18MCktYnwwO2E9KGNbZT4+Ml18MCkteHwwO2Nbdj4+Ml09KGNbdj4+Ml18MCktdztjW3Q+PjJdPXU7Y1tyPj4yXT1zO2NbcD4+Ml09cTtjW24+PjJdPW87Y1tsPj4yXT1tO2Nbaj4+Ml09aztjW2c+PjJdPWg7Y1tmPj4yXT1iO2NbZT4+Ml09YTtpPWQ7cmV0dXJufWZ1bmN0aW9uIFFjKGEsYil7YT1hfDA7Yj1ifDA7dmFyIGQ9MCxlPTAsZj0wLGc9MCxoPTAsaT0wLGo9MCxrPTAsbD0wLG09MCxuPTAsbz0wLHA9MCxxPTAscj0wLHM9MCx0PTAsdT0wLHY9MCx3PTAseD0wLHk9MCx6PTAsQT0wLEI9MCxDPTAsRD0wLEU9MDttPWIrNDB8MDt2PWIrNDR8MDt1PWIrNDh8MDt0PWIrNTJ8MDtzPWIrNTZ8MDtyPWIrNjB8MDtxPWIrNjR8MDtwPWIrNjh8MDtvPWIrNzJ8MDtuPWIrNzZ8MDtkPWIrNHwwO2U9Yis4fDA7Zj1iKzEyfDA7Zz1iKzE2fDA7aD1iKzIwfDA7aT1iKzI0fDA7aj1iKzI4fDA7az1iKzMyfDA7bD1iKzM2fDA7RT0oY1tkPj4yXXwwKSsoY1t2Pj4yXXwwKXwwO0Q9KGNbZT4+Ml18MCkrKGNbdT4+Ml18MCl8MDtDPShjW2Y+PjJdfDApKyhjW3Q+PjJdfDApfDA7Qj0oY1tnPj4yXXwwKSsoY1tzPj4yXXwwKXwwO0E9KGNbaD4+Ml18MCkrKGNbcj4+Ml18MCl8MDt6PShjW2k+PjJdfDApKyhjW3E+PjJdfDApfDA7eT0oY1tqPj4yXXwwKSsoY1twPj4yXXwwKXwwO3g9KGNbaz4+Ml18MCkrKGNbbz4+Ml18MCl8MDt3PShjW2w+PjJdfDApKyhjW24+PjJdfDApfDA7Y1thPj4yXT0oY1tiPj4yXXwwKSsoY1ttPj4yXXwwKTtjW2ErND4+Ml09RTtjW2ErOD4+Ml09RDtjW2ErMTI+PjJdPUM7Y1thKzE2Pj4yXT1CO2NbYSsyMD4+Ml09QTtjW2ErMjQ+PjJdPXo7Y1thKzI4Pj4yXT15O2NbYSszMj4+Ml09eDtjW2ErMzY+PjJdPXc7ZD0oY1t2Pj4yXXwwKS0oY1tkPj4yXXwwKXwwO2U9KGNbdT4+Ml18MCktKGNbZT4+Ml18MCl8MDtmPShjW3Q+PjJdfDApLShjW2Y+PjJdfDApfDA7Zz0oY1tzPj4yXXwwKS0oY1tnPj4yXXwwKXwwO2g9KGNbcj4+Ml18MCktKGNbaD4+Ml18MCl8MDtpPShjW3E+PjJdfDApLShjW2k+PjJdfDApfDA7aj0oY1twPj4yXXwwKS0oY1tqPj4yXXwwKXwwO2s9KGNbbz4+Ml18MCktKGNbaz4+Ml18MCl8MDtsPShjW24+PjJdfDApLShjW2w+PjJdfDApfDA7Y1thKzQwPj4yXT0oY1ttPj4yXXwwKS0oY1tiPj4yXXwwKTtjW2ErNDQ+PjJdPWQ7Y1thKzQ4Pj4yXT1lO2NbYSs1Mj4+Ml09ZjtjW2ErNTY+PjJdPWc7Y1thKzYwPj4yXT1oO2NbYSs2ND4+Ml09aTtjW2ErNjg+PjJdPWo7Y1thKzcyPj4yXT1rO2NbYSs3Nj4+Ml09bDtsPWNbYis4ND4+Ml18MDtrPWNbYis4OD4+Ml18MDtqPWNbYis5Mj4+Ml18MDtpPWNbYis5Nj4+Ml18MDtoPWNbYisxMDA+PjJdfDA7Zz1jW2IrMTA0Pj4yXXwwO2Y9Y1tiKzEwOD4+Ml18MDtlPWNbYisxMTI+PjJdfDA7ZD1jW2IrMTE2Pj4yXXwwO2NbYSs4MD4+Ml09Y1tiKzgwPj4yXTtjW2ErODQ+PjJdPWw7Y1thKzg4Pj4yXT1rO2NbYSs5Mj4+Ml09ajtjW2ErOTY+PjJdPWk7Y1thKzEwMD4+Ml09aDtjW2ErMTA0Pj4yXT1nO2NbYSsxMDg+PjJdPWY7Y1thKzExMj4+Ml09ZTtjW2ErMTE2Pj4yXT1kO0pjKGErMTIwfDAsYisxMjB8MCwxMTQ0KTtyZXR1cm59ZnVuY3Rpb24gUmMoYixlKXtiPWJ8MDtlPWV8MDt2YXIgZj0wLGc9MCxoPTAsaj0wLGs9MCxsPTAsbT0wLG49MCxvPTAscD0wLHE9MCxyPTAscz0wLHQ9MCx1PTAsdj0wLHc9MCx4PTAseT0wLHo9MCxBPTAsQj0wO3U9aTt0PWk9aSs2MyYtNjQ7aT1pKzU5MnwwO3A9dCs0MDB8MDtyPXQrNTIwfDA7cz10KzI0MHwwO3E9dCsxMjB8MDtmPTA7ZG97bj1hW2UrZj4+MF18MDtvPWY8PDE7YVtyK28+PjBdPW4mMTU7YVtyKyhvfDEpPj4wXT0obiYyNTUpPj4+NDtmPWYrMXwwfXdoaWxlKChmfDApIT0zMik7ZT0wO2Y9MDtkb3tvPXIrZnwwO249KGRbbz4+MF18MCkrZXwwO2U9KG48PDI0KSsxMzQyMTc3Mjg+PjI4O2Fbbz4+MF09bi0oZTw8NCk7Zj1mKzF8MH13aGlsZSgoZnwwKSE9NjMpO2Y9cis2M3wwO2FbZj4+MF09KGRbZj4+MF18MCkrZTtlPWI7Zj1lKzQwfDA7ZG97Y1tlPj4yXT0wO2U9ZSs0fDB9d2hpbGUoKGV8MCk8KGZ8MCkpO2o9Yis0MHwwO2Nbaj4+Ml09MTtnPWIrNDR8MDtlPWc7Zj1lKzM2fDA7ZG97Y1tlPj4yXT0wO2U9ZSs0fDB9d2hpbGUoKGV8MCk8KGZ8MCkpO2s9Yis4MHwwO2Nbaz4+Ml09MTtoPWIrODR8MDtsPWIrMTIwfDA7bT1zKzEyMHwwO249cys0MHwwO289cys4MHwwO2U9aDtmPWUrNzZ8MDtkb3tjW2U+PjJdPTA7ZT1lKzR8MH13aGlsZSgoZXwwKTwoZnwwKSk7ZT0xO2Rve1NjKHQsKGV8MCkvMnwwLGFbcitlPj4wXXwwKTtPYyhzLGIsdCk7SmMoYixzLG0pO0pjKGosbixvKTtKYyhrLG8sbSk7SmMobCxzLG4pO2U9ZSsyfDB9d2hpbGUoKGV8MCk8NjQpO0I9Y1tiKzQ+PjJdfDA7ej1jW2IrOD4+Ml18MDt5PWNbYisxMj4+Ml18MDt4PWNbYisxNj4+Ml18MDt3PWNbYisyMD4+Ml18MDt2PWNbYisyND4+Ml18MDtmPWNbYisyOD4+Ml18MDtlPWNbYiszMj4+Ml18MDtBPWNbYiszNj4+Ml18MDtjW3A+PjJdPWNbYj4+Ml07Y1twKzQ+PjJdPUI7Y1twKzg+PjJdPXo7Y1twKzEyPj4yXT15O2NbcCsxNj4+Ml09eDtjW3ArMjA+PjJdPXc7Y1twKzI0Pj4yXT12O2NbcCsyOD4+Ml09ZjtjW3ArMzI+PjJdPWU7Y1twKzM2Pj4yXT1BO0E9Y1tnPj4yXXwwO2U9Y1tiKzQ4Pj4yXXwwO2c9Y1tiKzUyPj4yXXwwO2Y9Y1tiKzU2Pj4yXXwwO3Y9Y1tiKzYwPj4yXXwwO3c9Y1tiKzY0Pj4yXXwwO3g9Y1tiKzY4Pj4yXXwwO3k9Y1tiKzcyPj4yXXwwO3o9Y1tiKzc2Pj4yXXwwO2NbcCs0MD4+Ml09Y1tqPj4yXTtjW3ArNDQ+PjJdPUE7Y1twKzQ4Pj4yXT1lO2NbcCs1Mj4+Ml09ZztjW3ArNTY+PjJdPWY7Y1twKzYwPj4yXT12O2NbcCs2ND4+Ml09dztjW3ArNjg+PjJdPXg7Y1twKzcyPj4yXT15O2NbcCs3Nj4+Ml09ejt6PWNbaD4+Ml18MDt5PWNbYis4OD4+Ml18MDt4PWNbYis5Mj4+Ml18MDt3PWNbYis5Nj4+Ml18MDt2PWNbYisxMDA+PjJdfDA7Zj1jW2IrMTA0Pj4yXXwwO2c9Y1tiKzEwOD4+Ml18MDtoPWNbYisxMTI+PjJdfDA7ZT1jW2IrMTE2Pj4yXXwwO2NbcCs4MD4+Ml09Y1trPj4yXTtjW3ArODQ+PjJdPXo7Y1twKzg4Pj4yXT15O2NbcCs5Mj4+Ml09eDtjW3ArOTY+PjJdPXc7Y1twKzEwMD4+Ml09djtjW3ArMTA0Pj4yXT1mO2NbcCsxMDg+PjJdPWc7Y1twKzExMj4+Ml09aDtjW3ArMTE2Pj4yXT1lO1BjKHMscCk7SmMocSxzLG0pO3A9cSs0MHwwO0pjKHAsbixvKTtlPXErODB8MDtKYyhlLG8sbSk7UGMocyxxKTtKYyhxLHMsbSk7SmMocCxuLG8pO0pjKGUsbyxtKTtQYyhzLHEpO0pjKHEscyxtKTtKYyhwLG4sbyk7SmMoZSxvLG0pO1BjKHMscSk7SmMoYixzLG0pO0pjKGosbixvKTtKYyhrLG8sbSk7SmMobCxzLG4pO2U9MDtkb3tTYyh0LChlfDApLzJ8MCxhW3IrZT4+MF18MCk7T2MocyxiLHQpO0pjKGIscyxtKTtKYyhqLG4sbyk7SmMoayxvLG0pO0pjKGwscyxuKTtlPWUrMnwwfXdoaWxlKChlfDApPDY0KTtpPXU7cmV0dXJufWZ1bmN0aW9uIFNjKGEsYixkKXthPWF8MDtiPWJ8MDtkPWR8MDt2YXIgZT0wLGY9MCxnPTAsaD0wLGk9MCxqPTAsaz0wLGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MCx2PTAsdz0wLHg9MCx5PTAsej0wLEE9MCxCPTAsQz0wLEQ9MCxFPTAsRj0wLEc9MCxIPTAsST0wLEo9MCxLPTAsTD0wLE09MCxOPTAsTz0wLFA9MCxRPTAsUj0wLFM9MCxUPTAsVT0wLFY9MCxXPTAsWD0wLFk9MCxaPTAsXz0wLCQ9MCxhYT0wLGJhPTAsY2E9MCxkYT0wLGVhPTAsZmE9MCxnYT0wLGhhPTAsaWE9MDtzPWQ8PDI0Pj4yNDtzPUdkKHN8MCwoKHN8MCk8MCk8PDMxPj4zMXwwLDYzKXwwO2g9ZDw8MjQ+PjI0O3M9MC1zfDA7ZD1hKzR8MDtjW2Q+PjJdPTA7Y1tkKzQ+PjJdPTA7Y1tkKzg+PjJdPTA7Y1tkKzEyPj4yXT0wO2NbZCsxNj4+Ml09MDtjW2QrMjA+PjJdPTA7Y1tkKzI0Pj4yXT0wO2NbZCsyOD4+Ml09MDtlPWErNDB8MDtjW2U+PjJdPTE7Zj1hKzQ0fDA7Zz1hKzgwfDA7aD1oLSgoaCZzKTw8MSkmMjU1O2k9KGheMSkrLTF8MDtqPTExODQrKGIqOTYwfDApfDA7az1hKzh8MDtsPWErMTJ8MDttPWErMTZ8MDtuPWErMjB8MDtvPWErMjR8MDtwPWErMjh8MDtxPWErMzJ8MDtyPWErMzZ8MDt0PWY7dT10Kzc2fDA7ZG97Y1t0Pj4yXT0wO3Q9dCs0fDB9d2hpbGUoKHR8MCk8KHV8MCkpO0g9aT4+MzE7QT1jWzExODQrKGIqOTYwfDApKzQ+PjJdJkg7ST1jWzExODQrKGIqOTYwfDApKzg+PjJdJkg7Sz1jWzExODQrKGIqOTYwfDApKzEyPj4yXSZIO009Y1sxMTg0KyhiKjk2MHwwKSsxNj4+Ml0mSDtPPWNbMTE4NCsoYio5NjB8MCkrMjA+PjJdJkg7UT1jWzExODQrKGIqOTYwfDApKzI0Pj4yXSZIO1M9Y1sxMTg0KyhiKjk2MHwwKSsyOD4+Ml0mSDtVPWNbMTE4NCsoYio5NjB8MCkrMzI+PjJdJkg7Vz1jWzExODQrKGIqOTYwfDApKzM2Pj4yXSZIO2NbYT4+Ml09KGNbaj4+Ml1eMSkmSF4xO2NbZD4+Ml09QTtjW2s+PjJdPUk7Y1tsPj4yXT1LO2NbbT4+Ml09TTtjW24+PjJdPU87Y1tvPj4yXT1RO2NbcD4+Ml09UztjW3E+PjJdPVU7Y1tyPj4yXT1XO1c9YSs0OHwwO1U9YSs1MnwwO1M9YSs1NnwwO1E9YSs2MHwwO089YSs2NHwwO009YSs2OHwwO0s9YSs3MnwwO0k9YSs3NnwwO0E9Y1sxMTg0KyhiKjk2MHwwKSs0ND4+Ml0mSDt6PWNbMTE4NCsoYio5NjB8MCkrNDg+PjJdJkg7dz1jWzExODQrKGIqOTYwfDApKzUyPj4yXSZIO0I9Y1sxMTg0KyhiKjk2MHwwKSs1Nj4+Ml0mSDtpYT1jWzExODQrKGIqOTYwfDApKzYwPj4yXSZIO0Q9Y1sxMTg0KyhiKjk2MHwwKSs2ND4+Ml0mSDtlYT1jWzExODQrKGIqOTYwfDApKzY4Pj4yXSZIO0Y9Y1sxMTg0KyhiKjk2MHwwKSs3Mj4+Ml0mSDtnYT1jWzExODQrKGIqOTYwfDApKzc2Pj4yXSZIO2NbZT4+Ml09KGNbMTE4NCsoYio5NjB8MCkrNDA+PjJdXjEpJkheMTtjW2Y+PjJdPUE7Y1tXPj4yXT16O2NbVT4+Ml09dztjW1M+PjJdPUI7Y1tRPj4yXT1pYTtjW08+PjJdPUQ7Y1tNPj4yXT1lYTtjW0s+PjJdPUY7Y1tJPj4yXT1nYTtnYT1jW2c+PjJdfDA7Rj1hKzg0fDA7ZWE9Y1tGPj4yXXwwO0Q9YSs4OHwwO2lhPWNbRD4+Ml18MDtCPWErOTJ8MDt3PWNbQj4+Ml18MDt6PWErOTZ8MDtBPWNbej4+Ml18MDt4PWErMTAwfDA7ZmE9Y1t4Pj4yXXwwO3Y9YSsxMDR8MDtiYT1jW3Y+PjJdfDA7aT1hKzEwOHwwO0c9Y1tpPj4yXXwwO3Q9YSsxMTJ8MDtfPWNbdD4+Ml18MDt1PWErMTE2fDA7ZGE9Y1t1Pj4yXXwwOyQ9KGNbMTE4NCsoYio5NjB8MCkrODQ+PjJdXmVhKSZIO2FhPShjWzExODQrKGIqOTYwfDApKzg4Pj4yXV5pYSkmSDt5PShjWzExODQrKGIqOTYwfDApKzkyPj4yXV53KSZIO2o9KGNbMTE4NCsoYio5NjB8MCkrOTY+PjJdXkEpJkg7aGE9KGNbMTE4NCsoYio5NjB8MCkrMTAwPj4yXV5mYSkmSDtaPShjWzExODQrKGIqOTYwfDApKzEwND4+Ml1eYmEpJkg7Y2E9KGNbMTE4NCsoYio5NjB8MCkrMTA4Pj4yXV5HKSZIO0M9KGNbMTE4NCsoYio5NjB8MCkrMTEyPj4yXV5fKSZIO0U9KGNbMTE4NCsoYio5NjB8MCkrMTE2Pj4yXV5kYSkmSDtjW2c+PjJdPShjWzExODQrKGIqOTYwfDApKzgwPj4yXV5nYSkmSF5nYTtjW0Y+PjJdPSReZWE7Y1tEPj4yXT1hYV5pYTtjW0I+PjJdPXledztjW3o+PjJdPWpeQTtjW3g+PjJdPWhhXmZhO2Nbdj4+Ml09Wl5iYTtjW2k+PjJdPWNhXkc7Y1t0Pj4yXT1DXl87Y1t1Pj4yXT1FXmRhO2RhPWNbYT4+Ml18MDtFPWNbZD4+Ml18MDtfPWNbaz4+Ml18MDtDPWNbbD4+Ml18MDtHPWNbbT4+Ml18MDtjYT1jW24+PjJdfDA7YmE9Y1tvPj4yXXwwO1o9Y1twPj4yXXwwO2ZhPWNbcT4+Ml18MDtoYT1jW3I+PjJdfDA7QT0oaF4yKSstMT4+MzE7aj0oY1sxMTg0KyhiKjk2MHwwKSsxMjQ+PjJdXkUpJkE7dz0oY1sxMTg0KyhiKjk2MHwwKSsxMjg+PjJdXl8pJkE7eT0oY1sxMTg0KyhiKjk2MHwwKSsxMzI+PjJdXkMpJkE7aWE9KGNbMTE4NCsoYio5NjB8MCkrMTM2Pj4yXV5HKSZBO2FhPShjWzExODQrKGIqOTYwfDApKzE0MD4+Ml1eY2EpJkE7ZWE9KGNbMTE4NCsoYio5NjB8MCkrMTQ0Pj4yXV5iYSkmQTskPShjWzExODQrKGIqOTYwfDApKzE0OD4+Ml1eWikmQTtnYT0oY1sxMTg0KyhiKjk2MHwwKSsxNTI+PjJdXmZhKSZBO0g9KGNbMTE4NCsoYio5NjB8MCkrMTU2Pj4yXV5oYSkmQTtjW2E+PjJdPShjWzExODQrKGIqOTYwfDApKzEyMD4+Ml1eZGEpJkFeZGE7Y1tkPj4yXT1qXkU7Y1trPj4yXT13Xl87Y1tsPj4yXT15XkM7Y1ttPj4yXT1pYV5HO2Nbbj4+Ml09YWFeY2E7Y1tvPj4yXT1lYV5iYTtjW3A+PjJdPSReWjtjW3E+PjJdPWdhXmZhO2Nbcj4+Ml09SF5oYTtoYT1jW2U+PjJdfDA7SD1jW2Y+PjJdfDA7ZmE9Y1tXPj4yXXwwO2dhPWNbVT4+Ml18MDtaPWNbUz4+Ml18MDskPWNbUT4+Ml18MDtiYT1jW08+PjJdfDA7ZWE9Y1tNPj4yXXwwO2NhPWNbSz4+Ml18MDthYT1jW0k+PjJdfDA7Rz0oY1sxMTg0KyhiKjk2MHwwKSsxNjQ+PjJdXkgpJkE7aWE9KGNbMTE4NCsoYio5NjB8MCkrMTY4Pj4yXV5mYSkmQTtDPShjWzExODQrKGIqOTYwfDApKzE3Mj4+Ml1eZ2EpJkE7eT0oY1sxMTg0KyhiKjk2MHwwKSsxNzY+PjJdXlopJkE7Xz0oY1sxMTg0KyhiKjk2MHwwKSsxODA+PjJdXiQpJkE7dz0oY1sxMTg0KyhiKjk2MHwwKSsxODQ+PjJdXmJhKSZBO0U9KGNbMTE4NCsoYio5NjB8MCkrMTg4Pj4yXV5lYSkmQTtqPShjWzExODQrKGIqOTYwfDApKzE5Mj4+Ml1eY2EpJkE7ZGE9KGNbMTE4NCsoYio5NjB8MCkrMTk2Pj4yXV5hYSkmQTtjW2U+PjJdPShjWzExODQrKGIqOTYwfDApKzE2MD4+Ml1eaGEpJkFeaGE7Y1tmPj4yXT1HXkg7Y1tXPj4yXT1pYV5mYTtjW1U+PjJdPUNeZ2E7Y1tTPj4yXT15Xlo7Y1tRPj4yXT1fXiQ7Y1tPPj4yXT13XmJhO2NbTT4+Ml09RV5lYTtjW0s+PjJdPWpeY2E7Y1tJPj4yXT1kYV5hYTthYT1jW2c+PjJdfDA7ZGE9Y1tGPj4yXXwwO2NhPWNbRD4+Ml18MDtqPWNbQj4+Ml18MDtlYT1jW3o+PjJdfDA7RT1jW3g+PjJdfDA7YmE9Y1t2Pj4yXXwwO3c9Y1tpPj4yXXwwOyQ9Y1t0Pj4yXXwwO189Y1t1Pj4yXXwwO1o9KGNbMTE4NCsoYio5NjB8MCkrMjA0Pj4yXV5kYSkmQTt5PShjWzExODQrKGIqOTYwfDApKzIwOD4+Ml1eY2EpJkE7Z2E9KGNbMTE4NCsoYio5NjB8MCkrMjEyPj4yXV5qKSZBO0M9KGNbMTE4NCsoYio5NjB8MCkrMjE2Pj4yXV5lYSkmQTtmYT0oY1sxMTg0KyhiKjk2MHwwKSsyMjA+PjJdXkUpJkE7aWE9KGNbMTE4NCsoYio5NjB8MCkrMjI0Pj4yXV5iYSkmQTtIPShjWzExODQrKGIqOTYwfDApKzIyOD4+Ml1edykmQTtHPShjWzExODQrKGIqOTYwfDApKzIzMj4+Ml1eJCkmQTtoYT0oY1sxMTg0KyhiKjk2MHwwKSsyMzY+PjJdXl8pJkE7Y1tnPj4yXT0oY1sxMTg0KyhiKjk2MHwwKSsyMDA+PjJdXmFhKSZBXmFhO2NbRj4+Ml09Wl5kYTtjW0Q+PjJdPXleY2E7Y1tCPj4yXT1nYV5qO2Nbej4+Ml09Q15lYTtjW3g+PjJdPWZhXkU7Y1t2Pj4yXT1pYV5iYTtjW2k+PjJdPUhedztjW3Q+PjJdPUdeJDtjW3U+PjJdPWhhXl87Xz1jW2E+PjJdfDA7aGE9Y1tkPj4yXXwwOyQ9Y1trPj4yXXwwO0c9Y1tsPj4yXXwwO3c9Y1ttPj4yXXwwO0g9Y1tuPj4yXXwwO2JhPWNbbz4+Ml18MDtpYT1jW3A+PjJdfDA7RT1jW3E+PjJdfDA7ZmE9Y1tyPj4yXXwwO2VhPShoXjMpKy0xPj4zMTtDPShjWzExODQrKGIqOTYwfDApKzI0ND4+Ml1eaGEpJmVhO2o9KGNbMTE4NCsoYio5NjB8MCkrMjQ4Pj4yXV4kKSZlYTtnYT0oY1sxMTg0KyhiKjk2MHwwKSsyNTI+PjJdXkcpJmVhO2NhPShjWzExODQrKGIqOTYwfDApKzI1Nj4+Ml1edykmZWE7eT0oY1sxMTg0KyhiKjk2MHwwKSsyNjA+PjJdXkgpJmVhO2RhPShjWzExODQrKGIqOTYwfDApKzI2ND4+Ml1eYmEpJmVhO1o9KGNbMTE4NCsoYio5NjB8MCkrMjY4Pj4yXV5pYSkmZWE7YWE9KGNbMTE4NCsoYio5NjB8MCkrMjcyPj4yXV5FKSZlYTtBPShjWzExODQrKGIqOTYwfDApKzI3Nj4+Ml1eZmEpJmVhO2NbYT4+Ml09KGNbMTE4NCsoYio5NjB8MCkrMjQwPj4yXV5fKSZlYV5fO2NbZD4+Ml09Q15oYTtjW2s+PjJdPWpeJDtjW2w+PjJdPWdhXkc7Y1ttPj4yXT1jYV53O2Nbbj4+Ml09eV5IO2Nbbz4+Ml09ZGFeYmE7Y1twPj4yXT1aXmlhO2NbcT4+Ml09YWFeRTtjW3I+PjJdPUFeZmE7ZmE9Y1tlPj4yXXwwO0E9Y1tmPj4yXXwwO0U9Y1tXPj4yXXwwO2FhPWNbVT4+Ml18MDtpYT1jW1M+PjJdfDA7Wj1jW1E+PjJdfDA7YmE9Y1tPPj4yXXwwO2RhPWNbTT4+Ml18MDtIPWNbSz4+Ml18MDt5PWNbST4+Ml18MDt3PShjWzExODQrKGIqOTYwfDApKzI4ND4+Ml1eQSkmZWE7Y2E9KGNbMTE4NCsoYio5NjB8MCkrMjg4Pj4yXV5FKSZlYTtHPShjWzExODQrKGIqOTYwfDApKzI5Mj4+Ml1eYWEpJmVhO2dhPShjWzExODQrKGIqOTYwfDApKzI5Nj4+Ml1eaWEpJmVhOyQ9KGNbMTE4NCsoYio5NjB8MCkrMzAwPj4yXV5aKSZlYTtqPShjWzExODQrKGIqOTYwfDApKzMwND4+Ml1eYmEpJmVhO2hhPShjWzExODQrKGIqOTYwfDApKzMwOD4+Ml1eZGEpJmVhO0M9KGNbMTE4NCsoYio5NjB8MCkrMzEyPj4yXV5IKSZlYTtfPShjWzExODQrKGIqOTYwfDApKzMxNj4+Ml1eeSkmZWE7Y1tlPj4yXT0oY1sxMTg0KyhiKjk2MHwwKSsyODA+PjJdXmZhKSZlYV5mYTtjW2Y+PjJdPXdeQTtjW1c+PjJdPWNhXkU7Y1tVPj4yXT1HXmFhO2NbUz4+Ml09Z2FeaWE7Y1tRPj4yXT0kXlo7Y1tPPj4yXT1qXmJhO2NbTT4+Ml09aGFeZGE7Y1tLPj4yXT1DXkg7Y1tJPj4yXT1fXnk7eT1jW2c+PjJdfDA7Xz1jW0Y+PjJdfDA7SD1jW0Q+PjJdfDA7Qz1jW0I+PjJdfDA7ZGE9Y1t6Pj4yXXwwO2hhPWNbeD4+Ml18MDtiYT1jW3Y+PjJdfDA7aj1jW2k+PjJdfDA7Wj1jW3Q+PjJdfDA7JD1jW3U+PjJdfDA7aWE9KGNbMTE4NCsoYio5NjB8MCkrMzI0Pj4yXV5fKSZlYTtnYT0oY1sxMTg0KyhiKjk2MHwwKSszMjg+PjJdXkgpJmVhO2FhPShjWzExODQrKGIqOTYwfDApKzMzMj4+Ml1eQykmZWE7Rz0oY1sxMTg0KyhiKjk2MHwwKSszMzY+PjJdXmRhKSZlYTtFPShjWzExODQrKGIqOTYwfDApKzM0MD4+Ml1eaGEpJmVhO2NhPShjWzExODQrKGIqOTYwfDApKzM0ND4+Ml1eYmEpJmVhO0E9KGNbMTE4NCsoYio5NjB8MCkrMzQ4Pj4yXV5qKSZlYTt3PShjWzExODQrKGIqOTYwfDApKzM1Mj4+Ml1eWikmZWE7ZmE9KGNbMTE4NCsoYio5NjB8MCkrMzU2Pj4yXV4kKSZlYTtjW2c+PjJdPShjWzExODQrKGIqOTYwfDApKzMyMD4+Ml1eeSkmZWFeeTtjW0Y+PjJdPWlhXl87Y1tEPj4yXT1nYV5IO2NbQj4+Ml09YWFeQztjW3o+PjJdPUdeZGE7Y1t4Pj4yXT1FXmhhO2Nbdj4+Ml09Y2FeYmE7Y1tpPj4yXT1BXmo7Y1t0Pj4yXT13Xlo7Y1t1Pj4yXT1mYV4kOyQ9Y1thPj4yXXwwO2ZhPWNbZD4+Ml18MDtaPWNbaz4+Ml18MDt3PWNbbD4+Ml18MDtqPWNbbT4+Ml18MDtBPWNbbj4+Ml18MDtiYT1jW28+PjJdfDA7Y2E9Y1twPj4yXXwwO2hhPWNbcT4+Ml18MDtFPWNbcj4+Ml18MDtkYT0oaF40KSstMT4+MzE7Rz0oY1sxMTg0KyhiKjk2MHwwKSszNjQ+PjJdXmZhKSZkYTtDPShjWzExODQrKGIqOTYwfDApKzM2OD4+Ml1eWikmZGE7YWE9KGNbMTE4NCsoYio5NjB8MCkrMzcyPj4yXV53KSZkYTtIPShjWzExODQrKGIqOTYwfDApKzM3Nj4+Ml1eaikmZGE7Z2E9KGNbMTE4NCsoYio5NjB8MCkrMzgwPj4yXV5BKSZkYTtfPShjWzExODQrKGIqOTYwfDApKzM4ND4+Ml1eYmEpJmRhO2lhPShjWzExODQrKGIqOTYwfDApKzM4OD4+Ml1eY2EpJmRhO3k9KGNbMTE4NCsoYio5NjB8MCkrMzkyPj4yXV5oYSkmZGE7ZWE9KGNbMTE4NCsoYio5NjB8MCkrMzk2Pj4yXV5FKSZkYTtjW2E+PjJdPShjWzExODQrKGIqOTYwfDApKzM2MD4+Ml1eJCkmZGFeJDtjW2Q+PjJdPUdeZmE7Y1trPj4yXT1DXlo7Y1tsPj4yXT1hYV53O2NbbT4+Ml09SF5qO2Nbbj4+Ml09Z2FeQTtjW28+PjJdPV9eYmE7Y1twPj4yXT1pYV5jYTtjW3E+PjJdPXleaGE7Y1tyPj4yXT1lYV5FO0U9Y1tlPj4yXXwwO2VhPWNbZj4+Ml18MDtoYT1jW1c+PjJdfDA7eT1jW1U+PjJdfDA7Y2E9Y1tTPj4yXXwwO2lhPWNbUT4+Ml18MDtiYT1jW08+PjJdfDA7Xz1jW00+PjJdfDA7QT1jW0s+PjJdfDA7Z2E9Y1tJPj4yXXwwO2o9KGNbMTE4NCsoYio5NjB8MCkrNDA0Pj4yXV5lYSkmZGE7SD0oY1sxMTg0KyhiKjk2MHwwKSs0MDg+PjJdXmhhKSZkYTt3PShjWzExODQrKGIqOTYwfDApKzQxMj4+Ml1eeSkmZGE7YWE9KGNbMTE4NCsoYio5NjB8MCkrNDE2Pj4yXV5jYSkmZGE7Wj0oY1sxMTg0KyhiKjk2MHwwKSs0MjA+PjJdXmlhKSZkYTtDPShjWzExODQrKGIqOTYwfDApKzQyND4+Ml1eYmEpJmRhO2ZhPShjWzExODQrKGIqOTYwfDApKzQyOD4+Ml1eXykmZGE7Rz0oY1sxMTg0KyhiKjk2MHwwKSs0MzI+PjJdXkEpJmRhOyQ9KGNbMTE4NCsoYio5NjB8MCkrNDM2Pj4yXV5nYSkmZGE7Y1tlPj4yXT0oY1sxMTg0KyhiKjk2MHwwKSs0MDA+PjJdXkUpJmRhXkU7Y1tmPj4yXT1qXmVhO2NbVz4+Ml09SF5oYTtjW1U+PjJdPXdeeTtjW1M+PjJdPWFhXmNhO2NbUT4+Ml09Wl5pYTtjW08+PjJdPUNeYmE7Y1tNPj4yXT1mYV5fO2NbSz4+Ml09R15BO2NbST4+Ml09JF5nYTtnYT1jW2c+PjJdfDA7JD1jW0Y+PjJdfDA7QT1jW0Q+PjJdfDA7Rz1jW0I+PjJdfDA7Xz1jW3o+PjJdfDA7ZmE9Y1t4Pj4yXXwwO2JhPWNbdj4+Ml18MDtDPWNbaT4+Ml18MDtpYT1jW3Q+PjJdfDA7Wj1jW3U+PjJdfDA7Y2E9KGNbMTE4NCsoYio5NjB8MCkrNDQ0Pj4yXV4kKSZkYTthYT0oY1sxMTg0KyhiKjk2MHwwKSs0NDg+PjJdXkEpJmRhO3k9KGNbMTE4NCsoYio5NjB8MCkrNDUyPj4yXV5HKSZkYTt3PShjWzExODQrKGIqOTYwfDApKzQ1Nj4+Ml1eXykmZGE7aGE9KGNbMTE4NCsoYio5NjB8MCkrNDYwPj4yXV5mYSkmZGE7SD0oY1sxMTg0KyhiKjk2MHwwKSs0NjQ+PjJdXmJhKSZkYTtlYT0oY1sxMTg0KyhiKjk2MHwwKSs0Njg+PjJdXkMpJmRhO2o9KGNbMTE4NCsoYio5NjB8MCkrNDcyPj4yXV5pYSkmZGE7RT0oY1sxMTg0KyhiKjk2MHwwKSs0NzY+PjJdXlopJmRhO2NbZz4+Ml09KGNbMTE4NCsoYio5NjB8MCkrNDQwPj4yXV5nYSkmZGFeZ2E7Y1tGPj4yXT1jYV4kO2NbRD4+Ml09YWFeQTtjW0I+PjJdPXleRztjW3o+PjJdPXdeXztjW3g+PjJdPWhhXmZhO2Nbdj4+Ml09SF5iYTtjW2k+PjJdPWVhXkM7Y1t0Pj4yXT1qXmlhO2NbdT4+Ml09RV5aO1o9Y1thPj4yXXwwO0U9Y1tkPj4yXXwwO2lhPWNbaz4+Ml18MDtqPWNbbD4+Ml18MDtDPWNbbT4+Ml18MDtlYT1jW24+PjJdfDA7YmE9Y1tvPj4yXXwwO0g9Y1twPj4yXXwwO2ZhPWNbcT4+Ml18MDtoYT1jW3I+PjJdfDA7Xz0oaF41KSstMT4+MzE7dz0oY1sxMTg0KyhiKjk2MHwwKSs0ODQ+PjJdXkUpJl87Rz0oY1sxMTg0KyhiKjk2MHwwKSs0ODg+PjJdXmlhKSZfO3k9KGNbMTE4NCsoYio5NjB8MCkrNDkyPj4yXV5qKSZfO0E9KGNbMTE4NCsoYio5NjB8MCkrNDk2Pj4yXV5DKSZfO2FhPShjWzExODQrKGIqOTYwfDApKzUwMD4+Ml1eZWEpJl87JD0oY1sxMTg0KyhiKjk2MHwwKSs1MDQ+PjJdXmJhKSZfO2NhPShjWzExODQrKGIqOTYwfDApKzUwOD4+Ml1eSCkmXztnYT0oY1sxMTg0KyhiKjk2MHwwKSs1MTI+PjJdXmZhKSZfO2RhPShjWzExODQrKGIqOTYwfDApKzUxNj4+Ml1eaGEpJl87Y1thPj4yXT0oY1sxMTg0KyhiKjk2MHwwKSs0ODA+PjJdXlopJl9eWjtjW2Q+PjJdPXdeRTtjW2s+PjJdPUdeaWE7Y1tsPj4yXT15Xmo7Y1ttPj4yXT1BXkM7Y1tuPj4yXT1hYV5lYTtjW28+PjJdPSReYmE7Y1twPj4yXT1jYV5IO2NbcT4+Ml09Z2FeZmE7Y1tyPj4yXT1kYV5oYTtoYT1jW2U+PjJdfDA7ZGE9Y1tmPj4yXXwwO2ZhPWNbVz4+Ml18MDtnYT1jW1U+PjJdfDA7SD1jW1M+PjJdfDA7Y2E9Y1tRPj4yXXwwO2JhPWNbTz4+Ml18MDskPWNbTT4+Ml18MDtlYT1jW0s+PjJdfDA7YWE9Y1tJPj4yXXwwO0M9KGNbMTE4NCsoYio5NjB8MCkrNTI0Pj4yXV5kYSkmXztBPShjWzExODQrKGIqOTYwfDApKzUyOD4+Ml1eZmEpJl87aj0oY1sxMTg0KyhiKjk2MHwwKSs1MzI+PjJdXmdhKSZfO3k9KGNbMTE4NCsoYio5NjB8MCkrNTM2Pj4yXV5IKSZfO2lhPShjWzExODQrKGIqOTYwfDApKzU0MD4+Ml1eY2EpJl87Rz0oY1sxMTg0KyhiKjk2MHwwKSs1NDQ+PjJdXmJhKSZfO0U9KGNbMTE4NCsoYio5NjB8MCkrNTQ4Pj4yXV4kKSZfO3c9KGNbMTE4NCsoYio5NjB8MCkrNTUyPj4yXV5lYSkmXztaPShjWzExODQrKGIqOTYwfDApKzU1Nj4+Ml1eYWEpJl87Y1tlPj4yXT0oY1sxMTg0KyhiKjk2MHwwKSs1MjA+PjJdXmhhKSZfXmhhO2NbZj4+Ml09Q15kYTtjW1c+PjJdPUFeZmE7Y1tVPj4yXT1qXmdhO2NbUz4+Ml09eV5IO2NbUT4+Ml09aWFeY2E7Y1tPPj4yXT1HXmJhO2NbTT4+Ml09RV4kO2NbSz4+Ml09d15lYTtjW0k+PjJdPVpeYWE7YWE9Y1tnPj4yXXwwO1o9Y1tGPj4yXXwwO2VhPWNbRD4+Ml18MDt3PWNbQj4+Ml18MDskPWNbej4+Ml18MDtFPWNbeD4+Ml18MDtiYT1jW3Y+PjJdfDA7Rz1jW2k+PjJdfDA7Y2E9Y1t0Pj4yXXwwO2lhPWNbdT4+Ml18MDtIPShjWzExODQrKGIqOTYwfDApKzU2ND4+Ml1eWikmXzt5PShjWzExODQrKGIqOTYwfDApKzU2OD4+Ml1eZWEpJl87Z2E9KGNbMTE4NCsoYio5NjB8MCkrNTcyPj4yXV53KSZfO2o9KGNbMTE4NCsoYio5NjB8MCkrNTc2Pj4yXV4kKSZfO2ZhPShjWzExODQrKGIqOTYwfDApKzU4MD4+Ml1eRSkmXztBPShjWzExODQrKGIqOTYwfDApKzU4ND4+Ml1eYmEpJl87ZGE9KGNbMTE4NCsoYio5NjB8MCkrNTg4Pj4yXV5HKSZfO0M9KGNbMTE4NCsoYio5NjB8MCkrNTkyPj4yXV5jYSkmXztoYT0oY1sxMTg0KyhiKjk2MHwwKSs1OTY+PjJdXmlhKSZfO2NbZz4+Ml09KGNbMTE4NCsoYio5NjB8MCkrNTYwPj4yXV5hYSkmX15hYTtjW0Y+PjJdPUheWjtjW0Q+PjJdPXleZWE7Y1tCPj4yXT1nYV53O2Nbej4+Ml09al4kO2NbeD4+Ml09ZmFeRTtjW3Y+PjJdPUFeYmE7Y1tpPj4yXT1kYV5HO2NbdD4+Ml09Q15jYTtjW3U+PjJdPWhhXmlhO2lhPWNbYT4+Ml18MDtoYT1jW2Q+PjJdfDA7Y2E9Y1trPj4yXXwwO0M9Y1tsPj4yXXwwO0c9Y1ttPj4yXXwwO2RhPWNbbj4+Ml18MDtiYT1jW28+PjJdfDA7QT1jW3A+PjJdfDA7RT1jW3E+PjJdfDA7ZmE9Y1tyPj4yXXwwOyQ9KGheNikrLTE+PjMxO2o9KGNbMTE4NCsoYio5NjB8MCkrNjA0Pj4yXV5oYSkmJDt3PShjWzExODQrKGIqOTYwfDApKzYwOD4+Ml1eY2EpJiQ7Z2E9KGNbMTE4NCsoYio5NjB8MCkrNjEyPj4yXV5DKSYkO2VhPShjWzExODQrKGIqOTYwfDApKzYxNj4+Ml1eRykmJDt5PShjWzExODQrKGIqOTYwfDApKzYyMD4+Ml1eZGEpJiQ7Wj0oY1sxMTg0KyhiKjk2MHwwKSs2MjQ+PjJdXmJhKSYkO0g9KGNbMTE4NCsoYio5NjB8MCkrNjI4Pj4yXV5BKSYkO2FhPShjWzExODQrKGIqOTYwfDApKzYzMj4+Ml1eRSkmJDtfPShjWzExODQrKGIqOTYwfDApKzYzNj4+Ml1eZmEpJiQ7Y1thPj4yXT0oY1sxMTg0KyhiKjk2MHwwKSs2MDA+PjJdXmlhKSYkXmlhO2NbZD4+Ml09al5oYTtjW2s+PjJdPXdeY2E7Y1tsPj4yXT1nYV5DO2NbbT4+Ml09ZWFeRztjW24+PjJdPXleZGE7Y1tvPj4yXT1aXmJhO2NbcD4+Ml09SF5BO2NbcT4+Ml09YWFeRTtjW3I+PjJdPV9eZmE7ZmE9Y1tlPj4yXXwwO189Y1tmPj4yXXwwO0U9Y1tXPj4yXXwwO2FhPWNbVT4+Ml18MDtBPWNbUz4+Ml18MDtIPWNbUT4+Ml18MDtiYT1jW08+PjJdfDA7Wj1jW00+PjJdfDA7ZGE9Y1tLPj4yXXwwO3k9Y1tJPj4yXXwwO0c9KGNbMTE4NCsoYio5NjB8MCkrNjQ0Pj4yXV5fKSYkO2VhPShjWzExODQrKGIqOTYwfDApKzY0OD4+Ml1eRSkmJDtDPShjWzExODQrKGIqOTYwfDApKzY1Mj4+Ml1eYWEpJiQ7Z2E9KGNbMTE4NCsoYio5NjB8MCkrNjU2Pj4yXV5BKSYkO2NhPShjWzExODQrKGIqOTYwfDApKzY2MD4+Ml1eSCkmJDt3PShjWzExODQrKGIqOTYwfDApKzY2ND4+Ml1eYmEpJiQ7aGE9KGNbMTE4NCsoYio5NjB8MCkrNjY4Pj4yXV5aKSYkO2o9KGNbMTE4NCsoYio5NjB8MCkrNjcyPj4yXV5kYSkmJDtpYT0oY1sxMTg0KyhiKjk2MHwwKSs2NzY+PjJdXnkpJiQ7Y1tlPj4yXT0oY1sxMTg0KyhiKjk2MHwwKSs2NDA+PjJdXmZhKSYkXmZhO2NbZj4+Ml09R15fO2NbVz4+Ml09ZWFeRTtjW1U+PjJdPUNeYWE7Y1tTPj4yXT1nYV5BO2NbUT4+Ml09Y2FeSDtjW08+PjJdPXdeYmE7Y1tNPj4yXT1oYV5aO2NbSz4+Ml09al5kYTtjW0k+PjJdPWlhXnk7eT1jW2c+PjJdfDA7aWE9Y1tGPj4yXXwwO2RhPWNbRD4+Ml18MDtqPWNbQj4+Ml18MDtaPWNbej4+Ml18MDtoYT1jW3g+PjJdfDA7YmE9Y1t2Pj4yXXwwO3c9Y1tpPj4yXXwwO0g9Y1t0Pj4yXXwwO2NhPWNbdT4+Ml18MDtBPShjWzExODQrKGIqOTYwfDApKzY4ND4+Ml1eaWEpJiQ7Z2E9KGNbMTE4NCsoYio5NjB8MCkrNjg4Pj4yXV5kYSkmJDthYT0oY1sxMTg0KyhiKjk2MHwwKSs2OTI+PjJdXmopJiQ7Qz0oY1sxMTg0KyhiKjk2MHwwKSs2OTY+PjJdXlopJiQ7RT0oY1sxMTg0KyhiKjk2MHwwKSs3MDA+PjJdXmhhKSYkO2VhPShjWzExODQrKGIqOTYwfDApKzcwND4+Ml1eYmEpJiQ7Xz0oY1sxMTg0KyhiKjk2MHwwKSs3MDg+PjJdXncpJiQ7Rz0oY1sxMTg0KyhiKjk2MHwwKSs3MTI+PjJdXkgpJiQ7ZmE9KGNbMTE4NCsoYio5NjB8MCkrNzE2Pj4yXV5jYSkmJDtjW2c+PjJdPShjWzExODQrKGIqOTYwfDApKzY4MD4+Ml1eeSkmJF55O2NbRj4+Ml09QV5pYTtjW0Q+PjJdPWdhXmRhO2NbQj4+Ml09YWFeajtjW3o+PjJdPUNeWjtjW3g+PjJdPUVeaGE7Y1t2Pj4yXT1lYV5iYTtjW2k+PjJdPV9edztjW3Q+PjJdPUdeSDtjW3U+PjJdPWZhXmNhO2NhPWNbYT4+Ml18MDtmYT1jW2Q+PjJdfDA7SD1jW2s+PjJdfDA7Rz1jW2w+PjJdfDA7dz1jW20+PjJdfDA7Xz1jW24+PjJdfDA7YmE9Y1tvPj4yXXwwO2VhPWNbcD4+Ml18MDtoYT1jW3E+PjJdfDA7RT1jW3I+PjJdfDA7Wj0oaF43KSstMT4+MzE7Qz0oY1sxMTg0KyhiKjk2MHwwKSs3MjQ+PjJdXmZhKSZaO2o9KGNbMTE4NCsoYio5NjB8MCkrNzI4Pj4yXV5IKSZaO2FhPShjWzExODQrKGIqOTYwfDApKzczMj4+Ml1eRykmWjtkYT0oY1sxMTg0KyhiKjk2MHwwKSs3MzY+PjJdXncpJlo7Z2E9KGNbMTE4NCsoYio5NjB8MCkrNzQwPj4yXV5fKSZaO2lhPShjWzExODQrKGIqOTYwfDApKzc0ND4+Ml1eYmEpJlo7QT0oY1sxMTg0KyhiKjk2MHwwKSs3NDg+PjJdXmVhKSZaO3k9KGNbMTE4NCsoYio5NjB8MCkrNzUyPj4yXV5oYSkmWjskPShjWzExODQrKGIqOTYwfDApKzc1Nj4+Ml1eRSkmWjtjW2E+PjJdPShjWzExODQrKGIqOTYwfDApKzcyMD4+Ml1eY2EpJlpeY2E7Y1tkPj4yXT1DXmZhO2Nbaz4+Ml09al5IO2NbbD4+Ml09YWFeRztjW20+PjJdPWRhXnc7Y1tuPj4yXT1nYV5fO2Nbbz4+Ml09aWFeYmE7Y1twPj4yXT1BXmVhO2NbcT4+Ml09eV5oYTtjW3I+PjJdPSReRTtFPWNbZT4+Ml18MDskPWNbZj4+Ml18MDtoYT1jW1c+PjJdfDA7eT1jW1U+PjJdfDA7ZWE9Y1tTPj4yXXwwO0E9Y1tRPj4yXXwwO2JhPWNbTz4+Ml18MDtpYT1jW00+PjJdfDA7Xz1jW0s+PjJdfDA7Z2E9Y1tJPj4yXXwwO3c9KGNbMTE4NCsoYio5NjB8MCkrNzY0Pj4yXV4kKSZaO2RhPShjWzExODQrKGIqOTYwfDApKzc2OD4+Ml1eaGEpJlo7Rz0oY1sxMTg0KyhiKjk2MHwwKSs3NzI+PjJdXnkpJlo7YWE9KGNbMTE4NCsoYio5NjB8MCkrNzc2Pj4yXV5lYSkmWjtIPShjWzExODQrKGIqOTYwfDApKzc4MD4+Ml1eQSkmWjtqPShjWzExODQrKGIqOTYwfDApKzc4ND4+Ml1eYmEpJlo7ZmE9KGNbMTE4NCsoYio5NjB8MCkrNzg4Pj4yXV5pYSkmWjtDPShjWzExODQrKGIqOTYwfDApKzc5Mj4+Ml1eXykmWjtjYT0oY1sxMTg0KyhiKjk2MHwwKSs3OTY+PjJdXmdhKSZaO2NbZT4+Ml09KGNbMTE4NCsoYio5NjB8MCkrNzYwPj4yXV5FKSZaXkU7Y1tmPj4yXT13XiQ7Y1tXPj4yXT1kYV5oYTtjW1U+PjJdPUdeeTtjW1M+PjJdPWFhXmVhO2NbUT4+Ml09SF5BO2NbTz4+Ml09al5iYTtjW00+PjJdPWZhXmlhO2NbSz4+Ml09Q15fO2NbST4+Ml09Y2FeZ2E7Z2E9Y1tnPj4yXXwwO2NhPWNbRj4+Ml18MDtfPWNbRD4+Ml18MDtDPWNbQj4+Ml18MDtpYT1jW3o+PjJdfDA7ZmE9Y1t4Pj4yXXwwO2JhPWNbdj4+Ml18MDtqPWNbaT4+Ml18MDtBPWNbdD4+Ml18MDtIPWNbdT4+Ml18MDtlYT0oY1sxMTg0KyhiKjk2MHwwKSs4MDQ+PjJdXmNhKSZaO2FhPShjWzExODQrKGIqOTYwfDApKzgwOD4+Ml1eXykmWjt5PShjWzExODQrKGIqOTYwfDApKzgxMj4+Ml1eQykmWjtHPShjWzExODQrKGIqOTYwfDApKzgxNj4+Ml1eaWEpJlo7aGE9KGNbMTE4NCsoYio5NjB8MCkrODIwPj4yXV5mYSkmWjtkYT0oY1sxMTg0KyhiKjk2MHwwKSs4MjQ+PjJdXmJhKSZaOyQ9KGNbMTE4NCsoYio5NjB8MCkrODI4Pj4yXV5qKSZaO3c9KGNbMTE4NCsoYio5NjB8MCkrODMyPj4yXV5BKSZaO0U9KGNbMTE4NCsoYio5NjB8MCkrODM2Pj4yXV5IKSZaO2NbZz4+Ml09KGNbMTE4NCsoYio5NjB8MCkrODAwPj4yXV5nYSkmWl5nYTtjW0Y+PjJdPWVhXmNhO2NbRD4+Ml09YWFeXztjW0I+PjJdPXleQztjW3o+PjJdPUdeaWE7Y1t4Pj4yXT1oYV5mYTtjW3Y+PjJdPWRhXmJhO2NbaT4+Ml09JF5qO2NbdD4+Ml09d15BO2NbdT4+Ml09RV5IO0g9Y1thPj4yXXwwO0U9Y1tkPj4yXXwwO0E9Y1trPj4yXXwwO3c9Y1tsPj4yXXwwO2o9Y1ttPj4yXXwwOyQ9Y1tuPj4yXXwwO2JhPWNbbz4+Ml18MDtkYT1jW3A+PjJdfDA7ZmE9Y1txPj4yXXwwO2hhPWNbcj4+Ml18MDtpYT0oaF44KSstMT4+MzE7Rz0oY1sxMTg0KyhiKjk2MHwwKSs4NDQ+PjJdXkUpJmlhO0M9KGNbMTE4NCsoYio5NjB8MCkrODQ4Pj4yXV5BKSZpYTt5PShjWzExODQrKGIqOTYwfDApKzg1Mj4+Ml1edykmaWE7aD0oY1sxMTg0KyhiKjk2MHwwKSs4NTY+PjJdXmopJmlhO189KGNbMTE4NCsoYio5NjB8MCkrODYwPj4yXV4kKSZpYTthYT0oY1sxMTg0KyhiKjk2MHwwKSs4NjQ+PjJdXmJhKSZpYTtjYT0oY1sxMTg0KyhiKjk2MHwwKSs4Njg+PjJdXmRhKSZpYTtlYT0oY1sxMTg0KyhiKjk2MHwwKSs4NzI+PjJdXmZhKSZpYTtnYT0oY1sxMTg0KyhiKjk2MHwwKSs4NzY+PjJdXmhhKSZpYTtjW2E+PjJdPShjWzExODQrKGIqOTYwfDApKzg0MD4+Ml1eSCkmaWFeSDtjW2Q+PjJdPUdeRTtjW2s+PjJdPUNeQTtjW2w+PjJdPXledztjW20+PjJdPWheajtjW24+PjJdPV9eJDtjW28+PjJdPWFhXmJhO2NbcD4+Ml09Y2FeZGE7Y1txPj4yXT1lYV5mYTtjW3I+PjJdPWdhXmhhO2hhPWNbZT4+Ml18MDtnYT1jW2Y+PjJdfDA7ZmE9Y1tXPj4yXXwwO2VhPWNbVT4+Ml18MDtkYT1jW1M+PjJdfDA7Y2E9Y1tRPj4yXXwwO2JhPWNbTz4+Ml18MDthYT1jW00+PjJdfDA7JD1jW0s+PjJdfDA7Xz1jW0k+PjJdfDA7aj0oY1sxMTg0KyhiKjk2MHwwKSs4ODQ+PjJdXmdhKSZpYTtoPShjWzExODQrKGIqOTYwfDApKzg4OD4+Ml1eZmEpJmlhO3c9KGNbMTE4NCsoYio5NjB8MCkrODkyPj4yXV5lYSkmaWE7eT0oY1sxMTg0KyhiKjk2MHwwKSs4OTY+PjJdXmRhKSZpYTtBPShjWzExODQrKGIqOTYwfDApKzkwMD4+Ml1eY2EpJmlhO0M9KGNbMTE4NCsoYio5NjB8MCkrOTA0Pj4yXV5iYSkmaWE7RT0oY1sxMTg0KyhiKjk2MHwwKSs5MDg+PjJdXmFhKSZpYTtHPShjWzExODQrKGIqOTYwfDApKzkxMj4+Ml1eJCkmaWE7SD0oY1sxMTg0KyhiKjk2MHwwKSs5MTY+PjJdXl8pJmlhO2hhPShjWzExODQrKGIqOTYwfDApKzg4MD4+Ml1eaGEpJmlhXmhhO2NbZT4+Ml09aGE7Z2E9al5nYTtjW2Y+PjJdPWdhO2ZhPWheZmE7Y1tXPj4yXT1mYTtlYT13XmVhO2NbVT4+Ml09ZWE7ZGE9eV5kYTtjW1M+PjJdPWRhO2NhPUFeY2E7Y1tRPj4yXT1jYTtiYT1DXmJhO2NbTz4+Ml09YmE7YWE9RV5hYTtjW00+PjJdPWFhOyQ9R14kO2NbSz4+Ml09JDtfPUheXztjW0k+PjJdPV87SD1jW2c+PjJdfDA7Rz1jW0Y+PjJdfDA7RT1jW0Q+PjJdfDA7Qz1jW0I+PjJdfDA7QT1jW3o+PjJdfDA7eT1jW3g+PjJdfDA7dz1jW3Y+PjJdfDA7aD1jW2k+PjJdfDA7aj1jW3Q+PjJdfDA7Wj1jW3U+PjJdfDA7Sj0oY1sxMTg0KyhiKjk2MHwwKSs5MjQ+PjJdXkcpJmlhO0w9KGNbMTE4NCsoYio5NjB8MCkrOTI4Pj4yXV5FKSZpYTtOPShjWzExODQrKGIqOTYwfDApKzkzMj4+Ml1eQykmaWE7UD0oY1sxMTg0KyhiKjk2MHwwKSs5MzY+PjJdXkEpJmlhO1I9KGNbMTE4NCsoYio5NjB8MCkrOTQwPj4yXV55KSZpYTtUPShjWzExODQrKGIqOTYwfDApKzk0ND4+Ml1edykmaWE7Vj0oY1sxMTg0KyhiKjk2MHwwKSs5NDg+PjJdXmgpJmlhO1g9KGNbMTE4NCsoYio5NjB8MCkrOTUyPj4yXV5qKSZpYTtZPShjWzExODQrKGIqOTYwfDApKzk1Nj4+Ml1eWikmaWE7SD0oY1sxMTg0KyhiKjk2MHwwKSs5MjA+PjJdXkgpJmlhXkg7Y1tnPj4yXT1IO0c9Sl5HO2NbRj4+Ml09RztFPUxeRTtjW0Q+PjJdPUU7Qz1OXkM7Y1tCPj4yXT1DO0E9UF5BO2Nbej4+Ml09QTt5PVJeeTtjW3g+PjJdPXk7dz1UXnc7Y1t2Pj4yXT13O2g9Vl5oO2NbaT4+Ml09aDtqPVheajtjW3Q+PjJdPWo7Yj1ZXlo7Y1t1Pj4yXT1iO1o9Y1thPj4yXXwwO1k9Y1tkPj4yXXwwO1g9Y1trPj4yXXwwO1Y9Y1tsPj4yXXwwO1Q9Y1ttPj4yXXwwO1I9Y1tuPj4yXXwwO1A9Y1tvPj4yXXwwO049Y1twPj4yXXwwO0w9Y1txPj4yXXwwO0o9Y1tyPj4yXXwwO2NbYT4+Ml09KGhhXlopJnNeWjtjW2Q+PjJdPShnYV5ZKSZzXlk7Y1trPj4yXT0oZmFeWCkmc15YO2NbbD4+Ml09KGVhXlYpJnNeVjtjW20+PjJdPShkYV5UKSZzXlQ7Y1tuPj4yXT0oY2FeUikmc15SO2Nbbz4+Ml09KGJhXlApJnNeUDtjW3A+PjJdPShhYV5OKSZzXk47Y1txPj4yXT0oJF5MKSZzXkw7Y1tyPj4yXT0oX15KKSZzXko7ZD1jW2U+PjJdfDA7YT1jW2Y+PjJdfDA7cj1jW1c+PjJdfDA7cT1jW1U+PjJdfDA7cD1jW1M+PjJdfDA7bz1jW1E+PjJdfDA7bj1jW08+PjJdfDA7bT1jW00+PjJdfDA7bD1jW0s+PjJdfDA7az1jW0k+PjJdfDA7Y1tlPj4yXT0oWl5kKSZzXmQ7Y1tmPj4yXT0oWV5hKSZzXmE7Y1tXPj4yXT0oWF5yKSZzXnI7Y1tVPj4yXT0oVl5xKSZzXnE7Y1tTPj4yXT0oVF5wKSZzXnA7Y1tRPj4yXT0oUl5vKSZzXm87Y1tPPj4yXT0oUF5uKSZzXm47Y1tNPj4yXT0oTl5tKSZzXm07Y1tLPj4yXT0oTF5sKSZzXmw7Y1tJPj4yXT0oSl5rKSZzXms7Zj1jW2c+PjJdfDA7az1jW0Y+PjJdfDA7bD1jW0Q+PjJdfDA7bT1jW0I+PjJdfDA7bj1jW3o+PjJdfDA7bz1jW3g+PjJdfDA7cD1jW3Y+PjJdfDA7cT1jW2k+PjJdfDA7cj1jW3Q+PjJdfDA7YT1jW3U+PjJdfDA7Y1tnPj4yXT0oZl4wLUgpJnNeZjtjW0Y+PjJdPShrXjAtRykmc15rO2NbRD4+Ml09KGxeMC1FKSZzXmw7Y1tCPj4yXT0obV4wLUMpJnNebTtjW3o+PjJdPShuXjAtQSkmc15uO2NbeD4+Ml09KG9eMC15KSZzXm87Y1t2Pj4yXT0ocF4wLXcpJnNecDtjW2k+PjJdPShxXjAtaCkmc15xO2NbdD4+Ml09KHJeMC1qKSZzXnI7Y1t1Pj4yXT0oYV4wLWIpJnNeYTtyZXR1cm59ZnVuY3Rpb24gVGMoYSxiKXthPWF8MDtiPWJ8MDt2YXIgZD0wLGU9MCxmPTAsZz0wLGg9MCxqPTAsaz0wLGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MCx2PTAsdz0wLHg9MCx5PTAsej0wO2c9aTtlPWk9aSs2MyYtNjQ7aT1pKzI0MHwwO2Q9ZSs4MHwwO2Y9ZSs0MHwwO2lmKE5jKGQsYil8MCl7Zj0tMTtpPWc7cmV0dXJuIGZ8MH15PWUrNHwwO2NbeT4+Ml09MDtjW3krND4+Ml09MDtjW3krOD4+Ml09MDtjW3krMTI+PjJdPTA7Y1t5KzE2Pj4yXT0wO2NbeSsyMD4+Ml09MDtjW3krMjQ+PjJdPTA7Y1t5KzI4Pj4yXT0wO3E9ZCs0MHwwO3A9ZCs0NHwwO249ZCs0OHwwO209ZCs1MnwwO2w9ZCs1NnwwO2s9ZCs2MHwwO2o9ZCs2NHwwO2g9ZCs2OHwwO3I9ZCs3MnwwO2I9ZCs3NnwwO3o9MC0oY1twPj4yXXwwKXwwO3g9MC0oY1tuPj4yXXwwKXwwO3c9MC0oY1ttPj4yXXwwKXwwO3Y9MC0oY1tsPj4yXXwwKXwwO3U9MC0oY1trPj4yXXwwKXwwO3Q9MC0oY1tqPj4yXXwwKXwwO3M9MC0oY1toPj4yXXwwKXwwO2Q9MC0oY1tyPj4yXXwwKXwwO289MC0oY1tiPj4yXXwwKXwwO2NbZT4+Ml09MS0oY1txPj4yXXwwKTtjW3k+PjJdPXo7Y1tlKzg+PjJdPXg7Y1tlKzEyPj4yXT13O2NbZSsxNj4+Ml09djtjW2UrMjA+PjJdPXU7Y1tlKzI0Pj4yXT10O2NbZSsyOD4+Ml09cztjW2UrMzI+PjJdPWQ7Y1tlKzM2Pj4yXT1vO0ljKGUsZSk7bz1mKzR8MDtjW28+PjJdPTA7Y1tvKzQ+PjJdPTA7Y1tvKzg+PjJdPTA7Y1tvKzEyPj4yXT0wO2NbbysxNj4+Ml09MDtjW28rMjA+PjJdPTA7Y1tvKzI0Pj4yXT0wO2NbbysyOD4+Ml09MDtwPWNbcD4+Ml18MDtuPWNbbj4+Ml18MDttPWNbbT4+Ml18MDtsPWNbbD4+Ml18MDtrPWNbaz4+Ml18MDtqPWNbaj4+Ml18MDtoPWNbaD4+Ml18MDtkPWNbcj4+Ml18MDtiPWNbYj4+Ml18MDtjW2Y+PjJdPShjW3E+PjJdfDApKzE7Y1tvPj4yXT1wO2NbZis4Pj4yXT1uO2NbZisxMj4+Ml09bTtjW2YrMTY+PjJdPWw7Y1tmKzIwPj4yXT1rO2NbZisyND4+Ml09ajtjW2YrMjg+PjJdPWg7Y1tmKzMyPj4yXT1kO2NbZiszNj4+Ml09YjtKYyhmLGYsZSk7TGMoYSxmKTtmPTA7aT1nO3JldHVybiBmfDB9ZnVuY3Rpb24gVWMoYixlKXtiPWJ8MDtlPWV8MDt2YXIgZj0wLGc9MCxoPTAsaj0wLGs9MCxsPTAsbT0wO2s9aTtnPWk9aSs2MyYtNjQ7aT1pKzI3MnwwO2g9ZztnPWcrMjA4fDA7Zj1oKzY0fDA7aj1oO2w9ODttPWorNjR8MDtkb3tjW2o+PjJdPWNbbD4+Ml07aj1qKzR8MDtsPWwrNHwwfXdoaWxlKChqfDApPChtfDApKTtqPWgrNzJ8MDtjW2o+PjJdPTI1NjtjW2orND4+Ml09MDtqPWY7Y1tqPj4yXT0wO2Nbais0Pj4yXT0wO2o9aCs4MHwwO2w9ZTttPWorMzJ8MDtkb3thW2o+PjBdPWFbbD4+MF18MDtqPWorMXwwO2w9bCsxfDB9d2hpbGUoKGp8MCk8KG18MCkpO0diKGgsZyk7YVtnPj4wXT0oZFtnPj4wXXwwKSYyNDg7aj1nKzMxfDA7YVtqPj4wXT0oZFtqPj4wXXwwKSY2M3w2NDtqPWI7bD1nO209aiszMnwwO2Rve2Fbaj4+MF09YVtsPj4wXXwwO2o9aisxfDA7bD1sKzF8MH13aGlsZSgoanwwKTwobXwwKSk7aT1rO3JldHVybiAwfWZ1bmN0aW9uIFZjKGIsZSxmLGcsaCl7Yj1ifDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7dmFyIGo9MCxrPTAsbD0wLG09MCxuPTAsbz0wLHA9MCxxPTAscj0wLHM9MCx0PTAsdT0wLHY9MCx3PTAseD0wLHk9MCx6PTAsQT0wLEI9MCxDPTAsRD0wLEU9MCxGPTAsRz0wLEg9MCxJPTAsSj0wLEs9MCxMPTAsTT0wLE49MCxPPTAsUD0wLFE9MCxSPTAsUz0wLFQ9MCxVPTAsVj0wLFc9MCxYPTAsWT0wLFo9MCxfPTAsJD0wLGFhPTAsYmE9MCxjYT0wLGRhPTAsZWE9MCxmYT0wLGdhPTAsaGE9MCxpYT0wLGphPTAsa2E9MCxsYT0wLG1hPTAsbmE9MCxvYT0wLHBhPTAscWE9MCxyYT0wLHNhPTAsdGE9MCx1YT0wLHZhPTAsd2E9MCx4YT0wLHlhPTAsemE9MCxBYT0wLEJhPTAsQ2E9MCxEYT0wLEVhPTAsRmE9MCxHYT0wLEhhPTAsSWE9MCxKYT0wLEthPTAsTGE9MCxNYT0wLE5hPTAsT2E9MCxQYT0wLFFhPTAsUmE9MCxTYT0wLFRhPTAsVWE9MCxWYT0wLFdhPTAsWGE9MCxZYT0wLFphPTAsX2E9MCwkYT0wLGFiPTAsYmI9MCxjYj0wLGRiPTAsZWI9MCxmYj0wLGdiPTAsaGI9MCxpYj0wLGpiPTAsa2I9MCxsYj0wLG1iPTAsbmI9MCxvYj0wLHBiPTAscWI9MCxyYj0wO1FhPWk7aj1pPWkrNjMmLTY0O2k9aSszMDI0fDA7TWE9aisyODAwfDA7TmE9aisyNTQ0fDA7T2E9aisyMjg4fDA7az1qKzIyNDh8MDtKYT1qKzk2OHwwO0thPWorODA4fDA7TGE9ais2NDh8MDt0PWorNDg4fDA7bj1qO3A9aisyOTUyfDA7UGE9aisyOTIwfDA7cz1qKzMyOHwwO2o9aisyMDh8MDtpZigoZFtiKzYzPj4wXXwwKT4zMSl7Yj0tMTtpPVFhO3JldHVybiBifDB9aWYoTmMocyxoKXwwKXtiPS0xO2k9UWE7cmV0dXJuIGJ8MH1pZighKChhW2grMzE+PjBdfChhW2grMzA+PjBdfChhW2grMjk+PjBdfChhW2grMjg+PjBdfChhW2grMjc+PjBdfChhW2grMjY+PjBdfChhW2grMjU+PjBdfChhW2grMjQ+PjBdfChhW2grMjM+PjBdfChhW2grMjI+PjBdfChhW2grMjE+PjBdfChhW2grMjA+PjBdfChhW2grMTk+PjBdfChhW2grMTg+PjBdfChhW2grMTc+PjBdfChhW2grMTY+PjBdfChhW2grMTU+PjBdfChhW2grMTQ+PjBdfChhW2grMTM+PjBdfChhW2grMTI+PjBdfChhW2grMTE+PjBdfChhW2grMTA+PjBdfChhW2grOT4+MF18KGFbaCs4Pj4wXXwoYVtoKzc+PjBdfChhW2grNj4+MF18KGFbaCs1Pj4wXXwoYVtoKzQ+PjBdfChhW2grMz4+MF18KGFbaCsyPj4wXXwoYVtoKzE+PjBdfGFbaD4+MF0pKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpPDwyND4+MjQpKXtiPS0xO2k9UWE7cmV0dXJuIGJ8MH1sPW4rNjR8MDtxPWw7Y1txPj4yXT0wO2NbcSs0Pj4yXT0wO3E9bjtvPTg7cj1xKzY0fDA7ZG97Y1txPj4yXT1jW28+PjJdO3E9cSs0fDA7bz1vKzR8MH13aGlsZSgocXwwKTwocnwwKSk7bT1uKzcyfDA7cT1tO2NbcT4+Ml09MjU2O2NbcSs0Pj4yXT0wO3E9bDtjW3E+PjJdPTA7Y1txKzQ+PjJdPTA7cT1uKzgwfDA7bz1iO3I9cSszMnwwO2Rve2FbcT4+MF09YVtvPj4wXXwwO3E9cSsxfDA7bz1vKzF8MH13aGlsZSgocXwwKTwocnwwKSk7cT1tO2NbcT4+Ml09NTEyO2NbcSs0Pj4yXT0wO3E9bDtjW3E+PjJdPTA7Y1txKzQ+PjJdPTA7cT1uKzExMnwwO289aDtyPXErMzJ8MDtkb3thW3E+PjBdPWFbbz4+MF18MDtxPXErMXwwO289bysxfDB9d2hpbGUoKHF8MCk8KHJ8MCkpO0ZiKG4sZSxmLGcpO0diKG4scCk7V2MocCk7Zj0wO2Rve2FbTmErZj4+MF09KGRbcCsoZj4+Myk+PjBdfDApPj4+KGYmNykmMTtmPWYrMXwwfXdoaWxlKChmfDApIT0yNTYpO3A9YiszMnwwO289MDt3aGlsZSgxKXtlPU5hK298MDthOmRvIGlmKGFbZT4+MF18MCl7aD0xO2Rve2c9aCtvfDA7aWYoKGd8MCk+PTI1NilicmVhayBhO209TmErZ3wwO2Y9YVttPj4wXXwwO2I6ZG8gaWYoZjw8MjQ+PjI0KXtuPWFbZT4+MF18MDtmPWY8PDI0Pj4yNDw8aDtsPW4rZnwwO2lmKChsfDApPDE2KXthW2U+PjBdPWw7YVttPj4wXT0wO2JyZWFrfWY9bi1mfDA7aWYoKGZ8MCk8PS0xNilicmVhayBhO2FbZT4+MF09Zjt3aGlsZSgxKXtmPU5hK2d8MDtpZighKGFbZj4+MF18MCkpYnJlYWs7YVtmPj4wXT0wO2c9ZysxfDA7aWYoKGd8MCk+PTI1NilicmVhayBifWFbZj4+MF09MX13aGlsZSgwKTtoPWgrMXwwfXdoaWxlKChofDApPDcpfXdoaWxlKDApO289bysxfDA7aWYoKG98MCk9PTI1Nil7Zj0wO2JyZWFrfX1kb3thW09hK2Y+PjBdPShkW3ArKGY+PjMpPj4wXXwwKT4+PihmJjcpJjE7Zj1mKzF8MH13aGlsZSgoZnwwKSE9MjU2KTtvPTA7ZG97ZT1PYStvfDA7YzpkbyBpZihhW2U+PjBdfDApe2g9MTtkb3tnPWgrb3wwO2lmKChnfDApPj0yNTYpYnJlYWsgYzttPU9hK2d8MDtmPWFbbT4+MF18MDtkOmRvIGlmKGY8PDI0Pj4yNCl7bj1hW2U+PjBdfDA7Zj1mPDwyND4+MjQ8PGg7bD1uK2Z8MDtpZigobHwwKTwxNil7YVtlPj4wXT1sO2FbbT4+MF09MDticmVha31mPW4tZnwwO2lmKChmfDApPD0tMTYpYnJlYWsgYzthW2U+PjBdPWY7d2hpbGUoMSl7Zj1PYStnfDA7aWYoIShhW2Y+PjBdfDApKWJyZWFrO2FbZj4+MF09MDtnPWcrMXwwO2lmKChnfDApPj0yNTYpYnJlYWsgZH1hW2Y+PjBdPTF9d2hpbGUoMCk7aD1oKzF8MH13aGlsZSgoaHwwKTw3KX13aGlsZSgwKTtvPW8rMXwwfXdoaWxlKChvfDApIT0yNTYpO1FjKEphLHMpO0lhPWNbcys0Pj4yXXwwO3I9Y1tzKzg+PjJdfDA7cT1jW3MrMTI+PjJdfDA7R2E9Y1tzKzE2Pj4yXXwwO0ZhPWNbcysyMD4+Ml18MDtFYT1jW3MrMjQ+PjJdfDA7RGE9Y1tzKzI4Pj4yXXwwO0NhPWNbcyszMj4+Ml18MDtCYT1jW3MrMzY+PjJdfDA7Y1tNYT4+Ml09Y1tzPj4yXTtjW01hKzQ+PjJdPUlhO2NbTWErOD4+Ml09cjtjW01hKzEyPj4yXT1xO2NbTWErMTY+PjJdPUdhO2NbTWErMjA+PjJdPUZhO2NbTWErMjQ+PjJdPUVhO2NbTWErMjg+PjJdPURhO2NbTWErMzI+PjJdPUNhO2NbTWErMzY+PjJdPUJhO0JhPWNbcys0ND4+Ml18MDtDYT1jW3MrNDg+PjJdfDA7RGE9Y1tzKzUyPj4yXXwwO0VhPWNbcys1Nj4+Ml18MDtGYT1jW3MrNjA+PjJdfDA7R2E9Y1tzKzY0Pj4yXXwwO3E9Y1tzKzY4Pj4yXXwwO3I9Y1tzKzcyPj4yXXwwO0lhPWNbcys3Nj4+Ml18MDtjW01hKzQwPj4yXT1jW3MrNDA+PjJdO2NbTWErNDQ+PjJdPUJhO2NbTWErNDg+PjJdPUNhO2NbTWErNTI+PjJdPURhO2NbTWErNTY+PjJdPUVhO2NbTWErNjA+PjJdPUZhO2NbTWErNjQ+PjJdPUdhO2NbTWErNjg+PjJdPXE7Y1tNYSs3Mj4+Ml09cjtjW01hKzc2Pj4yXT1JYTtJYT1jW3MrODQ+PjJdfDA7cj1jW3MrODg+PjJdfDA7cT1jW3MrOTI+PjJdfDA7R2E9Y1tzKzk2Pj4yXXwwO0ZhPWNbcysxMDA+PjJdfDA7RWE9Y1tzKzEwND4+Ml18MDtEYT1jW3MrMTA4Pj4yXXwwO0NhPWNbcysxMTI+PjJdfDA7QmE9Y1tzKzExNj4+Ml18MDtjW01hKzgwPj4yXT1jW3MrODA+PjJdO2NbTWErODQ+PjJdPUlhO2NbTWErODg+PjJdPXI7Y1tNYSs5Mj4+Ml09cTtjW01hKzk2Pj4yXT1HYTtjW01hKzEwMD4+Ml09RmE7Y1tNYSsxMDQ+PjJdPUVhO2NbTWErMTA4Pj4yXT1EYTtjW01hKzExMj4+Ml09Q2E7Y1tNYSsxMTY+PjJdPUJhO1BjKEthLE1hKTtCYT1LYSsxMjB8MDtKYyh0LEthLEJhKTtDYT1LYSs0MHwwO0RhPUthKzgwfDA7SmModCs0MHwwLENhLERhKTtKYyh0KzgwfDAsRGEsQmEpO0pjKHQrMTIwfDAsS2EsQ2EpO01jKEthLHQsSmEpO0pjKExhLEthLEJhKTtFYT1MYSs0MHwwO0pjKEVhLENhLERhKTtGYT1MYSs4MHwwO0pjKEZhLERhLEJhKTtHYT1MYSsxMjB8MDtKYyhHYSxLYSxDYSk7cT1KYSsxNjB8MDtRYyhxLExhKTtNYyhLYSx0LHEpO0pjKExhLEthLEJhKTtKYyhFYSxDYSxEYSk7SmMoRmEsRGEsQmEpO0pjKEdhLEthLENhKTtxPUphKzMyMHwwO1FjKHEsTGEpO01jKEthLHQscSk7SmMoTGEsS2EsQmEpO0pjKEVhLENhLERhKTtKYyhGYSxEYSxCYSk7SmMoR2EsS2EsQ2EpO3E9SmErNDgwfDA7UWMocSxMYSk7TWMoS2EsdCxxKTtKYyhMYSxLYSxCYSk7SmMoRWEsQ2EsRGEpO0pjKEZhLERhLEJhKTtKYyhHYSxLYSxDYSk7cT1KYSs2NDB8MDtRYyhxLExhKTtNYyhLYSx0LHEpO0pjKExhLEthLEJhKTtKYyhFYSxDYSxEYSk7SmMoRmEsRGEsQmEpO0pjKEdhLEthLENhKTtxPUphKzgwMHwwO1FjKHEsTGEpO01jKEthLHQscSk7SmMoTGEsS2EsQmEpO0pjKEVhLENhLERhKTtKYyhGYSxEYSxCYSk7SmMoR2EsS2EsQ2EpO3E9SmErOTYwfDA7UWMocSxMYSk7TWMoS2EsdCxxKTtKYyhMYSxLYSxCYSk7SmMoRWEsQ2EsRGEpO0pjKEZhLERhLEJhKTtKYyhHYSxLYSxDYSk7UWMoSmErMTEyMHwwLExhKTtxPWo7cj1xKzQwfDA7ZG97Y1txPj4yXT0wO3E9cSs0fDB9d2hpbGUoKHF8MCk8KHJ8MCkpO0hhPWorNDB8MDtjW0hhPj4yXT0xO3E9ais0NHwwO3I9cSszNnwwO2Rve2NbcT4+Ml09MDtxPXErNHwwfXdoaWxlKChxfDApPChyfDApKTtJYT1qKzgwfDA7Y1tJYT4+Ml09MTtxPWorODR8MDtyPXErMzZ8MDtkb3tjW3E+PjJdPTA7cT1xKzR8MH13aGlsZSgocXwwKTwocnwwKSk7Zz0yNTU7d2hpbGUoMSl7aWYoYVtOYStnPj4wXXwwKXtmPWc7YnJlYWt9aWYoYVtPYStnPj4wXXwwKXtmPWc7YnJlYWt9Zj1nKy0xfDA7aWYoKGd8MCk+MClnPWY7ZWxzZSBicmVha31pZigoZnwwKT4tMSl7bD1MYSs0NHwwO209TGErNDh8MDtuPUxhKzUyfDA7ZT1MYSs1NnwwO2g9TGErNjB8MDtvPUxhKzY0fDA7cD1MYSs2OHwwO3E9TGErNzJ8MDtyPUxhKzc2fDA7cz1MYSs0fDA7dD1MYSs4fDA7dT1MYSsxMnwwO3Y9TGErMTZ8MDt3PUxhKzIwfDA7eD1MYSsyNHwwO3k9TGErMjh8MDt6PUxhKzMyfDA7QT1MYSszNnwwO0I9S2ErNHwwO0M9S2ErOHwwO0Q9S2ErMTJ8MDtFPUthKzE2fDA7Rj1LYSsyMHwwO0c9S2ErMjR8MDtIPUthKzI4fDA7ST1LYSszMnwwO0o9S2ErMzZ8MDtLPUthKzQ0fDA7TD1LYSs0OHwwO009S2ErNTJ8MDtOPUthKzU2fDA7Tz1LYSs2MHwwO1A9S2ErNjR8MDtRPUthKzY4fDA7Uj1LYSs3MnwwO1M9S2ErNzZ8MDtUPUxhKzg0fDA7VT1MYSs4OHwwO1Y9TGErOTJ8MDtXPUxhKzk2fDA7WD1MYSsxMDB8MDtZPUxhKzEwNHwwO1o9TGErMTA4fDA7Xz1MYSsxMTJ8MDskPUxhKzExNnwwO2FhPWsrNHwwO2JhPWsrOHwwO2NhPWsrMTJ8MDtkYT1rKzE2fDA7ZWE9aysyMHwwO2ZhPWsrMjR8MDtnYT1rKzI4fDA7aGE9ayszMnwwO2lhPWsrMzZ8MDtqYT1LYSs4NHwwO2thPUthKzg4fDA7bGE9S2ErOTJ8MDttYT1LYSs5NnwwO25hPUthKzEwMHwwO29hPUthKzEwNHwwO3BhPUthKzEwOHwwO3FhPUthKzExMnwwO3JhPUthKzExNnwwO3NhPUthKzEyNHwwO3RhPUthKzEyOHwwO3VhPUthKzEzMnwwO3ZhPUthKzEzNnwwO3dhPUthKzE0MHwwO3hhPUthKzE0NHwwO3lhPUthKzE0OHwwO3phPUthKzE1MnwwO0FhPUthKzE1NnwwO3doaWxlKDEpe1BjKEthLGopO2c9YVtOYStmPj4wXXwwO2lmKGc8PDI0Pj4yNDw9MCl7aWYoZzw8MjQ+PjI0PDApe0pjKExhLEthLEJhKTtKYyhFYSxDYSxEYSk7SmMoRmEsRGEsQmEpO0pjKEdhLEthLENhKTtoYj0oZzw8MjQ+PjI0fDApLy0yfDA7cmI9Y1tFYT4+Ml18MDtYYT1jW2w+PjJdfDA7VGE9Y1ttPj4yXXwwO2liPWNbbj4+Ml18MDttYj1jW2U+PjJdfDA7cWI9Y1toPj4yXXwwOyRhPWNbbz4+Ml18MDtiYj1jW3A+PjJdfDA7ZGI9Y1txPj4yXXwwO2ZiPWNbcj4+Ml18MDtaYT1jW0xhPj4yXXwwO1ZhPWNbcz4+Ml18MDtSYT1jW3Q+PjJdfDA7a2I9Y1t1Pj4yXXwwO29iPWNbdj4+Ml18MDtfYT1jW3c+PjJdfDA7YWI9Y1t4Pj4yXXwwO2NiPWNbeT4+Ml18MDtlYj1jW3o+PjJdfDA7Z2I9Y1tBPj4yXXwwO2NbS2E+PjJdPVphK3JiO2NbQj4+Ml09VmErWGE7Y1tDPj4yXT1SYStUYTtjW0Q+PjJdPWtiK2liO2NbRT4+Ml09b2IrbWI7Y1tGPj4yXT1fYStxYjtjW0c+PjJdPWFiKyRhO2NbSD4+Ml09Y2IrYmI7Y1tJPj4yXT1lYitkYjtjW0o+PjJdPWdiK2ZiO2NbQ2E+PjJdPXJiLVphO2NbSz4+Ml09WGEtVmE7Y1tMPj4yXT1UYS1SYTtjW00+PjJdPWliLWtiO2NbTj4+Ml09bWItb2I7Y1tPPj4yXT1xYi1fYTtjW1A+PjJdPSRhLWFiO2NbUT4+Ml09YmItY2I7Y1tSPj4yXT1kYi1lYjtjW1M+PjJdPWZiLWdiO0pjKERhLEthLEphKyhoYioxNjB8MCkrNDB8MCk7SmMoQ2EsQ2EsSmErKGhiKjE2MHwwKXwwKTtKYyhCYSxKYSsoaGIqMTYwfDApKzEyMHwwLEdhKTtKYyhLYSxGYSxKYSsoaGIqMTYwfDApKzgwfDApO2hiPWNbS2E+PjJdPDwxO2diPWNbQj4+Ml08PDE7ZmI9Y1tDPj4yXTw8MTtlYj1jW0Q+PjJdPDwxO2RiPWNbRT4+Ml08PDE7Y2I9Y1tGPj4yXTw8MTtiYj1jW0c+PjJdPDwxO2FiPWNbSD4+Ml08PDE7JGE9Y1tJPj4yXTw8MTtfYT1jW0o+PjJdPDwxO2Nbaz4+Ml09aGI7Y1thYT4+Ml09Z2I7Y1tiYT4+Ml09ZmI7Y1tjYT4+Ml09ZWI7Y1tkYT4+Ml09ZGI7Y1tlYT4+Ml09Y2I7Y1tmYT4+Ml09YmI7Y1tnYT4+Ml09YWI7Y1toYT4+Ml09JGE7Y1tpYT4+Ml09X2E7cWI9Y1tEYT4+Ml18MDtvYj1jW2phPj4yXXwwO21iPWNba2E+PjJdfDA7a2I9Y1tsYT4+Ml18MDtpYj1jW21hPj4yXXwwO1JhPWNbbmE+PjJdfDA7VGE9Y1tvYT4+Ml18MDtWYT1jW3BhPj4yXXwwO1hhPWNbcWE+PjJdfDA7WmE9Y1tyYT4+Ml18MDtyYj1jW0NhPj4yXXwwO3BiPWNbSz4+Ml18MDtuYj1jW0w+PjJdfDA7bGI9Y1tNPj4yXXwwO2piPWNbTj4+Ml18MDtnPWNbTz4+Ml18MDtTYT1jW1A+PjJdfDA7VWE9Y1tRPj4yXXwwO1dhPWNbUj4+Ml18MDtZYT1jW1M+PjJdfDA7Y1tLYT4+Ml09cWItcmI7Y1tCPj4yXT1vYi1wYjtjW0M+PjJdPW1iLW5iO2NbRD4+Ml09a2ItbGI7Y1tFPj4yXT1pYi1qYjtjW0Y+PjJdPVJhLWc7Y1tHPj4yXT1UYS1TYTtjW0g+PjJdPVZhLVVhO2NbST4+Ml09WGEtV2E7Y1tKPj4yXT1aYS1ZYTtjW0NhPj4yXT1yYitxYjtjW0s+PjJdPXBiK29iO2NbTD4+Ml09bmIrbWI7Y1tNPj4yXT1sYitrYjtjW04+PjJdPWpiK2liO2NbTz4+Ml09ZytSYTtjW1A+PjJdPVNhK1RhO2NbUT4+Ml09VWErVmE7Y1tSPj4yXT1XYStYYTtjW1M+PjJdPVlhK1phO1phPWNbQmE+PjJdfDA7WWE9Y1tzYT4+Ml18MDtYYT1jW3RhPj4yXXwwO1dhPWNbdWE+PjJdfDA7VmE9Y1t2YT4+Ml18MDtVYT1jW3dhPj4yXXwwO1RhPWNbeGE+PjJdfDA7U2E9Y1t5YT4+Ml18MDtSYT1jW3phPj4yXXwwO2c9Y1tBYT4+Ml18MDtjW0RhPj4yXT1oYi1aYTtjW2phPj4yXT1nYi1ZYTtjW2thPj4yXT1mYi1YYTtjW2xhPj4yXT1lYi1XYTtjW21hPj4yXT1kYi1WYTtjW25hPj4yXT1jYi1VYTtjW29hPj4yXT1iYi1UYTtjW3BhPj4yXT1hYi1TYTtjW3FhPj4yXT0kYS1SYTtjW3JhPj4yXT1fYS1nO1lhPVlhKyhjW2FhPj4yXXwwKXwwO1hhPVhhKyhjW2JhPj4yXXwwKXwwO1dhPVdhKyhjW2NhPj4yXXwwKXwwO1ZhPVZhKyhjW2RhPj4yXXwwKXwwO1VhPVVhKyhjW2VhPj4yXXwwKXwwO1RhPVRhKyhjW2ZhPj4yXXwwKXwwO1NhPVNhKyhjW2dhPj4yXXwwKXwwO1JhPVJhKyhjW2hhPj4yXXwwKXwwO2c9ZysoY1tpYT4+Ml18MCl8MDtjW0JhPj4yXT1aYSsoY1trPj4yXXwwKTtjW3NhPj4yXT1ZYTtjW3RhPj4yXT1YYTtjW3VhPj4yXT1XYTtjW3ZhPj4yXT1WYTtjW3dhPj4yXT1VYTtjW3hhPj4yXT1UYTtjW3lhPj4yXT1TYTtjW3phPj4yXT1SYTtjW0FhPj4yXT1nfX1lbHNle0pjKExhLEthLEJhKTtKYyhFYSxDYSxEYSk7SmMoRmEsRGEsQmEpO0pjKEdhLEthLENhKTtNYyhLYSxMYSxKYSsoKChnPDwyND4+MjR8MCkvMnwwKSoxNjB8MCl8MCl9Zz1hW09hK2Y+PjBdfDA7aWYoZzw8MjQ+PjI0PD0wKXtpZihnPDwyND4+MjQ8MCl7SmMoTGEsS2EsQmEpO0pjKEVhLENhLERhKTtKYyhGYSxEYSxCYSk7SmMoR2EsS2EsQ2EpO19hPShnPDwyND4+MjR8MCkvLTJ8MDtnPWNbRWE+PjJdfDA7a2I9Y1tsPj4yXXwwO29iPWNbbT4+Ml18MDtaYT1jW24+PjJdfDA7VmE9Y1tlPj4yXXwwO1JhPWNbaD4+Ml18MDtnYj1jW28+PjJdfDA7ZWI9Y1twPj4yXXwwO2NiPWNbcT4+Ml18MDthYj1jW3I+PjJdfDA7aWI9Y1tMYT4+Ml18MDttYj1jW3M+PjJdfDA7cWI9Y1t0Pj4yXXwwO1hhPWNbdT4+Ml18MDtUYT1jW3Y+PjJdfDA7aGI9Y1t3Pj4yXXwwO2ZiPWNbeD4+Ml18MDtkYj1jW3k+PjJdfDA7YmI9Y1t6Pj4yXXwwOyRhPWNbQT4+Ml18MDtjW0thPj4yXT1pYitnO2NbQj4+Ml09bWIra2I7Y1tDPj4yXT1xYitvYjtjW0Q+PjJdPVhhK1phO2NbRT4+Ml09VGErVmE7Y1tGPj4yXT1oYitSYTtjW0c+PjJdPWZiK2diO2NbSD4+Ml09ZGIrZWI7Y1tJPj4yXT1iYitjYjtjW0o+PjJdPSRhK2FiO2NbQ2E+PjJdPWctaWI7Y1tLPj4yXT1rYi1tYjtjW0w+PjJdPW9iLXFiO2NbTT4+Ml09WmEtWGE7Y1tOPj4yXT1WYS1UYTtjW08+PjJdPVJhLWhiO2NbUD4+Ml09Z2ItZmI7Y1tRPj4yXT1lYi1kYjtjW1I+PjJdPWNiLWJiO2NbUz4+Ml09YWItJGE7SmMoRGEsS2EsMTA0KyhfYSoxMjB8MCkrNDB8MCk7SmMoQ2EsQ2EsMTA0KyhfYSoxMjB8MCl8MCk7SmMoQmEsMTA0KyhfYSoxMjB8MCkrODB8MCxHYSk7X2E9Y1tGYT4+Ml08PDE7JGE9Y1tUPj4yXTw8MTthYj1jW1U+PjJdPDwxO2JiPWNbVj4+Ml08PDE7Y2I9Y1tXPj4yXTw8MTtkYj1jW1g+PjJdPDwxO2ViPWNbWT4+Ml08PDE7ZmI9Y1taPj4yXTw8MTtnYj1jW18+PjJdPDwxO2hiPWNbJD4+Ml08PDE7Y1trPj4yXT1fYTtjW2FhPj4yXT0kYTtjW2JhPj4yXT1hYjtjW2NhPj4yXT1iYjtjW2RhPj4yXT1jYjtjW2VhPj4yXT1kYjtjW2ZhPj4yXT1lYjtjW2dhPj4yXT1mYjtjW2hhPj4yXT1nYjtjW2lhPj4yXT1oYjtSYT1jW0RhPj4yXXwwO1RhPWNbamE+PjJdfDA7VmE9Y1trYT4+Ml18MDtYYT1jW2xhPj4yXXwwO1phPWNbbWE+PjJdfDA7cWI9Y1tuYT4+Ml18MDtvYj1jW29hPj4yXXwwO21iPWNbcGE+PjJdfDA7a2I9Y1txYT4+Ml18MDtpYj1jW3JhPj4yXXwwO2c9Y1tDYT4+Ml18MDtTYT1jW0s+PjJdfDA7VWE9Y1tMPj4yXXwwO1dhPWNbTT4+Ml18MDtZYT1jW04+PjJdfDA7cmI9Y1tPPj4yXXwwO3BiPWNbUD4+Ml18MDtuYj1jW1E+PjJdfDA7bGI9Y1tSPj4yXXwwO2piPWNbUz4+Ml18MDtjW0thPj4yXT1SYS1nO2NbQj4+Ml09VGEtU2E7Y1tDPj4yXT1WYS1VYTtjW0Q+PjJdPVhhLVdhO2NbRT4+Ml09WmEtWWE7Y1tGPj4yXT1xYi1yYjtjW0c+PjJdPW9iLXBiO2NbSD4+Ml09bWItbmI7Y1tJPj4yXT1rYi1sYjtjW0o+PjJdPWliLWpiO2NbQ2E+PjJdPWcrUmE7Y1tLPj4yXT1TYStUYTtjW0w+PjJdPVVhK1ZhO2NbTT4+Ml09V2ErWGE7Y1tOPj4yXT1ZYStaYTtjW08+PjJdPXJiK3FiO2NbUD4+Ml09cGIrb2I7Y1tRPj4yXT1uYittYjtjW1I+PjJdPWxiK2tiO2NbUz4+Ml09amIraWI7aWI9Y1tCYT4+Ml18MDtqYj1jW3NhPj4yXXwwO2tiPWNbdGE+PjJdfDA7bGI9Y1t1YT4+Ml18MDttYj1jW3ZhPj4yXXwwO25iPWNbd2E+PjJdfDA7b2I9Y1t4YT4+Ml18MDtwYj1jW3lhPj4yXXwwO3FiPWNbemE+PjJdfDA7cmI9Y1tBYT4+Ml18MDtjW0RhPj4yXT1fYS1pYjtjW2phPj4yXT0kYS1qYjtjW2thPj4yXT1hYi1rYjtjW2xhPj4yXT1iYi1sYjtjW21hPj4yXT1jYi1tYjtjW25hPj4yXT1kYi1uYjtjW29hPj4yXT1lYi1vYjtjW3BhPj4yXT1mYi1wYjtjW3FhPj4yXT1nYi1xYjtjW3JhPj4yXT1oYi1yYjtqYj1qYisoY1thYT4+Ml18MCl8MDtrYj1rYisoY1tiYT4+Ml18MCl8MDtsYj1sYisoY1tjYT4+Ml18MCl8MDttYj1tYisoY1tkYT4+Ml18MCl8MDtuYj1uYisoY1tlYT4+Ml18MCl8MDtvYj1vYisoY1tmYT4+Ml18MCl8MDtwYj1wYisoY1tnYT4+Ml18MCl8MDtxYj1xYisoY1toYT4+Ml18MCl8MDtyYj1yYisoY1tpYT4+Ml18MCl8MDtjW0JhPj4yXT1pYisoY1trPj4yXXwwKTtjW3NhPj4yXT1qYjtjW3RhPj4yXT1rYjtjW3VhPj4yXT1sYjtjW3ZhPj4yXT1tYjtjW3dhPj4yXT1uYjtjW3hhPj4yXT1vYjtjW3lhPj4yXT1wYjtjW3phPj4yXT1xYjtjW0FhPj4yXT1yYn19ZWxzZXtKYyhMYSxLYSxCYSk7SmMoRWEsQ2EsRGEpO0pjKEZhLERhLEJhKTtKYyhHYSxLYSxDYSk7T2MoS2EsTGEsMTA0KygoKGc8PDI0Pj4yNHwwKS8yfDApKjEyMHwwKXwwKX1KYyhqLEthLEJhKTtKYyhIYSxDYSxEYSk7SmMoSWEsRGEsQmEpO2lmKChmfDApPjApZj1mKy0xfDA7ZWxzZSBicmVha319SWMoayxJYSk7SmMoTmEsaixrKTtKYyhPYSxIYSxrKTtMYyhQYSxPYSk7TGMoTWEsTmEpO2o9UGErMzF8MDthW2o+PjBdPWRbaj4+MF1eZFtNYT4+MF08PDc7aj1ZYyhQYSxiKXwwO2s9KFBhfDApPT0oYnwwKTtmPTA7Zz0wO2Rve2Y9YVtQYStnPj4wXV5hW2IrZz4+MF18ZjtnPWcrMXwwfXdoaWxlKChnfDApIT0zMik7cmI9KGs/LTE6ail8KCgoZiYyNTUpKzUxMXwwKT4+PjgmMSkrLTE7aT1RYTtyZXR1cm4gcmJ8MH1mdW5jdGlvbiBXYyhiKXtiPWJ8MDt2YXIgYz0wLGU9MCxmPTAsZz0wLGg9MCxpPTAsaj0wLGs9MCxsPTAsbT0wLG49MCxvPTAscD0wLHE9MCxyPTAscz0wLHQ9MCx1PTAsdj0wLHc9MCx4PTAseT0wLHo9MCxBPTAsQj0wLEQ9MCxFPTAsRj0wLEc9MCxIPTAsST0wLEo9MCxLPTAsTD0wLE09MCxOPTAsTz0wLFA9MCxRPTAsUj0wLFM9MCxUPTAsVT0wLFY9MCxXPTAsWD0wLFk9MCxaPTAsXz0wLCQ9MCxhYT0wLGJhPTAsY2E9MCxkYT0wLGVhPTAsZmE9MCxnYT0wLGhhPTAsaWE9MCxqYT0wLGthPTAsbGE9MCxtYT0wLG5hPTAsb2E9MCxwYT0wLHFhPTAscmE9MCxzYT0wLHRhPTAsdWE9MCx2YT0wLHdhPTAseGE9MCx5YT0wLHphPTAsQWE9MCxCYT0wLENhPTAsRGE9MCxFYT0wLEZhPTAsR2E9MCxIYT0wLElhPTAsSmE9MCxLYT0wLExhPTAsTWE9MCxOYT0wLE9hPTAsUGE9MCxRYT0wLFJhPTAsU2E9MCxUYT0wLFVhPTAsVmE9MCxXYT0wLFhhPTAsWWE9MCxaYT0wLF9hPTAsJGE9MCxhYj0wLGJiPTAsY2I9MCxkYj0wLGViPTAsZmI9MCxnYj0wO2VhPWIrMXwwO2JhPWIrMnwwO0Q9YVtiYT4+MF18MDtmPWRbYj4+MF18MDtuPUhkKGRbZWE+PjBdfDB8MCwwLDgpfDA7dmE9QztEPUQmMjU1O1Y9SGQoRHwwLDAsMTYpfDA7YWE9YiszfDA7eT1IZChkW2FhPj4wXXwwfDAsMCw4KXwwO2dhPUM7JD1iKzR8MDtVPUhkKGRbJD4+MF18MHwwLDAsMTYpfDA7Z2E9Z2F8QztZPWIrNXwwO049ZFtZPj4wXXwwO1g9SGQoTnwwLDAsMjQpfDA7Z2E9R2QoeXxEfFV8WHwwLGdhfEN8MCw1KXwwO1g9Yis2fDA7VT1iKzd8MDtEPWFbVT4+MF18MDt5PUhkKGRbWD4+MF18MHwwLDAsOCl8MDtCYT1DO0Q9RCYyNTU7VD1IZChEfDAsMCwxNil8MDtCYT1HZCh5fE58VHwwLEJhfEN8MCwyKXwwO1Q9Yis4fDA7Tj1IZChkW1Q+PjBdfDB8MCwwLDgpfDA7eT1DO1M9Yis5fDA7Q2E9SGQoZFtTPj4wXXwwfDAsMCwxNil8MDt5PXl8QztQPWIrMTB8MDtTYT1kW1A+PjBdfDA7Tz1IZChTYXwwLDAsMjQpfDA7eT1HZChOfER8Q2F8T3wwLHl8Q3wwLDcpfDA7Tz1iKzExfDA7Q2E9SGQoZFtPPj4wXXwwfDAsMCw4KXwwO0Q9QztOPWIrMTJ8MDtHPUhkKGRbTj4+MF18MHwwLDAsMTYpfDA7RD1EfEM7Sz1iKzEzfDA7dT1kW0s+PjBdfDA7Sj1IZCh1fDAsMCwyNCl8MDtEPUdkKENhfFNhfEd8SnwwLER8Q3wwLDQpfDA7Sj1iKzE0fDA7Rz1iKzE1fDA7U2E9YVtHPj4wXXwwO0NhPUhkKGRbSj4+MF18MHwwLDAsOCl8MDtEYT1DO1NhPVNhJjI1NTtGPUhkKFNhfDAsMCwxNil8MDtEYT1HZChDYXx1fEZ8MCxEYXxDfDAsMSl8MDtGPWIrMTZ8MDt1PUhkKGRbRj4+MF18MHwwLDAsOCl8MDtDYT1DO0U9YisxN3wwO3c9SGQoZFtFPj4wXXwwfDAsMCwxNil8MDtDYT1DYXxDO0E9YisxOHwwO3Y9ZFtBPj4wXXwwO3o9SGQodnwwLDAsMjQpfDA7Q2E9R2QodXxTYXx3fHp8MCxDYXxDfDAsNil8MDt6PWIrMTl8MDt3PWIrMjB8MDtTYT1hW3c+PjBdfDA7dT1IZChkW3o+PjBdfDB8MCwwLDgpfDA7VGE9QztTYT1IZChTYSYyNTV8MCwwLDE2KXwwO1RhPUdkKHV8dnxTYXwwLFRhfEN8MCwzKXwwO1NhPUM7dj1iKzIxfDA7dT1iKzIyfDA7cj1iKzIzfDA7bmE9YVtyPj4wXXwwO2FiPWRbdj4+MF18MDtiYj1IZChkW3U+PjBdfDB8MCwwLDgpfDA7X2E9QztuYT1uYSYyNTU7JGE9SGQobmF8MCwwLDE2KXwwO3E9YisyNHwwO0thPUhkKGRbcT4+MF18MHwwLDAsOCl8MDtQYT1DO3A9YisyNXwwO2k9SGQoZFtwPj4wXXwwfDAsMCwxNil8MDtQYT1QYXxDO209YisyNnwwO3hhPWRbbT4+MF18MDtsPUhkKHhhfDAsMCwyNCl8MDtQYT1HZChLYXxuYXxpfGx8MCxQYXxDfDAsNSl8MDtsPWIrMjd8MDtpPWIrMjh8MDtuYT1hW2k+PjBdfDA7S2E9SGQoZFtsPj4wXXwwfDAsMCw4KXwwO1phPUM7bmE9bmEmMjU1O2g9SGQobmF8MCwwLDE2KXwwO1phPUdkKEthfHhhfGh8MCxaYXxDfDAsMil8MDtoPWIrMjl8MDt4YT1IZChkW2g+PjBdfDB8MCwwLDgpfDA7S2E9QztnPWIrMzB8MDtmYj1IZChkW2c+PjBdfDB8MCwwLDE2KXwwO0thPUthfEM7Yz1iKzMxfDA7cWE9ZFtjPj4wXXwwO29hPUhkKHFhfDAsMCwyNCl8MDtLYT1HZCh4YXxuYXxmYnxvYXwwLEthfEN8MCw3KXwwO29hPUhkKGRbYiszMj4+MF18MHwwLDAsOCl8MDtmYj1DO25hPUhkKGRbYiszMz4+MF18MHwwLDAsMTYpfDA7ZmI9ZmJ8Qzt4YT1kW2IrMzQ+PjBdfDA7bGE9SGQoeGF8MCwwLDI0KXwwO2ZiPUdkKG9hfHFhfG5hfGxhfDAsZmJ8Q3wwLDQpfDA7bGE9YVtiKzM2Pj4wXXwwO25hPUhkKGRbYiszNT4+MF18MHwwLDAsOCl8MDtxYT1DO2xhPWxhJjI1NTtvYT1IZChsYXwwLDAsMTYpfDA7cWE9R2QobmF8eGF8b2F8MCxxYXxDfDAsMSl8MDtvYT1IZChkW2IrMzc+PjBdfDB8MCwwLDgpfDA7eGE9QztuYT1IZChkW2IrMzg+PjBdfDB8MCwwLDE2KXwwO3hhPXhhfEM7TWE9ZFtiKzM5Pj4wXXwwO2ZhPUhkKE1hfDAsMCwyNCl8MDt4YT1HZChvYXxsYXxuYXxmYXwwLHhhfEN8MCw2KXwwO2ZhPWFbYis0MT4+MF18MDtuYT1IZChkW2IrNDA+PjBdfDB8MCwwLDgpfDA7bGE9QztmYT1IZChmYSYyNTV8MCwwLDE2KXwwO2xhPUdkKG5hfE1hfGZhfDAsbGF8Q3wwLDMpfDA7ZmE9QztNYT1hW2IrNDQ+PjBdfDA7bmE9ZFtiKzQyPj4wXXwwO29hPUhkKGRbYis0Mz4+MF18MHwwLDAsOCl8MDtqPUM7TWE9TWEmMjU1O3phPUhkKE1hfDAsMCwxNil8MDtqYT1IZChkW2IrNDU+PjBdfDB8MCwwLDgpfDA7TD1DO1c9SGQoZFtiKzQ2Pj4wXXwwfDAsMCwxNil8MDtMPUx8QztnYj1kW2IrNDc+PjBdfDA7bz1IZChnYnwwLDAsMjQpfDA7TD1HZChqYXxNYXxXfG98MCxMfEN8MCw1KXwwO289YVtiKzQ5Pj4wXXwwO1c9SGQoZFtiKzQ4Pj4wXXwwfDAsMCw4KXwwO01hPUM7bz1vJjI1NTtqYT1IZChvfDAsMCwxNil8MDtNYT1HZChXfGdifGphfDAsTWF8Q3wwLDIpfDA7TWE9TWEmMjA5NzE1MTtqYT1IZChkW2IrNTA+PjBdfDB8MCwwLDgpfDA7Z2I9QztXPUhkKGRbYis1MT4+MF18MHwwLDAsMTYpfDA7Z2I9Z2J8QztBYT1kW2IrNTI+PjBdfDA7TT1IZChBYXwwLDAsMjQpfDA7Z2I9R2QoamF8b3xXfE18MCxnYnxDfDAsNyl8MDtnYj1nYiYyMDk3MTUxO009SGQoZFtiKzUzPj4wXXwwfDAsMCw4KXwwO1c9QztvPUhkKGRbYis1ND4+MF18MHwwLDAsMTYpfDA7Vz1XfEM7amE9ZFtiKzU1Pj4wXXwwO1I9SGQoamF8MCwwLDI0KXwwO1c9R2QoTXxBYXxvfFJ8MCxXfEN8MCw0KXwwO1c9VyYyMDk3MTUxO1I9YVtiKzU3Pj4wXXwwO289SGQoZFtiKzU2Pj4wXXwwfDAsMCw4KXwwO0FhPUM7Uj1SJjI1NTtNPUhkKFJ8MCwwLDE2KXwwO0FhPUdkKG98amF8TXwwLEFhfEN8MCwxKXwwO0FhPUFhJjIwOTcxNTE7TT1IZChkW2IrNTg+PjBdfDB8MCwwLDgpfDA7amE9QztvPUhkKGRbYis1OT4+MF18MHwwLDAsMTYpfDA7amE9amF8QztoYT1kW2IrNjA+PjBdfDA7UT1IZChoYXwwLDAsMjQpfDA7amE9R2QoTXxSfG98UXwwLGphfEN8MCw2KXwwO2phPWphJjIwOTcxNTE7UT1IZChkW2IrNjE+PjBdfDB8MCwwLDgpfDA7bz1DO1I9SGQoZFtiKzYyPj4wXXwwfDAsMCwxNil8MDtvPW98QztNPUhkKGRbYis2Mz4+MF18MHwwLDAsMjQpfDA7bz1HZChRfGhhfFJ8TXwwLG98Q3wwLDMpfDA7TT1DO1I9T2Qob3wwLE18MCw2NjY2NDMsMCl8MDtoYT1DO1E9T2Qob3wwLE18MCw0NzAyOTYsMCl8MDtJPUM7Y2E9T2Qob3wwLE18MCw2NTQxODMsMCl8MDt0YT1DO0VhPU9kKG98MCxNfDAsLTk5NzgwNSwtMSl8MDt0PUM7az1PZChvfDAsTXwwLDEzNjY1NywwKXwwO0I9QztNPU9kKG98MCxNfDAsLTY4MzkwMSwtMSl8MDtqPURkKE18MCxDfDAsb2F8bmF8emEmMjAzMTYxNnwwLGp8MCl8MDt6YT1DO25hPU9kKGphfDAsMCw2NjY2NDMsMCl8MDtvYT1DO009T2QoamF8MCwwLDQ3MDI5NiwwKXwwO289QztWYT1PZChqYXwwLDAsNjU0MTgzLDApfDA7cz1DO21hPU9kKGphfDAsMCwtOTk3ODA1LC0xKXwwO189Qzt5YT1PZChqYXwwLDAsMTM2NjU3LDApfDA7c2E9QztqYT1PZChqYXwwLDAsLTY4MzkwMSwtMSl8MDtIPUM7ZT1PZChBYXwwLDAsNjY2NjQzLDApfDA7cmE9Qzt3YT1PZChBYXwwLDAsNDcwMjk2LDApfDA7TGE9QztGYT1PZChBYXwwLDAsNjU0MTgzLDApfDA7ZGE9QztjYj1PZChBYXwwLDAsLTk5NzgwNSwtMSl8MDtVYT1DO2thPU9kKEFhfDAsMCwxMzY2NTcsMCl8MDt4PUM7QWE9T2QoQWF8MCwwLC02ODM5MDEsLTEpfDA7eGE9RGQoQWF8MCxDfDAseGEmMjA5NzE1MXwwLDApfDA7c2E9RGQoeGF8MCxDfDAseWF8MCxzYXwwKXwwO3Q9RGQoc2F8MCxDfDAsRWF8MCx0fDApfDA7RWE9QztzYT1PZChXfDAsMCw2NjY2NDMsMCl8MDt5YT1DO3hhPU9kKFd8MCwwLDQ3MDI5NiwwKXwwO0FhPUM7V2E9T2QoV3wwLDAsNjU0MTgzLDApfDA7Wj1DO0hhPU9kKFd8MCwwLC05OTc4MDUsLTEpfDA7R2E9QztlYj1PZChXfDAsMCwxMzY2NTcsMCl8MDtkYj1DO1c9T2QoV3wwLDAsLTY4MzkwMSwtMSl8MDtwYT1DO2lhPU9kKGdifDAsMCw2NjY2NDMsMCl8MDt1YT1DO1FhPU9kKGdifDAsMCw0NzAyOTYsMCl8MDtSYT1DO09hPU9kKGdifDAsMCw2NTQxODMsMCl8MDtOYT1DO1lhPU9kKGdifDAsMCwtOTk3ODA1LC0xKXwwO1hhPUM7SmE9T2QoZ2J8MCwwLDEzNjY1NywwKXwwO0lhPUM7Z2I9T2QoZ2J8MCwwLC02ODM5MDEsLTEpfDA7ZmI9RGQoZ2J8MCxDfDAsZmImMjA5NzE1MXwwLDApfDA7ZGI9RGQoZmJ8MCxDfDAsZWJ8MCxkYnwwKXwwO1VhPURkKGRifDAsQ3wwLGNifDAsVWF8MCl8MDtzPURkKFVhfDAsQ3wwLFZhfDAsc3wwKXwwO0k9RGQoc3wwLEN8MCxRfDAsSXwwKXwwO1E9QztzPU9kKE1hfDAsMCw2NjY2NDMsMCl8MDtDYT1EZChzfDAsQ3wwLENhJjIwOTcxNTF8MCwwKXwwO3M9QztWYT1PZChNYXwwLDAsNDcwMjk2LDApfDA7VWE9QztjYj1PZChNYXwwLDAsNjU0MTgzLDApfDA7X2E9RGQoY2J8MCxDfDAsYmJ8YWJ8JGEmMjAzMTYxNnwwLF9hfDApfDA7UmE9RGQoX2F8MCxDfDAsUWF8MCxSYXwwKXwwO3lhPURkKFJhfDAsQ3wwLHNhfDAseWF8MCl8MDtzYT1DO1JhPU9kKE1hfDAsMCwtOTk3ODA1LC0xKXwwO1FhPUM7X2E9T2QoTWF8MCwwLDEzNjY1NywwKXwwO1phPURkKF9hfDAsQ3wwLFphJjIwOTcxNTF8MCwwKXwwO1hhPURkKFphfDAsQ3wwLFlhfDAsWGF8MCl8MDtaPURkKFhhfDAsQ3wwLFdhfDAsWnwwKXwwO0xhPURkKFp8MCxDfDAsd2F8MCxMYXwwKXwwO29hPURkKExhfDAsQ3wwLG5hfDAsb2F8MCl8MDtuYT1DO01hPU9kKE1hfDAsMCwtNjgzOTAxLC0xKXwwO0xhPUM7d2E9RGQoQ2F8MCxzfDAsMTA0ODU3NiwwKXwwO3dhPUdkKHdhfDAsQ3wwLDIxKXwwO1o9QztTYT1EZChWYXwwLFVhfDAsVGF8MCxTYXwwKXwwO1NhPURkKFNhfDAsQ3wwLHdhfDAsWnwwKXwwO3VhPURkKFNhfDAsQ3wwLGlhfDAsdWF8MCl8MDtpYT1DO1o9SGQod2F8MCxafDAsMjEpfDA7Wj1DZChDYXwwLHN8MCxafDAsQ3wwKXwwO3M9QztDYT1EZCh5YXwwLHNhfDAsMTA0ODU3NiwwKXwwO0NhPUdkKENhfDAsQ3wwLDIxKXwwO3dhPUM7UGE9RGQoUmF8MCxRYXwwLFBhJjIwOTcxNTF8MCwwKXwwO05hPURkKFBhfDAsQ3wwLE9hfDAsTmF8MCl8MDtBYT1EZChOYXwwLEN8MCx4YXwwLEFhfDApfDA7cmE9RGQoQWF8MCxDfDAsZXwwLHJhfDApfDA7cmE9RGQocmF8MCxDfDAsQ2F8MCx3YXwwKXwwO2U9Qzt3YT1IZChDYXwwLHdhfDAsMjEpfDA7Q2E9QztBYT1EZChvYXwwLG5hfDAsMTA0ODU3NiwwKXwwO0FhPUVkKEFhfDAsQ3wwLDIxKXwwO3hhPUM7S2E9RGQoTWF8MCxMYXwwLEthJjIwOTcxNTF8MCwwKXwwO0lhPURkKEthfDAsQ3wwLEphfDAsSWF8MCl8MDtHYT1EZChJYXwwLEN8MCxIYXwwLEdhfDApfDA7ZGE9RGQoR2F8MCxDfDAsRmF8MCxkYXwwKXwwO289RGQoZGF8MCxDfDAsTXwwLG98MCl8MDtoYT1EZChvfDAsQ3wwLFJ8MCxoYXwwKXwwO2hhPURkKGhhfDAsQ3wwLEFhfDAseGF8MCl8MDtSPUM7eGE9SGQoQWF8MCx4YXwwLDIxKXwwO0FhPUM7bz1EZChJfDAsUXwwLDEwNDg1NzYsMCl8MDtvPUVkKG98MCxDfDAsMjEpfDA7TT1DO3FhPURkKFd8MCxwYXwwLHFhJjIwOTcxNTF8MCwwKXwwO3g9RGQocWF8MCxDfDAsa2F8MCx4fDApfDA7Xz1EZCh4fDAsQ3wwLG1hfDAsX3wwKXwwO3RhPURkKF98MCxDfDAsY2F8MCx0YXwwKXwwO3RhPURkKHRhfDAsQ3wwLG98MCxNfDApfDA7Y2E9QztNPUhkKG98MCxNfDAsMjEpfDA7TT1DZChJfDAsUXwwLE18MCxDfDApfDA7UT1DO0k9RGQodHwwLEVhfDAsMTA0ODU3NiwwKXwwO0k9RWQoSXwwLEN8MCwyMSl8MDtvPUM7ZmE9RGQoamF8MCxIfDAsbGF8MCxmYXwwKXwwO0I9RGQoZmF8MCxDfDAsa3wwLEJ8MCl8MDtCPURkKEJ8MCxDfDAsSXwwLG98MCl8MDtrPUM7bz1IZChJfDAsb3wwLDIxKXwwO289Q2QodHwwLEVhfDAsb3wwLEN8MCl8MDtFYT1DO3Q9RGQoanwwLHphfDAsMTA0ODU3NiwwKXwwO3Q9RWQodHwwLEN8MCwyMSl8MDtJPUM7TD1EZCh0fDAsSXwwLEwmMjA5NzE1MXwwLDApfDA7ZmE9QztJPUhkKHR8MCxJfDAsMjEpfDA7ST1DZChqfDAsemF8MCxJfDAsQ3wwKXwwO3phPUM7aj1EZCh1YXwwLGlhfDAsMTA0ODU3NiwwKXwwO2o9R2QoanwwLEN8MCwyMSl8MDt0PUM7bGE9SGQoanwwLHR8MCwyMSl8MDtsYT1DZCh1YXwwLGlhfDAsbGF8MCxDfDApfDA7aWE9Qzt1YT1EZChyYXwwLGV8MCwxMDQ4NTc2LDApfDA7dWE9RWQodWF8MCxDfDAsMjEpfDA7SD1DO2phPUhkKHVhfDAsSHwwLDIxKXwwO2phPUNkKHJhfDAsZXwwLGphfDAsQ3wwKXwwO2U9QztyYT1EZChoYXwwLFJ8MCwxMDQ4NTc2LDApfDA7cmE9RWQocmF8MCxDfDAsMjEpfDA7Xz1DO1E9RGQoTXwwLFF8MCxyYXwwLF98MCl8MDtNPUM7Xz1IZChyYXwwLF98MCwyMSl8MDtfPUNkKGhhfDAsUnwwLF98MCxDfDApfDA7Uj1DO2hhPURkKHRhfDAsY2F8MCwxMDQ4NTc2LDApfDA7aGE9RWQoaGF8MCxDfDAsMjEpfDA7cmE9QztFYT1EZChoYXwwLHJhfDAsb3wwLEVhfDApfDA7bz1DO3JhPUhkKGhhfDAscmF8MCwyMSl8MDtyYT1DZCh0YXwwLGNhfDAscmF8MCxDfDApfDA7Y2E9Qzt0YT1EZChCfDAsa3wwLDEwNDg1NzYsMCl8MDt0YT1FZCh0YXwwLEN8MCwyMSl8MDtoYT1DO3phPURkKHRhfDAsaGF8MCxJfDAsemF8MCl8MDtJPUM7aGE9SGQodGF8MCxoYXwwLDIxKXwwO2hhPUNkKEJ8MCxrfDAsaGF8MCxDfDApfDA7az1DO0I9T2QoTHwwLGZhfDAsNjY2NjQzLDApfDA7RGE9RGQoQnwwLEN8MCxEYSYyMDk3MTUxfDAsMCl8MDtCPUM7dGE9T2QoTHwwLGZhfDAsNDcwMjk2LDApfDA7dGE9RGQoWnwwLHN8MCx0YXwwLEN8MCl8MDtzPUM7Wj1PZChMfDAsZmF8MCw2NTQxODMsMCl8MDtaPURkKGxhfDAsaWF8MCxafDAsQ3wwKXwwO2lhPUM7bGE9T2QoTHwwLGZhfDAsLTk5NzgwNSwtMSl8MDttYT1DO3g9T2QoTHwwLGZhfDAsMTM2NjU3LDApfDA7eD1EZChqYXwwLGV8MCx4fDAsQ3wwKXwwO2U9QztmYT1PZChMfDAsZmF8MCwtNjgzOTAxLC0xKXwwO0w9QztIPURkKG9hfDAsbmF8MCx1YXwwLEh8MCl8MDtBYT1DZChIfDAsQ3wwLHhhfDAsQWF8MCl8MDtMPURkKEFhfDAsQ3wwLGZhfDAsTHwwKXwwO2ZhPUM7QWE9T2QoemF8MCxJfDAsNjY2NjQzLDApfDA7RD1EZChBYXwwLEN8MCxEJjIwOTcxNTF8MCwwKXwwO0FhPUM7eGE9T2QoemF8MCxJfDAsNDcwMjk2LDApfDA7eGE9RGQoRGF8MCxCfDAseGF8MCxDfDApfDA7Qj1DO0RhPU9kKHphfDAsSXwwLDY1NDE4MywwKXwwO0RhPURkKHRhfDAsc3wwLERhfDAsQ3wwKXwwO3M9Qzt0YT1PZCh6YXwwLEl8MCwtOTk3ODA1LC0xKXwwO3RhPURkKFp8MCxpYXwwLHRhfDAsQ3wwKXwwO2lhPUM7Wj1PZCh6YXwwLEl8MCwxMzY2NTcsMCl8MDtIPUM7ST1PZCh6YXwwLEl8MCwtNjgzOTAxLC0xKXwwO0k9RGQoeHwwLGV8MCxJfDAsQ3wwKXwwO2U9Qzt4PU9kKGhhfDAsa3wwLDY2NjY0MywwKXwwO3k9RGQoeHwwLEN8MCx5JjIwOTcxNTF8MCwwKXwwO3g9Qzt6YT1PZChoYXwwLGt8MCw0NzAyOTYsMCl8MDt6YT1EZChEfDAsQWF8MCx6YXwwLEN8MCl8MDtBYT1DO0Q9T2QoaGF8MCxrfDAsNjU0MTgzLDApfDA7RD1EZCh4YXwwLEJ8MCxEfDAsQ3wwKXwwO0I9Qzt4YT1PZChoYXwwLGt8MCwtOTk3ODA1LC0xKXwwO3hhPURkKERhfDAsc3wwLHhhfDAsQ3wwKXwwO3M9QztEYT1PZChoYXwwLGt8MCwxMzY2NTcsMCl8MDtEYT1EZCh0YXwwLGlhfDAsRGF8MCxDfDApfDA7aWE9QztrPU9kKGhhfDAsa3wwLC02ODM5MDEsLTEpfDA7aGE9Qzt0PURkKHlhfDAsc2F8MCxqfDAsdHwwKXwwO0NhPUNkKHR8MCxDfDAsd2F8MCxDYXwwKXwwO21hPURkKENhfDAsQ3wwLGxhfDAsbWF8MCl8MDtIPURkKG1hfDAsQ3wwLFp8MCxIfDApfDA7aGE9RGQoSHwwLEN8MCxrfDAsaGF8MCl8MDtrPUM7SD1PZChFYXwwLG98MCw2NjY2NDMsMCl8MDtaPUM7bWE9T2QoRWF8MCxvfDAsNDcwMjk2LDApfDA7bGE9QztDYT1PZChFYXwwLG98MCw2NTQxODMsMCl8MDt3YT1DO3Q9T2QoRWF8MCxvfDAsLTk5NzgwNSwtMSl8MDtqPUM7c2E9T2QoRWF8MCxvfDAsMTM2NjU3LDApfDA7c2E9RGQoeGF8MCxzfDAsc2F8MCxDfDApfDA7cz1DO289T2QoRWF8MCxvfDAsLTY4MzkwMSwtMSl8MDtvPURkKERhfDAsaWF8MCxvfDAsQ3wwKXwwO2lhPUM7RGE9T2QocmF8MCxjYXwwLDY2NjY0MywwKXwwO0VhPUM7eGE9T2QocmF8MCxjYXwwLDQ3MDI5NiwwKXwwO3lhPUM7dGE9T2QocmF8MCxjYXwwLDY1NDE4MywwKXwwO3VhPUM7bmE9T2QocmF8MCxjYXwwLC05OTc4MDUsLTEpfDA7b2E9QztqYT1PZChyYXwwLGNhfDAsMTM2NjU3LDApfDA7a2E9QztjYT1PZChyYXwwLGNhfDAsLTY4MzkwMSwtMSl8MDtjYT1EZChzYXwwLHN8MCxjYXwwLEN8MCl8MDtzPUM7c2E9T2QoUXwwLE18MCw2NjY2NDMsMCl8MDt2YT1EZChzYXwwLEN8MCxufGZ8ViYyMDMxNjE2fDAsdmF8MCl8MDtWPUM7Zj1PZChRfDAsTXwwLDQ3MDI5NiwwKXwwO249QztzYT1PZChRfDAsTXwwLDY1NDE4MywwKXwwO0JhPURkKHNhfDAsQ3wwLEJhJjIwOTcxNTF8MCwwKXwwO1o9RGQoQmF8MCxDfDAsSHwwLFp8MCl8MDt5YT1EZChafDAsQ3wwLHhhfDAseWF8MCl8MDt4YT1DO1o9T2QoUXwwLE18MCwtOTk3ODA1LC0xKXwwO0g9QztCYT1PZChRfDAsTXwwLDEzNjY1NywwKXwwO0JhPURkKHphfDAsQWF8MCxCYXwwLEN8MCl8MDt3YT1EZChCYXwwLEN8MCxDYXwwLHdhfDApfDA7b2E9RGQod2F8MCxDfDAsbmF8MCxvYXwwKXwwO25hPUM7TT1PZChRfDAsTXwwLC02ODM5MDEsLTEpfDA7UT1DO3dhPURkKHZhfDAsVnwwLDEwNDg1NzYsMCl8MDt3YT1FZCh3YXwwLEN8MCwyMSl8MDtDYT1DO2dhPURkKGZ8MCxufDAsZ2EmMjA5NzE1MXwwLDApfDA7RWE9RGQoZ2F8MCxDfDAsRGF8MCxFYXwwKXwwO0VhPURkKEVhfDAsQ3wwLHdhfDAsQ2F8MCl8MDtEYT1DO0NhPUhkKHdhfDAsQ2F8MCwyMSl8MDtDYT1DZCh2YXwwLFZ8MCxDYXwwLEN8MCl8MDtWPUM7dmE9RGQoeWF8MCx4YXwwLDEwNDg1NzYsMCl8MDt2YT1FZCh2YXwwLEN8MCwyMSl8MDt3YT1DO0g9RGQoeXwwLHh8MCxafDAsSHwwKXwwO2xhPURkKEh8MCxDfDAsbWF8MCxsYXwwKXwwO3VhPURkKGxhfDAsQ3wwLHRhfDAsdWF8MCl8MDt1YT1EZCh1YXwwLEN8MCx2YXwwLHdhfDApfDA7dGE9Qzt3YT1IZCh2YXwwLHdhfDAsMjEpfDA7dmE9QztsYT1EZChvYXwwLG5hfDAsMTA0ODU3NiwwKXwwO2xhPUVkKGxhfDAsQ3wwLDIxKXwwO21hPUM7UT1EZChEfDAsQnwwLE18MCxRfDApfDA7aj1EZChRfDAsQ3wwLHR8MCxqfDApfDA7a2E9RGQoanwwLEN8MCxqYXwwLGthfDApfDA7a2E9RGQoa2F8MCxDfDAsbGF8MCxtYXwwKXwwO2phPUM7bWE9SGQobGF8MCxtYXwwLDIxKXwwO2xhPUM7aj1EZChjYXwwLHN8MCwxMDQ4NTc2LDApfDA7aj1FZChqfDAsQ3wwLDIxKXwwO3Q9QztpYT1EZChvfDAsaWF8MCxqfDAsdHwwKXwwO289Qzt0PUhkKGp8MCx0fDAsMjEpfDA7dD1DZChjYXwwLHN8MCx0fDAsQ3wwKXwwO3M9QztjYT1EZChoYXwwLGt8MCwxMDQ4NTc2LDApfDA7Y2E9RWQoY2F8MCxDfDAsMjEpfDA7aj1DO2U9RGQoSXwwLGV8MCxjYXwwLGp8MCl8MDtJPUM7aj1IZChjYXwwLGp8MCwyMSl8MDtqPUNkKGhhfDAsa3wwLGp8MCxDfDApfDA7az1DO2hhPURkKEx8MCxmYXwwLDEwNDg1NzYsMCl8MDtoYT1FZChoYXwwLEN8MCwyMSl8MDtjYT1DO1I9RGQoX3wwLFJ8MCxoYXwwLGNhfDApfDA7Xz1DO2NhPUhkKGhhfDAsY2F8MCwyMSl8MDtjYT1DZChMfDAsZmF8MCxjYXwwLEN8MCl8MDtmYT1DO0w9RGQoRWF8MCxEYXwwLDEwNDg1NzYsMCl8MDtMPUVkKEx8MCxDfDAsMjEpfDA7aGE9QztRPUhkKEx8MCxoYXwwLDIxKXwwO009QztCPURkKHVhfDAsdGF8MCwxMDQ4NTc2LDApfDA7Qj1FZChCfDAsQ3wwLDIxKXwwO0Q9QztIPUhkKEJ8MCxEfDAsMjEpfDA7Wj1DO3g9RGQoa2F8MCxqYXwwLDEwNDg1NzYsMCl8MDt4PUVkKHh8MCxDfDAsMjEpfDA7eT1DO3M9RGQodHwwLHN8MCx4fDAseXwwKXwwO3Q9Qzt5PUhkKHh8MCx5fDAsMjEpfDA7eD1DO2dhPURkKGlhfDAsb3wwLDEwNDg1NzYsMCl8MDtnYT1FZChnYXwwLEN8MCwyMSl8MDtuPUM7az1EZChqfDAsa3wwLGdhfDAsbnwwKXwwO2o9QztuPUhkKGdhfDAsbnwwLDIxKXwwO249Q2QoaWF8MCxvfDAsbnwwLEN8MCl8MDtvPUM7aWE9RGQoZXwwLEl8MCwxMDQ4NTc2LDApfDA7aWE9RWQoaWF8MCxDfDAsMjEpfDA7Z2E9QztmYT1EZChjYXwwLGZhfDAsaWF8MCxnYXwwKXwwO2NhPUM7Z2E9SGQoaWF8MCxnYXwwLDIxKXwwO2dhPUNkKGV8MCxJfDAsZ2F8MCxDfDApfDA7ST1DO2U9RGQoUnwwLF98MCwxMDQ4NTc2LDApfDA7ZT1FZChlfDAsQ3wwLDIxKXwwO2lhPUM7Zj1IZChlfDAsaWF8MCwyMSl8MDtmPUNkKFJ8MCxffDAsZnwwLEN8MCl8MDtfPUM7Uj1PZChlfDAsaWF8MCw2NjY2NDMsMCl8MDtSPURkKENhfDAsVnwwLFJ8MCxDfDApfDA7Vj1DO0NhPU9kKGV8MCxpYXwwLDQ3MDI5NiwwKXwwO0JhPUM7QWE9T2QoZXwwLGlhfDAsNjU0MTgzLDApfDA7emE9QztzYT1PZChlfDAsaWF8MCwtOTk3ODA1LC0xKXwwO3JhPUM7cWE9T2QoZXwwLGlhfDAsMTM2NjU3LDApfDA7cGE9QztpYT1PZChlfDAsaWF8MCwtNjgzOTAxLC0xKXwwO2U9QztXPUVkKFJ8MCxWfDAsMjEpfDA7ZGE9QztCYT1EZChFYXwwLERhfDAsQ2F8MCxCYXwwKXwwO0JhPURkKEJhfDAsQ3wwLFd8MCxkYXwwKXwwO009Q2QoQmF8MCxDfDAsUXwwLE18MCl8MDtRPUM7ZGE9SGQoV3wwLGRhfDAsMjEpfDA7ZGE9Q2QoUnwwLFZ8MCxkYXwwLEN8MCl8MDtWPUM7Uj1FZChNfDAsUXwwLDIxKXwwO1c9Qzt4YT1EZChBYXwwLHphfDAseWF8MCx4YXwwKXwwO3ZhPUNkKHhhfDAsQ3wwLHdhfDAsdmF8MCl8MDtoYT1EZCh2YXwwLEN8MCxMfDAsaGF8MCl8MDtoYT1EZChoYXwwLEN8MCxSfDAsV3wwKXwwO0w9QztXPUhkKFJ8MCxXfDAsMjEpfDA7Vz1DZChNfDAsUXwwLFd8MCxDfDApfDA7UT1DO009RWQoaGF8MCxMfDAsMjEpfDA7Uj1DO3JhPURkKHVhfDAsdGF8MCxzYXwwLHJhfDApfDA7Wj1DZChyYXwwLEN8MCxIfDAsWnwwKXwwO1o9RGQoWnwwLEN8MCxNfDAsUnwwKXwwO0g9QztSPUhkKE18MCxSfDAsMjEpfDA7Uj1DZChoYXwwLEx8MCxSfDAsQ3wwKXwwO0w9QztoYT1FZChafDAsSHwwLDIxKXwwO009QztuYT1EZChxYXwwLHBhfDAsb2F8MCxuYXwwKXwwO2xhPUNkKG5hfDAsQ3wwLG1hfDAsbGF8MCl8MDtEPURkKGxhfDAsQ3wwLEJ8MCxEfDApfDA7RD1EZChEfDAsQ3wwLGhhfDAsTXwwKXwwO0I9QztNPUhkKGhhfDAsTXwwLDIxKXwwO009Q2QoWnwwLEh8MCxNfDAsQ3wwKXwwO0g9QztaPUVkKER8MCxCfDAsMjEpfDA7aGE9QztlPURkKGthfDAsamF8MCxpYXwwLGV8MCl8MDt4PUNkKGV8MCxDfDAseXwwLHh8MCl8MDt4PURkKHh8MCxDfDAsWnwwLGhhfDApfDA7eT1DO2hhPUhkKFp8MCxoYXwwLDIxKXwwO2hhPUNkKER8MCxCfDAsaGF8MCxDfDApfDA7Qj1DO0Q9RWQoeHwwLHl8MCwyMSl8MDtaPUM7dD1EZChzfDAsdHwwLER8MCxafDApfDA7cz1DO1o9SGQoRHwwLFp8MCwyMSl8MDtaPUNkKHh8MCx5fDAsWnwwLEN8MCl8MDt5PUM7eD1FZCh0fDAsc3wwLDIxKXwwO0Q9QztvPURkKHh8MCxEfDAsbnwwLG98MCl8MDtuPUM7RD1IZCh4fDAsRHwwLDIxKXwwO0Q9Q2QodHwwLHN8MCxEfDAsQ3wwKXwwO3M9Qzt0PUVkKG98MCxufDAsMjEpfDA7eD1DO2o9RGQoa3wwLGp8MCx0fDAseHwwKXwwO2s9Qzt4PUhkKHR8MCx4fDAsMjEpfDA7eD1DZChvfDAsbnwwLHh8MCxDfDApfDA7bj1DO289RWQoanwwLGt8MCwyMSl8MDt0PUM7ST1EZChvfDAsdHwwLGdhfDAsSXwwKXwwO2dhPUM7dD1IZChvfDAsdHwwLDIxKXwwO3Q9Q2QoanwwLGt8MCx0fDAsQ3wwKXwwO2s9QztqPUVkKEl8MCxnYXwwLDIxKXwwO289QztjYT1EZChmYXwwLGNhfDAsanwwLG98MCl8MDtmYT1DO289SGQoanwwLG98MCwyMSl8MDtvPUNkKEl8MCxnYXwwLG98MCxDfDApfDA7Z2E9QztJPUVkKGNhfDAsZmF8MCwyMSl8MDtqPUM7Xz1EZChJfDAsanwwLGZ8MCxffDApfDA7Zj1DO2o9SGQoSXwwLGp8MCwyMSl8MDtqPUNkKGNhfDAsZmF8MCxqfDAsQ3wwKXwwO2ZhPUM7Y2E9RWQoX3wwLGZ8MCwyMSl8MDtJPUM7ZT1IZChjYXwwLEl8MCwyMSl8MDtlPUNkKF98MCxmfDAsZXwwLEN8MCl8MDtmPUM7Xz1PZChjYXwwLEl8MCw2NjY2NDMsMCl8MDtWPURkKF98MCxDfDAsZGF8MCxWfDApfDA7ZGE9QztfPU9kKGNhfDAsSXwwLDQ3MDI5NiwwKXwwO189RGQoV3wwLFF8MCxffDAsQ3wwKXwwO1E9QztXPU9kKGNhfDAsSXwwLDY1NDE4MywwKXwwO1c9RGQoUnwwLEx8MCxXfDAsQ3wwKXwwO0w9QztSPU9kKGNhfDAsSXwwLC05OTc4MDUsLTEpfDA7Uj1EZChNfDAsSHwwLFJ8MCxDfDApfDA7SD1DO009T2QoY2F8MCxJfDAsMTM2NjU3LDApfDA7TT1EZChoYXwwLEJ8MCxNfDAsQ3wwKXwwO0I9QztJPU9kKGNhfDAsSXwwLC02ODM5MDEsLTEpfDA7ST1EZChafDAseXwwLEl8MCxDfDApfDA7eT1DO1o9RWQoVnwwLGRhfDAsMjEpfDA7Y2E9QztRPURkKF98MCxRfDAsWnwwLGNhfDApfDA7Xz1DO2NhPUhkKFp8MCxjYXwwLDIxKXwwO2NhPUNkKFZ8MCxkYXwwLGNhfDAsQ3wwKXwwO2RhPUM7Vj1FZChRfDAsX3wwLDIxKXwwO1o9QztMPURkKFd8MCxMfDAsVnwwLFp8MCl8MDtXPUM7Wj1IZChWfDAsWnwwLDIxKXwwO1o9Q2QoUXwwLF98MCxafDAsQ3wwKXwwO189QztRPUVkKEx8MCxXfDAsMjEpfDA7Vj1DO0g9RGQoUnwwLEh8MCxRfDAsVnwwKXwwO1I9QztWPUhkKFF8MCxWfDAsMjEpfDA7Vj1DZChMfDAsV3wwLFZ8MCxDfDApfDA7Vz1DO0w9RWQoSHwwLFJ8MCwyMSl8MDtRPUM7Qj1EZChNfDAsQnwwLEx8MCxRfDApfDA7TT1DO1E9SGQoTHwwLFF8MCwyMSl8MDtRPUNkKEh8MCxSfDAsUXwwLEN8MCl8MDtSPUM7SD1FZChCfDAsTXwwLDIxKXwwO0w9Qzt5PURkKEl8MCx5fDAsSHwwLEx8MCl8MDtJPUM7TD1IZChIfDAsTHwwLDIxKXwwO0w9Q2QoQnwwLE18MCxMfDAsQ3wwKXwwO009QztCPUVkKHl8MCxJfDAsMjEpfDA7SD1DO3M9RGQoQnwwLEh8MCxEfDAsc3wwKXwwO0Q9QztIPUhkKEJ8MCxIfDAsMjEpfDA7SD1DZCh5fDAsSXwwLEh8MCxDfDApfDA7ST1DO3k9RWQoc3wwLER8MCwyMSl8MDtCPUM7bj1EZCh5fDAsQnwwLHh8MCxufDApfDA7eD1DO0I9SGQoeXwwLEJ8MCwyMSl8MDtCPUNkKHN8MCxEfDAsQnwwLEN8MCl8MDtEPUM7cz1FZChufDAseHwwLDIxKXwwO3k9QztrPURkKHN8MCx5fDAsdHwwLGt8MCl8MDt0PUM7eT1IZChzfDAseXwwLDIxKXwwO3k9Q2QobnwwLHh8MCx5fDAsQ3wwKXwwO3g9QztuPUVkKGt8MCx0fDAsMjEpfDA7cz1DO2dhPURkKG58MCxzfDAsb3wwLGdhfDApfDA7bz1DO3M9SGQobnwwLHN8MCwyMSl8MDtzPUNkKGt8MCx0fDAsc3wwLEN8MCl8MDt0PUM7az1FZChnYXwwLG98MCwyMSl8MDtuPUM7ZmE9RGQoa3wwLG58MCxqfDAsZmF8MCl8MDtqPUM7bj1IZChrfDAsbnwwLDIxKXwwO249Q2QoZ2F8MCxvfDAsbnwwLEN8MCl8MDtvPUM7Z2E9RWQoZmF8MCxqfDAsMjEpfDA7az1DO2Y9RGQoZ2F8MCxrfDAsZXwwLGZ8MCl8MDtlPUM7az1IZChnYXwwLGt8MCwyMSl8MDtrPUNkKGZhfDAsanwwLGt8MCxDfDApfDA7aj1DO2FbYj4+MF09Y2E7Yj1HZChjYXwwLGRhfDAsOCl8MDthW2VhPj4wXT1iO2I9R2QoY2F8MCxkYXwwLDE2KXwwO2RhPUM7Y2E9SGQoWnwwLF98MCw1KXwwO2FbYmE+PjBdPWNhfGI7Yj1HZChafDAsX3wwLDMpfDA7YVthYT4+MF09YjtiPUdkKFp8MCxffDAsMTEpfDA7YVskPj4wXT1iO2I9R2QoWnwwLF98MCwxOSl8MDtfPUM7Wj1IZChWfDAsV3wwLDIpfDA7YVtZPj4wXT1afGI7Yj1HZChWfDAsV3wwLDYpfDA7YVtYPj4wXT1iO2I9R2QoVnwwLFd8MCwxNCl8MDtXPUM7Vj1IZChRfDAsUnwwLDcpfDA7YVtVPj4wXT1WfGI7Yj1HZChRfDAsUnwwLDEpfDA7YVtUPj4wXT1iO2I9R2QoUXwwLFJ8MCw5KXwwO2FbUz4+MF09YjtiPUdkKFF8MCxSfDAsMTcpfDA7Uj1DO1E9SGQoTHwwLE18MCw0KXwwO2FbUD4+MF09UXxiO2I9R2QoTHwwLE18MCw0KXwwO2FbTz4+MF09YjtiPUdkKEx8MCxNfDAsMTIpfDA7YVtOPj4wXT1iO2I9R2QoTHwwLE18MCwyMCl8MDtNPUM7TD1IZChIfDAsSXwwLDEpfDA7YVtLPj4wXT1MfGI7Yj1HZChIfDAsSXwwLDcpfDA7YVtKPj4wXT1iO2I9R2QoSHwwLEl8MCwxNSl8MDtJPUM7SD1IZChCfDAsRHwwLDYpfDA7YVtHPj4wXT1IfGI7Yj1HZChCfDAsRHwwLDIpfDA7YVtGPj4wXT1iO2I9R2QoQnwwLER8MCwxMCl8MDthW0U+PjBdPWI7Yj1HZChCfDAsRHwwLDE4KXwwO0Q9QztCPUhkKHl8MCx4fDAsMyl8MDthW0E+PjBdPUJ8YjtiPUdkKHl8MCx4fDAsNSl8MDthW3o+PjBdPWI7Yj1HZCh5fDAseHwwLDEzKXwwO2Fbdz4+MF09YjthW3Y+PjBdPXM7Yj1HZChzfDAsdHwwLDgpfDA7YVt1Pj4wXT1iO2I9R2Qoc3wwLHR8MCwxNil8MDt0PUM7cz1IZChufDAsb3wwLDUpfDA7YVtyPj4wXT1zfGI7Yj1HZChufDAsb3wwLDMpfDA7YVtxPj4wXT1iO2I9R2QobnwwLG98MCwxMSl8MDthW3A+PjBdPWI7Yj1HZChufDAsb3wwLDE5KXwwO289QztuPUhkKGt8MCxqfDAsMil8MDthW20+PjBdPW58YjtiPUdkKGt8MCxqfDAsNil8MDthW2w+PjBdPWI7aj1HZChrfDAsanwwLDE0KXwwO2s9QztiPUhkKGZ8MCxlfDAsNyl8MDthW2k+PjBdPWp8YjtiPUdkKGZ8MCxlfDAsMSl8MDthW2g+PjBdPWI7Yj1HZChmfDAsZXwwLDkpfDA7YVtnPj4wXT1iO2I9R2QoZnwwLGV8MCwxNyl8MDthW2M+PjBdPWI7cmV0dXJufWZ1bmN0aW9uIFhjKGIsZSxmLGcsaCxqKXtiPWJ8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtqPWp8MDt2YXIgaz0wLGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MCx2PTAsdz0wLHg9MCx5PTAsej0wLEE9MCxCPTAsRD0wLEU9MCxGPTAsRz0wLEg9MCxJPTAsSj0wLEs9MCxMPTAsTT0wLE49MCxPPTAsUD0wLFE9MCxSPTAsUz0wLFQ9MCxVPTAsVj0wLFc9MCxYPTAsWT0wLFo9MCxfPTAsJD0wLGFhPTAsYmE9MCxjYT0wLGRhPTAsZWE9MCxmYT0wLGdhPTAsaGE9MCxpYT0wLGphPTAsa2E9MCxsYT0wLG1hPTAsbmE9MCxvYT0wLHBhPTAscWE9MCxyYT0wLHNhPTAsdGE9MCx1YT0wLHZhPTAsd2E9MCx4YT0wLHlhPTAsemE9MCxBYT0wLEJhPTAsQ2E9MCxEYT0wLEVhPTAsRmE9MCxHYT0wLEhhPTAsSWE9MCxKYT0wLEthPTAsTGE9MCxNYT0wLE5hPTAsT2E9MCxQYT0wLFFhPTAsUmE9MCxTYT0wLFRhPTAsVWE9MCxWYT0wLFdhPTAsWGE9MCxZYT0wLFphPTAsX2E9MCwkYT0wLGFiPTAsYmI9MCxjYj0wLGRiPTAsZWI9MCxmYj0wLGdiPTAsaGI9MCxpYj0wLGpiPTAsa2I9MCxsYj0wLG1iPTAsbmI9MCxvYj0wLHBiPTAscWI9MCxyYj0wLHNiPTAsdGI9MCx1Yj0wLHZiPTAsd2I9MCx4Yj0wLHliPTAsemI9MCxBYj0wLEJiPTAsQ2I9MCxEYj0wLEViPTAsSGI9MCxJYj0wLEpiPTAsS2I9MCxMYj0wLE1iPTAsTmI9MCxPYj0wLFBiPTAsUWI9MCxSYj0wLFNiPTAsVGI9MCxVYj0wLFZiPTAsV2I9MCxYYj0wLFliPTAsWmI9MCxfYj0wLCRiPTAsYWM9MCxiYz0wLGNjPTAsZGM9MCxlYz0wLGZjPTAsZ2M9MCxoYz0wLGljPTAsamM9MCxrYz0wLGxjPTAsbWM9MCxuYz0wLG9jPTAscGM9MCxxYz0wLHJjPTAsc2M9MCx0Yz0wLHVjPTAsdmM9MCx3Yz0wLHhjPTAseWM9MCx6Yz0wLEFjPTAsQmM9MCxDYz0wLERjPTAsRWM9MDt6PWk7cD1pPWkrNjMmLTY0O2k9aSs4OTZ8MDt2PXArMjA4fDA7dT1wKzY1NnwwO3c9cCs2MTZ8MDt4PXArNTc2fDA7cz1wO3E9cCs4MjR8MDt0PXArNzYwfDA7cj1wKzY5NnwwO3A9cCs0MTZ8MDtrPXYrNjR8MDt5PXY7QT04O0I9eSs2NHwwO2Rve2NbeT4+Ml09Y1tBPj4yXTt5PXkrNHwwO0E9QSs0fDB9d2hpbGUoKHl8MCk8KEJ8MCkpO3k9dis3MnwwO2NbeT4+Ml09MjU2O2NbeSs0Pj4yXT0wO3k9aztjW3k+PjJdPTA7Y1t5KzQ+PjJdPTA7eT12KzgwfDA7QT1qO0I9eSszMnwwO2Rve2FbeT4+MF09YVtBPj4wXXwwO3k9eSsxfDA7QT1BKzF8MH13aGlsZSgoeXwwKTwoQnwwKSk7R2IodixxKTthW3E+PjBdPShkW3E+PjBdfDApJjI0ODtrPXErMzF8MDthW2s+PjBdPShkW2s+PjBdfDApJjYzfDY0O2w9cys2NHwwO3k9bDtjW3k+PjJdPTA7Y1t5KzQ+PjJdPTA7eT1zO0E9ODtCPXkrNjR8MDtkb3tjW3k+PjJdPWNbQT4+Ml07eT15KzR8MDtBPUErNHwwfXdoaWxlKCh5fDApPChCfDApKTttPXMrNzJ8MDtuPW07Y1tuPj4yXT0yNTY7Y1tuKzQ+PjJdPTA7bj1sO2Nbbj4+Ml09MDtjW24rND4+Ml09MDtuPXMrODB8MDt5PW47QT1xKzMyfDA7Qj15KzMyfDA7ZG97YVt5Pj4wXT1hW0E+PjBdfDA7eT15KzF8MDtBPUErMXwwfXdoaWxlKCh5fDApPChCfDApKTtGYihzLGYsZyxoKTtHYihzLHQpO289YiszMnwwO0pkKG98MCxqKzMyfDAsMzIpfDA7V2ModCk7UmMocCx0KTtJYyh1LHArODB8MCk7SmModyxwLHUpO0pjKHgscCs0MHwwLHUpO0xjKGIseCk7TGModix3KTt5PWIrMzF8MDthW3k+PjBdPShkW3k+PjBdfDApXihkW3Y+PjBdfDApPDw3O3k9bDtjW3k+PjJdPTA7Y1t5KzQ+PjJdPTA7eT1zO0E9ODtCPXkrNjR8MDtkb3tjW3k+PjJdPWNbQT4+Ml07eT15KzR8MDtBPUErNHwwfXdoaWxlKCh5fDApPChCfDApKTt5PW07Y1t5Pj4yXT01MTI7Y1t5KzQ+PjJdPTA7eT1sO2NbeT4+Ml09MDtjW3krND4+Ml09MDt5PW47QT1iO0I9eSs2NHwwO2Rve2FbeT4+MF09YVtBPj4wXXwwO3k9eSsxfDA7QT1BKzF8MH13aGlsZSgoeXwwKTwoQnwwKSk7RmIocyxmLGcsaCk7R2IocyxyKTtXYyhyKTtKPWFbcisyPj4wXXwwO1RhPWRbcj4+MF18MDt4Yj1IZChkW3IrMT4+MF18MHwwLDAsOCl8MDtxYj1DO0o9SiYyNTU7a2I9SGQoSnwwLDAsMTYpfDA7a2I9eGJ8VGF8a2ImMjAzMTYxNjtUYT1IZChkW3IrMz4+MF18MHwwLDAsOCl8MDt4Yj1DO0Y9SGQoZFtyKzQ+PjBdfDB8MCwwLDE2KXwwO3hiPXhifEM7dWI9ZFtyKzU+PjBdfDA7ZGI9SGQodWJ8MCwwLDI0KXwwO3hiPUdkKFRhfEp8RnxkYnwwLHhifEN8MCw1KXwwO3hiPXhiJjIwOTcxNTE7ZGI9YVtyKzc+PjBdfDA7Rj1IZChkW3IrNj4+MF18MHwwLDAsOCl8MDtKPUM7ZGI9ZGImMjU1O1RhPUhkKGRifDAsMCwxNil8MDtKPUdkKEZ8dWJ8VGF8MCxKfEN8MCwyKXwwO0o9SiYyMDk3MTUxO1RhPUhkKGRbcis4Pj4wXXwwfDAsMCw4KXwwO3ViPUM7Rj1IZChkW3IrOT4+MF18MHwwLDAsMTYpfDA7dWI9dWJ8Qzt2PWRbcisxMD4+MF18MDtTYT1IZCh2fDAsMCwyNCl8MDt1Yj1HZChUYXxkYnxGfFNhfDAsdWJ8Q3wwLDcpfDA7dWI9dWImMjA5NzE1MTtTYT1IZChkW3IrMTE+PjBdfDB8MCwwLDgpfDA7Rj1DO2RiPUhkKGRbcisxMj4+MF18MHwwLDAsMTYpfDA7Rj1GfEM7VGE9ZFtyKzEzPj4wXXwwO3k9SGQoVGF8MCwwLDI0KXwwO0Y9R2QoU2F8dnxkYnx5fDAsRnxDfDAsNCl8MDtGPUYmMjA5NzE1MTt5PWFbcisxNT4+MF18MDtkYj1IZChkW3IrMTQ+PjBdfDB8MCwwLDgpfDA7dj1DO3k9eSYyNTU7U2E9SGQoeXwwLDAsMTYpfDA7dj1HZChkYnxUYXxTYXwwLHZ8Q3wwLDEpfDA7dj12JjIwOTcxNTE7U2E9SGQoZFtyKzE2Pj4wXXwwfDAsMCw4KXwwO1RhPUM7ZGI9SGQoZFtyKzE3Pj4wXXwwfDAsMCwxNil8MDtUYT1UYXxDO0JjPWRbcisxOD4+MF18MDtqYT1IZChCY3wwLDAsMjQpfDA7VGE9R2QoU2F8eXxkYnxqYXwwLFRhfEN8MCw2KXwwO1RhPVRhJjIwOTcxNTE7amE9YVtyKzIwPj4wXXwwO2RiPUhkKGRbcisxOT4+MF18MHwwLDAsOCl8MDt5PUM7amE9SGQoamEmMjU1fDAsMCwxNil8MDt5PUdkKGRifEJjfGphfDAseXxDfDAsMyl8MDtqYT1DO0JjPWFbcisyMz4+MF18MDtkYj1kW3IrMjE+PjBdfDA7U2E9SGQoZFtyKzIyPj4wXXwwfDAsMCw4KXwwO3NiPUM7QmM9QmMmMjU1O1FhPUhkKEJjfDAsMCwxNil8MDtRYT1TYXxkYnxRYSYyMDMxNjE2O2RiPUhkKGRbcisyND4+MF18MHwwLDAsOCl8MDtTYT1DO209SGQoZFtyKzI1Pj4wXXwwfDAsMCwxNil8MDtTYT1TYXxDO3A9ZFtyKzI2Pj4wXXwwO3M9SGQocHwwLDAsMjQpfDA7U2E9R2QoZGJ8QmN8bXxzfDAsU2F8Q3wwLDUpfDA7U2E9U2EmMjA5NzE1MTtzPWFbcisyOD4+MF18MDttPUhkKGRbcisyNz4+MF18MHwwLDAsOCl8MDtCYz1DO3M9cyYyNTU7ZGI9SGQoc3wwLDAsMTYpfDA7QmM9R2QobXxwfGRifDAsQmN8Q3wwLDIpfDA7QmM9QmMmMjA5NzE1MTtkYj1IZChkW3IrMjk+PjBdfDB8MCwwLDgpfDA7cD1DO209SGQoZFtyKzMwPj4wXXwwfDAsMCwxNil8MDtwPXB8QztLYT1IZChkW3IrMzE+PjBdfDB8MCwwLDI0KXwwO3A9R2QoZGJ8c3xtfEthfDAscHxDfDAsNyl8MDtLYT1DO209YVtxKzI+PjBdfDA7cz1kW3E+PjBdfDA7ZGI9SGQoZFtxKzE+PjBdfDB8MCwwLDgpfDA7aWE9QzttPW0mMjU1O2hhPUhkKG18MCwwLDE2KXwwO2hhPWRifHN8aGEmMjAzMTYxNjtzPUhkKGRbcSszPj4wXXwwfDAsMCw4KXwwO2RiPUM7bGE9SGQoZFtxKzQ+PjBdfDB8MCwwLDE2KXwwO2RiPWRifEM7aD1kW3ErNT4+MF18MDt5Yz1IZChofDAsMCwyNCl8MDtkYj1HZChzfG18bGF8eWN8MCxkYnxDfDAsNSl8MDtkYj1kYiYyMDk3MTUxO3ljPWFbcSs3Pj4wXXwwO2xhPUhkKGRbcSs2Pj4wXXwwfDAsMCw4KXwwO209Qzt5Yz15YyYyNTU7cz1IZCh5Y3wwLDAsMTYpfDA7bT1HZChsYXxofHN8MCxtfEN8MCwyKXwwO209bSYyMDk3MTUxO3M9SGQoZFtxKzg+PjBdfDB8MCwwLDgpfDA7aD1DO2xhPUhkKGRbcSs5Pj4wXXwwfDAsMCwxNil8MDtoPWh8QztfYT1kW3ErMTA+PjBdfDA7UGE9SGQoX2F8MCwwLDI0KXwwO2g9R2Qoc3x5Y3xsYXxQYXwwLGh8Q3wwLDcpfDA7aD1oJjIwOTcxNTE7UGE9SGQoZFtxKzExPj4wXXwwfDAsMCw4KXwwO2xhPUM7eWM9SGQoZFtxKzEyPj4wXXwwfDAsMCwxNil8MDtsYT1sYXxDO3M9ZFtxKzEzPj4wXXwwO0VjPUhkKHN8MCwwLDI0KXwwO2xhPUdkKFBhfF9hfHljfEVjfDAsbGF8Q3wwLDQpfDA7bGE9bGEmMjA5NzE1MTtFYz1hW3ErMTU+PjBdfDA7eWM9SGQoZFtxKzE0Pj4wXXwwfDAsMCw4KXwwO19hPUM7RWM9RWMmMjU1O1BhPUhkKEVjfDAsMCwxNil8MDtfYT1HZCh5Y3xzfFBhfDAsX2F8Q3wwLDEpfDA7X2E9X2EmMjA5NzE1MTtQYT1IZChkW3ErMTY+PjBdfDB8MCwwLDgpfDA7cz1DO3ljPUhkKGRbcSsxNz4+MF18MHwwLDAsMTYpfDA7cz1zfEM7Uj1kW3ErMTg+PjBdfDA7QmI9SGQoUnwwLDAsMjQpfDA7cz1HZChQYXxFY3x5Y3xCYnwwLHN8Q3wwLDYpfDA7cz1zJjIwOTcxNTE7QmI9YVtxKzIwPj4wXXwwO3ljPUhkKGRbcSsxOT4+MF18MHwwLDAsOCl8MDtFYz1DO0JiPUhkKEJiJjI1NXwwLDAsMTYpfDA7RWM9R2QoeWN8UnxCYnwwLEVjfEN8MCwzKXwwO0JiPUM7Uj1hW3ErMjM+PjBdfDA7eWM9ZFtxKzIxPj4wXXwwO1BhPUhkKGRbcSsyMj4+MF18MHwwLDAsOCl8MDtEYT1DO1I9UiYyNTU7dWE9SGQoUnwwLDAsMTYpfDA7dWE9UGF8eWN8dWEmMjAzMTYxNjt5Yz1IZChkW3ErMjQ+PjBdfDB8MCwwLDgpfDA7UGE9QztNYT1IZChkW3ErMjU+PjBdfDB8MCwwLDE2KXwwO1BhPVBhfEM7RD1kW3ErMjY+PjBdfDA7emM9SGQoRHwwLDAsMjQpfDA7UGE9R2QoeWN8UnxNYXx6Y3wwLFBhfEN8MCw1KXwwO1BhPVBhJjIwOTcxNTE7emM9YVtxKzI4Pj4wXXwwO01hPUhkKGRbcSsyNz4+MF18MHwwLDAsOCl8MDtSPUM7emM9emMmMjU1O3ljPUhkKHpjfDAsMCwxNil8MDtSPUdkKE1hfER8eWN8MCxSfEN8MCwyKXwwO1I9UiYyMDk3MTUxO3ljPUhkKGRbcSsyOT4+MF18MHwwLDAsOCl8MDtEPUM7TWE9SGQoZFtxKzMwPj4wXXwwfDAsMCwxNil8MDtEPUR8QztJYT1IZChkW2s+PjBdfDB8MCwwLDI0KXwwO0Q9R2QoeWN8emN8TWF8SWF8MCxEfEN8MCw3KXwwO0lhPUM7TWE9YVt0KzI+PjBdfDA7emM9ZFt0Pj4wXXwwO3ljPUhkKGRbdCsxPj4wXXwwfDAsMCw4KXwwO2JhPUM7TWE9TWEmMjU1O0FjPUhkKE1hfDAsMCwxNil8MDtYYT1IZChkW3QrMz4+MF18MHwwLDAsOCl8MDtFYT1DO0dhPUhkKGRbdCs0Pj4wXXwwfDAsMCwxNil8MDtFYT1FYXxDO3BiPWRbdCs1Pj4wXXwwO3phPUhkKHBifDAsMCwyNCl8MDtFYT1HZChYYXxNYXxHYXx6YXwwLEVhfEN8MCw1KXwwO3phPWFbdCs3Pj4wXXwwO0dhPUhkKGRbdCs2Pj4wXXwwfDAsMCw4KXwwO01hPUM7emE9emEmMjU1O1hhPUhkKHphfDAsMCwxNil8MDtNYT1HZChHYXxwYnxYYXwwLE1hfEN8MCwyKXwwO1hhPUhkKGRbdCs4Pj4wXXwwfDAsMCw4KXwwO3BiPUM7R2E9SGQoZFt0Kzk+PjBdfDB8MCwwLDE2KXwwO3BiPXBifEM7WD1kW3QrMTA+PjBdfDA7Tz1IZChYfDAsMCwyNCl8MDtwYj1HZChYYXx6YXxHYXxPfDAscGJ8Q3wwLDcpfDA7Tz1IZChkW3QrMTE+PjBdfDB8MCwwLDgpfDA7R2E9Qzt6YT1IZChkW3QrMTI+PjBdfDB8MCwwLDE2KXwwO0dhPUdhfEM7WGE9ZFt0KzEzPj4wXXwwO0g9SGQoWGF8MCwwLDI0KXwwO0dhPUdkKE98WHx6YXxIfDAsR2F8Q3wwLDQpfDA7SD1hW3QrMTU+PjBdfDA7emE9SGQoZFt0KzE0Pj4wXXwwfDAsMCw4KXwwO1g9QztIPUgmMjU1O089SGQoSHwwLDAsMTYpfDA7WD1HZCh6YXxYYXxPfDAsWHxDfDAsMSl8MDtPPUhkKGRbdCsxNj4+MF18MHwwLDAsOCl8MDtYYT1DO3phPUhkKGRbdCsxNz4+MF18MHwwLDAsMTYpfDA7WGE9WGF8QztVPWRbdCsxOD4+MF18MDt3PUhkKFV8MCwwLDI0KXwwO1hhPUdkKE98SHx6YXx3fDAsWGF8Q3wwLDYpfDA7dz1hW3QrMjA+PjBdfDA7emE9SGQoZFt0KzE5Pj4wXXwwfDAsMCw4KXwwO0g9Qzt3PUhkKHcmMjU1fDAsMCwxNil8MDtIPUdkKHphfFV8d3wwLEh8Q3wwLDMpfDA7dz1DO1U9YVt0KzIzPj4wXXwwO3phPWRbdCsyMT4+MF18MDtPPUhkKGRbdCsyMj4+MF18MHwwLDAsOCl8MDtkYT1DO1U9VSYyNTU7ZWE9SGQoVXwwLDAsMTYpfDA7QmE9SGQoZFt0KzI0Pj4wXXwwfDAsMCw4KXwwO049QztIYT1IZChkW3QrMjU+PjBdfDB8MCwwLDE2KXwwO049TnxDO0E9ZFt0KzI2Pj4wXXwwO3RhPUhkKEF8MCwwLDI0KXwwO049R2QoQmF8VXxIYXx0YXwwLE58Q3wwLDUpfDA7dGE9YVt0KzI4Pj4wXXwwO0hhPUhkKGRbdCsyNz4+MF18MHwwLDAsOCl8MDtVPUM7dGE9dGEmMjU1O0JhPUhkKHRhfDAsMCwxNil8MDtVPUdkKEhhfEF8QmF8MCxVfEN8MCwyKXwwO0JhPUhkKGRbdCsyOT4+MF18MHwwLDAsOCl8MDtBPUM7SGE9SGQoZFt0KzMwPj4wXXwwfDAsMCwxNil8MDtBPUF8QztqPUhkKGRbdCszMT4+MF18MHwwLDAsMjQpfDA7QT1HZChCYXx0YXxIYXxqfDAsQXxDfDAsNyl8MDtqPUM7SGE9T2QoaGF8MCxpYXwwLGtifDAscWJ8MCl8MDtIYT1EZCh5Y3x6Y3xBYyYyMDMxNjE2fDAsYmF8MCxIYXwwLEN8MCl8MDtiYT1DO0FjPU9kKGRifDAsMCxrYnwwLHFifDApfDA7emM9Qzt5Yz1PZChoYXwwLGlhfDAseGJ8MCwwKXwwO3RhPUM7QmE9T2QobXwwLDAsa2J8MCxxYnwwKXwwO0xhPUM7Q2E9T2QoZGJ8MCwwLHhifDAsMCl8MDt0Yz1DO3BhPU9kKGhhfDAsaWF8MCxKfDAsMCl8MDtwYT1EZChDYXwwLHRjfDAscGF8MCxDfDApfDA7TGE9RGQocGF8MCxDfDAsQmF8MCxMYXwwKXwwO01hPURkKExhfDAsQ3wwLE1hJjIwOTcxNTF8MCwwKXwwO0xhPUM7QmE9T2QoaHwwLDAsa2J8MCxxYnwwKXwwO3BhPUM7dGM9T2QobXwwLDAseGJ8MCwwKXwwO0NhPUM7eGM9T2QoZGJ8MCwwLEp8MCwwKXwwO3djPUM7dmM9T2QoaGF8MCxpYXwwLHVifDAsMCl8MDt1Yz1DO09hPU9kKGxhfDAsMCxrYnwwLHFifDApfDA7RmE9QztrYz1PZChofDAsMCx4YnwwLDApfDA7WT1DO21jPU9kKG18MCwwLEp8MCwwKXwwO05hPUM7bmM9T2QoZGJ8MCwwLHVifDAsMCl8MDtvYz1DO2xjPU9kKGhhfDAsaWF8MCxGfDAsMCl8MDtsYz1EZChuY3wwLG9jfDAsbGN8MCxDfDApfDA7TmE9RGQobGN8MCxDfDAsbWN8MCxOYXwwKXwwO1k9RGQoTmF8MCxDfDAsa2N8MCxZfDApfDA7RmE9RGQoWXwwLEN8MCxPYXwwLEZhfDApfDA7R2E9RGQoRmF8MCxDfDAsR2EmMjA5NzE1MXwwLDApfDA7RmE9QztPYT1PZChfYXwwLDAsa2J8MCxxYnwwKXwwO1k9QztrYz1PZChsYXwwLDAseGJ8MCwwKXwwO05hPUM7bWM9T2QoaHwwLDAsSnwwLDApfDA7bGM9QztvYz1PZChtfDAsMCx1YnwwLDApfDA7bmM9QztzYz1PZChkYnwwLDAsRnwwLDApfDA7cmM9QztxYz1PZChoYXwwLGlhfDAsdnwwLDApfDA7cGM9QztjYT1PZChzfDAsMCxrYnwwLHFifDApfDA7WWE9QztaYj1PZChfYXwwLDAseGJ8MCwwKXwwO2thPUM7JGI9T2QobGF8MCwwLEp8MCwwKXwwO1liPUM7YmM9T2QoaHwwLDAsdWJ8MCwwKXwwO19iPUM7ZGM9T2QobXwwLDAsRnwwLDApfDA7YWM9QztlYz1PZChkYnwwLDAsdnwwLDApfDA7ZmM9QztjYz1PZChoYXwwLGlhfDAsVGF8MCwwKXwwO2NjPURkKGVjfDAsZmN8MCxjY3wwLEN8MCl8MDthYz1EZChjY3wwLEN8MCxkY3wwLGFjfDApfDA7X2I9RGQoYWN8MCxDfDAsYmN8MCxfYnwwKXwwO1liPURkKF9ifDAsQ3wwLCRifDAsWWJ8MCl8MDtrYT1EZChZYnwwLEN8MCxaYnwwLGthfDApfDA7WWE9RGQoa2F8MCxDfDAsY2F8MCxZYXwwKXwwO1hhPURkKFlhfDAsQ3wwLFhhJjIwOTcxNTF8MCwwKXwwO1lhPUM7Y2E9T2QoRWN8MCxCYnwwLGtifDAscWJ8MCl8MDtrYT1DO1piPU9kKHN8MCwwLHhifDAsMCl8MDtZYj1DOyRiPU9kKF9hfDAsMCxKfDAsMCl8MDtfYj1DO2JjPU9kKGxhfDAsMCx1YnwwLDApfDA7YWM9QztkYz1PZChofDAsMCxGfDAsMCl8MDtjYz1DO2ZjPU9kKG18MCwwLHZ8MCwwKXwwO2VjPUM7amM9T2QoZGJ8MCwwLFRhfDAsMCl8MDtpYz1DO2hjPU9kKGhhfDAsaWF8MCx5fDAsamF8MCl8MDtnYz1DO0FhPU9kKHVhfDAsRGF8MCxrYnwwLHFifDApfDA7SGI9QztJYj1PZChFY3wwLEJifDAseGJ8MCwwKXwwO0piPUM7S2I9T2Qoc3wwLDAsSnwwLDApfDA7TGI9QztNYj1PZChfYXwwLDAsdWJ8MCwwKXwwO05iPUM7T2I9T2QobGF8MCwwLEZ8MCwwKXwwO1BiPUM7UWI9T2QoaHwwLDAsdnwwLDApfDA7UmI9QztTYj1PZChtfDAsMCxUYXwwLDApfDA7VGI9QztWYj1PZChkYnwwLDAseXwwLGphfDApfDA7V2I9QztYYj1PZChoYXwwLGlhfDAsUWF8MCxzYnwwKXwwO1hiPURkKFZifDAsV2J8MCxYYnwwLEN8MCl8MDtUYj1EZChYYnwwLEN8MCxTYnwwLFRifDApfDA7UmI9RGQoVGJ8MCxDfDAsUWJ8MCxSYnwwKXwwO1BiPURkKFJifDAsQ3wwLE9ifDAsUGJ8MCl8MDtOYj1EZChQYnwwLEN8MCxNYnwwLE5ifDApfDA7TGI9RGQoTmJ8MCxDfDAsS2J8MCxMYnwwKXwwO0piPURkKExifDAsQ3wwLElifDAsSmJ8MCl8MDtIYj1EZChKYnwwLEN8MCxBYXwwLEhifDApfDA7ZGE9RGQoSGJ8MCxDfDAsT3x6YXxlYSYyMDMxNjE2fDAsZGF8MCl8MDtlYT1DO3phPU9kKFBhfDAsMCxrYnwwLHFifDApfDA7Tz1DO0hiPU9kKHVhfDAsRGF8MCx4YnwwLDApfDA7QWE9QztKYj1PZChFY3wwLEJifDAsSnwwLDApfDA7SWI9QztMYj1PZChzfDAsMCx1YnwwLDApfDA7S2I9QztOYj1PZChfYXwwLDAsRnwwLDApfDA7TWI9QztQYj1PZChsYXwwLDAsdnwwLDApfDA7T2I9QztSYj1PZChofDAsMCxUYXwwLDApfDA7UWI9QztUYj1PZChtfDAsMCx5fDAsamF8MCl8MDtTYj1DO1hiPU9kKGRifDAsMCxRYXwwLHNifDApfDA7V2I9QztWYj1PZChoYXwwLGlhfDAsU2F8MCwwKXwwO1ViPUM7Vj1PZChSfDAsMCxrYnwwLHFifDApfDA7VD1DO2hiPU9kKFBhfDAsMCx4YnwwLDApfDA7Vz1DO0k9T2QodWF8MCxEYXwwLEp8MCwwKXwwO2liPUM7dmI9T2QoRWN8MCxCYnwwLHVifDAsMCl8MDtFPUM7UT1PZChzfDAsMCxGfDAsMCl8MDt3Yj1DO1ZhPU9kKF9hfDAsMCx2fDAsMCl8MDtLPUM7bmI9T2QobGF8MCwwLFRhfDAsMCl8MDtXYT1DOyQ9T2QoaHwwLDAseXwwLGphfDApfDA7b2I9QztiYj1PZChtfDAsMCxRYXwwLHNifDApfDA7YWE9QztEYj1PZChkYnwwLDAsU2F8MCwwKXwwO0ViPUM7Y2I9T2QoaGF8MCxpYXwwLEJjfDAsMCl8MDtjYj1EZChEYnwwLEVifDAsY2J8MCxDfDApfDA7YWE9RGQoY2J8MCxDfDAsYmJ8MCxhYXwwKXwwO29iPURkKGFhfDAsQ3wwLCR8MCxvYnwwKXwwO1dhPURkKG9ifDAsQ3wwLG5ifDAsV2F8MCl8MDtLPURkKFdhfDAsQ3wwLFZhfDAsS3wwKXwwO3diPURkKEt8MCxDfDAsUXwwLHdifDApfDA7RT1EZCh3YnwwLEN8MCx2YnwwLEV8MCl8MDtpYj1EZChFfDAsQ3wwLEl8MCxpYnwwKXwwO1c9RGQoaWJ8MCxDfDAsaGJ8MCxXfDApfDA7VD1EZChXfDAsQ3wwLFZ8MCxUfDApfDA7VT1EZChUfDAsQ3wwLFUmMjA5NzE1MXwwLDApfDA7VD1DO3FiPU9kKER8MCxJYXwwLGtifDAscWJ8MCl8MDtrYj1DO1Y9T2QoUnwwLDAseGJ8MCwwKXwwO1c9QztoYj1PZChQYXwwLDAsSnwwLDApfDA7aWI9QztJPU9kKHVhfDAsRGF8MCx1YnwwLDApfDA7RT1DO3ZiPU9kKEVjfDAsQmJ8MCxGfDAsMCl8MDt3Yj1DO1E9T2Qoc3wwLDAsdnwwLDApfDA7Sz1DO1ZhPU9kKF9hfDAsMCxUYXwwLDApfDA7V2E9QztuYj1PZChsYXwwLDAseXwwLGphfDApfDA7b2I9QzskPU9kKGh8MCwwLFFhfDAsc2J8MCl8MDthYT1DO2JiPU9kKG18MCwwLFNhfDAsMCl8MDtjYj1DO0ViPU9kKGRifDAsMCxCY3wwLDApfDA7RGI9QztpYT1PZChoYXwwLGlhfDAscHwwLEthfDApfDA7aGE9Qzt4Yj1PZChEfDAsSWF8MCx4YnwwLDApfDA7eWI9QztsYj1PZChSfDAsMCxKfDAsMCl8MDtHPUM7bWE9T2QoUGF8MCwwLHVifDAsMCl8MDttYj1DO29hPU9kKHVhfDAsRGF8MCxGfDAsMCl8MDtnYT1DO3piPU9kKEVjfDAsQmJ8MCx2fDAsMCl8MDtyYj1DO3NhPU9kKHN8MCwwLFRhfDAsMCl8MDtBYj1DO3hhPU9kKF9hfDAsMCx5fDAsamF8MCl8MDtyYT1DO1VhPU9kKGxhfDAsMCxRYXwwLHNifDApfDA7d2E9QztlYj1PZChofDAsMCxTYXwwLDApfDA7bmE9Qzt0Yj1PZChtfDAsMCxCY3wwLDApfDA7bD1DO2RiPU9kKGRifDAsMCxwfDAsS2F8MCl8MDtkYj1EZCh0YnwwLGx8MCxkYnwwLEN8MCl8MDtuYT1EZChkYnwwLEN8MCxlYnwwLG5hfDApfDA7d2E9RGQobmF8MCxDfDAsVWF8MCx3YXwwKXwwO3JhPURkKHdhfDAsQ3wwLHhhfDAscmF8MCl8MDtBYj1EZChyYXwwLEN8MCxzYXwwLEFifDApfDA7cmI9RGQoQWJ8MCxDfDAsemJ8MCxyYnwwKXwwO2dhPURkKHJifDAsQ3wwLG9hfDAsZ2F8MCl8MDttYj1EZChnYXwwLEN8MCxtYXwwLG1ifDApfDA7Rz1EZChtYnwwLEN8MCxsYnwwLEd8MCl8MDt5Yj1EZChHfDAsQ3wwLHhifDAseWJ8MCl8MDt4Yj1DO0o9T2QoRHwwLElhfDAsSnwwLDApfDA7Rz1DO2xiPU9kKFJ8MCwwLHVifDAsMCl8MDttYj1DO21hPU9kKFBhfDAsMCxGfDAsMCl8MDtnYT1DO29hPU9kKHVhfDAsRGF8MCx2fDAsMCl8MDtyYj1DO3piPU9kKEVjfDAsQmJ8MCxUYXwwLDApfDA7QWI9QztzYT1PZChzfDAsMCx5fDAsamF8MCl8MDtyYT1DO3hhPU9kKF9hfDAsMCxRYXwwLHNifDApfDA7d2E9QztVYT1PZChsYXwwLDAsU2F8MCwwKXwwO25hPUM7ZWI9T2QoaHwwLDAsQmN8MCwwKXwwO2RiPUM7bT1PZChtfDAsMCxwfDAsS2F8MCl8MDtsPUM7dWI9T2QoRHwwLElhfDAsdWJ8MCwwKXwwO3RiPUM7ZmI9T2QoUnwwLDAsRnwwLDApfDA7Zz1DO0w9T2QoUGF8MCwwLHZ8MCwwKXwwO2diPUM7cj1PZCh1YXwwLERhfDAsVGF8MCwwKXwwO249QztmYT1PZChFY3wwLEJifDAseXwwLGphfDApfDA7eD1DO3FhPU9kKHN8MCwwLFFhfDAsc2J8MCl8MDtrPUM7dmE9T2QoX2F8MCwwLFNhfDAsMCl8MDtNPUM7Q2I9T2QobGF8MCwwLEJjfDAsMCl8MDtmPUM7aD1PZChofDAsMCxwfDAsS2F8MCl8MDtoPURkKENifDAsZnwwLGh8MCxDfDApfDA7TT1EZChofDAsQ3wwLHZhfDAsTXwwKXwwO2s9RGQoTXwwLEN8MCxxYXwwLGt8MCl8MDt4PURkKGt8MCxDfDAsZmF8MCx4fDApfDA7bj1EZCh4fDAsQ3wwLHJ8MCxufDApfDA7Z2I9RGQobnwwLEN8MCxMfDAsZ2J8MCl8MDtnPURkKGdifDAsQ3wwLGZifDAsZ3wwKXwwO3RiPURkKGd8MCxDfDAsdWJ8MCx0YnwwKXwwO3ViPUM7Rj1PZChEfDAsSWF8MCxGfDAsMCl8MDtnPUM7ZmI9T2QoUnwwLDAsdnwwLDApfDA7Z2I9QztMPU9kKFBhfDAsMCxUYXwwLDApfDA7bj1DO3I9T2QodWF8MCxEYXwwLHl8MCxqYXwwKXwwO3g9QztmYT1PZChFY3wwLEJifDAsUWF8MCxzYnwwKXwwO2s9QztxYT1PZChzfDAsMCxTYXwwLDApfDA7TT1DO3ZhPU9kKF9hfDAsMCxCY3wwLDApfDA7aD1DO2xhPU9kKGxhfDAsMCxwfDAsS2F8MCl8MDtmPUM7dj1PZChEfDAsSWF8MCx2fDAsMCl8MDtDYj1DO0I9T2QoUnwwLDAsVGF8MCwwKXwwO1M9QztfPU9kKFBhfDAsMCx5fDAsamF8MCl8MDtSYT1DO2FiPU9kKHVhfDAsRGF8MCxRYXwwLHNifDApfDA7Wj1DO1phPU9kKEVjfDAsQmJ8MCxTYXwwLDApfDA7JGE9QztQPU9kKHN8MCwwLEJjfDAsMCl8MDt1PUM7X2E9T2QoX2F8MCwwLHB8MCxLYXwwKXwwO19hPURkKFB8MCx1fDAsX2F8MCxDfDApfDA7JGE9RGQoX2F8MCxDfDAsWmF8MCwkYXwwKXwwO1o9RGQoJGF8MCxDfDAsYWJ8MCxafDApfDA7UmE9RGQoWnwwLEN8MCxffDAsUmF8MCl8MDtTPURkKFJhfDAsQ3wwLEJ8MCxTfDApfDA7Q2I9RGQoU3wwLEN8MCx2fDAsQ2J8MCl8MDt2PUM7VGE9T2QoRHwwLElhfDAsVGF8MCwwKXwwO1M9QztCPU9kKFJ8MCwwLHl8MCxqYXwwKXwwO1JhPUM7Xz1PZChQYXwwLDAsUWF8MCxzYnwwKXwwO1o9QzthYj1PZCh1YXwwLERhfDAsU2F8MCwwKXwwOyRhPUM7WmE9T2QoRWN8MCxCYnwwLEJjfDAsMCl8MDtfYT1DO3M9T2Qoc3wwLDAscHwwLEthfDApfDA7dT1DO2phPU9kKER8MCxJYXwwLHl8MCxqYXwwKXwwO3k9QztQPU9kKFJ8MCwwLFFhfDAsc2J8MCl8MDtKYT1DO3lhPU9kKFBhfDAsMCxTYXwwLDApfDA7amI9QztDYz1PZCh1YXwwLERhfDAsQmN8MCwwKXwwO0RjPUM7QmI9T2QoRWN8MCxCYnwwLHB8MCxLYXwwKXwwO0JiPURkKENjfDAsRGN8MCxCYnwwLEN8MCl8MDtqYj1EZChCYnwwLEN8MCx5YXwwLGpifDApfDA7SmE9RGQoamJ8MCxDfDAsUHwwLEphfDApfDA7eT1EZChKYXwwLEN8MCxqYXwwLHl8MCl8MDtqYT1DO3NiPU9kKER8MCxJYXwwLFFhfDAsc2J8MCl8MDtRYT1DO0phPU9kKFJ8MCwwLFNhfDAsMCl8MDtQPUM7amI9T2QoUGF8MCwwLEJjfDAsMCl8MDt5YT1DO0RhPU9kKHVhfDAsRGF8MCxwfDAsS2F8MCl8MDt1YT1DO1NhPU9kKER8MCxJYXwwLFNhfDAsMCl8MDtCYj1DO0RjPU9kKFJ8MCwwLEJjfDAsMCl8MDtDYz1DO1BhPU9kKFBhfDAsMCxwfDAsS2F8MCl8MDtQYT1EZChEY3wwLENjfDAsUGF8MCxDfDApfDA7QmI9RGQoUGF8MCxDfDAsU2F8MCxCYnwwKXwwO1NhPUM7QmM9T2QoRHwwLElhfDAsQmN8MCwwKXwwO1BhPUM7Uj1PZChSfDAsMCxwfDAsS2F8MCl8MDtSPURkKEJjfDAsUGF8MCxSfDAsQ3wwKXwwO1BhPUM7S2E9T2QoRHwwLElhfDAscHwwLEthfDApfDA7cD1DO0lhPURkKEhhfDAsYmF8MCwxMDQ4NTc2LDApfDA7SWE9R2QoSWF8MCxDfDAsMjEpfDA7RD1DO3RhPURkKEFjfDAsemN8MCx5Y3wwLHRhfDApfDA7dGE9RGQodGF8MCxDfDAsSWF8MCxEfDApfDA7RWE9RGQodGF8MCxDfDAsRWEmMjA5NzE1MXwwLDApfDA7dGE9QztEPUhkKElhfDAsRHwwLDIxKXwwO0Q9Q2QoSGF8MCxiYXwwLER8MCxDfDApfDA7YmE9QztIYT1EZChNYXwwLExhfDAsMTA0ODU3NiwwKXwwO0hhPUdkKEhhfDAsQ3wwLDIxKXwwO0lhPUM7dWM9RGQoeGN8MCx3Y3wwLHZjfDAsdWN8MCl8MDtDYT1EZCh1Y3wwLEN8MCx0Y3wwLENhfDApfDA7cGE9RGQoQ2F8MCxDfDAsQmF8MCxwYXwwKXwwO3BiPURkKHBhfDAsQ3wwLHBiJjIwOTcxNTF8MCwwKXwwO3BiPURkKHBifDAsQ3wwLEhhfDAsSWF8MCl8MDtwYT1DO0lhPUhkKEhhfDAsSWF8MCwyMSl8MDtIYT1DO0JhPURkKEdhfDAsRmF8MCwxMDQ4NTc2LDApfDA7QmE9RWQoQmF8MCxDfDAsMjEpfDA7Q2E9QztwYz1EZChzY3wwLHJjfDAscWN8MCxwY3wwKXwwO25jPURkKHBjfDAsQ3wwLG9jfDAsbmN8MCl8MDtsYz1EZChuY3wwLEN8MCxtY3wwLGxjfDApfDA7TmE9RGQobGN8MCxDfDAsa2N8MCxOYXwwKXwwO1k9RGQoTmF8MCxDfDAsT2F8MCxZfDApfDA7WD1EZChZfDAsQ3wwLFgmMjA5NzE1MXwwLDApfDA7WD1EZChYfDAsQ3wwLEJhfDAsQ2F8MCl8MDtZPUM7Q2E9SGQoQmF8MCxDYXwwLDIxKXwwO0JhPUM7T2E9RGQoWGF8MCxZYXwwLDEwNDg1NzYsMCl8MDtPYT1FZChPYXwwLEN8MCwyMSl8MDtOYT1DO2djPURkKGpjfDAsaWN8MCxoY3wwLGdjfDApfDA7ZWM9RGQoZ2N8MCxDfDAsZmN8MCxlY3wwKXwwO2NjPURkKGVjfDAsQ3wwLGRjfDAsY2N8MCl8MDthYz1EZChjY3wwLEN8MCxiY3wwLGFjfDApfDA7X2I9RGQoYWN8MCxDfDAsJGJ8MCxfYnwwKXwwO1liPURkKF9ifDAsQ3wwLFpifDAsWWJ8MCl8MDtrYT1EZChZYnwwLEN8MCxjYXwwLGthfDApfDA7dz1EZChrYXwwLEN8MCxIfDAsd3wwKXwwO3c9RGQod3wwLEN8MCxPYXwwLE5hfDApfDA7SD1DO05hPUhkKE9hfDAsTmF8MCwyMSl8MDtPYT1DO2thPURkKGRhfDAsZWF8MCwxMDQ4NTc2LDApfDA7a2E9RWQoa2F8MCxDfDAsMjEpfDA7Y2E9QztVYj1EZChYYnwwLFdifDAsVmJ8MCxVYnwwKXwwO1NiPURkKFVifDAsQ3wwLFRifDAsU2J8MCl8MDtRYj1EZChTYnwwLEN8MCxSYnwwLFFifDApfDA7T2I9RGQoUWJ8MCxDfDAsUGJ8MCxPYnwwKXwwO01iPURkKE9ifDAsQ3wwLE5ifDAsTWJ8MCl8MDtLYj1EZChNYnwwLEN8MCxMYnwwLEtifDApfDA7SWI9RGQoS2J8MCxDfDAsSmJ8MCxJYnwwKXwwO0FhPURkKElifDAsQ3wwLEhifDAsQWF8MCl8MDtPPURkKEFhfDAsQ3wwLHphfDAsT3wwKXwwO049RGQoT3wwLEN8MCxOJjIwOTcxNTF8MCwwKXwwO049RGQoTnwwLEN8MCxrYXwwLGNhfDApfDA7Tz1DO2NhPUhkKGthfDAsY2F8MCwyMSl8MDtrYT1DO3phPURkKFV8MCxUfDAsMTA0ODU3NiwwKXwwO3phPUVkKHphfDAsQ3wwLDIxKXwwO0FhPUM7aGE9RGQoRWJ8MCxEYnwwLGlhfDAsaGF8MCl8MDtjYj1EZChoYXwwLEN8MCxiYnwwLGNifDApfDA7YWE9RGQoY2J8MCxDfDAsJHwwLGFhfDApfDA7b2I9RGQoYWF8MCxDfDAsbmJ8MCxvYnwwKXwwO1dhPURkKG9ifDAsQ3wwLFZhfDAsV2F8MCl8MDtLPURkKFdhfDAsQ3wwLFF8MCxLfDApfDA7d2I9RGQoS3wwLEN8MCx2YnwwLHdifDApfDA7RT1EZCh3YnwwLEN8MCxJfDAsRXwwKXwwO2liPURkKEV8MCxDfDAsaGJ8MCxpYnwwKXwwO1c9RGQoaWJ8MCxDfDAsVnwwLFd8MCl8MDtrYj1EZChXfDAsQ3wwLHFifDAsa2J8MCl8MDtqPURkKGtifDAsQ3wwLEF8MCxqfDApfDA7aj1EZChqfDAsQ3wwLHphfDAsQWF8MCl8MDtBPUM7QWE9SGQoemF8MCxBYXwwLDIxKXwwO3phPUM7a2I9RGQoeWJ8MCx4YnwwLDEwNDg1NzYsMCl8MDtrYj1FZChrYnwwLEN8MCwyMSl8MDtxYj1DO2w9RGQoZWJ8MCxkYnwwLG18MCxsfDApfDA7bmE9RGQobHwwLEN8MCxVYXwwLG5hfDApfDA7d2E9RGQobmF8MCxDfDAseGF8MCx3YXwwKXwwO3JhPURkKHdhfDAsQ3wwLHNhfDAscmF8MCl8MDtBYj1EZChyYXwwLEN8MCx6YnwwLEFifDApfDA7cmI9RGQoQWJ8MCxDfDAsb2F8MCxyYnwwKXwwO2dhPURkKHJifDAsQ3wwLG1hfDAsZ2F8MCl8MDttYj1EZChnYXwwLEN8MCxsYnwwLG1ifDApfDA7Rz1EZChtYnwwLEN8MCxKfDAsR3wwKXwwO0c9RGQoR3wwLEN8MCxrYnwwLHFifDApfDA7Sj1DO3FiPUhkKGtifDAscWJ8MCwyMSl8MDtrYj1DO21iPURkKHRifDAsdWJ8MCwxMDQ4NTc2LDApfDA7bWI9RWQobWJ8MCxDfDAsMjEpfDA7bGI9QztmPURkKHZhfDAsaHwwLGxhfDAsZnwwKXwwO009RGQoZnwwLEN8MCxxYXwwLE18MCl8MDtrPURkKE18MCxDfDAsZmF8MCxrfDApfDA7eD1EZChrfDAsQ3wwLHJ8MCx4fDApfDA7bj1EZCh4fDAsQ3wwLEx8MCxufDApfDA7Z2I9RGQobnwwLEN8MCxmYnwwLGdifDApfDA7Zz1EZChnYnwwLEN8MCxGfDAsZ3wwKXwwO2c9RGQoZ3wwLEN8MCxtYnwwLGxifDApfDA7Rj1DO2xiPUhkKG1ifDAsbGJ8MCwyMSl8MDttYj1DO2diPURkKENifDAsdnwwLDEwNDg1NzYsMCl8MDtnYj1FZChnYnwwLEN8MCwyMSl8MDtmYj1DO3U9RGQoWmF8MCxfYXwwLHN8MCx1fDApfDA7JGE9RGQodXwwLEN8MCxhYnwwLCRhfDApfDA7Wj1EZCgkYXwwLEN8MCxffDAsWnwwKXwwO1JhPURkKFp8MCxDfDAsQnwwLFJhfDApfDA7Uz1EZChSYXwwLEN8MCxUYXwwLFN8MCl8MDtTPURkKFN8MCxDfDAsZ2J8MCxmYnwwKXwwO1RhPUM7ZmI9SGQoZ2J8MCxmYnwwLDIxKXwwO2diPUM7UmE9RGQoeXwwLGphfDAsMTA0ODU3NiwwKXwwO1JhPUVkKFJhfDAsQ3wwLDIxKXwwO0I9Qzt1YT1EZChqYnwwLHlhfDAsRGF8MCx1YXwwKXwwO1A9RGQodWF8MCxDfDAsSmF8MCxQfDApfDA7UWE9RGQoUHwwLEN8MCxzYnwwLFFhfDApfDA7UWE9RGQoUWF8MCxDfDAsUmF8MCxCfDApfDA7c2I9QztCPUhkKFJhfDAsQnwwLDIxKXwwO0I9Q2QoeXwwLGphfDAsQnwwLEN8MCl8MDtqYT1DO3k9RGQoQmJ8MCxTYXwwLDEwNDg1NzYsMCl8MDt5PUVkKHl8MCxDfDAsMjEpfDA7UmE9QztQYT1EZChSfDAsUGF8MCx5fDAsUmF8MCl8MDtSPUM7UmE9SGQoeXwwLFJhfDAsMjEpfDA7UmE9Q2QoQmJ8MCxTYXwwLFJhfDAsQ3wwKXwwO1NhPUM7QmI9RGQoS2F8MCxwfDAsMTA0ODU3NiwwKXwwO0JiPUVkKEJifDAsQ3wwLDIxKXwwO3k9QztQPUhkKEJifDAseXwwLDIxKXwwO1A9Q2QoS2F8MCxwfDAsUHwwLEN8MCl8MDtwPUM7S2E9RGQoRWF8MCx0YXwwLDEwNDg1NzYsMCl8MDtLYT1HZChLYXwwLEN8MCwyMSl8MDtKYT1DO3VhPUhkKEthfDAsSmF8MCwyMSl8MDt1YT1DZChFYXwwLHRhfDAsdWF8MCxDfDApfDA7dGE9QztFYT1EZChwYnwwLHBhfDAsMTA0ODU3NiwwKXwwO0VhPUVkKEVhfDAsQ3wwLDIxKXwwO0RhPUM7eWE9SGQoRWF8MCxEYXwwLDIxKXwwO3lhPUNkKHBifDAscGF8MCx5YXwwLEN8MCl8MDtwYT1DO3BiPURkKFh8MCxZfDAsMTA0ODU3NiwwKXwwO3BiPUVkKHBifDAsQ3wwLDIxKXwwO2piPUM7Wj1IZChwYnwwLGpifDAsMjEpfDA7Xz1DOyRhPURkKHd8MCxIfDAsMTA0ODU3NiwwKXwwOyRhPUVkKCRhfDAsQ3wwLDIxKXwwO2FiPUM7dT1IZCgkYXwwLGFifDAsMjEpfDA7cz1DO19hPURkKE58MCxPfDAsMTA0ODU3NiwwKXwwO19hPUVkKF9hfDAsQ3wwLDIxKXwwO1phPUM7bj1IZChfYXwwLFphfDAsMjEpfDA7TD1DO3g9RGQoanwwLEF8MCwxMDQ4NTc2LDApfDA7eD1FZCh4fDAsQ3wwLDIxKXwwO3I9QztrPUhkKHh8MCxyfDAsMjEpfDA7ZmE9QztNPURkKEd8MCxKfDAsMTA0ODU3NiwwKXwwO009RWQoTXwwLEN8MCwyMSl8MDtxYT1DO2Y9SGQoTXwwLHFhfDAsMjEpfDA7bGE9QztoPURkKGd8MCxGfDAsMTA0ODU3NiwwKXwwO2g9RWQoaHwwLEN8MCwyMSl8MDt2YT1DO2dhPUhkKGh8MCx2YXwwLDIxKXwwO21hPUM7cmI9RGQoU3wwLFRhfDAsMTA0ODU3NiwwKXwwO3JiPUVkKHJifDAsQ3wwLDIxKXwwO29hPUM7amE9RGQocmJ8MCxvYXwwLEJ8MCxqYXwwKXwwO0I9QztvYT1IZChyYnwwLG9hfDAsMjEpfDA7b2E9Q2QoU3wwLFRhfDAsb2F8MCxDfDApfDA7VGE9QztTPURkKFFhfDAsc2J8MCwxMDQ4NTc2LDApfDA7Uz1FZChTfDAsQ3wwLDIxKXwwO3JiPUM7U2E9RGQoU3wwLHJifDAsUmF8MCxTYXwwKXwwO1JhPUM7cmI9SGQoU3wwLHJifDAsMjEpfDA7cmI9Q2QoUWF8MCxzYnwwLHJifDAsQ3wwKXwwO3NiPUM7UWE9RGQoUGF8MCxSfDAsMTA0ODU3NiwwKXwwO1FhPUVkKFFhfDAsQ3wwLDIxKXwwO1M9QztwPURkKFFhfDAsU3wwLFB8MCxwfDApfDA7UD1DO1M9SGQoUWF8MCxTfDAsMjEpfDA7Uz1DZChQYXwwLFJ8MCxTfDAsQ3wwKXwwO1I9QztQYT1PZChCYnwwLHl8MCw2NjY2NDMsMCl8MDtRYT1DO0FiPU9kKEJifDAseXwwLDQ3MDI5NiwwKXwwO3piPUM7cmE9T2QoQmJ8MCx5fDAsNjU0MTgzLDApfDA7c2E9Qzt3YT1PZChCYnwwLHl8MCwtOTk3ODA1LC0xKXwwO3hhPUM7bmE9T2QoQmJ8MCx5fDAsMTM2NjU3LDApfDA7VWE9Qzt5PU9kKEJifDAseXwwLC02ODM5MDEsLTEpfDA7eT1EZChDYnwwLHZ8MCx5fDAsQ3wwKXwwO2diPUNkKHl8MCxDfDAsZmJ8MCxnYnwwKXwwO3ZhPURkKGdifDAsQ3wwLGh8MCx2YXwwKXwwO2g9QztnYj1PZChwfDAsUHwwLDY2NjY0MywwKXwwO2ZiPUM7eT1PZChwfDAsUHwwLDQ3MDI5NiwwKXwwO3Y9QztDYj1PZChwfDAsUHwwLDY1NDE4MywwKXwwO0JiPUM7bD1PZChwfDAsUHwwLC05OTc4MDUsLTEpfDA7bT1DO2RiPU9kKHB8MCxQfDAsMTM2NjU3LDApfDA7ZWI9QztQPU9kKHB8MCxQfDAsLTY4MzkwMSwtMSl8MDtwPUM7Vz1PZChTfDAsUnwwLDY2NjY0MywwKXwwO1Y9QztpYj1PZChTfDAsUnwwLDQ3MDI5NiwwKXwwO2hiPUM7RT1PZChTfDAsUnwwLDY1NDE4MywwKXwwO0k9Qzt3Yj1PZChTfDAsUnwwLC05OTc4MDUsLTEpfDA7dmI9QztLPU9kKFN8MCxSfDAsMTM2NjU3LDApfDA7UT1DO1I9T2QoU3wwLFJ8MCwtNjgzOTAxLC0xKXwwO1M9Qzt4YT1EZCh0YnwwLHVifDAsd2F8MCx4YXwwKXwwO2ViPURkKHhhfDAsQ3wwLGRifDAsZWJ8MCl8MDtTPURkKGVifDAsQ3wwLFJ8MCxTfDApfDA7bWI9Q2QoU3wwLEN8MCxsYnwwLG1ifDApfDA7cWE9RGQobWJ8MCxDfDAsTXwwLHFhfDApfDA7TT1DO21iPU9kKFNhfDAsUmF8MCw2NjY2NDMsMCl8MDtsYj1DO1M9T2QoU2F8MCxSYXwwLDQ3MDI5NiwwKXwwO1I9QztlYj1PZChTYXwwLFJhfDAsNjU0MTgzLDApfDA7ZGI9Qzt4YT1PZChTYXwwLFJhfDAsLTk5NzgwNSwtMSl8MDt3YT1DO3ViPU9kKFNhfDAsUmF8MCwxMzY2NTcsMCl8MDt0Yj1DO1JhPU9kKFNhfDAsUmF8MCwtNjgzOTAxLC0xKXwwO1NhPUM7V2E9T2QocmJ8MCxzYnwwLDY2NjY0MywwKXwwO1ZhPUM7b2I9T2QocmJ8MCxzYnwwLDQ3MDI5NiwwKXwwO25iPUM7YWE9T2QocmJ8MCxzYnwwLDY1NDE4MywwKXwwOyQ9QztjYj1PZChyYnwwLHNifDAsLTk5NzgwNSwtMSl8MDtiYj1DO2hhPU9kKHJifDAsc2J8MCwxMzY2NTcsMCl8MDtpYT1DO3NiPU9kKHJifDAsc2J8MCwtNjgzOTAxLC0xKXwwO3JiPUM7emI9RGQoQ2J8MCxCYnwwLEFifDAsemJ8MCl8MDt4Yj1EZCh6YnwwLEN8MCx5YnwwLHhifDApfDA7dmI9RGQoeGJ8MCxDfDAsd2J8MCx2YnwwKXwwO3RiPURkKHZifDAsQ3wwLHVifDAsdGJ8MCl8MDtyYj1EZCh0YnwwLEN8MCxzYnwwLHJifDApfDA7a2I9Q2QocmJ8MCxDfDAscWJ8MCxrYnwwKXwwO3I9RGQoa2J8MCxDfDAseHwwLHJ8MCl8MDt4PUM7a2I9T2QoamF8MCxCfDAsNjY2NjQzLDApfDA7a2I9RGQocGJ8MCxqYnwwLGtifDAsQ3wwKXwwO1lhPURkKGtifDAsQ3wwLFhhfDAsWWF8MCl8MDtPYT1DZChZYXwwLEN8MCxOYXwwLE9hfDApfDA7TmE9QztZYT1PZChqYXwwLEJ8MCw0NzAyOTYsMCl8MDtYYT1DO2tiPU9kKGphfDAsQnwwLDY1NDE4MywwKXwwO2piPUM7bGI9RGQob2J8MCxuYnwwLG1ifDAsbGJ8MCl8MDtqYj1EZChsYnwwLEN8MCxrYnwwLGpifDApfDA7YWI9RGQoamJ8MCxDfDAsJGF8MCxhYnwwKXwwO2VhPURkKGFifDAsQ3wwLGRhfDAsZWF8MCl8MDtrYT1DZChlYXwwLEN8MCxjYXwwLGthfDApfDA7Y2E9QztlYT1PZChqYXwwLEJ8MCwtOTk3ODA1LC0xKXwwO2RhPUM7YWI9T2QoamF8MCxCfDAsMTM2NjU3LDApfDA7JGE9QztmYj1EZChpYnwwLGhifDAsZ2J8MCxmYnwwKXwwO2RiPURkKGZifDAsQ3wwLGVifDAsZGJ8MCl8MDtiYj1EZChkYnwwLEN8MCxjYnwwLGJifDApfDA7JGE9RGQoYmJ8MCxDfDAsYWJ8MCwkYXwwKXwwO1phPURkKCRhfDAsQ3wwLF9hfDAsWmF8MCl8MDtUPURkKFphfDAsQ3wwLFV8MCxUfDApfDA7emE9Q2QoVHwwLEN8MCxBYXwwLHphfDApfDA7QWE9QztCPU9kKGphfDAsQnwwLC02ODM5MDEsLTEpfDA7amE9QztUPURkKE9hfDAsTmF8MCwxMDQ4NTc2LDApfDA7VD1FZChUfDAsQ3wwLDIxKXwwO1U9QztWYT1EZChZYXwwLFhhfDAsV2F8MCxWYXwwKXwwO0g9RGQoVmF8MCxDfDAsd3wwLEh8MCl8MDtzPUNkKEh8MCxDfDAsdXwwLHN8MCl8MDtzPURkKHN8MCxDfDAsVHwwLFV8MCl8MDt1PUM7VT1IZChUfDAsVXwwLDIxKXwwO1Q9QztIPURkKGthfDAsY2F8MCwxMDQ4NTc2LDApfDA7SD1FZChIfDAsQ3wwLDIxKXwwO3c9QztWPURkKFN8MCxSfDAsV3wwLFZ8MCl8MDskPURkKFZ8MCxDfDAsYWF8MCwkfDApfDA7ZGE9RGQoJHwwLEN8MCxlYXwwLGRhfDApfDA7Tz1EZChkYXwwLEN8MCxOfDAsT3wwKXwwO0w9Q2QoT3wwLEN8MCxufDAsTHwwKXwwO0w9RGQoTHwwLEN8MCxIfDAsd3wwKXwwO249Qzt3PUhkKEh8MCx3fDAsMjEpfDA7SD1DO089RGQoemF8MCxBYXwwLDEwNDg1NzYsMCl8MDtPPUVkKE98MCxDfDAsMjEpfDA7Tj1DO1FhPURkKHl8MCx2fDAsUGF8MCxRYXwwKXwwO0k9RGQoUWF8MCxDfDAsRXwwLEl8MCl8MDt3YT1EZChJfDAsQ3wwLHhhfDAsd2F8MCl8MDtpYT1EZCh3YXwwLEN8MCxoYXwwLGlhfDApfDA7amE9RGQoaWF8MCxDfDAsQnwwLGphfDApfDA7QT1EZChqYXwwLEN8MCxqfDAsQXwwKXwwO2ZhPUNkKEF8MCxDfDAsa3wwLGZhfDApfDA7ZmE9RGQoZmF8MCxDfDAsT3wwLE58MCl8MDtrPUM7Tj1IZChPfDAsTnwwLDIxKXwwO089QztBPURkKHJ8MCx4fDAsMTA0ODU3NiwwKXwwO0E9RWQoQXwwLEN8MCwyMSl8MDtqPUM7c2E9RGQobHwwLG18MCxyYXwwLHNhfDApfDA7UT1EZChzYXwwLEN8MCxLfDAsUXwwKXwwO1NhPURkKFF8MCxDfDAsUmF8MCxTYXwwKXwwO0o9RGQoU2F8MCxDfDAsR3wwLEp8MCl8MDtsYT1DZChKfDAsQ3wwLGZ8MCxsYXwwKXwwO2xhPURkKGxhfDAsQ3wwLEF8MCxqfDApfDA7Zj1DO2o9SGQoQXwwLGp8MCwyMSl8MDtqPUNkKHJ8MCx4fDAsanwwLEN8MCl8MDt4PUM7cj1EZChxYXwwLE18MCwxMDQ4NTc2LDApfDA7cj1FZChyfDAsQ3wwLDIxKXwwO0E9QztVYT1EZChQfDAscHwwLG5hfDAsVWF8MCl8MDtGPURkKFVhfDAsQ3wwLGd8MCxGfDApfDA7bWE9Q2QoRnwwLEN8MCxnYXwwLG1hfDApfDA7bWE9RGQobWF8MCxDfDAscnwwLEF8MCl8MDtnYT1DO0E9SGQocnwwLEF8MCwyMSl8MDtBPUNkKHFhfDAsTXwwLEF8MCxDfDApfDA7TT1DO3FhPURkKHZhfDAsaHwwLDEwNDg1NzYsMCl8MDtxYT1FZChxYXwwLEN8MCwyMSl8MDtyPUM7VGE9RGQocWF8MCxyfDAsb2F8MCxUYXwwKXwwO29hPUM7cj1IZChxYXwwLHJ8MCwyMSl8MDtyPUNkKHZhfDAsaHwwLHJ8MCxDfDApfDA7aD1DO3ZhPURkKHN8MCx1fDAsMTA0ODU3NiwwKXwwO3ZhPUVkKHZhfDAsQ3wwLDIxKXwwO3FhPUM7Rj1IZCh2YXwwLHFhfDAsMjEpfDA7Zz1DO1VhPURkKEx8MCxufDAsMTA0ODU3NiwwKXwwO1VhPUVkKFVhfDAsQ3wwLDIxKXwwO25hPUM7cD1IZChVYXwwLG5hfDAsMjEpfDA7UD1DO0o9RGQoZmF8MCxrfDAsMTA0ODU3NiwwKXwwO0o9RWQoSnwwLEN8MCwyMSl8MDtHPUM7eD1EZChKfDAsR3wwLGp8MCx4fDApfDA7aj1DO0c9SGQoSnwwLEd8MCwyMSl8MDtHPUNkKGZhfDAsa3wwLEd8MCxDfDApfDA7az1DO2ZhPURkKGxhfDAsZnwwLDEwNDg1NzYsMCl8MDtmYT1FZChmYXwwLEN8MCwyMSl8MDtKPUM7TT1EZChmYXwwLEp8MCxBfDAsTXwwKXwwO0E9QztKPUhkKGZhfDAsSnwwLDIxKXwwO0o9Q2QobGF8MCxmfDAsSnwwLEN8MCl8MDtmPUM7bGE9RGQobWF8MCxnYXwwLDEwNDg1NzYsMCl8MDtsYT1FZChsYXwwLEN8MCwyMSl8MDtmYT1DO2g9RGQobGF8MCxmYXwwLHJ8MCxofDApfDA7cj1DO2ZhPUhkKGxhfDAsZmF8MCwyMSl8MDtmYT1DZChtYXwwLGdhfDAsZmF8MCxDfDApfDA7Z2E9QzttYT1PZChUYXwwLG9hfDAsNjY2NjQzLDApfDA7bGE9QztTYT1PZChUYXwwLG9hfDAsNDcwMjk2LDApfDA7UmE9QztRPU9kKFRhfDAsb2F8MCw2NTQxODMsMCl8MDtLPUM7c2E9T2QoVGF8MCxvYXwwLC05OTc4MDUsLTEpfDA7cmE9QzttPU9kKFRhfDAsb2F8MCwxMzY2NTcsMCl8MDtsPUM7b2E9T2QoVGF8MCxvYXwwLC02ODM5MDEsLTEpfDA7b2E9RGQoVWF8MCxuYXwwLG9hfDAsQ3wwKXwwO0FhPURkKG9hfDAsQ3wwLHphfDAsQWF8MCl8MDtPPUNkKEFhfDAsQ3wwLE58MCxPfDApfDA7Tj1DO0FhPU9kKGh8MCxyfDAsNjY2NjQzLDApfDA7emE9QztvYT1PZChofDAscnwwLDQ3MDI5NiwwKXwwO25hPUM7VWE9T2QoaHwwLHJ8MCw2NTQxODMsMCl8MDtUYT1DO2phPU9kKGh8MCxyfDAsLTk5NzgwNSwtMSl8MDtCPUM7aWE9T2QoaHwwLHJ8MCwxMzY2NTcsMCl8MDtoYT1DO3I9T2QoaHwwLHJ8MCwtNjgzOTAxLC0xKXwwO2g9Qzt3YT1PZChmYXwwLGdhfDAsNjY2NjQzLDApfDA7d2E9RGQoeWF8MCxwYXwwLHdhfDAsQ3wwKXwwO3BhPUM7eWE9T2QoZmF8MCxnYXwwLDQ3MDI5NiwwKXwwO3hhPUM7ST1PZChmYXwwLGdhfDAsNjU0MTgzLDApfDA7RT1DO1FhPU9kKGZhfDAsZ2F8MCwtOTk3ODA1LC0xKXwwO1BhPUM7dj1PZChmYXwwLGdhfDAsMTM2NjU3LDApfDA7eT1DO2dhPU9kKGZhfDAsZ2F8MCwtNjgzOTAxLC0xKXwwO2ZhPUM7cmE9RGQoaWF8MCxoYXwwLHNhfDAscmF8MCl8MDtmYT1EZChyYXwwLEN8MCxnYXwwLGZhfDApfDA7cWE9RGQoZmF8MCxDfDAsdmF8MCxxYXwwKXwwO2NhPURkKHFhfDAsQ3wwLGthfDAsY2F8MCl8MDtIPUNkKGNhfDAsQ3wwLHd8MCxIfDApfDA7dz1DO2NhPU9kKE18MCxBfDAsNjY2NjQzLDApfDA7a2E9QztxYT1PZChNfDAsQXwwLDQ3MDI5NiwwKXwwO3FhPURkKHdhfDAscGF8MCxxYXwwLEN8MCl8MDtwYT1DO3dhPU9kKE18MCxBfDAsNjU0MTgzLDApfDA7dmE9QztmYT1PZChNfDAsQXwwLC05OTc4MDUsLTEpfDA7Z2E9QztyYT1PZChNfDAsQXwwLDEzNjY1NywwKXwwO3NhPUM7QT1PZChNfDAsQXwwLC02ODM5MDEsLTEpfDA7TT1DO2hhPU9kKEp8MCxmfDAsNjY2NjQzLDApfDA7aWE9QztkYT1PZChKfDAsZnwwLDQ3MDI5NiwwKXwwO2VhPUM7JD1PZChKfDAsZnwwLDY1NDE4MywwKXwwO2FhPUM7Vj1PZChKfDAsZnwwLC05OTc4MDUsLTEpfDA7Vz1DO1I9T2QoSnwwLGZ8MCwxMzY2NTcsMCl8MDtTPUM7Zj1PZChKfDAsZnwwLC02ODM5MDEsLTEpfDA7Sj1DO1JhPURkKFVhfDAsVGF8MCxTYXwwLFJhfDApfDA7UGE9RGQoUmF8MCxDfDAsUWF8MCxQYXwwKXwwO05hPURkKFBhfDAsQ3wwLE9hfDAsTmF8MCl8MDtUPUNkKE5hfDAsQ3wwLFV8MCxUfDApfDA7c2E9RGQoVHwwLEN8MCxyYXwwLHNhfDApfDA7Sj1EZChzYXwwLEN8MCxmfDAsSnwwKXwwO2Y9QztzYT1PZCh4fDAsanwwLDY2NjY0MywwKXwwO2JhPURkKHNhfDAsQ3wwLER8MCxiYXwwKXwwO0Q9QztzYT1PZCh4fDAsanwwLDQ3MDI5NiwwKXwwO3JhPUM7VD1PZCh4fDAsanwwLDY1NDE4MywwKXwwO1U9QztKYT1EZChNYXwwLExhfDAsS2F8MCxKYXwwKXwwO0hhPUNkKEphfDAsQ3wwLElhfDAsSGF8MCl8MDtrYT1EZChIYXwwLEN8MCxjYXwwLGthfDApfDA7VT1EZChrYXwwLEN8MCxUfDAsVXwwKXwwO2VhPURkKFV8MCxDfDAsZGF8MCxlYXwwKXwwO2RhPUM7VT1PZCh4fDAsanwwLC05OTc4MDUsLTEpfDA7VD1DO2thPU9kKHh8MCxqfDAsMTM2NjU3LDApfDA7Y2E9QztEYT1EZChHYXwwLEZhfDAsRWF8MCxEYXwwKXwwO0JhPUNkKERhfDAsQ3wwLENhfDAsQmF8MCl8MDt6YT1EZChCYXwwLEN8MCxBYXwwLHphfDApfDA7eGE9RGQoemF8MCxDfDAseWF8MCx4YXwwKXwwO3ZhPURkKHhhfDAsQ3wwLHdhfDAsdmF8MCl8MDtjYT1EZCh2YXwwLEN8MCxrYXwwLGNhfDApfDA7Vz1EZChjYXwwLEN8MCxWfDAsV3wwKXwwO1Y9QztqPU9kKHh8MCxqfDAsLTY4MzkwMSwtMSl8MDt4PUM7Y2E9RGQoYmF8MCxEfDAsMTA0ODU3NiwwKXwwO2NhPUVkKGNhfDAsQ3wwLDIxKXwwO2thPUM7cmE9RGQodWF8MCx0YXwwLHNhfDAscmF8MCl8MDtpYT1EZChyYXwwLEN8MCxoYXwwLGlhfDApfDA7aWE9RGQoaWF8MCxDfDAsY2F8MCxrYXwwKXwwO2hhPUM7a2E9SGQoY2F8MCxrYXwwLDIxKXwwO2thPUNkKGJhfDAsRHwwLGthfDAsQ3wwKXwwO0Q9QztiYT1EZChlYXwwLGRhfDAsMTA0ODU3NiwwKXwwO2JhPUVkKGJhfDAsQ3wwLDIxKXwwO2NhPUM7VD1EZChxYXwwLHBhfDAsVXwwLFR8MCl8MDthYT1EZChUfDAsQ3wwLCR8MCxhYXwwKXwwO2FhPURkKGFhfDAsQ3wwLGJhfDAsY2F8MCl8MDskPUM7Y2E9SGQoYmF8MCxjYXwwLDIxKXwwO2JhPUM7VD1EZChXfDAsVnwwLDEwNDg1NzYsMCl8MDtUPUVkKFR8MCxDfDAsMjEpfDA7VT1DO2xhPURkKG9hfDAsbmF8MCxtYXwwLGxhfDApfDA7RT1EZChsYXwwLEN8MCxJfDAsRXwwKXwwO1k9RGQoRXwwLEN8MCxYfDAsWXwwKXwwO189Q2QoWXwwLEN8MCxafDAsX3wwKXwwO2dhPURkKF98MCxDfDAsZmF8MCxnYXwwKXwwO3g9RGQoZ2F8MCxDfDAsanwwLHh8MCl8MDtTPURkKHh8MCxDfDAsUnwwLFN8MCl8MDtTPURkKFN8MCxDfDAsVHwwLFV8MCl8MDtSPUM7VT1IZChUfDAsVXwwLDIxKXwwO1Q9Qzt4PURkKEp8MCxmfDAsMTA0ODU3NiwwKXwwO3g9RWQoeHwwLEN8MCwyMSl8MDtqPUM7Sz1EZChqYXwwLEJ8MCxRfDAsS3wwKXwwO3k9RGQoS3wwLEN8MCx2fDAseXwwKXwwO3U9RGQoeXwwLEN8MCxzfDAsdXwwKXwwO2c9Q2QodXwwLEN8MCxGfDAsZ3wwKXwwO009RGQoZ3wwLEN8MCxBfDAsTXwwKXwwO009RGQoTXwwLEN8MCx4fDAsanwwKXwwO0E9QztqPUhkKHh8MCxqfDAsMjEpfDA7aj1DZChKfDAsZnwwLGp8MCxDfDApfDA7Zj1DO0o9RGQoSHwwLHd8MCwxMDQ4NTc2LDApfDA7Sj1FZChKfDAsQ3wwLDIxKXwwO3g9QztsPURkKHJ8MCxofDAsbXwwLGx8MCl8MDtuPURkKGx8MCxDfDAsTHwwLG58MCl8MDtuPURkKG58MCxDfDAsSnwwLHh8MCl8MDtQPUNkKG58MCxDfDAscHwwLFB8MCl8MDtwPUM7eD1IZChKfDAseHwwLDIxKXwwO3g9Q2QoSHwwLHd8MCx4fDAsQ3wwKXwwO3c9QztIPURkKE98MCxOfDAsMTA0ODU3NiwwKXwwO0g9RWQoSHwwLEN8MCwyMSl8MDtKPUM7az1EZChHfDAsa3wwLEh8MCxKfDApfDA7Rz1DO0o9SGQoSHwwLEp8MCwyMSl8MDtIPUM7bj1EZChpYXwwLGhhfDAsMTA0ODU3NiwwKXwwO249RWQobnwwLEN8MCwyMSl8MDtMPUM7bD1IZChufDAsTHwwLDIxKXwwO209QztoPURkKGFhfDAsJHwwLDEwNDg1NzYsMCl8MDtoPUVkKGh8MCxDfDAsMjEpfDA7cj1DO2c9SGQoaHwwLHJ8MCwyMSl8MDtGPUM7dT1EZChTfDAsUnwwLDEwNDg1NzYsMCl8MDt1PUVkKHV8MCxDfDAsMjEpfDA7cz1DO2Y9RGQoanwwLGZ8MCx1fDAsc3wwKXwwO2o9QztzPUhkKHV8MCxzfDAsMjEpfDA7dT1DO3k9RGQoTXwwLEF8MCwxMDQ4NTc2LDApfDA7eT1FZCh5fDAsQ3wwLDIxKXwwO3Y9Qzt3PURkKHh8MCx3fDAseXwwLHZ8MCl8MDt4PUM7dj1IZCh5fDAsdnwwLDIxKXwwO3Y9Q2QoTXwwLEF8MCx2fDAsQ3wwKXwwO0E9QztNPURkKFB8MCxwfDAsMTA0ODU3NiwwKXwwO009RWQoTXwwLEN8MCwyMSl8MDt5PUM7Sz1IZChNfDAseXwwLDIxKXwwO0s9Q2QoUHwwLHB8MCxLfDAsQ3wwKXwwO3A9QztQPURkKGt8MCxHfDAsMTA0ODU3NiwwKXwwO1A9RWQoUHwwLEN8MCwyMSl8MDtRPUM7Qj1IZChQfDAsUXwwLDIxKXwwO0I9Q2Qoa3wwLEd8MCxCfDAsQ3wwKXwwO0c9QztrPU9kKFB8MCxRfDAsNjY2NjQzLDApfDA7az1EZChrYXwwLER8MCxrfDAsQ3wwKXwwO0Q9QztrYT1PZChQfDAsUXwwLDQ3MDI5NiwwKXwwO2phPUM7Z2E9T2QoUHwwLFF8MCw2NTQxODMsMCl8MDtmYT1DO189T2QoUHwwLFF8MCwtOTk3ODA1LC0xKXwwO1o9QztZPU9kKFB8MCxRfDAsMTM2NjU3LDApfDA7WD1DO1E9T2QoUHwwLFF8MCwtNjgzOTAxLC0xKXwwO1A9QztFPUVkKGt8MCxEfDAsMjEpfDA7ST1DO2hhPURkKGthfDAsamF8MCxpYXwwLGhhfDApfDA7bT1DZChoYXwwLEN8MCxsfDAsbXwwKXwwO209RGQobXwwLEN8MCxFfDAsSXwwKXwwO2w9QztJPUhkKEV8MCxJfDAsMjEpfDA7ST1DZChrfDAsRHwwLEl8MCxDfDApfDA7RD1DO2s9RWQobXwwLGx8MCwyMSl8MDtFPUM7ZGE9RGQoZ2F8MCxmYXwwLGVhfDAsZGF8MCl8MDtiYT1DZChkYXwwLEN8MCxjYXwwLGJhfDApfDA7TD1EZChiYXwwLEN8MCxufDAsTHwwKXwwO0w9RGQoTHwwLEN8MCxrfDAsRXwwKXwwO249QztFPUhkKGt8MCxFfDAsMjEpfDA7RT1DZChtfDAsbHwwLEV8MCxDfDApfDA7bD1DO209RWQoTHwwLG58MCwyMSl8MDtrPUM7Wj1EZChhYXwwLCR8MCxffDAsWnwwKXwwO0Y9Q2QoWnwwLEN8MCxnfDAsRnwwKXwwO0Y9RGQoRnwwLEN8MCxtfDAsa3wwKXwwO2c9QztrPUhkKG18MCxrfDAsMjEpfDA7az1DZChMfDAsbnwwLGt8MCxDfDApfDA7bj1DO0w9RWQoRnwwLGd8MCwyMSl8MDttPUM7Vj1EZChZfDAsWHwwLFd8MCxWfDApfDA7VD1DZChWfDAsQ3wwLFV8MCxUfDApfDA7cj1EZChUfDAsQ3wwLGh8MCxyfDApfDA7cj1EZChyfDAsQ3wwLEx8MCxtfDApfDA7aD1DO209SGQoTHwwLG18MCwyMSl8MDttPUNkKEZ8MCxnfDAsbXwwLEN8MCl8MDtnPUM7Rj1FZChyfDAsaHwwLDIxKXwwO0w9QztQPURkKFN8MCxSfDAsUXwwLFB8MCl8MDt1PUNkKFB8MCxDfDAsc3wwLHV8MCl8MDt1PURkKHV8MCxDfDAsRnwwLEx8MCl8MDtzPUM7TD1IZChGfDAsTHwwLDIxKXwwO0w9Q2QocnwwLGh8MCxMfDAsQ3wwKXwwO2g9QztyPUVkKHV8MCxzfDAsMjEpfDA7Rj1DO2o9RGQoZnwwLGp8MCxyfDAsRnwwKXwwO2Y9QztGPUhkKHJ8MCxGfDAsMjEpfDA7Rj1DZCh1fDAsc3wwLEZ8MCxDfDApfDA7cz1DO3U9RWQoanwwLGZ8MCwyMSl8MDtyPUM7QT1EZCh1fDAscnwwLHZ8MCxBfDApfDA7dj1DO3I9SGQodXwwLHJ8MCwyMSl8MDtyPUNkKGp8MCxmfDAscnwwLEN8MCl8MDtmPUM7aj1FZChBfDAsdnwwLDIxKXwwO3U9Qzt4PURkKHd8MCx4fDAsanwwLHV8MCl8MDt3PUM7dT1IZChqfDAsdXwwLDIxKXwwO3U9Q2QoQXwwLHZ8MCx1fDAsQ3wwKXwwO3Y9QztBPUVkKHh8MCx3fDAsMjEpfDA7aj1DO3A9RGQoQXwwLGp8MCxLfDAscHwwKXwwO0s9QztqPUhkKEF8MCxqfDAsMjEpfDA7aj1DZCh4fDAsd3wwLGp8MCxDfDApfDA7dz1DO3g9RWQocHwwLEt8MCwyMSl8MDtBPUM7eT1EZChPfDAsTnwwLE18MCx5fDApfDA7SD1DZCh5fDAsQ3wwLEp8MCxIfDApfDA7SD1EZChIfDAsQ3wwLHh8MCxBfDApfDA7Sj1DO0E9SGQoeHwwLEF8MCwyMSl8MDtBPUNkKHB8MCxLfDAsQXwwLEN8MCl8MDtLPUM7cD1FZChIfDAsSnwwLDIxKXwwO3g9QztHPURkKHB8MCx4fDAsQnwwLEd8MCl8MDtCPUM7eD1IZChwfDAseHwwLDIxKXwwO3g9Q2QoSHwwLEp8MCx4fDAsQ3wwKXwwO0o9QztIPUVkKEd8MCxCfDAsMjEpfDA7cD1DO3k9SGQoSHwwLHB8MCwyMSl8MDt5PUNkKEd8MCxCfDAseXwwLEN8MCl8MDtCPUM7Rz1PZChIfDAscHwwLDY2NjY0MywwKXwwO0Q9RGQoR3wwLEN8MCxJfDAsRHwwKXwwO0k9QztHPU9kKEh8MCxwfDAsNDcwMjk2LDApfDA7Rz1EZChFfDAsbHwwLEd8MCxDfDApfDA7bD1DO0U9T2QoSHwwLHB8MCw2NTQxODMsMCl8MDtFPURkKGt8MCxufDAsRXwwLEN8MCl8MDtuPUM7az1PZChIfDAscHwwLC05OTc4MDUsLTEpfDA7az1EZChtfDAsZ3wwLGt8MCxDfDApfDA7Zz1DO209T2QoSHwwLHB8MCwxMzY2NTcsMCl8MDttPURkKEx8MCxofDAsbXwwLEN8MCl8MDtoPUM7cD1PZChIfDAscHwwLC02ODM5MDEsLTEpfDA7cD1EZChGfDAsc3wwLHB8MCxDfDApfDA7cz1DO0Y9RWQoRHwwLEl8MCwyMSl8MDtIPUM7bD1EZChHfDAsbHwwLEZ8MCxIfDApfDA7Rz1DO0g9SGQoRnwwLEh8MCwyMSl8MDtIPUNkKER8MCxJfDAsSHwwLEN8MCl8MDtJPUM7RD1FZChsfDAsR3wwLDIxKXwwO0Y9QztuPURkKEV8MCxufDAsRHwwLEZ8MCl8MDtFPUM7Rj1IZChEfDAsRnwwLDIxKXwwO0Y9Q2QobHwwLEd8MCxGfDAsQ3wwKXwwO0c9QztsPUVkKG58MCxFfDAsMjEpfDA7RD1DO2c9RGQoa3wwLGd8MCxsfDAsRHwwKXwwO2s9QztEPUhkKGx8MCxEfDAsMjEpfDA7RD1DZChufDAsRXwwLER8MCxDfDApfDA7RT1DO249RWQoZ3wwLGt8MCwyMSl8MDtsPUM7aD1EZChtfDAsaHwwLG58MCxsfDApfDA7bT1DO2w9SGQobnwwLGx8MCwyMSl8MDtsPUNkKGd8MCxrfDAsbHwwLEN8MCl8MDtrPUM7Zz1FZChofDAsbXwwLDIxKXwwO249QztzPURkKHB8MCxzfDAsZ3wwLG58MCl8MDtwPUM7bj1IZChnfDAsbnwwLDIxKXwwO249Q2QoaHwwLG18MCxufDAsQ3wwKXwwO209QztoPUVkKHN8MCxwfDAsMjEpfDA7Zz1DO2Y9RGQoaHwwLGd8MCxyfDAsZnwwKXwwO3I9QztnPUhkKGh8MCxnfDAsMjEpfDA7Zz1DZChzfDAscHwwLGd8MCxDfDApfDA7cD1DO3M9RWQoZnwwLHJ8MCwyMSl8MDtoPUM7dj1EZChzfDAsaHwwLHV8MCx2fDApfDA7dT1DO2g9SGQoc3wwLGh8MCwyMSl8MDtoPUNkKGZ8MCxyfDAsaHwwLEN8MCl8MDtyPUM7Zj1FZCh2fDAsdXwwLDIxKXwwO3M9Qzt3PURkKGZ8MCxzfDAsanwwLHd8MCl8MDtqPUM7cz1IZChmfDAsc3wwLDIxKXwwO3M9Q2QodnwwLHV8MCxzfDAsQ3wwKXwwO3U9Qzt2PUVkKHd8MCxqfDAsMjEpfDA7Zj1DO0s9RGQodnwwLGZ8MCxBfDAsS3wwKXwwO0E9QztmPUhkKHZ8MCxmfDAsMjEpfDA7Zj1DZCh3fDAsanwwLGZ8MCxDfDApfDA7aj1DO3c9RWQoS3wwLEF8MCwyMSl8MDt2PUM7Sj1EZCh3fDAsdnwwLHh8MCxKfDApfDA7eD1DO3Y9SGQod3wwLHZ8MCwyMSl8MDt2PUNkKEt8MCxBfDAsdnwwLEN8MCl8MDtBPUM7Sz1FZChKfDAseHwwLDIxKXwwO3c9QztCPURkKEt8MCx3fDAseXwwLEJ8MCl8MDt5PUM7dz1IZChLfDAsd3wwLDIxKXwwO3c9Q2QoSnwwLHh8MCx3fDAsQ3wwKXwwO3g9QzthW28+PjBdPUg7bz1HZChIfDAsSXwwLDgpfDA7YVtiKzMzPj4wXT1vO289R2QoSHwwLEl8MCwxNil8MDtJPUM7SD1IZChGfDAsR3wwLDUpfDA7YVtiKzM0Pj4wXT1IfG87bz1HZChGfDAsR3wwLDMpfDA7YVtiKzM1Pj4wXT1vO289R2QoRnwwLEd8MCwxMSl8MDthW2IrMzY+PjBdPW87bz1HZChGfDAsR3wwLDE5KXwwO0c9QztGPUhkKER8MCxFfDAsMil8MDthW2IrMzc+PjBdPUZ8bztvPUdkKER8MCxFfDAsNil8MDthW2IrMzg+PjBdPW87bz1HZChEfDAsRXwwLDE0KXwwO0U9QztEPUhkKGx8MCxrfDAsNyl8MDthW2IrMzk+PjBdPUR8bztvPUdkKGx8MCxrfDAsMSl8MDthW2IrNDA+PjBdPW87bz1HZChsfDAsa3wwLDkpfDA7YVtiKzQxPj4wXT1vO289R2QobHwwLGt8MCwxNyl8MDtrPUM7bD1IZChufDAsbXwwLDQpfDA7YVtiKzQyPj4wXT1sfG87bz1HZChufDAsbXwwLDQpfDA7YVtiKzQzPj4wXT1vO289R2QobnwwLG18MCwxMil8MDthW2IrNDQ+PjBdPW87bz1HZChufDAsbXwwLDIwKXwwO209QztuPUhkKGd8MCxwfDAsMSl8MDthW2IrNDU+PjBdPW58bztvPUdkKGd8MCxwfDAsNyl8MDthW2IrNDY+PjBdPW87cD1HZChnfDAscHwwLDE1KXwwO289QztnPUhkKGh8MCxyfDAsNil8MDthW2IrNDc+PjBdPWd8cDtwPUdkKGh8MCxyfDAsMil8MDthW2IrNDg+PjBdPXA7cD1HZChofDAscnwwLDEwKXwwO2FbYis0OT4+MF09cDtyPUdkKGh8MCxyfDAsMTgpfDA7aD1DO3A9SGQoc3wwLHV8MCwzKXwwO2FbYis1MD4+MF09cHxyO3I9R2Qoc3wwLHV8MCw1KXwwO2FbYis1MT4+MF09cjt1PUdkKHN8MCx1fDAsMTMpfDA7YVtiKzUyPj4wXT11O2FbYis1Mz4+MF09Zjt1PUdkKGZ8MCxqfDAsOCl8MDthW2IrNTQ+PjBdPXU7aj1HZChmfDAsanwwLDE2KXwwO2Y9Qzt1PUhkKHZ8MCxBfDAsNSl8MDthW2IrNTU+PjBdPXV8ajtqPUdkKHZ8MCxBfDAsMyl8MDthW2IrNTY+PjBdPWo7aj1HZCh2fDAsQXwwLDExKXwwO2FbYis1Nz4+MF09ajtBPUdkKHZ8MCxBfDAsMTkpfDA7dj1DO2o9SGQod3wwLHh8MCwyKXwwO2FbYis1OD4+MF09anxBO0E9R2Qod3wwLHh8MCw2KXwwO2FbYis1OT4+MF09QTt4PUdkKHd8MCx4fDAsMTQpfDA7dz1DO0E9SGQoQnwwLHl8MCw3KXwwO2FbYis2MD4+MF09eHxBO0E9R2QoQnwwLHl8MCwxKXwwO2FbYis2MT4+MF09QTtBPUdkKEJ8MCx5fDAsOSl8MDthW2IrNjI+PjBdPUE7eT1HZChCfDAseXwwLDE3KXwwO2FbYis2Mz4+MF09eTt5PXE7Qj15KzY0fDA7ZG97YVt5Pj4wXT0wO3k9eSsxfDB9d2hpbGUoKHl8MCk8KEJ8MCkpO3k9dDtCPXkrNjR8MDtkb3thW3k+PjBdPTA7eT15KzF8MH13aGlsZSgoeXwwKTwoQnwwKSk7aWYoIWUpe2k9ejtyZXR1cm59RWM9ZTtjW0VjPj4yXT02NDtjW0VjKzQ+PjJdPTA7aT16O3JldHVybn1mdW5jdGlvbiBZYyhiLGMpe2I9YnwwO2M9Y3wwO3JldHVybiAoKCgoYVtjKzE+PjBdXmFbYisxPj4wXXxhW2M+PjBdXmFbYj4+MF18YVtjKzI+PjBdXmFbYisyPj4wXXxhW2MrMz4+MF1eYVtiKzM+PjBdfGFbYys0Pj4wXV5hW2IrND4+MF18YVtjKzU+PjBdXmFbYis1Pj4wXXxhW2MrNj4+MF1eYVtiKzY+PjBdfGFbYys3Pj4wXV5hW2IrNz4+MF18YVtjKzg+PjBdXmFbYis4Pj4wXXxhW2MrOT4+MF1eYVtiKzk+PjBdfGFbYysxMD4+MF1eYVtiKzEwPj4wXXxhW2MrMTE+PjBdXmFbYisxMT4+MF18YVtjKzEyPj4wXV5hW2IrMTI+PjBdfGFbYysxMz4+MF1eYVtiKzEzPj4wXXxhW2MrMTQ+PjBdXmFbYisxND4+MF18YVtjKzE1Pj4wXV5hW2IrMTU+PjBdfGFbYysxNj4+MF1eYVtiKzE2Pj4wXXxhW2MrMTc+PjBdXmFbYisxNz4+MF18YVtjKzE4Pj4wXV5hW2IrMTg+PjBdfGFbYysxOT4+MF1eYVtiKzE5Pj4wXXxhW2MrMjA+PjBdXmFbYisyMD4+MF18YVtjKzIxPj4wXV5hW2IrMjE+PjBdfGFbYysyMj4+MF1eYVtiKzIyPj4wXXxhW2MrMjM+PjBdXmFbYisyMz4+MF18YVtjKzI0Pj4wXV5hW2IrMjQ+PjBdfGFbYysyNT4+MF1eYVtiKzI1Pj4wXXxhW2MrMjY+PjBdXmFbYisyNj4+MF18YVtjKzI3Pj4wXV5hW2IrMjc+PjBdfGFbYysyOD4+MF1eYVtiKzI4Pj4wXXxhW2MrMjk+PjBdXmFbYisyOT4+MF18YVtjKzMwPj4wXV5hW2IrMzA+PjBdfGFbYyszMT4+MF1eYVtiKzMxPj4wXSkmMjU1KSs1MTF8MCk+Pj44JjEpKy0xfDB9ZnVuY3Rpb24gWmMoYSl7YT1hfDA7Y1s3OTc2XT1hO3JldHVybiAwfWZ1bmN0aW9uIF9jKCl7cmV0dXJuIEJhKDApfDB9ZnVuY3Rpb24gJGMoKXtCYSgxKTtyZXR1cm59ZnVuY3Rpb24gYWQoYSl7YT1hfDA7dmFyIGI9MCxkPTA7Yj1jWzc5NzZdfDA7aWYoKGJ8MCkhPTA/KGQ9Y1tiKzEyPj4yXXwwLChkfDApIT0wKTowKXthPUVhW2QmMzFdKGEpfDA7cmV0dXJuIGF8MH1pZihhPj4+MDwyKXthPTA7cmV0dXJuIGF8MH1iPSgoMC1hfDApPj4+MCklKGE+Pj4wKXwwO2RvIGQ9QmEoMCl8MDt3aGlsZShkPj4+MDxiPj4+MCk7YT0oZD4+PjApJShhPj4+MCl8MDtyZXR1cm4gYXwwfWZ1bmN0aW9uIGJkKGIsYyl7Yj1ifDA7Yz1jfDA7dmFyIGQ9MDtpZighYylyZXR1cm47ZWxzZSBkPTA7ZG97YVtiK2Q+PjBdPUJhKDApfDA7ZD1kKzF8MH13aGlsZSgoZHwwKSE9KGN8MCkpO3JldHVybn1mdW5jdGlvbiBjZCgpe3ZhciBhPTA7YT1jWzc5NzZdfDA7aWYoIWEpe2E9MDtyZXR1cm4gYXwwfWE9Y1thKzIwPj4yXXwwO2lmKCFhKXthPTA7cmV0dXJuIGF8MH1hPURhW2EmMzFdKCl8MDtyZXR1cm4gYXwwfWZ1bmN0aW9uIGRkKCl7dmFyIGE9MCxiPTA7aWYoY1s3OTc3XXwwKXtiPTE7cmV0dXJuIGJ8MH1CYSgxKTthPW5hKDMwKXwwO2lmKChhfDApPjApY1s3OTc4XT1hO2Vsc2UgYT1jWzc5NzhdfDA7aWYoYT4+PjA8MTYpcmEoKTtlbHNlIGI9MDtkb3tCYSgwKXwwO2I9YisxfDB9d2hpbGUoKGJ8MCkhPTE2KTtjWzc5NzddPTE7Yj0wO3JldHVybiBifDB9ZnVuY3Rpb24gZWQoYSxiKXthPWF8MDtiPWJ8MDtGZChhfDAsMCxifDApfDA7cmV0dXJufWZ1bmN0aW9uIGZkKGIsYyxlLGYpe2I9YnwwO2M9Y3wwO2U9ZXwwO2Y9ZnwwO3ZhciBnPTAsaD0wLGk9MCxqPTA7Zz1mPDwxO2lmKCEoZj4+PjA8MjE0NzQ4MzY0NyZnPj4+MDxjPj4+MCkpcmEoKTtpZighZil7Zj0wO2Y9YitmfDA7YVtmPj4wXT0wO3JldHVybiBifDB9ZWxzZSBjPTA7ZG97aj1kW2UrYz4+MF18MDtpPWomMTU7aj1qPj4+NDtoPWM8PDE7YVtiK2g+PjBdPWorODcrKChqKzY1NTI2fDApPj4+OCYyMTcpO2FbYisoaHwxKT4+MF09KChpPDw4KSsyMjI3MisoaSs2NTUyNiY1NTU1Mil8MCk+Pj44O2M9YysxfDB9d2hpbGUoKGN8MCkhPShmfDApKTtqPWIrZ3wwO2Fbaj4+MF09MDtyZXR1cm4gYnwwfWZ1bmN0aW9uIGdkKGIsZSxmLGcsaCxpLGope2I9YnwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO2k9aXwwO2o9anwwO3ZhciBrPTAsbD0wLG09MCxuPTAsbz0wLHA9MCxxPTAscj0wLHM9MCx0PTAsdT0wO2E6ZG8gaWYoIWcpe249MDtsPTA7bz0wO2s9MH1lbHNle2I6ZG8gaWYoIWgpe249MDtyPTA7bD0wO2s9MDt3aGlsZSgxKXtwPWRbZitsPj4wXXwwO209cF40ODtvPShtKzY1NTI2fDApPj4+ODtwPShwJjIyMykrMjAxfDA7cT1wJjI1NTtxPShxKzY1NTI2XnErNjU1MjApPj4+ODtpZighKChxfG8pJjI1NSkpe289MDticmVhayBhfW09cSZwfG8mbTtpZihuPj4+MD49ZT4+PjApe209azticmVhayBifWlmKCEoazw8MjQ+PjI0KSltPW08PDQmMjU1O2Vsc2V7YVtiK24+PjBdPW18ciYyNTU7bj1uKzF8MDttPXJ9az0oayYyNTVeMjU1KSYyNTU7bD1sKzF8MDtpZihsPj4+MDxnPj4+MClyPW07ZWxzZXtvPTA7YnJlYWsgYX19fWVsc2V7bj0wO3U9MDtsPTA7az0wO3doaWxlKDEpe3Q9azw8MjQ+PjI0PT0wO2M6ZG8gaWYoIXQpe3E9ZFtmK2w+PjBdfDA7bT1xXjQ4O289KG0rNjU1MjZ8MCk+Pj44O3E9KHEmMjIzKSsyMDF8MDtwPXEmMjU1O3A9KHArNjU1MjZecCs2NTUyMCk+Pj44O2lmKCEoKHB8bykmMjU1KSl7bz0wO2JyZWFrIGF9fWVsc2Ugd2hpbGUoMSl7cT1hW2YrbD4+MF18MDtyPXEmMjU1O209cl40ODtvPShtKzY1NTI2fDApPj4+ODtzPShyJjIyMykrMjAxfDA7cD1zJjI1NTtwPShwKzY1NTI2XnArNjU1MjApPj4+ODtpZigocHxvKSYyNTUpe3E9czticmVhayBjfXM9dWQoaCxyKXwwO2lmKChzfDApPT0wPzE6KGFbcz4+MF18MCkhPXE8PDI0Pj4yNCl7bz0wO2s9MDticmVhayBhfWw9bCsxfDA7aWYobD4+PjA+PWc+Pj4wKXtvPTA7az0wO2JyZWFrIGF9fXdoaWxlKDApO209cCZxfG8mbTtpZihuPj4+MD49ZT4+PjApe209azticmVhayBifWlmKHQpbT1tPDw0JjI1NTtlbHNle2FbYituPj4wXT1tfHUmMjU1O249bisxfDA7bT11fWs9KGsmMjU1XjI1NSkmMjU1O2w9bCsxfDA7aWYobD4+PjA8Zz4+PjApdT1tO2Vsc2V7bz0wO2JyZWFrIGF9fX13aGlsZSgwKTtpZighKGNbNzk3OV18MCkpaz0zMTk2NDtlbHNlIGs9Y1sob2EoKXwwKSs2MD4+Ml18MDtjW2s+PjJdPTM0O289LTE7az1tfXdoaWxlKDApO2lmKGopY1tqPj4yXT1mKygoKGs8PDI0Pj4yNCE9MCk8PDMxPj4zMSkrbCk7aWYoIWkpcmV0dXJuIG98MDtjW2k+PjJdPW47cmV0dXJuIG98MH1mdW5jdGlvbiBoZCgpe3JldHVybiAzMzc3OX1mdW5jdGlvbiBpZCgpe3JldHVybiA4fWZ1bmN0aW9uIGpkKCl7cmV0dXJuIDB9ZnVuY3Rpb24ga2QoYSxiLGQpe2E9YXwwO2I9YnwwO2Q9ZHwwO3ZhciBlPTAsZj0wLGc9MCxoPTAsaT0wLGo9MCxrPTAsbD0wLG09MCxuPTAsbz0wLHA9MCxxPTAscj0wLHM9MCx0PTAsdT0wLHY9MCx3PTAseD0wLHk9MCx6PTAsQT0wLEI9MCxEPTAsRT0wLEY9MCxHPTAsSD0wLEk9MCxKPTAsSz0wLEw9MCxNPTAsTj0wLE89MCxQPTAsUT0wLFI9MCxTPTAsVD0wLFU9MCxWPTAsVz0wLFg9MCxZPTAsWj0wLF89MCwkPTAsYWE9MCxiYT0wLGNhPTAsZGE9MCxlYT0wLGZhPTAsZ2E9MCxoYT0wLGlhPTAsamE9MCxrYT0wLGxhPTAsbWE9MCxuYT0wLG9hPTAscGE9MCxxYT0wLHJhPTAsc2E9MCx0YT0wLHVhPTAsdmE9MCx3YT0wLHhhPTAseWE9MCx6YT0wLEFhPTAsQmE9MCxDYT0wLERhPTAsRWE9MCxGYT0wLEdhPTAsSGE9MCxJYT0wLEphPTAsS2E9MCxMYT0wLE1hPTAsTmE9MCxPYT0wLFBhPTAsUWE9MCxSYT0wLFNhPTAsVGE9MCxVYT0wLFZhPTAsV2E9MCxYYT0wLFlhPTAsWmE9MCxfYT0wLCRhPTAsYWI9MCxiYj0wLGNiPTAsZGI9MCxlYj0wLGZiPTAsZ2I9MCxoYj0wLGliPTAsamI9MCxrYj0wLGxiPTAsbWI9MCxuYj0wLG9iPTAscGI9MCxxYj0wLHJiPTAsc2I9MCx0Yj0wLHViPTAsdmI9MCx3Yj0wLHhiPTAseWI9MCx6Yj0wLEFiPTAsQmI9MCxDYj0wLERiPTAsRWI9MCxGYj0wLEdiPTAsSGI9MCxJYj0wLEpiPTAsS2I9MCxMYj0wLE1iPTAsTmI9MCxPYj0wLFBiPTAsUWI9MCxSYj0wLFNiPTAsVGI9MCxVYj0wLFZiPTAsV2I9MCxYYj0wLFliPTAsWmI9MCxfYj0wLCRiPTAsYWM9MCxiYz0wLGNjPTAsZGM9MCxlYz0wLGZjPTAsZ2M9MCxoYz0wLGljPTAsamM9MCxrYz0wLGxjPTAsbWM9MCxuYz0wLG9jPTAscGM9MCxxYz0wLHJjPTAsc2M9MCx0Yz0wLHVjPTAsdmM9MCx3Yz0wLHhjPTAseWM9MCx6Yz0wLEFjPTAsQmM9MCxDYz0wLERjPTAsRWM9MCxGYz0wLEdjPTAsSGM9MCxJYz0wLEpjPTAsS2M9MCxMYz0wLE1jPTAsTmM9MCxPYz0wLFBjPTAsUWM9MCxSYz0wLFNjPTA7bD1jW2I+PjJdfDA7cz1jW2IrND4+Ml18MDtqPWNbYis4Pj4yXXwwO1JiPWNbYisxMj4+Ml18MDtlPWNbYisxNj4+Ml18MDt6YT1jW2IrMjA+PjJdfDA7eWE9Y1tiKzI0Pj4yXXwwO3piPWNbYisyOD4+Ml18MDtoPWNbYiszMj4+Ml18MDtnYT1jW2IrMzY+PjJdfDA7SD1jW2Q+PjJdfDA7Sj1jW2QrND4+Ml18MDtGPWNbZCs4Pj4yXXwwO0Q9Y1tkKzEyPj4yXXwwO0E9Y1tkKzE2Pj4yXXwwO3k9Y1tkKzIwPj4yXXwwO3c9Y1tkKzI0Pj4yXXwwO3U9Y1tkKzI4Pj4yXXwwO2s9Y1tkKzMyPj4yXXwwO3Q9Y1tkKzM2Pj4yXXwwO09jPUoqMTl8MDtiYz1GKjE5fDA7cmI9RCoxOXwwO0hhPUEqMTl8MDtqYz15KjE5fDA7RGI9dyoxOXwwO1RhPXUqMTl8MDtTYz1rKjE5fDA7UWM9dCoxOXwwO3A9czw8MTtmPVJiPDwxO009emE8PDE7aT16Yjw8MTtkPWdhPDwxO289KChsfDApPDApPDwzMT4+MzE7ST0oKEh8MCk8MCk8PDMxPj4zMTtNYz1PZChIfDAsSXwwLGx8MCxvfDApfDA7TGM9QztLPSgoSnwwKTwwKTw8MzE+PjMxO3djPU9kKEp8MCxLfDAsbHwwLG98MCl8MDt2Yz1DO0c9KChGfDApPDApPDwzMT4+MzE7dWI9T2QoRnwwLEd8MCxsfDAsb3wwKXwwO3RiPUM7RT0oKER8MCk8MCk8PDMxPj4zMTtLYT1PZChEfDAsRXwwLGx8MCxvfDApfDA7SmE9QztCPSgoQXwwKTwwKTw8MzE+PjMxO21jPU9kKEF8MCxCfDAsbHwwLG98MCl8MDtsYz1DO3o9KCh5fDApPDApPDwzMT4+MzE7R2I9T2QoeXwwLHp8MCxsfDAsb3wwKXwwO0ZiPUM7eD0oKHd8MCk8MCk8PDMxPj4zMTtXYT1PZCh3fDAseHwwLGx8MCxvfDApfDA7VmE9Qzt2PSgodXwwKTwwKTw8MzE+PjMxO2phPU9kKHV8MCx2fDAsbHwwLG98MCl8MDtpYT1DO1BjPSgoa3wwKTwwKTw8MzE+PjMxO1A9T2Qoa3wwLFBjfDAsbHwwLG98MCl8MDtPPUM7bz1PZCh0fDAsKCh0fDApPDApPDwzMT4+MzF8MCxsfDAsb3wwKXwwO2w9Qzt0PSgoc3wwKTwwKTw8MzE+PjMxO2RjPU9kKEh8MCxJfDAsc3wwLHR8MCl8MDtlYz1DO249KChwfDApPDApPDwzMT4+MzE7eWI9T2QoSnwwLEt8MCxwfDAsbnwwKXwwO3hiPUM7TWE9T2QoRnwwLEd8MCxzfDAsdHwwKXwwO0xhPUM7b2M9T2QoRHwwLEV8MCxwfDAsbnwwKXwwO25jPUM7SWI9T2QoQXwwLEJ8MCxzfDAsdHwwKXwwO0hiPUM7WWE9T2QoeXwwLHp8MCxwfDAsbnwwKXwwO1hhPUM7bGE9T2Qod3wwLHh8MCxzfDAsdHwwKXwwO2thPUM7Uj1PZCh1fDAsdnwwLHB8MCxufDApfDA7UT1DO3Q9T2Qoa3wwLFBjfDAsc3wwLHR8MCl8MDtzPUM7UGM9KChRY3wwKTwwKTw8MzE+PjMxO249T2QoUWN8MCxQY3wwLHB8MCxufDApfDA7cD1DO2s9KChqfDApPDApPDwzMT4+MzE7d2I9T2QoSHwwLEl8MCxqfDAsa3wwKXwwO3ZiPUM7UWE9T2QoSnwwLEt8MCxqfDAsa3wwKXwwO1BhPUM7cWM9T2QoRnwwLEd8MCxqfDAsa3wwKXwwO3BjPUM7S2I9T2QoRHwwLEV8MCxqfDAsa3wwKXwwO0piPUM7X2E9T2QoQXwwLEJ8MCxqfDAsa3wwKXwwO1phPUM7bmE9T2QoeXwwLHp8MCxqfDAsa3wwKXwwO21hPUM7VD1PZCh3fDAseHwwLGp8MCxrfDApfDA7Uz1DO3Y9T2QodXwwLHZ8MCxqfDAsa3wwKXwwO3U9QztSYz0oKFNjfDApPDApPDwzMT4+MzE7eWM9T2QoU2N8MCxSY3wwLGp8MCxrfDApfDA7eGM9QztrPU9kKFFjfDAsUGN8MCxqfDAsa3wwKXwwO2o9QztTYj0oKFJifDApPDApPDwzMT4+MzE7T2E9T2QoSHwwLEl8MCxSYnwwLFNifDApfDA7TmE9QztmYT0oKGZ8MCk8MCk8PDMxPj4zMTt1Yz1PZChKfDAsS3wwLGZ8MCxmYXwwKXwwO3RjPUM7TWI9T2QoRnwwLEd8MCxSYnwwLFNifDApfDA7TGI9QzthYj1PZChEfDAsRXwwLGZ8MCxmYXwwKXwwOyRhPUM7cGE9T2QoQXwwLEJ8MCxSYnwwLFNifDApfDA7b2E9QztWPU9kKHl8MCx6fDAsZnwwLGZhfDApfDA7VT1DO3g9T2Qod3wwLHh8MCxSYnwwLFNifDApfDA7dz1DO1VhPSgoVGF8MCk8MCk8PDMxPj4zMTtBYz1PZChUYXwwLFVhfDAsZnwwLGZhfDApfDA7emM9QztTYj1PZChTY3wwLFJjfDAsUmJ8MCxTYnwwKXwwO1JiPUM7ZmE9T2QoUWN8MCxQY3wwLGZ8MCxmYXwwKXwwO2Y9QztOPSgoZXwwKTwwKTw8MzE+PjMxO3NjPU9kKEh8MCxJfDAsZXwwLE58MCl8MDtyYz1DO1FiPU9kKEp8MCxLfDAsZXwwLE58MCl8MDtQYj1DO2NiPU9kKEZ8MCxHfDAsZXwwLE58MCl8MDtiYj1DO3JhPU9kKER8MCxFfDAsZXwwLE58MCl8MDtxYT1DO1g9T2QoQXwwLEJ8MCxlfDAsTnwwKXwwO1c9Qzt6PU9kKHl8MCx6fDAsZXwwLE58MCl8MDt5PUM7RWI9KChEYnwwKTwwKTw8MzE+PjMxO0NjPU9kKERifDAsRWJ8MCxlfDAsTnwwKXwwO0JjPUM7VWI9T2QoVGF8MCxVYXwwLGV8MCxOfDApfDA7VGI9QztpYj1PZChTY3wwLFJjfDAsZXwwLE58MCl8MDtoYj1DO049T2QoUWN8MCxQY3wwLGV8MCxOfDApfDA7ZT1DO0FhPSgoemF8MCk8MCk8PDMxPj4zMTtPYj1PZChIfDAsSXwwLHphfDAsQWF8MCl8MDtOYj1DO2I9KChNfDApPDApPDwzMT4+MzE7Z2I9T2QoSnwwLEt8MCxNfDAsYnwwKXwwO2ZiPUM7dGE9T2QoRnwwLEd8MCx6YXwwLEFhfDApfDA7c2E9QztaPU9kKER8MCxFfDAsTXwwLGJ8MCl8MDtZPUM7Qj1PZChBfDAsQnwwLHphfDAsQWF8MCl8MDtBPUM7a2M9KChqY3wwKTwwKTw8MzE+PjMxO0VjPU9kKGpjfDAsa2N8MCxNfDAsYnwwKXwwO0RjPUM7V2I9T2QoRGJ8MCxFYnwwLHphfDAsQWF8MCl8MDtWYj1DO2tiPU9kKFRhfDAsVWF8MCxNfDAsYnwwKXwwO2piPUM7QWE9T2QoU2N8MCxSY3wwLHphfDAsQWF8MCl8MDt6YT1DO2I9T2QoUWN8MCxQY3wwLE18MCxifDApfDA7TT1DO2c9KCh5YXwwKTwwKTw8MzE+PjMxO2ViPU9kKEh8MCxJfDAseWF8MCxnfDApfDA7ZGI9Qzt4YT1PZChKfDAsS3wwLHlhfDAsZ3wwKXwwO3dhPUM7JD1PZChGfDAsR3wwLHlhfDAsZ3wwKXwwO189QztFPU9kKER8MCxFfDAseWF8MCxnfDApfDA7RD1DO0lhPSgoSGF8MCk8MCk8PDMxPj4zMTtHYz1PZChIYXwwLElhfDAseWF8MCxnfDApfDA7RmM9QztZYj1PZChqY3wwLGtjfDAseWF8MCxnfDApfDA7WGI9QzttYj1PZChEYnwwLEVifDAseWF8MCxnfDApfDA7bGI9QztDYT1PZChUYXwwLFVhfDAseWF8MCxnfDApfDA7QmE9QzttPU9kKFNjfDAsUmN8MCx5YXwwLGd8MCl8MDtyPUM7Zz1PZChRY3wwLFBjfDAseWF8MCxnfDApfDA7eWE9QztBYj0oKHpifDApPDApPDwzMT4+MzE7dmE9T2QoSHwwLEl8MCx6YnwwLEFifDApfDA7dWE9QztlYT0oKGl8MCk8MCk8PDMxPj4zMTtkYT1PZChKfDAsS3wwLGl8MCxlYXwwKXwwO2NhPUM7Rz1PZChGfDAsR3wwLHpifDAsQWJ8MCl8MDtGPUM7c2I9KChyYnwwKTwwKTw8MzE+PjMxO0ljPU9kKHJifDAsc2J8MCxpfDAsZWF8MCl8MDtIYz1DO19iPU9kKEhhfDAsSWF8MCx6YnwwLEFifDApfDA7WmI9QztvYj1PZChqY3wwLGtjfDAsaXwwLGVhfDApfDA7bmI9QztFYT1PZChEYnwwLEVifDAsemJ8MCxBYnwwKXwwO0RhPUM7Z2M9T2QoVGF8MCxVYXwwLGl8MCxlYXwwKXwwO2ZjPUM7QWI9T2QoU2N8MCxSY3wwLHpifDAsQWJ8MCl8MDt6Yj1DO2VhPU9kKFFjfDAsUGN8MCxpfDAsZWF8MCl8MDtpPUM7TD0oKGh8MCk8MCk8PDMxPj4zMTtiYT1PZChIfDAsSXwwLGh8MCxMfDApfDA7YWE9QztLPU9kKEp8MCxLfDAsaHwwLEx8MCl8MDtKPUM7Y2M9KChiY3wwKTwwKTw8MzE+PjMxO0tjPU9kKGJjfDAsY2N8MCxofDAsTHwwKXwwO0pjPUM7YWM9T2QocmJ8MCxzYnwwLGh8MCxMfDApfDA7JGI9QztxYj1PZChIYXwwLElhfDAsaHwwLEx8MCl8MDtwYj1DO0dhPU9kKGpjfDAsa2N8MCxofDAsTHwwKXwwO0ZhPUM7aWM9T2QoRGJ8MCxFYnwwLGh8MCxMfDApfDA7aGM9QztDYj1PZChUYXwwLFVhfDAsaHwwLEx8MCl8MDtCYj1DO1NhPU9kKFNjfDAsUmN8MCxofDAsTHwwKXwwO1JhPUM7TD1PZChRY3wwLFBjfDAsaHwwLEx8MCl8MDtoPUM7aGE9KChnYXwwKTwwKTw8MzE+PjMxO0k9T2QoSHwwLEl8MCxnYXwwLGhhfDApfDA7SD1DO3E9KChkfDApPDApPDwzMT4+MzE7T2M9T2QoT2N8MCwoKE9jfDApPDApPDwzMT4+MzF8MCxkfDAscXwwKXwwO05jPUM7Y2M9T2QoYmN8MCxjY3wwLGdhfDAsaGF8MCl8MDtiYz1DO3NiPU9kKHJifDAsc2J8MCxkfDAscXwwKXwwO3JiPUM7SWE9T2QoSGF8MCxJYXwwLGdhfDAsaGF8MCl8MDtIYT1DO2tjPU9kKGpjfDAsa2N8MCxkfDAscXwwKXwwO2pjPUM7RWI9T2QoRGJ8MCxFYnwwLGdhfDAsaGF8MCl8MDtEYj1DO1VhPU9kKFRhfDAsVWF8MCxkfDAscXwwKXwwO1RhPUM7aGE9T2QoU2N8MCxSY3wwLGdhfDAsaGF8MCl8MDtnYT1DO3E9T2QoUWN8MCxQY3wwLGR8MCxxfDApfDA7ZD1DO0xjPURkKE9jfDAsTmN8MCxNY3wwLExjfDApfDA7SmM9RGQoTGN8MCxDfDAsS2N8MCxKY3wwKXwwO0hjPURkKEpjfDAsQ3wwLEljfDAsSGN8MCl8MDtGYz1EZChIY3wwLEN8MCxHY3wwLEZjfDApfDA7RGM9RGQoRmN8MCxDfDAsRWN8MCxEY3wwKXwwO0JjPURkKERjfDAsQ3wwLENjfDAsQmN8MCl8MDt6Yz1EZChCY3wwLEN8MCxBY3wwLHpjfDApfDA7eGM9RGQoemN8MCxDfDAseWN8MCx4Y3wwKXwwO3A9RGQoeGN8MCxDfDAsbnwwLHB8MCl8MDtuPUM7ZWM9RGQod2N8MCx2Y3wwLGRjfDAsZWN8MCl8MDtkYz1DO3JjPURkKHVjfDAsdGN8MCxzY3wwLHJjfDApfDA7cGM9RGQocmN8MCxDfDAscWN8MCxwY3wwKXwwO25jPURkKHBjfDAsQ3wwLG9jfDAsbmN8MCl8MDtsYz1EZChuY3wwLEN8MCxtY3wwLGxjfDApfDA7amM9RGQobGN8MCxDfDAsa2N8MCxqY3wwKXwwO2hjPURkKGpjfDAsQ3wwLGljfDAsaGN8MCl8MDtmYz1EZChoY3wwLEN8MCxnY3wwLGZjfDApfDA7cj1EZChmY3wwLEN8MCxtfDAscnwwKXwwO009RGQocnwwLEN8MCxifDAsTXwwKXwwO2I9QztyPURkKHB8MCxufDAsMzM1NTQ0MzIsMCl8MDtyPUVkKHJ8MCxDfDAsMjYpfDA7bT1DO2JjPURkKGVjfDAsZGN8MCxjY3wwLGJjfDApfDA7JGI9RGQoYmN8MCxDfDAsYWN8MCwkYnwwKXwwO1piPURkKCRifDAsQ3wwLF9ifDAsWmJ8MCl8MDtYYj1EZChaYnwwLEN8MCxZYnwwLFhifDApfDA7VmI9RGQoWGJ8MCxDfDAsV2J8MCxWYnwwKXwwO1RiPURkKFZifDAsQ3wwLFVifDAsVGJ8MCl8MDtSYj1EZChUYnwwLEN8MCxTYnwwLFJifDApfDA7aj1EZChSYnwwLEN8MCxrfDAsanwwKXwwO2o9RGQoanwwLEN8MCxyfDAsbXwwKXwwO2s9QzttPUhkKHJ8MCxtfDAsMjYpfDA7bT1DZChwfDAsbnwwLG18MCxDfDApfDA7bj1DO3A9RGQoTXwwLGJ8MCwzMzU1NDQzMiwwKXwwO3A9RWQocHwwLEN8MCwyNil8MDtyPUM7TmI9RGQoUWJ8MCxQYnwwLE9ifDAsTmJ8MCl8MDtMYj1EZChOYnwwLEN8MCxNYnwwLExifDApfDA7SmI9RGQoTGJ8MCxDfDAsS2J8MCxKYnwwKXwwO0hiPURkKEpifDAsQ3wwLElifDAsSGJ8MCl8MDtGYj1EZChIYnwwLEN8MCxHYnwwLEZifDApfDA7RGI9RGQoRmJ8MCxDfDAsRWJ8MCxEYnwwKXwwO0JiPURkKERifDAsQ3wwLENifDAsQmJ8MCl8MDt6Yj1EZChCYnwwLEN8MCxBYnwwLHpifDApfDA7eWE9RGQoemJ8MCxDfDAsZ3wwLHlhfDApfDA7eWE9RGQoeWF8MCxDfDAscHwwLHJ8MCl8MDtnPUM7cj1IZChwfDAscnwwLDI2KXwwO3I9Q2QoTXwwLGJ8MCxyfDAsQ3wwKXwwO2I9QztNPURkKGp8MCxrfDAsMTY3NzcyMTYsMCl8MDtNPUVkKE18MCxDfDAsMjUpfDA7cD1DO3ZiPURkKHlifDAseGJ8MCx3YnwwLHZifDApfDA7dGI9RGQodmJ8MCxDfDAsdWJ8MCx0YnwwKXwwO3JiPURkKHRifDAsQ3wwLHNifDAscmJ8MCl8MDtwYj1EZChyYnwwLEN8MCxxYnwwLHBifDApfDA7bmI9RGQocGJ8MCxDfDAsb2J8MCxuYnwwKXwwO2xiPURkKG5ifDAsQ3wwLG1ifDAsbGJ8MCl8MDtqYj1EZChsYnwwLEN8MCxrYnwwLGpifDApfDA7aGI9RGQoamJ8MCxDfDAsaWJ8MCxoYnwwKXwwO2Y9RGQoaGJ8MCxDfDAsZmF8MCxmfDApfDA7Zj1EZChmfDAsQ3wwLE18MCxwfDApfDA7ZmE9QztwPUhkKE18MCxwfDAsMjUpfDA7cD1DZChqfDAsa3wwLHB8MCxDfDApfDA7az1DO2o9RGQoeWF8MCxnfDAsMTY3NzcyMTYsMCl8MDtqPUVkKGp8MCxDfDAsMjUpfDA7TT1DO2RiPURkKGdifDAsZmJ8MCxlYnwwLGRifDApfDA7YmI9RGQoZGJ8MCxDfDAsY2J8MCxiYnwwKXwwOyRhPURkKGJifDAsQ3wwLGFifDAsJGF8MCl8MDtaYT1EZCgkYXwwLEN8MCxfYXwwLFphfDApfDA7WGE9RGQoWmF8MCxDfDAsWWF8MCxYYXwwKXwwO1ZhPURkKFhhfDAsQ3wwLFdhfDAsVmF8MCl8MDtUYT1EZChWYXwwLEN8MCxVYXwwLFRhfDApfDA7UmE9RGQoVGF8MCxDfDAsU2F8MCxSYXwwKXwwO2k9RGQoUmF8MCxDfDAsZWF8MCxpfDApfDA7aT1EZChpfDAsQ3wwLGp8MCxNfDApfDA7ZWE9QztNPUhkKGp8MCxNfDAsMjUpfDA7TT1DZCh5YXwwLGd8MCxNfDAsQ3wwKXwwO2c9Qzt5YT1EZChmfDAsZmF8MCwzMzU1NDQzMiwwKXwwO3lhPUVkKHlhfDAsQ3wwLDI2KXwwO2o9QztOYT1EZChRYXwwLFBhfDAsT2F8MCxOYXwwKXwwO0xhPURkKE5hfDAsQ3wwLE1hfDAsTGF8MCl8MDtKYT1EZChMYXwwLEN8MCxLYXwwLEphfDApfDA7SGE9RGQoSmF8MCxDfDAsSWF8MCxIYXwwKXwwO0ZhPURkKEhhfDAsQ3wwLEdhfDAsRmF8MCl8MDtEYT1EZChGYXwwLEN8MCxFYXwwLERhfDApfDA7QmE9RGQoRGF8MCxDfDAsQ2F8MCxCYXwwKXwwO3phPURkKEJhfDAsQ3wwLEFhfDAsemF8MCl8MDtlPURkKHphfDAsQ3wwLE58MCxlfDApfDA7ZT1EZChlfDAsQ3wwLHlhfDAsanwwKXwwO049QztqPUhkKHlhfDAsanwwLDI2KXwwO2o9Q2QoZnwwLGZhfDAsanwwLEN8MCl8MDtmYT1EZChpfDAsZWF8MCwzMzU1NDQzMiwwKXwwO2ZhPUVkKGZhfDAsQ3wwLDI2KXwwO2Y9Qzt1YT1EZCh4YXwwLHdhfDAsdmF8MCx1YXwwKXwwO3NhPURkKHVhfDAsQ3wwLHRhfDAsc2F8MCl8MDtxYT1EZChzYXwwLEN8MCxyYXwwLHFhfDApfDA7b2E9RGQocWF8MCxDfDAscGF8MCxvYXwwKXwwO21hPURkKG9hfDAsQ3wwLG5hfDAsbWF8MCl8MDtrYT1EZChtYXwwLEN8MCxsYXwwLGthfDApfDA7aWE9RGQoa2F8MCxDfDAsamF8MCxpYXwwKXwwO2dhPURkKGlhfDAsQ3wwLGhhfDAsZ2F8MCl8MDtoPURkKGdhfDAsQ3wwLEx8MCxofDApfDA7aD1EZChofDAsQ3wwLGZhfDAsZnwwKXwwO0w9QztmPUhkKGZhfDAsZnwwLDI2KXwwO2Y9Q2QoaXwwLGVhfDAsZnwwLEN8MCl8MDtlYT1EZChlfDAsTnwwLDE2Nzc3MjE2LDApfDA7ZWE9RWQoZWF8MCxDfDAsMjUpfDA7aT1DO2I9RGQoZWF8MCxpfDAscnwwLGJ8MCl8MDtyPUM7aT1IZChlYXwwLGl8MCwyNSl8MDtpPUNkKGV8MCxOfDAsaXwwLEN8MCl8MDtOPURkKGh8MCxMfDAsMTY3NzcyMTYsMCl8MDtOPUVkKE58MCxDfDAsMjUpfDA7ZT1DO2FhPURkKGRhfDAsY2F8MCxiYXwwLGFhfDApfDA7Xz1EZChhYXwwLEN8MCwkfDAsX3wwKXwwO1k9RGQoX3wwLEN8MCxafDAsWXwwKXwwO1c9RGQoWXwwLEN8MCxYfDAsV3wwKXwwO1U9RGQoV3wwLEN8MCxWfDAsVXwwKXwwO1M9RGQoVXwwLEN8MCxUfDAsU3wwKXwwO1E9RGQoU3wwLEN8MCxSfDAsUXwwKXwwO089RGQoUXwwLEN8MCxQfDAsT3wwKXwwO2Q9RGQoT3wwLEN8MCxxfDAsZHwwKXwwO2Q9RGQoZHwwLEN8MCxOfDAsZXwwKXwwO3E9QztlPUhkKE58MCxlfDAsMjUpfDA7ZT1DZChofDAsTHwwLGV8MCxDfDApfDA7TD1EZChifDAscnwwLDMzNTU0NDMyLDApfDA7TD1FZChMfDAsQ3wwLDI2KXwwO2g9QztnPURkKE18MCxnfDAsTHwwLGh8MCl8MDtoPUhkKEx8MCxofDAsMjYpfDA7aD1DZChifDAscnwwLGh8MCxDfDApfDA7cj1EZChkfDAscXwwLDMzNTU0NDMyLDApfDA7cj1FZChyfDAsQ3wwLDI2KXwwO2I9QztIPURkKEt8MCxKfDAsSXwwLEh8MCl8MDtGPURkKEh8MCxDfDAsR3wwLEZ8MCl8MDtEPURkKEZ8MCxDfDAsRXwwLER8MCl8MDtBPURkKER8MCxDfDAsQnwwLEF8MCl8MDt5PURkKEF8MCxDfDAsenwwLHl8MCl8MDt3PURkKHl8MCxDfDAseHwwLHd8MCl8MDt1PURkKHd8MCxDfDAsdnwwLHV8MCl8MDtzPURkKHV8MCxDfDAsdHwwLHN8MCl8MDtsPURkKHN8MCxDfDAsb3wwLGx8MCl8MDtsPURkKGx8MCxDfDAscnwwLGJ8MCl8MDtvPUM7Yj1IZChyfDAsYnwwLDI2KXwwO2I9Q2QoZHwwLHF8MCxifDAsQ3wwKXwwO3E9RGQobHwwLG98MCwxNjc3NzIxNiwwKXwwO3E9RWQocXwwLEN8MCwyNSl8MDtkPUM7cj1PZChxfDAsZHwwLDE5LDApfDA7bj1EZChyfDAsQ3wwLG18MCxufDApfDA7bT1DO2Q9SGQocXwwLGR8MCwyNSl8MDtkPUNkKGx8MCxvfDAsZHwwLEN8MCl8MDtvPURkKG58MCxtfDAsMzM1NTQ0MzIsMCl8MDtvPUVkKG98MCxDfDAsMjYpfDA7bD1DO2s9RGQocHwwLGt8MCxvfDAsbHwwKXwwO2w9SGQob3wwLGx8MCwyNil8MDtsPUNkKG58MCxtfDAsbHwwLEN8MCl8MDtjW2E+PjJdPWw7Y1thKzQ+PjJdPWs7Y1thKzg+PjJdPWo7Y1thKzEyPj4yXT1pO2NbYSsxNj4+Ml09aDtjW2ErMjA+PjJdPWc7Y1thKzI0Pj4yXT1mO2NbYSsyOD4+Ml09ZTtjW2ErMzI+PjJdPWI7Y1thKzM2Pj4yXT1kO3JldHVybn1mdW5jdGlvbiBsZChhLGIpe2E9YXwwO2I9YnwwO3ZhciBkPTAsZT0wLGY9MCxnPTAsaD0wLGk9MCxqPTAsaz0wLGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MCx2PTAsdz0wLHg9MCx5PTAsej0wLEE9MCxCPTAsRD0wLEU9MCxGPTAsRz0wLEg9MCxJPTAsSj0wLEs9MCxMPTAsTT0wLE49MCxPPTAsUD0wLFE9MCxSPTAsUz0wLFQ9MCxVPTAsVj0wLFc9MCxYPTAsWT0wLFo9MCxfPTAsJD0wLGFhPTAsYmE9MCxjYT0wLGRhPTAsZWE9MCxmYT0wLGdhPTAsaGE9MCxpYT0wLGphPTAsa2E9MCxsYT0wLG1hPTAsbmE9MCxvYT0wLHBhPTAscWE9MCxyYT0wLHNhPTAsdGE9MCx1YT0wLHZhPTAsd2E9MCx4YT0wLHlhPTAsemE9MCxBYT0wLEJhPTAsQ2E9MCxEYT0wLEVhPTAsRmE9MCxHYT0wLEhhPTAsSWE9MCxKYT0wLEthPTAsTGE9MCxNYT0wLE5hPTAsT2E9MCxQYT0wLFFhPTAsUmE9MCxTYT0wLFRhPTAsVWE9MCxWYT0wLFdhPTAsWGE9MCxZYT0wLFphPTAsX2E9MCwkYT0wLGFiPTAsYmI9MCxjYj0wLGRiPTAsZWI9MCxmYj0wLGdiPTA7YmI9Y1tiPj4yXXwwO3VhPWNbYis0Pj4yXXwwO2o9Y1tiKzg+PjJdfDA7bGE9Y1tiKzEyPj4yXXwwO2U9Y1tiKzE2Pj4yXXwwO2RiPWNbYisyMD4+Ml18MDtZPWNbYisyND4+Ml18MDtMYT1jW2IrMjg+PjJdfDA7aD1jW2IrMzI+PjJdfDA7Yj1jW2IrMzY+PjJdfDA7bD1iYjw8MTtwPXVhPDwxO1hhPWo8PDE7Zj1sYTw8MTtuYT1lPDwxO0I9ZGI8PDE7bT1ZPDwxO2k9TGE8PDE7S2E9ZGIqMzh8MDtyYT1ZKjE5fDA7dmE9TGEqMzh8MDtkYT1oKjE5fDA7Z2I9YiozOHwwO2NiPSgoYmJ8MCk8MCk8PDMxPj4zMTtjYj1PZChiYnwwLGNifDAsYmJ8MCxjYnwwKXwwO2JiPUM7bz0oKGx8MCk8MCk8PDMxPj4zMTt0YT0oKHVhfDApPDApPDwzMT4+MzE7SWE9T2QobHwwLG98MCx1YXwwLHRhfDApfDA7SGE9QztrPSgoanwwKTwwKTw8MzE+PjMxO1dhPU9kKGp8MCxrfDAsbHwwLG98MCl8MDtWYT1DO21hPSgobGF8MCk8MCk8PDMxPj4zMTtVYT1PZChsYXwwLG1hfDAsbHwwLG98MCl8MDtUYT1DO0Q9KChlfDApPDApPDwzMT4+MzE7T2E9T2QoZXwwLER8MCxsfDAsb3wwKXwwO05hPUM7ZWI9KChkYnwwKTwwKTw8MzE+PjMxO3lhPU9kKGRifDAsZWJ8MCxsfDAsb3wwKXwwO3hhPUM7Zz0oKFl8MCk8MCk8PDMxPj4zMTtnYT1PZChZfDAsZ3wwLGx8MCxvfDApfDA7ZmE9QztNYT0oKExhfDApPDApPDwzMT4+MzE7Uj1PZChMYXwwLE1hfDAsbHwwLG98MCl8MDtRPUM7QT0oKGh8MCk8MCk8PDMxPj4zMTtGPU9kKGh8MCxBfDAsbHwwLG98MCl8MDtFPUM7cT0oKGJ8MCk8MCk8PDMxPj4zMTtvPU9kKGJ8MCxxfDAsbHwwLG98MCl8MDtsPUM7bj0oKHB8MCk8MCk8PDMxPj4zMTt0YT1PZChwfDAsbnwwLHVhfDAsdGF8MCl8MDt1YT1DO2JhPU9kKHB8MCxufDAsanwwLGt8MCl8MDtjYT1DO1A9KChmfDApPDApPDwzMT4+MzE7U2E9T2QoZnwwLFB8MCxwfDAsbnwwKXwwO1JhPUM7Q2E9T2QoZXwwLER8MCxwfDAsbnwwKXwwO0JhPUM7ZD0oKEJ8MCk8MCk8PDMxPj4zMTtpYT1PZChCfDAsZHwwLHB8MCxufDApfDA7aGE9QztUPU9kKFl8MCxnfDAscHwwLG58MCl8MDtTPUM7Tz0oKGl8MCk8MCk8PDMxPj4zMTtIPU9kKGl8MCxPfDAscHwwLG58MCl8MDtHPUM7dD1PZChofDAsQXwwLHB8MCxufDApfDA7cz1DO2ZiPSgoZ2J8MCk8MCk8PDMxPj4zMTtuPU9kKGdifDAsZmJ8MCxwfDAsbnwwKXwwO3A9QztRYT1PZChqfDAsa3wwLGp8MCxrfDApfDA7UGE9QztZYT0oKFhhfDApPDApPDwzMT4+MzE7QWE9T2QoWGF8MCxZYXwwLGxhfDAsbWF8MCl8MDt6YT1DO2thPU9kKGV8MCxEfDAsWGF8MCxZYXwwKXwwO2phPUM7WD1PZChkYnwwLGVifDAsWGF8MCxZYXwwKXwwO1c9QztOPU9kKFl8MCxnfDAsWGF8MCxZYXwwKXwwO009Qzt2PU9kKExhfDAsTWF8MCxYYXwwLFlhfDApfDA7dT1DO2VhPSgoZGF8MCk8MCk8PDMxPj4zMTtZYT1PZChkYXwwLGVhfDAsWGF8MCxZYXwwKXwwO1hhPUM7az1PZChnYnwwLGZifDAsanwwLGt8MCl8MDtqPUM7bWE9T2QoZnwwLFB8MCxsYXwwLG1hfDApfDA7bGE9QztWPU9kKGZ8MCxQfDAsZXwwLER8MCl8MDtVPUM7Sj1PZChCfDAsZHwwLGZ8MCxQfDApfDA7ST1DO3o9T2QoWXwwLGd8MCxmfDAsUHwwKXwwO3k9Qzt3YT0oKHZhfDApPDApPDwzMT4+MzE7X2E9T2QodmF8MCx3YXwwLGZ8MCxQfDApfDA7WmE9QztFYT1PZChkYXwwLGVhfDAsZnwwLFB8MCl8MDtEYT1DO1A9T2QoZ2J8MCxmYnwwLGZ8MCxQfDApfDA7Zj1DO0w9T2QoZXwwLER8MCxlfDAsRHwwKXwwO0s9QztvYT0oKG5hfDApPDApPDwzMT4+MzE7eD1PZChuYXwwLG9hfDAsZGJ8MCxlYnwwKXwwO3c9QztzYT0oKHJhfDApPDApPDwzMT4+MzE7YWI9T2QocmF8MCxzYXwwLG5hfDAsb2F8MCl8MDskYT1DO0dhPU9kKHZhfDAsd2F8MCxlfDAsRHwwKXwwO0ZhPUM7b2E9T2QoZGF8MCxlYXwwLG5hfDAsb2F8MCl8MDtuYT1DO0Q9T2QoZ2J8MCxmYnwwLGV8MCxEfDApfDA7ZT1DO2ViPU9kKEthfDAsKChLYXwwKTwwKTw8MzE+PjMxfDAsZGJ8MCxlYnwwKXwwO2RiPUM7S2E9T2QocmF8MCxzYXwwLEJ8MCxkfDApfDA7SmE9QztxYT1PZCh2YXwwLHdhfDAsQnwwLGR8MCl8MDtwYT1DO189T2QoZGF8MCxlYXwwLEJ8MCxkfDApfDA7Wj1DO2Q9T2QoZ2J8MCxmYnwwLEJ8MCxkfDApfDA7Qj1DO3NhPU9kKHJhfDAsc2F8MCxZfDAsZ3wwKXwwO3JhPUM7YWE9T2QodmF8MCx3YXwwLFl8MCxnfDApfDA7JD1DO209T2QoZGF8MCxlYXwwLG18MCwoKG18MCk8MCk8PDMxPj4zMXwwKXwwO3I9QztnPU9kKGdifDAsZmJ8MCxZfDAsZ3wwKXwwO1k9QztNYT1PZCh2YXwwLHdhfDAsTGF8MCxNYXwwKXwwO0xhPUM7d2E9T2QoZGF8MCxlYXwwLGl8MCxPfDApfDA7dmE9QztPPU9kKGdifDAsZmJ8MCxpfDAsT3wwKXwwO2k9QztlYT1PZChkYXwwLGVhfDAsaHwwLEF8MCl8MDtkYT1DO0E9T2QoZ2J8MCxmYnwwLGh8MCxBfDApfDA7aD1DO3E9T2QoZ2J8MCxmYnwwLGJ8MCxxfDApfDA7Yj1DO2JiPURkKGVifDAsZGJ8MCxjYnwwLGJifDApfDA7JGE9RGQoYmJ8MCxDfDAsYWJ8MCwkYXwwKXwwO1phPURkKCRhfDAsQ3wwLF9hfDAsWmF8MCl8MDtYYT1EZChaYXwwLEN8MCxZYXwwLFhhfDApfDA7cD1EZChYYXwwLEN8MCxufDAscHwwKXwwO249Qzt1YT1EZChXYXwwLFZhfDAsdGF8MCx1YXwwKXwwO3RhPUM7Y2E9RGQoVWF8MCxUYXwwLGJhfDAsY2F8MCl8MDtiYT1DO1BhPURkKFNhfDAsUmF8MCxRYXwwLFBhfDApfDA7TmE9RGQoUGF8MCxDfDAsT2F8MCxOYXwwKXwwO0xhPURkKE5hfDAsQ3wwLE1hfDAsTGF8MCl8MDtyPURkKExhfDAsQ3wwLG18MCxyfDApfDA7Qj1EZChyfDAsQ3wwLGR8MCxCfDApfDA7ZD1DO3I9RGQocHwwLG58MCwzMzU1NDQzMiwwKXwwO3I9RWQocnwwLEN8MCwyNil8MDttPUM7SGE9RGQoS2F8MCxKYXwwLElhfDAsSGF8MCl8MDtGYT1EZChIYXwwLEN8MCxHYXwwLEZhfDApfDA7RGE9RGQoRmF8MCxDfDAsRWF8MCxEYXwwKXwwO2o9RGQoRGF8MCxDfDAsa3wwLGp8MCl8MDtqPURkKGp8MCxDfDAscnwwLG18MCl8MDtrPUM7bT1IZChyfDAsbXwwLDI2KXwwO209Q2QocHwwLG58MCxtfDAsQ3wwKXwwO249QztwPURkKEJ8MCxkfDAsMzM1NTQ0MzIsMCl8MDtwPUVkKHB8MCxDfDAsMjYpfDA7cj1DO3phPURkKENhfDAsQmF8MCxBYXwwLHphfDApfDA7eGE9RGQoemF8MCxDfDAseWF8MCx4YXwwKXwwO3ZhPURkKHhhfDAsQ3wwLHdhfDAsdmF8MCl8MDtZPURkKHZhfDAsQ3wwLGd8MCxZfDApfDA7WT1EZChZfDAsQ3wwLHB8MCxyfDApfDA7Zz1DO3I9SGQocHwwLHJ8MCwyNil8MDtyPUNkKEJ8MCxkfDAscnwwLEN8MCl8MDtkPUM7Qj1EZChqfDAsa3wwLDE2Nzc3MjE2LDApfDA7Qj1FZChCfDAsQ3wwLDI1KXwwO3A9QztyYT1EZCh1YXwwLHRhfDAsc2F8MCxyYXwwKXwwO3BhPURkKHJhfDAsQ3wwLHFhfDAscGF8MCl8MDtuYT1EZChwYXwwLEN8MCxvYXwwLG5hfDApfDA7Zj1EZChuYXwwLEN8MCxQfDAsZnwwKXwwO2Y9RGQoZnwwLEN8MCxCfDAscHwwKXwwO1A9QztwPUhkKEJ8MCxwfDAsMjUpfDA7cD1DZChqfDAsa3wwLHB8MCxDfDApfDA7az1DO2o9RGQoWXwwLGd8MCwxNjc3NzIxNiwwKXwwO2o9RWQoanwwLEN8MCwyNSl8MDtCPUM7amE9RGQobWF8MCxsYXwwLGthfDAsamF8MCl8MDtoYT1EZChqYXwwLEN8MCxpYXwwLGhhfDApfDA7ZmE9RGQoaGF8MCxDfDAsZ2F8MCxmYXwwKXwwO2RhPURkKGZhfDAsQ3wwLGVhfDAsZGF8MCl8MDtpPURkKGRhfDAsQ3wwLE98MCxpfDApfDA7aT1EZChpfDAsQ3wwLGp8MCxCfDApfDA7Tz1DO0I9SGQoanwwLEJ8MCwyNSl8MDtCPUNkKFl8MCxnfDAsQnwwLEN8MCl8MDtnPUM7WT1EZChmfDAsUHwwLDMzNTU0NDMyLDApfDA7WT1FZChZfDAsQ3wwLDI2KXwwO2o9QzskPURkKGNhfDAsYmF8MCxhYXwwLCR8MCl8MDtaPURkKCR8MCxDfDAsX3wwLFp8MCl8MDtlPURkKFp8MCxDfDAsRHwwLGV8MCl8MDtlPURkKGV8MCxDfDAsWXwwLGp8MCl8MDtEPUM7aj1IZChZfDAsanwwLDI2KXwwO2o9Q2QoZnwwLFB8MCxqfDAsQ3wwKXwwO1A9RGQoaXwwLE98MCwzMzU1NDQzMiwwKXwwO1A9RWQoUHwwLEN8MCwyNil8MDtmPUM7VT1EZChYfDAsV3wwLFZ8MCxVfDApfDA7Uz1EZChVfDAsQ3wwLFR8MCxTfDApfDA7UT1EZChTfDAsQ3wwLFJ8MCxRfDApfDA7aD1EZChRfDAsQ3wwLEF8MCxofDApfDA7aD1EZChofDAsQ3wwLFB8MCxmfDApfDA7QT1DO2Y9SGQoUHwwLGZ8MCwyNil8MDtmPUNkKGl8MCxPfDAsZnwwLEN8MCl8MDtPPURkKGV8MCxEfDAsMTY3NzcyMTYsMCl8MDtPPUVkKE98MCxDfDAsMjUpfDA7aT1DO2Q9RGQoT3wwLGl8MCxyfDAsZHwwKXwwO3I9QztpPUhkKE98MCxpfDAsMjUpfDA7aT1DZChlfDAsRHwwLGl8MCxDfDApfDA7RD1EZChofDAsQXwwLDE2Nzc3MjE2LDApfDA7RD1FZChEfDAsQ3wwLDI1KXwwO2U9QztLPURkKE58MCxNfDAsTHwwLEt8MCl8MDtJPURkKEt8MCxDfDAsSnwwLEl8MCl8MDtHPURkKEl8MCxDfDAsSHwwLEd8MCl8MDtFPURkKEd8MCxDfDAsRnwwLEV8MCl8MDtiPURkKEV8MCxDfDAscXwwLGJ8MCl8MDtiPURkKGJ8MCxDfDAsRHwwLGV8MCl8MDtxPUM7ZT1IZChEfDAsZXwwLDI1KXwwO2U9Q2QoaHwwLEF8MCxlfDAsQ3wwKXwwO0E9RGQoZHwwLHJ8MCwzMzU1NDQzMiwwKXwwO0E9RWQoQXwwLEN8MCwyNil8MDtoPUM7Zz1EZChCfDAsZ3wwLEF8MCxofDApfDA7aD1IZChBfDAsaHwwLDI2KXwwO2g9Q2QoZHwwLHJ8MCxofDAsQ3wwKXwwO3I9RGQoYnwwLHF8MCwzMzU1NDQzMiwwKXwwO3I9RWQocnwwLEN8MCwyNil8MDtkPUM7dz1EZCh6fDAseXwwLHh8MCx3fDApfDA7dT1EZCh3fDAsQ3wwLHZ8MCx1fDApfDA7cz1EZCh1fDAsQ3wwLHR8MCxzfDApfDA7bD1EZChzfDAsQ3wwLG98MCxsfDApfDA7bD1EZChsfDAsQ3wwLHJ8MCxkfDApfDA7bz1DO2Q9SGQocnwwLGR8MCwyNil8MDtkPUNkKGJ8MCxxfDAsZHwwLEN8MCl8MDtxPURkKGx8MCxvfDAsMTY3NzcyMTYsMCl8MDtxPUVkKHF8MCxDfDAsMjUpfDA7Yj1DO3I9T2QocXwwLGJ8MCwxOSwwKXwwO249RGQocnwwLEN8MCxtfDAsbnwwKXwwO209QztiPUhkKHF8MCxifDAsMjUpfDA7Yj1DZChsfDAsb3wwLGJ8MCxDfDApfDA7bz1EZChufDAsbXwwLDMzNTU0NDMyLDApfDA7bz1FZChvfDAsQ3wwLDI2KXwwO2w9QztrPURkKHB8MCxrfDAsb3wwLGx8MCl8MDtsPUhkKG98MCxsfDAsMjYpfDA7bD1DZChufDAsbXwwLGx8MCxDfDApfDA7Y1thPj4yXT1sO2NbYSs0Pj4yXT1rO2NbYSs4Pj4yXT1qO2NbYSsxMj4+Ml09aTtjW2ErMTY+PjJdPWg7Y1thKzIwPj4yXT1nO2NbYSsyND4+Ml09ZjtjW2ErMjg+PjJdPWU7Y1thKzMyPj4yXT1kO2NbYSszNj4+Ml09YjtyZXR1cm59ZnVuY3Rpb24gbWQoYixlLGYpe2I9YnwwO2U9ZXwwO2Y9ZnwwO3ZhciBnPTAsaD0wLGo9MCxrPTAsbD0wLG09MCxuPTAsbz0wLHA9MCxxPTAscj0wLHM9MCx0PTAsdT0wLHY9MCx3PTAseD0wLHk9MCx6PTAsQT0wLEI9MCxEPTAsRT0wLEY9MCxHPTAsSD0wLEk9MCxKPTAsSz0wLEw9MCxNPTAsTj0wLE89MCxQPTAsUT0wLFI9MCxTPTAsVD0wLFU9MCxWPTAsVz0wLFg9MCxZPTAsWj0wLF89MCwkPTAsYWE9MCxiYT0wLGNhPTAsZGE9MCxlYT0wLGZhPTAsZ2E9MCxoYT0wLGlhPTAsamE9MCxrYT0wLGxhPTAsbWE9MCxuYT0wLG9hPTAscGE9MCxxYT0wLHJhPTAsc2E9MCx0YT0wLHVhPTAsdmE9MCx3YT0wLHhhPTAseWE9MCx6YT0wLEFhPTAsQmE9MCxDYT0wLERhPTAsRWE9MCxGYT0wLEdhPTAsSGE9MCxJYT0wLEphPTAsS2E9MCxMYT0wLE1hPTAsTmE9MCxPYT0wLFBhPTAsUWE9MCxSYT0wLFNhPTAsVGE9MCxVYT0wLFZhPTAsV2E9MCxYYT0wLFlhPTAsWmE9MCxfYT0wLCRhPTAsYWI9MCxiYj0wLGNiPTAsZGI9MCxlYj0wLGZiPTAsZ2I9MCxoYj0wLGliPTAsamI9MCxrYj0wLGxiPTAsbWI9MCxuYj0wO1lhPWk7T2E9aT1pKzYzJi02NDtpPWkrNDgwfDA7VGE9T2ErNDAwfDA7VWE9T2ErMzYwfDA7VmE9T2ErMzIwfDA7U2E9T2ErMjgwfDA7TWE9T2ErNDQwfDA7UGE9T2ErMjQwfDA7V2E9T2ErMjAwfDA7WGE9T2ErMTYwfDA7UWE9T2ErMTIwfDA7UmE9T2ErODB8MDtOYT1PYSs0MHwwO2g9TWE7Zz1oKzMyfDA7ZG97YVtoPj4wXT1hW2U+PjBdfDA7aD1oKzF8MDtlPWUrMXwwfXdoaWxlKChofDApPChnfDApKTthW01hPj4wXT0oZFtNYT4+MF18MCkmMjQ4O209TWErMzF8MDthW20+PjBdPShkW20+PjBdfDApJjYzfDY0O209ZFtmPj4wXXwwO0RhPUhkKGRbZisxPj4wXXwwfDAsMCw4KXwwO2o9Qzt2YT1IZChkW2YrMj4+MF18MHwwLDAsMTYpfDA7aj1qfEM7QWE9SGQoZFtmKzM+PjBdfDB8MCwwLDI0KXwwO2o9anxDO2s9YVtmKzY+PjBdfDA7bD1kW2YrND4+MF18MDt5YT1IZChkW2YrNT4+MF18MHwwLDAsOCl8MDt6YT1DO2s9SGQoayYyNTV8MCwwLDE2KXwwO3phPUhkKHlhfGx8a3wwLHphfEN8MCw2KXwwO2s9QztsPWFbZis5Pj4wXXwwO3lhPWRbZis3Pj4wXXwwO249SGQoZFtmKzg+PjBdfDB8MCwwLDgpfDA7RWE9QztsPUhkKGwmMjU1fDAsMCwxNil8MDtFYT1IZChufHlhfGx8MCxFYXxDfDAsNSl8MDtsPUM7eWE9YVtmKzEyPj4wXXwwO249ZFtmKzEwPj4wXXwwO0dhPUhkKGRbZisxMT4+MF18MHwwLDAsOCl8MDt4YT1DO3lhPUhkKHlhJjI1NXwwLDAsMTYpfDA7eGE9SGQoR2F8bnx5YXwwLHhhfEN8MCwzKXwwO3lhPUM7bj1hW2YrMTU+PjBdfDA7R2E9ZFtmKzEzPj4wXXwwO2g9SGQoZFtmKzE0Pj4wXXwwfDAsMCw4KXwwO0lhPUM7bj1IZChuJjI1NXwwLDAsMTYpfDA7SWE9SGQoaHxHYXxufDAsSWF8Q3wwLDIpfDA7bj1DO0dhPWRbZisxNj4+MF18MDtoPUhkKGRbZisxNz4+MF18MHwwLDAsOCl8MDtDYT1DO3A9SGQoZFtmKzE4Pj4wXXwwfDAsMCwxNil8MDtDYT1DYXxDO0JhPUhkKGRbZisxOT4+MF18MHwwLDAsMjQpfDA7QmE9aHxHYXxwfEJhO0NhPUNhfEM7cD1hW2YrMjI+PjBdfDA7R2E9ZFtmKzIwPj4wXXwwO2g9SGQoZFtmKzIxPj4wXXwwfDAsMCw4KXwwO2c9QztwPUhkKHAmMjU1fDAsMCwxNil8MDtnPUhkKGh8R2F8cHwwLGd8Q3wwLDcpfDA7cD1DO0dhPWFbZisyNT4+MF18MDtoPWRbZisyMz4+MF18MDtxPUhkKGRbZisyND4+MF18MHwwLDAsOCl8MDtGYT1DO0dhPUhkKEdhJjI1NXwwLDAsMTYpfDA7RmE9SGQocXxofEdhfDAsRmF8Q3wwLDUpfDA7R2E9QztoPWFbZisyOD4+MF18MDtxPWRbZisyNj4+MF18MDtLYT1IZChkW2YrMjc+PjBdfDB8MCwwLDgpfDA7TGE9QztoPUhkKGgmMjU1fDAsMCwxNil8MDtMYT1IZChLYXxxfGh8MCxMYXxDfDAsNCl8MDtoPUM7cT1hW2YrMzE+PjBdfDA7S2E9ZFtmKzI5Pj4wXXwwO2Y9SGQoZFtmKzMwPj4wXXwwfDAsMCw4KXwwO0phPUM7cT1IZChxJjI1NXwwLDAsMTYpfDA7SmE9SGQoZnxLYXxxfDAsSmF8Q3wwLDIpfDA7SmE9SmEmMzM1NTQ0Mjg7cT1EZChKYXwwLDAsMTY3NzcyMTYsMCl8MDtxPUdkKHF8MCxDfDAsMjUpfDA7S2E9QztmPUNkKDAsMCxxfDAsS2F8MCl8MDtqPURkKGYmMTl8MCwwLERhfG18dmF8QWF8MCxqfDApfDA7QWE9QztLYT1IZChxfDAsS2F8MCwyNSl8MDtxPUM7Zj1EZCh6YXwwLGt8MCwxNjc3NzIxNiwwKXwwO2Y9R2QoZnwwLEN8MCwyNSl8MDt2YT1DO2w9RGQoRWF8MCxsfDAsZnwwLHZhfDApfDA7RWE9Qzt2YT1IZChmfDAsdmF8MCwyNSl8MDt2YT1DZCh6YXwwLGt8MCx2YXwwLEN8MCl8MDtmPUM7az1EZCh4YXwwLHlhfDAsMTY3NzcyMTYsMCl8MDtrPUdkKGt8MCxDfDAsMjUpfDA7emE9QztuPURkKElhfDAsbnwwLGt8MCx6YXwwKXwwO0lhPUM7emE9SGQoa3wwLHphfDAsMjUpfDA7az1DO209RGQoQmF8MCxDYXwwLDE2Nzc3MjE2LDApfDA7bT1HZChtfDAsQ3wwLDI1KXwwO0RhPUM7cD1EZChnfDAscHwwLG18MCxEYXwwKXwwO2c9QztEYT1IZChtfDAsRGF8MCwyNSl8MDttPUM7bz1EZChGYXwwLEdhfDAsMTY3NzcyMTYsMCl8MDtvPUdkKG98MCxDfDAsMjUpfDA7SGE9QztoPURkKExhfDAsaHwwLG98MCxIYXwwKXwwO0xhPUM7SGE9SGQob3wwLEhhfDAsMjUpfDA7bz1DO3dhPURkKGp8MCxBYXwwLDMzNTU0NDMyLDApfDA7d2E9RWQod2F8MCxDfDAsMjYpfDA7ZT1DO2Y9RGQodmF8MCxmfDAsd2F8MCxlfDApfDA7ZT1IZCh3YXwwLGV8MCwyNil8MDtlPUNkKGp8MCxBYXwwLGV8MCxDfDApfDA7QWE9RGQobHwwLEVhfDAsMzM1NTQ0MzIsMCl8MDtBYT1FZChBYXwwLEN8MCwyNil8MDtqPUM7eWE9RGQoQWF8MCxqfDAseGF8MCx5YXwwKXwwO2s9Q2QoeWF8MCxDfDAsemF8MCxrfDApfDA7aj1IZChBYXwwLGp8MCwyNil8MDtqPUNkKGx8MCxFYXwwLGp8MCxDfDApfDA7RWE9RGQobnwwLElhfDAsMzM1NTQ0MzIsMCl8MDtFYT1FZChFYXwwLEN8MCwyNil8MDtsPUM7Q2E9RGQoRWF8MCxsfDAsQmF8MCxDYXwwKXwwO209Q2QoQ2F8MCxDfDAsRGF8MCxtfDApfDA7bD1IZChFYXwwLGx8MCwyNil8MDtsPUNkKG58MCxJYXwwLGx8MCxDfDApfDA7SWE9RGQocHwwLGd8MCwzMzU1NDQzMiwwKXwwO0lhPUVkKElhfDAsQ3wwLDI2KXwwO249QztHYT1EZChJYXwwLG58MCxGYXwwLEdhfDApfDA7bz1DZChHYXwwLEN8MCxIYXwwLG98MCl8MDtuPUhkKElhfDAsbnwwLDI2KXwwO249Q2QocHwwLGd8MCxufDAsQ3wwKXwwO2c9RGQoaHwwLExhfDAsMzM1NTQ0MzIsMCl8MDtnPUVkKGd8MCxDfDAsMjYpfDA7cD1DO0phPURkKEphfDAsMCxnfDAscHwwKXwwO3E9Q2QoSmF8MCxDfDAsS2F8MCxxfDApfDA7cD1IZChnfDAscHwwLDI2KXwwO3A9Q2QoaHwwLExhfDAscHwwLEN8MCl8MDtjW1BhPj4yXT1lO2NbUGErND4+Ml09ZjtjW1BhKzg+PjJdPWo7Y1tQYSsxMj4+Ml09aztjW1BhKzE2Pj4yXT1sO2NbUGErMjA+PjJdPW07Y1tQYSsyND4+Ml09bjtjW1BhKzI4Pj4yXT1vO2NbUGErMzI+PjJdPXA7Y1tQYSszNj4+Ml09cTtjW1dhPj4yXT0xO0xhPVdhKzR8MDtoPUxhO2c9aCszNnwwO2Rve2NbaD4+Ml09MDtoPWgrNHwwfXdoaWxlKChofDApPChnfDApKTtoPVhhO2c9aCs0MHwwO2Rve2NbaD4+Ml09MDtoPWgrNHwwfXdoaWxlKChofDApPChnfDApKTtjW1FhPj4yXT1lO3RhPVFhKzR8MDtjW3RhPj4yXT1mO3VhPVFhKzh8MDtjW3VhPj4yXT1qO3ZhPVFhKzEyfDA7Y1t2YT4+Ml09azt3YT1RYSsxNnwwO2Nbd2E+PjJdPWw7eGE9UWErMjB8MDtjW3hhPj4yXT1tO3lhPVFhKzI0fDA7Y1t5YT4+Ml09bjt6YT1RYSsyOHwwO2NbemE+PjJdPW87QWE9UWErMzJ8MDtjW0FhPj4yXT1wO0JhPVFhKzM2fDA7Y1tCYT4+Ml09cTtjW1JhPj4yXT0xO0NhPVJhKzR8MDtoPUNhO2c9aCszNnwwO2Rve2NbaD4+Ml09MDtoPWgrNHwwfXdoaWxlKChofDApPChnfDApKTtEYT1XYSs4fDA7RWE9V2ErMTJ8MDtGYT1XYSsxNnwwO0dhPVdhKzIwfDA7SGE9V2ErMjR8MDtJYT1XYSsyOHwwO0phPVdhKzMyfDA7S2E9V2ErMzZ8MDtNPVhhKzR8MDtOPVhhKzh8MDtPPVhhKzEyfDA7UD1YYSsxNnwwO1E9WGErMjB8MDtSPVhhKzI0fDA7Uz1YYSsyOHwwO1Q9WGErMzJ8MDtVPVhhKzM2fDA7Vj1SYSs4fDA7Vz1SYSsxMnwwO1g9UmErMTZ8MDtZPVJhKzIwfDA7Wj1SYSsyNHwwO189UmErMjh8MDskPVJhKzMyfDA7YWE9UmErMzZ8MDtiYT1OYSs0fDA7Y2E9TmErOHwwO2RhPU5hKzEyfDA7ZWE9TmErMTZ8MDtmYT1OYSsyMHwwO2dhPU5hKzI0fDA7aGE9TmErMjh8MDtpYT1OYSszMnwwO2phPU5hKzM2fDA7a2E9T2ErNHwwO2xhPU9hKzh8MDttYT1PYSsxMnwwO25hPU9hKzE2fDA7b2E9T2ErMjB8MDtwYT1PYSsyNHwwO3FhPU9hKzI4fDA7cmE9T2ErMzJ8MDtzYT1PYSszNnwwO0w9MTtLPTA7Sj0wO0k9MDtIPTA7Rz0wO0Y9MDtFPTA7RD0wO2g9MDtyPTA7cz0wO3Q9MDt1PTA7dj0wO3c9MDt4PTA7eT0wO3o9MDtBPTI1NDtCPTA7d2hpbGUoMSl7Zz0oZFtNYSsoKEF8MCkvOHwwKT4+MF18MCk+Pj4oQSY3KSYxO25iPTAtKGdeQil8MDtiYj0oZV5MKSZuYjthYj0oZl5LKSZuYjskYT0oal5KKSZuYjtfYT0oa15JKSZuYjtaYT0obF5IKSZuYjtrYj0obV5HKSZuYjttYj0obl5GKSZuYjtCPShvXkUpJm5iO2piPShwXkQpJm5iO2xiPShxXmgpJm5iO2NbV2E+PjJdPWJiXkw7Y1tMYT4+Ml09YWJeSztjW0RhPj4yXT0kYV5KO2NbRWE+PjJdPV9hXkk7Y1tGYT4+Ml09WmFeSDtjW0dhPj4yXT1rYl5HO2NbSGE+PjJdPW1iXkY7Y1tJYT4+Ml09Ql5FO2NbSmE+PjJdPWpiXkQ7Y1tLYT4+Ml09bGJeaDtiYj1iYl5lO2NbUWE+PjJdPWJiO2FiPWFiXmY7Y1t0YT4+Ml09YWI7JGE9JGFeajtjW3VhPj4yXT0kYTtfYT1fYV5rO2NbdmE+PjJdPV9hO1phPVphXmw7Y1t3YT4+Ml09WmE7ST1rYl5tO2NbeGE+PjJdPUk7RT1tYl5uO2NbeWE+PjJdPUU7bD1CXm87Y1t6YT4+Ml09bDtqPWpiXnA7Y1tBYT4+Ml09ajtmPWxiXnE7Y1tCYT4+Ml09ZjtLPWNbVT4+Ml18MDtsYj1jW1JhPj4yXXwwO2piPWNbQ2E+PjJdfDA7Qj1jW1Y+PjJdfDA7cD1jW1c+PjJdfDA7cT1jW1g+PjJdfDA7RD1jW1k+PjJdfDA7Rj1jW1o+PjJdfDA7SD1jW18+PjJdfDA7Sj1jWyQ+PjJdfDA7TD1jW2FhPj4yXXwwO21iPShsYl5yKSZuYjtrYj0oamJecykmbmI7aWI9KEJedCkmbmI7aGI9KHBedSkmbmI7Z2I9KHFedikmbmI7ZmI9KERedykmbmI7ZWI9KEZeeCkmbmI7ZGI9KEheeSkmbmI7Y2I9KEpeeikmbmI7bz0oTF5LKSZuYjtlPW1iXnI7Y1tYYT4+Ml09ZTtoPWtiXnM7Y1tNPj4yXT1oO2s9aWJedDtjW04+PjJdPWs7bT1oYl51O2NbTz4+Ml09bTtuPWdiXnY7Y1tQPj4yXT1uO3I9ZmJedztjW1E+PjJdPXI7dj1lYl54O2NbUj4+Ml09djt4PWRiXnk7Y1tTPj4yXT14O0c9Y2JeejtjW1Q+PjJdPUc7Sz1vXks7Y1tVPj4yXT1LO3M9bWJebGI7Y1tSYT4+Ml09czt1PWtiXmpiO2NbQ2E+PjJdPXU7Qj1pYl5CO2NbVj4+Ml09QjtwPWhiXnA7Y1tXPj4yXT1wO3E9Z2JecTtjW1g+PjJdPXE7RD1mYl5EO2NbWT4+Ml09RDtGPWViXkY7Y1taPj4yXT1GO0g9ZGJeSDtjW18+PjJdPUg7Sj1jYl5KO2NbJD4+Ml09SjtMPW9eTDtjW2FhPj4yXT1MO2NbTmE+PjJdPWJiLXM7Y1tiYT4+Ml09YWItdTtjW2NhPj4yXT0kYS1CO2NbZGE+PjJdPV9hLXA7Y1tlYT4+Ml09WmEtcTtjW2ZhPj4yXT1JLUQ7Y1tnYT4+Ml09RS1GO2NbaGE+PjJdPWwtSDtjW2lhPj4yXT1qLUo7Y1tqYT4+Ml09Zi1MO2Y9Y1tXYT4+Ml18MDtqPWNbTGE+PjJdfDA7bD1jW0RhPj4yXXwwO3c9Y1tFYT4+Ml18MDtvPWNbRmE+PjJdfDA7dD1jW0dhPj4yXXwwO3o9Y1tIYT4+Ml18MDtFPWNbSWE+PjJdfDA7ST1jW0phPj4yXXwwO3k9Y1tLYT4+Ml18MDtjW09hPj4yXT1mLWU7Y1trYT4+Ml09ai1oO2NbbGE+PjJdPWwtaztjW21hPj4yXT13LW07Y1tuYT4+Ml09by1uO2Nbb2E+PjJdPXQtcjtjW3BhPj4yXT16LXY7Y1txYT4+Ml09RS14O2NbcmE+PjJdPUktRztjW3NhPj4yXT15LUs7Y1tXYT4+Ml09ZStmO2NbTGE+PjJdPWgrajtjW0RhPj4yXT1rK2w7Y1tFYT4+Ml09bSt3O2NbRmE+PjJdPW4rbztjW0dhPj4yXT1yK3Q7Y1tIYT4+Ml09dit6O2NbSWE+PjJdPXgrRTtjW0phPj4yXT1HK0k7Y1tLYT4+Ml09Syt5O3U9dSsoY1t0YT4+Ml18MCl8MDtCPUIrKGNbdWE+PjJdfDApfDA7cD1wKyhjW3ZhPj4yXXwwKXwwO3E9cSsoY1t3YT4+Ml18MCl8MDtEPUQrKGNbeGE+PjJdfDApfDA7Rj1GKyhjW3lhPj4yXXwwKXwwO0g9SCsoY1t6YT4+Ml18MCl8MDtKPUorKGNbQWE+PjJdfDApfDA7TD1MKyhjW0JhPj4yXXwwKXwwO2NbWGE+PjJdPXMrKGNbUWE+PjJdfDApO2NbTT4+Ml09dTtjW04+PjJdPUI7Y1tPPj4yXT1wO2NbUD4+Ml09cTtjW1E+PjJdPUQ7Y1tSPj4yXT1GO2NbUz4+Ml09SDtjW1Q+PjJdPUo7Y1tVPj4yXT1MO2tkKFJhLE5hLFdhKTtrZChYYSxYYSxPYSk7bGQoTmEsT2EpO2xkKE9hLFdhKTtMPWNbUmE+PjJdfDA7Sj1jW0NhPj4yXXwwO0g9Y1tWPj4yXXwwO0Y9Y1tXPj4yXXwwO0Q9Y1tYPj4yXXwwO3E9Y1tZPj4yXXwwO3A9Y1taPj4yXXwwO0I9Y1tfPj4yXXwwO3U9Y1skPj4yXXwwO3M9Y1thYT4+Ml18MDt5PWNbWGE+PjJdfDA7Sz1jW00+PjJdfDA7ST1jW04+PjJdfDA7Rz1jW08+PjJdfDA7RT1jW1A+PjJdfDA7ej1jW1E+PjJdfDA7eD1jW1I+PjJdfDA7dj1jW1M+PjJdfDA7dD1jW1Q+PjJdfDA7cj1jW1U+PjJdfDA7Y1tRYT4+Ml09eStMO2NbdGE+PjJdPUsrSjtjW3VhPj4yXT1JK0g7Y1t2YT4+Ml09RytGO2Nbd2E+PjJdPUUrRDtjW3hhPj4yXT16K3E7Y1t5YT4+Ml09eCtwO2NbemE+PjJdPXYrQjtjW0FhPj4yXT10K3U7Y1tCYT4+Ml09citzO2NbWGE+PjJdPUwteTtjW00+PjJdPUotSztjW04+PjJdPUgtSTtjW08+PjJdPUYtRztjW1A+PjJdPUQtRTtjW1E+PjJdPXEtejtjW1I+PjJdPXAteDtjW1M+PjJdPUItdjtjW1Q+PjJdPXUtdDtjW1U+PjJdPXMtcjtrZChXYSxPYSxOYSk7cj0oY1tPYT4+Ml18MCktKGNbTmE+PjJdfDApfDA7cz0oY1trYT4+Ml18MCktKGNbYmE+PjJdfDApfDA7dD0oY1tsYT4+Ml18MCktKGNbY2E+PjJdfDApfDA7dT0oY1ttYT4+Ml18MCktKGNbZGE+PjJdfDApfDA7dj0oY1tuYT4+Ml18MCktKGNbZWE+PjJdfDApfDA7Qj0oY1tvYT4+Ml18MCktKGNbZmE+PjJdfDApfDA7eD0oY1twYT4+Ml18MCktKGNbZ2E+PjJdfDApfDA7cD0oY1txYT4+Ml18MCktKGNbaGE+PjJdfDApfDA7ej0oY1tyYT4+Ml18MCktKGNbaWE+PjJdfDApfDA7cT0oY1tzYT4+Ml18MCktKGNbamE+PjJdfDApfDA7Y1tPYT4+Ml09cjtjW2thPj4yXT1zO2NbbGE+PjJdPXQ7Y1ttYT4+Ml09dTtjW25hPj4yXT12O2Nbb2E+PjJdPUI7Y1twYT4+Ml09eDtjW3FhPj4yXT1wO2NbcmE+PjJdPXo7Y1tzYT4+Ml09cTtsZChYYSxYYSk7cj1PZChyfDAsKChyfDApPDApPDwzMT4+MzF8MCwxMjE2NjYsMCl8MDtFPUM7cz1PZChzfDAsKChzfDApPDApPDwzMT4+MzF8MCwxMjE2NjYsMCl8MDtEPUM7dD1PZCh0fDAsKCh0fDApPDApPDwzMT4+MzF8MCwxMjE2NjYsMCl8MDtHPUM7dT1PZCh1fDAsKCh1fDApPDApPDwzMT4+MzF8MCwxMjE2NjYsMCl8MDtGPUM7dj1PZCh2fDAsKCh2fDApPDApPDwzMT4+MzF8MCwxMjE2NjYsMCl8MDtJPUM7Qj1PZChCfDAsKChCfDApPDApPDwzMT4+MzF8MCwxMjE2NjYsMCl8MDtIPUM7eD1PZCh4fDAsKCh4fDApPDApPDwzMT4+MzF8MCwxMjE2NjYsMCl8MDtLPUM7cD1PZChwfDAsKChwfDApPDApPDwzMT4+MzF8MCwxMjE2NjYsMCl8MDtKPUM7ej1PZCh6fDAsKCh6fDApPDApPDwzMT4+MzF8MCwxMjE2NjYsMCl8MDt5PUM7cT1PZChxfDAsKChxfDApPDApPDwzMT4+MzF8MCwxMjE2NjYsMCl8MDtMPUM7bz1EZChxfDAsTHwwLDE2Nzc3MjE2LDApfDA7bz1FZChvfDAsQ3wwLDI1KXwwO3c9QztuPU9kKG98MCx3fDAsMTksMCl8MDtFPURkKG58MCxDfDAscnwwLEV8MCl8MDtyPUM7dz1IZChvfDAsd3wwLDI1KXwwO3c9Q2QocXwwLEx8MCx3fDAsQ3wwKXwwO0w9QztxPURkKHN8MCxEfDAsMTY3NzcyMTYsMCl8MDtxPUVkKHF8MCxDfDAsMjUpfDA7bz1DO0c9RGQocXwwLG98MCx0fDAsR3wwKXwwO3Q9QztvPUhkKHF8MCxvfDAsMjUpfDA7bz1DZChzfDAsRHwwLG98MCxDfDApfDA7RD1DO3M9RGQodXwwLEZ8MCwxNjc3NzIxNiwwKXwwO3M9RWQoc3wwLEN8MCwyNSl8MDtxPUM7ST1EZChzfDAscXwwLHZ8MCxJfDApfDA7dj1DO3E9SGQoc3wwLHF8MCwyNSl8MDtxPUNkKHV8MCxGfDAscXwwLEN8MCl8MDtGPUM7dT1EZChCfDAsSHwwLDE2Nzc3MjE2LDApfDA7dT1FZCh1fDAsQ3wwLDI1KXwwO3M9QztLPURkKHV8MCxzfDAseHwwLEt8MCl8MDt4PUM7cz1IZCh1fDAsc3wwLDI1KXwwO3M9Q2QoQnwwLEh8MCxzfDAsQ3wwKXwwO0g9QztCPURkKHB8MCxKfDAsMTY3NzcyMTYsMCl8MDtCPUVkKEJ8MCxDfDAsMjUpfDA7dT1DO3k9RGQoQnwwLHV8MCx6fDAseXwwKXwwO3o9Qzt1PUhkKEJ8MCx1fDAsMjUpfDA7dT1DZChwfDAsSnwwLHV8MCxDfDApfDA7Sj1DO3A9RGQoRXwwLHJ8MCwzMzU1NDQzMiwwKXwwO3A9RWQocHwwLEN8MCwyNil8MDtCPUM7RD1EZChvfDAsRHwwLHB8MCxCfDApfDA7Qj1IZChwfDAsQnwwLDI2KXwwO0I9Q2QoRXwwLHJ8MCxCfDAsQ3wwKXwwO3I9RGQoR3wwLHR8MCwzMzU1NDQzMiwwKXwwO3I9RWQocnwwLEN8MCwyNil8MDtFPUM7Rj1EZChxfDAsRnwwLHJ8MCxFfDApfDA7RT1IZChyfDAsRXwwLDI2KXwwO0U9Q2QoR3wwLHR8MCxFfDAsQ3wwKXwwO3Q9RGQoSXwwLHZ8MCwzMzU1NDQzMiwwKXwwO3Q9RWQodHwwLEN8MCwyNil8MDtHPUM7SD1EZChzfDAsSHwwLHR8MCxHfDApfDA7Rz1IZCh0fDAsR3wwLDI2KXwwO0c9Q2QoSXwwLHZ8MCxHfDAsQ3wwKXwwO3Y9RGQoS3wwLHh8MCwzMzU1NDQzMiwwKXwwO3Y9RWQodnwwLEN8MCwyNil8MDtJPUM7Sj1EZCh1fDAsSnwwLHZ8MCxJfDApfDA7ST1IZCh2fDAsSXwwLDI2KXwwO0k9Q2QoS3wwLHh8MCxJfDAsQ3wwKXwwO3g9RGQoeXwwLHp8MCwzMzU1NDQzMiwwKXwwO3g9RWQoeHwwLEN8MCwyNil8MDtLPUM7TD1EZCh3fDAsTHwwLHh8MCxLfDApfDA7Sz1IZCh4fDAsS3wwLDI2KXwwO0s9Q2QoeXwwLHp8MCxLfDAsQ3wwKXwwO2NbUmE+PjJdPUI7Y1tDYT4+Ml09RDtjW1Y+PjJdPUU7Y1tXPj4yXT1GO2NbWD4+Ml09RztjW1k+PjJdPUg7Y1taPj4yXT1JO2NbXz4+Ml09SjtjWyQ+PjJdPUs7Y1thYT4+Ml09TDtsZChRYSxRYSk7RD1EKyhjW2JhPj4yXXwwKXwwO0U9RSsoY1tjYT4+Ml18MCl8MDtGPUYrKGNbZGE+PjJdfDApfDA7Rz1HKyhjW2VhPj4yXXwwKXwwO0g9SCsoY1tmYT4+Ml18MCl8MDtJPUkrKGNbZ2E+PjJdfDApfDA7Sj1KKyhjW2hhPj4yXXwwKXwwO0s9SysoY1tpYT4+Ml18MCl8MDtMPUwrKGNbamE+PjJdfDApfDA7Y1tOYT4+Ml09QisoY1tOYT4+Ml18MCk7Y1tiYT4+Ml09RDtjW2NhPj4yXT1FO2NbZGE+PjJdPUY7Y1tlYT4+Ml09RztjW2ZhPj4yXT1IO2NbZ2E+PjJdPUk7Y1toYT4+Ml09SjtjW2lhPj4yXT1LO2NbamE+PjJdPUw7a2QoUmEsUGEsWGEpO2tkKFhhLE9hLE5hKTtpZigoQXwwKTw9MClicmVhaztlPWNbUWE+PjJdfDA7TD1jW1dhPj4yXXwwO2Y9Y1t0YT4+Ml18MDtLPWNbTGE+PjJdfDA7aj1jW3VhPj4yXXwwO0o9Y1tEYT4+Ml18MDtrPWNbdmE+PjJdfDA7ST1jW0VhPj4yXXwwO2w9Y1t3YT4+Ml18MDtIPWNbRmE+PjJdfDA7bT1jW3hhPj4yXXwwO0c9Y1tHYT4+Ml18MDtuPWNbeWE+PjJdfDA7Rj1jW0hhPj4yXXwwO289Y1t6YT4+Ml18MDtFPWNbSWE+PjJdfDA7cD1jW0FhPj4yXXwwO0Q9Y1tKYT4+Ml18MDtxPWNbQmE+PjJdfDA7aD1jW0thPj4yXXwwO3I9Y1tYYT4+Ml18MDtzPWNbTT4+Ml18MDt0PWNbTj4+Ml18MDt1PWNbTz4+Ml18MDt2PWNbUD4+Ml18MDt3PWNbUT4+Ml18MDt4PWNbUj4+Ml18MDt5PWNbUz4+Ml18MDt6PWNbVD4+Ml18MDtBPUErLTF8MDtCPWd9a2E9Y1tXYT4+Ml18MDtsYT1jW0xhPj4yXXwwO21hPWNbRGE+PjJdfDA7bmE9Y1tFYT4+Ml18MDtvYT1jW0ZhPj4yXXwwO3BhPWNbR2E+PjJdfDA7cWE9Y1tIYT4+Ml18MDtyYT1jW0lhPj4yXXwwO3NhPWNbSmE+PjJdfDA7bGI9Y1tLYT4+Ml18MDtoYj1jW1FhPj4yXXwwO2RiPWNbdGE+PjJdfDA7JGE9Y1t1YT4+Ml18MDtQYT1jW3ZhPj4yXXwwO21iPWNbd2E+PjJdfDA7aWI9Y1t4YT4+Ml18MDtlYj1jW3lhPj4yXXwwO2FiPWNbemE+PjJdfDA7T2E9Y1tBYT4+Ml18MDtNYT1jW0JhPj4yXXwwO25iPTAtZ3wwO2piPShoYl5rYSkmbmI7ZmI9KGRiXmxhKSZuYjtiYj0oJGFebWEpJm5iO1phPShQYV5uYSkmbmI7ZT0obWJeb2EpJm5iO2tiPShpYl5wYSkmbmI7Z2I9KGViXnFhKSZuYjtjYj0oYWJecmEpJm5iO19hPShPYV5zYSkmbmI7TmE9KE1hXmxiKSZuYjtjW1dhPj4yXT1qYl5rYTtjW0xhPj4yXT1mYl5sYTtjW0RhPj4yXT1iYl5tYTtjW0VhPj4yXT1aYV5uYTtjW0ZhPj4yXT1lXm9hO2NbR2E+PjJdPWtiXnBhO2NbSGE+PjJdPWdiXnFhO2NbSWE+PjJdPWNiXnJhO2NbSmE+PjJdPV9hXnNhO2NbS2E+PjJdPU5hXmxiO2NbUWE+PjJdPWpiXmhiO2NbdGE+PjJdPWZiXmRiO2NbdWE+PjJdPWJiXiRhO2NbdmE+PjJdPVphXlBhO2Nbd2E+PjJdPWVebWI7Y1t4YT4+Ml09a2JeaWI7Y1t5YT4+Ml09Z2JeZWI7Y1t6YT4+Ml09Y2JeYWI7Y1tBYT4+Ml09X2FeT2E7Y1tCYT4+Ml09TmFeTWE7dmE9Y1tYYT4+Ml18MDt3YT1jW00+PjJdfDA7eGE9Y1tOPj4yXXwwO3lhPWNbTz4+Ml18MDt6YT1jW1A+PjJdfDA7QWE9Y1tRPj4yXXwwO0JhPWNbUj4+Ml18MDtNYT1jW1M+PjJdfDA7TmE9Y1tUPj4yXXwwO09hPWNbVT4+Ml18MDtRYT1jW1JhPj4yXXwwO19hPWNbQ2E+PjJdfDA7YWI9Y1tWPj4yXXwwO2NiPWNbVz4+Ml18MDtlYj1jW1g+PjJdfDA7Z2I9Y1tZPj4yXXwwO2liPWNbWj4+Ml18MDtrYj1jW18+PjJdfDA7bWI9Y1skPj4yXXwwO2U9Y1thYT4+Ml18MDtQYT0oUWFedmEpJm5iO1phPShfYV53YSkmbmI7JGE9KGFiXnhhKSZuYjtiYj0oY2JeeWEpJm5iO2RiPShlYl56YSkmbmI7ZmI9KGdiXkFhKSZuYjtoYj0oaWJeQmEpJm5iO2piPShrYl5NYSkmbmI7bGI9KG1iXk5hKSZuYjtuYj0oZV5PYSkmbmI7Y1tYYT4+Ml09UGFedmE7Y1tNPj4yXT1aYV53YTtjW04+PjJdPSRhXnhhO2NbTz4+Ml09YmJeeWE7Y1tQPj4yXT1kYl56YTtjW1E+PjJdPWZiXkFhO2NbUj4+Ml09aGJeQmE7Y1tTPj4yXT1qYl5NYTtjW1Q+PjJdPWxiXk5hO2NbVT4+Ml09bmJeT2E7Y1tSYT4+Ml09UGFeUWE7Y1tDYT4+Ml09WmFeX2E7Y1tWPj4yXT0kYV5hYjtjW1c+PjJdPWJiXmNiO2NbWD4+Ml09ZGJeZWI7Y1tZPj4yXT1mYl5nYjtjW1o+PjJdPWhiXmliO2NbXz4+Ml09amJea2I7Y1skPj4yXT1sYl5tYjtjW2FhPj4yXT1uYl5lO2xkKFRhLFhhKTtsZChVYSxUYSk7bGQoVWEsVWEpO2tkKFVhLFhhLFVhKTtrZChUYSxUYSxVYSk7bGQoVmEsVGEpO2tkKFVhLFVhLFZhKTtsZChWYSxVYSk7bGQoVmEsVmEpO2xkKFZhLFZhKTtsZChWYSxWYSk7bGQoVmEsVmEpO2tkKFVhLFZhLFVhKTtsZChWYSxVYSk7bGQoVmEsVmEpO2xkKFZhLFZhKTtsZChWYSxWYSk7bGQoVmEsVmEpO2xkKFZhLFZhKTtsZChWYSxWYSk7bGQoVmEsVmEpO2xkKFZhLFZhKTtsZChWYSxWYSk7a2QoVmEsVmEsVWEpO2xkKFNhLFZhKTtsZChTYSxTYSk7bGQoU2EsU2EpO2xkKFNhLFNhKTtsZChTYSxTYSk7bGQoU2EsU2EpO2xkKFNhLFNhKTtsZChTYSxTYSk7bGQoU2EsU2EpO2xkKFNhLFNhKTtsZChTYSxTYSk7bGQoU2EsU2EpO2xkKFNhLFNhKTtsZChTYSxTYSk7bGQoU2EsU2EpO2xkKFNhLFNhKTtsZChTYSxTYSk7bGQoU2EsU2EpO2xkKFNhLFNhKTtsZChTYSxTYSk7a2QoVmEsU2EsVmEpO2xkKFZhLFZhKTtsZChWYSxWYSk7bGQoVmEsVmEpO2xkKFZhLFZhKTtsZChWYSxWYSk7bGQoVmEsVmEpO2xkKFZhLFZhKTtsZChWYSxWYSk7bGQoVmEsVmEpO2xkKFZhLFZhKTtrZChVYSxWYSxVYSk7bGQoVmEsVWEpO2U9MTtkb3tsZChWYSxWYSk7ZT1lKzF8MH13aGlsZSgoZXwwKSE9NTApO2tkKFZhLFZhLFVhKTtsZChTYSxWYSk7ZT0xO2Rve2xkKFNhLFNhKTtlPWUrMXwwfXdoaWxlKChlfDApIT0xMDApO2tkKFZhLFNhLFZhKTtsZChWYSxWYSk7ZT0xO2Rve2xkKFZhLFZhKTtlPWUrMXwwfXdoaWxlKChlfDApIT01MCk7a2QoVWEsVmEsVWEpO2xkKFVhLFVhKTtsZChVYSxVYSk7bGQoVWEsVWEpO2xkKFVhLFVhKTtsZChVYSxVYSk7a2QoWGEsVWEsVGEpO2tkKFdhLFdhLFhhKTtlYj1jW1dhPj4yXXwwO2ZiPWNbTGE+PjJdfDA7Z2I9Y1tEYT4+Ml18MDtoYj1jW0VhPj4yXXwwO2liPWNbRmE+PjJdfDA7amI9Y1tHYT4+Ml18MDtrYj1jW0hhPj4yXXwwO2xiPWNbSWE+PjJdfDA7bmI9Y1tKYT4+Ml18MDttYj1jW0thPj4yXXwwO2ViPSgoKCgoKCgoKCgoKChtYioxOXwwKSsxNjc3NzIxNj4+MjUpK2ViPj4yNikrZmI+PjI1KStnYj4+MjYpK2hiPj4yNSkraWI+PjI2KStqYj4+MjUpK2tiPj4yNikrbGI+PjI1KStuYj4+MjYpK21iPj4yNSkqMTl8MCkrZWJ8MDtkYj1lYj4+MjY7ZmI9ZGIrZmJ8MDtkYj1lYi0oZGI8PDI2KXwwO2ViPWZiPj4yNTtnYj1lYitnYnwwO2ViPWZiLShlYjw8MjUpfDA7ZmI9Z2I+PjI2O2hiPWZiK2hifDA7ZmI9Z2ItKGZiPDwyNil8MDtnYj1oYj4+MjU7aWI9Z2IraWJ8MDtnYj1oYi0oZ2I8PDI1KXwwO2hiPWliPj4yNjtqYj1oYitqYnwwO2hiPWliLShoYjw8MjYpfDA7aWI9amI+PjI1O2tiPWliK2tifDA7aWI9amItKGliPDwyNSl8MDtqYj1rYj4+MjY7bGI9amIrbGJ8MDtqYj1rYi0oamI8PDI2KXwwO2tiPWxiPj4yNTtuYj1rYituYnwwO2tiPWxiLShrYjw8MjUpfDA7bGI9bmI+PjI2O21iPWxiK21ifDA7bGI9bmItKGxiPDwyNil8MDtuYj1tYiYzMzU1NDQzMTthW2I+PjBdPWRiO2FbYisxPj4wXT1kYj4+Pjg7YVtiKzI+PjBdPWRiPj4+MTY7YVtiKzM+PjBdPWViPDwyfGRiPj4+MjQ7YVtiKzQ+PjBdPWViPj4+NjthW2IrNT4+MF09ZWI+Pj4xNDthW2IrNj4+MF09ZmI8PDN8ZWI+Pj4yMjthW2IrNz4+MF09ZmI+Pj41O2FbYis4Pj4wXT1mYj4+PjEzO2FbYis5Pj4wXT1nYjw8NXxmYj4+PjIxO2FbYisxMD4+MF09Z2I+Pj4zO2FbYisxMT4+MF09Z2I+Pj4xMTthW2IrMTI+PjBdPWhiPDw2fGdiPj4+MTk7YVtiKzEzPj4wXT1oYj4+PjI7YVtiKzE0Pj4wXT1oYj4+PjEwO2FbYisxNT4+MF09aGI+Pj4xODthW2IrMTY+PjBdPWliO2FbYisxNz4+MF09aWI+Pj44O2FbYisxOD4+MF09aWI+Pj4xNjthW2IrMTk+PjBdPWpiPDwxfGliPj4+MjQ7YVtiKzIwPj4wXT1qYj4+Pjc7YVtiKzIxPj4wXT1qYj4+PjE1O2FbYisyMj4+MF09a2I8PDN8amI+Pj4yMzthW2IrMjM+PjBdPWtiPj4+NTthW2IrMjQ+PjBdPWtiPj4+MTM7YVtiKzI1Pj4wXT1sYjw8NHxrYj4+PjIxO2FbYisyNj4+MF09bGI+Pj40O2FbYisyNz4+MF09bGI+Pj4xMjthW2IrMjg+PjBdPWxiPj4+MjB8bmI8PDY7YVtiKzI5Pj4wXT1tYj4+PjI7YVtiKzMwPj4wXT1tYj4+PjEwO2FbYiszMT4+MF09bmI+Pj4xODtpPVlhO3JldHVybn1mdW5jdGlvbiBuZChiLGUsZixnLGgsaixrLGwpe2I9YnwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO2o9anwwO2s9a3wwO2w9bHwwO3ZhciBtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MCx2PTAsdz0wLHg9MCx5PTAsej0wLEE9MCxCPTAsRD0wO0Q9aTtCPWk9aSs2MyYtNjQ7aT1pKzExMnwwO3Y9QjtBPUIrNDh8MDtCPUIrMTZ8MDtpZigoZnwwKT09MCYoZ3wwKT09MCl7aT1EO3JldHVybn1uPUI7bT1uKzMyfDA7ZG97YVtuPj4wXT1hW2w+PjBdfDA7bj1uKzF8MDtsPWwrMXwwfXdoaWxlKChufDApPChtfDApKTtzPWg7cD1zO3M9cys0fDA7cz1kW3M+PjBdfGRbcysxPj4wXTw8OHxkW3MrMj4+MF08PDE2fGRbcyszPj4wXTw8MjQ7bz12O2Nbbz4+Ml09ZFtwPj4wXXxkW3ArMT4+MF08PDh8ZFtwKzI+PjBdPDwxNnxkW3ArMz4+MF08PDI0O2Nbbys0Pj4yXT1zO289dis4fDA7YVtvPj4wXT1qO3M9R2QoanwwLGt8MCw4KXwwO3A9dis5fDA7YVtwPj4wXT1zO3M9R2QoanwwLGt8MCwxNil8MDtxPXYrMTB8MDthW3E+PjBdPXM7cz1HZChqfDAsa3wwLDI0KXwwO3I9disxMXwwO2Fbcj4+MF09cztzPXYrMTJ8MDthW3M+PjBdPWs7bj1HZChqfDAsa3wwLDQwKXwwO3Q9disxM3wwO2FbdD4+MF09bjtuPUdkKGp8MCxrfDAsNDgpfDA7dT12KzE0fDA7YVt1Pj4wXT1uO2s9R2QoanwwLGt8MCw1Nil8MDtqPXYrMTV8MDthW2o+PjBdPWs7aWYoZz4+PjA+MHwoZ3wwKT09MCZmPj4+MD42Myl7bj1lO2g9ZjtsPWc7ZG97b2IoQSx2LEIsMzM4MzMpO209MDtkb3thW2IrbT4+MF09YVtBK20+PjBdXmFbbittPj4wXTttPW0rMXwwfXdoaWxlKChtfDApIT02NCk7Zj1jW28+PjJdfDA7Zz0oZiYyNTUpKzF8MDthW28+PjBdPWc7Zz0oZj4+PjgmMjU1KSsoZz4+PjgpfDA7YVtwPj4wXT1nO2c9KGY+Pj4xNiYyNTUpKyhnPj4+OCl8MDthW3E+PjBdPWc7Zz0oZj4+PjI0KSsoZz4+PjgpfDA7YVtyPj4wXT1nO2Y9Y1tzPj4yXXwwO2c9KGYmMjU1KSsoZz4+PjgpfDA7YVtzPj4wXT1nO2c9KGY+Pj44JjI1NSkrKGc+Pj44KXwwO2FbdD4+MF09ZztnPShmPj4+MTYmMjU1KSsoZz4+PjgpfDA7YVt1Pj4wXT1nO2Fbaj4+MF09KGY+Pj4yNCkrKGc+Pj44KTtoPURkKGh8MCxsfDAsLTY0LC0xKXwwO2w9QztiPWIrNjR8MDtuPW4rNjR8MH13aGlsZShsPj4+MD4wfChsfDApPT0wJmg+Pj4wPjYzKTtpZighKChofDApPT0wJihsfDApPT0wKSl7eD1iO3k9aDt6PW47dz04fX1lbHNle3g9Yjt5PWY7ej1lO3c9OH1pZigod3wwKT09OD8ob2IoQSx2LEIsMzM4MzMpLCh5fDApIT0wKTowKXtsPTA7ZG97YVt4K2w+PjBdPWFbQStsPj4wXV5hW3orbD4+MF07bD1sKzF8MH13aGlsZSgobHwwKSE9KHl8MCkpfW49QTttPW4rNjR8MDtkb3thW24+PjBdPTA7bj1uKzF8MH13aGlsZSgobnwwKTwobXwwKSk7bj1CO209biszMnwwO2Rve2Fbbj4+MF09MDtuPW4rMXwwfXdoaWxlKChufDApPChtfDApKTtpPUQ7cmV0dXJufWZ1bmN0aW9uIG9kKCl7dmFyIGE9MDtpZighKGNbNzk3OV18MCkpYT0zMTk2NDtlbHNlIGE9Y1sob2EoKXwwKSs2MD4+Ml18MDtyZXR1cm4gYXwwfWZ1bmN0aW9uIHBkKGEpe2E9YXwwO3ZhciBiPTAsZD0wO2Q9aTtiPWk9aSs2MyYtNjQ7aT1pKzE2fDA7Y1tiPj4yXT1jW2ErNjA+PjJdO2E9cGEoNixifDApfDA7aWYoYT4+PjA+NDI5NDk2MzIwMCl7aWYoIShjWzc5NzldfDApKWI9MzE5NjQ7ZWxzZSBiPWNbKG9hKCl8MCkrNjA+PjJdfDA7Y1tiPj4yXT0wLWE7YT0tMX1pPWQ7cmV0dXJuIGF8MH1mdW5jdGlvbiBxZChhLGIsZCl7YT1hfDA7Yj1ifDA7ZD1kfDA7dmFyIGU9MCxmPTAsZz0wLGg9MDtnPWk7ZT1pPWkrNjMmLTY0O2k9aSszMnwwO2g9ZTtlPWUrMjB8MDtjW2g+PjJdPWNbYSs2MD4+Ml07Y1toKzQ+PjJdPTA7Y1toKzg+PjJdPWI7Y1toKzEyPj4yXT1lO2NbaCsxNj4+Ml09ZDtiPXlhKDE0MCxofDApfDA7aWYoYj4+PjA8PTQyOTQ5NjMyMDApaWYoKGJ8MCk8MClmPTc7ZWxzZSBhPWNbZT4+Ml18MDtlbHNle2lmKCEoY1s3OTc5XXwwKSlhPTMxOTY0O2Vsc2UgYT1jWyhvYSgpfDApKzYwPj4yXXwwO2NbYT4+Ml09MC1iO2Y9N31pZigoZnwwKT09Nyl7Y1tlPj4yXT0tMTthPS0xfWk9ZztyZXR1cm4gYXwwfWZ1bmN0aW9uIHJkKGEsYixkKXthPWF8MDtiPWJ8MDtkPWR8MDt2YXIgZT0wLGY9MCxnPTAsaD0wLGo9MCxrPTAsbD0wLG09MCxuPTAsbz0wLHA9MCxxPTA7cT1pO2s9aT1pKzYzJi02NDtpPWkrNDh8MDtuPWsrMTZ8MDttPWs7az1rKzMyfDA7bz1hKzI4fDA7Zz1jW28+PjJdfDA7Y1trPj4yXT1nO3A9YSsyMHwwO2c9KGNbcD4+Ml18MCktZ3wwO2Nbays0Pj4yXT1nO2Nbays4Pj4yXT1iO2NbaysxMj4+Ml09ZDtqPWErNjB8MDtsPWErNDR8MDtmPTI7Zz1nK2R8MDt3aGlsZSgxKXtpZighKGNbNzk3OV18MCkpe2Nbbj4+Ml09Y1tqPj4yXTtjW24rND4+Ml09aztjW24rOD4+Ml09ZjtiPUFhKDE0NixufDApfDA7aWYoYj4+PjA+NDI5NDk2MzIwMCl7aWYoIShjWzc5NzldfDApKWU9MzE5NjQ7ZWxzZSBlPWNbKG9hKCl8MCkrNjA+PjJdfDA7Y1tlPj4yXT0wLWI7Yj0tMX19ZWxzZXt1YSgxOCxhfDApO2NbbT4+Ml09Y1tqPj4yXTtjW20rND4+Ml09aztjW20rOD4+Ml09ZjtiPUFhKDE0NixtfDApfDA7aWYoYj4+PjA+NDI5NDk2MzIwMCl7aWYoIShjWzc5NzldfDApKWU9MzE5NjQ7ZWxzZSBlPWNbKG9hKCl8MCkrNjA+PjJdfDA7Y1tlPj4yXT0wLWI7Yj0tMX1sYSgwKX1pZigoZ3wwKT09KGJ8MCkpe2I9MTM7YnJlYWt9aWYoKGJ8MCk8MCl7Yj0xNTticmVha31nPWctYnwwO2U9Y1trKzQ+PjJdfDA7aWYoYj4+PjA8PWU+Pj4wKWlmKChmfDApPT0yKXtjW28+PjJdPShjW28+PjJdfDApK2I7aD1lO2U9aztmPTJ9ZWxzZXtoPWU7ZT1rfWVsc2V7aD1jW2w+PjJdfDA7Y1tvPj4yXT1oO2NbcD4+Ml09aDtoPWNbaysxMj4+Ml18MDtiPWItZXwwO2U9ays4fDA7Zj1mKy0xfDB9Y1tlPj4yXT0oY1tlPj4yXXwwKStiO2NbZSs0Pj4yXT1oLWI7az1lfWlmKChifDApPT0xMyl7bj1jW2w+PjJdfDA7Y1thKzE2Pj4yXT1uKyhjW2ErNDg+PjJdfDApO2E9bjtjW28+PjJdPWE7Y1twPj4yXT1hfWVsc2UgaWYoKGJ8MCk9PTE1KXtjW2ErMTY+PjJdPTA7Y1tvPj4yXT0wO2NbcD4+Ml09MDtjW2E+PjJdPWNbYT4+Ml18MzI7aWYoKGZ8MCk9PTIpZD0wO2Vsc2UgZD1kLShjW2srND4+Ml18MCl8MH1pPXE7cmV0dXJuIGR8MH1mdW5jdGlvbiBzZChiLGQsZSl7Yj1ifDA7ZD1kfDA7ZT1lfDA7dmFyIGY9MCxnPTAsaD0wO2c9aTtoPWk9aSs2MyYtNjQ7aT1pKzgwfDA7Zj1oO2NbYiszNj4+Ml09MjA7aWYoKGNbYj4+Ml0mNjR8MCk9PTA/KGNbZj4+Ml09Y1tiKzYwPj4yXSxjW2YrND4+Ml09MjE1MDUsY1tmKzg+PjJdPWgrMTIsKHdhKDU0LGZ8MCl8MCkhPTApOjApYVtiKzc1Pj4wXT0tMTtoPXJkKGIsZCxlKXwwO2k9ZztyZXR1cm4gaHwwfWZ1bmN0aW9uIHRkKGEpe2E9YXwwO3ZhciBiPTA7aWYoIWEpe2lmKCEoY1s3OTkwXXwwKSlhPTA7ZWxzZSBhPXRkKGNbNzk5MF18MCl8MDttYSgzMTk0NCk7Yj1jWzc5ODVdfDA7aWYoYilkb3tpZigoY1tiKzIwPj4yXXwwKT4+PjA+KGNbYisyOD4+Ml18MCk+Pj4wKWE9eGQoYil8MHxhO2I9Y1tiKzU2Pj4yXXwwfXdoaWxlKChifDApIT0wKTt4YSgzMTk0NCl9ZWxzZSBhPXhkKGEpfDA7cmV0dXJuIGF8MH1mdW5jdGlvbiB1ZChiLGQpe2I9YnwwO2Q9ZHwwO3ZhciBlPTAsZj0wLGc9MDtmPWQmMjU1O2E6ZG8gaWYoIWYpYj1iKyh2ZChiKXwwKXwwO2Vsc2V7aWYoYiYzKXtlPWQmMjU1O2Rve2c9YVtiPj4wXXwwO2lmKGc8PDI0Pj4yND09MD8xOmc8PDI0Pj4yND09ZTw8MjQ+PjI0KWJyZWFrIGE7Yj1iKzF8MH13aGlsZSgoYiYzfDApIT0wKX1mPV8oZiwxNjg0MzAwOSl8MDtlPWNbYj4+Ml18MDtiOmRvIGlmKCEoKGUmLTIxMzkwNjIxNDReLTIxMzkwNjIxNDQpJmUrLTE2ODQzMDA5KSlkb3tnPWVeZjtpZigoZyYtMjEzOTA2MjE0NF4tMjEzOTA2MjE0NCkmZystMTY4NDMwMDkpYnJlYWsgYjtiPWIrNHwwO2U9Y1tiPj4yXXwwfXdoaWxlKCgoZSYtMjEzOTA2MjE0NF4tMjEzOTA2MjE0NCkmZSstMTY4NDMwMDl8MCk9PTApO3doaWxlKDApO2U9ZCYyNTU7d2hpbGUoMSl7Zz1hW2I+PjBdfDA7aWYoZzw8MjQ+PjI0PT0wPzE6Zzw8MjQ+PjI0PT1lPDwyND4+MjQpYnJlYWs7ZWxzZSBiPWIrMXwwfX13aGlsZSgwKTtyZXR1cm4gYnwwfWZ1bmN0aW9uIHZkKGIpe2I9YnwwO3ZhciBkPTAsZT0wLGY9MDtmPWI7YTpkbyBpZighKGYmMykpZT00O2Vsc2V7ZD1iO2I9Zjt3aGlsZSgxKXtpZighKGFbZD4+MF18MCkpYnJlYWsgYTtkPWQrMXwwO2I9ZDtpZighKGImMykpe2I9ZDtlPTQ7YnJlYWt9fX13aGlsZSgwKTtpZigoZXwwKT09NCl7d2hpbGUoMSl7ZD1jW2I+PjJdfDA7aWYoISgoZCYtMjEzOTA2MjE0NF4tMjEzOTA2MjE0NCkmZCstMTY4NDMwMDkpKWI9Yis0fDA7ZWxzZSBicmVha31pZigoZCYyNTUpPDwyND4+MjQpZG8gYj1iKzF8MDt3aGlsZSgoYVtiPj4wXXwwKSE9MCl9cmV0dXJuIGItZnwwfWZ1bmN0aW9uIHdkKGEpe2E9YXwwO3JldHVybn1mdW5jdGlvbiB4ZChhKXthPWF8MDt2YXIgYj0wLGQ9MCxlPTAsZj0wLGc9MCxoPTA7Yj1hKzIwfDA7Zz1hKzI4fDA7aWYoKGNbYj4+Ml18MCk+Pj4wPihjW2c+PjJdfDApPj4+MD8oRmFbY1thKzM2Pj4yXSYzMV0oYSwwLDApfDAsKGNbYj4+Ml18MCk9PTApOjApYj0tMTtlbHNle2g9YSs0fDA7ZD1jW2g+PjJdfDA7ZT1hKzh8MDtmPWNbZT4+Ml18MDtpZihkPj4+MDxmPj4+MClGYVtjW2ErNDA+PjJdJjMxXShhLGQtZnwwLDEpfDA7Y1thKzE2Pj4yXT0wO2NbZz4+Ml09MDtjW2I+PjJdPTA7Y1tlPj4yXT0wO2NbaD4+Ml09MDtiPTB9cmV0dXJuIGJ8MH1cbmZ1bmN0aW9uIEhiKGEsYil7YT1hfDA7Yj1ifDA7dmFyIGU9MCxmPTAsZz0wLGg9MCxqPTAsaz0wLGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MCx2PTAsdz0wLHg9MCx5PTAsej0wLEE9MCxCPTAsRD0wLEU9MCxGPTAsRz0wLEg9MCxJPTAsSj0wLEs9MCxMPTAsTT0wO2g9aTtnPWk9aSs2MyYtNjQ7aT1pKzY0MHwwO2U9MDtkb3tqPWIrKGU8PDMpfDA7bz1kW2orNz4+MF18MDtwPUhkKGRbais2Pj4wXXwwfDAsMCw4KXwwO2Y9QztuPUhkKGRbais1Pj4wXXwwfDAsMCwxNil8MDtmPWZ8QzttPUhkKGRbais0Pj4wXXwwfDAsMCwyNCl8MDtmPWZ8Q3woZFtqKzM+PjBdfDApO2w9SGQoZFtqKzI+PjBdfDB8MCwwLDQwKXwwO2Y9ZnxDO2s9SGQoZFtqKzE+PjBdfDB8MCwwLDQ4KXwwO2s9RGQocHxvfG58bXxsfDAsZnwwLGt8MCxDfDApfDA7Zj1DO2o9SGQoZFtqPj4wXXwwfDAsMCw1Nil8MDtqPURkKGt8MCxmfDAsanwwLEN8MCl8MDtmPWcrKGU8PDMpfDA7Y1tmPj4yXT1qO2NbZis0Pj4yXT1DO2U9ZSsxfDB9d2hpbGUoKGV8MCkhPTE2KTtlPWc7Yj1jW2U+PjJdfDA7ZT1jW2UrND4+Ml18MDtmPTE2O2Rve3M9ZysoZistMjw8Myl8MDt3PWNbcz4+Ml18MDtzPWNbcys0Pj4yXXwwO3I9R2Qod3wwLHN8MCwxOSl8MDtqPUM7cT1IZCh3fDAsc3wwLDQ1KXwwO2o9anxDO3U9R2Qod3wwLHN8MCw2MSl8MDt2PUM7dD1IZCh3fDAsc3wwLDMpfDA7dj12fEM7cz1HZCh3fDAsc3wwLDYpfDA7aj12XkNeajt2PWcrKGYrLTc8PDMpfDA7dz1jW3Y+PjJdfDA7dj1jW3YrND4+Ml18MDtuPWcrKGYrLTE1PDwzKXwwO3k9YjtiPWNbbj4+Ml18MDt4PWU7ZT1jW24rND4+Ml18MDtuPUdkKGJ8MCxlfDAsMSl8MDtvPUM7cD1IZChifDAsZXwwLDYzKXwwO289b3xDO2s9R2QoYnwwLGV8MCw4KXwwO3o9QztsPUhkKGJ8MCxlfDAsNTYpfDA7ej16fEM7bT1HZChifDAsZXwwLDcpfDA7bz16XkNebzt2PURkKHl8MCx4fDAsd3wwLHZ8MCl8MDtqPURkKHZ8MCxDfDAsKHV8dClec14ocnxxKXwwLGp8MCl8MDtvPURkKGp8MCxDfDAsKGt8bClebV4obnxwKXwwLG98MCl8MDtwPWcrKGY8PDMpfDA7Y1twPj4yXT1vO2NbcCs0Pj4yXT1DO2Y9ZisxfDB9d2hpbGUoKGZ8MCkhPTgwKTtLPWE7ST1jW0s+PjJdfDA7Sz1jW0srND4+Ml18MDtlPWErOHwwO0E9ZTtCPWNbQT4+Ml18MDtBPWNbQSs0Pj4yXXwwO2s9YSsxNnwwO2Y9aztiPWNbZj4+Ml18MDtmPWNbZis0Pj4yXXwwO249YSsyNHwwO2w9bjtqPWNbbD4+Ml18MDtsPWNbbCs0Pj4yXXwwO3E9YSszMnwwO209cTtwPWNbbT4+Ml18MDttPWNbbSs0Pj4yXXwwO3Q9YSs0MHwwO289dDtzPWNbbz4+Ml18MDtvPWNbbys0Pj4yXXwwO3c9YSs0OHwwO3I9dzt2PWNbcj4+Ml18MDtyPWNbcis0Pj4yXXwwO3o9YSs1NnwwO3U9ejt5PWNbdT4+Ml18MDt1PWNbdSs0Pj4yXXwwO0g9R2QocHwwLG18MCwxNCl8MDtEPUM7eD1IZChwfDAsbXwwLDUwKXwwO0Q9RHxDO009R2QocHwwLG18MCwxOCl8MDtFPUM7TD1IZChwfDAsbXwwLDQ2KXwwO0U9RF4oRXxDKTtEPUdkKHB8MCxtfDAsNDEpfDA7Rz1DO0o9SGQocHwwLG18MCwyMyl8MDtHPUVeKEd8Qyk7RT1nO0Y9Y1tFPj4yXXwwO0U9Y1tFKzQ+PjJdfDA7dT1EZCh5fDAsdXwwLC02ODUxOTk4MzgsMTExNjM1MjQwOCl8MDtFPURkKHV8MCxDfDAsRnwwLEV8MCl8MDtHPURkKEV8MCxDfDAsKEh8eCleKE18TCleKER8Sil8MCxHfDApfDA7Rz1EZChHfDAsQ3wwLCh2XnMpJnBednwwLChyXm8pJm1ecnwwKXwwO0o9QztEPUdkKEl8MCxLfDAsMjgpfDA7TD1DO009SGQoSXwwLEt8MCwzNil8MDtMPUx8Qzt4PUdkKEl8MCxLfDAsMzQpfDA7SD1DO0U9SGQoSXwwLEt8MCwzMCl8MDtIPUxeKEh8Qyk7TD1HZChJfDAsS3wwLDM5KXwwO0Y9Qzt1PUhkKEl8MCxLfDAsMjUpfDA7Rj1EZCgoYnxCKSZJfGImQnwwLChmfEEpJkt8ZiZBfDAsKER8TSleKHh8RSleKEx8dSl8MCxIXihGfEMpfDApfDA7SD1DO2w9RGQoanwwLGx8MCxHfDAsSnwwKXwwO2o9QztKPURkKEZ8MCxIfDAsR3wwLEp8MCl8MDtHPUM7SD1HZChsfDAsanwwLDE0KXwwO0Y9Qzt1PUhkKGx8MCxqfDAsNTApfDA7Rj1GfEM7TD1HZChsfDAsanwwLDE4KXwwO0U9Qzt4PUhkKGx8MCxqfDAsNDYpfDA7RT1GXihFfEMpO0Y9R2QobHwwLGp8MCw0MSl8MDtNPUM7RD1IZChsfDAsanwwLDIzKXwwO009RV4oTXxDKTtFPWcrOHwwO3k9Y1tFPj4yXXwwO0U9Y1tFKzQ+PjJdfDA7cj1EZCh2fDAscnwwLDYwMjg5MTcyNSwxODk5NDQ3NDQxKXwwO0U9RGQocnwwLEN8MCx5fDAsRXwwKXwwO009RGQoRXwwLEN8MCwoSHx1KV4oTHx4KV4oRnxEKXwwLE18MCl8MDtNPURkKE18MCxDfDAsKHNecCkmbF5zfDAsKG9ebSkmal5vfDApfDA7RD1DO0Y9R2QoSnwwLEd8MCwyOCl8MDt4PUM7TD1IZChKfDAsR3wwLDM2KXwwO3g9eHxDO3U9R2QoSnwwLEd8MCwzNCl8MDtIPUM7RT1IZChKfDAsR3wwLDMwKXwwO0g9eF4oSHxDKTt4PUdkKEp8MCxHfDAsMzkpfDA7eT1DO3I9SGQoSnwwLEd8MCwyNSl8MDt5PURkKChCfEkpJkp8QiZJfDAsKEF8SykmR3xBJkt8MCwoRnxMKV4odXxFKV4oeHxyKXwwLEheKHl8Qyl8MCl8MDtIPUM7Zj1EZChifDAsZnwwLE18MCxEfDApfDA7Yj1DO0Q9RGQoeXwwLEh8MCxNfDAsRHwwKXwwO009QztIPUdkKGZ8MCxifDAsMTQpfDA7eT1DO3I9SGQoZnwwLGJ8MCw1MCl8MDt5PXl8Qzt4PUdkKGZ8MCxifDAsMTgpfDA7RT1DO3U9SGQoZnwwLGJ8MCw0Nil8MDtFPXleKEV8Qyk7eT1HZChmfDAsYnwwLDQxKXwwO0w9QztGPUhkKGZ8MCxifDAsMjMpfDA7TD1FXihMfEMpO0U9ZysxNnwwO3Y9Y1tFPj4yXXwwO0U9Y1tFKzQ+PjJdfDA7bz1EZChzfDAsb3wwLC0zMzA0ODI4OTcsLTEyNDU2NDM4MjUpfDA7RT1EZChvfDAsQ3wwLHZ8MCxFfDApfDA7TD1EZChFfDAsQ3wwLChIfHIpXih4fHUpXih5fEYpfDAsTHwwKXwwO0w9RGQoTHwwLEN8MCwocF5sKSZmXnB8MCwobV5qKSZiXm18MCl8MDtGPUM7eT1HZChEfDAsTXwwLDI4KXwwO3U9Qzt4PUhkKER8MCxNfDAsMzYpfDA7dT11fEM7cj1HZChEfDAsTXwwLDM0KXwwO0g9QztFPUhkKER8MCxNfDAsMzApfDA7SD11XihIfEMpO3U9R2QoRHwwLE18MCwzOSl8MDt2PUM7bz1IZChEfDAsTXwwLDI1KXwwO3Y9RGQoKEl8SikmRHxJJkp8MCwoS3xHKSZNfEsmR3wwLCh5fHgpXihyfEUpXih1fG8pfDAsSF4odnxDKXwwKXwwO0g9QztBPURkKEJ8MCxBfDAsTHwwLEZ8MCl8MDtCPUM7Rj1EZCh2fDAsSHwwLEx8MCxGfDApfDA7TD1DO0g9R2QoQXwwLEJ8MCwxNCl8MDt2PUM7bz1IZChBfDAsQnwwLDUwKXwwO3Y9dnxDO3U9R2QoQXwwLEJ8MCwxOCl8MDtFPUM7cj1IZChBfDAsQnwwLDQ2KXwwO0U9dl4oRXxDKTt2PUdkKEF8MCxCfDAsNDEpfDA7eD1DO3k9SGQoQXwwLEJ8MCwyMyl8MDt4PUVeKHh8Qyk7RT1nKzI0fDA7cz1jW0U+PjJdfDA7RT1jW0UrND4+Ml18MDttPURkKHB8MCxtfDAsLTIxMjE2NzE3NDgsLTM3Mzk1NzcyMyl8MDtFPURkKG18MCxDfDAsc3wwLEV8MCl8MDt4PURkKEV8MCxDfDAsKEh8byleKHV8cileKHZ8eSl8MCx4fDApfDA7eD1EZCh4fDAsQ3wwLChsXmYpJkFebHwwLChqXmIpJkJeanwwKXwwO3k9Qzt2PUdkKEZ8MCxMfDAsMjgpfDA7cj1DO3U9SGQoRnwwLEx8MCwzNil8MDtyPXJ8QztvPUdkKEZ8MCxMfDAsMzQpfDA7SD1DO0U9SGQoRnwwLEx8MCwzMCl8MDtIPXJeKEh8Qyk7cj1HZChGfDAsTHwwLDM5KXwwO3M9QzttPUhkKEZ8MCxMfDAsMjUpfDA7cz1EZCgoSnxEKSZGfEomRHwwLChHfE0pJkx8RyZNfDAsKHZ8dSleKG98RSleKHJ8bSl8MCxIXihzfEMpfDApfDA7SD1DO0s9RGQoSXwwLEt8MCx4fDAseXwwKXwwO0k9Qzt5PURkKHN8MCxIfDAseHwwLHl8MCl8MDt4PUM7SD1HZChLfDAsSXwwLDE0KXwwO3M9QzttPUhkKEt8MCxJfDAsNTApfDA7cz1zfEM7cj1HZChLfDAsSXwwLDE4KXwwO0U9QztvPUhkKEt8MCxJfDAsNDYpfDA7RT1zXihFfEMpO3M9R2QoS3wwLEl8MCw0MSl8MDt1PUM7dj1IZChLfDAsSXwwLDIzKXwwO3U9RV4odXxDKTtFPWcrMzJ8MDtwPWNbRT4+Ml18MDtFPWNbRSs0Pj4yXXwwO2o9RGQobHwwLGp8MCwtMjEzMzM4ODI0LDk2MTk4NzE2Myl8MDtFPURkKGp8MCxDfDAscHwwLEV8MCl8MDt1PURkKEV8MCxDfDAsKEh8bSleKHJ8byleKHN8dil8MCx1fDApfDA7dT1EZCh1fDAsQ3wwLChmXkEpJkteZnwwLChiXkIpJkleYnwwKXwwO3Y9QztzPUdkKHl8MCx4fDAsMjgpfDA7bz1DO3I9SGQoeXwwLHh8MCwzNil8MDtvPW98QzttPUdkKHl8MCx4fDAsMzQpfDA7SD1DO0U9SGQoeXwwLHh8MCwzMCl8MDtIPW9eKEh8Qyk7bz1HZCh5fDAseHwwLDM5KXwwO3A9QztqPUhkKHl8MCx4fDAsMjUpfDA7cD1EZCgoRHxGKSZ5fEQmRnwwLChNfEwpJnh8TSZMfDAsKHN8cileKG18RSleKG98ail8MCxIXihwfEMpfDApfDA7SD1DO0c9RGQoSnwwLEd8MCx1fDAsdnwwKXwwO0o9Qzt2PURkKHB8MCxIfDAsdXwwLHZ8MCl8MDt1PUM7SD1HZChHfDAsSnwwLDE0KXwwO3A9QztqPUhkKEd8MCxKfDAsNTApfDA7cD1wfEM7bz1HZChHfDAsSnwwLDE4KXwwO0U9QzttPUhkKEd8MCxKfDAsNDYpfDA7RT1wXihFfEMpO3A9R2QoR3wwLEp8MCw0MSl8MDtyPUM7cz1IZChHfDAsSnwwLDIzKXwwO3I9RV4ocnxDKTtFPWcrNDB8MDtsPWNbRT4+Ml18MDtFPWNbRSs0Pj4yXXwwO2I9RGQoZnwwLGJ8MCwtMTI0MTEzMzAzMSwxNTA4OTcwOTkzKXwwO0U9RGQoYnwwLEN8MCxsfDAsRXwwKXwwO3I9RGQoRXwwLEN8MCwoSHxqKV4ob3xtKV4ocHxzKXwwLHJ8MCl8MDtyPURkKHJ8MCxDfDAsKEFeSykmR15BfDAsKEJeSSkmSl5CfDApfDA7cz1DO3A9R2QodnwwLHV8MCwyOCl8MDttPUM7bz1IZCh2fDAsdXwwLDM2KXwwO209bXxDO2o9R2QodnwwLHV8MCwzNCl8MDtIPUM7RT1IZCh2fDAsdXwwLDMwKXwwO0g9bV4oSHxDKTttPUdkKHZ8MCx1fDAsMzkpfDA7bD1DO2I9SGQodnwwLHV8MCwyNSl8MDtsPURkKChGfHkpJnZ8RiZ5fDAsKEx8eCkmdXxMJnh8MCwocHxvKV4oanxFKV4obXxiKXwwLEheKGx8Qyl8MCl8MDtIPUM7TT1EZChEfDAsTXwwLHJ8MCxzfDApfDA7RD1DO3M9RGQobHwwLEh8MCxyfDAsc3wwKXwwO3I9QztIPUdkKE18MCxEfDAsMTQpfDA7bD1DO2I9SGQoTXwwLER8MCw1MCl8MDtsPWx8QzttPUdkKE18MCxEfDAsMTgpfDA7RT1DO2o9SGQoTXwwLER8MCw0Nil8MDtFPWxeKEV8Qyk7bD1HZChNfDAsRHwwLDQxKXwwO289QztwPUhkKE18MCxEfDAsMjMpfDA7bz1FXihvfEMpO0U9Zys0OHwwO2Y9Y1tFPj4yXXwwO0U9Y1tFKzQ+PjJdfDA7Qj1EZChBfDAsQnwwLC0xMzU3Mjk1NzE3LC0xODQxMzMxNTQ4KXwwO0U9RGQoQnwwLEN8MCxmfDAsRXwwKXwwO289RGQoRXwwLEN8MCwoSHxiKV4obXxqKV4obHxwKXwwLG98MCl8MDtvPURkKG98MCxDfDAsKEteRykmTV5LfDAsKEleSikmRF5JfDApfDA7cD1DO2w9R2Qoc3wwLHJ8MCwyOCl8MDtqPUM7bT1IZChzfDAscnwwLDM2KXwwO2o9anxDO2I9R2Qoc3wwLHJ8MCwzNCl8MDtIPUM7RT1IZChzfDAscnwwLDMwKXwwO0g9al4oSHxDKTtqPUdkKHN8MCxyfDAsMzkpfDA7Zj1DO0I9SGQoc3wwLHJ8MCwyNSl8MDtmPURkKCh5fHYpJnN8eSZ2fDAsKHh8dSkmcnx4JnV8MCwobHxtKV4oYnxFKV4oanxCKXwwLEheKGZ8Qyl8MCl8MDtIPUM7TD1EZChGfDAsTHwwLG98MCxwfDApfDA7Rj1DO3A9RGQoZnwwLEh8MCxvfDAscHwwKXwwO289QztIPUdkKEx8MCxGfDAsMTQpfDA7Zj1DO0I9SGQoTHwwLEZ8MCw1MCl8MDtmPWZ8QztqPUdkKEx8MCxGfDAsMTgpfDA7RT1DO2I9SGQoTHwwLEZ8MCw0Nil8MDtFPWZeKEV8Qyk7Zj1HZChMfDAsRnwwLDQxKXwwO209QztsPUhkKEx8MCxGfDAsMjMpfDA7bT1FXihtfEMpO0U9Zys1NnwwO0E9Y1tFPj4yXXwwO0U9Y1tFKzQ+PjJdfDA7ST1EZChLfDAsSXwwLC02MzAzNTc3MzYsLTE0MjQyMDQwNzUpfDA7RT1EZChJfDAsQ3wwLEF8MCxFfDApfDA7bT1EZChFfDAsQ3wwLChIfEIpXihqfGIpXihmfGwpfDAsbXwwKXwwO209RGQobXwwLEN8MCwoR15NKSZMXkd8MCwoSl5EKSZGXkp8MCl8MDtsPUM7Zj1HZChwfDAsb3wwLDI4KXwwO2I9QztqPUhkKHB8MCxvfDAsMzYpfDA7Yj1ifEM7Qj1HZChwfDAsb3wwLDM0KXwwO0g9QztFPUhkKHB8MCxvfDAsMzApfDA7SD1iXihIfEMpO2I9R2QocHwwLG98MCwzOSl8MDtBPUM7ST1IZChwfDAsb3wwLDI1KXwwO0E9RGQoKHZ8cykmcHx2JnN8MCwodXxyKSZvfHUmcnwwLChmfGopXihCfEUpXihifEkpfDAsSF4oQXxDKXwwKXwwO0g9Qzt4PURkKHl8MCx4fDAsbXwwLGx8MCl8MDt5PUM7bD1EZChBfDAsSHwwLG18MCxsfDApfDA7bT1DO0g9R2QoeHwwLHl8MCwxNCl8MDtBPUM7ST1IZCh4fDAseXwwLDUwKXwwO0E9QXxDO2I9R2QoeHwwLHl8MCwxOCl8MDtFPUM7Qj1IZCh4fDAseXwwLDQ2KXwwO0U9QV4oRXxDKTtBPUdkKHh8MCx5fDAsNDEpfDA7aj1DO2Y9SGQoeHwwLHl8MCwyMyl8MDtqPUVeKGp8Qyk7RT1nKzY0fDA7Sz1jW0U+PjJdfDA7RT1jW0UrND4+Ml18MDtKPURkKEd8MCxKfDAsLTE1NjAwODM5MDIsLTY3MDU4NjIxNil8MDtFPURkKEp8MCxDfDAsS3wwLEV8MCl8MDtqPURkKEV8MCxDfDAsKEh8SSleKGJ8QileKEF8Zil8MCxqfDApfDA7aj1EZChqfDAsQ3wwLChNXkwpJnheTXwwLChEXkYpJnleRHwwKXwwO2Y9QztBPUdkKGx8MCxtfDAsMjgpfDA7Qj1DO2I9SGQobHwwLG18MCwzNil8MDtCPUJ8QztJPUdkKGx8MCxtfDAsMzQpfDA7SD1DO0U9SGQobHwwLG18MCwzMCl8MDtIPUJeKEh8Qyk7Qj1HZChsfDAsbXwwLDM5KXwwO0s9QztKPUhkKGx8MCxtfDAsMjUpfDA7Sz1EZCgoc3xwKSZsfHMmcHwwLChyfG8pJm18ciZvfDAsKEF8YileKEl8RSleKEJ8Sil8MCxIXihLfEMpfDApfDA7SD1DO3U9RGQodnwwLHV8MCxqfDAsZnwwKXwwO3Y9QztmPURkKEt8MCxIfDAsanwwLGZ8MCl8MDtqPUM7SD1HZCh1fDAsdnwwLDE0KXwwO0s9QztKPUhkKHV8MCx2fDAsNTApfDA7Sz1LfEM7Qj1HZCh1fDAsdnwwLDE4KXwwO0U9QztJPUhkKHV8MCx2fDAsNDYpfDA7RT1LXihFfEMpO0s9R2QodXwwLHZ8MCw0MSl8MDtiPUM7QT1IZCh1fDAsdnwwLDIzKXwwO2I9RV4oYnxDKTtFPWcrNzJ8MDtHPWNbRT4+Ml18MDtFPWNbRSs0Pj4yXXwwO0Q9RGQoTXwwLER8MCwxMTY0OTk2NTQyLDMxMDU5ODQwMSl8MDtFPURkKER8MCxDfDAsR3wwLEV8MCl8MDtiPURkKEV8MCxDfDAsKEh8SileKEJ8SSleKEt8QSl8MCxifDApfDA7Yj1EZChifDAsQ3wwLChMXngpJnVeTHwwLChGXnkpJnZeRnwwKXwwO0E9QztLPUdkKGZ8MCxqfDAsMjgpfDA7ST1DO0I9SGQoZnwwLGp8MCwzNil8MDtJPUl8QztKPUdkKGZ8MCxqfDAsMzQpfDA7SD1DO0U9SGQoZnwwLGp8MCwzMCl8MDtIPUleKEh8Qyk7ST1HZChmfDAsanwwLDM5KXwwO0c9QztEPUhkKGZ8MCxqfDAsMjUpfDA7Rz1EZCgocHxsKSZmfHAmbHwwLChvfG0pJmp8byZtfDAsKEt8QileKEp8RSleKEl8RCl8MCxIXihHfEMpfDApfDA7SD1DO3I9RGQoc3wwLHJ8MCxifDAsQXwwKXwwO3M9QztBPURkKEd8MCxIfDAsYnwwLEF8MCl8MDtiPUM7SD1HZChyfDAsc3wwLDE0KXwwO0c9QztEPUhkKHJ8MCxzfDAsNTApfDA7Rz1HfEM7ST1HZChyfDAsc3wwLDE4KXwwO0U9QztKPUhkKHJ8MCxzfDAsNDYpfDA7RT1HXihFfEMpO0c9R2QocnwwLHN8MCw0MSl8MDtCPUM7Sz1IZChyfDAsc3wwLDIzKXwwO0I9RV4oQnxDKTtFPWcrODB8MDtNPWNbRT4+Ml18MDtFPWNbRSs0Pj4yXXwwO0Y9RGQoTHwwLEZ8MCwxMzIzNjEwNzY0LDYwNzIyNTI3OCl8MDtFPURkKEZ8MCxDfDAsTXwwLEV8MCl8MDtCPURkKEV8MCxDfDAsKEh8RCleKEl8SileKEd8Syl8MCxCfDApfDA7Qj1EZChCfDAsQ3wwLCh4XnUpJnJeeHwwLCh5XnYpJnNeeXwwKXwwO0s9QztHPUdkKEF8MCxifDAsMjgpfDA7Sj1DO0k9SGQoQXwwLGJ8MCwzNil8MDtKPUp8QztEPUdkKEF8MCxifDAsMzQpfDA7SD1DO0U9SGQoQXwwLGJ8MCwzMCl8MDtIPUpeKEh8Qyk7Sj1HZChBfDAsYnwwLDM5KXwwO009QztGPUhkKEF8MCxifDAsMjUpfDA7TT1EZCgobHxmKSZBfGwmZnwwLChtfGopJmJ8bSZqfDAsKEd8SSleKER8RSleKEp8Ril8MCxIXihNfEMpfDApfDA7SD1DO289RGQocHwwLG98MCxCfDAsS3wwKXwwO3A9QztLPURkKE18MCxIfDAsQnwwLEt8MCl8MDtCPUM7SD1HZChvfDAscHwwLDE0KXwwO009QztGPUhkKG98MCxwfDAsNTApfDA7TT1NfEM7Sj1HZChvfDAscHwwLDE4KXwwO0U9QztEPUhkKG98MCxwfDAsNDYpfDA7RT1NXihFfEMpO009R2Qob3wwLHB8MCw0MSl8MDtJPUM7Rz1IZChvfDAscHwwLDIzKXwwO0k9RV4oSXxDKTtFPWcrODh8MDtMPWNbRT4+Ml18MDtFPWNbRSs0Pj4yXXwwO3k9RGQoeHwwLHl8MCwtNzA0NjYyMzAyLDE0MjY4ODE5ODcpfDA7RT1EZCh5fDAsQ3wwLEx8MCxFfDApfDA7ST1EZChFfDAsQ3wwLChIfEYpXihKfEQpXihNfEcpfDAsSXwwKXwwO0k9RGQoSXwwLEN8MCwodV5yKSZvXnV8MCwodl5zKSZwXnZ8MCl8MDtHPUM7TT1HZChLfDAsQnwwLDI4KXwwO0Q9QztKPUhkKEt8MCxCfDAsMzYpfDA7RD1EfEM7Rj1HZChLfDAsQnwwLDM0KXwwO0g9QztFPUhkKEt8MCxCfDAsMzApfDA7SD1EXihIfEMpO0Q9R2QoS3wwLEJ8MCwzOSl8MDtMPUM7eT1IZChLfDAsQnwwLDI1KXwwO0w9RGQoKGZ8QSkmS3xmJkF8MCwoanxiKSZCfGomYnwwLChNfEopXihGfEUpXihEfHkpfDAsSF4oTHxDKXwwKXwwO0g9QzttPURkKGx8MCxtfDAsSXwwLEd8MCl8MDtsPUM7Rz1EZChMfDAsSHwwLEl8MCxHfDApfDA7ST1DO0g9R2QobXwwLGx8MCwxNCl8MDtMPUM7eT1IZChtfDAsbHwwLDUwKXwwO0w9THxDO0Q9R2QobXwwLGx8MCwxOCl8MDtFPUM7Rj1IZChtfDAsbHwwLDQ2KXwwO0U9TF4oRXxDKTtMPUdkKG18MCxsfDAsNDEpfDA7Sj1DO009SGQobXwwLGx8MCwyMyl8MDtKPUVeKEp8Qyk7RT1nKzk2fDA7eD1jW0U+PjJdfDA7RT1jW0UrND4+Ml18MDt2PURkKHV8MCx2fDAsLTIyNjc4NDkxMywxOTI1MDc4Mzg4KXwwO0U9RGQodnwwLEN8MCx4fDAsRXwwKXwwO0o9RGQoRXwwLEN8MCwoSHx5KV4oRHxGKV4oTHxNKXwwLEp8MCl8MDtKPURkKEp8MCxDfDAsKHJebykmbV5yfDAsKHNecCkmbF5zfDApfDA7TT1DO0w9R2QoR3wwLEl8MCwyOCl8MDtGPUM7RD1IZChHfDAsSXwwLDM2KXwwO0Y9RnxDO3k9R2QoR3wwLEl8MCwzNCl8MDtIPUM7RT1IZChHfDAsSXwwLDMwKXwwO0g9Rl4oSHxDKTtGPUdkKEd8MCxJfDAsMzkpfDA7eD1DO3Y9SGQoR3wwLEl8MCwyNSl8MDt4PURkKChBfEspJkd8QSZLfDAsKGJ8QikmSXxiJkJ8MCwoTHxEKV4oeXxFKV4oRnx2KXwwLEheKHh8Qyl8MCl8MDtIPUM7aj1EZChmfDAsanwwLEp8MCxNfDApfDA7Zj1DO009RGQoeHwwLEh8MCxKfDAsTXwwKXwwO0o9QztIPUdkKGp8MCxmfDAsMTQpfDA7eD1DO3Y9SGQoanwwLGZ8MCw1MCl8MDt4PXh8QztGPUdkKGp8MCxmfDAsMTgpfDA7RT1DO3k9SGQoanwwLGZ8MCw0Nil8MDtFPXheKEV8Qyk7eD1HZChqfDAsZnwwLDQxKXwwO0Q9QztMPUhkKGp8MCxmfDAsMjMpfDA7RD1FXihEfEMpO0U9ZysxMDR8MDt1PWNbRT4+Ml18MDtFPWNbRSs0Pj4yXXwwO3M9RGQocnwwLHN8MCw5OTEzMzYxMTMsLTIxMzI4ODkwOTApfDA7RT1EZChzfDAsQ3wwLHV8MCxFfDApfDA7RD1EZChFfDAsQ3wwLChIfHYpXihGfHkpXih4fEwpfDAsRHwwKXwwO0Q9RGQoRHwwLEN8MCwob15tKSZqXm98MCwocF5sKSZmXnB8MCl8MDtMPUM7eD1HZChNfDAsSnwwLDI4KXwwO3k9QztGPUhkKE18MCxKfDAsMzYpfDA7eT15fEM7dj1HZChNfDAsSnwwLDM0KXwwO0g9QztFPUhkKE18MCxKfDAsMzApfDA7SD15XihIfEMpO3k9R2QoTXwwLEp8MCwzOSl8MDt1PUM7cz1IZChNfDAsSnwwLDI1KXwwO3U9RGQoKEt8RykmTXxLJkd8MCwoQnxJKSZKfEImSXwwLCh4fEYpXih2fEUpXih5fHMpfDAsSF4odXxDKXwwKXwwO0g9QztiPURkKEF8MCxifDAsRHwwLEx8MCl8MDtBPUM7TD1EZCh1fDAsSHwwLER8MCxMfDApfDA7RD1DO0g9R2QoYnwwLEF8MCwxNCl8MDt1PUM7cz1IZChifDAsQXwwLDUwKXwwO3U9dXxDO3k9R2QoYnwwLEF8MCwxOCl8MDtFPUM7dj1IZChifDAsQXwwLDQ2KXwwO0U9dV4oRXxDKTt1PUdkKGJ8MCxBfDAsNDEpfDA7Rj1DO3g9SGQoYnwwLEF8MCwyMyl8MDtGPUVeKEZ8Qyk7RT1nKzExMnwwO3I9Y1tFPj4yXXwwO0U9Y1tFKzQ+PjJdfDA7cD1EZChvfDAscHwwLDYzMzgwMzMxNywtMTY4MDA3OTE5Myl8MDtFPURkKHB8MCxDfDAscnwwLEV8MCl8MDtGPURkKEV8MCxDfDAsKEh8cyleKHl8dileKHV8eCl8MCxGfDApfDA7Rj1EZChGfDAsQ3wwLChtXmopJmJebXwwLChsXmYpJkFebHwwKXwwO3g9Qzt1PUdkKEx8MCxEfDAsMjgpfDA7dj1DO3k9SGQoTHwwLER8MCwzNil8MDt2PXZ8QztzPUdkKEx8MCxEfDAsMzQpfDA7SD1DO0U9SGQoTHwwLER8MCwzMCl8MDtIPXZeKEh8Qyk7dj1HZChMfDAsRHwwLDM5KXwwO3I9QztwPUhkKEx8MCxEfDAsMjUpfDA7cj1EZCgoR3xNKSZMfEcmTXwwLChJfEopJkR8SSZKfDAsKHV8eSleKHN8RSleKHZ8cCl8MCxIXihyfEMpfDApfDA7SD1DO0I9RGQoS3wwLEJ8MCxGfDAseHwwKXwwO0s9Qzt4PURkKHJ8MCxIfDAsRnwwLHh8MCl8MDtGPUM7SD1HZChCfDAsS3wwLDE0KXwwO3I9QztwPUhkKEJ8MCxLfDAsNTApfDA7cj1yfEM7dj1HZChCfDAsS3wwLDE4KXwwO0U9QztzPUhkKEJ8MCxLfDAsNDYpfDA7RT1yXihFfEMpO3I9R2QoQnwwLEt8MCw0MSl8MDt5PUM7dT1IZChCfDAsS3wwLDIzKXwwO3k9RV4oeXxDKTtFPWcrMTIwfDA7bz1jW0U+PjJdfDA7RT1jW0UrND4+Ml18MDtsPURkKG18MCxsfDAsLTgxNTE5MjQyOCwtMTA0Njc0NDcxNil8MDtFPURkKGx8MCxDfDAsb3wwLEV8MCl8MDt5PURkKEV8MCxDfDAsKEh8cCleKHZ8cyleKHJ8dSl8MCx5fDApfDA7eT1EZCh5fDAsQ3wwLChqXmIpJkJeanwwLChmXkEpJkteZnwwKXwwO3U9QztyPUdkKHh8MCxGfDAsMjgpfDA7cz1DO3Y9SGQoeHwwLEZ8MCwzNil8MDtzPXN8QztwPUdkKHh8MCxGfDAsMzQpfDA7SD1DO0U9SGQoeHwwLEZ8MCwzMCl8MDtIPXNeKEh8Qyk7cz1HZCh4fDAsRnwwLDM5KXwwO289QztsPUhkKHh8MCxGfDAsMjUpfDA7bz1EZCgoTXxMKSZ4fE0mTHwwLChKfEQpJkZ8SiZEfDAsKHJ8dileKHB8RSleKHN8bCl8MCxIXihvfEMpfDApfDA7SD1DO0k9RGQoR3wwLEl8MCx5fDAsdXwwKXwwO0c9Qzt1PURkKG98MCxIfDAseXwwLHV8MCl8MDt5PUM7SD1HZChJfDAsR3wwLDE0KXwwO289QztsPUhkKEl8MCxHfDAsNTApfDA7bz1vfEM7cz1HZChJfDAsR3wwLDE4KXwwO0U9QztwPUhkKEl8MCxHfDAsNDYpfDA7RT1vXihFfEMpO289R2QoSXwwLEd8MCw0MSl8MDt2PUM7cj1IZChJfDAsR3wwLDIzKXwwO3Y9RV4odnxDKTtFPWcrMTI4fDA7bT1jW0U+PjJdfDA7RT1jW0UrND4+Ml18MDtmPURkKGp8MCxmfDAsLTE2MjgzNTM4MzgsLTQ1OTU3Njg5NSl8MDtFPURkKGZ8MCxDfDAsbXwwLEV8MCl8MDt2PURkKEV8MCxDfDAsKEh8bCleKHN8cCleKG98cil8MCx2fDApfDA7dj1EZCh2fDAsQ3wwLChiXkIpJkleYnwwLChBXkspJkdeQXwwKXwwO3I9QztvPUdkKHV8MCx5fDAsMjgpfDA7cD1DO3M9SGQodXwwLHl8MCwzNil8MDtwPXB8QztsPUdkKHV8MCx5fDAsMzQpfDA7SD1DO0U9SGQodXwwLHl8MCwzMCl8MDtIPXBeKEh8Qyk7cD1HZCh1fDAseXwwLDM5KXwwO209QztmPUhkKHV8MCx5fDAsMjUpfDA7bT1EZCgoTHx4KSZ1fEwmeHwwLChEfEYpJnl8RCZGfDAsKG98cyleKGx8RSleKHB8Zil8MCxIXihtfEMpfDApfDA7SD1DO0o9RGQoTXwwLEp8MCx2fDAscnwwKXwwO009QztyPURkKG18MCxIfDAsdnwwLHJ8MCl8MDt2PUM7SD1HZChKfDAsTXwwLDE0KXwwO209QztmPUhkKEp8MCxNfDAsNTApfDA7bT1tfEM7cD1HZChKfDAsTXwwLDE4KXwwO0U9QztsPUhkKEp8MCxNfDAsNDYpfDA7RT1tXihFfEMpO209R2QoSnwwLE18MCw0MSl8MDtzPUM7bz1IZChKfDAsTXwwLDIzKXwwO3M9RV4oc3xDKTtFPWcrMTM2fDA7aj1jW0U+PjJdfDA7RT1jW0UrND4+Ml18MDtBPURkKGJ8MCxBfDAsOTQ0NzExMTM5LC0yNzI3NDI1MjIpfDA7RT1EZChBfDAsQ3wwLGp8MCxFfDApfDA7cz1EZChFfDAsQ3wwLChIfGYpXihwfGwpXihtfG8pfDAsc3wwKXwwO3M9RGQoc3wwLEN8MCwoQl5JKSZKXkJ8MCwoS15HKSZNXkt8MCl8MDtvPUM7bT1HZChyfDAsdnwwLDI4KXwwO2w9QztwPUhkKHJ8MCx2fDAsMzYpfDA7bD1sfEM7Zj1HZChyfDAsdnwwLDM0KXwwO0g9QztFPUhkKHJ8MCx2fDAsMzApfDA7SD1sXihIfEMpO2w9R2QocnwwLHZ8MCwzOSl8MDtqPUM7QT1IZChyfDAsdnwwLDI1KXwwO2o9RGQoKHh8dSkmcnx4JnV8MCwoRnx5KSZ2fEYmeXwwLChtfHApXihmfEUpXihsfEEpfDAsSF4oanxDKXwwKXwwO0g9QztEPURkKEx8MCxEfDAsc3wwLG98MCl8MDtMPUM7bz1EZChqfDAsSHwwLHN8MCxvfDApfDA7cz1DO0g9R2QoRHwwLEx8MCwxNCl8MDtqPUM7QT1IZChEfDAsTHwwLDUwKXwwO2o9anxDO2w9R2QoRHwwLEx8MCwxOCl8MDtFPUM7Zj1IZChEfDAsTHwwLDQ2KXwwO0U9al4oRXxDKTtqPUdkKER8MCxMfDAsNDEpfDA7cD1DO209SGQoRHwwLEx8MCwyMyl8MDtwPUVeKHB8Qyk7RT1nKzE0NHwwO2I9Y1tFPj4yXXwwO0U9Y1tFKzQ+PjJdfDA7Sz1EZChCfDAsS3wwLC0xOTUzNzA0NTIzLDI2NDM0NzA3OCl8MDtFPURkKEt8MCxDfDAsYnwwLEV8MCl8MDtwPURkKEV8MCxDfDAsKEh8QSleKGx8ZileKGp8bSl8MCxwfDApfDA7cD1EZChwfDAsQ3wwLChJXkopJkReSXwwLChHXk0pJkxeR3wwKXwwO209QztqPUdkKG98MCxzfDAsMjgpfDA7Zj1DO2w9SGQob3wwLHN8MCwzNil8MDtmPWZ8QztBPUdkKG98MCxzfDAsMzQpfDA7SD1DO0U9SGQob3wwLHN8MCwzMCl8MDtIPWZeKEh8Qyk7Zj1HZChvfDAsc3wwLDM5KXwwO2I9QztLPUhkKG98MCxzfDAsMjUpfDA7Yj1EZCgodXxyKSZvfHUmcnwwLCh5fHYpJnN8eSZ2fDAsKGp8bCleKEF8RSleKGZ8Syl8MCxIXihifEMpfDApfDA7SD1DO0Y9RGQoeHwwLEZ8MCxwfDAsbXwwKXwwO3g9QzttPURkKGJ8MCxIfDAscHwwLG18MCl8MDtwPUM7SD1HZChGfDAseHwwLDE0KXwwO2I9QztLPUhkKEZ8MCx4fDAsNTApfDA7Yj1ifEM7Zj1HZChGfDAseHwwLDE4KXwwO0U9QztBPUhkKEZ8MCx4fDAsNDYpfDA7RT1iXihFfEMpO2I9R2QoRnwwLHh8MCw0MSl8MDtsPUM7aj1IZChGfDAseHwwLDIzKXwwO2w9RV4obHxDKTtFPWcrMTUyfDA7Qj1jW0U+PjJdfDA7RT1jW0UrND4+Ml18MDtHPURkKEl8MCxHfDAsMjAwNzgwMDkzMyw2MDQ4MDc2MjgpfDA7RT1EZChHfDAsQ3wwLEJ8MCxFfDApfDA7bD1EZChFfDAsQ3wwLChIfEspXihmfEEpXihifGopfDAsbHwwKXwwO2w9RGQobHwwLEN8MCwoSl5EKSZGXkp8MCwoTV5MKSZ4Xk18MCl8MDtqPUM7Yj1HZChtfDAscHwwLDI4KXwwO0E9QztmPUhkKG18MCxwfDAsMzYpfDA7QT1BfEM7Sz1HZChtfDAscHwwLDM0KXwwO0g9QztFPUhkKG18MCxwfDAsMzApfDA7SD1BXihIfEMpO0E9R2QobXwwLHB8MCwzOSl8MDtCPUM7Rz1IZChtfDAscHwwLDI1KXwwO0I9RGQoKHJ8bykmbXxyJm98MCwodnxzKSZwfHYmc3wwLChifGYpXihLfEUpXihBfEcpfDAsSF4oQnxDKXwwKXwwO0g9Qzt5PURkKHV8MCx5fDAsbHwwLGp8MCl8MDt1PUM7aj1EZChCfDAsSHwwLGx8MCxqfDApfDA7bD1DO0g9R2QoeXwwLHV8MCwxNCl8MDtCPUM7Rz1IZCh5fDAsdXwwLDUwKXwwO0I9QnxDO0E9R2QoeXwwLHV8MCwxOCl8MDtFPUM7Sz1IZCh5fDAsdXwwLDQ2KXwwO0U9Ql4oRXxDKTtCPUdkKHl8MCx1fDAsNDEpfDA7Zj1DO2I9SGQoeXwwLHV8MCwyMyl8MDtmPUVeKGZ8Qyk7RT1nKzE2MHwwO0k9Y1tFPj4yXXwwO0U9Y1tFKzQ+PjJdfDA7TT1EZChKfDAsTXwwLDE0OTU5OTA5MDEsNzcwMjU1OTgzKXwwO0U9RGQoTXwwLEN8MCxJfDAsRXwwKXwwO2Y9RGQoRXwwLEN8MCwoSHxHKV4oQXxLKV4oQnxiKXwwLGZ8MCl8MDtmPURkKGZ8MCxDfDAsKEReRikmeV5EfDAsKExeeCkmdV5MfDApfDA7Yj1DO0I9R2QoanwwLGx8MCwyOCl8MDtLPUM7QT1IZChqfDAsbHwwLDM2KXwwO0s9S3xDO0c9R2QoanwwLGx8MCwzNCl8MDtIPUM7RT1IZChqfDAsbHwwLDMwKXwwO0g9S14oSHxDKTtLPUdkKGp8MCxsfDAsMzkpfDA7ST1DO009SGQoanwwLGx8MCwyNSl8MDtJPURkKChvfG0pJmp8byZtfDAsKHN8cCkmbHxzJnB8MCwoQnxBKV4oR3xFKV4oS3xNKXwwLEheKEl8Qyl8MCl8MDtIPUM7dj1EZChyfDAsdnwwLGZ8MCxifDApfDA7cj1DO2I9RGQoSXwwLEh8MCxmfDAsYnwwKXwwO2Y9QztIPUdkKHZ8MCxyfDAsMTQpfDA7ST1DO009SGQodnwwLHJ8MCw1MCl8MDtJPUl8QztLPUdkKHZ8MCxyfDAsMTgpfDA7RT1DO0c9SGQodnwwLHJ8MCw0Nil8MDtFPUleKEV8Qyk7ST1HZCh2fDAscnwwLDQxKXwwO0E9QztCPUhkKHZ8MCxyfDAsMjMpfDA7QT1FXihBfEMpO0U9ZysxNjh8MDtKPWNbRT4+Ml18MDtFPWNbRSs0Pj4yXXwwO0w9RGQoRHwwLEx8MCwxODU2NDMxMjM1LDEyNDkxNTAxMjIpfDA7RT1EZChMfDAsQ3wwLEp8MCxFfDApfDA7QT1EZChFfDAsQ3wwLChIfE0pXihLfEcpXihJfEIpfDAsQXwwKXwwO0E9RGQoQXwwLEN8MCwoRl55KSZ2XkZ8MCwoeF51KSZyXnh8MCl8MDtCPUM7ST1HZChifDAsZnwwLDI4KXwwO0c9QztLPUhkKGJ8MCxmfDAsMzYpfDA7Rz1HfEM7TT1HZChifDAsZnwwLDM0KXwwO0g9QztFPUhkKGJ8MCxmfDAsMzApfDA7SD1HXihIfEMpO0c9R2QoYnwwLGZ8MCwzOSl8MDtKPUM7TD1IZChifDAsZnwwLDI1KXwwO0o9RGQoKG18aikmYnxtJmp8MCwocHxsKSZmfHAmbHwwLChJfEspXihNfEUpXihHfEwpfDAsSF4oSnxDKXwwKXwwO0g9QztzPURkKG98MCxzfDAsQXwwLEJ8MCl8MDtvPUM7Qj1EZChKfDAsSHwwLEF8MCxCfDApfDA7QT1DO0g9R2Qoc3wwLG98MCwxNCl8MDtKPUM7TD1IZChzfDAsb3wwLDUwKXwwO0o9SnxDO0c9R2Qoc3wwLG98MCwxOCl8MDtFPUM7TT1IZChzfDAsb3wwLDQ2KXwwO0U9Sl4oRXxDKTtKPUdkKHN8MCxvfDAsNDEpfDA7Sz1DO0k9SGQoc3wwLG98MCwyMyl8MDtLPUVeKEt8Qyk7RT1nKzE3NnwwO0Q9Y1tFPj4yXXwwO0U9Y1tFKzQ+PjJdfDA7eD1EZChGfDAseHwwLC0xMTE5NzQ5MTY0LDE1NTUwODE2OTIpfDA7RT1EZCh4fDAsQ3wwLER8MCxFfDApfDA7Sz1EZChFfDAsQ3wwLChIfEwpXihHfE0pXihKfEkpfDAsS3wwKXwwO0s9RGQoS3wwLEN8MCwoeV52KSZzXnl8MCwodV5yKSZvXnV8MCl8MDtJPUM7Sj1HZChCfDAsQXwwLDI4KXwwO009QztHPUhkKEJ8MCxBfDAsMzYpfDA7TT1NfEM7TD1HZChCfDAsQXwwLDM0KXwwO0g9QztFPUhkKEJ8MCxBfDAsMzApfDA7SD1NXihIfEMpO009R2QoQnwwLEF8MCwzOSl8MDtEPUM7eD1IZChCfDAsQXwwLDI1KXwwO0Q9RGQoKGp8YikmQnxqJmJ8MCwobHxmKSZBfGwmZnwwLChKfEcpXihMfEUpXihNfHgpfDAsSF4oRHxDKXwwKXwwO0g9QztwPURkKG18MCxwfDAsS3wwLEl8MCl8MDttPUM7ST1EZChEfDAsSHwwLEt8MCxJfDApfDA7Sz1DO0g9R2QocHwwLG18MCwxNCl8MDtEPUM7eD1IZChwfDAsbXwwLDUwKXwwO0Q9RHxDO009R2QocHwwLG18MCwxOCl8MDtFPUM7TD1IZChwfDAsbXwwLDQ2KXwwO0U9RF4oRXxDKTtEPUdkKHB8MCxtfDAsNDEpfDA7Rz1DO0o9SGQocHwwLG18MCwyMyl8MDtHPUVeKEd8Qyk7RT1nKzE4NHwwO0Y9Y1tFPj4yXXwwO0U9Y1tFKzQ+PjJdfDA7dT1EZCh5fDAsdXwwLC0yMDk2MDE2NDU5LDE5OTYwNjQ5ODYpfDA7RT1EZCh1fDAsQ3wwLEZ8MCxFfDApfDA7Rz1EZChFfDAsQ3wwLChIfHgpXihNfEwpXihEfEopfDAsR3wwKXwwO0c9RGQoR3wwLEN8MCwodl5zKSZwXnZ8MCwocl5vKSZtXnJ8MCl8MDtKPUM7RD1HZChJfDAsS3wwLDI4KXwwO0w9QztNPUhkKEl8MCxLfDAsMzYpfDA7TD1MfEM7eD1HZChJfDAsS3wwLDM0KXwwO0g9QztFPUhkKEl8MCxLfDAsMzApfDA7SD1MXihIfEMpO0w9R2QoSXwwLEt8MCwzOSl8MDtGPUM7dT1IZChJfDAsS3wwLDI1KXwwO0Y9RGQoKGJ8QikmSXxiJkJ8MCwoZnxBKSZLfGYmQXwwLChEfE0pXih4fEUpXihMfHUpfDAsSF4oRnxDKXwwKXwwO0g9QztsPURkKGp8MCxsfDAsR3wwLEp8MCl8MDtqPUM7Sj1EZChGfDAsSHwwLEd8MCxKfDApfDA7Rz1DO0g9R2QobHwwLGp8MCwxNCl8MDtGPUM7dT1IZChsfDAsanwwLDUwKXwwO0Y9RnxDO0w9R2QobHwwLGp8MCwxOCl8MDtFPUM7eD1IZChsfDAsanwwLDQ2KXwwO0U9Rl4oRXxDKTtGPUdkKGx8MCxqfDAsNDEpfDA7TT1DO0Q9SGQobHwwLGp8MCwyMyl8MDtNPUVeKE18Qyk7RT1nKzE5MnwwO3k9Y1tFPj4yXXwwO0U9Y1tFKzQ+PjJdfDA7cj1EZCh2fDAscnwwLC0yOTUyNDc5NTcsLTE3NDA3NDY0MTQpfDA7RT1EZChyfDAsQ3wwLHl8MCxFfDApfDA7TT1EZChFfDAsQ3wwLChIfHUpXihMfHgpXihGfEQpfDAsTXwwKXwwO009RGQoTXwwLEN8MCwoc15wKSZsXnN8MCwob15tKSZqXm98MCl8MDtEPUM7Rj1HZChKfDAsR3wwLDI4KXwwO3g9QztMPUhkKEp8MCxHfDAsMzYpfDA7eD14fEM7dT1HZChKfDAsR3wwLDM0KXwwO0g9QztFPUhkKEp8MCxHfDAsMzApfDA7SD14XihIfEMpO3g9R2QoSnwwLEd8MCwzOSl8MDt5PUM7cj1IZChKfDAsR3wwLDI1KXwwO3k9RGQoKEJ8SSkmSnxCJkl8MCwoQXxLKSZHfEEmS3wwLChGfEwpXih1fEUpXih4fHIpfDAsSF4oeXxDKXwwKXwwO0g9QztmPURkKGJ8MCxmfDAsTXwwLER8MCl8MDtiPUM7RD1EZCh5fDAsSHwwLE18MCxEfDApfDA7TT1DO0g9R2QoZnwwLGJ8MCwxNCl8MDt5PUM7cj1IZChmfDAsYnwwLDUwKXwwO3k9eXxDO3g9R2QoZnwwLGJ8MCwxOCl8MDtFPUM7dT1IZChmfDAsYnwwLDQ2KXwwO0U9eV4oRXxDKTt5PUdkKGZ8MCxifDAsNDEpfDA7TD1DO0Y9SGQoZnwwLGJ8MCwyMyl8MDtMPUVeKEx8Qyk7RT1nKzIwMHwwO3Y9Y1tFPj4yXXwwO0U9Y1tFKzQ+PjJdfDA7bz1EZChzfDAsb3wwLDc2Njc4NDAxNiwtMTQ3MzEzMjk0Nyl8MDtFPURkKG98MCxDfDAsdnwwLEV8MCl8MDtMPURkKEV8MCxDfDAsKEh8cileKHh8dSleKHl8Ril8MCxMfDApfDA7TD1EZChMfDAsQ3wwLChwXmwpJmZecHwwLChtXmopJmJebXwwKXwwO0Y9Qzt5PUdkKER8MCxNfDAsMjgpfDA7dT1DO3g9SGQoRHwwLE18MCwzNil8MDt1PXV8QztyPUdkKER8MCxNfDAsMzQpfDA7SD1DO0U9SGQoRHwwLE18MCwzMCl8MDtIPXVeKEh8Qyk7dT1HZChEfDAsTXwwLDM5KXwwO3Y9QztvPUhkKER8MCxNfDAsMjUpfDA7dj1EZCgoSXxKKSZEfEkmSnwwLChLfEcpJk18SyZHfDAsKHl8eCleKHJ8RSleKHV8byl8MCxIXih2fEMpfDApfDA7SD1DO0E9RGQoQnwwLEF8MCxMfDAsRnwwKXwwO0I9QztGPURkKHZ8MCxIfDAsTHwwLEZ8MCl8MDtMPUM7SD1HZChBfDAsQnwwLDE0KXwwO3Y9QztvPUhkKEF8MCxCfDAsNTApfDA7dj12fEM7dT1HZChBfDAsQnwwLDE4KXwwO0U9QztyPUhkKEF8MCxCfDAsNDYpfDA7RT12XihFfEMpO3Y9R2QoQXwwLEJ8MCw0MSl8MDt4PUM7eT1IZChBfDAsQnwwLDIzKXwwO3g9RV4oeHxDKTtFPWcrMjA4fDA7cz1jW0U+PjJdfDA7RT1jW0UrND4+Ml18MDttPURkKHB8MCxtfDAsLTE3MjgzNzI0MTcsLTEzNDE5NzA0ODgpfDA7RT1EZChtfDAsQ3wwLHN8MCxFfDApfDA7eD1EZChFfDAsQ3wwLChIfG8pXih1fHIpXih2fHkpfDAseHwwKXwwO3g9RGQoeHwwLEN8MCwobF5mKSZBXmx8MCwoal5iKSZCXmp8MCl8MDt5PUM7dj1HZChGfDAsTHwwLDI4KXwwO3I9Qzt1PUhkKEZ8MCxMfDAsMzYpfDA7cj1yfEM7bz1HZChGfDAsTHwwLDM0KXwwO0g9QztFPUhkKEZ8MCxMfDAsMzApfDA7SD1yXihIfEMpO3I9R2QoRnwwLEx8MCwzOSl8MDtzPUM7bT1IZChGfDAsTHwwLDI1KXwwO3M9RGQoKEp8RCkmRnxKJkR8MCwoR3xNKSZMfEcmTXwwLCh2fHUpXihvfEUpXihyfG0pfDAsSF4oc3xDKXwwKXwwO0g9QztLPURkKEl8MCxLfDAseHwwLHl8MCl8MDtJPUM7eT1EZChzfDAsSHwwLHh8MCx5fDApfDA7eD1DO0g9R2QoS3wwLEl8MCwxNCl8MDtzPUM7bT1IZChLfDAsSXwwLDUwKXwwO3M9c3xDO3I9R2QoS3wwLEl8MCwxOCl8MDtFPUM7bz1IZChLfDAsSXwwLDQ2KXwwO0U9c14oRXxDKTtzPUdkKEt8MCxJfDAsNDEpfDA7dT1DO3Y9SGQoS3wwLEl8MCwyMyl8MDt1PUVeKHV8Qyk7RT1nKzIxNnwwO3A9Y1tFPj4yXXwwO0U9Y1tFKzQ+PjJdfDA7aj1EZChsfDAsanwwLC0xMDkxNjI5MzQwLC0xMDg0NjUzNjI1KXwwO0U9RGQoanwwLEN8MCxwfDAsRXwwKXwwO3U9RGQoRXwwLEN8MCwoSHxtKV4ocnxvKV4oc3x2KXwwLHV8MCl8MDt1PURkKHV8MCxDfDAsKGZeQSkmS15mfDAsKGJeQikmSV5ifDApfDA7dj1DO3M9R2QoeXwwLHh8MCwyOCl8MDtvPUM7cj1IZCh5fDAseHwwLDM2KXwwO289b3xDO209R2QoeXwwLHh8MCwzNCl8MDtIPUM7RT1IZCh5fDAseHwwLDMwKXwwO0g9b14oSHxDKTtvPUdkKHl8MCx4fDAsMzkpfDA7cD1DO2o9SGQoeXwwLHh8MCwyNSl8MDtwPURkKChEfEYpJnl8RCZGfDAsKE18TCkmeHxNJkx8MCwoc3xyKV4obXxFKV4ob3xqKXwwLEheKHB8Qyl8MCl8MDtIPUM7Rz1EZChKfDAsR3wwLHV8MCx2fDApfDA7Sj1DO3Y9RGQocHwwLEh8MCx1fDAsdnwwKXwwO3U9QztIPUdkKEd8MCxKfDAsMTQpfDA7cD1DO2o9SGQoR3wwLEp8MCw1MCl8MDtwPXB8QztvPUdkKEd8MCxKfDAsMTgpfDA7RT1DO209SGQoR3wwLEp8MCw0Nil8MDtFPXBeKEV8Qyk7cD1HZChHfDAsSnwwLDQxKXwwO3I9QztzPUhkKEd8MCxKfDAsMjMpfDA7cj1FXihyfEMpO0U9ZysyMjR8MDtsPWNbRT4+Ml18MDtFPWNbRSs0Pj4yXXwwO2I9RGQoZnwwLGJ8MCwxMDM0NDU3MDI2LC05NTgzOTU0MDUpfDA7RT1EZChifDAsQ3wwLGx8MCxFfDApfDA7cj1EZChFfDAsQ3wwLChIfGopXihvfG0pXihwfHMpfDAscnwwKXwwO3I9RGQocnwwLEN8MCwoQV5LKSZHXkF8MCwoQl5JKSZKXkJ8MCl8MDtzPUM7cD1HZCh2fDAsdXwwLDI4KXwwO209QztvPUhkKHZ8MCx1fDAsMzYpfDA7bT1tfEM7aj1HZCh2fDAsdXwwLDM0KXwwO0g9QztFPUhkKHZ8MCx1fDAsMzApfDA7SD1tXihIfEMpO209R2QodnwwLHV8MCwzOSl8MDtsPUM7Yj1IZCh2fDAsdXwwLDI1KXwwO2w9RGQoKEZ8eSkmdnxGJnl8MCwoTHx4KSZ1fEwmeHwwLChwfG8pXihqfEUpXihtfGIpfDAsSF4obHxDKXwwKXwwO0g9QztNPURkKER8MCxNfDAscnwwLHN8MCl8MDtEPUM7cz1EZChsfDAsSHwwLHJ8MCxzfDApfDA7cj1DO0g9R2QoTXwwLER8MCwxNCl8MDtsPUM7Yj1IZChNfDAsRHwwLDUwKXwwO2w9bHxDO209R2QoTXwwLER8MCwxOCl8MDtFPUM7aj1IZChNfDAsRHwwLDQ2KXwwO0U9bF4oRXxDKTtsPUdkKE18MCxEfDAsNDEpfDA7bz1DO3A9SGQoTXwwLER8MCwyMyl8MDtvPUVeKG98Qyk7RT1nKzIzMnwwO2Y9Y1tFPj4yXXwwO0U9Y1tFKzQ+PjJdfDA7Qj1EZChBfDAsQnwwLC0xODI4MDE4Mzk1LC03MTA0Mzg1ODUpfDA7RT1EZChCfDAsQ3wwLGZ8MCxFfDApfDA7bz1EZChFfDAsQ3wwLChIfGIpXihtfGopXihsfHApfDAsb3wwKXwwO289RGQob3wwLEN8MCwoS15HKSZNXkt8MCwoSV5KKSZEXkl8MCl8MDtwPUM7bD1HZChzfDAscnwwLDI4KXwwO2o9QzttPUhkKHN8MCxyfDAsMzYpfDA7aj1qfEM7Yj1HZChzfDAscnwwLDM0KXwwO0g9QztFPUhkKHN8MCxyfDAsMzApfDA7SD1qXihIfEMpO2o9R2Qoc3wwLHJ8MCwzOSl8MDtmPUM7Qj1IZChzfDAscnwwLDI1KXwwO2Y9RGQoKHl8dikmc3x5JnZ8MCwoeHx1KSZyfHgmdXwwLChsfG0pXihifEUpXihqfEIpfDAsSF4oZnxDKXwwKXwwO0g9QztMPURkKEZ8MCxMfDAsb3wwLHB8MCl8MDtGPUM7cD1EZChmfDAsSHwwLG98MCxwfDApfDA7bz1DO0g9R2QoTHwwLEZ8MCwxNCl8MDtmPUM7Qj1IZChMfDAsRnwwLDUwKXwwO2Y9ZnxDO2o9R2QoTHwwLEZ8MCwxOCl8MDtFPUM7Yj1IZChMfDAsRnwwLDQ2KXwwO0U9Zl4oRXxDKTtmPUdkKEx8MCxGfDAsNDEpfDA7bT1DO2w9SGQoTHwwLEZ8MCwyMyl8MDttPUVeKG18Qyk7RT1nKzI0MHwwO0E9Y1tFPj4yXXwwO0U9Y1tFKzQ+PjJdfDA7ST1EZChLfDAsSXwwLC01MzY2NDA5MTMsMTEzOTI2OTkzKXwwO0U9RGQoSXwwLEN8MCxBfDAsRXwwKXwwO209RGQoRXwwLEN8MCwoSHxCKV4oanxiKV4oZnxsKXwwLG18MCl8MDttPURkKG18MCxDfDAsKEdeTSkmTF5HfDAsKEpeRCkmRl5KfDApfDA7bD1DO2Y9R2QocHwwLG98MCwyOCl8MDtiPUM7aj1IZChwfDAsb3wwLDM2KXwwO2I9YnxDO0I9R2QocHwwLG98MCwzNCl8MDtIPUM7RT1IZChwfDAsb3wwLDMwKXwwO0g9Yl4oSHxDKTtiPUdkKHB8MCxvfDAsMzkpfDA7QT1DO0k9SGQocHwwLG98MCwyNSl8MDtBPURkKCh2fHMpJnB8diZzfDAsKHV8cikmb3x1JnJ8MCwoZnxqKV4oQnxFKV4oYnxJKXwwLEheKEF8Qyl8MCl8MDtIPUM7eD1EZCh5fDAseHwwLG18MCxsfDApfDA7eT1DO2w9RGQoQXwwLEh8MCxtfDAsbHwwKXwwO209QztIPUdkKHh8MCx5fDAsMTQpfDA7QT1DO0k9SGQoeHwwLHl8MCw1MCl8MDtBPUF8QztiPUdkKHh8MCx5fDAsMTgpfDA7RT1DO0I9SGQoeHwwLHl8MCw0Nil8MDtFPUFeKEV8Qyk7QT1HZCh4fDAseXwwLDQxKXwwO2o9QztmPUhkKHh8MCx5fDAsMjMpfDA7aj1FXihqfEMpO0U9ZysyNDh8MDtLPWNbRT4+Ml18MDtFPWNbRSs0Pj4yXXwwO0o9RGQoR3wwLEp8MCwxNjg3MTc5MzYsMzM4MjQxODk1KXwwO0U9RGQoSnwwLEN8MCxLfDAsRXwwKXwwO2o9RGQoRXwwLEN8MCwoSHxJKV4oYnxCKV4oQXxmKXwwLGp8MCl8MDtqPURkKGp8MCxDfDAsKE1eTCkmeF5NfDAsKEReRikmeV5EfDApfDA7Zj1DO0E9R2QobHwwLG18MCwyOCl8MDtCPUM7Yj1IZChsfDAsbXwwLDM2KXwwO0I9QnxDO0k9R2QobHwwLG18MCwzNCl8MDtIPUM7RT1IZChsfDAsbXwwLDMwKXwwO0g9Ql4oSHxDKTtCPUdkKGx8MCxtfDAsMzkpfDA7Sz1DO0o9SGQobHwwLG18MCwyNSl8MDtLPURkKChzfHApJmx8cyZwfDAsKHJ8bykmbXxyJm98MCwoQXxiKV4oSXxFKV4oQnxKKXwwLEheKEt8Qyl8MCl8MDtIPUM7dT1EZCh2fDAsdXwwLGp8MCxmfDApfDA7dj1DO2Y9RGQoS3wwLEh8MCxqfDAsZnwwKXwwO2o9QztIPUdkKHV8MCx2fDAsMTQpfDA7Sz1DO0o9SGQodXwwLHZ8MCw1MCl8MDtLPUt8QztCPUdkKHV8MCx2fDAsMTgpfDA7RT1DO0k9SGQodXwwLHZ8MCw0Nil8MDtFPUteKEV8Qyk7Sz1HZCh1fDAsdnwwLDQxKXwwO2I9QztBPUhkKHV8MCx2fDAsMjMpfDA7Yj1FXihifEMpO0U9ZysyNTZ8MDtHPWNbRT4+Ml18MDtFPWNbRSs0Pj4yXXwwO0Q9RGQoTXwwLER8MCwxMTg4MTc5OTY0LDY2NjMwNzIwNSl8MDtFPURkKER8MCxDfDAsR3wwLEV8MCl8MDtiPURkKEV8MCxDfDAsKEh8SileKEJ8SSleKEt8QSl8MCxifDApfDA7Yj1EZChifDAsQ3wwLChMXngpJnVeTHwwLChGXnkpJnZeRnwwKXwwO0E9QztLPUdkKGZ8MCxqfDAsMjgpfDA7ST1DO0I9SGQoZnwwLGp8MCwzNil8MDtJPUl8QztKPUdkKGZ8MCxqfDAsMzQpfDA7SD1DO0U9SGQoZnwwLGp8MCwzMCl8MDtIPUleKEh8Qyk7ST1HZChmfDAsanwwLDM5KXwwO0c9QztEPUhkKGZ8MCxqfDAsMjUpfDA7Rz1EZCgocHxsKSZmfHAmbHwwLChvfG0pJmp8byZtfDAsKEt8QileKEp8RSleKEl8RCl8MCxIXihHfEMpfDApfDA7SD1DO3I9RGQoc3wwLHJ8MCxifDAsQXwwKXwwO3M9QztBPURkKEd8MCxIfDAsYnwwLEF8MCl8MDtiPUM7SD1HZChyfDAsc3wwLDE0KXwwO0c9QztEPUhkKHJ8MCxzfDAsNTApfDA7Rz1HfEM7ST1HZChyfDAsc3wwLDE4KXwwO0U9QztKPUhkKHJ8MCxzfDAsNDYpfDA7RT1HXihFfEMpO0c9R2QocnwwLHN8MCw0MSl8MDtCPUM7Sz1IZChyfDAsc3wwLDIzKXwwO0I9RV4oQnxDKTtFPWcrMjY0fDA7TT1jW0U+PjJdfDA7RT1jW0UrND4+Ml18MDtGPURkKEx8MCxGfDAsMTU0NjA0NTczNCw3NzM1Mjk5MTIpfDA7RT1EZChGfDAsQ3wwLE18MCxFfDApfDA7Qj1EZChFfDAsQ3wwLChIfEQpXihJfEopXihHfEspfDAsQnwwKXwwO0I9RGQoQnwwLEN8MCwoeF51KSZyXnh8MCwoeV52KSZzXnl8MCl8MDtLPUM7Rz1HZChBfDAsYnwwLDI4KXwwO0o9QztJPUhkKEF8MCxifDAsMzYpfDA7Sj1KfEM7RD1HZChBfDAsYnwwLDM0KXwwO0g9QztFPUhkKEF8MCxifDAsMzApfDA7SD1KXihIfEMpO0o9R2QoQXwwLGJ8MCwzOSl8MDtNPUM7Rj1IZChBfDAsYnwwLDI1KXwwO009RGQoKGx8ZikmQXxsJmZ8MCwobXxqKSZifG0manwwLChHfEkpXihEfEUpXihKfEYpfDAsSF4oTXxDKXwwKXwwO0g9QztvPURkKHB8MCxvfDAsQnwwLEt8MCl8MDtwPUM7Sz1EZChNfDAsSHwwLEJ8MCxLfDApfDA7Qj1DO0g9R2Qob3wwLHB8MCwxNCl8MDtNPUM7Rj1IZChvfDAscHwwLDUwKXwwO009TXxDO0o9R2Qob3wwLHB8MCwxOCl8MDtFPUM7RD1IZChvfDAscHwwLDQ2KXwwO0U9TV4oRXxDKTtNPUdkKG98MCxwfDAsNDEpfDA7ST1DO0c9SGQob3wwLHB8MCwyMyl8MDtJPUVeKEl8Qyk7RT1nKzI3MnwwO0w9Y1tFPj4yXXwwO0U9Y1tFKzQ+PjJdfDA7eT1EZCh4fDAseXwwLDE1MjI4MDU0ODUsMTI5NDc1NzM3Mil8MDtFPURkKHl8MCxDfDAsTHwwLEV8MCl8MDtJPURkKEV8MCxDfDAsKEh8RileKEp8RCleKE18Ryl8MCxJfDApfDA7ST1EZChJfDAsQ3wwLCh1XnIpJm9edXwwLCh2XnMpJnBednwwKXwwO0c9QztNPUdkKEt8MCxCfDAsMjgpfDA7RD1DO0o9SGQoS3wwLEJ8MCwzNil8MDtEPUR8QztGPUdkKEt8MCxCfDAsMzQpfDA7SD1DO0U9SGQoS3wwLEJ8MCwzMCl8MDtIPUReKEh8Qyk7RD1HZChLfDAsQnwwLDM5KXwwO0w9Qzt5PUhkKEt8MCxCfDAsMjUpfDA7TD1EZCgoZnxBKSZLfGYmQXwwLChqfGIpJkJ8aiZifDAsKE18SileKEZ8RSleKER8eSl8MCxIXihMfEMpfDApfDA7SD1DO209RGQobHwwLG18MCxJfDAsR3wwKXwwO2w9QztHPURkKEx8MCxIfDAsSXwwLEd8MCl8MDtJPUM7SD1HZChtfDAsbHwwLDE0KXwwO0w9Qzt5PUhkKG18MCxsfDAsNTApfDA7TD1MfEM7RD1HZChtfDAsbHwwLDE4KXwwO0U9QztGPUhkKG18MCxsfDAsNDYpfDA7RT1MXihFfEMpO0w9R2QobXwwLGx8MCw0MSl8MDtKPUM7TT1IZChtfDAsbHwwLDIzKXwwO0o9RV4oSnxDKTtFPWcrMjgwfDA7eD1jW0U+PjJdfDA7RT1jW0UrND4+Ml18MDt2PURkKHV8MCx2fDAsLTE2NTExMzM0NzMsMTM5NjE4MjI5MSl8MDtFPURkKHZ8MCxDfDAseHwwLEV8MCl8MDtKPURkKEV8MCxDfDAsKEh8eSleKER8RileKEx8TSl8MCxKfDApfDA7Sj1EZChKfDAsQ3wwLChyXm8pJm1ecnwwLChzXnApJmxec3wwKXwwO009QztMPUdkKEd8MCxJfDAsMjgpfDA7Rj1DO0Q9SGQoR3wwLEl8MCwzNil8MDtGPUZ8Qzt5PUdkKEd8MCxJfDAsMzQpfDA7SD1DO0U9SGQoR3wwLEl8MCwzMCl8MDtIPUZeKEh8Qyk7Rj1HZChHfDAsSXwwLDM5KXwwO3g9Qzt2PUhkKEd8MCxJfDAsMjUpfDA7eD1EZCgoQXxLKSZHfEEmS3wwLChifEIpJkl8YiZCfDAsKEx8RCleKHl8RSleKEZ8dil8MCxIXih4fEMpfDApfDA7SD1DO2o9RGQoZnwwLGp8MCxKfDAsTXwwKXwwO2Y9QztNPURkKHh8MCxIfDAsSnwwLE18MCl8MDtKPUM7SD1HZChqfDAsZnwwLDE0KXwwO3g9Qzt2PUhkKGp8MCxmfDAsNTApfDA7eD14fEM7Rj1HZChqfDAsZnwwLDE4KXwwO0U9Qzt5PUhkKGp8MCxmfDAsNDYpfDA7RT14XihFfEMpO3g9R2QoanwwLGZ8MCw0MSl8MDtEPUM7TD1IZChqfDAsZnwwLDIzKXwwO0Q9RV4oRHxDKTtFPWcrMjg4fDA7dT1jW0U+PjJdfDA7RT1jW0UrND4+Ml18MDtzPURkKHJ8MCxzfDAsLTE5NTE0Mzk5MDYsMTY5NTE4MzcwMCl8MDtFPURkKHN8MCxDfDAsdXwwLEV8MCl8MDtEPURkKEV8MCxDfDAsKEh8dileKEZ8eSleKHh8TCl8MCxEfDApfDA7RD1EZChEfDAsQ3wwLChvXm0pJmpeb3wwLChwXmwpJmZecHwwKXwwO0w9Qzt4PUdkKE18MCxKfDAsMjgpfDA7eT1DO0Y9SGQoTXwwLEp8MCwzNil8MDt5PXl8Qzt2PUdkKE18MCxKfDAsMzQpfDA7SD1DO0U9SGQoTXwwLEp8MCwzMCl8MDtIPXleKEh8Qyk7eT1HZChNfDAsSnwwLDM5KXwwO3U9QztzPUhkKE18MCxKfDAsMjUpfDA7dT1EZCgoS3xHKSZNfEsmR3wwLChCfEkpJkp8QiZJfDAsKHh8RileKHZ8RSleKHl8cyl8MCxIXih1fEMpfDApfDA7SD1DO2I9RGQoQXwwLGJ8MCxEfDAsTHwwKXwwO0E9QztMPURkKHV8MCxIfDAsRHwwLEx8MCl8MDtEPUM7SD1HZChifDAsQXwwLDE0KXwwO3U9QztzPUhkKGJ8MCxBfDAsNTApfDA7dT11fEM7eT1HZChifDAsQXwwLDE4KXwwO0U9Qzt2PUhkKGJ8MCxBfDAsNDYpfDA7RT11XihFfEMpO3U9R2QoYnwwLEF8MCw0MSl8MDtGPUM7eD1IZChifDAsQXwwLDIzKXwwO0Y9RV4oRnxDKTtFPWcrMjk2fDA7cj1jW0U+PjJdfDA7RT1jW0UrND4+Ml18MDtwPURkKG98MCxwfDAsMTAxNDQ3NzQ4MCwxOTg2NjYxMDUxKXwwO0U9RGQocHwwLEN8MCxyfDAsRXwwKXwwO0Y9RGQoRXwwLEN8MCwoSHxzKV4oeXx2KV4odXx4KXwwLEZ8MCl8MDtGPURkKEZ8MCxDfDAsKG1eaikmYl5tfDAsKGxeZikmQV5sfDApfDA7eD1DO3U9R2QoTHwwLER8MCwyOCl8MDt2PUM7eT1IZChMfDAsRHwwLDM2KXwwO3Y9dnxDO3M9R2QoTHwwLER8MCwzNCl8MDtIPUM7RT1IZChMfDAsRHwwLDMwKXwwO0g9dl4oSHxDKTt2PUdkKEx8MCxEfDAsMzkpfDA7cj1DO3A9SGQoTHwwLER8MCwyNSl8MDtyPURkKChHfE0pJkx8RyZNfDAsKEl8SikmRHxJJkp8MCwodXx5KV4oc3xFKV4odnxwKXwwLEheKHJ8Qyl8MCl8MDtIPUM7Qj1EZChLfDAsQnwwLEZ8MCx4fDApfDA7Sz1DO3g9RGQocnwwLEh8MCxGfDAseHwwKXwwO0Y9QztIPUdkKEJ8MCxLfDAsMTQpfDA7cj1DO3A9SGQoQnwwLEt8MCw1MCl8MDtyPXJ8Qzt2PUdkKEJ8MCxLfDAsMTgpfDA7RT1DO3M9SGQoQnwwLEt8MCw0Nil8MDtFPXJeKEV8Qyk7cj1HZChCfDAsS3wwLDQxKXwwO3k9Qzt1PUhkKEJ8MCxLfDAsMjMpfDA7eT1FXih5fEMpO0U9ZyszMDR8MDtvPWNbRT4+Ml18MDtFPWNbRSs0Pj4yXXwwO2w9RGQobXwwLGx8MCwxMjA2NzU5MTQyLC0yMTE3OTQwOTQ2KXwwO0U9RGQobHwwLEN8MCxvfDAsRXwwKXwwO3k9RGQoRXwwLEN8MCwoSHxwKV4odnxzKV4ocnx1KXwwLHl8MCl8MDt5PURkKHl8MCxDfDAsKGpeYikmQl5qfDAsKGZeQSkmS15mfDApfDA7dT1DO3I9R2QoeHwwLEZ8MCwyOCl8MDtzPUM7dj1IZCh4fDAsRnwwLDM2KXwwO3M9c3xDO3A9R2QoeHwwLEZ8MCwzNCl8MDtIPUM7RT1IZCh4fDAsRnwwLDMwKXwwO0g9c14oSHxDKTtzPUdkKHh8MCxGfDAsMzkpfDA7bz1DO2w9SGQoeHwwLEZ8MCwyNSl8MDtvPURkKChNfEwpJnh8TSZMfDAsKEp8RCkmRnxKJkR8MCwocnx2KV4ocHxFKV4oc3xsKXwwLEheKG98Qyl8MCl8MDtIPUM7ST1EZChHfDAsSXwwLHl8MCx1fDApfDA7Rz1DO3U9RGQob3wwLEh8MCx5fDAsdXwwKXwwO3k9QztIPUdkKEl8MCxHfDAsMTQpfDA7bz1DO2w9SGQoSXwwLEd8MCw1MCl8MDtvPW98QztzPUdkKEl8MCxHfDAsMTgpfDA7RT1DO3A9SGQoSXwwLEd8MCw0Nil8MDtFPW9eKEV8Qyk7bz1HZChJfDAsR3wwLDQxKXwwO3Y9QztyPUhkKEl8MCxHfDAsMjMpfDA7dj1FXih2fEMpO0U9ZyszMTJ8MDttPWNbRT4+Ml18MDtFPWNbRSs0Pj4yXXwwO2Y9RGQoanwwLGZ8MCwzNDQwNzc2MjcsLTE4MzgwMTEyNTkpfDA7RT1EZChmfDAsQ3wwLG18MCxFfDApfDA7dj1EZChFfDAsQ3wwLChIfGwpXihzfHApXihvfHIpfDAsdnwwKXwwO3Y9RGQodnwwLEN8MCwoYl5CKSZJXmJ8MCwoQV5LKSZHXkF8MCl8MDtyPUM7bz1HZCh1fDAseXwwLDI4KXwwO3A9QztzPUhkKHV8MCx5fDAsMzYpfDA7cD1wfEM7bD1HZCh1fDAseXwwLDM0KXwwO0g9QztFPUhkKHV8MCx5fDAsMzApfDA7SD1wXihIfEMpO3A9R2QodXwwLHl8MCwzOSl8MDttPUM7Zj1IZCh1fDAseXwwLDI1KXwwO209RGQoKEx8eCkmdXxMJnh8MCwoRHxGKSZ5fEQmRnwwLChvfHMpXihsfEUpXihwfGYpfDAsSF4obXxDKXwwKXwwO0g9QztKPURkKE18MCxKfDAsdnwwLHJ8MCl8MDtNPUM7cj1EZChtfDAsSHwwLHZ8MCxyfDApfDA7dj1DO0g9R2QoSnwwLE18MCwxNCl8MDttPUM7Zj1IZChKfDAsTXwwLDUwKXwwO209bXxDO3A9R2QoSnwwLE18MCwxOCl8MDtFPUM7bD1IZChKfDAsTXwwLDQ2KXwwO0U9bV4oRXxDKTttPUdkKEp8MCxNfDAsNDEpfDA7cz1DO289SGQoSnwwLE18MCwyMyl8MDtzPUVeKHN8Qyk7RT1nKzMyMHwwO2o9Y1tFPj4yXXwwO0U9Y1tFKzQ+PjJdfDA7QT1EZChifDAsQXwwLDEyOTA4NjM0NjAsLTE1NjQ0ODEzNzUpfDA7RT1EZChBfDAsQ3wwLGp8MCxFfDApfDA7cz1EZChFfDAsQ3wwLChIfGYpXihwfGwpXihtfG8pfDAsc3wwKXwwO3M9RGQoc3wwLEN8MCwoQl5JKSZKXkJ8MCwoS15HKSZNXkt8MCl8MDtvPUM7bT1HZChyfDAsdnwwLDI4KXwwO2w9QztwPUhkKHJ8MCx2fDAsMzYpfDA7bD1sfEM7Zj1HZChyfDAsdnwwLDM0KXwwO0g9QztFPUhkKHJ8MCx2fDAsMzApfDA7SD1sXihIfEMpO2w9R2QocnwwLHZ8MCwzOSl8MDtqPUM7QT1IZChyfDAsdnwwLDI1KXwwO2o9RGQoKHh8dSkmcnx4JnV8MCwoRnx5KSZ2fEYmeXwwLChtfHApXihmfEUpXihsfEEpfDAsSF4oanxDKXwwKXwwO0g9QztEPURkKEx8MCxEfDAsc3wwLG98MCl8MDtMPUM7bz1EZChqfDAsSHwwLHN8MCxvfDApfDA7cz1DO0g9R2QoRHwwLEx8MCwxNCl8MDtqPUM7QT1IZChEfDAsTHwwLDUwKXwwO2o9anxDO2w9R2QoRHwwLEx8MCwxOCl8MDtFPUM7Zj1IZChEfDAsTHwwLDQ2KXwwO0U9al4oRXxDKTtqPUdkKER8MCxMfDAsNDEpfDA7cD1DO209SGQoRHwwLEx8MCwyMyl8MDtwPUVeKHB8Qyk7RT1nKzMyOHwwO2I9Y1tFPj4yXXwwO0U9Y1tFKzQ+PjJdfDA7Sz1EZChCfDAsS3wwLC0xMTM2NTEzMDIzLC0xNDc0NjY0ODg1KXwwO0U9RGQoS3wwLEN8MCxifDAsRXwwKXwwO3A9RGQoRXwwLEN8MCwoSHxBKV4obHxmKV4oanxtKXwwLHB8MCl8MDtwPURkKHB8MCxDfDAsKEleSikmRF5JfDAsKEdeTSkmTF5HfDApfDA7bT1DO2o9R2Qob3wwLHN8MCwyOCl8MDtmPUM7bD1IZChvfDAsc3wwLDM2KXwwO2Y9ZnxDO0E9R2Qob3wwLHN8MCwzNCl8MDtIPUM7RT1IZChvfDAsc3wwLDMwKXwwO0g9Zl4oSHxDKTtmPUdkKG98MCxzfDAsMzkpfDA7Yj1DO0s9SGQob3wwLHN8MCwyNSl8MDtiPURkKCh1fHIpJm98dSZyfDAsKHl8dikmc3x5JnZ8MCwoanxsKV4oQXxFKV4oZnxLKXwwLEheKGJ8Qyl8MCl8MDtIPUM7Rj1EZCh4fDAsRnwwLHB8MCxtfDApfDA7eD1DO209RGQoYnwwLEh8MCxwfDAsbXwwKXwwO3A9QztIPUdkKEZ8MCx4fDAsMTQpfDA7Yj1DO0s9SGQoRnwwLHh8MCw1MCl8MDtiPWJ8QztmPUdkKEZ8MCx4fDAsMTgpfDA7RT1DO0E9SGQoRnwwLHh8MCw0Nil8MDtFPWJeKEV8Qyk7Yj1HZChGfDAseHwwLDQxKXwwO2w9QztqPUhkKEZ8MCx4fDAsMjMpfDA7bD1FXihsfEMpO0U9ZyszMzZ8MDtCPWNbRT4+Ml18MDtFPWNbRSs0Pj4yXXwwO0c9RGQoSXwwLEd8MCwtNzg5MDE0NjM5LC0xMDM1MjM2NDk2KXwwO0U9RGQoR3wwLEN8MCxCfDAsRXwwKXwwO2w9RGQoRXwwLEN8MCwoSHxLKV4oZnxBKV4oYnxqKXwwLGx8MCl8MDtsPURkKGx8MCxDfDAsKEpeRCkmRl5KfDAsKE1eTCkmeF5NfDApfDA7aj1DO2I9R2QobXwwLHB8MCwyOCl8MDtBPUM7Zj1IZChtfDAscHwwLDM2KXwwO0E9QXxDO0s9R2QobXwwLHB8MCwzNCl8MDtIPUM7RT1IZChtfDAscHwwLDMwKXwwO0g9QV4oSHxDKTtBPUdkKG18MCxwfDAsMzkpfDA7Qj1DO0c9SGQobXwwLHB8MCwyNSl8MDtCPURkKChyfG8pJm18ciZvfDAsKHZ8cykmcHx2JnN8MCwoYnxmKV4oS3xFKV4oQXxHKXwwLEheKEJ8Qyl8MCl8MDtIPUM7eT1EZCh1fDAseXwwLGx8MCxqfDApfDA7dT1DO2o9RGQoQnwwLEh8MCxsfDAsanwwKXwwO2w9QztIPUdkKHl8MCx1fDAsMTQpfDA7Qj1DO0c9SGQoeXwwLHV8MCw1MCl8MDtCPUJ8QztBPUdkKHl8MCx1fDAsMTgpfDA7RT1DO0s9SGQoeXwwLHV8MCw0Nil8MDtFPUJeKEV8Qyk7Qj1HZCh5fDAsdXwwLDQxKXwwO2Y9QztiPUhkKHl8MCx1fDAsMjMpfDA7Zj1FXihmfEMpO0U9ZyszNDR8MDtJPWNbRT4+Ml18MDtFPWNbRSs0Pj4yXXwwO009RGQoSnwwLE18MCwxMDYyMTcwMDgsLTk0OTIwMjUyNSl8MDtFPURkKE18MCxDfDAsSXwwLEV8MCl8MDtmPURkKEV8MCxDfDAsKEh8RyleKEF8SyleKEJ8Yil8MCxmfDApfDA7Zj1EZChmfDAsQ3wwLChEXkYpJnleRHwwLChMXngpJnVeTHwwKXwwO2I9QztCPUdkKGp8MCxsfDAsMjgpfDA7Sz1DO0E9SGQoanwwLGx8MCwzNil8MDtLPUt8QztHPUdkKGp8MCxsfDAsMzQpfDA7SD1DO0U9SGQoanwwLGx8MCwzMCl8MDtIPUteKEh8Qyk7Sz1HZChqfDAsbHwwLDM5KXwwO0k9QztNPUhkKGp8MCxsfDAsMjUpfDA7ST1EZCgob3xtKSZqfG8mbXwwLChzfHApJmx8cyZwfDAsKEJ8QSleKEd8RSleKEt8TSl8MCxIXihJfEMpfDApfDA7SD1DO3Y9RGQocnwwLHZ8MCxmfDAsYnwwKXwwO3I9QztiPURkKEl8MCxIfDAsZnwwLGJ8MCl8MDtmPUM7SD1HZCh2fDAscnwwLDE0KXwwO0k9QztNPUhkKHZ8MCxyfDAsNTApfDA7ST1JfEM7Sz1HZCh2fDAscnwwLDE4KXwwO0U9QztHPUhkKHZ8MCxyfDAsNDYpfDA7RT1JXihFfEMpO0k9R2QodnwwLHJ8MCw0MSl8MDtBPUM7Qj1IZCh2fDAscnwwLDIzKXwwO0E9RV4oQXxDKTtFPWcrMzUyfDA7Sj1jW0U+PjJdfDA7RT1jW0UrND4+Ml18MDtMPURkKER8MCxMfDAsLTY4ODk1ODk1MiwtNzc4OTAxNDc5KXwwO0U9RGQoTHwwLEN8MCxKfDAsRXwwKXwwO0E9RGQoRXwwLEN8MCwoSHxNKV4oS3xHKV4oSXxCKXwwLEF8MCl8MDtBPURkKEF8MCxDfDAsKEZeeSkmdl5GfDAsKHhedSkmcl54fDApfDA7Qj1DO0k9R2QoYnwwLGZ8MCwyOCl8MDtHPUM7Sz1IZChifDAsZnwwLDM2KXwwO0c9R3xDO009R2QoYnwwLGZ8MCwzNCl8MDtIPUM7RT1IZChifDAsZnwwLDMwKXwwO0g9R14oSHxDKTtHPUdkKGJ8MCxmfDAsMzkpfDA7Sj1DO0w9SGQoYnwwLGZ8MCwyNSl8MDtKPURkKChtfGopJmJ8bSZqfDAsKHB8bCkmZnxwJmx8MCwoSXxLKV4oTXxFKV4oR3xMKXwwLEheKEp8Qyl8MCl8MDtIPUM7cz1EZChvfDAsc3wwLEF8MCxCfDApfDA7bz1DO0I9RGQoSnwwLEh8MCxBfDAsQnwwKXwwO0E9QztIPUdkKHN8MCxvfDAsMTQpfDA7Sj1DO0w9SGQoc3wwLG98MCw1MCl8MDtKPUp8QztHPUdkKHN8MCxvfDAsMTgpfDA7RT1DO009SGQoc3wwLG98MCw0Nil8MDtFPUpeKEV8Qyk7Sj1HZChzfDAsb3wwLDQxKXwwO0s9QztJPUhkKHN8MCxvfDAsMjMpfDA7Sz1FXihLfEMpO0U9ZyszNjB8MDtEPWNbRT4+Ml18MDtFPWNbRSs0Pj4yXXwwO3g9RGQoRnwwLHh8MCwxNDMyNzI1Nzc2LC02OTQ2MTQ0OTIpfDA7RT1EZCh4fDAsQ3wwLER8MCxFfDApfDA7Sz1EZChFfDAsQ3wwLChIfEwpXihHfE0pXihKfEkpfDAsS3wwKXwwO0s9RGQoS3wwLEN8MCwoeV52KSZzXnl8MCwodV5yKSZvXnV8MCl8MDtJPUM7Sj1HZChCfDAsQXwwLDI4KXwwO009QztHPUhkKEJ8MCxBfDAsMzYpfDA7TT1NfEM7TD1HZChCfDAsQXwwLDM0KXwwO0g9QztFPUhkKEJ8MCxBfDAsMzApfDA7SD1NXihIfEMpO009R2QoQnwwLEF8MCwzOSl8MDtEPUM7eD1IZChCfDAsQXwwLDI1KXwwO0Q9RGQoKGp8YikmQnxqJmJ8MCwobHxmKSZBfGwmZnwwLChKfEcpXihMfEUpXihNfHgpfDAsSF4oRHxDKXwwKXwwO0g9QztwPURkKG18MCxwfDAsS3wwLEl8MCl8MDttPUM7ST1EZChEfDAsSHwwLEt8MCxJfDApfDA7Sz1DO0g9R2QocHwwLG18MCwxNCl8MDtEPUM7eD1IZChwfDAsbXwwLDUwKXwwO0Q9RHxDO009R2QocHwwLG18MCwxOCl8MDtFPUM7TD1IZChwfDAsbXwwLDQ2KXwwO0U9RF4oRXxDKTtEPUdkKHB8MCxtfDAsNDEpfDA7Rz1DO0o9SGQocHwwLG18MCwyMyl8MDtHPUVeKEd8Qyk7RT1nKzM2OHwwO0Y9Y1tFPj4yXXwwO0U9Y1tFKzQ+PjJdfDA7dT1EZCh5fDAsdXwwLDE0NjcwMzE1OTQsLTIwMDM5NTM4Nyl8MDtFPURkKHV8MCxDfDAsRnwwLEV8MCl8MDtHPURkKEV8MCxDfDAsKEh8eCleKE18TCleKER8Sil8MCxHfDApfDA7Rz1EZChHfDAsQ3wwLCh2XnMpJnBednwwLChyXm8pJm1ecnwwKXwwO0o9QztEPUdkKEl8MCxLfDAsMjgpfDA7TD1DO009SGQoSXwwLEt8MCwzNil8MDtMPUx8Qzt4PUdkKEl8MCxLfDAsMzQpfDA7SD1DO0U9SGQoSXwwLEt8MCwzMCl8MDtIPUxeKEh8Qyk7TD1HZChJfDAsS3wwLDM5KXwwO0Y9Qzt1PUhkKEl8MCxLfDAsMjUpfDA7Rj1EZCgoYnxCKSZJfGImQnwwLChmfEEpJkt8ZiZBfDAsKER8TSleKHh8RSleKEx8dSl8MCxIXihGfEMpfDApfDA7SD1DO2w9RGQoanwwLGx8MCxHfDAsSnwwKXwwO2o9QztKPURkKEZ8MCxIfDAsR3wwLEp8MCl8MDtHPUM7SD1HZChsfDAsanwwLDE0KXwwO0Y9Qzt1PUhkKGx8MCxqfDAsNTApfDA7Rj1GfEM7TD1HZChsfDAsanwwLDE4KXwwO0U9Qzt4PUhkKGx8MCxqfDAsNDYpfDA7RT1GXihFfEMpO0Y9R2QobHwwLGp8MCw0MSl8MDtNPUM7RD1IZChsfDAsanwwLDIzKXwwO009RV4oTXxDKTtFPWcrMzc2fDA7eT1jW0U+PjJdfDA7RT1jW0UrND4+Ml18MDtyPURkKHZ8MCxyfDAsODUxMTY5NzIwLDI3NTQyMzM0NCl8MDtFPURkKHJ8MCxDfDAseXwwLEV8MCl8MDtNPURkKEV8MCxDfDAsKEh8dSleKEx8eCleKEZ8RCl8MCxNfDApfDA7TT1EZChNfDAsQ3wwLChzXnApJmxec3wwLChvXm0pJmpeb3wwKXwwO0Q9QztGPUdkKEp8MCxHfDAsMjgpfDA7eD1DO0w9SGQoSnwwLEd8MCwzNil8MDt4PXh8Qzt1PUdkKEp8MCxHfDAsMzQpfDA7SD1DO0U9SGQoSnwwLEd8MCwzMCl8MDtIPXheKEh8Qyk7eD1HZChKfDAsR3wwLDM5KXwwO3k9QztyPUhkKEp8MCxHfDAsMjUpfDA7eT1EZCgoQnxJKSZKfEImSXwwLChBfEspJkd8QSZLfDAsKEZ8TCleKHV8RSleKHh8cil8MCxIXih5fEMpfDApfDA7SD1DO2Y9RGQoYnwwLGZ8MCxNfDAsRHwwKXwwO2I9QztEPURkKHl8MCxIfDAsTXwwLER8MCl8MDtNPUM7SD1HZChmfDAsYnwwLDE0KXwwO3k9QztyPUhkKGZ8MCxifDAsNTApfDA7eT15fEM7eD1HZChmfDAsYnwwLDE4KXwwO0U9Qzt1PUhkKGZ8MCxifDAsNDYpfDA7RT15XihFfEMpO3k9R2QoZnwwLGJ8MCw0MSl8MDtMPUM7Rj1IZChmfDAsYnwwLDIzKXwwO0w9RV4oTHxDKTtFPWcrMzg0fDA7dj1jW0U+PjJdfDA7RT1jW0UrND4+Ml18MDtvPURkKHN8MCxvfDAsLTExOTQxNDM1NDQsNDMwMjI3NzM0KXwwO0U9RGQob3wwLEN8MCx2fDAsRXwwKXwwO0w9RGQoRXwwLEN8MCwoSHxyKV4oeHx1KV4oeXxGKXwwLEx8MCl8MDtMPURkKEx8MCxDfDAsKHBebCkmZl5wfDAsKG1eaikmYl5tfDApfDA7Rj1DO3k9R2QoRHwwLE18MCwyOCl8MDt1PUM7eD1IZChEfDAsTXwwLDM2KXwwO3U9dXxDO3I9R2QoRHwwLE18MCwzNCl8MDtIPUM7RT1IZChEfDAsTXwwLDMwKXwwO0g9dV4oSHxDKTt1PUdkKER8MCxNfDAsMzkpfDA7dj1DO289SGQoRHwwLE18MCwyNSl8MDt2PURkKChJfEopJkR8SSZKfDAsKEt8RykmTXxLJkd8MCwoeXx4KV4ocnxFKV4odXxvKXwwLEheKHZ8Qyl8MCl8MDtIPUM7QT1EZChCfDAsQXwwLEx8MCxGfDApfDA7Qj1DO0Y9RGQodnwwLEh8MCxMfDAsRnwwKXwwO0w9QztIPUdkKEF8MCxCfDAsMTQpfDA7dj1DO289SGQoQXwwLEJ8MCw1MCl8MDt2PXZ8Qzt1PUdkKEF8MCxCfDAsMTgpfDA7RT1DO3I9SGQoQXwwLEJ8MCw0Nil8MDtFPXZeKEV8Qyk7dj1HZChBfDAsQnwwLDQxKXwwO3g9Qzt5PUhkKEF8MCxCfDAsMjMpfDA7eD1FXih4fEMpO0U9ZyszOTJ8MDtzPWNbRT4+Ml18MDtFPWNbRSs0Pj4yXXwwO209RGQocHwwLG18MCwxMzYzMjU4MTk1LDUwNjk0ODYxNil8MDtFPURkKG18MCxDfDAsc3wwLEV8MCl8MDt4PURkKEV8MCxDfDAsKEh8byleKHV8cileKHZ8eSl8MCx4fDApfDA7eD1EZCh4fDAsQ3wwLChsXmYpJkFebHwwLChqXmIpJkJeanwwKXwwO3k9Qzt2PUdkKEZ8MCxMfDAsMjgpfDA7cj1DO3U9SGQoRnwwLEx8MCwzNil8MDtyPXJ8QztvPUdkKEZ8MCxMfDAsMzQpfDA7SD1DO0U9SGQoRnwwLEx8MCwzMCl8MDtIPXJeKEh8Qyk7cj1HZChGfDAsTHwwLDM5KXwwO3M9QzttPUhkKEZ8MCxMfDAsMjUpfDA7cz1EZCgoSnxEKSZGfEomRHwwLChHfE0pJkx8RyZNfDAsKHZ8dSleKG98RSleKHJ8bSl8MCxIXihzfEMpfDApfDA7SD1DO0s9RGQoSXwwLEt8MCx4fDAseXwwKXwwO0k9Qzt5PURkKHN8MCxIfDAseHwwLHl8MCl8MDt4PUM7SD1HZChLfDAsSXwwLDE0KXwwO3M9QzttPUhkKEt8MCxJfDAsNTApfDA7cz1zfEM7cj1HZChLfDAsSXwwLDE4KXwwO0U9QztvPUhkKEt8MCxJfDAsNDYpfDA7RT1zXihFfEMpO3M9R2QoS3wwLEl8MCw0MSl8MDt1PUM7dj1IZChLfDAsSXwwLDIzKXwwO3U9RV4odXxDKTtFPWcrNDAwfDA7cD1jW0U+PjJdfDA7RT1jW0UrND4+Ml18MDtqPURkKGx8MCxqfDAsLTU0NDI4MTcwMyw2NTkwNjA1NTYpfDA7RT1EZChqfDAsQ3wwLHB8MCxFfDApfDA7dT1EZChFfDAsQ3wwLChIfG0pXihyfG8pXihzfHYpfDAsdXwwKXwwO3U9RGQodXwwLEN8MCwoZl5BKSZLXmZ8MCwoYl5CKSZJXmJ8MCl8MDt2PUM7cz1HZCh5fDAseHwwLDI4KXwwO289QztyPUhkKHl8MCx4fDAsMzYpfDA7bz1vfEM7bT1HZCh5fDAseHwwLDM0KXwwO0g9QztFPUhkKHl8MCx4fDAsMzApfDA7SD1vXihIfEMpO289R2QoeXwwLHh8MCwzOSl8MDtwPUM7aj1IZCh5fDAseHwwLDI1KXwwO3A9RGQoKER8RikmeXxEJkZ8MCwoTXxMKSZ4fE0mTHwwLChzfHIpXihtfEUpXihvfGopfDAsSF4ocHxDKXwwKXwwO0g9QztHPURkKEp8MCxHfDAsdXwwLHZ8MCl8MDtKPUM7dj1EZChwfDAsSHwwLHV8MCx2fDApfDA7dT1DO0g9R2QoR3wwLEp8MCwxNCl8MDtwPUM7aj1IZChHfDAsSnwwLDUwKXwwO3A9cHxDO289R2QoR3wwLEp8MCwxOCl8MDtFPUM7bT1IZChHfDAsSnwwLDQ2KXwwO0U9cF4oRXxDKTtwPUdkKEd8MCxKfDAsNDEpfDA7cj1DO3M9SGQoR3wwLEp8MCwyMyl8MDtyPUVeKHJ8Qyk7RT1nKzQwOHwwO2w9Y1tFPj4yXXwwO0U9Y1tFKzQ+PjJdfDA7Yj1EZChmfDAsYnwwLC01MDk5MTcwMTYsODgzOTk3ODc3KXwwO0U9RGQoYnwwLEN8MCxsfDAsRXwwKXwwO3I9RGQoRXwwLEN8MCwoSHxqKV4ob3xtKV4ocHxzKXwwLHJ8MCl8MDtyPURkKHJ8MCxDfDAsKEFeSykmR15BfDAsKEJeSSkmSl5CfDApfDA7cz1DO3A9R2QodnwwLHV8MCwyOCl8MDttPUM7bz1IZCh2fDAsdXwwLDM2KXwwO209bXxDO2o9R2QodnwwLHV8MCwzNCl8MDtIPUM7RT1IZCh2fDAsdXwwLDMwKXwwO0g9bV4oSHxDKTttPUdkKHZ8MCx1fDAsMzkpfDA7bD1DO2I9SGQodnwwLHV8MCwyNSl8MDtsPURkKChGfHkpJnZ8RiZ5fDAsKEx8eCkmdXxMJnh8MCwocHxvKV4oanxFKV4obXxiKXwwLEheKGx8Qyl8MCl8MDtIPUM7TT1EZChEfDAsTXwwLHJ8MCxzfDApfDA7RD1DO3M9RGQobHwwLEh8MCxyfDAsc3wwKXwwO3I9QztIPUdkKE18MCxEfDAsMTQpfDA7bD1DO2I9SGQoTXwwLER8MCw1MCl8MDtsPWx8QzttPUdkKE18MCxEfDAsMTgpfDA7RT1DO2o9SGQoTXwwLER8MCw0Nil8MDtFPWxeKEV8Qyk7bD1HZChNfDAsRHwwLDQxKXwwO289QztwPUhkKE18MCxEfDAsMjMpfDA7bz1FXihvfEMpO0U9Zys0MTZ8MDtmPWNbRT4+Ml18MDtFPWNbRSs0Pj4yXXwwO0I9RGQoQXwwLEJ8MCwtOTc2NjU5ODY5LDk1ODEzOTU3MSl8MDtFPURkKEJ8MCxDfDAsZnwwLEV8MCl8MDtvPURkKEV8MCxDfDAsKEh8YileKG18aileKGx8cCl8MCxvfDApfDA7bz1EZChvfDAsQ3wwLChLXkcpJk1eS3wwLChJXkopJkReSXwwKXwwO3A9QztsPUdkKHN8MCxyfDAsMjgpfDA7aj1DO209SGQoc3wwLHJ8MCwzNil8MDtqPWp8QztiPUdkKHN8MCxyfDAsMzQpfDA7SD1DO0U9SGQoc3wwLHJ8MCwzMCl8MDtIPWpeKEh8Qyk7aj1HZChzfDAscnwwLDM5KXwwO2Y9QztCPUhkKHN8MCxyfDAsMjUpfDA7Zj1EZCgoeXx2KSZzfHkmdnwwLCh4fHUpJnJ8eCZ1fDAsKGx8bSleKGJ8RSleKGp8Qil8MCxIXihmfEMpfDApfDA7SD1DO0w9RGQoRnwwLEx8MCxvfDAscHwwKXwwO0Y9QztwPURkKGZ8MCxIfDAsb3wwLHB8MCl8MDtvPUM7SD1HZChMfDAsRnwwLDE0KXwwO2Y9QztCPUhkKEx8MCxGfDAsNTApfDA7Zj1mfEM7aj1HZChMfDAsRnwwLDE4KXwwO0U9QztiPUhkKEx8MCxGfDAsNDYpfDA7RT1mXihFfEMpO2Y9R2QoTHwwLEZ8MCw0MSl8MDttPUM7bD1IZChMfDAsRnwwLDIzKXwwO209RV4obXxDKTtFPWcrNDI0fDA7QT1jW0U+PjJdfDA7RT1jW0UrND4+Ml18MDtJPURkKEt8MCxJfDAsLTQ4MjI0Mzg5MywxMzIyODIyMjE4KXwwO0U9RGQoSXwwLEN8MCxBfDAsRXwwKXwwO209RGQoRXwwLEN8MCwoSHxCKV4oanxiKV4oZnxsKXwwLG18MCl8MDttPURkKG18MCxDfDAsKEdeTSkmTF5HfDAsKEpeRCkmRl5KfDApfDA7bD1DO2Y9R2QocHwwLG98MCwyOCl8MDtiPUM7aj1IZChwfDAsb3wwLDM2KXwwO2I9YnxDO0I9R2QocHwwLG98MCwzNCl8MDtIPUM7RT1IZChwfDAsb3wwLDMwKXwwO0g9Yl4oSHxDKTtiPUdkKHB8MCxvfDAsMzkpfDA7QT1DO0k9SGQocHwwLG98MCwyNSl8MDtBPURkKCh2fHMpJnB8diZzfDAsKHV8cikmb3x1JnJ8MCwoZnxqKV4oQnxFKV4oYnxJKXwwLEheKEF8Qyl8MCl8MDtIPUM7eD1EZCh5fDAseHwwLG18MCxsfDApfDA7eT1DO2w9RGQoQXwwLEh8MCxtfDAsbHwwKXwwO209QztIPUdkKHh8MCx5fDAsMTQpfDA7QT1DO0k9SGQoeHwwLHl8MCw1MCl8MDtBPUF8QztiPUdkKHh8MCx5fDAsMTgpfDA7RT1DO0I9SGQoeHwwLHl8MCw0Nil8MDtFPUFeKEV8Qyk7QT1HZCh4fDAseXwwLDQxKXwwO2o9QztmPUhkKHh8MCx5fDAsMjMpfDA7aj1FXihqfEMpO0U9Zys0MzJ8MDtLPWNbRT4+Ml18MDtFPWNbRSs0Pj4yXXwwO0o9RGQoR3wwLEp8MCwyMDAzMDM0OTk1LDE1MzcwMDIwNjMpfDA7RT1EZChKfDAsQ3wwLEt8MCxFfDApfDA7aj1EZChFfDAsQ3wwLChIfEkpXihifEIpXihBfGYpfDAsanwwKXwwO2o9RGQoanwwLEN8MCwoTV5MKSZ4Xk18MCwoRF5GKSZ5XkR8MCl8MDtmPUM7QT1HZChsfDAsbXwwLDI4KXwwO0I9QztiPUhkKGx8MCxtfDAsMzYpfDA7Qj1CfEM7ST1HZChsfDAsbXwwLDM0KXwwO0g9QztFPUhkKGx8MCxtfDAsMzApfDA7SD1CXihIfEMpO0I9R2QobHwwLG18MCwzOSl8MDtLPUM7Sj1IZChsfDAsbXwwLDI1KXwwO0s9RGQoKHN8cCkmbHxzJnB8MCwocnxvKSZtfHImb3wwLChBfGIpXihJfEUpXihCfEopfDAsSF4oS3xDKXwwKXwwO0g9Qzt1PURkKHZ8MCx1fDAsanwwLGZ8MCl8MDt2PUM7Zj1EZChLfDAsSHwwLGp8MCxmfDApfDA7aj1DO0g9R2QodXwwLHZ8MCwxNCl8MDtLPUM7Sj1IZCh1fDAsdnwwLDUwKXwwO0s9S3xDO0I9R2QodXwwLHZ8MCwxOCl8MDtFPUM7ST1IZCh1fDAsdnwwLDQ2KXwwO0U9S14oRXxDKTtLPUdkKHV8MCx2fDAsNDEpfDA7Yj1DO0E9SGQodXwwLHZ8MCwyMyl8MDtiPUVeKGJ8Qyk7RT1nKzQ0MHwwO0c9Y1tFPj4yXXwwO0U9Y1tFKzQ+PjJdfDA7RD1EZChNfDAsRHwwLC02OTI5MzAzOTcsMTc0Nzg3Mzc3OSl8MDtFPURkKER8MCxDfDAsR3wwLEV8MCl8MDtiPURkKEV8MCxDfDAsKEh8SileKEJ8SSleKEt8QSl8MCxifDApfDA7Yj1EZChifDAsQ3wwLChMXngpJnVeTHwwLChGXnkpJnZeRnwwKXwwO0E9QztLPUdkKGZ8MCxqfDAsMjgpfDA7ST1DO0I9SGQoZnwwLGp8MCwzNil8MDtJPUl8QztKPUdkKGZ8MCxqfDAsMzQpfDA7SD1DO0U9SGQoZnwwLGp8MCwzMCl8MDtIPUleKEh8Qyk7ST1HZChmfDAsanwwLDM5KXwwO0c9QztEPUhkKGZ8MCxqfDAsMjUpfDA7Rz1EZCgocHxsKSZmfHAmbHwwLChvfG0pJmp8byZtfDAsKEt8QileKEp8RSleKEl8RCl8MCxIXihHfEMpfDApfDA7SD1DO3I9RGQoc3wwLHJ8MCxifDAsQXwwKXwwO3M9QztBPURkKEd8MCxIfDAsYnwwLEF8MCl8MDtiPUM7SD1HZChyfDAsc3wwLDE0KXwwO0c9QztEPUhkKHJ8MCxzfDAsNTApfDA7Rz1HfEM7ST1HZChyfDAsc3wwLDE4KXwwO0U9QztKPUhkKHJ8MCxzfDAsNDYpfDA7RT1HXihFfEMpO0c9R2QocnwwLHN8MCw0MSl8MDtCPUM7Sz1IZChyfDAsc3wwLDIzKXwwO0I9RV4oQnxDKTtFPWcrNDQ4fDA7TT1jW0U+PjJdfDA7RT1jW0UrND4+Ml18MDtGPURkKEx8MCxGfDAsMTU3NTk5MDAxMiwxOTU1NTYyMjIyKXwwO0U9RGQoRnwwLEN8MCxNfDAsRXwwKXwwO0I9RGQoRXwwLEN8MCwoSHxEKV4oSXxKKV4oR3xLKXwwLEJ8MCl8MDtCPURkKEJ8MCxDfDAsKHhedSkmcl54fDAsKHledikmc155fDApfDA7Sz1DO0c9R2QoQXwwLGJ8MCwyOCl8MDtKPUM7ST1IZChBfDAsYnwwLDM2KXwwO0o9SnxDO0Q9R2QoQXwwLGJ8MCwzNCl8MDtIPUM7RT1IZChBfDAsYnwwLDMwKXwwO0g9Sl4oSHxDKTtKPUdkKEF8MCxifDAsMzkpfDA7TT1DO0Y9SGQoQXwwLGJ8MCwyNSl8MDtNPURkKChsfGYpJkF8bCZmfDAsKG18aikmYnxtJmp8MCwoR3xJKV4oRHxFKV4oSnxGKXwwLEheKE18Qyl8MCl8MDtIPUM7bz1EZChwfDAsb3wwLEJ8MCxLfDApfDA7cD1DO0s9RGQoTXwwLEh8MCxCfDAsS3wwKXwwO0I9QztIPUdkKG98MCxwfDAsMTQpfDA7TT1DO0Y9SGQob3wwLHB8MCw1MCl8MDtNPU18QztKPUdkKG98MCxwfDAsMTgpfDA7RT1DO0Q9SGQob3wwLHB8MCw0Nil8MDtFPU1eKEV8Qyk7TT1HZChvfDAscHwwLDQxKXwwO0k9QztHPUhkKG98MCxwfDAsMjMpfDA7ST1FXihJfEMpO0U9Zys0NTZ8MDtMPWNbRT4+Ml18MDtFPWNbRSs0Pj4yXXwwO3k9RGQoeHwwLHl8MCwxMTI1NTkyOTI4LDIwMjQxMDQ4MTUpfDA7RT1EZCh5fDAsQ3wwLEx8MCxFfDApfDA7ST1EZChFfDAsQ3wwLChIfEYpXihKfEQpXihNfEcpfDAsSXwwKXwwO0k9RGQoSXwwLEN8MCwodV5yKSZvXnV8MCwodl5zKSZwXnZ8MCl8MDtHPUM7TT1HZChLfDAsQnwwLDI4KXwwO0Q9QztKPUhkKEt8MCxCfDAsMzYpfDA7RD1EfEM7Rj1HZChLfDAsQnwwLDM0KXwwO0g9QztFPUhkKEt8MCxCfDAsMzApfDA7SD1EXihIfEMpO0Q9R2QoS3wwLEJ8MCwzOSl8MDtMPUM7eT1IZChLfDAsQnwwLDI1KXwwO0w9RGQoKGZ8QSkmS3xmJkF8MCwoanxiKSZCfGomYnwwLChNfEopXihGfEUpXihEfHkpfDAsSF4oTHxDKXwwKXwwO0g9QzttPURkKGx8MCxtfDAsSXwwLEd8MCl8MDtsPUM7Rz1EZChMfDAsSHwwLEl8MCxHfDApfDA7ST1DO0g9R2QobXwwLGx8MCwxNCl8MDtMPUM7eT1IZChtfDAsbHwwLDUwKXwwO0w9THxDO0Q9R2QobXwwLGx8MCwxOCl8MDtFPUM7Rj1IZChtfDAsbHwwLDQ2KXwwO0U9TF4oRXxDKTtMPUdkKG18MCxsfDAsNDEpfDA7Sj1DO009SGQobXwwLGx8MCwyMyl8MDtKPUVeKEp8Qyk7RT1nKzQ2NHwwO3g9Y1tFPj4yXXwwO0U9Y1tFKzQ+PjJdfDA7dj1EZCh1fDAsdnwwLC0xNTc4MDYyOTkwLC0yMDY3MjM2ODQ0KXwwO0U9RGQodnwwLEN8MCx4fDAsRXwwKXwwO0o9RGQoRXwwLEN8MCwoSHx5KV4oRHxGKV4oTHxNKXwwLEp8MCl8MDtKPURkKEp8MCxDfDAsKHJebykmbV5yfDAsKHNecCkmbF5zfDApfDA7TT1DO0w9R2QoR3wwLEl8MCwyOCl8MDtGPUM7RD1IZChHfDAsSXwwLDM2KXwwO0Y9RnxDO3k9R2QoR3wwLEl8MCwzNCl8MDtIPUM7RT1IZChHfDAsSXwwLDMwKXwwO0g9Rl4oSHxDKTtGPUdkKEd8MCxJfDAsMzkpfDA7eD1DO3Y9SGQoR3wwLEl8MCwyNSl8MDt4PURkKChBfEspJkd8QSZLfDAsKGJ8QikmSXxiJkJ8MCwoTHxEKV4oeXxFKV4oRnx2KXwwLEheKHh8Qyl8MCl8MDtIPUM7aj1EZChmfDAsanwwLEp8MCxNfDApfDA7Zj1DO009RGQoeHwwLEh8MCxKfDAsTXwwKXwwO0o9QztIPUdkKGp8MCxmfDAsMTQpfDA7eD1DO3Y9SGQoanwwLGZ8MCw1MCl8MDt4PXh8QztGPUdkKGp8MCxmfDAsMTgpfDA7RT1DO3k9SGQoanwwLGZ8MCw0Nil8MDtFPXheKEV8Qyk7eD1HZChqfDAsZnwwLDQxKXwwO0Q9QztMPUhkKGp8MCxmfDAsMjMpfDA7RD1FXihEfEMpO0U9Zys0NzJ8MDt1PWNbRT4+Ml18MDtFPWNbRSs0Pj4yXXwwO3M9RGQocnwwLHN8MCw0NDI3NzYwNDQsLTE5MzMxMTQ4NzIpfDA7RT1EZChzfDAsQ3wwLHV8MCxFfDApfDA7RD1EZChFfDAsQ3wwLChIfHYpXihGfHkpXih4fEwpfDAsRHwwKXwwO0Q9RGQoRHwwLEN8MCwob15tKSZqXm98MCwocF5sKSZmXnB8MCl8MDtMPUM7eD1HZChNfDAsSnwwLDI4KXwwO3k9QztGPUhkKE18MCxKfDAsMzYpfDA7eT15fEM7dj1HZChNfDAsSnwwLDM0KXwwO0g9QztFPUhkKE18MCxKfDAsMzApfDA7SD15XihIfEMpO3k9R2QoTXwwLEp8MCwzOSl8MDt1PUM7cz1IZChNfDAsSnwwLDI1KXwwO3U9RGQoKEt8RykmTXxLJkd8MCwoQnxJKSZKfEImSXwwLCh4fEYpXih2fEUpXih5fHMpfDAsSF4odXxDKXwwKXwwO0g9QztiPURkKEF8MCxifDAsRHwwLEx8MCl8MDtBPUM7TD1EZCh1fDAsSHwwLER8MCxMfDApfDA7RD1DO0g9R2QoYnwwLEF8MCwxNCl8MDt1PUM7cz1IZChifDAsQXwwLDUwKXwwO3U9dXxDO3k9R2QoYnwwLEF8MCwxOCl8MDtFPUM7dj1IZChifDAsQXwwLDQ2KXwwO0U9dV4oRXxDKTt1PUdkKGJ8MCxBfDAsNDEpfDA7Rj1DO3g9SGQoYnwwLEF8MCwyMyl8MDtGPUVeKEZ8Qyk7RT1nKzQ4MHwwO3I9Y1tFPj4yXXwwO0U9Y1tFKzQ+PjJdfDA7cD1EZChvfDAscHwwLDU5MzY5ODM0NCwtMTg2NjUzMDgyMil8MDtFPURkKHB8MCxDfDAscnwwLEV8MCl8MDtGPURkKEV8MCxDfDAsKEh8cyleKHl8dileKHV8eCl8MCxGfDApfDA7Rj1EZChGfDAsQ3wwLChtXmopJmJebXwwLChsXmYpJkFebHwwKXwwO3g9Qzt1PUdkKEx8MCxEfDAsMjgpfDA7dj1DO3k9SGQoTHwwLER8MCwzNil8MDt2PXZ8QztzPUdkKEx8MCxEfDAsMzQpfDA7SD1DO0U9SGQoTHwwLER8MCwzMCl8MDtIPXZeKEh8Qyk7dj1HZChMfDAsRHwwLDM5KXwwO3I9QztwPUhkKEx8MCxEfDAsMjUpfDA7cj1EZCgoR3xNKSZMfEcmTXwwLChJfEopJkR8SSZKfDAsKHV8eSleKHN8RSleKHZ8cCl8MCxIXihyfEMpfDApfDA7SD1DO0I9RGQoS3wwLEJ8MCxGfDAseHwwKXwwO0s9Qzt4PURkKHJ8MCxIfDAsRnwwLHh8MCl8MDtGPUM7SD1HZChCfDAsS3wwLDE0KXwwO3I9QztwPUhkKEJ8MCxLfDAsNTApfDA7cj1yfEM7dj1HZChCfDAsS3wwLDE4KXwwO0U9QztzPUhkKEJ8MCxLfDAsNDYpfDA7RT1yXihFfEMpO3I9R2QoQnwwLEt8MCw0MSl8MDt5PUM7dT1IZChCfDAsS3wwLDIzKXwwO3k9RV4oeXxDKTtFPWcrNDg4fDA7bz1jW0U+PjJdfDA7RT1jW0UrND4+Ml18MDtsPURkKG18MCxsfDAsLTU2MTg1NzA0NywtMTUzODIzMzEwOSl8MDtFPURkKGx8MCxDfDAsb3wwLEV8MCl8MDt5PURkKEV8MCxDfDAsKEh8cCleKHZ8cyleKHJ8dSl8MCx5fDApfDA7eT1EZCh5fDAsQ3wwLChqXmIpJkJeanwwLChmXkEpJkteZnwwKXwwO3U9QztyPUdkKHh8MCxGfDAsMjgpfDA7cz1DO3Y9SGQoeHwwLEZ8MCwzNil8MDtzPXN8QztwPUdkKHh8MCxGfDAsMzQpfDA7SD1DO0U9SGQoeHwwLEZ8MCwzMCl8MDtIPXNeKEh8Qyk7cz1HZCh4fDAsRnwwLDM5KXwwO289QztsPUhkKHh8MCxGfDAsMjUpfDA7bz1EZCgoTXxMKSZ4fE0mTHwwLChKfEQpJkZ8SiZEfDAsKHJ8dileKHB8RSleKHN8bCl8MCxIXihvfEMpfDApfDA7SD1DO0k9RGQoR3wwLEl8MCx5fDAsdXwwKXwwO0c9Qzt1PURkKG98MCxIfDAseXwwLHV8MCl8MDt5PUM7SD1HZChJfDAsR3wwLDE0KXwwO289QztsPUhkKEl8MCxHfDAsNTApfDA7bz1vfEM7cz1HZChJfDAsR3wwLDE4KXwwO0U9QztwPUhkKEl8MCxHfDAsNDYpfDA7RT1vXihFfEMpO289R2QoSXwwLEd8MCw0MSl8MDt2PUM7cj1IZChJfDAsR3wwLDIzKXwwO3Y9RV4odnxDKTtFPWcrNDk2fDA7bT1jW0U+PjJdfDA7RT1jW0UrND4+Ml18MDtmPURkKGp8MCxmfDAsLTEyOTU2MTU3MjMsLTEwOTA5MzU4MTcpfDA7RT1EZChmfDAsQ3wwLG18MCxFfDApfDA7dj1EZChFfDAsQ3wwLChIfGwpXihzfHApXihvfHIpfDAsdnwwKXwwO3Y9RGQodnwwLEN8MCwoYl5CKSZJXmJ8MCwoQV5LKSZHXkF8MCl8MDtyPUM7bz1HZCh1fDAseXwwLDI4KXwwO3A9QztzPUhkKHV8MCx5fDAsMzYpfDA7cD1wfEM7bD1HZCh1fDAseXwwLDM0KXwwO0g9QztFPUhkKHV8MCx5fDAsMzApfDA7SD1wXihIfEMpO3A9R2QodXwwLHl8MCwzOSl8MDttPUM7Zj1IZCh1fDAseXwwLDI1KXwwO209RGQoKEx8eCkmdXxMJnh8MCwoRHxGKSZ5fEQmRnwwLChvfHMpXihsfEUpXihwfGYpfDAsSF4obXxDKXwwKXwwO0g9QztKPURkKE18MCxKfDAsdnwwLHJ8MCl8MDtNPUM7cj1EZChtfDAsSHwwLHZ8MCxyfDApfDA7dj1DO0g9R2QoSnwwLE18MCwxNCl8MDttPUM7Zj1IZChKfDAsTXwwLDUwKXwwO209bXxDO3A9R2QoSnwwLE18MCwxOCl8MDtFPUM7bD1IZChKfDAsTXwwLDQ2KXwwO0U9bV4oRXxDKTttPUdkKEp8MCxNfDAsNDEpfDA7cz1DO289SGQoSnwwLE18MCwyMyl8MDtzPUVeKHN8Qyk7RT1nKzUwNHwwO2o9Y1tFPj4yXXwwO0U9Y1tFKzQ+PjJdfDA7QT1EZChifDAsQXwwLC00NzkwNDY4NjksLTk2NTY0MTk5OCl8MDtFPURkKEF8MCxDfDAsanwwLEV8MCl8MDtzPURkKEV8MCxDfDAsKEh8ZileKHB8bCleKG18byl8MCxzfDApfDA7cz1EZChzfDAsQ3wwLChCXkkpJkpeQnwwLChLXkcpJk1eS3wwKXwwO289QzttPUdkKHJ8MCx2fDAsMjgpfDA7bD1DO3A9SGQocnwwLHZ8MCwzNil8MDtsPWx8QztmPUdkKHJ8MCx2fDAsMzQpfDA7SD1DO0U9SGQocnwwLHZ8MCwzMCl8MDtIPWxeKEh8Qyk7bD1HZChyfDAsdnwwLDM5KXwwO2o9QztBPUhkKHJ8MCx2fDAsMjUpfDA7aj1EZCgoeHx1KSZyfHgmdXwwLChGfHkpJnZ8RiZ5fDAsKG18cCleKGZ8RSleKGx8QSl8MCxIXihqfEMpfDApfDA7SD1DO0Q9RGQoTHwwLER8MCxzfDAsb3wwKXwwO0w9QztvPURkKGp8MCxIfDAsc3wwLG98MCl8MDtzPUM7SD1HZChEfDAsTHwwLDE0KXwwO2o9QztBPUhkKER8MCxMfDAsNTApfDA7aj1qfEM7bD1HZChEfDAsTHwwLDE4KXwwO0U9QztmPUhkKER8MCxMfDAsNDYpfDA7RT1qXihFfEMpO2o9R2QoRHwwLEx8MCw0MSl8MDtwPUM7bT1IZChEfDAsTHwwLDIzKXwwO3A9RV4ocHxDKTtFPWcrNTEyfDA7Yj1jW0U+PjJdfDA7RT1jW0UrND4+Ml18MDtLPURkKEJ8MCxLfDAsLTM2NjU4MzM5NiwtOTAzMzk3NjgyKXwwO0U9RGQoS3wwLEN8MCxifDAsRXwwKXwwO3A9RGQoRXwwLEN8MCwoSHxBKV4obHxmKV4oanxtKXwwLHB8MCl8MDtwPURkKHB8MCxDfDAsKEleSikmRF5JfDAsKEdeTSkmTF5HfDApfDA7bT1DO2o9R2Qob3wwLHN8MCwyOCl8MDtmPUM7bD1IZChvfDAsc3wwLDM2KXwwO2Y9ZnxDO0E9R2Qob3wwLHN8MCwzNCl8MDtIPUM7RT1IZChvfDAsc3wwLDMwKXwwO0g9Zl4oSHxDKTtmPUdkKG98MCxzfDAsMzkpfDA7Yj1DO0s9SGQob3wwLHN8MCwyNSl8MDtiPURkKCh1fHIpJm98dSZyfDAsKHl8dikmc3x5JnZ8MCwoanxsKV4oQXxFKV4oZnxLKXwwLEheKGJ8Qyl8MCl8MDtIPUM7Rj1EZCh4fDAsRnwwLHB8MCxtfDApfDA7eD1DO209RGQoYnwwLEh8MCxwfDAsbXwwKXwwO3A9QztIPUdkKEZ8MCx4fDAsMTQpfDA7Yj1DO0s9SGQoRnwwLHh8MCw1MCl8MDtiPWJ8QztmPUdkKEZ8MCx4fDAsMTgpfDA7RT1DO0E9SGQoRnwwLHh8MCw0Nil8MDtFPWJeKEV8Qyk7Yj1HZChGfDAseHwwLDQxKXwwO2w9QztqPUhkKEZ8MCx4fDAsMjMpfDA7bD1FXihsfEMpO0U9Zys1MjB8MDtCPWNbRT4+Ml18MDtFPWNbRSs0Pj4yXXwwO0c9RGQoSXwwLEd8MCw1NjYyODA3MTEsLTc3OTcwMDAyNSl8MDtFPURkKEd8MCxDfDAsQnwwLEV8MCl8MDtsPURkKEV8MCxDfDAsKEh8SyleKGZ8QSleKGJ8ail8MCxsfDApfDA7bD1EZChsfDAsQ3wwLChKXkQpJkZeSnwwLChNXkwpJnheTXwwKXwwO2o9QztiPUdkKG18MCxwfDAsMjgpfDA7QT1DO2Y9SGQobXwwLHB8MCwzNil8MDtBPUF8QztLPUdkKG18MCxwfDAsMzQpfDA7SD1DO0U9SGQobXwwLHB8MCwzMCl8MDtIPUFeKEh8Qyk7QT1HZChtfDAscHwwLDM5KXwwO0I9QztHPUhkKG18MCxwfDAsMjUpfDA7Qj1EZCgocnxvKSZtfHImb3wwLCh2fHMpJnB8diZzfDAsKGJ8ZileKEt8RSleKEF8Ryl8MCxIXihCfEMpfDApfDA7SD1DO3k9RGQodXwwLHl8MCxsfDAsanwwKXwwO3U9QztqPURkKEJ8MCxIfDAsbHwwLGp8MCl8MDtsPUM7SD1HZCh5fDAsdXwwLDE0KXwwO0I9QztHPUhkKHl8MCx1fDAsNTApfDA7Qj1CfEM7QT1HZCh5fDAsdXwwLDE4KXwwO0U9QztLPUhkKHl8MCx1fDAsNDYpfDA7RT1CXihFfEMpO0I9R2QoeXwwLHV8MCw0MSl8MDtmPUM7Yj1IZCh5fDAsdXwwLDIzKXwwO2Y9RV4oZnxDKTtFPWcrNTI4fDA7ST1jW0U+PjJdfDA7RT1jW0UrND4+Ml18MDtNPURkKEp8MCxNfDAsLTg0MDg5Nzc2MiwtMzU0Nzc5NjkwKXwwO0U9RGQoTXwwLEN8MCxJfDAsRXwwKXwwO2Y9RGQoRXwwLEN8MCwoSHxHKV4oQXxLKV4oQnxiKXwwLGZ8MCl8MDtmPURkKGZ8MCxDfDAsKEReRikmeV5EfDAsKExeeCkmdV5MfDApfDA7Yj1DO0I9R2QoanwwLGx8MCwyOCl8MDtLPUM7QT1IZChqfDAsbHwwLDM2KXwwO0s9S3xDO0c9R2QoanwwLGx8MCwzNCl8MDtIPUM7RT1IZChqfDAsbHwwLDMwKXwwO0g9S14oSHxDKTtLPUdkKGp8MCxsfDAsMzkpfDA7ST1DO009SGQoanwwLGx8MCwyNSl8MDtJPURkKChvfG0pJmp8byZtfDAsKHN8cCkmbHxzJnB8MCwoQnxBKV4oR3xFKV4oS3xNKXwwLEheKEl8Qyl8MCl8MDtIPUM7dj1EZChyfDAsdnwwLGZ8MCxifDApfDA7cj1DO2I9RGQoSXwwLEh8MCxmfDAsYnwwKXwwO2Y9QztIPUdkKHZ8MCxyfDAsMTQpfDA7ST1DO009SGQodnwwLHJ8MCw1MCl8MDtJPUl8QztLPUdkKHZ8MCxyfDAsMTgpfDA7RT1DO0c9SGQodnwwLHJ8MCw0Nil8MDtFPUleKEV8Qyk7ST1HZCh2fDAscnwwLDQxKXwwO0E9QztCPUhkKHZ8MCxyfDAsMjMpfDA7QT1FXihBfEMpO0U9Zys1MzZ8MDtKPWNbRT4+Ml18MDtFPWNbRSs0Pj4yXXwwO0w9RGQoRHwwLEx8MCwtMjk0NzI3MzA0LC0xNzYzMzcwMjUpfDA7RT1EZChMfDAsQ3wwLEp8MCxFfDApfDA7QT1EZChFfDAsQ3wwLChIfE0pXihLfEcpXihJfEIpfDAsQXwwKXwwO0E9RGQoQXwwLEN8MCwoRl55KSZ2XkZ8MCwoeF51KSZyXnh8MCl8MDtCPUM7ST1HZChifDAsZnwwLDI4KXwwO0c9QztLPUhkKGJ8MCxmfDAsMzYpfDA7Rz1HfEM7TT1HZChifDAsZnwwLDM0KXwwO0g9QztFPUhkKGJ8MCxmfDAsMzApfDA7SD1HXihIfEMpO0c9R2QoYnwwLGZ8MCwzOSl8MDtKPUM7TD1IZChifDAsZnwwLDI1KXwwO0o9RGQoKG18aikmYnxtJmp8MCwocHxsKSZmfHAmbHwwLChJfEspXihNfEUpXihHfEwpfDAsSF4oSnxDKXwwKXwwO0g9QztzPURkKG98MCxzfDAsQXwwLEJ8MCl8MDtvPUM7Qj1EZChKfDAsSHwwLEF8MCxCfDApfDA7QT1DO0g9R2Qoc3wwLG98MCwxNCl8MDtKPUM7TD1IZChzfDAsb3wwLDUwKXwwO0o9SnxDO0c9R2Qoc3wwLG98MCwxOCl8MDtFPUM7TT1IZChzfDAsb3wwLDQ2KXwwO0U9Sl4oRXxDKTtKPUdkKHN8MCxvfDAsNDEpfDA7Sz1DO0k9SGQoc3wwLG98MCwyMyl8MDtLPUVeKEt8Qyk7RT1nKzU0NHwwO0Q9Y1tFPj4yXXwwO0U9Y1tFKzQ+PjJdfDA7eD1EZChGfDAseHwwLDE5MTQxMzg1NTQsMTE2NDE4NDc0KXwwO0U9RGQoeHwwLEN8MCxEfDAsRXwwKXwwO0s9RGQoRXwwLEN8MCwoSHxMKV4oR3xNKV4oSnxJKXwwLEt8MCl8MDtLPURkKEt8MCxDfDAsKHledikmc155fDAsKHVecikmb151fDApfDA7ST1DO0o9R2QoQnwwLEF8MCwyOCl8MDtNPUM7Rz1IZChCfDAsQXwwLDM2KXwwO009TXxDO0w9R2QoQnwwLEF8MCwzNCl8MDtIPUM7RT1IZChCfDAsQXwwLDMwKXwwO0g9TV4oSHxDKTtNPUdkKEJ8MCxBfDAsMzkpfDA7RD1DO3g9SGQoQnwwLEF8MCwyNSl8MDtEPURkKChqfGIpJkJ8aiZifDAsKGx8ZikmQXxsJmZ8MCwoSnxHKV4oTHxFKV4oTXx4KXwwLEheKER8Qyl8MCl8MDtIPUM7cD1EZChtfDAscHwwLEt8MCxJfDApfDA7bT1DO0k9RGQoRHwwLEh8MCxLfDAsSXwwKXwwO0s9QztIPUdkKHB8MCxtfDAsMTQpfDA7RD1DO3g9SGQocHwwLG18MCw1MCl8MDtEPUR8QztNPUdkKHB8MCxtfDAsMTgpfDA7RT1DO0w9SGQocHwwLG18MCw0Nil8MDtFPUReKEV8Qyk7RD1HZChwfDAsbXwwLDQxKXwwO0c9QztKPUhkKHB8MCxtfDAsMjMpfDA7Rz1FXihHfEMpO0U9Zys1NTJ8MDtGPWNbRT4+Ml18MDtFPWNbRSs0Pj4yXXwwO3U9RGQoeXwwLHV8MCwtMTU2MzkxMjAyNiwxNzQyOTI0MjEpfDA7RT1EZCh1fDAsQ3wwLEZ8MCxFfDApfDA7Rz1EZChFfDAsQ3wwLChIfHgpXihNfEwpXihEfEopfDAsR3wwKXwwO0c9RGQoR3wwLEN8MCwodl5zKSZwXnZ8MCwocl5vKSZtXnJ8MCl8MDtKPUM7RD1HZChJfDAsS3wwLDI4KXwwO0w9QztNPUhkKEl8MCxLfDAsMzYpfDA7TD1MfEM7eD1HZChJfDAsS3wwLDM0KXwwO0g9QztFPUhkKEl8MCxLfDAsMzApfDA7SD1MXihIfEMpO0w9R2QoSXwwLEt8MCwzOSl8MDtGPUM7dT1IZChJfDAsS3wwLDI1KXwwO0Y9RGQoKGJ8QikmSXxiJkJ8MCwoZnxBKSZLfGYmQXwwLChEfE0pXih4fEUpXihMfHUpfDAsSF4oRnxDKXwwKXwwO0g9QztsPURkKGp8MCxsfDAsR3wwLEp8MCl8MDtqPUM7Sj1EZChGfDAsSHwwLEd8MCxKfDApfDA7Rz1DO0g9R2QobHwwLGp8MCwxNCl8MDtGPUM7dT1IZChsfDAsanwwLDUwKXwwO0Y9RnxDO0w9R2QobHwwLGp8MCwxOCl8MDtFPUM7eD1IZChsfDAsanwwLDQ2KXwwO0U9Rl4oRXxDKTtGPUdkKGx8MCxqfDAsNDEpfDA7TT1DO0Q9SGQobHwwLGp8MCwyMyl8MDtNPUVeKE18Qyk7RT1nKzU2MHwwO3k9Y1tFPj4yXXwwO0U9Y1tFKzQ+PjJdfDA7cj1EZCh2fDAscnwwLC0xMDkwOTc0MjkwLDI4OTM4MDM1Nil8MDtFPURkKHJ8MCxDfDAseXwwLEV8MCl8MDtNPURkKEV8MCxDfDAsKEh8dSleKEx8eCleKEZ8RCl8MCxNfDApfDA7TT1EZChNfDAsQ3wwLChzXnApJmxec3wwLChvXm0pJmpeb3wwKXwwO0Q9QztGPUdkKEp8MCxHfDAsMjgpfDA7eD1DO0w9SGQoSnwwLEd8MCwzNil8MDt4PXh8Qzt1PUdkKEp8MCxHfDAsMzQpfDA7SD1DO0U9SGQoSnwwLEd8MCwzMCl8MDtIPXheKEh8Qyk7eD1HZChKfDAsR3wwLDM5KXwwO3k9QztyPUhkKEp8MCxHfDAsMjUpfDA7eT1EZCgoQnxJKSZKfEImSXwwLChBfEspJkd8QSZLfDAsKEZ8TCleKHV8RSleKHh8cil8MCxIXih5fEMpfDApfDA7SD1DO2Y9RGQoYnwwLGZ8MCxNfDAsRHwwKXwwO2I9QztEPURkKHl8MCxIfDAsTXwwLER8MCl8MDtNPUM7SD1HZChmfDAsYnwwLDE0KXwwO3k9QztyPUhkKGZ8MCxifDAsNTApfDA7eT15fEM7eD1HZChmfDAsYnwwLDE4KXwwO0U9Qzt1PUhkKGZ8MCxifDAsNDYpfDA7RT15XihFfEMpO3k9R2QoZnwwLGJ8MCw0MSl8MDtMPUM7Rj1IZChmfDAsYnwwLDIzKXwwO0w9RV4oTHxDKTtFPWcrNTY4fDA7dj1jW0U+PjJdfDA7RT1jW0UrND4+Ml18MDtvPURkKHN8MCxvfDAsMzIwNjIwMzE1LDQ2MDM5MzI2OSl8MDtFPURkKG98MCxDfDAsdnwwLEV8MCl8MDtMPURkKEV8MCxDfDAsKEh8cileKHh8dSleKHl8Ril8MCxMfDApfDA7TD1EZChMfDAsQ3wwLChwXmwpJmZecHwwLChtXmopJmJebXwwKXwwO0Y9Qzt5PUdkKER8MCxNfDAsMjgpfDA7dT1DO3g9SGQoRHwwLE18MCwzNil8MDt1PXV8QztyPUdkKER8MCxNfDAsMzQpfDA7SD1DO0U9SGQoRHwwLE18MCwzMCl8MDtIPXVeKEh8Qyk7dT1HZChEfDAsTXwwLDM5KXwwO3Y9QztvPUhkKER8MCxNfDAsMjUpfDA7dj1EZCgoSXxKKSZEfEkmSnwwLChLfEcpJk18SyZHfDAsKHl8eCleKHJ8RSleKHV8byl8MCxIXih2fEMpfDApfDA7SD1DO0E9RGQoQnwwLEF8MCxMfDAsRnwwKXwwO0I9QztGPURkKHZ8MCxIfDAsTHwwLEZ8MCl8MDtMPUM7SD1HZChBfDAsQnwwLDE0KXwwO3Y9QztvPUhkKEF8MCxCfDAsNTApfDA7dj12fEM7dT1HZChBfDAsQnwwLDE4KXwwO0U9QztyPUhkKEF8MCxCfDAsNDYpfDA7RT12XihFfEMpO3Y9R2QoQXwwLEJ8MCw0MSl8MDt4PUM7eT1IZChBfDAsQnwwLDIzKXwwO3g9RV4oeHxDKTtFPWcrNTc2fDA7cz1jW0U+PjJdfDA7RT1jW0UrND4+Ml18MDttPURkKHB8MCxtfDAsNTg3NDk2ODM2LDY4NTQ3MTczMyl8MDtFPURkKG18MCxDfDAsc3wwLEV8MCl8MDt4PURkKEV8MCxDfDAsKEh8byleKHV8cileKHZ8eSl8MCx4fDApfDA7eD1EZCh4fDAsQ3wwLChsXmYpJkFebHwwLChqXmIpJkJeanwwKXwwO3k9Qzt2PUdkKEZ8MCxMfDAsMjgpfDA7cj1DO3U9SGQoRnwwLEx8MCwzNil8MDtyPXJ8QztvPUdkKEZ8MCxMfDAsMzQpfDA7SD1DO0U9SGQoRnwwLEx8MCwzMCl8MDtIPXJeKEh8Qyk7cj1HZChGfDAsTHwwLDM5KXwwO3M9QzttPUhkKEZ8MCxMfDAsMjUpfDA7cz1EZCgoSnxEKSZGfEomRHwwLChHfE0pJkx8RyZNfDAsKHZ8dSleKG98RSleKHJ8bSl8MCxIXihzfEMpfDApfDA7SD1DO0s9RGQoSXwwLEt8MCx4fDAseXwwKXwwO0k9Qzt5PURkKHN8MCxIfDAseHwwLHl8MCl8MDt4PUM7SD1HZChLfDAsSXwwLDE0KXwwO3M9QzttPUhkKEt8MCxJfDAsNTApfDA7cz1zfEM7cj1HZChLfDAsSXwwLDE4KXwwO0U9QztvPUhkKEt8MCxJfDAsNDYpfDA7RT1zXihFfEMpO3M9R2QoS3wwLEl8MCw0MSl8MDt1PUM7dj1IZChLfDAsSXwwLDIzKXwwO3U9RV4odXxDKTtFPWcrNTg0fDA7cD1jW0U+PjJdfDA7RT1jW0UrND4+Ml18MDtqPURkKGx8MCxqfDAsMTA4Njc5Mjg1MSw4NTIxNDI5NzEpfDA7RT1EZChqfDAsQ3wwLHB8MCxFfDApfDA7dT1EZChFfDAsQ3wwLChIfG0pXihyfG8pXihzfHYpfDAsdXwwKXwwO3U9RGQodXwwLEN8MCwoZl5BKSZLXmZ8MCwoYl5CKSZJXmJ8MCl8MDt2PUM7cz1HZCh5fDAseHwwLDI4KXwwO289QztyPUhkKHl8MCx4fDAsMzYpfDA7bz1vfEM7bT1HZCh5fDAseHwwLDM0KXwwO0g9QztFPUhkKHl8MCx4fDAsMzApfDA7SD1vXihIfEMpO289R2QoeXwwLHh8MCwzOSl8MDtwPUM7aj1IZCh5fDAseHwwLDI1KXwwO3A9RGQoKER8RikmeXxEJkZ8MCwoTXxMKSZ4fE0mTHwwLChzfHIpXihtfEUpXihvfGopfDAsSF4ocHxDKXwwKXwwO0g9QztHPURkKEp8MCxHfDAsdXwwLHZ8MCl8MDtKPUM7dj1EZChwfDAsSHwwLHV8MCx2fDApfDA7dT1DO0g9R2QoR3wwLEp8MCwxNCl8MDtwPUM7aj1IZChHfDAsSnwwLDUwKXwwO3A9cHxDO289R2QoR3wwLEp8MCwxOCl8MDtFPUM7bT1IZChHfDAsSnwwLDQ2KXwwO0U9cF4oRXxDKTtwPUdkKEd8MCxKfDAsNDEpfDA7cj1DO3M9SGQoR3wwLEp8MCwyMyl8MDtyPUVeKHJ8Qyk7RT1nKzU5MnwwO2w9Y1tFPj4yXXwwO0U9Y1tFKzQ+PjJdfDA7Yj1EZChmfDAsYnwwLDM2NTU0MzEwMCwxMDE3MDM2Mjk4KXwwO0U9RGQoYnwwLEN8MCxsfDAsRXwwKXwwO3I9RGQoRXwwLEN8MCwoSHxqKV4ob3xtKV4ocHxzKXwwLHJ8MCl8MDtyPURkKHJ8MCxDfDAsKEFeSykmR15BfDAsKEJeSSkmSl5CfDApfDA7cz1DO3A9R2QodnwwLHV8MCwyOCl8MDttPUM7bz1IZCh2fDAsdXwwLDM2KXwwO209bXxDO2o9R2QodnwwLHV8MCwzNCl8MDtIPUM7RT1IZCh2fDAsdXwwLDMwKXwwO0g9bV4oSHxDKTttPUdkKHZ8MCx1fDAsMzkpfDA7bD1DO2I9SGQodnwwLHV8MCwyNSl8MDtsPURkKChGfHkpJnZ8RiZ5fDAsKEx8eCkmdXxMJnh8MCwocHxvKV4oanxFKV4obXxiKXwwLEheKGx8Qyl8MCl8MDtIPUM7TT1EZChEfDAsTXwwLHJ8MCxzfDApfDA7RD1DO3M9RGQobHwwLEh8MCxyfDAsc3wwKXwwO3I9QztIPUdkKE18MCxEfDAsMTQpfDA7bD1DO2I9SGQoTXwwLER8MCw1MCl8MDtsPWx8QzttPUdkKE18MCxEfDAsMTgpfDA7RT1DO2o9SGQoTXwwLER8MCw0Nil8MDtFPWxeKEV8Qyk7bD1HZChNfDAsRHwwLDQxKXwwO289QztwPUhkKE18MCxEfDAsMjMpfDA7bz1FXihvfEMpO0U9Zys2MDB8MDtmPWNbRT4+Ml18MDtFPWNbRSs0Pj4yXXwwO0I9RGQoQXwwLEJ8MCwtMTY3NjY2OTYyMCwxMTI2MDAwNTgwKXwwO0U9RGQoQnwwLEN8MCxmfDAsRXwwKXwwO289RGQoRXwwLEN8MCwoSHxiKV4obXxqKV4obHxwKXwwLG98MCl8MDtvPURkKG98MCxDfDAsKEteRykmTV5LfDAsKEleSikmRF5JfDApfDA7cD1DO2w9R2Qoc3wwLHJ8MCwyOCl8MDtqPUM7bT1IZChzfDAscnwwLDM2KXwwO2o9anxDO2I9R2Qoc3wwLHJ8MCwzNCl8MDtIPUM7RT1IZChzfDAscnwwLDMwKXwwO0g9al4oSHxDKTtqPUdkKHN8MCxyfDAsMzkpfDA7Zj1DO0I9SGQoc3wwLHJ8MCwyNSl8MDtmPURkKCh5fHYpJnN8eSZ2fDAsKHh8dSkmcnx4JnV8MCwobHxtKV4oYnxFKV4oanxCKXwwLEheKGZ8Qyl8MCl8MDtIPUM7TD1EZChGfDAsTHwwLG98MCxwfDApfDA7Rj1DO3A9RGQoZnwwLEh8MCxvfDAscHwwKXwwO289QztIPUdkKEx8MCxGfDAsMTQpfDA7Zj1DO0I9SGQoTHwwLEZ8MCw1MCl8MDtmPWZ8QztqPUdkKEx8MCxGfDAsMTgpfDA7RT1DO2I9SGQoTHwwLEZ8MCw0Nil8MDtFPWZeKEV8Qyk7Zj1HZChMfDAsRnwwLDQxKXwwO209QztsPUhkKEx8MCxGfDAsMjMpfDA7bT1FXihtfEMpO0U9Zys2MDh8MDtBPWNbRT4+Ml18MDtFPWNbRSs0Pj4yXXwwO0k9RGQoS3wwLEl8MCwtODg1MTEyMTM4LDEyODgwMzM0NzApfDA7RT1EZChJfDAsQ3wwLEF8MCxFfDApfDA7bT1EZChFfDAsQ3wwLChIfEIpXihqfGIpXihmfGwpfDAsbXwwKXwwO209RGQobXwwLEN8MCwoR15NKSZMXkd8MCwoSl5EKSZGXkp8MCl8MDtsPUM7Zj1HZChwfDAsb3wwLDI4KXwwO2I9QztqPUhkKHB8MCxvfDAsMzYpfDA7Yj1ifEM7Qj1HZChwfDAsb3wwLDM0KXwwO0g9QztFPUhkKHB8MCxvfDAsMzApfDA7SD1iXihIfEMpO2I9R2QocHwwLG98MCwzOSl8MDtBPUM7ST1IZChwfDAsb3wwLDI1KXwwO0E9RGQoKHZ8cykmcHx2JnN8MCwodXxyKSZvfHUmcnwwLChmfGopXihCfEUpXihifEkpfDAsSF4oQXxDKXwwKXwwO0g9Qzt4PURkKHl8MCx4fDAsbXwwLGx8MCl8MDt5PUM7bD1EZChBfDAsSHwwLG18MCxsfDApfDA7bT1DO0g9R2QoeHwwLHl8MCwxNCl8MDtBPUM7ST1IZCh4fDAseXwwLDUwKXwwO0E9QXxDO2I9R2QoeHwwLHl8MCwxOCl8MDtFPUM7Qj1IZCh4fDAseXwwLDQ2KXwwO0U9QV4oRXxDKTtBPUdkKHh8MCx5fDAsNDEpfDA7aj1DO2Y9SGQoeHwwLHl8MCwyMyl8MDtqPUVeKGp8Qyk7RT1nKzYxNnwwO0s9Y1tFPj4yXXwwO0U9Y1tFKzQ+PjJdfDA7Sj1EZChHfDAsSnwwLC02MDQ1NzQzMCwxNTAxNTA1OTQ4KXwwO0U9RGQoSnwwLEN8MCxLfDAsRXwwKXwwO2o9RGQoRXwwLEN8MCwoSHxJKV4oYnxCKV4oQXxmKXwwLGp8MCl8MDtqPURkKGp8MCxDfDAsKE1eTCkmeF5NfDAsKEReRikmeV5EfDApfDA7Zj1DO0E9R2QobHwwLG18MCwyOCl8MDtCPUM7Yj1IZChsfDAsbXwwLDM2KXwwO0I9QnxDO0k9R2QobHwwLG18MCwzNCl8MDtIPUM7RT1IZChsfDAsbXwwLDMwKXwwO0g9Ql4oSHxDKTtCPUdkKGx8MCxtfDAsMzkpfDA7Sz1DO0o9SGQobHwwLG18MCwyNSl8MDtLPURkKChzfHApJmx8cyZwfDAsKHJ8bykmbXxyJm98MCwoQXxiKV4oSXxFKV4oQnxKKXwwLEheKEt8Qyl8MCl8MDtIPUM7dT1EZCh2fDAsdXwwLGp8MCxmfDApfDA7dj1DO2Y9RGQoS3wwLEh8MCxqfDAsZnwwKXwwO2o9QztIPUdkKHV8MCx2fDAsMTQpfDA7Sz1DO0o9SGQodXwwLHZ8MCw1MCl8MDtLPUt8QztCPUdkKHV8MCx2fDAsMTgpfDA7RT1DO0k9SGQodXwwLHZ8MCw0Nil8MDtFPUteKEV8Qyk7Sz1HZCh1fDAsdnwwLDQxKXwwO2I9QztBPUhkKHV8MCx2fDAsMjMpfDA7Yj1FXihifEMpO0U9Zys2MjR8MDtHPWNbRT4+Ml18MDtFPWNbRSs0Pj4yXXwwO0Q9RGQoTXwwLER8MCw5ODcxNjc0NjgsMTYwNzE2NzkxNSl8MDtFPURkKER8MCxDfDAsR3wwLEV8MCl8MDtiPURkKEV8MCxDfDAsKEh8SileKEJ8SSleKEt8QSl8MCxifDApfDA7Yj1EZChifDAsQ3wwLChMXngpJnVeTHwwLChGXnkpJnZeRnwwKXwwO0E9QztLPUdkKGZ8MCxqfDAsMjgpfDA7ST1DO0I9SGQoZnwwLGp8MCwzNil8MDtJPUl8QztKPUdkKGZ8MCxqfDAsMzQpfDA7SD1DO0U9SGQoZnwwLGp8MCwzMCl8MDtIPUleKEh8Qyk7ST1HZChmfDAsanwwLDM5KXwwO0c9QztEPUhkKGZ8MCxqfDAsMjUpfDA7Rz1EZCgocHxsKSZmfHAmbHwwLChvfG0pJmp8byZtfDAsKEt8QileKEp8RSleKEl8RCl8MCxIXihHfEMpfDApfDA7SD1DO3I9RGQoc3wwLHJ8MCxifDAsQXwwKXwwO3M9QztBPURkKEd8MCxIfDAsYnwwLEF8MCl8MDtiPUM7SD1HZChyfDAsc3wwLDE0KXwwO0c9QztEPUhkKHJ8MCxzfDAsNTApfDA7Rz1HfEM7ST1HZChyfDAsc3wwLDE4KXwwO0U9QztKPUhkKHJ8MCxzfDAsNDYpfDA7RT1HXihFfEMpO0c9R2QocnwwLHN8MCw0MSl8MDtCPUM7Sz1IZChyfDAsc3wwLDIzKXwwO0I9RV4oQnxDKTtnPWcrNjMyfDA7RT1jW2c+PjJdfDA7Zz1jW2crND4+Ml18MDtGPURkKEx8MCxGfDAsMTI0NjE4OTU5MSwxODE2NDAyMzE2KXwwO2c9RGQoRnwwLEN8MCxFfDAsZ3wwKXwwO2c9RGQoZ3wwLEN8MCwoSHxEKV4oSXxKKV4oR3xLKXwwLEJ8MCl8MDtnPURkKGd8MCxDfDAsKHhedSkmcl54fDAsKHledikmc155fDApfDA7Qj1DO0s9R2QoQXwwLGJ8MCwyOCl8MDtHPUM7Sj1IZChBfDAsYnwwLDM2KXwwO0c9R3xDO0k9R2QoQXwwLGJ8MCwzNCl8MDtEPUM7SD1IZChBfDAsYnwwLDMwKXwwO0Q9R14oRHxDKTtHPUdkKEF8MCxifDAsMzkpfDA7RT1DO0Y9SGQoQXwwLGJ8MCwyNSl8MDtFPURkKChsfGYpJkF8bCZmfDAsKG18aikmYnxtJmp8MCwoS3xKKV4oSXxIKV4oR3xGKXwwLEReKEV8Qyl8MCl8MDtEPUM7bz1EZChwfDAsb3wwLGd8MCxCfDApfDA7cD1DO0I9RGQoRXwwLER8MCxnfDAsQnwwKXwwO2c9YTtCPURkKGNbZz4+Ml18MCxjW2crND4+Ml18MCxCfDAsQ3wwKXwwO2c9YTtjW2c+PjJdPUI7Y1tnKzQ+PjJdPUM7Zz1lO2c9RGQoY1tnPj4yXXwwLGNbZys0Pj4yXXwwLEF8MCxifDApfDA7YT1lO2NbYT4+Ml09ZztjW2ErND4+Ml09QzthPWs7aj1EZChjW2E+PjJdfDAsY1thKzQ+PjJdfDAsZnwwLGp8MCl8MDtjW2s+PjJdPWo7Y1trKzQ+PjJdPUM7az1uO209RGQoY1trPj4yXXwwLGNbays0Pj4yXXwwLGx8MCxtfDApfDA7Y1tuPj4yXT1tO2Nbbis0Pj4yXT1DO249cTtwPURkKGNbbj4+Ml18MCxjW24rND4+Ml18MCxvfDAscHwwKXwwO2NbcT4+Ml09cDtjW3ErND4+Ml09QztxPXQ7cz1EZChjW3E+PjJdfDAsY1txKzQ+PjJdfDAscnwwLHN8MCl8MDtjW3Q+PjJdPXM7Y1t0KzQ+PjJdPUM7dD13O3Y9RGQoY1t0Pj4yXXwwLGNbdCs0Pj4yXXwwLHV8MCx2fDApfDA7Y1t3Pj4yXT12O2Nbdys0Pj4yXT1DO3c9ejt5PURkKGNbdz4+Ml18MCxjW3crND4+Ml18MCx4fDAseXwwKXwwO2Nbej4+Ml09eTtjW3orND4+Ml09QztpPWg7cmV0dXJufWZ1bmN0aW9uIEliKCl7cmV0dXJuIDE0NH1mdW5jdGlvbiBKYigpe3JldHVybiAxNn1mdW5jdGlvbiBLYigpe3JldHVybiAzMn1mdW5jdGlvbiBMYihhLGIsYyxkLGUpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO3ZhciBmPTAsZz0wO2Y9aTtnPWk9aSs2MyYtNjQ7aT1pKzE0NHwwO1ViKGcsZSk7VGIoZyxiLGMsZCk7UmIoZyxhKTtpPWY7cmV0dXJuIDB9ZnVuY3Rpb24gTWIoYSxiLGMsZCxlKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtyZXR1cm4gUWIoYSxiLGMsZCxlKXwwfWZ1bmN0aW9uIE5iKGEsYil7YT1hfDA7Yj1ifDA7VWIoYSxiKTtyZXR1cm4gMH1mdW5jdGlvbiBPYihhLGIsYyxkKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtUYihhLGIsYyxkKTtyZXR1cm4gMH1mdW5jdGlvbiBQYihhLGIpe2E9YXwwO2I9YnwwO1JiKGEsYik7cmV0dXJuIDB9ZnVuY3Rpb24gUWIoYixjLGQsZSxmKXtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmPWZ8MDt2YXIgZz0wLGg9MCxqPTA7aD1pO2c9aT1pKzYzJi02NDtpPWkrMTYwfDA7aj1nO2c9ZysxNDR8MDtVYihqLGYpO1RiKGosYyxkLGUpO1JiKGosZyk7aT1oO3JldHVybiAoKCgoYVtnKzE+PjBdXmFbYisxPj4wXXxhW2c+PjBdXmFbYj4+MF18YVtnKzI+PjBdXmFbYisyPj4wXXxhW2crMz4+MF1eYVtiKzM+PjBdfGFbZys0Pj4wXV5hW2IrND4+MF18YVtnKzU+PjBdXmFbYis1Pj4wXXxhW2crNj4+MF1eYVtiKzY+PjBdfGFbZys3Pj4wXV5hW2IrNz4+MF18YVtnKzg+PjBdXmFbYis4Pj4wXXxhW2crOT4+MF1eYVtiKzk+PjBdfGFbZysxMD4+MF1eYVtiKzEwPj4wXXxhW2crMTE+PjBdXmFbYisxMT4+MF18YVtnKzEyPj4wXV5hW2IrMTI+PjBdfGFbZysxMz4+MF1eYVtiKzEzPj4wXXxhW2crMTQ+PjBdXmFbYisxND4+MF18YVtnKzE1Pj4wXV5hW2IrMTU+PjBdKSYyNTUpKzUxMXwwKT4+PjgmMSkrLTF8MH1mdW5jdGlvbiBSYihiLGQpe2I9YnwwO2Q9ZHwwO3ZhciBlPTAsZj0wLGc9MCxoPTAsaT0wLGo9MCxrPTAsbD0wLG09MCxuPTAsbz0wLHA9MCxxPTAscj0wO2g9Yis1NnwwO2c9Y1toPj4yXXwwO2g9Y1toKzQ+PjJdfDA7aWYoISgoZ3wwKT09MCYoaHwwKT09MCkpe2U9Yis2NHwwO2FbZStnPj4wXT0xO2Y9RGQoZ3wwLGh8MCwxLDApfDA7aT1DO2lmKGk+Pj4wPDB8KGl8MCk9PTAmZj4+PjA8MTYpe2k9Q2QoMTQsMCxnfDAsaHwwKXwwO0ZkKGIrKGYrNjQpfDAsMCxpKzF8MCl8MH1hW2IrODA+PjBdPTE7U2IoYixlLDE2LDApfWk9Y1tiKzI0Pj4yXXwwO3A9KGNbYisyOD4+Ml18MCkrKGk+Pj4yNil8MDtlPXAmNjcxMDg4NjM7bj0ocD4+PjI2KSsoY1tiKzMyPj4yXXwwKXwwO209biY2NzEwODg2MztmPShuPj4+MjYpKyhjW2IrMzY+PjJdfDApfDA7aD0oKGY+Pj4yNikqNXwwKSsoY1tiKzIwPj4yXXwwKXwwO2c9aCY2NzEwODg2MztpPShoPj4+MjYpKyhpJjY3MTA4ODYzKXwwO3I9KChnKzV8MCk+Pj4yNikraXwwO3E9cj4+PjI2O289KHErZXwwKT4+PjI2O2s9KGZ8LTY3MTA4ODY0KSsoKG8rbXwwKT4+PjI2KXwwO2w9KGs+Pj4zMSkrLTF8MDtqPWs+PjMxO2k9ciY2NzEwODg2MyZsfGomaTtlPXErcCY2NzEwODg2MyZsfGomZTttPW8rbiY2NzEwODg2MyZsfGombTtnPURkKGgrNSY2NzEwODg2MyZsfGomZ3xpPDwyNnwwLDAsY1tiKzQwPj4yXXwwLDApfDA7aD1DO2k9RGQoaT4+PjZ8ZTw8MjB8MCwwLGNbYis0ND4+Ml18MCwwKXwwO2g9RGQoaXwwLEN8MCxofDAsMCl8MDtpPUM7ZT1EZChlPj4+MTJ8bTw8MTR8MCwwLGNbYis0OD4+Ml18MCwwKXwwO2k9RGQoZXwwLEN8MCxpfDAsMCl8MDtlPUM7Zj1EZChtPj4+MTh8KGwma3xqJmYpPDw4fDAsMCxjW2IrNTI+PjJdfDAsMCl8MDtlPURkKGZ8MCxDfDAsZXwwLDApfDA7YVtkPj4wXT1nO2FbZCsxPj4wXT1nPj4+ODthW2QrMj4+MF09Zz4+PjE2O2FbZCszPj4wXT1nPj4+MjQ7YVtkKzQ+PjBdPWg7YVtkKzU+PjBdPWg+Pj44O2FbZCs2Pj4wXT1oPj4+MTY7YVtkKzc+PjBdPWg+Pj4yNDthW2QrOD4+MF09aTthW2QrOT4+MF09aT4+Pjg7YVtkKzEwPj4wXT1pPj4+MTY7YVtkKzExPj4wXT1pPj4+MjQ7YVtkKzEyPj4wXT1lO2FbZCsxMz4+MF09ZT4+Pjg7YVtkKzE0Pj4wXT1lPj4+MTY7YVtkKzE1Pj4wXT1lPj4+MjQ7ZT1iKzg4fDA7ZG97YVtiPj4wXT0wO2I9YisxfDB9d2hpbGUoKGJ8MCk8KGV8MCkpO3JldHVybn1mdW5jdGlvbiBTYihiLGUsZixnKXtiPWJ8MDtlPWV8MDtmPWZ8MDtnPWd8MDt2YXIgaD0wLGk9MCxqPTAsaz0wLGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MCx2PTAsdz0wLHg9MCx5PTAsej0wLEE9MCxCPTAsRD0wLEU9MCxGPTAsRz0wLEg9MCxJPTAsSj0wO3M9KGFbYis4MD4+MF18MCkhPTA/MDoxNjc3NzIxNjt0PWNbYis0Pj4yXXwwO3U9Y1tiKzg+PjJdfDA7bT1jW2IrMTI+PjJdfDA7bj1jW2IrMTY+PjJdfDA7dj1iKzIwfDA7bD1jW3Y+PjJdfDA7dz1iKzI0fDA7az1jW3c+PjJdfDA7eD1iKzI4fDA7aj1jW3g+PjJdfDA7eT1iKzMyfDA7aT1jW3k+PjJdfDA7ej1iKzM2fDA7aD1jW3o+PjJdfDA7aWYoIShnPj4+MD4wfChnfDApPT0wJmY+Pj4wPjE1KSl7cT1sO3I9aztzPWo7dD1pO3U9aDtjW3Y+PjJdPXE7Y1t3Pj4yXT1yO2NbeD4+Ml09cztjW3k+PjJdPXQ7Y1t6Pj4yXT11O3JldHVybn1vPW4qNXwwO3A9bSo1fDA7cT11KjV8MDtyPXQqNXwwO2I9Y1tiPj4yXXwwO3doaWxlKDEpe0o9ZFtlKzM+PjBdfDA7Qj0oZFtlKzE+PjBdPDw4fGRbZT4+MF18ZFtlKzI+PjBdPDwxNnxKPDwyNCY1MDMzMTY0OCkrbHwwO0g9ZFtlKzY+PjBdfDA7Sj0oKGRbZSs0Pj4wXTw8OHxKfGRbZSs1Pj4wXTw8MTZ8SDw8MjQpPj4+MiY2NzEwODg2Mykra3wwO0c9ZFtlKzk+PjBdfDA7SD0oKGRbZSs3Pj4wXTw8OHxIfGRbZSs4Pj4wXTw8MTZ8Rzw8MjQpPj4+NCY2NzEwODg2MykranwwO0c9KChkW2UrMTA+PjBdPDw4fEd8ZFtlKzExPj4wXTw8MTZ8ZFtlKzEyPj4wXTw8MjQpPj4+NikraXwwO2w9KGRbZSsxMz4+MF18c3xkW2UrMTQ+PjBdPDw4fGRbZSsxNT4+MF08PDE2KStofDA7az1PZChCfDAsMCxifDAsMCl8MDtqPUM7QT1PZChKfDAsMCxvfDAsMCl8MDtqPURkKEF8MCxDfDAsa3wwLGp8MCl8MDtrPUM7QT1PZChIfDAsMCxwfDAsMCl8MDtBPURkKGp8MCxrfDAsQXwwLEN8MCl8MDtrPUM7aj1PZChHfDAsMCxxfDAsMCl8MDtqPURkKEF8MCxrfDAsanwwLEN8MCl8MDtrPUM7QT1PZChsfDAsMCxyfDAsMCl8MDtBPURkKGp8MCxrfDAsQXwwLEN8MCl8MDtrPUM7aj1PZChCfDAsMCx0fDAsMCl8MDtpPUM7Rj1PZChKfDAsMCxifDAsMCl8MDtpPURkKEZ8MCxDfDAsanwwLGl8MCl8MDtqPUM7Rj1PZChIfDAsMCxvfDAsMCl8MDtGPURkKGl8MCxqfDAsRnwwLEN8MCl8MDtqPUM7aT1PZChHfDAsMCxwfDAsMCl8MDtpPURkKEZ8MCxqfDAsaXwwLEN8MCl8MDtqPUM7Rj1PZChsfDAsMCxxfDAsMCl8MDtGPURkKGl8MCxqfDAsRnwwLEN8MCl8MDtqPUM7aT1PZChCfDAsMCx1fDAsMCl8MDtoPUM7RT1PZChKfDAsMCx0fDAsMCl8MDtoPURkKEV8MCxDfDAsaXwwLGh8MCl8MDtpPUM7RT1PZChIfDAsMCxifDAsMCl8MDtFPURkKGh8MCxpfDAsRXwwLEN8MCl8MDtpPUM7aD1PZChHfDAsMCxvfDAsMCl8MDtoPURkKEV8MCxpfDAsaHwwLEN8MCl8MDtpPUM7RT1PZChsfDAsMCxwfDAsMCl8MDtFPURkKGh8MCxpfDAsRXwwLEN8MCl8MDtpPUM7aD1PZChCfDAsMCxtfDAsMCl8MDtJPUM7RD1PZChKfDAsMCx1fDAsMCl8MDtJPURkKER8MCxDfDAsaHwwLEl8MCl8MDtoPUM7RD1PZChIfDAsMCx0fDAsMCl8MDtEPURkKEl8MCxofDAsRHwwLEN8MCl8MDtoPUM7ST1PZChHfDAsMCxifDAsMCl8MDtJPURkKER8MCxofDAsSXwwLEN8MCl8MDtoPUM7RD1PZChsfDAsMCxvfDAsMCl8MDtEPURkKEl8MCxofDAsRHwwLEN8MCl8MDtoPUM7Qj1PZChCfDAsMCxufDAsMCl8MDtJPUM7Sj1PZChKfDAsMCxtfDAsMCl8MDtJPURkKEp8MCxDfDAsQnwwLEl8MCl8MDtCPUM7SD1PZChIfDAsMCx1fDAsMCl8MDtIPURkKEl8MCxCfDAsSHwwLEN8MCl8MDtCPUM7Rz1PZChHfDAsMCx0fDAsMCl8MDtHPURkKEh8MCxCfDAsR3wwLEN8MCl8MDtCPUM7bD1PZChsfDAsMCxifDAsMCl8MDtsPURkKEd8MCxCfDAsbHwwLEN8MCl8MDtCPUM7az1HZChBfDAsa3wwLDI2KXwwO2s9RGQoRnwwLGp8MCxrfDAsMCl8MDtqPUdkKGt8MCxDfDAsMjYpfDA7aj1EZChFfDAsaXwwLGp8MCwwKXwwO2k9R2QoanwwLEN8MCwyNil8MDtqPWomNjcxMDg4NjM7aT1EZChEfDAsaHwwLGl8MCwwKXwwO2g9R2QoaXwwLEN8MCwyNil8MDtpPWkmNjcxMDg4NjM7aD1EZChsfDAsQnwwLGh8MCwwKXwwO0I9R2QoaHwwLEN8MCwyNil8MDtoPWgmNjcxMDg4NjM7Qj1CKjV8MDtsPUIrQSY2NzEwODg2MztrPSgoQisoQSY2NzEwODg2Myl8MCk+Pj4yNikrKGsmNjcxMDg4NjMpfDA7Zj1EZChmfDAsZ3wwLC0xNiwtMSl8MDtnPUM7aWYoIShnPj4+MD4wfChnfDApPT0wJmY+Pj4wPjE1KSlicmVhaztlbHNlIGU9ZSsxNnwwfWNbdj4+Ml09bDtjW3c+PjJdPWs7Y1t4Pj4yXT1qO2NbeT4+Ml09aTtjW3o+PjJdPWg7cmV0dXJufWZ1bmN0aW9uIFRiKGIsZCxlLGYpe2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO3ZhciBnPTAsaD0wLGk9MCxqPTAsaz0wLGw9MCxtPTAsbj0wLG89MDtuPWIrNTZ8MDtnPW47aD1jW2c+PjJdfDA7Zz1jW2crND4+Ml18MDtkbyBpZighKChofDApPT0wJihnfDApPT0wKSl7bD1DZCgxNiwwLGh8MCxnfDApfDA7bT1DO2s9bT4+PjA+Zj4+PjB8KG18MCk9PShmfDApJmw+Pj4wPmU+Pj4wO2w9az9lOmw7bT1rP2Y6bTtpZighKChsfDApPT0wJihtfDApPT0wKSl7aj1iKzY0fDA7az0wO2k9MDtkb3tvPWFbZCtrPj4wXXwwO2c9RGQoaHwwLGd8MCxrfDAsaXwwKXwwO2FbaitnPj4wXT1vO2s9RGQoa3wwLGl8MCwxLDApfDA7aT1DO2c9bjtoPWNbZz4+Ml18MDtnPWNbZys0Pj4yXXwwfXdoaWxlKGk+Pj4wPG0+Pj4wfChpfDApPT0obXwwKSZrPj4+MDxsPj4+MCl9bz1EZChofDAsZ3wwLGx8MCxtfDApfDA7az1DO2o9bjtjW2o+PjJdPW87Y1tqKzQ+PjJdPWs7aWYoaz4+PjA8MHwoa3wwKT09MCZvPj4+MDwxNilyZXR1cm47ZWxzZXtlPUNkKGV8MCxmfDAsbHwwLG18MCl8MDtmPUM7U2IoYixiKzY0fDAsMTYsMCk7bz1uO2Nbbz4+Ml09MDtjW28rND4+Ml09MDtkPWQrbHwwO2JyZWFrfX13aGlsZSgwKTtpZihmPj4+MD4wfChmfDApPT0wJmU+Pj4wPjE1KXtpPWUmLTE2O1NiKGIsZCxpLGYpO2U9Q2QoZXwwLGZ8MCxpfDAsZnwwKXwwO2Q9ZCtpfDA7aT1DfWVsc2UgaT1mO2lmKChlfDApPT0wJihpfDApPT0wKXJldHVybjtmPWIrNjR8MDtnPTA7aD0wO2Rve2I9YVtkK2c+PjBdfDA7bz1uO289RGQoY1tvPj4yXXwwLGNbbys0Pj4yXXwwLGd8MCxofDApfDA7YVtmK28+PjBdPWI7Zz1EZChnfDAsaHwwLDEsMCl8MDtoPUN9d2hpbGUoaD4+PjA8aT4+PjB8KGh8MCk9PShpfDApJmc+Pj4wPGU+Pj4wKTtiPW47Yj1EZChjW2I+PjJdfDAsY1tiKzQ+PjJdfDAsZXwwLGl8MCl8MDtvPW47Y1tvPj4yXT1iO2Nbbys0Pj4yXT1DO3JldHVybn1mdW5jdGlvbiBVYihiLGUpe2I9YnwwO2U9ZXwwO3ZhciBmPTAsZz0wO2Y9ZSszfDA7Y1tiPj4yXT0oZFtlKzE+PjBdfDApPDw4fChkW2U+PjBdfDApfChkW2UrMj4+MF18MCk8PDE2fChkW2Y+PjBdfDApPDwyNCY1MDMzMTY0ODtnPWUrNnwwO2NbYis0Pj4yXT0oKGRbZSs0Pj4wXXwwKTw8OHwoZFtmPj4wXXwwKXwoZFtlKzU+PjBdfDApPDwxNnwoZFtnPj4wXXwwKTw8MjQpPj4+MiY2NzEwODYxMTtmPWUrOXwwO2NbYis4Pj4yXT0oKGRbZSs3Pj4wXXwwKTw8OHwoZFtnPj4wXXwwKXwoZFtlKzg+PjBdfDApPDwxNnwoZFtmPj4wXXwwKTw8MjQpPj4+NCY2NzA5MjczNTtjW2IrMTI+PjJdPSgoZFtlKzEwPj4wXXwwKTw8OHwoZFtmPj4wXXwwKXwoZFtlKzExPj4wXXwwKTw8MTZ8KGRbZSsxMj4+MF18MCk8PDI0KT4+PjYmNjYwNzY2NzE7Y1tiKzE2Pj4yXT0oZFtlKzE0Pj4wXXwwKTw8OHwoZFtlKzEzPj4wXXwwKXwoZFtlKzE1Pj4wXXwwKTw8MTYmOTgzMDQwO2Y9YisyMHwwO2NbZj4+Ml09MDtjW2YrND4+Ml09MDtjW2YrOD4+Ml09MDtjW2YrMTI+PjJdPTA7Y1tmKzE2Pj4yXT0wO2NbYis0MD4+Ml09KGRbZSsxNz4+MF18MCk8PDh8KGRbZSsxNj4+MF18MCl8KGRbZSsxOD4+MF18MCk8PDE2fChkW2UrMTk+PjBdfDApPDwyNDtjW2IrNDQ+PjJdPShkW2UrMjE+PjBdfDApPDw4fChkW2UrMjA+PjBdfDApfChkW2UrMjI+PjBdfDApPDwxNnwoZFtlKzIzPj4wXXwwKTw8MjQ7Y1tiKzQ4Pj4yXT0oZFtlKzI1Pj4wXXwwKTw8OHwoZFtlKzI0Pj4wXXwwKXwoZFtlKzI2Pj4wXXwwKTw8MTZ8KGRbZSsyNz4+MF18MCk8PDI0O2NbYis1Mj4+Ml09KGRbZSsyOT4+MF18MCk8PDh8KGRbZSsyOD4+MF18MCl8KGRbZSszMD4+MF18MCk8PDE2fChkW2UrMzE+PjBdfDApPDwyNDtlPWIrNTZ8MDtjW2U+PjJdPTA7Y1tlKzQ+PjJdPTA7YVtiKzgwPj4wXT0wO3JldHVybn1mdW5jdGlvbiBWYihiLGUsZixnLGgpe2I9YnwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO3ZhciBqPTAsaz0wLGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MCx2PTAsdz0wO3c9aTt0PWk9aSs2MyYtNjQ7aT1pKzQ4fDA7aj10Kzh8MDt1PXQrNHwwO2lmKChhW2c+PjBdfDApIT0zNil7aD0wO2k9dztyZXR1cm4gaHwwfWlmKChhW2crMT4+MF18MCkhPTU1KXtoPTA7aT13O3JldHVybiBofDB9aWYoKGFbZysyPj4wXXwwKSE9MzYpe2g9MDtpPXc7cmV0dXJuIGh8MH1vPWFbZyszPj4wXXwwO249byYyNTU7YTpkbyBpZigxKXtsPTY1O2s9MzQ4ODE7ZG97aWYoKGFbaz4+MF18MCk9PW88PDI0Pj4yNClicmVhayBhO2s9aysxfDA7bD1sKy0xfDA7bT0obHwwKSE9MH13aGlsZShtJihrJjN8MCkhPTApO2lmKCFtKXtoPTA7aT13O3JldHVybiBofDB9fWVsc2V7bD02NTtrPTM0ODgxfXdoaWxlKDApO2I6ZG8gaWYoKGFbaz4+MF18MCkhPW88PDI0Pj4yNCl7bT1fKG4sMTY4NDMwMDkpfDA7YzpkbyBpZihsPj4+MD4zKXdoaWxlKDEpe3M9Y1trPj4yXV5tO2lmKChzJi0yMTM5MDYyMTQ0Xi0yMTM5MDYyMTQ0KSZzKy0xNjg0MzAwOSlicmVhayBjO2s9ays0fDA7bD1sKy00fDA7aWYobD4+PjA8PTMpe3Y9MTI7YnJlYWt9fWVsc2Ugdj0xMjt3aGlsZSgwKTtpZigodnwwKT09MTIpaWYoIWwpe2g9MDtpPXc7cmV0dXJuIGh8MH13aGlsZSgxKXtpZigoYVtrPj4wXXwwKT09bzw8MjQ+PjI0KWJyZWFrIGI7bD1sKy0xfDA7aWYoIWwpe2o9MDticmVha31lbHNlIGs9aysxfDB9aT13O3JldHVybiBqfDB9d2hpbGUoMCk7aWYoKGt8MCk9PTB8KGx8MCk9PTApe2g9MDtpPXc7cmV0dXJuIGh8MH1yPUhkKDEsMCxrLTM0ODgxfDApfDA7cz1DO2s9WGIodSxnKzR8MCl8MDtpZighayl7aD0wO2k9dztyZXR1cm4gaHwwfXE9WGIodCxrKXwwO2lmKCFxKXtoPTA7aT13O3JldHVybiBofDB9bz1xO3A9by1nfDA7bj0obyYzfDApPT0wO2Q6ZG8gaWYobil7az1xO3Y9MjJ9ZWxzZXtsPXE7az1vO3doaWxlKDEpe2lmKCEoYVtsPj4wXXwwKSlicmVhayBkO2w9bCsxfDA7az1sO2lmKCEoayYzKSl7az1sO3Y9MjI7YnJlYWt9fX13aGlsZSgwKTtpZigodnwwKT09MjIpe3doaWxlKDEpe2w9Y1trPj4yXXwwO2lmKCEoKGwmLTIxMzkwNjIxNDReLTIxMzkwNjIxNDQpJmwrLTE2ODQzMDA5KSlrPWsrNHwwO2Vsc2UgYnJlYWt9aWYoKGwmMjU1KTw8MjQ+PjI0KWRvIGs9aysxfDA7d2hpbGUoKGFbaz4+MF18MCkhPTApfWw9ay1vKzF8MDt3aGlsZSgxKXtrPWwrLTF8MDtpZighbCl7dj0zMjticmVha31tPXEra3wwO2lmKChhW20+PjBdfDApPT0zNil7dj0zMDticmVha31lbHNlIGw9a31pZigodnwwKT09MzApaWYoIW0pdj0zMjtlbHNlIGw9bCstMXwwO2lmKCh2fDApPT0zMil7ZTpkbyBpZihuKXtrPXE7dj0zNX1lbHNle2s9cTtsPW87d2hpbGUoMSl7aWYoIShhW2s+PjBdfDApKXtrPWw7YnJlYWsgZX1rPWsrMXwwO2w9aztpZighKGwmMykpe3Y9MzU7YnJlYWt9fX13aGlsZSgwKTtpZigodnwwKT09MzUpe3doaWxlKDEpe2w9Y1trPj4yXXwwO2lmKCEoKGwmLTIxMzkwNjIxNDReLTIxMzkwNjIxNDQpJmwrLTE2ODQzMDA5KSlrPWsrNHwwO2Vsc2UgYnJlYWt9aWYoKGwmMjU1KTw8MjQ+PjI0KWRvIGs9aysxfDA7d2hpbGUoKGFbaz4+MF18MCkhPTApfWw9ay1vfDB9az1sK3B8MDtwPWsrNDV8MDtpZihwPj4+MD4xMDJ8cD4+PjA8bD4+PjApe2g9MDtpPXc7cmV0dXJuIGh8MH1pZihoYyhiLGUsZixxLGwscixzLGNbdT4+Ml18MCxjW3Q+PjJdfDAsaiwzMil8MCl7aD0wO2k9dztyZXR1cm4gaHwwfUlkKGh8MCxnfDAsa3wwKXwwO3M9aCtrfDA7cj1zKzF8MDthW3M+PjBdPTM2O3M9cjtyPWgrMTAyLXJ8MDtrPTA7Zjp3aGlsZSgxKXtpZihrPj4+MDwzMil7cD0wO3E9aztrPTB9ZWxzZSBicmVhaztkb3tnPXE7cT1xKzF8MDtrPWRbaitnPj4wXTw8cHxrO3A9cCs4fDB9d2hpbGUocT4+PjA8MzImcD4+PjA8MjQpO2lmKCFwKWs9cztlbHNle2w9azttPXI7bj1zO289MDt3aGlsZSgxKXtpZighbSl7dj01MDticmVhayBmfWs9bisxfDA7YVtuPj4wXT1hWzM0ODgxKyhsJjYzKT4+MF18MDtvPW8rNnwwO2lmKG8+Pj4wPj1wPj4+MClicmVhaztlbHNle2w9bD4+PjY7bT1tKy0xfDA7bj1rfX19Zz0oa3wwKT09MDtyPShnPzA6cy1rfDApK3J8MDtpZihnKXt2PTUwO2JyZWFrfWVsc2V7cz1rO2s9cX19aWYoKHZ8MCk9PTUwKXtrPWorMzJ8MDtkb3thW2o+PjBdPTA7aj1qKzF8MH13aGlsZSgoanwwKTwoa3wwKSk7aD0wO2k9dztyZXR1cm4gaHwwfWs9aiszMnwwO2Rve2Fbaj4+MF09MDtqPWorMXwwfXdoaWxlKChqfDApPChrfDApKTtpZighKChzfDApIT0wJnM+Pj4wPChoKzEwMnwwKT4+PjApKXtoPTA7aT13O3JldHVybiBofDB9YVtzPj4wXT0wO2k9dztyZXR1cm4gaHwwfWZ1bmN0aW9uIFdiKGEsYixkLGUsZixnLGgsaixrLGwpe2E9YXwwO2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO2o9anwwO2s9a3wwO2w9bHwwO3ZhciBtPTAsbj0wO209aTtuPWk9aSs2MyYtNjQ7aT1pKzE2fDA7Y1tuKzQ+PjJdPTA7Y1tuPj4yXT0wO2Nbbis4Pj4yXT0wO2Y9aGMobixhLGIsZCxlLGYsZyxoLGosayxsKXwwO2c9Y1tuPj4yXXwwO2lmKCFnKXtpPW07cmV0dXJuIGZ8MH16ZChnKTtpPW07cmV0dXJuIGZ8MH1mdW5jdGlvbiBYYihiLGQpe2I9YnwwO2Q9ZHwwO3ZhciBlPTAsZj0wLGc9MCxoPTAsaT0wLGo9MCxrPTAsbD0wLG09MCxuPTA7aT1hW2Q+PjBdfDA7aD1pJjI1NTthOmRvIGlmKDEpe2U9NjU7Zj0zNDg4MTtkb3tpZigoYVtmPj4wXXwwKT09aTw8MjQ+PjI0KWJyZWFrIGE7Zj1mKzF8MDtlPWUrLTF8MDtnPShlfDApIT0wfXdoaWxlKGcmKGYmM3wwKSE9MCk7aWYoIWcpe2Q9MDtuPTA7Y1tiPj4yXT1uO3JldHVybiBkfDB9fWVsc2V7ZT02NTtmPTM0ODgxfXdoaWxlKDApO2I6ZG8gaWYoKGFbZj4+MF18MCkhPWk8PDI0Pj4yNCl7Zz1fKGgsMTY4NDMwMDkpfDA7YzpkbyBpZihlPj4+MD4zKXdoaWxlKDEpe209Y1tmPj4yXV5nO2lmKChtJi0yMTM5MDYyMTQ0Xi0yMTM5MDYyMTQ0KSZtKy0xNjg0MzAwOSlicmVhayBjO2Y9Zis0fDA7ZT1lKy00fDA7aWYoZT4+PjA8PTMpe249OTticmVha319ZWxzZSBuPTk7d2hpbGUoMCk7aWYoKG58MCk9PTkpaWYoIWUpe2Q9MDtuPTA7Y1tiPj4yXT1uO3JldHVybiBkfDB9d2hpbGUoMSl7aWYoKGFbZj4+MF18MCk9PWk8PDI0Pj4yNClicmVhayBiO2U9ZSstMXwwO2lmKCFlKXtlPTA7Zj0wO2JyZWFrfWVsc2UgZj1mKzF8MH1jW2I+PjJdPWY7cmV0dXJuIGV8MH13aGlsZSgwKTtpZigoZnwwKT09MHwoZXwwKT09MCl7ZD0wO249MDtjW2I+PjJdPW47cmV0dXJuIGR8MH1qPWFbZCsxPj4wXXwwO2k9aiYyNTU7ZDpkbyBpZigxKXtlPTY1O2c9MzQ4ODE7ZG97aWYoKGFbZz4+MF18MCk9PWo8PDI0Pj4yNClicmVhayBkO2c9ZysxfDA7ZT1lKy0xfDA7aD0oZXwwKSE9MH13aGlsZShoJihnJjN8MCkhPTApO2lmKCFoKXtkPTA7bj0wO2NbYj4+Ml09bjtyZXR1cm4gZHwwfX1lbHNle2U9NjU7Zz0zNDg4MX13aGlsZSgwKTtlOmRvIGlmKChhW2c+PjBdfDApIT1qPDwyND4+MjQpe2g9XyhpLDE2ODQzMDA5KXwwO2Y6ZG8gaWYoZT4+PjA+Myl3aGlsZSgxKXttPWNbZz4+Ml1eaDtpZigobSYtMjEzOTA2MjE0NF4tMjEzOTA2MjE0NCkmbSstMTY4NDMwMDkpYnJlYWsgZjtnPWcrNHwwO2U9ZSstNHwwO2lmKGU+Pj4wPD0zKXtuPTIyO2JyZWFrfX1lbHNlIG49MjI7d2hpbGUoMCk7aWYoKG58MCk9PTIyKWlmKCFlKXtkPTA7bj0wO2NbYj4+Ml09bjtyZXR1cm4gZHwwfXdoaWxlKDEpe2lmKChhW2c+PjBdfDApPT1qPDwyND4+MjQpYnJlYWsgZTtlPWUrLTF8MDtpZighZSl7ZT0wO2Y9MDticmVha31lbHNlIGc9ZysxfDB9Y1tiPj4yXT1mO3JldHVybiBlfDB9d2hpbGUoMCk7aWYoKGd8MCk9PTB8KGV8MCk9PTApe2Q9MDtuPTA7Y1tiPj4yXT1uO3JldHVybiBkfDB9az1hW2QrMj4+MF18MDtqPWsmMjU1O2c6ZG8gaWYoMSl7ZT02NTtoPTM0ODgxO2Rve2lmKChhW2g+PjBdfDApPT1rPDwyND4+MjQpYnJlYWsgZztoPWgrMXwwO2U9ZSstMXwwO2k9KGV8MCkhPTB9d2hpbGUoaSYoaCYzfDApIT0wKTtpZighaSl7ZD0wO249MDtjW2I+PjJdPW47cmV0dXJuIGR8MH19ZWxzZXtlPTY1O2g9MzQ4ODF9d2hpbGUoMCk7aDpkbyBpZigoYVtoPj4wXXwwKSE9azw8MjQ+PjI0KXtpPV8oaiwxNjg0MzAwOSl8MDtpOmRvIGlmKGU+Pj4wPjMpd2hpbGUoMSl7bT1jW2g+PjJdXmk7aWYoKG0mLTIxMzkwNjIxNDReLTIxMzkwNjIxNDQpJm0rLTE2ODQzMDA5KWJyZWFrIGk7aD1oKzR8MDtlPWUrLTR8MDtpZihlPj4+MDw9Myl7bj0zNjticmVha319ZWxzZSBuPTM2O3doaWxlKDApO2lmKChufDApPT0zNilpZighZSl7ZD0wO249MDtjW2I+PjJdPW47cmV0dXJuIGR8MH13aGlsZSgxKXtpZigoYVtoPj4wXXwwKT09azw8MjQ+PjI0KWJyZWFrIGg7ZT1lKy0xfDA7aWYoIWUpe2U9MDtmPTA7YnJlYWt9ZWxzZSBoPWgrMXwwfWNbYj4+Ml09ZjtyZXR1cm4gZXwwfXdoaWxlKDApO2lmKChofDApPT0wfChlfDApPT0wKXtkPTA7bj0wO2NbYj4+Ml09bjtyZXR1cm4gZHwwfWw9YVtkKzM+PjBdfDA7az1sJjI1NTtqOmRvIGlmKDEpe2U9NjU7aT0zNDg4MTtkb3tpZigoYVtpPj4wXXwwKT09bDw8MjQ+PjI0KWJyZWFrIGo7aT1pKzF8MDtlPWUrLTF8MDtqPShlfDApIT0wfXdoaWxlKGomKGkmM3wwKSE9MCk7aWYoIWope2Q9MDtuPTA7Y1tiPj4yXT1uO3JldHVybiBkfDB9fWVsc2V7ZT02NTtpPTM0ODgxfXdoaWxlKDApO2s6ZG8gaWYoKGFbaT4+MF18MCk9PWw8PDI0Pj4yNCltPWk7ZWxzZXtqPV8oaywxNjg0MzAwOSl8MDtsOmRvIGlmKGU+Pj4wPjMpd2hpbGUoMSl7bT1jW2k+PjJdXmo7aWYoKG0mLTIxMzkwNjIxNDReLTIxMzkwNjIxNDQpJm0rLTE2ODQzMDA5KWJyZWFrIGw7aT1pKzR8MDtlPWUrLTR8MDtpZihlPj4+MDw9Myl7bj00OTticmVha319ZWxzZSBuPTQ5O3doaWxlKDApO2lmKChufDApPT00OSlpZighZSl7ZD0wO249MDtjW2I+PjJdPW47cmV0dXJuIGR8MH13aGlsZSgxKXtpZigoYVtpPj4wXXwwKT09bDw8MjQ+PjI0KXttPWk7YnJlYWsga31lPWUrLTF8MDtpZighZSl7ZT0wO2Y9MDticmVha31lbHNlIGk9aSsxfDB9Y1tiPj4yXT1mO3JldHVybiBlfDB9d2hpbGUoMCk7aWYoKG18MCk9PTB8KGV8MCk9PTApe2Q9MDtuPTA7Y1tiPj4yXT1uO3JldHVybiBkfDB9bD1hW2QrND4+MF18MDtrPWwmMjU1O206ZG8gaWYoMSl7aT02NTtlPTM0ODgxO2Rve2lmKChhW2U+PjBdfDApPT1sPDwyND4+MjQpYnJlYWsgbTtlPWUrMXwwO2k9aSstMXwwO2o9KGl8MCkhPTB9d2hpbGUoaiYoZSYzfDApIT0wKTtpZighail7ZD0wO249MDtjW2I+PjJdPW47cmV0dXJuIGR8MH19ZWxzZXtpPTY1O2U9MzQ4ODF9d2hpbGUoMCk7bjpkbyBpZigoYVtlPj4wXXwwKSE9bDw8MjQ+PjI0KXtqPV8oaywxNjg0MzAwOSl8MDtvOmRvIGlmKGk+Pj4wPjMpd2hpbGUoMSl7az1jW2U+PjJdXmo7aWYoKGsmLTIxMzkwNjIxNDReLTIxMzkwNjIxNDQpJmsrLTE2ODQzMDA5KWJyZWFrIG87ZT1lKzR8MDtpPWkrLTR8MDtpZihpPj4+MDw9Myl7bj02MjticmVha319ZWxzZSBuPTYyO3doaWxlKDApO2lmKChufDApPT02MilpZighaSl7ZD0wO249MDtjW2I+PjJdPW47cmV0dXJuIGR8MH13aGlsZSgxKXtpZigoYVtlPj4wXXwwKT09bDw8MjQ+PjI0KWJyZWFrIG47aT1pKy0xfDA7aWYoIWkpe2U9MDtmPTA7YnJlYWt9ZWxzZSBlPWUrMXwwfWNbYj4+Ml09ZjtyZXR1cm4gZXwwfXdoaWxlKDApO2lmKChlfDApPT0wfChpfDApPT0wKXtkPTA7bj0wO2NbYj4+Ml09bjtyZXR1cm4gZHwwfWQ9ZCs1fDA7bj1lLTM0ODgxPDwyNHwobS0zNDg4MTw8MTh8KGgtMzQ4ODE8PDEyfChnLTM0ODgxPDw2fGYtMzQ4ODEpKSk7Y1tiPj4yXT1uO3JldHVybiBkfDB9ZnVuY3Rpb24gWWIoYixkLGUsZixnLGgpe2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO3ZhciBqPTAsaz0wLGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MCx2PTAsdz0wLHg9MCx5PTAsej0wLEE9MDtBPWk7dz1pPWkrNjMmLTY0O2k9aSs1NjB8MDtyPXcrNDg4fDA7ej13KzQ1NnwwO3Y9dysyMDh8MDt4PXc7eT13KzQxNnwwO3c9dys0MjR8MDtuPXYrMzJ8MDtpZihkPj4+MDw9NjQpe3A9bjtjW3A+PjJdPTA7Y1twKzQ+PjJdPTA7Y1t2Pj4yXT1jWzE4XTtjW3YrND4+Ml09Y1sxOV07Y1t2Kzg+PjJdPWNbMjBdO2NbdisxMj4+Ml09Y1syMV07Y1t2KzE2Pj4yXT1jWzIyXTtjW3YrMjA+PjJdPWNbMjNdO2NbdisyND4+Ml09Y1syNF07Y1t2KzI4Pj4yXT1jWzI1XTtwPXI7cT1wKzY0fDA7ZG97YVtwPj4wXT01NDtwPXArMXwwfXdoaWxlKChwfDApPChxfDApKTtsPShkfDApPT0wO2lmKCFsKXtqPWQ7az1uO2Fbcj4+MF09YVtiPj4wXV41NDtpZigoanwwKT09MSlkPWo7ZWxzZXtkPWo7bT04fX1lbHNlIGs9bn1lbHNle2Nbdj4+Ml09Y1sxOF07Y1t2KzQ+PjJdPWNbMTldO2Nbdis4Pj4yXT1jWzIwXTtjW3YrMTI+PjJdPWNbMjFdO2NbdisxNj4+Ml09Y1syMl07Y1t2KzIwPj4yXT1jWzIzXTtjW3YrMjQ+PjJdPWNbMjRdO2NbdisyOD4+Ml09Y1syNV07cD1IZChkfDAsMCwzKXwwO2w9bjtjW2w+PjJdPXA7Y1tsKzQ+PjJdPUM7bD12KzQwfDA7cD1sO209YjtxPXArNjR8MDtkb3thW3A+PjBdPWFbbT4+MF18MDtwPXArMXwwO209bSsxfDB9d2hpbGUoKHB8MCk8KHF8MCkpO0ViKHYsbCk7aj1iKzY0fDA7az1EZChkfDAsMCwtNjQsLTEpfDA7Yj1DO2lmKGI+Pj4wPjB8KGJ8MCk9PTAmaz4+PjA+NjMpe2Rve0ViKHYsaik7aj1qKzY0fDA7az1EZChrfDAsYnwwLC02NCwtMSl8MDtiPUN9d2hpbGUoYj4+PjA+MHwoYnwwKT09MCZrPj4+MD42Myk7Yj1rfWVsc2UgYj1rO0lkKGx8MCxqfDAsYnwwKXwwO0RiKHYseik7cD1uO2NbcD4+Ml09MDtjW3ArND4+Ml09MDtjW3Y+PjJdPWNbMThdO2Nbdis0Pj4yXT1jWzE5XTtjW3YrOD4+Ml09Y1syMF07Y1t2KzEyPj4yXT1jWzIxXTtjW3YrMTY+PjJdPWNbMjJdO2NbdisyMD4+Ml09Y1syM107Y1t2KzI0Pj4yXT1jWzI0XTtjW3YrMjg+PjJdPWNbMjVdO3A9cjtxPXArNjR8MDtkb3thW3A+PjBdPTU0O3A9cCsxfDB9d2hpbGUoKHB8MCk8KHF8MCkpO2Fbcj4+MF09YVt6Pj4wXV41NDtkPTMyO2I9ejtrPW47bD0wO209OH1pZigobXwwKT09OCl7aj0xO2Rve3U9citqfDA7YVt1Pj4wXT1hW3U+PjBdXmFbYitqPj4wXTtqPWorMXwwfXdoaWxlKChqfDApIT0oZHwwKSl9bz1rO2Nbbz4+Ml09NTEyO2Nbbys0Pj4yXT0wO289dis0MHwwO3A9bzttPXI7cT1wKzY0fDA7ZG97YVtwPj4wXT1hW20+PjBdfDA7cD1wKzF8MDttPW0rMXwwfXdoaWxlKChwfDApPChxfDApKTtFYih2LG8pO249disxMDR8MDttPXYrMTM2fDA7cD1tO2NbcD4+Ml09MDtjW3ArND4+Ml09MDtjW24+PjJdPWNbMThdO2Nbbis0Pj4yXT1jWzE5XTtjW24rOD4+Ml09Y1syMF07Y1tuKzEyPj4yXT1jWzIxXTtjW24rMTY+PjJdPWNbMjJdO2NbbisyMD4+Ml09Y1syM107Y1tuKzI0Pj4yXT1jWzI0XTtjW24rMjg+PjJdPWNbMjVdO3A9cjtxPXArNjR8MDtkb3thW3A+PjBdPTkyO3A9cCsxfDB9d2hpbGUoKHB8MCk8KHF8MCkpO2lmKCFsPyhhW3I+PjBdPWFbYj4+MF1eOTIsKGR8MCkhPTEpOjApe2o9MTtkb3t1PXIranwwO2FbdT4+MF09YVt1Pj4wXV5hW2Iraj4+MF07aj1qKzF8MH13aGlsZSgoanwwKSE9KGR8MCkpfWo9bTtjW2o+PjJdPTUxMjtjW2orND4+Ml09MDtqPXYrMTQ0fDA7cD1qO209cjtxPXArNjR8MDtkb3thW3A+PjBdPWFbbT4+MF18MDtwPXArMXwwO209bSsxfDB9d2hpbGUoKHB8MCk8KHF8MCkpO0ViKG4saik7ZG8gaWYoZil7Yj1rO3Q9Y1tiPj4yXXwwO2I9Y1tiKzQ+PjJdfDA7aj1HZCh0fDAsYnwwLDMpfDA7aj1qJjYzO3U9SGQoZnwwLDAsMyl8MDt1PURkKHR8MCxifDAsdXwwLEN8MCl8MDtiPWs7Y1tiPj4yXT11O2NbYis0Pj4yXT1DO2I9NjQtanwwO2o9dis0MCtqfDA7aWYoYj4+PjA+Zj4+PjApe0lkKGp8MCxlfDAsZnwwKXwwO2JyZWFrfUlkKGp8MCxlfDAsYnwwKXwwO0ViKHYsbyk7aj1lK2J8MDtrPUNkKGZ8MCwwLGJ8MCwwKXwwO2I9QztpZihiPj4+MD4wfChifDApPT0wJms+Pj4wPjYzKXtkb3tFYih2LGopO2o9ais2NHwwO2s9RGQoa3wwLGJ8MCwtNjQsLTEpfDA7Yj1DfXdoaWxlKGI+Pj4wPjB8KGJ8MCk9PTAmaz4+PjA+NjMpO2I9a31lbHNlIGI9aztJZChvfDAsanwwLGJ8MCl8MH13aGlsZSgwKTtpZighaCl7aT1BO3JldHVybn1sPXkrM3wwO2Q9eSsyfDA7bj15KzF8MDtvPXgrMzJ8MDtyPXgrMTA0fDA7ZT14KzEzNnwwO2Y9eCsxNDR8MDtzPXgrNDB8MDt0PTA7dT0wO2Rve3U9dSsxfDA7YVtsPj4wXT11O2FbZD4+MF09dT4+Pjg7YVtuPj4wXT11Pj4+MTY7YVt5Pj4wXT11Pj4+MjQ7SWQoeHwwLHZ8MCwyMDgpfDA7cT1vO2I9Y1txPj4yXXwwO3E9Y1txKzQ+PjJdfDA7aj1HZChifDAscXwwLDMpfDA7aj1qJjYzO3E9RGQoYnwwLHF8MCwzMiwwKXwwO2I9bztjW2I+PjJdPXE7Y1tiKzQ+PjJdPUM7Yj02NC1qfDA7aj14KzQwK2p8MDtpZihiPj4+MD40KXtxPWNbeT4+Ml18MDthW2o+PjBdPXE7YVtqKzE+PjBdPXE+Pjg7YVtqKzI+PjBdPXE+PjE2O2FbaiszPj4wXT1xPj4yNH1lbHNle0lkKGp8MCx5fDAsYnwwKXwwO0ViKHgscyk7aj15K2J8MDtrPUNkKDQsMCxifDAsMCl8MDtiPUM7aWYoYj4+PjA+MHwoYnwwKT09MCZrPj4+MD42Myl7ZG97RWIoeCxqKTtqPWorNjR8MDtrPURkKGt8MCxifDAsLTY0LC0xKXwwO2I9Q313aGlsZShiPj4+MD4wfChifDApPT0wJms+Pj4wPjYzKTtiPWt9ZWxzZSBiPWs7SWQoc3wwLGp8MCxifDApfDB9RGIoeCx6KTtxPWU7Yj1jW3E+PjJdfDA7cT1jW3ErND4+Ml18MDtqPUdkKGJ8MCxxfDAsMyl8MDtqPWomNjM7cT1EZChifDAscXwwLDI1NiwwKXwwO2I9ZTtjW2I+PjJdPXE7Y1tiKzQ+PjJdPUM7Yj02NC1qfDA7aj14KzE0NCtqfDA7aWYoYj4+PjA+MzIpe3A9ajttPXo7cT1wKzMyfDA7ZG97YVtwPj4wXT1hW20+PjBdfDA7cD1wKzF8MDttPW0rMXwwfXdoaWxlKChwfDApPChxfDApKX1lbHNle0lkKGp8MCx6fDAsYnwwKXwwO0ViKHIsZik7aj16K2J8MDtrPUNkKDMyLDAsYnwwLDApfDA7Yj1DO2lmKGI+Pj4wPjB8KGJ8MCk9PTAmaz4+PjA+NjMpe2Rve0ViKHIsaik7aj1qKzY0fDA7az1EZChrfDAsYnwwLC02NCwtMSl8MDtiPUN9d2hpbGUoYj4+PjA+MHwoYnwwKT09MCZrPj4+MD42Myk7Yj1rfWVsc2UgYj1rO0lkKGZ8MCxqfDAsYnwwKXwwfURiKHIsdyk7cT1oLXR8MDtJZChnK3R8MCx3fDAsKHE+Pj4wPjMyPzMyOnEpfDApfDA7dD11PDw1fXdoaWxlKHQ+Pj4wPGg+Pj4wKTtpPUE7cmV0dXJufWZ1bmN0aW9uIFpiKCl7cmV0dXJuIDMyfWZ1bmN0aW9uIF9iKCl7cmV0dXJuIDEwMn1mdW5jdGlvbiAkYigpe3JldHVybiAzMjk4NH1mdW5jdGlvbiBhYygpe3JldHVybiA1MjQyODh9ZnVuY3Rpb24gYmMoKXtyZXR1cm4gMTY3NzcyMTZ9ZnVuY3Rpb24gY2MoKXtyZXR1cm4gMzM1NTQ0MzJ9ZnVuY3Rpb24gZGMoKXtyZXR1cm4gMTA3Mzc0MTgyNH1mdW5jdGlvbiBlYyhhLGIsZCxlLGYsZyxoLGosayxsKXthPWF8MDtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtqPWp8MDtrPWt8MDtsPWx8MDt2YXIgbT0wLG49MCxvPTAscD0wO289aTtuPWk9aSs2MyYtNjQ7aT1pKzE2fDA7RmQoYXwwLDAsYnwwKXwwO209Z3xkO2lmKG0+Pj4wPjB8KG18MCk9PTAmKGZ8Yik+Pj4wPjQyOTQ5NjcyOTUpe2lmKCEoY1s3OTc5XXwwKSlkPTMxOTY0O2Vsc2UgZD1jWyhvYSgpfDApKzYwPj4yXXwwO2NbZD4+Ml09Mjc7bj0tMTtpPW87cmV0dXJuIG58MH1nPWs+Pj4wPDB8KGt8MCk9PTAmaj4+PjA8MzI3Njg7bT1nPzMyNzY4Omo7az1nPzA6azthOmRvIGlmKGs+Pj4wPDB8KGt8MCk9PTAmbT4+PjA8bD4+PjU+Pj4wKXtnPUdkKG18MCxrfDAsNil8MDtqPUM7az0xO3doaWxlKDEpe209SGQoMSwwLGt8MCl8MDtsPUM7ZD1rKzF8MDtpZihsPj4+MD5qPj4+MHwobHwwKT09KGp8MCkmbT4+PjA+Zz4+PjApe2Q9aztnPTE7YnJlYWsgYX1pZihkPj4+MDw2MylrPWQ7ZWxzZXtnPTE7YnJlYWt9fX1lbHNle2c9bD4+PjExO2o9MTt3aGlsZSgxKXtsPUhkKDEsMCxqfDApfDA7cD1DO2Q9aisxfDA7aWYocD4+PjA+MHwocHwwKT09MCZsPj4+MD5nPj4+MCl7ZD1qO2JyZWFrfWlmKGQ+Pj4wPDYzKWo9ZDtlbHNlIGJyZWFrfWc9R2QobXwwLGt8MCwyKXwwO2c9R2QoZ3wwLEN8MCxkfDApfDA7cD1DO209cD4+PjA+MHwocHwwKT09MCZnPj4+MD4xMDczNzQxODIzO2c9bT8xMDczNzQxODIzOmc7Zz1nPj4+M313aGlsZSgwKTtkPUhkKDEsMCxkfDApfDA7Y1tuKzQ+PjJdPTA7Y1tuPj4yXT0wO2Nbbis4Pj4yXT0wO2c9aGMobixlLGYsaCwzMixkLEMsOCxnLGEsYil8MDtkPWNbbj4+Ml18MDtpZihkKXpkKGQpO3A9ZztpPW87cmV0dXJuIHB8MH1mdW5jdGlvbiBmYyhiLGUsZixnLGgsaixrKXtiPWJ8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtqPWp8MDtrPWt8MDt2YXIgbD0wLG09MCxuPTAsbz0wLHA9MCxxPTAscj0wLHM9MCx0PTAsdT0wLHY9MCx3PTA7dz1pO3Y9aT1pKzYzJi02NDtpPWkrMTEyfDA7dD12KzcyfDA7dT12KzEyfDA7bD1iO209bCsxMDJ8MDtkb3thW2w+PjBdPTA7bD1sKzF8MH13aGlsZSgobHwwKTwobXwwKSk7aWYoZz4+PjA+MHwoZ3wwKT09MCZmPj4+MD40Mjk0OTY3Mjk1KXtpZighKGNbNzk3OV18MCkpZz0zMTk2NDtlbHNlIGc9Y1sob2EoKXwwKSs2MD4+Ml18MDtjW2c+PjJdPTI3O3Y9LTE7aT13O3JldHVybiB2fDB9bT1qPj4+MDwwfChqfDApPT0wJmg+Pj4wPDMyNzY4O249bT8zMjc2ODpoO209bT8wOmo7YTpkbyBpZihtPj4+MDwwfChtfDApPT0wJm4+Pj4wPGs+Pj41Pj4+MCl7aD1HZChufDAsbXwwLDYpfDA7bD1DO209MTt3aGlsZSgxKXtrPUhkKDEsMCxtfDApfDA7bj1DO2c9bSsxfDA7aWYobj4+PjA+bD4+PjB8KG58MCk9PShsfDApJms+Pj4wPmg+Pj4wKXtnPW07aD0xO2JyZWFrIGF9aWYoZz4+PjA8NjMpbT1nO2Vsc2V7aD0xO2JyZWFrfX19ZWxzZXtoPWs+Pj4xMTtsPTE7d2hpbGUoMSl7az1IZCgxLDAsbHwwKXwwO2o9QztnPWwrMXwwO2lmKGo+Pj4wPjB8KGp8MCk9PTAmaz4+PjA+aD4+PjApe2c9bDticmVha31pZihnPj4+MDw2MylsPWc7ZWxzZSBicmVha31oPUdkKG58MCxtfDAsMil8MDtoPUdkKGh8MCxDfDAsZ3wwKXwwO2s9QztuPWs+Pj4wPjB8KGt8MCk9PTAmaD4+PjA+MTA3Mzc0MTgyMztoPW4/MTA3Mzc0MTgyMzpoO2g9aD4+PjN9d2hpbGUoMCk7bD0wO2Rve2FbdCtsPj4wXT1CYSgwKXwwO2w9bCsxfDB9d2hpbGUoKGx8MCkhPTMyKTtiOmRvIGlmKCgoKCgoKChnPj4+MDw9NjM/KGs9SGQoaHwwLDAsMyl8MCxuPUMsIShuPj4+MD4wfChufDApPT0wJms+Pj4wPjEwNzM3NDE4MjMpKTowKT8oYVt1Pj4wXT0zNixhW3UrMT4+MF09NTUsYVt1KzI+PjBdPTM2LGFbdSszPj4wXT1hWzM0ODgxK2c+PjBdfDAsYVt1KzQ+PjBdPTU0LGs9dSs1fDAsbz11Kzl8MCxhW2s+PjBdPTQ2LGFbaysxPj4wXT00NixhW2srMj4+MF09NDYsYVtrKzM+PjBdPTQ2LChvfDApIT0wKTowKT8ocD1vLHI9dSs1OHwwLChyfDApIT0ocHwwKSk6MCk/KHE9ci1wfDAsYVtvPj4wXT1hWzM0ODgxKyhoJjYzKT4+MF18MCwocXwwKSE9MSk6MCk/KGFbdSsxMD4+MF09YVszNDg4MSsoaD4+PjYmNjMpPj4wXXwwLChxfDApIT0yKTowKT8oYVt1KzExPj4wXT1hWzM0ODgxKyhoPj4+MTImNjMpPj4wXXwwLChxfDApIT0zKTowKT8oYVt1KzEyPj4wXT1hWzM0ODgxKyhoPj4+MTgmNjMpPj4wXXwwLChxfDApIT00KTowKT8ocz11KzE0fDAsYVt1KzEzPj4wXT1hWzM0ODgxKyhoPj4+MjQpPj4wXXwwLChzfDApIT0wKTowKXtwPXM7bz1yLXN8MDtnPTA7d2hpbGUoMSl7aWYoZz4+PjA8MzIpe249MDtrPWc7Zz0wfWVsc2UgYnJlYWs7ZG97cz1rO2s9aysxfDA7Zz0oZFt0K3M+PjBdfDApPDxufGc7bj1uKzh8MH13aGlsZShrPj4+MDwzMiZuPj4+MDwyNCk7aWYoIW4pZz1wO2Vsc2V7aD1nO2w9bzttPXA7aj0wO3doaWxlKDEpe2lmKCFsKWJyZWFrIGI7Zz1tKzF8MDthW20+PjBdPWFbMzQ4ODErKGgmNjMpPj4wXXwwO2o9ais2fDA7aWYoaj4+PjA+PW4+Pj4wKWJyZWFrO2Vsc2V7aD1oPj4+NjtsPWwrLTF8MDttPWd9fX1zPShnfDApPT0wO289KHM/MDpwLWd8MCkrb3wwO2lmKHMpYnJlYWsgYjtlbHNle3A9ZztnPWt9fWlmKHA+Pj4wPCh1KzU4fDApPj4+MCl7YVtwPj4wXT0wO2w9dis0fDA7Y1tsPj4yXT0wO2Nbdj4+Ml09MDttPXYrOHwwO2NbbT4+Ml09MDtnPShWYih2LGUsZix1LGIpfDApPT0wO2g9Y1t2Pj4yXXwwO2lmKGgpemQoaCk7Y1tsPj4yXT0wO2Nbdj4+Ml09MDtjW20+PjJdPTA7aWYoIWcpe3Y9MDtpPXc7cmV0dXJuIHZ8MH1pZighKGNbNzk3OV18MCkpZz0zMTk2NDtlbHNlIGc9Y1sob2EoKXwwKSs2MD4+Ml18MDtjW2c+PjJdPTIyO3Y9LTE7aT13O3JldHVybiB2fDB9fXdoaWxlKDApO2lmKCEoY1s3OTc5XXwwKSlnPTMxOTY0O2Vsc2UgZz1jWyhvYSgpfDApKzYwPj4yXXwwO2NbZz4+Ml09MjI7dj0tMTtpPXc7cmV0dXJuIHZ8MH1mdW5jdGlvbiBnYyhiLGQsZSxmKXtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDt2YXIgZz0wLGg9MCxqPTAsaz0wLGw9MCxtPTA7bT1pO2w9aT1pKzYzJi02NDtpPWkrMTI4fDA7Zj1sKzEyfDA7YTpkbyBpZihiJjMpe2c9MTAyO2g9Yjtkb3tpZighKGFbaD4+MF18MCkpe2s9NTticmVhayBhfWg9aCsxfDA7Zz1nKy0xfDA7aj0oZ3wwKSE9MH13aGlsZShqJihoJjN8MCkhPTApO2lmKGopaz01O2Vsc2UgZz0wfWVsc2V7Zz0xMDI7aD1iO2s9NX13aGlsZSgwKTtiOmRvIGlmKChrfDApPT01KWlmKGFbaD4+MF18MCl7YzpkbyBpZihnPj4+MD4zKXdoaWxlKDEpe2o9Y1toPj4yXXwwO2lmKChqJi0yMTM5MDYyMTQ0Xi0yMTM5MDYyMTQ0KSZqKy0xNjg0MzAwOSlicmVhaztoPWgrNHwwO2c9ZystNHwwO2lmKGc+Pj4wPD0zKXtrPTEwO2JyZWFrIGN9fWVsc2Ugaz0xMDt3aGlsZSgwKTtpZigoa3wwKT09MTApaWYoIWcpe2c9MDticmVha313aGlsZSgxKXtpZighKGFbaD4+MF18MCkpYnJlYWsgYjtoPWgrMXwwO2c9ZystMXwwO2lmKCFnKXtnPTA7YnJlYWt9fX13aGlsZSgwKTtpZigoKChnfDApIT0wP2g6MCl8MCkhPShiKzEwMXwwKSl7Yj0tMTtpPW07cmV0dXJuIGJ8MH1qPWwrNHwwO2Nbaj4+Ml09MDtjW2w+PjJdPTA7az1sKzh8MDtjW2s+PjJdPTA7Zz0oVmIobCxkLGUsYixmKXwwKT09MDtoPWNbbD4+Ml18MDtpZihoKXpkKGgpO2Nbaj4+Ml09MDtjW2w+PjJdPTA7Y1trPj4yXT0wO2lmKGcpe2I9LTE7aT1tO3JldHVybiBifDB9ZWxzZXtnPTA7aD0wfWRve2c9YVtiK2g+PjBdXmFbZitoPj4wXXxnO2g9aCsxfDB9d2hpbGUoKGh8MCkhPTEwMik7aD0oKChnJjI1NSkrNTExfDApPj4+OCYxKSstMXwwO2c9ZisxMDJ8MDtkb3thW2Y+PjBdPTA7Zj1mKzF8MH13aGlsZSgoZnwwKTwoZ3wwKSk7Yj1oO2k9bTtyZXR1cm4gYnwwfWZ1bmN0aW9uIGhjKGIsZSxmLGcsaCxpLGosayxsLG0sbil7Yj1ifDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7aT1pfDA7aj1qfDA7az1rfDA7bD1sfDA7bT1tfDA7bj1ufDA7dmFyIG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MCx2PTAsdz0wLHg9MCx5PTAsej0wLEE9MCxCPTAsRD0wLEU9MCxGPTAsRz0wLEg9MCxJPTAsSj0wLEs9MDtKPU9kKGx8MCwwLGt8MCwwKXwwO0k9QztpZihJPj4+MD4wfChJfDApPT0wJko+Pj4wPjEwNzM3NDE4MjMpe2lmKCEoY1s3OTc5XXwwKSlvPTMxOTY0O2Vsc2Ugbz1jWyhvYSgpfDApKzYwPj4yXXwwO2Nbbz4+Ml09Mjc7Zj0tMTtyZXR1cm4gZnwwfWlmKGo+Pj4wPjB8KGp8MCk9PTAmaT4+PjA+NDI5NDk2NzI5NSl7aWYoIShjWzc5NzldfDApKW89MzE5NjQ7ZWxzZSBvPWNbKG9hKCl8MCkrNjA+PjJdfDA7Y1tvPj4yXT0yNztmPS0xO3JldHVybiBmfDB9Rz1EZChpfDAsanwwLC0xLC0xKXwwO0g9QztpZihqPj4+MDwwfChqfDApPT0wJmk+Pj4wPDJ8KChHJml8MCkhPTB8KEgmanwwKSE9MCkpe2lmKCEoY1s3OTc5XXwwKSlvPTMxOTY0O2Vsc2Ugbz1jWyhvYSgpfDApKzYwPj4yXXwwO2Nbbz4+Ml09MjI7Zj0tMTtyZXR1cm4gZnwwfWlmKChrfDApPT0wfChsfDApPT0wKXtpZighKGNbNzk3OV18MCkpbz0zMTk2NDtlbHNlIG89Y1sob2EoKXwwKSs2MD4+Ml18MDtjW28+PjJdPTIyO2Y9LTE7cmV0dXJuIGZ8MH1pZighKGs+Pj4wPjE2Nzc3MjE1PzE6KDMzNTU0NDMxLyhsPj4+MCl8MCk+Pj4wPGs+Pj4wKT8hKDA8aj4+PjB8KDA9PShqfDApPygzMzU1NDQzMS8oaz4+PjApfDApPj4+MDxpPj4+MDowKSk6MCl7ST1rPDw3O0o9XyhJLGwpfDA7eT1PZChJfDAsMCxpfDAsanwwKXwwO289eStKfDA7aWYobz4+PjA8eT4+PjApe2lmKCEoY1s3OTc5XXwwKSlvPTMxOTY0O2Vsc2Ugbz1jWyhvYSgpfDApKzYwPj4yXXwwO2Nbbz4+Ml09MTI7Zj0tMTtyZXR1cm4gZnwwfUY9azw8OHw2NDt3PW8rRnwwO2lmKHc+Pj4wPEY+Pj4wKXtpZighKGNbNzk3OV18MCkpbz0zMTk2NDtlbHNlIG89Y1sob2EoKXwwKSs2MD4+Ml18MDtjW28+PjJdPTEyO2Y9LTE7cmV0dXJuIGZ8MH14PWIrOHwwO2RvIGlmKChjW3g+PjJdfDApPj4+MDx3Pj4+MCl7bz1jW2I+PjJdfDA7aWYobyl6ZChvKTt2PWIrNHwwO2Nbdj4+Ml09MDtjW2I+PjJdPTA7Y1t4Pj4yXT0wO2RvIGlmKHc+Pj4wPD00Mjk0OTY3MTY4KXtpZih3Pj4+MD49NDI5NDk2NzE2OCl7aWYoIShjWzc5NzldfDApKW89MzE5NjQ7ZWxzZSBvPWNbKG9hKCl8MCkrNjA+PjJdfDA7Y1tvPj4yXT0xMjtxPTEyO289MDticmVha310PXd8ODtvPXlkKHQrNzZ8MCl8MDtpZihvKXtzPW8rLTh8MDtkbyBpZihvJjYzKXtyPW8rNjMmLTY0O0Y9cistOHwwO3E9cztyPShGLXF8MCk+Pj4wPjE1P0Y6cis1NnwwO3E9ci1xfDA7bz1vKy00fDA7Rj1jW28+PjJdfDA7cD0oRiYtOCktcXwwO2lmKCEoRiYzKSl7Y1tyPj4yXT0oY1tzPj4yXXwwKStxO2Nbcis0Pj4yXT1wO2JyZWFrfWVsc2V7Rj1yKzR8MDtjW0Y+PjJdPXB8Y1tGPj4yXSYxfDI7RT1yK3ArNHwwO2NbRT4+Ml09Y1tFPj4yXXwxO2Nbbz4+Ml09cXxjW28+PjJdJjF8MjtjW0Y+PjJdPWNbRj4+Ml18MTtBZChzLHEpO2JyZWFrfX1lbHNlIHI9czt3aGlsZSgwKTtvPXIrNHwwO3A9Y1tvPj4yXXwwO2lmKChwJjN8MCkhPTA/KHU9cCYtOCx1Pj4+MD4odCsxNnwwKT4+PjApOjApe0Y9dS10fDA7RT1yK3R8MDtjW28+PjJdPXR8cCYxfDI7Y1tFKzQ+PjJdPUZ8MztEPUUrRis0fDA7Y1tEPj4yXT1jW0Q+PjJdfDE7QWQoRSxGKX1xPTA7bz1yKzh8MH1lbHNle3E9MTI7bz0wfX1lbHNle3E9MTI7bz0wfXdoaWxlKDApO2lmKCEoY1s3OTc5XXwwKSlwPTMxOTY0O2Vsc2UgcD1jWyhvYSgpfDApKzYwPj4yXXwwO2NbcD4+Ml09cTtpZighcSl7Y1tiPj4yXT1vO2Nbdj4+Ml09bztjW3g+PjJdPShvfDApIT0wP3c6MDtpZighbylvPS0xO2Vsc2UgYnJlYWs7cmV0dXJuIG98MH1lbHNle2NbYj4+Ml09MDtjW3Y+PjJdPTA7Y1t4Pj4yXT0wO2Y9LTE7cmV0dXJuIGZ8MH19ZWxzZSBvPWNbYis0Pj4yXXwwO3doaWxlKDApO0Y9bytKfDA7RT1GK3l8MDtZYihlLGYsZyxoLG8sSik7dD1rPDw1O3U9RSsodDw8Mil8MDt2PUUrKGs8PDY8PDIpfDA7dz0odHwwKT09MDt4PShpfDApPT0wJihqfDApPT0wO2I9dCYxMDczNzQxNzkyO3k9KGJ8MCk9PTA7aD1JKy02NHwwO2c9RStofDA7aD11K2h8MDt6PWgrNHwwO0E9Zys0fDA7RD0wO2Rve0I9bysoXyhJLEQpfDApfDA7aWYoIXcpe3A9MDtkb3tzPUIrKHA8PDIpfDA7Y1tFKyhwPDwyKT4+Ml09KGRbcysxPj4wXXwwKTw8OHwoZFtzPj4wXXwwKXwoZFtzKzI+PjBdfDApPDwxNnwoZFtzKzM+PjBdfDApPDwyNDtwPXArMXwwfXdoaWxlKChwfDApIT0odHwwKSl9YTpkbyBpZigheCl7aWYoeSl7cD0wO3E9MDtkb3tpYyhFLHUsdixrKTtpYyh1LEUsdixrKTtwPURkKHB8MCxxfDAsMiwwKXwwO3E9Q313aGlsZShxPj4+MDxqPj4+MHwocXwwKT09KGp8MCkmcD4+PjA8aT4+PjApfWVsc2V7cj0wO3M9MDtkb3twPU9kKHJ8MCxzfDAsdHwwLDApfDA7cD1GKyhwPDwyKXwwO3E9MDtkb3tjW3ArKHE8PDIpPj4yXT1jW0UrKHE8PDIpPj4yXTtxPXErMXwwfXdoaWxlKChxfDApIT0oYnwwKSk7aWMoRSx1LHYsayk7cD1PZChyfDF8MCxzfDAsdHwwLDApfDA7cD1GKyhwPDwyKXwwO3E9MDtkb3tjW3ArKHE8PDIpPj4yXT1jW3UrKHE8PDIpPj4yXTtxPXErMXwwfXdoaWxlKChxfDApIT0oYnwwKSk7aWModSxFLHYsayk7cj1EZChyfDAsc3wwLDIsMCl8MDtzPUN9d2hpbGUocz4+PjA8aj4+PjB8KHN8MCk9PShqfDApJnI+Pj4wPGk+Pj4wKX1pZih5KXtwPTA7cT0wO3doaWxlKDEpe2ljKEUsdSx2LGspO2ljKHUsRSx2LGspO3A9RGQocHwwLHF8MCwyLDApfDA7cT1DO2lmKCEocT4+PjA8aj4+PjB8KHF8MCk9PShqfDApJnA+Pj4wPGk+Pj4wKSlicmVhayBhfX1lbHNle3I9MDtzPTB9ZG97cD1PZChjW2c+PjJdJkd8MCxjW0E+PjJdJkh8MCx0fDAsMCl8MDtwPUYrKHA8PDIpfDA7cT0wO2Rve0s9RSsocTw8Mil8MDtjW0s+PjJdPWNbSz4+Ml1eY1twKyhxPDwyKT4+Ml07cT1xKzF8MH13aGlsZSgocXwwKSE9KGJ8MCkpO2ljKEUsdSx2LGspO3A9T2QoY1toPj4yXSZHfDAsY1t6Pj4yXSZIfDAsdHwwLDApfDA7cD1GKyhwPDwyKXwwO3E9MDtkb3tLPXUrKHE8PDIpfDA7Y1tLPj4yXT1jW0s+PjJdXmNbcCsocTw8Mik+PjJdO3E9cSsxfDB9d2hpbGUoKHF8MCkhPShifDApKTtpYyh1LEUsdixrKTtyPURkKHJ8MCxzfDAsMiwwKXwwO3M9Q313aGlsZShzPj4+MDxqPj4+MHwoc3wwKT09KGp8MCkmcj4+PjA8aT4+PjApfXdoaWxlKDApO2lmKCF3KXtwPTA7ZG97Sz1CKyhwPDwyKXwwO3M9Y1tFKyhwPDwyKT4+Ml18MDthW0s+PjBdPXM7YVtLKzE+PjBdPXM+Pj44O2FbSysyPj4wXT1zPj4+MTY7YVtLKzM+PjBdPXM+Pj4yNDtwPXArMXwwfXdoaWxlKChwfDApIT0odHwwKSl9RD1EKzF8MH13aGlsZSgoRHwwKSE9KGx8MCkpO1liKGUsZixvLEosbSxuKTtLPTA7cmV0dXJuIEt8MH1pZighKGNbNzk3OV18MCkpbz0zMTk2NDtlbHNlIG89Y1sob2EoKXwwKSs2MD4+Ml18MDtjW28+PjJdPTEyO0s9LTE7cmV0dXJuIEt8MH1mdW5jdGlvbiBpYyhhLGIsZCxlKXthPWF8MDtiPWJ8MDtkPWR8MDtlPWV8MDt2YXIgZj0wLGc9MCxoPTAsaT0wLGo9MCxrPTAsbD0wLG09MCxuPTAsbz0wLHA9MCxxPTAscj0wLHM9MCx0PTAsdT0wLHY9MCx3PTAseD0wLHk9MCx6PTAsQT0wLEI9MCxDPTAsRD0wLEU9MCxGPTAsRz0wLEg9MCxJPTAsSj0wLEs9MCxMPTAsTT0wLE49MDt3PWU8PDE7bT1hKygoZTw8NSkrLTE2PDwyKXwwO289Y1ttPj4yXXwwO2NbZD4+Ml09bztxPWNbbSs0Pj4yXXwwO0w9ZCs0fDA7Y1tMPj4yXT1xO3Q9Y1ttKzg+PjJdfDA7eD1kKzh8MDtjW3g+PjJdPXQ7dT1jW20rMTI+PjJdfDA7eT1kKzEyfDA7Y1t5Pj4yXT11O3M9Y1ttKzE2Pj4yXXwwO3o9ZCsxNnwwO2Nbej4+Ml09cztyPWNbbSsyMD4+Ml18MDtBPWQrMjB8MDtjW0E+PjJdPXI7cD1jW20rMjQ+PjJdfDA7Qj1kKzI0fDA7Y1tCPj4yXT1wO249Y1ttKzI4Pj4yXXwwO0M9ZCsyOHwwO2NbQz4+Ml09bjtsPWNbbSszMj4+Ml18MDtEPWQrMzJ8MDtjW0Q+PjJdPWw7aj1jW20rMzY+PjJdfDA7RT1kKzM2fDA7Y1tFPj4yXT1qO2g9Y1ttKzQwPj4yXXwwO0Y9ZCs0MHwwO2NbRj4+Ml09aDtmPWNbbSs0ND4+Ml18MDtHPWQrNDR8MDtjW0c+PjJdPWY7Zz1jW20rNDg+PjJdfDA7SD1kKzQ4fDA7Y1tIPj4yXT1nO2k9Y1ttKzUyPj4yXXwwO0k9ZCs1MnwwO2NbST4+Ml09aTtrPWNbbSs1Nj4+Ml18MDtKPWQrNTZ8MDtjW0o+PjJdPWs7bT1jW20rNjA+PjJdfDA7Sz1kKzYwfDA7Y1tLPj4yXT1tO2lmKCF3KXJldHVybjt2PWU8PDQ7ZT0wO3doaWxlKDEpe009ZTw8NDtOPWErKE08PDIpfDA7Y1tkPj4yXT1vXmNbTj4+Ml07Y1tMPj4yXT1xXmNbTis0Pj4yXTtjW3g+PjJdPXReY1tOKzg+PjJdO2NbeT4+Ml09dV5jW04rMTI+PjJdO2Nbej4+Ml09c15jW04rMTY+PjJdO2NbQT4+Ml09cl5jW04rMjA+PjJdO2NbQj4+Ml09cF5jW04rMjQ+PjJdO2NbQz4+Ml09bl5jW04rMjg+PjJdO2NbRD4+Ml09bF5jW04rMzI+PjJdO2NbRT4+Ml09al5jW04rMzY+PjJdO2NbRj4+Ml09aF5jW04rNDA+PjJdO2NbRz4+Ml09Zl5jW04rNDQ+PjJdO2NbSD4+Ml09Z15jW04rNDg+PjJdO2NbST4+Ml09aV5jW04rNTI+PjJdO2NbSj4+Ml09a15jW04rNTY+PjJdO2NbSz4+Ml09bV5jW04rNjA+PjJdO2pjKGQpO3U9ZTw8Mzt0PWIrKHU8PDIpfDA7Y1t0Pj4yXT1jW2Q+PjJdO2NbdCs0Pj4yXT1jW0w+PjJdO2NbdCs4Pj4yXT1jW3g+PjJdO2NbdCsxMj4+Ml09Y1t5Pj4yXTtjW3QrMTY+PjJdPWNbej4+Ml07Y1t0KzIwPj4yXT1jW0E+PjJdO2NbdCsyND4+Ml09Y1tCPj4yXTtjW3QrMjg+PjJdPWNbQz4+Ml07Y1t0KzMyPj4yXT1jW0Q+PjJdO2NbdCszNj4+Ml09Y1tFPj4yXTtjW3QrNDA+PjJdPWNbRj4+Ml07Y1t0KzQ0Pj4yXT1jW0c+PjJdO2NbdCs0OD4+Ml09Y1tIPj4yXTtjW3QrNTI+PjJdPWNbST4+Ml07Y1t0KzU2Pj4yXT1jW0o+PjJdO2NbdCs2MD4+Ml09Y1tLPj4yXTt0PWErKChNfDE2KTw8Mil8MDtjW2Q+PjJdPWNbZD4+Ml1eY1t0Pj4yXTtjW0w+PjJdPWNbTD4+Ml1eY1t0KzQ+PjJdO2NbeD4+Ml09Y1t4Pj4yXV5jW3QrOD4+Ml07Y1t5Pj4yXT1jW3k+PjJdXmNbdCsxMj4+Ml07Y1t6Pj4yXT1jW3o+PjJdXmNbdCsxNj4+Ml07Y1tBPj4yXT1jW0E+PjJdXmNbdCsyMD4+Ml07Y1tCPj4yXT1jW0I+PjJdXmNbdCsyND4+Ml07Y1tDPj4yXT1jW0M+PjJdXmNbdCsyOD4+Ml07Y1tEPj4yXT1jW0Q+PjJdXmNbdCszMj4+Ml07Y1tFPj4yXT1jW0U+PjJdXmNbdCszNj4+Ml07Y1tGPj4yXT1jW0Y+PjJdXmNbdCs0MD4+Ml07Y1tHPj4yXT1jW0c+PjJdXmNbdCs0ND4+Ml07Y1tIPj4yXT1jW0g+PjJdXmNbdCs0OD4+Ml07Y1tJPj4yXT1jW0k+PjJdXmNbdCs1Mj4+Ml07Y1tKPj4yXT1jW0o+PjJdXmNbdCs1Nj4+Ml07Y1tLPj4yXT1jW0s+PjJdXmNbdCs2MD4+Ml07amMoZCk7dT1iKyh1K3Y8PDIpfDA7Y1t1Pj4yXT1jW2Q+PjJdO2NbdSs0Pj4yXT1jW0w+PjJdO2NbdSs4Pj4yXT1jW3g+PjJdO2NbdSsxMj4+Ml09Y1t5Pj4yXTtjW3UrMTY+PjJdPWNbej4+Ml07Y1t1KzIwPj4yXT1jW0E+PjJdO2NbdSsyND4+Ml09Y1tCPj4yXTtjW3UrMjg+PjJdPWNbQz4+Ml07Y1t1KzMyPj4yXT1jW0Q+PjJdO2NbdSszNj4+Ml09Y1tFPj4yXTtjW3UrNDA+PjJdPWNbRj4+Ml07Y1t1KzQ0Pj4yXT1jW0c+PjJdO2NbdSs0OD4+Ml09Y1tIPj4yXTtjW3UrNTI+PjJdPWNbST4+Ml07Y1t1KzU2Pj4yXT1jW0o+PjJdO2NbdSs2MD4+Ml09Y1tLPj4yXTtlPWUrMnwwO2lmKGU+Pj4wPj13Pj4+MClicmVhaztmPWNbRz4+Ml18MDtnPWNbSD4+Ml18MDtpPWNbST4+Ml18MDtrPWNbSj4+Ml18MDttPWNbSz4+Ml18MDtvPWNbZD4+Ml18MDtxPWNbTD4+Ml18MDt0PWNbeD4+Ml18MDt1PWNbeT4+Ml18MDtzPWNbej4+Ml18MDtyPWNbQT4+Ml18MDtwPWNbQj4+Ml18MDtuPWNbQz4+Ml18MDtsPWNbRD4+Ml18MDtqPWNbRT4+Ml18MDtoPWNbRj4+Ml18MH1yZXR1cm59ZnVuY3Rpb24gamMoYSl7YT1hfDA7dmFyIGI9MCxkPTAsZT0wLGY9MCxnPTAsaD0wLGk9MCxqPTAsaz0wLGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MCx2PTAsdz0wLHg9MCx5PTAsej0wLEE9MCxCPTAsQz0wLEQ9MCxFPTAsRj0wLEc9MCxIPTAsST0wLEo9MCxLPTAsTD0wLE09MCxOPTAsTz0wLFA9MCxRPTAsUj0wLFM9MCxUPTAsVT0wLFY9MCxXPTAsWD0wLFk9MDtiPWErNHwwO3o9YSs4fDA7QT1hKzEyfDA7Qj1hKzE2fDA7Rj1hKzIwfDA7Zj1hKzI0fDA7az1hKzI4fDA7bj1hKzMyfDA7cz1hKzM2fDA7dD1hKzQwfDA7dT1hKzQ0fDA7dj1hKzQ4fDA7dz1hKzUyfDA7eD1hKzU2fDA7eT1hKzYwfDA7ZD1jW2I+PjJdfDA7ZT1jW0Y+PjJdfDA7Zz1jW3M+PjJdfDA7aD1jW3c+PjJdfDA7aT1jW2Y+PjJdfDA7aj1jW3Q+PjJdfDA7bD1jW3g+PjJdfDA7bT1jW3o+PjJdfDA7bz1jW3U+PjJdfDA7cD1jW3k+PjJdfDA7cT1jW0E+PjJdfDA7cj1jW2s+PjJdfDA7Qz1jW3Y+PjJdfDA7RD1jW2E+PjJdfDA7RT1jW0I+PjJdfDA7Rz1jW24+PjJdfDA7SD0wO2Rve1I9QytEfDA7Uj0oUjw8N3xSPj4+MjUpXkU7Tz1SK0R8MDtPPShPPDw5fE8+Pj4yMyleRztMPU8rUnwwO0w9KEw8PDEzfEw+Pj4xOSleQztVPUwrT3wwO1U9KFU8PDE4fFU+Pj4xNCleRDtOPWQrZXwwO049KE48PDd8Tj4+PjI1KV5nO0s9TitlfDA7Sz0oSzw8OXxLPj4+MjMpXmg7WD1LK058MDtYPShYPDwxM3xYPj4+MTkpXmQ7UT1YK0t8MDtRPShRPDwxOHxRPj4+MTQpXmU7Sj1pK2p8MDtKPShKPDw3fEo+Pj4yNSlebDtXPUoranwwO1c9KFc8PDl8Vz4+PjIzKV5tO1Q9VytKfDA7VD0oVDw8MTN8VD4+PjE5KV5pO009VCtXfDA7TT0oTTw8MTh8TT4+PjE0KV5qO1Y9bytwfDA7Vj0oVjw8N3xWPj4+MjUpXnE7Uz1WK3B8MDtTPShTPDw5fFM+Pj4yMylecjtQPVMrVnwwO1A9KFA8PDEzfFA+Pj4xOSlebztJPVArU3wwO0k9KEk8PDE4fEk+Pj4xNClecDtZPVYrVXwwO2Q9KFk8PDd8WT4+PjI1KV5YO1g9ZCtVfDA7bT0oWDw8OXxYPj4+MjMpXlc7Vz1tK2R8MDtxPShXPDwxM3xXPj4+MTkpXlY7Vj1xK218MDtEPShWPDwxOHxWPj4+MTQpXlU7VT1SK1F8MDtpPShVPDw3fFU+Pj4yNSleVDtUPWkrUXwwO3I9KFQ8PDl8VD4+PjIzKV5TO1M9citpfDA7RT0oUzw8MTN8Uz4+PjE5KV5SO1I9RStyfDA7ZT0oUjw8MTh8Uj4+PjE0KV5RO1E9TitNfDA7bz0oUTw8N3xRPj4+MjUpXlA7UD1vK018MDtHPShQPDw5fFA+Pj4yMyleTztPPUcrb3wwO2c9KE88PDEzfE8+Pj4xOSleTjtOPWcrR3wwO2o9KE48PDE4fE4+Pj4xNCleTTtNPUorSXwwO0M9KE08PDd8TT4+PjI1KV5MO0w9QytJfDA7aD0oTDw8OXxMPj4+MjMpXks7Sz1oK0N8MDtsPShLPDwxM3xLPj4+MTkpXko7Sj1sK2h8MDtwPShKPDwxOHxKPj4+MTQpXkk7SD1IKzJ8MH13aGlsZShIPj4+MDw4KTtjW2E+PjJdPShjW2E+PjJdfDApK0Q7Y1tiPj4yXT0oY1tiPj4yXXwwKStkO2Nbej4+Ml09KGNbej4+Ml18MCkrbTtjW0E+PjJdPShjW0E+PjJdfDApK3E7Y1tCPj4yXT0oY1tCPj4yXXwwKStFO2NbRj4+Ml09KGNbRj4+Ml18MCkrZTtjW2Y+PjJdPShjW2Y+PjJdfDApK2k7Y1trPj4yXT0oY1trPj4yXXwwKStyO2Nbbj4+Ml09KGNbbj4+Ml18MCkrRztjW3M+PjJdPShjW3M+PjJdfDApK2c7Y1t0Pj4yXT0oY1t0Pj4yXXwwKStqO2NbdT4+Ml09KGNbdT4+Ml18MCkrbztjW3Y+PjJdPShjW3Y+PjJdfDApK0M7Y1t3Pj4yXT0oY1t3Pj4yXXwwKStoO2NbeD4+Ml09KGNbeD4+Ml18MCkrbDtjW3k+PjJdPShjW3k+PjJdfDApK3A7cmV0dXJufWZ1bmN0aW9uIGtjKCl7cmV0dXJuIDMyfWZ1bmN0aW9uIGxjKCl7cmV0dXJuIDMyfWZ1bmN0aW9uIG1jKGEsYil7YT1hfDA7Yj1ifDA7bWQoYSxiLDMzNzg1KTtyZXR1cm4gMH1mdW5jdGlvbiBuYyhhLGIsYyl7YT1hfDA7Yj1ifDA7Yz1jfDA7bWQoYSxiLGMpO3JldHVybiAwfWZ1bmN0aW9uIG9jKCl7cmV0dXJuIDMyfWZ1bmN0aW9uIHBjKCl7cmV0dXJuIDI0fWZ1bmN0aW9uIHFjKCl7cmV0dXJuIDE2fWZ1bmN0aW9uIHJjKGIsYyxkLGUsZixnLGgpe2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO3ZhciBqPTAsaz0wLGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MDtyPWk7cT1pPWkrNjMmLTY0O2k9aSsyNDB8MDtwPXE7bz1xKzE3NnwwO3E9cSsxNDR8MDtuYihxLGcsaCwzMjk4OCk7aD1iO2o9ZDtpZihiPj4+MD49ZD4+PjA/MDxmPj4+MHwwPT0oZnwwKSYoaC1qfDApPj4+MDxlPj4+MDowKWs9NTtlbHNlIGlmKGQ+Pj4wPj1iPj4+MD8wPGY+Pj4wfDA9PShmfDApJihqLWh8MCk+Pj4wPGU+Pj4wOjApaz01O2lmKChrfDApPT01KXtKZChifDAsZHwwLGV8MCl8MDtkPWJ9aD1vO2s9aCszMnwwO2Rve2FbaD4+MF09MDtoPWgrMXwwfXdoaWxlKChofDApPChrfDApKTtsPWY+Pj4wPjB8KGZ8MCk9PTAmZT4+PjA+MzI7bT1sPzMyOmU7bj1sPzA6ZjtoPShtfDApPT0wJihufDApPT0wO2lmKCFoKXtrPWY+Pj4wPDB8KGZ8MCk9PTAmZT4+PjA8MzI7az1EZCgoaz9lOjMyKXwwLChrP2Y6MCl8MCwtMSwwKXwwO0lkKG8rMzJ8MCxkfDAsaysxfDApfDB9az1EZChtfDAsbnwwLDMyLDApfDA7aj1nKzE2fDA7bmQobyxvLGssQyxqLDAsMCxxKTtVYihwLG8pO2lmKCFoKXtnPWY+Pj4wPDB8KGZ8MCk9PTAmZT4+PjA8MzI7Zz1EZCgoZz9lOjMyKXwwLChnP2Y6MCl8MCwtMSwwKXwwO0lkKGJ8MCxvKzMyfDAsZysxfDApfDB9aD1vO2s9aCs2NHwwO2Rve2FbaD4+MF09MDtoPWgrMXwwfXdoaWxlKChofDApPChrfDApKTtpZighbCl7VGIocCxiLGUsZik7UmIocCxjKTtpPXI7cmV0dXJuIDB9bz1DZChlfDAsZnwwLG18MCxufDApfDA7bmQoYittfDAsZCttfDAsbyxDLGosMSwwLHEpO1RiKHAsYixlLGYpO1JiKHAsYyk7aT1yO3JldHVybiAwfWZ1bmN0aW9uIHNjKGEsYixjLGQsZSxmKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmPWZ8MDtpZihkPj4+MD4wfChkfDApPT0wJmM+Pj4wPjQyOTQ5NjcyNzkpe2U9LTE7cmV0dXJuIGV8MH1yYyhhKzE2fDAsYSxiLGMsZCxlLGYpfDA7ZT0wO3JldHVybiBlfDB9ZnVuY3Rpb24gdGMoYixlLGYsZyxoLGosayl7Yj1ifDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7aj1qfDA7az1rfDA7dmFyIGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wO3Q9aTtzPWk9aSs2MyYtNjQ7aT1pKzIwOHwwO209cztvPXMrMTQ0fDA7bj1zKzExMnwwO3I9cys0OHwwO3M9cysxNnwwO25iKHMsaixrLDMyOTg4KTtxPWorMTZ8MDtrPW47aj1zO2w9ayszMnwwO2Rve2Fbaz4+MF09YVtqPj4wXXwwO2s9aysxfDA7aj1qKzF8MH13aGlsZSgoa3wwKTwobHwwKSk7bD1xO2o9bDtsPWwrNHwwO2w9ZFtsPj4wXXxkW2wrMT4+MF08PDh8ZFtsKzI+PjBdPDwxNnxkW2wrMz4+MF08PDI0O2s9bTtjW2s+PjJdPWRbaj4+MF18ZFtqKzE+PjBdPDw4fGRbaisyPj4wXTw8MTZ8ZFtqKzM+PjBdPDwyNDtjW2srND4+Ml09bDtrPW0rOHwwO2Nbaz4+Ml09MDtjW2srND4+Ml09MDtvYihvLG0sbiwzMzgxNyk7az0wO2Rve2FbcitrPj4wXT1hW28raz4+MF18MDtrPWsrMXwwfXdoaWxlKChrfDApIT0zMik7aWYoUWIoZixlLGcsaCxyKXwwKXtrPXM7bD1rKzMyfDA7ZG97YVtrPj4wXT0wO2s9aysxfDB9d2hpbGUoKGt8MCk8KGx8MCkpO3M9LTE7aT10O3JldHVybiBzfDB9az1lO2o9YjtpZihlPj4+MD49Yj4+PjA/MDxoPj4+MHwwPT0oaHwwKSYoay1qfDApPj4+MDxnPj4+MDowKXA9OTtlbHNlIGlmKGI+Pj4wPj1lPj4+MD8wPGg+Pj4wfDA9PShofDApJihqLWt8MCk+Pj4wPGc+Pj4wOjApcD05O2lmKChwfDApPT05KXtKZChifDAsZXwwLGd8MCl8MDtlPWJ9az1oPj4+MD4wfChofDApPT0wJmc+Pj4wPjMyO2o9az8zMjpnO2w9az8wOmg7aWYoKGp8MCk9PTAmKGx8MCk9PTApbmQocixyLDMyLDAscSwwLDAscyk7ZWxzZXtmPXIrMzJ8MDtwPWg+Pj4wPDB8KGh8MCk9PTAmZz4+PjA8MzI7cD1EZCgocD9nOjMyKXwwLChwP2g6MCl8MCwtMSwwKXwwO3A9cCsxfDA7SWQoZnwwLGV8MCxwfDApfDA7bz1EZChqfDAsbHwwLDMyLDApfDA7bmQocixyLG8sQyxxLDAsMCxzKTtJZChifDAsZnwwLHB8MCl8MH1pZihrKXtyPUNkKGd8MCxofDAsanwwLGx8MCl8MDtuZChiK2p8MCxlK2p8MCxyLEMscSwxLDAscyl9az1zO2w9ayszMnwwO2Rve2Fbaz4+MF09MDtrPWsrMXwwfXdoaWxlKChrfDApPChsfDApKTtzPTA7aT10O3JldHVybiBzfDB9ZnVuY3Rpb24gdWMoYSxiLGMsZCxlLGYpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2lmKGQ+Pj4wPDB8KGR8MCk9PTAmYz4+PjA8MTYpe2U9LTE7cmV0dXJuIGV8MH1kPURkKGN8MCxkfDAsLTE2LC0xKXwwO2U9dGMoYSxiKzE2fDAsYixkLEMsZSxmKXwwO3JldHVybiBlfDB9ZnVuY3Rpb24gdmMoKXtyZXR1cm4gOH1mdW5jdGlvbiB3Yygpe3JldHVybiAxNn1mdW5jdGlvbiB4YyhiLGMsZSxmLGcpe2I9YnwwO2M9Y3wwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO3ZhciBoPTAsaT0wLGo9MCxrPTAsbD0wLG09MCxuPTAsbz0wLHA9MCxxPTAscj0wLHM9MCx0PTAsdT0wLHY9MCx3PTAseD0wLHk9MDtoPWRbZz4+MF18MDtvPUhkKGRbZysxPj4wXXwwfDAsMCw4KXwwO249QztqPUhkKGRbZysyPj4wXXwwfDAsMCwxNil8MDtuPW58QztrPUhkKGRbZyszPj4wXXwwfDAsMCwyNCl8MDtuPW58Q3woZFtnKzQ+PjBdfDApO3I9SGQoZFtnKzU+PjBdfDB8MCwwLDQwKXwwO249bnxDO2k9SGQoZFtnKzY+PjBdfDB8MCwwLDQ4KXwwO249bnxDO2w9SGQoZFtnKzc+PjBdfDB8MCwwLDU2KXwwO2w9b3xofGp8a3xyfGl8bDtuPW58QztpPWRbZys4Pj4wXXwwO3I9SGQoZFtnKzk+PjBdfDB8MCwwLDgpfDA7az1DO2o9SGQoZFtnKzEwPj4wXXwwfDAsMCwxNil8MDtrPWt8QztoPUhkKGRbZysxMT4+MF18MHwwLDAsMjQpfDA7az1rfEN8KGRbZysxMj4+MF18MCk7bz1IZChkW2crMTM+PjBdfDB8MCwwLDQwKXwwO2s9a3xDO3A9SGQoZFtnKzE0Pj4wXXwwfDAsMCw0OCl8MDtrPWt8QzttPUhkKGRbZysxNT4+MF18MHwwLDAsNTYpfDA7bT1yfGl8anxofG98cHxtO2s9a3xDO3A9ZSY3O289YytlKygwLXApfDA7ZT1IZChlfDAsZnwwLDU2KXwwO2c9QztoPW1eMjAzNzY3MTI4MztqPWteMTk1MjgwMTg5MDtpPWxeMTg1MjE0MjE3NztmPW5eMTgxOTg5NTY1MzttPW1eMTg1MjA3NTg4NTtrPWteMTY4NTAyNTM3NztsPWxeMTg4NjYxMDgwNTtuPW5eMTkzNjY4MjM0MTtpZigob3wwKSE9KGN8MCkpe2Rve3g9ZFtjPj4wXXwwO3k9SGQoZFtjKzE+PjBdfDB8MCwwLDgpfDA7cj1DO3c9SGQoZFtjKzI+PjBdfDB8MCwwLDE2KXwwO3I9cnxDO3Q9SGQoZFtjKzM+PjBdfDB8MCwwLDI0KXwwO3I9cnxDfChkW2MrND4+MF18MCk7dT1IZChkW2MrNT4+MF18MHwwLDAsNDApfDA7cj1yfEM7dj1IZChkW2MrNj4+MF18MHwwLDAsNDgpfDA7cj1yfEM7cz1IZChkW2MrNz4+MF18MHwwLDAsNTYpfDA7cz15fHh8d3x0fHV8dnxzO3I9cnxDO3Y9c15oO3U9cl5qO249RGQobHwwLG58MCxtfDAsa3wwKXwwO2w9Qzt0PUhkKG18MCxrfDAsMTMpfDA7aD1DO209R2QobXwwLGt8MCw1MSl8MDttPSh0fG0pXm47aD0oaHxDKV5sO2Y9RGQodnwwLHV8MCxpfDAsZnwwKXwwO2k9Qzt0PUhkKHZ8MCx1fDAsMTYpfDA7aj1DO3U9R2QodnwwLHV8MCw0OCl8MDt1PSh0fHUpXmY7aj0oanxDKV5pO249RGQodXwwLGp8MCxsfDAsbnwwKXwwO2w9Qzt0PUhkKHV8MCxqfDAsMjEpfDA7az1DO2o9R2QodXwwLGp8MCw0Myl8MDtqPSh0fGopXm47az0oa3xDKV5sO2k9RGQoZnwwLGl8MCxtfDAsaHwwKXwwO2Y9Qzt0PUhkKG18MCxofDAsMTcpfDA7dT1DO2g9R2QobXwwLGh8MCw0Nyl8MDtoPWleKHR8aCk7dT1mXih1fEMpO2w9RGQobnwwLGx8MCxofDAsdXwwKXwwO249Qzt0PUhkKGh8MCx1fDAsMTMpfDA7bT1DO3U9R2QoaHwwLHV8MCw1MSl8MDt1PSh0fHUpXmw7bT0obXxDKV5uO2k9RGQoanwwLGt8MCxmfDAsaXwwKXwwO2Y9Qzt0PUhkKGp8MCxrfDAsMTYpfDA7aD1DO2s9R2QoanwwLGt8MCw0OCl8MDtrPSh0fGspXmk7aD0oaHxDKV5mO2w9RGQoa3wwLGh8MCxufDAsbHwwKXwwO249Qzt0PUhkKGt8MCxofDAsMjEpfDA7aj1DO2g9R2Qoa3wwLGh8MCw0Myl8MDtoPSh0fGgpXmw7aj0oanxDKV5uO2Y9RGQoaXwwLGZ8MCx1fDAsbXwwKXwwO2k9Qzt0PUhkKHV8MCxtfDAsMTcpfDA7az1DO209R2QodXwwLG18MCw0Nyl8MDttPSh0fG0pXmY7az0oa3xDKV5pO2w9bF5zO249bl5yO2M9Yys4fDB9d2hpbGUoKGN8MCkhPShvfDApKTtjPW99c3dpdGNoKHB8MCl7Y2FzZSA3OntlPUhkKGRbYys2Pj4wXXwwfDAsMCw0OCl8MHxlO2c9Q3xnO3E9NTticmVha31jYXNlIDY6e3E9NTticmVha31jYXNlIDU6e3E9NjticmVha31jYXNlIDQ6e3E9NzticmVha31jYXNlIDM6e3E9ODticmVha31jYXNlIDI6e3E9OTticmVha31jYXNlIDE6e3E9MTA7YnJlYWt9ZGVmYXVsdDp7fX1pZigocXwwKT09NSl7eT1IZChkW2MrNT4+MF18MHwwLDAsNDApfDA7Zz1DfGc7ZT15fGU7cT02fWlmKChxfDApPT02KXtnPWRbYys0Pj4wXXwwfGc7cT03fWlmKChxfDApPT03KXt5PUhkKGRbYyszPj4wXXwwfDAsMCwyNCl8MDtlPXl8ZTtnPUN8ZztxPTh9aWYoKHF8MCk9PTgpe3k9SGQoZFtjKzI+PjBdfDB8MCwwLDE2KXwwO2U9eXxlO2c9Q3xnO3E9OX1pZigocXwwKT09OSl7eT1IZChkW2MrMT4+MF18MHwwLDAsOCl8MDtlPXl8ZTtnPUN8ZztxPTEwfWlmKChxfDApPT0xMCllPWRbYz4+MF18MHxlO3k9ZV5oO3I9Z15qO3M9RGQobHwwLG58MCxtfDAsa3wwKXwwO3E9Qzt3PUhkKG18MCxrfDAsMTMpfDA7dD1DO3g9R2QobXwwLGt8MCw1MSl8MDt4PSh3fHgpXnM7dD0odHxDKV5xO3c9RGQoeXwwLHJ8MCxpfDAsZnwwKXwwO3Y9Qzt1PUhkKHl8MCxyfDAsMTYpfDA7cD1DO3I9R2QoeXwwLHJ8MCw0OCl8MDtyPSh1fHIpXnc7cD0ocHxDKV52O3M9RGQocnwwLHB8MCxxfDAsc3wwKXwwO3E9Qzt1PUhkKHJ8MCxwfDAsMjEpfDA7eT1DO3A9R2QocnwwLHB8MCw0Myl8MDtwPSh1fHApXnM7eT0oeXxDKV5xO3Y9RGQod3wwLHZ8MCx4fDAsdHwwKXwwO3c9Qzt1PUhkKHh8MCx0fDAsMTcpfDA7cj1DO3Q9R2QoeHwwLHR8MCw0Nyl8MDt0PXZeKHV8dCk7cj13XihyfEMpO3E9RGQoc3wwLHF8MCx0fDAscnwwKXwwO3M9Qzt1PUhkKHR8MCxyfDAsMTMpfDA7eD1DO3I9R2QodHwwLHJ8MCw1MSl8MDtyPSh1fHIpXnE7eD0oeHxDKV5zO3Y9RGQocHwwLHl8MCx3fDAsdnwwKXwwO3c9Qzt1PUhkKHB8MCx5fDAsMTYpfDA7dD1DO3k9R2QocHwwLHl8MCw0OCl8MDt5PSh1fHkpXnY7dD0odHxDKV53O3E9RGQoeXwwLHR8MCxzfDAscXwwKXwwO3M9Qzt1PUhkKHl8MCx0fDAsMjEpfDA7cD1DO3Q9R2QoeXwwLHR8MCw0Myl8MDt0PSh1fHQpXnE7cD0ocHxDKV5zO3c9RGQodnwwLHd8MCxyfDAseHwwKXwwO3Y9Qzt1PUhkKHJ8MCx4fDAsMTcpfDA7eT1DO3g9R2QocnwwLHh8MCw0Nyl8MDt4PSh1fHgpXnc7eT0oeXxDKV52O3M9RGQocV5lfDAsc15nfDAseHwwLHl8MCl8MDtxPUM7dT1IZCh4fDAseXwwLDEzKXwwO3I9Qzt5PUdkKHh8MCx5fDAsNTEpfDA7eT1zXih1fHkpO3I9cV4ocnxDKTt3PURkKHR8MCxwfDAsdl4yNTV8MCx3fDApfDA7dj1DO3U9SGQodHwwLHB8MCwxNil8MDt4PUM7cD1HZCh0fDAscHwwLDQ4KXwwO3A9KHV8cCledzt4PSh4fEMpXnY7cz1EZChwfDAseHwwLHF8MCxzfDApfDA7cT1DO3U9SGQocHwwLHh8MCwyMSl8MDt0PUM7eD1HZChwfDAseHwwLDQzKXwwO3g9KHV8eCleczt0PSh0fEMpXnE7dj1EZCh3fDAsdnwwLHl8MCxyfDApfDA7dz1DO3U9SGQoeXwwLHJ8MCwxNyl8MDtwPUM7cj1HZCh5fDAscnwwLDQ3KXwwO3I9KHV8ciledjtwPShwfEMpXnc7cT1EZChzfDAscXwwLHJ8MCxwfDApfDA7cz1DO3U9SGQocnwwLHB8MCwxMyl8MDt5PUM7cD1HZChyfDAscHwwLDUxKXwwO3A9KHV8cClecTt5PSh5fEMpXnM7dj1EZCh4fDAsdHwwLHd8MCx2fDApfDA7dz1DO3U9SGQoeHwwLHR8MCwxNil8MDtyPUM7dD1HZCh4fDAsdHwwLDQ4KXwwO3Q9KHV8dCledjtyPShyfEMpXnc7cT1EZCh0fDAscnwwLHN8MCxxfDApfDA7cz1DO3U9SGQodHwwLHJ8MCwyMSl8MDt4PUM7cj1HZCh0fDAscnwwLDQzKXwwO3I9KHV8cilecTt4PSh4fEMpXnM7dz1EZCh2fDAsd3wwLHB8MCx5fDApfDA7dj1DO3U9SGQocHwwLHl8MCwxNyl8MDt0PUM7eT1HZChwfDAseXwwLDQ3KXwwO3k9KHV8eSledzt0PSh0fEMpXnY7cz1EZChxfDAsc3wwLHl8MCx0fDApfDA7cT1DO3U9SGQoeXwwLHR8MCwxMyl8MDtwPUM7dD1HZCh5fDAsdHwwLDUxKXwwO3Q9KHV8dClecztwPShwfEMpXnE7dz1EZChyfDAseHwwLHZ8MCx3fDApfDA7dj1DO3U9SGQocnwwLHh8MCwxNil8MDt5PUM7eD1HZChyfDAseHwwLDQ4KXwwO3g9KHV8eCledzt5PSh5fEMpXnY7cz1EZCh4fDAseXwwLHF8MCxzfDApfDA7cT1DO3U9SGQoeHwwLHl8MCwyMSl8MDtyPUM7eT1HZCh4fDAseXwwLDQzKXwwO3k9KHV8eSlecztyPShyfEMpXnE7dj1EZCh3fDAsdnwwLHR8MCxwfDApfDA7dz1DO3U9SGQodHwwLHB8MCwxNyl8MDt4PUM7cD1HZCh0fDAscHwwLDQ3KXwwO3A9KHV8cCledjt4PSh4fEMpXnc7cT1EZChzfDAscXwwLHB8MCx4fDApfDA7cz1DO3U9SGQocHwwLHh8MCwxMyl8MDt0PUM7eD1HZChwfDAseHwwLDUxKXwwO3E9KHV8eClecTtzPSh0fEMpXnM7dj1EZCh5fDAscnwwLHd8MCx2fDApfDA7dz1DO3Q9SGQoeXwwLHJ8MCwxNil8MDt4PUM7cj1HZCh5fDAscnwwLDQ4KXwwO3I9KHR8ciledjt4PSh4fEMpXnc7dD1IZChyfDAseHwwLDIxKXwwO3k9Qzt4PUdkKHJ8MCx4fDAsNDMpfDA7eT15fEM7dz1EZCh2fDAsd3wwLHF8MCxzfDApfDA7dj1DO3I9SGQocXwwLHN8MCwxNyl8MDt1PUM7cz1HZChxfDAsc3wwLDQ3KXwwO3g9KHJ8cyled152Xih0fHgpO3k9KHV8Qyledl53Xnk7YVtiPj4wXT14O2FbYisxPj4wXT14Pj4+ODthW2IrMj4+MF09eD4+PjE2O2FbYiszPj4wXT14Pj4+MjQ7YVtiKzQ+PjBdPXk7dz1HZCh4fDAseXwwLDQwKXwwO2FbYis1Pj4wXT13O3c9R2QoeHwwLHl8MCw0OCl8MDthW2IrNj4+MF09dzt5PUdkKHh8MCx5fDAsNTYpfDA7YVtiKzc+PjBdPXk7cmV0dXJuIDB9ZnVuY3Rpb24geWMoKXtyZXR1cm4gNjR9ZnVuY3Rpb24gemMoKXtyZXR1cm4gMzJ9ZnVuY3Rpb24gQWMoKXtyZXR1cm4gMzJ9ZnVuY3Rpb24gQmMoKXtyZXR1cm4gNjR9ZnVuY3Rpb24gQ2MoYixlLGYpe2I9YnwwO2U9ZXwwO2Y9ZnwwO3ZhciBnPTAsaD0wLGo9MCxrPTAsbD0wLG09MCxuPTAsbz0wLHA9MCxxPTA7bz1pO2g9aT1pKzYzJi02NDtpPWkrNDk2fDA7az1oO2o9aCs0NDh8MDtsPWgrNDA4fDA7bT1oKzM2OHwwO2g9aCsyMDh8MDtnPWsrNjR8MDtuPWs7cD04O3E9bis2NHwwO2Rve2Nbbj4+Ml09Y1twPj4yXTtuPW4rNHwwO3A9cCs0fDB9d2hpbGUoKG58MCk8KHF8MCkpO249ays3MnwwO2Nbbj4+Ml09MjU2O2Nbbis0Pj4yXT0wO249ZztjW24+PjJdPTA7Y1tuKzQ+PjJdPTA7bj1rKzgwfDA7cD1mO3E9biszMnwwO2Rve2Fbbj4+MF09YVtwPj4wXXwwO249bisxfDA7cD1wKzF8MH13aGlsZSgobnwwKTwocXwwKSk7R2IoayxlKTthW2U+PjBdPShkW2U+PjBdfDApJjI0ODtxPWUrMzF8MDthW3E+PjBdPShkW3E+PjBdfDApJjYzfDY0O1JjKGgsZSk7SWMoaixoKzgwfDApO0pjKGwsaCxqKTtKYyhtLGgrNDB8MCxqKTtMYyhiLG0pO0xjKGssbCk7cT1iKzMxfDA7YVtxPj4wXT0oZFtxPj4wXXwwKV4oZFtrPj4wXXwwKTw8NztKZChlfDAsZnwwLDMyKXwwO0pkKGUrMzJ8MCxifDAsMzIpfDA7aT1vO3JldHVybiAwfWZ1bmN0aW9uIERjKGIsZSl7Yj1ifDA7ZT1lfDA7dmFyIGY9MCxnPTAsaD0wLGo9MCxrPTAsbD0wLG09MCxuPTAsbz0wLHA9MCxxPTA7cT1pO249aT1pKzYzJi02NDtpPWkrNTI4fDA7bT1uO2w9bis0NDh8MDtvPW4rNDA4fDA7cD1uKzM2OHwwO2s9bisyMDh8MDtuPW4rNDg4fDA7Zj0wO2Rve2FbbitmPj4wXT1CYSgwKXwwO2Y9ZisxfDB9d2hpbGUoKGZ8MCkhPTMyKTtmPW0rNjR8MDtnPW07aD04O2o9Zys2NHwwO2Rve2NbZz4+Ml09Y1toPj4yXTtnPWcrNHwwO2g9aCs0fDB9d2hpbGUoKGd8MCk8KGp8MCkpO2c9bSs3MnwwO2NbZz4+Ml09MjU2O2NbZys0Pj4yXT0wO2c9ZjtjW2c+PjJdPTA7Y1tnKzQ+PjJdPTA7Zz1tKzgwfDA7aD1uO2o9ZyszMnwwO2Rve2FbZz4+MF09YVtoPj4wXXwwO2c9ZysxfDA7aD1oKzF8MH13aGlsZSgoZ3wwKTwoanwwKSk7R2IobSxlKTthW2U+PjBdPShkW2U+PjBdfDApJjI0ODtnPWUrMzF8MDthW2c+PjBdPShkW2c+PjBdfDApJjYzfDY0O1JjKGssZSk7SWMobCxrKzgwfDApO0pjKG8sayxsKTtKYyhwLGsrNDB8MCxsKTtMYyhiLHApO0xjKG0sbyk7Zz1iKzMxfDA7YVtnPj4wXT0oZFtnPj4wXXwwKV4oZFttPj4wXXwwKTw8NztnPWU7aD1uO2o9ZyszMnwwO2Rve2FbZz4+MF09YVtoPj4wXXwwO2c9ZysxfDA7aD1oKzF8MH13aGlsZSgoZ3wwKTwoanwwKSk7SmQoZSszMnwwLGJ8MCwzMil8MDtpPXE7cmV0dXJuIDB9ZnVuY3Rpb24gRWMoYSxiLGQsZSxmLGcpe2E9YXwwO2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO3ZhciBoPTAsaj0wLGs9MDtoPWk7aj1pPWkrNjMmLTY0O2k9aSsxNnwwO2s9YSs2NHwwO0pkKGt8MCxkfDAsZXwwKXwwO1hjKGEsaixrLGUsZixnKTtnPWo7ZD0oYnwwKSE9MDtpZigoY1tnPj4yXXwwKT09NjQmKGNbZys0Pj4yXXwwKT09MCl7aWYoIWQpe2s9MDtpPWg7cmV0dXJuIGt8MH1qPURkKGV8MCxmfDAsNjQsMCl8MDtrPWI7Y1trPj4yXT1qO2Nbays0Pj4yXT1DO2s9MDtpPWg7cmV0dXJuIGt8MH1lbHNle2lmKGQpe2s9YjtjW2s+PjJdPTA7Y1trKzQ+PjJdPTB9az1EZChlfDAsZnwwLDY0LDApfDA7RmQoYXwwLDAsa3wwKXwwO2s9LTE7aT1oO3JldHVybiBrfDB9cmV0dXJuIDB9ZnVuY3Rpb24gRmMoYSxiLGQsZSxmLGcpe2E9YXwwO2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO3ZhciBoPTA7ZT1EZChlfDAsZnwwLC02NCwtMSl8MDtmPUM7ZG8gaWYoIShmPj4+MD4wfChmfDApPT0wJmU+Pj4wPjQyOTQ5NjcyMzEpKXtoPWQrNjR8MDtpZihWYyhkLGgsZSxmLGcpfDApe0ZkKGF8MCwwLGV8MCl8MDticmVha31pZihiKXtkPWI7Y1tkPj4yXT1lO2NbZCs0Pj4yXT1mfUpkKGF8MCxofDAsZXwwKXwwO2Q9MDtyZXR1cm4gZHwwfXdoaWxlKDApO2lmKCFiKXtkPS0xO3JldHVybiBkfDB9ZD1iO2NbZD4+Ml09MDtjW2QrND4+Ml09MDtkPS0xO3JldHVybiBkfDB9ZnVuY3Rpb24gR2MoYSxiLGMsZCxlLGYpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO1hjKGEsYixjLGQsZSxmKTtyZXR1cm4gMH1mdW5jdGlvbiBIYyhhLGIsYyxkLGUpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO3JldHVybiBWYyhhLGIsYyxkLGUpfDB9ZnVuY3Rpb24gSWMoYSxiKXthPWF8MDtiPWJ8MDt2YXIgYz0wLGQ9MCxlPTAsZj0wLGc9MDtnPWk7Yz1pPWkrNjMmLTY0O2k9aSsxNjB8MDtkPWMrMTIwfDA7ZT1jKzgwfDA7Zj1jKzQwfDA7S2MoZCxiKTtLYyhlLGQpO0tjKGUsZSk7SmMoZSxiLGUpO0pjKGQsZCxlKTtLYyhmLGQpO0pjKGUsZSxmKTtLYyhmLGUpO0tjKGYsZik7S2MoZixmKTtLYyhmLGYpO0tjKGYsZik7SmMoZSxmLGUpO0tjKGYsZSk7S2MoZixmKTtLYyhmLGYpO0tjKGYsZik7S2MoZixmKTtLYyhmLGYpO0tjKGYsZik7S2MoZixmKTtLYyhmLGYpO0tjKGYsZik7SmMoZixmLGUpO0tjKGMsZik7S2MoYyxjKTtLYyhjLGMpO0tjKGMsYyk7S2MoYyxjKTtLYyhjLGMpO0tjKGMsYyk7S2MoYyxjKTtLYyhjLGMpO0tjKGMsYyk7S2MoYyxjKTtLYyhjLGMpO0tjKGMsYyk7S2MoYyxjKTtLYyhjLGMpO0tjKGMsYyk7S2MoYyxjKTtLYyhjLGMpO0tjKGMsYyk7S2MoYyxjKTtKYyhmLGMsZik7S2MoZixmKTtLYyhmLGYpO0tjKGYsZik7S2MoZixmKTtLYyhmLGYpO0tjKGYsZik7S2MoZixmKTtLYyhmLGYpO0tjKGYsZik7S2MoZixmKTtKYyhlLGYsZSk7S2MoZixlKTtiPTE7ZG97S2MoZixmKTtiPWIrMXwwfXdoaWxlKChifDApIT01MCk7SmMoZixmLGUpO0tjKGMsZik7Yj0xO2Rve0tjKGMsYyk7Yj1iKzF8MH13aGlsZSgoYnwwKSE9MTAwKTtKYyhmLGMsZik7S2MoZixmKTtiPTE7ZG97S2MoZixmKTtiPWIrMXwwfXdoaWxlKChifDApIT01MCk7SmMoZSxmLGUpO0tjKGUsZSk7S2MoZSxlKTtLYyhlLGUpO0tjKGUsZSk7S2MoZSxlKTtKYyhhLGUsZCk7aT1nO3JldHVybn1mdW5jdGlvbiBKYyhhLGIsZCl7YT1hfDA7Yj1ifDA7ZD1kfDA7dmFyIGU9MCxmPTAsZz0wLGg9MCxpPTAsaj0wLGs9MCxsPTAsbT0wLG49MCxvPTAscD0wLHE9MCxyPTAscz0wLHQ9MCx1PTAsdj0wLHc9MCx4PTAseT0wLHo9MCxBPTAsQj0wLEQ9MCxFPTAsRj0wLEc9MCxIPTAsST0wLEo9MCxLPTAsTD0wLE09MCxOPTAsTz0wLFA9MCxRPTAsUj0wLFM9MCxUPTAsVT0wLFY9MCxXPTAsWD0wLFk9MCxaPTAsXz0wLCQ9MCxhYT0wLGJhPTAsY2E9MCxkYT0wLGVhPTAsZmE9MCxnYT0wLGhhPTAsaWE9MCxqYT0wLGthPTAsbGE9MCxtYT0wLG5hPTAsb2E9MCxwYT0wLHFhPTAscmE9MCxzYT0wLHRhPTAsdWE9MCx2YT0wLHdhPTAseGE9MCx5YT0wLHphPTAsQWE9MCxCYT0wLENhPTAsRGE9MCxFYT0wLEZhPTAsR2E9MCxIYT0wLElhPTAsSmE9MCxLYT0wLExhPTAsTWE9MCxOYT0wLE9hPTAsUGE9MCxRYT0wLFJhPTAsU2E9MCxUYT0wLFVhPTAsVmE9MCxXYT0wLFhhPTAsWWE9MCxaYT0wLF9hPTAsJGE9MCxhYj0wLGJiPTAsY2I9MCxkYj0wLGViPTAsZmI9MCxnYj0wLGhiPTAsaWI9MCxqYj0wLGtiPTAsbGI9MCxtYj0wLG5iPTAsb2I9MCxwYj0wLHFiPTAscmI9MCxzYj0wLHRiPTAsdWI9MCx2Yj0wLHdiPTAseGI9MCx5Yj0wLHpiPTAsQWI9MCxCYj0wLENiPTAsRGI9MCxFYj0wLEZiPTAsR2I9MCxIYj0wLEliPTAsSmI9MCxLYj0wLExiPTAsTWI9MCxOYj0wLE9iPTAsUGI9MCxRYj0wLFJiPTAsU2I9MCxUYj0wLFViPTAsVmI9MCxXYj0wLFhiPTAsWWI9MCxaYj0wLF9iPTAsJGI9MCxhYz0wLGJjPTAsY2M9MCxkYz0wLGVjPTAsZmM9MCxnYz0wLGhjPTAsaWM9MCxqYz0wLGtjPTAsbGM9MCxtYz0wLG5jPTAsb2M9MCxwYz0wLHFjPTAscmM9MCxzYz0wLHRjPTAsdWM9MCx2Yz0wLHdjPTAseGM9MCx5Yz0wLHpjPTAsQWM9MCxCYz0wLENjPTAsRGM9MCxFYz0wLEZjPTAsR2M9MCxIYz0wLEljPTAsSmM9MCxLYz0wLExjPTAsTWM9MCxOYz0wLE9jPTAsUGM9MCxRYz0wLFJjPTAsU2M9MDtsPWNbYj4+Ml18MDtzPWNbYis0Pj4yXXwwO2o9Y1tiKzg+PjJdfDA7UmI9Y1tiKzEyPj4yXXwwO2U9Y1tiKzE2Pj4yXXwwO3phPWNbYisyMD4+Ml18MDt5YT1jW2IrMjQ+PjJdfDA7emI9Y1tiKzI4Pj4yXXwwO2g9Y1tiKzMyPj4yXXwwO2dhPWNbYiszNj4+Ml18MDtIPWNbZD4+Ml18MDtKPWNbZCs0Pj4yXXwwO0Y9Y1tkKzg+PjJdfDA7RD1jW2QrMTI+PjJdfDA7QT1jW2QrMTY+PjJdfDA7eT1jW2QrMjA+PjJdfDA7dz1jW2QrMjQ+PjJdfDA7dT1jW2QrMjg+PjJdfDA7az1jW2QrMzI+PjJdfDA7dD1jW2QrMzY+PjJdfDA7T2M9SioxOXwwO2JjPUYqMTl8MDtyYj1EKjE5fDA7SGE9QSoxOXwwO2pjPXkqMTl8MDtEYj13KjE5fDA7VGE9dSoxOXwwO1NjPWsqMTl8MDtRYz10KjE5fDA7cD1zPDwxO2Y9UmI8PDE7TT16YTw8MTtpPXpiPDwxO2Q9Z2E8PDE7bz0oKGx8MCk8MCk8PDMxPj4zMTtJPSgoSHwwKTwwKTw8MzE+PjMxO01jPU9kKEh8MCxJfDAsbHwwLG98MCl8MDtMYz1DO0s9KChKfDApPDApPDwzMT4+MzE7d2M9T2QoSnwwLEt8MCxsfDAsb3wwKXwwO3ZjPUM7Rz0oKEZ8MCk8MCk8PDMxPj4zMTt1Yj1PZChGfDAsR3wwLGx8MCxvfDApfDA7dGI9QztFPSgoRHwwKTwwKTw8MzE+PjMxO0thPU9kKER8MCxFfDAsbHwwLG98MCl8MDtKYT1DO0I9KChBfDApPDApPDwzMT4+MzE7bWM9T2QoQXwwLEJ8MCxsfDAsb3wwKXwwO2xjPUM7ej0oKHl8MCk8MCk8PDMxPj4zMTtHYj1PZCh5fDAsenwwLGx8MCxvfDApfDA7RmI9Qzt4PSgod3wwKTwwKTw8MzE+PjMxO1dhPU9kKHd8MCx4fDAsbHwwLG98MCl8MDtWYT1DO3Y9KCh1fDApPDApPDwzMT4+MzE7amE9T2QodXwwLHZ8MCxsfDAsb3wwKXwwO2lhPUM7UGM9KChrfDApPDApPDwzMT4+MzE7UD1PZChrfDAsUGN8MCxsfDAsb3wwKXwwO089QztvPU9kKHR8MCwoKHR8MCk8MCk8PDMxPj4zMXwwLGx8MCxvfDApfDA7bD1DO3Q9KChzfDApPDApPDwzMT4+MzE7ZGM9T2QoSHwwLEl8MCxzfDAsdHwwKXwwO2VjPUM7bj0oKHB8MCk8MCk8PDMxPj4zMTt5Yj1PZChKfDAsS3wwLHB8MCxufDApfDA7eGI9QztNYT1PZChGfDAsR3wwLHN8MCx0fDApfDA7TGE9QztvYz1PZChEfDAsRXwwLHB8MCxufDApfDA7bmM9QztJYj1PZChBfDAsQnwwLHN8MCx0fDApfDA7SGI9QztZYT1PZCh5fDAsenwwLHB8MCxufDApfDA7WGE9QztsYT1PZCh3fDAseHwwLHN8MCx0fDApfDA7a2E9QztSPU9kKHV8MCx2fDAscHwwLG58MCl8MDtRPUM7dD1PZChrfDAsUGN8MCxzfDAsdHwwKXwwO3M9QztQYz0oKFFjfDApPDApPDwzMT4+MzE7bj1PZChRY3wwLFBjfDAscHwwLG58MCl8MDtwPUM7az0oKGp8MCk8MCk8PDMxPj4zMTt3Yj1PZChIfDAsSXwwLGp8MCxrfDApfDA7dmI9QztRYT1PZChKfDAsS3wwLGp8MCxrfDApfDA7UGE9QztxYz1PZChGfDAsR3wwLGp8MCxrfDApfDA7cGM9QztLYj1PZChEfDAsRXwwLGp8MCxrfDApfDA7SmI9QztfYT1PZChBfDAsQnwwLGp8MCxrfDApfDA7WmE9QztuYT1PZCh5fDAsenwwLGp8MCxrfDApfDA7bWE9QztUPU9kKHd8MCx4fDAsanwwLGt8MCl8MDtTPUM7dj1PZCh1fDAsdnwwLGp8MCxrfDApfDA7dT1DO1JjPSgoU2N8MCk8MCk8PDMxPj4zMTt5Yz1PZChTY3wwLFJjfDAsanwwLGt8MCl8MDt4Yz1DO2s9T2QoUWN8MCxQY3wwLGp8MCxrfDApfDA7aj1DO1NiPSgoUmJ8MCk8MCk8PDMxPj4zMTtPYT1PZChIfDAsSXwwLFJifDAsU2J8MCl8MDtOYT1DO2ZhPSgoZnwwKTwwKTw8MzE+PjMxO3VjPU9kKEp8MCxLfDAsZnwwLGZhfDApfDA7dGM9QztNYj1PZChGfDAsR3wwLFJifDAsU2J8MCl8MDtMYj1DO2FiPU9kKER8MCxFfDAsZnwwLGZhfDApfDA7JGE9QztwYT1PZChBfDAsQnwwLFJifDAsU2J8MCl8MDtvYT1DO1Y9T2QoeXwwLHp8MCxmfDAsZmF8MCl8MDtVPUM7eD1PZCh3fDAseHwwLFJifDAsU2J8MCl8MDt3PUM7VWE9KChUYXwwKTwwKTw8MzE+PjMxO0FjPU9kKFRhfDAsVWF8MCxmfDAsZmF8MCl8MDt6Yz1DO1NiPU9kKFNjfDAsUmN8MCxSYnwwLFNifDApfDA7UmI9QztmYT1PZChRY3wwLFBjfDAsZnwwLGZhfDApfDA7Zj1DO049KChlfDApPDApPDwzMT4+MzE7c2M9T2QoSHwwLEl8MCxlfDAsTnwwKXwwO3JjPUM7UWI9T2QoSnwwLEt8MCxlfDAsTnwwKXwwO1BiPUM7Y2I9T2QoRnwwLEd8MCxlfDAsTnwwKXwwO2JiPUM7cmE9T2QoRHwwLEV8MCxlfDAsTnwwKXwwO3FhPUM7WD1PZChBfDAsQnwwLGV8MCxOfDApfDA7Vz1DO3o9T2QoeXwwLHp8MCxlfDAsTnwwKXwwO3k9QztFYj0oKERifDApPDApPDwzMT4+MzE7Q2M9T2QoRGJ8MCxFYnwwLGV8MCxOfDApfDA7QmM9QztVYj1PZChUYXwwLFVhfDAsZXwwLE58MCl8MDtUYj1DO2liPU9kKFNjfDAsUmN8MCxlfDAsTnwwKXwwO2hiPUM7Tj1PZChRY3wwLFBjfDAsZXwwLE58MCl8MDtlPUM7QWE9KCh6YXwwKTwwKTw8MzE+PjMxO09iPU9kKEh8MCxJfDAsemF8MCxBYXwwKXwwO05iPUM7Yj0oKE18MCk8MCk8PDMxPj4zMTtnYj1PZChKfDAsS3wwLE18MCxifDApfDA7ZmI9Qzt0YT1PZChGfDAsR3wwLHphfDAsQWF8MCl8MDtzYT1DO1o9T2QoRHwwLEV8MCxNfDAsYnwwKXwwO1k9QztCPU9kKEF8MCxCfDAsemF8MCxBYXwwKXwwO0E9QztrYz0oKGpjfDApPDApPDwzMT4+MzE7RWM9T2QoamN8MCxrY3wwLE18MCxifDApfDA7RGM9QztXYj1PZChEYnwwLEVifDAsemF8MCxBYXwwKXwwO1ZiPUM7a2I9T2QoVGF8MCxVYXwwLE18MCxifDApfDA7amI9QztBYT1PZChTY3wwLFJjfDAsemF8MCxBYXwwKXwwO3phPUM7Yj1PZChRY3wwLFBjfDAsTXwwLGJ8MCl8MDtNPUM7Zz0oKHlhfDApPDApPDwzMT4+MzE7ZWI9T2QoSHwwLEl8MCx5YXwwLGd8MCl8MDtkYj1DO3hhPU9kKEp8MCxLfDAseWF8MCxnfDApfDA7d2E9QzskPU9kKEZ8MCxHfDAseWF8MCxnfDApfDA7Xz1DO0U9T2QoRHwwLEV8MCx5YXwwLGd8MCl8MDtEPUM7SWE9KChIYXwwKTwwKTw8MzE+PjMxO0djPU9kKEhhfDAsSWF8MCx5YXwwLGd8MCl8MDtGYz1DO1liPU9kKGpjfDAsa2N8MCx5YXwwLGd8MCl8MDtYYj1DO21iPU9kKERifDAsRWJ8MCx5YXwwLGd8MCl8MDtsYj1DO0NhPU9kKFRhfDAsVWF8MCx5YXwwLGd8MCl8MDtCYT1DO209T2QoU2N8MCxSY3wwLHlhfDAsZ3wwKXwwO3I9QztnPU9kKFFjfDAsUGN8MCx5YXwwLGd8MCl8MDt5YT1DO0FiPSgoemJ8MCk8MCk8PDMxPj4zMTt2YT1PZChIfDAsSXwwLHpifDAsQWJ8MCl8MDt1YT1DO2VhPSgoaXwwKTwwKTw8MzE+PjMxO2RhPU9kKEp8MCxLfDAsaXwwLGVhfDApfDA7Y2E9QztHPU9kKEZ8MCxHfDAsemJ8MCxBYnwwKXwwO0Y9QztzYj0oKHJifDApPDApPDwzMT4+MzE7SWM9T2QocmJ8MCxzYnwwLGl8MCxlYXwwKXwwO0hjPUM7X2I9T2QoSGF8MCxJYXwwLHpifDAsQWJ8MCl8MDtaYj1DO29iPU9kKGpjfDAsa2N8MCxpfDAsZWF8MCl8MDtuYj1DO0VhPU9kKERifDAsRWJ8MCx6YnwwLEFifDApfDA7RGE9QztnYz1PZChUYXwwLFVhfDAsaXwwLGVhfDApfDA7ZmM9QztBYj1PZChTY3wwLFJjfDAsemJ8MCxBYnwwKXwwO3piPUM7ZWE9T2QoUWN8MCxQY3wwLGl8MCxlYXwwKXwwO2k9QztMPSgoaHwwKTwwKTw8MzE+PjMxO2JhPU9kKEh8MCxJfDAsaHwwLEx8MCl8MDthYT1DO0s9T2QoSnwwLEt8MCxofDAsTHwwKXwwO0o9QztjYz0oKGJjfDApPDApPDwzMT4+MzE7S2M9T2QoYmN8MCxjY3wwLGh8MCxMfDApfDA7SmM9QzthYz1PZChyYnwwLHNifDAsaHwwLEx8MCl8MDskYj1DO3FiPU9kKEhhfDAsSWF8MCxofDAsTHwwKXwwO3BiPUM7R2E9T2QoamN8MCxrY3wwLGh8MCxMfDApfDA7RmE9QztpYz1PZChEYnwwLEVifDAsaHwwLEx8MCl8MDtoYz1DO0NiPU9kKFRhfDAsVWF8MCxofDAsTHwwKXwwO0JiPUM7U2E9T2QoU2N8MCxSY3wwLGh8MCxMfDApfDA7UmE9QztMPU9kKFFjfDAsUGN8MCxofDAsTHwwKXwwO2g9QztoYT0oKGdhfDApPDApPDwzMT4+MzE7ST1PZChIfDAsSXwwLGdhfDAsaGF8MCl8MDtIPUM7cT0oKGR8MCk8MCk8PDMxPj4zMTtPYz1PZChPY3wwLCgoT2N8MCk8MCk8PDMxPj4zMXwwLGR8MCxxfDApfDA7TmM9QztjYz1PZChiY3wwLGNjfDAsZ2F8MCxoYXwwKXwwO2JjPUM7c2I9T2QocmJ8MCxzYnwwLGR8MCxxfDApfDA7cmI9QztJYT1PZChIYXwwLElhfDAsZ2F8MCxoYXwwKXwwO0hhPUM7a2M9T2QoamN8MCxrY3wwLGR8MCxxfDApfDA7amM9QztFYj1PZChEYnwwLEVifDAsZ2F8MCxoYXwwKXwwO0RiPUM7VWE9T2QoVGF8MCxVYXwwLGR8MCxxfDApfDA7VGE9QztoYT1PZChTY3wwLFJjfDAsZ2F8MCxoYXwwKXwwO2dhPUM7cT1PZChRY3wwLFBjfDAsZHwwLHF8MCl8MDtkPUM7TGM9RGQoT2N8MCxOY3wwLE1jfDAsTGN8MCl8MDtKYz1EZChMY3wwLEN8MCxLY3wwLEpjfDApfDA7SGM9RGQoSmN8MCxDfDAsSWN8MCxIY3wwKXwwO0ZjPURkKEhjfDAsQ3wwLEdjfDAsRmN8MCl8MDtEYz1EZChGY3wwLEN8MCxFY3wwLERjfDApfDA7QmM9RGQoRGN8MCxDfDAsQ2N8MCxCY3wwKXwwO3pjPURkKEJjfDAsQ3wwLEFjfDAsemN8MCl8MDt4Yz1EZCh6Y3wwLEN8MCx5Y3wwLHhjfDApfDA7cD1EZCh4Y3wwLEN8MCxufDAscHwwKXwwO249QztlYz1EZCh3Y3wwLHZjfDAsZGN8MCxlY3wwKXwwO2RjPUM7cmM9RGQodWN8MCx0Y3wwLHNjfDAscmN8MCl8MDtwYz1EZChyY3wwLEN8MCxxY3wwLHBjfDApfDA7bmM9RGQocGN8MCxDfDAsb2N8MCxuY3wwKXwwO2xjPURkKG5jfDAsQ3wwLG1jfDAsbGN8MCl8MDtqYz1EZChsY3wwLEN8MCxrY3wwLGpjfDApfDA7aGM9RGQoamN8MCxDfDAsaWN8MCxoY3wwKXwwO2ZjPURkKGhjfDAsQ3wwLGdjfDAsZmN8MCl8MDtyPURkKGZjfDAsQ3wwLG18MCxyfDApfDA7TT1EZChyfDAsQ3wwLGJ8MCxNfDApfDA7Yj1DO3I9RGQocHwwLG58MCwzMzU1NDQzMiwwKXwwO3I9RWQocnwwLEN8MCwyNil8MDttPUM7YmM9RGQoZWN8MCxkY3wwLGNjfDAsYmN8MCl8MDskYj1EZChiY3wwLEN8MCxhY3wwLCRifDApfDA7WmI9RGQoJGJ8MCxDfDAsX2J8MCxaYnwwKXwwO1hiPURkKFpifDAsQ3wwLFlifDAsWGJ8MCl8MDtWYj1EZChYYnwwLEN8MCxXYnwwLFZifDApfDA7VGI9RGQoVmJ8MCxDfDAsVWJ8MCxUYnwwKXwwO1JiPURkKFRifDAsQ3wwLFNifDAsUmJ8MCl8MDtqPURkKFJifDAsQ3wwLGt8MCxqfDApfDA7aj1EZChqfDAsQ3wwLHJ8MCxtfDApfDA7az1DO209SGQocnwwLG18MCwyNil8MDttPUNkKHB8MCxufDAsbXwwLEN8MCl8MDtuPUM7cD1EZChNfDAsYnwwLDMzNTU0NDMyLDApfDA7cD1FZChwfDAsQ3wwLDI2KXwwO3I9QztOYj1EZChRYnwwLFBifDAsT2J8MCxOYnwwKXwwO0xiPURkKE5ifDAsQ3wwLE1ifDAsTGJ8MCl8MDtKYj1EZChMYnwwLEN8MCxLYnwwLEpifDApfDA7SGI9RGQoSmJ8MCxDfDAsSWJ8MCxIYnwwKXwwO0ZiPURkKEhifDAsQ3wwLEdifDAsRmJ8MCl8MDtEYj1EZChGYnwwLEN8MCxFYnwwLERifDApfDA7QmI9RGQoRGJ8MCxDfDAsQ2J8MCxCYnwwKXwwO3piPURkKEJifDAsQ3wwLEFifDAsemJ8MCl8MDt5YT1EZCh6YnwwLEN8MCxnfDAseWF8MCl8MDt5YT1EZCh5YXwwLEN8MCxwfDAscnwwKXwwO2c9QztyPUhkKHB8MCxyfDAsMjYpfDA7cj1DZChNfDAsYnwwLHJ8MCxDfDApfDA7Yj1DO009RGQoanwwLGt8MCwxNjc3NzIxNiwwKXwwO009RWQoTXwwLEN8MCwyNSl8MDtwPUM7dmI9RGQoeWJ8MCx4YnwwLHdifDAsdmJ8MCl8MDt0Yj1EZCh2YnwwLEN8MCx1YnwwLHRifDApfDA7cmI9RGQodGJ8MCxDfDAsc2J8MCxyYnwwKXwwO3BiPURkKHJifDAsQ3wwLHFifDAscGJ8MCl8MDtuYj1EZChwYnwwLEN8MCxvYnwwLG5ifDApfDA7bGI9RGQobmJ8MCxDfDAsbWJ8MCxsYnwwKXwwO2piPURkKGxifDAsQ3wwLGtifDAsamJ8MCl8MDtoYj1EZChqYnwwLEN8MCxpYnwwLGhifDApfDA7Zj1EZChoYnwwLEN8MCxmYXwwLGZ8MCl8MDtmPURkKGZ8MCxDfDAsTXwwLHB8MCl8MDtmYT1DO3A9SGQoTXwwLHB8MCwyNSl8MDtwPUNkKGp8MCxrfDAscHwwLEN8MCl8MDtrPUM7aj1EZCh5YXwwLGd8MCwxNjc3NzIxNiwwKXwwO2o9RWQoanwwLEN8MCwyNSl8MDtNPUM7ZGI9RGQoZ2J8MCxmYnwwLGVifDAsZGJ8MCl8MDtiYj1EZChkYnwwLEN8MCxjYnwwLGJifDApfDA7JGE9RGQoYmJ8MCxDfDAsYWJ8MCwkYXwwKXwwO1phPURkKCRhfDAsQ3wwLF9hfDAsWmF8MCl8MDtYYT1EZChaYXwwLEN8MCxZYXwwLFhhfDApfDA7VmE9RGQoWGF8MCxDfDAsV2F8MCxWYXwwKXwwO1RhPURkKFZhfDAsQ3wwLFVhfDAsVGF8MCl8MDtSYT1EZChUYXwwLEN8MCxTYXwwLFJhfDApfDA7aT1EZChSYXwwLEN8MCxlYXwwLGl8MCl8MDtpPURkKGl8MCxDfDAsanwwLE18MCl8MDtlYT1DO009SGQoanwwLE18MCwyNSl8MDtNPUNkKHlhfDAsZ3wwLE18MCxDfDApfDA7Zz1DO3lhPURkKGZ8MCxmYXwwLDMzNTU0NDMyLDApfDA7eWE9RWQoeWF8MCxDfDAsMjYpfDA7aj1DO05hPURkKFFhfDAsUGF8MCxPYXwwLE5hfDApfDA7TGE9RGQoTmF8MCxDfDAsTWF8MCxMYXwwKXwwO0phPURkKExhfDAsQ3wwLEthfDAsSmF8MCl8MDtIYT1EZChKYXwwLEN8MCxJYXwwLEhhfDApfDA7RmE9RGQoSGF8MCxDfDAsR2F8MCxGYXwwKXwwO0RhPURkKEZhfDAsQ3wwLEVhfDAsRGF8MCl8MDtCYT1EZChEYXwwLEN8MCxDYXwwLEJhfDApfDA7emE9RGQoQmF8MCxDfDAsQWF8MCx6YXwwKXwwO2U9RGQoemF8MCxDfDAsTnwwLGV8MCl8MDtlPURkKGV8MCxDfDAseWF8MCxqfDApfDA7Tj1DO2o9SGQoeWF8MCxqfDAsMjYpfDA7aj1DZChmfDAsZmF8MCxqfDAsQ3wwKXwwO2ZhPURkKGl8MCxlYXwwLDMzNTU0NDMyLDApfDA7ZmE9RWQoZmF8MCxDfDAsMjYpfDA7Zj1DO3VhPURkKHhhfDAsd2F8MCx2YXwwLHVhfDApfDA7c2E9RGQodWF8MCxDfDAsdGF8MCxzYXwwKXwwO3FhPURkKHNhfDAsQ3wwLHJhfDAscWF8MCl8MDtvYT1EZChxYXwwLEN8MCxwYXwwLG9hfDApfDA7bWE9RGQob2F8MCxDfDAsbmF8MCxtYXwwKXwwO2thPURkKG1hfDAsQ3wwLGxhfDAsa2F8MCl8MDtpYT1EZChrYXwwLEN8MCxqYXwwLGlhfDApfDA7Z2E9RGQoaWF8MCxDfDAsaGF8MCxnYXwwKXwwO2g9RGQoZ2F8MCxDfDAsTHwwLGh8MCl8MDtoPURkKGh8MCxDfDAsZmF8MCxmfDApfDA7TD1DO2Y9SGQoZmF8MCxmfDAsMjYpfDA7Zj1DZChpfDAsZWF8MCxmfDAsQ3wwKXwwO2VhPURkKGV8MCxOfDAsMTY3NzcyMTYsMCl8MDtlYT1FZChlYXwwLEN8MCwyNSl8MDtpPUM7Yj1EZChlYXwwLGl8MCxyfDAsYnwwKXwwO3I9QztpPUhkKGVhfDAsaXwwLDI1KXwwO2k9Q2QoZXwwLE58MCxpfDAsQ3wwKXwwO049RGQoaHwwLEx8MCwxNjc3NzIxNiwwKXwwO049RWQoTnwwLEN8MCwyNSl8MDtlPUM7YWE9RGQoZGF8MCxjYXwwLGJhfDAsYWF8MCl8MDtfPURkKGFhfDAsQ3wwLCR8MCxffDApfDA7WT1EZChffDAsQ3wwLFp8MCxZfDApfDA7Vz1EZChZfDAsQ3wwLFh8MCxXfDApfDA7VT1EZChXfDAsQ3wwLFZ8MCxVfDApfDA7Uz1EZChVfDAsQ3wwLFR8MCxTfDApfDA7UT1EZChTfDAsQ3wwLFJ8MCxRfDApfDA7Tz1EZChRfDAsQ3wwLFB8MCxPfDApfDA7ZD1EZChPfDAsQ3wwLHF8MCxkfDApfDA7ZD1EZChkfDAsQ3wwLE58MCxlfDApfDA7cT1DO2U9SGQoTnwwLGV8MCwyNSl8MDtlPUNkKGh8MCxMfDAsZXwwLEN8MCl8MDtMPURkKGJ8MCxyfDAsMzM1NTQ0MzIsMCl8MDtMPUVkKEx8MCxDfDAsMjYpfDA7aD1DO2c9RGQoTXwwLGd8MCxMfDAsaHwwKXwwO2g9SGQoTHwwLGh8MCwyNil8MDtoPUNkKGJ8MCxyfDAsaHwwLEN8MCl8MDtyPURkKGR8MCxxfDAsMzM1NTQ0MzIsMCl8MDtyPUVkKHJ8MCxDfDAsMjYpfDA7Yj1DO0g9RGQoS3wwLEp8MCxJfDAsSHwwKXwwO0Y9RGQoSHwwLEN8MCxHfDAsRnwwKXwwO0Q9RGQoRnwwLEN8MCxFfDAsRHwwKXwwO0E9RGQoRHwwLEN8MCxCfDAsQXwwKXwwO3k9RGQoQXwwLEN8MCx6fDAseXwwKXwwO3c9RGQoeXwwLEN8MCx4fDAsd3wwKXwwO3U9RGQod3wwLEN8MCx2fDAsdXwwKXwwO3M9RGQodXwwLEN8MCx0fDAsc3wwKXwwO2w9RGQoc3wwLEN8MCxvfDAsbHwwKXwwO2w9RGQobHwwLEN8MCxyfDAsYnwwKXwwO289QztiPUhkKHJ8MCxifDAsMjYpfDA7Yj1DZChkfDAscXwwLGJ8MCxDfDApfDA7cT1EZChsfDAsb3wwLDE2Nzc3MjE2LDApfDA7cT1FZChxfDAsQ3wwLDI1KXwwO2Q9QztyPU9kKHF8MCxkfDAsMTksMCl8MDtuPURkKHJ8MCxDfDAsbXwwLG58MCl8MDttPUM7ZD1IZChxfDAsZHwwLDI1KXwwO2Q9Q2QobHwwLG98MCxkfDAsQ3wwKXwwO289RGQobnwwLG18MCwzMzU1NDQzMiwwKXwwO289RWQob3wwLEN8MCwyNil8MDtsPUM7az1EZChwfDAsa3wwLG98MCxsfDApfDA7bD1IZChvfDAsbHwwLDI2KXwwO2w9Q2QobnwwLG18MCxsfDAsQ3wwKXwwO2NbYT4+Ml09bDtjW2ErND4+Ml09aztjW2ErOD4+Ml09ajtjW2ErMTI+PjJdPWk7Y1thKzE2Pj4yXT1oO2NbYSsyMD4+Ml09ZztjW2ErMjQ+PjJdPWY7Y1thKzI4Pj4yXT1lO2NbYSszMj4+Ml09YjtjW2ErMzY+PjJdPWQ7cmV0dXJufWZ1bmN0aW9uIEtjKGEsYil7YT1hfDA7Yj1ifDA7dmFyIGQ9MCxlPTAsZj0wLGc9MCxoPTAsaT0wLGo9MCxrPTAsbD0wLG09MCxuPTAsbz0wLHA9MCxxPTAscj0wLHM9MCx0PTAsdT0wLHY9MCx3PTAseD0wLHk9MCx6PTAsQT0wLEI9MCxEPTAsRT0wLEY9MCxHPTAsSD0wLEk9MCxKPTAsSz0wLEw9MCxNPTAsTj0wLE89MCxQPTAsUT0wLFI9MCxTPTAsVD0wLFU9MCxWPTAsVz0wLFg9MCxZPTAsWj0wLF89MCwkPTAsYWE9MCxiYT0wLGNhPTAsZGE9MCxlYT0wLGZhPTAsZ2E9MCxoYT0wLGlhPTAsamE9MCxrYT0wLGxhPTAsbWE9MCxuYT0wLG9hPTAscGE9MCxxYT0wLHJhPTAsc2E9MCx0YT0wLHVhPTAsdmE9MCx3YT0wLHhhPTAseWE9MCx6YT0wLEFhPTAsQmE9MCxDYT0wLERhPTAsRWE9MCxGYT0wLEdhPTAsSGE9MCxJYT0wLEphPTAsS2E9MCxMYT0wLE1hPTAsTmE9MCxPYT0wLFBhPTAsUWE9MCxSYT0wLFNhPTAsVGE9MCxVYT0wLFZhPTAsV2E9MCxYYT0wLFlhPTAsWmE9MCxfYT0wLCRhPTAsYWI9MCxiYj0wLGNiPTAsZGI9MCxlYj0wLGZiPTAsZ2I9MDtiYj1jW2I+PjJdfDA7dWE9Y1tiKzQ+PjJdfDA7aj1jW2IrOD4+Ml18MDtsYT1jW2IrMTI+PjJdfDA7ZT1jW2IrMTY+PjJdfDA7ZGI9Y1tiKzIwPj4yXXwwO1k9Y1tiKzI0Pj4yXXwwO0xhPWNbYisyOD4+Ml18MDtoPWNbYiszMj4+Ml18MDtiPWNbYiszNj4+Ml18MDtsPWJiPDwxO3A9dWE8PDE7WGE9ajw8MTtmPWxhPDwxO25hPWU8PDE7Qj1kYjw8MTttPVk8PDE7aT1MYTw8MTtLYT1kYiozOHwwO3JhPVkqMTl8MDt2YT1MYSozOHwwO2RhPWgqMTl8MDtnYj1iKjM4fDA7Y2I9KChiYnwwKTwwKTw8MzE+PjMxO2NiPU9kKGJifDAsY2J8MCxiYnwwLGNifDApfDA7YmI9QztvPSgobHwwKTwwKTw8MzE+PjMxO3RhPSgodWF8MCk8MCk8PDMxPj4zMTtJYT1PZChsfDAsb3wwLHVhfDAsdGF8MCl8MDtIYT1DO2s9KChqfDApPDApPDwzMT4+MzE7V2E9T2QoanwwLGt8MCxsfDAsb3wwKXwwO1ZhPUM7bWE9KChsYXwwKTwwKTw8MzE+PjMxO1VhPU9kKGxhfDAsbWF8MCxsfDAsb3wwKXwwO1RhPUM7RD0oKGV8MCk8MCk8PDMxPj4zMTtPYT1PZChlfDAsRHwwLGx8MCxvfDApfDA7TmE9QztlYj0oKGRifDApPDApPDwzMT4+MzE7eWE9T2QoZGJ8MCxlYnwwLGx8MCxvfDApfDA7eGE9QztnPSgoWXwwKTwwKTw8MzE+PjMxO2dhPU9kKFl8MCxnfDAsbHwwLG98MCl8MDtmYT1DO01hPSgoTGF8MCk8MCk8PDMxPj4zMTtSPU9kKExhfDAsTWF8MCxsfDAsb3wwKXwwO1E9QztBPSgoaHwwKTwwKTw8MzE+PjMxO0Y9T2QoaHwwLEF8MCxsfDAsb3wwKXwwO0U9QztxPSgoYnwwKTwwKTw8MzE+PjMxO289T2QoYnwwLHF8MCxsfDAsb3wwKXwwO2w9QztuPSgocHwwKTwwKTw8MzE+PjMxO3RhPU9kKHB8MCxufDAsdWF8MCx0YXwwKXwwO3VhPUM7YmE9T2QocHwwLG58MCxqfDAsa3wwKXwwO2NhPUM7UD0oKGZ8MCk8MCk8PDMxPj4zMTtTYT1PZChmfDAsUHwwLHB8MCxufDApfDA7UmE9QztDYT1PZChlfDAsRHwwLHB8MCxufDApfDA7QmE9QztkPSgoQnwwKTwwKTw8MzE+PjMxO2lhPU9kKEJ8MCxkfDAscHwwLG58MCl8MDtoYT1DO1Q9T2QoWXwwLGd8MCxwfDAsbnwwKXwwO1M9QztPPSgoaXwwKTwwKTw8MzE+PjMxO0g9T2QoaXwwLE98MCxwfDAsbnwwKXwwO0c9Qzt0PU9kKGh8MCxBfDAscHwwLG58MCl8MDtzPUM7ZmI9KChnYnwwKTwwKTw8MzE+PjMxO249T2QoZ2J8MCxmYnwwLHB8MCxufDApfDA7cD1DO1FhPU9kKGp8MCxrfDAsanwwLGt8MCl8MDtQYT1DO1lhPSgoWGF8MCk8MCk8PDMxPj4zMTtBYT1PZChYYXwwLFlhfDAsbGF8MCxtYXwwKXwwO3phPUM7a2E9T2QoZXwwLER8MCxYYXwwLFlhfDApfDA7amE9QztYPU9kKGRifDAsZWJ8MCxYYXwwLFlhfDApfDA7Vz1DO049T2QoWXwwLGd8MCxYYXwwLFlhfDApfDA7TT1DO3Y9T2QoTGF8MCxNYXwwLFhhfDAsWWF8MCl8MDt1PUM7ZWE9KChkYXwwKTwwKTw8MzE+PjMxO1lhPU9kKGRhfDAsZWF8MCxYYXwwLFlhfDApfDA7WGE9QztrPU9kKGdifDAsZmJ8MCxqfDAsa3wwKXwwO2o9QzttYT1PZChmfDAsUHwwLGxhfDAsbWF8MCl8MDtsYT1DO1Y9T2QoZnwwLFB8MCxlfDAsRHwwKXwwO1U9QztKPU9kKEJ8MCxkfDAsZnwwLFB8MCl8MDtJPUM7ej1PZChZfDAsZ3wwLGZ8MCxQfDApfDA7eT1DO3dhPSgodmF8MCk8MCk8PDMxPj4zMTtfYT1PZCh2YXwwLHdhfDAsZnwwLFB8MCl8MDtaYT1DO0VhPU9kKGRhfDAsZWF8MCxmfDAsUHwwKXwwO0RhPUM7UD1PZChnYnwwLGZifDAsZnwwLFB8MCl8MDtmPUM7TD1PZChlfDAsRHwwLGV8MCxEfDApfDA7Sz1DO29hPSgobmF8MCk8MCk8PDMxPj4zMTt4PU9kKG5hfDAsb2F8MCxkYnwwLGVifDApfDA7dz1DO3NhPSgocmF8MCk8MCk8PDMxPj4zMTthYj1PZChyYXwwLHNhfDAsbmF8MCxvYXwwKXwwOyRhPUM7R2E9T2QodmF8MCx3YXwwLGV8MCxEfDApfDA7RmE9QztvYT1PZChkYXwwLGVhfDAsbmF8MCxvYXwwKXwwO25hPUM7RD1PZChnYnwwLGZifDAsZXwwLER8MCl8MDtlPUM7ZWI9T2QoS2F8MCwoKEthfDApPDApPDwzMT4+MzF8MCxkYnwwLGVifDApfDA7ZGI9QztLYT1PZChyYXwwLHNhfDAsQnwwLGR8MCl8MDtKYT1DO3FhPU9kKHZhfDAsd2F8MCxCfDAsZHwwKXwwO3BhPUM7Xz1PZChkYXwwLGVhfDAsQnwwLGR8MCl8MDtaPUM7ZD1PZChnYnwwLGZifDAsQnwwLGR8MCl8MDtCPUM7c2E9T2QocmF8MCxzYXwwLFl8MCxnfDApfDA7cmE9QzthYT1PZCh2YXwwLHdhfDAsWXwwLGd8MCl8MDskPUM7bT1PZChkYXwwLGVhfDAsbXwwLCgobXwwKTwwKTw8MzE+PjMxfDApfDA7cj1DO2c9T2QoZ2J8MCxmYnwwLFl8MCxnfDApfDA7WT1DO01hPU9kKHZhfDAsd2F8MCxMYXwwLE1hfDApfDA7TGE9Qzt3YT1PZChkYXwwLGVhfDAsaXwwLE98MCl8MDt2YT1DO089T2QoZ2J8MCxmYnwwLGl8MCxPfDApfDA7aT1DO2VhPU9kKGRhfDAsZWF8MCxofDAsQXwwKXwwO2RhPUM7QT1PZChnYnwwLGZifDAsaHwwLEF8MCl8MDtoPUM7cT1PZChnYnwwLGZifDAsYnwwLHF8MCl8MDtiPUM7YmI9RGQoZWJ8MCxkYnwwLGNifDAsYmJ8MCl8MDskYT1EZChiYnwwLEN8MCxhYnwwLCRhfDApfDA7WmE9RGQoJGF8MCxDfDAsX2F8MCxaYXwwKXwwO1hhPURkKFphfDAsQ3wwLFlhfDAsWGF8MCl8MDtwPURkKFhhfDAsQ3wwLG58MCxwfDApfDA7bj1DO3VhPURkKFdhfDAsVmF8MCx0YXwwLHVhfDApfDA7dGE9QztjYT1EZChVYXwwLFRhfDAsYmF8MCxjYXwwKXwwO2JhPUM7UGE9RGQoU2F8MCxSYXwwLFFhfDAsUGF8MCl8MDtOYT1EZChQYXwwLEN8MCxPYXwwLE5hfDApfDA7TGE9RGQoTmF8MCxDfDAsTWF8MCxMYXwwKXwwO3I9RGQoTGF8MCxDfDAsbXwwLHJ8MCl8MDtCPURkKHJ8MCxDfDAsZHwwLEJ8MCl8MDtkPUM7cj1EZChwfDAsbnwwLDMzNTU0NDMyLDApfDA7cj1FZChyfDAsQ3wwLDI2KXwwO209QztIYT1EZChLYXwwLEphfDAsSWF8MCxIYXwwKXwwO0ZhPURkKEhhfDAsQ3wwLEdhfDAsRmF8MCl8MDtEYT1EZChGYXwwLEN8MCxFYXwwLERhfDApfDA7aj1EZChEYXwwLEN8MCxrfDAsanwwKXwwO2o9RGQoanwwLEN8MCxyfDAsbXwwKXwwO2s9QzttPUhkKHJ8MCxtfDAsMjYpfDA7bT1DZChwfDAsbnwwLG18MCxDfDApfDA7bj1DO3A9RGQoQnwwLGR8MCwzMzU1NDQzMiwwKXwwO3A9RWQocHwwLEN8MCwyNil8MDtyPUM7emE9RGQoQ2F8MCxCYXwwLEFhfDAsemF8MCl8MDt4YT1EZCh6YXwwLEN8MCx5YXwwLHhhfDApfDA7dmE9RGQoeGF8MCxDfDAsd2F8MCx2YXwwKXwwO1k9RGQodmF8MCxDfDAsZ3wwLFl8MCl8MDtZPURkKFl8MCxDfDAscHwwLHJ8MCl8MDtnPUM7cj1IZChwfDAscnwwLDI2KXwwO3I9Q2QoQnwwLGR8MCxyfDAsQ3wwKXwwO2Q9QztCPURkKGp8MCxrfDAsMTY3NzcyMTYsMCl8MDtCPUVkKEJ8MCxDfDAsMjUpfDA7cD1DO3JhPURkKHVhfDAsdGF8MCxzYXwwLHJhfDApfDA7cGE9RGQocmF8MCxDfDAscWF8MCxwYXwwKXwwO25hPURkKHBhfDAsQ3wwLG9hfDAsbmF8MCl8MDtmPURkKG5hfDAsQ3wwLFB8MCxmfDApfDA7Zj1EZChmfDAsQ3wwLEJ8MCxwfDApfDA7UD1DO3A9SGQoQnwwLHB8MCwyNSl8MDtwPUNkKGp8MCxrfDAscHwwLEN8MCl8MDtrPUM7aj1EZChZfDAsZ3wwLDE2Nzc3MjE2LDApfDA7aj1FZChqfDAsQ3wwLDI1KXwwO0I9QztqYT1EZChtYXwwLGxhfDAsa2F8MCxqYXwwKXwwO2hhPURkKGphfDAsQ3wwLGlhfDAsaGF8MCl8MDtmYT1EZChoYXwwLEN8MCxnYXwwLGZhfDApfDA7ZGE9RGQoZmF8MCxDfDAsZWF8MCxkYXwwKXwwO2k9RGQoZGF8MCxDfDAsT3wwLGl8MCl8MDtpPURkKGl8MCxDfDAsanwwLEJ8MCl8MDtPPUM7Qj1IZChqfDAsQnwwLDI1KXwwO0I9Q2QoWXwwLGd8MCxCfDAsQ3wwKXwwO2c9QztZPURkKGZ8MCxQfDAsMzM1NTQ0MzIsMCl8MDtZPUVkKFl8MCxDfDAsMjYpfDA7aj1DOyQ9RGQoY2F8MCxiYXwwLGFhfDAsJHwwKXwwO1o9RGQoJHwwLEN8MCxffDAsWnwwKXwwO2U9RGQoWnwwLEN8MCxEfDAsZXwwKXwwO2U9RGQoZXwwLEN8MCxZfDAsanwwKXwwO0Q9QztqPUhkKFl8MCxqfDAsMjYpfDA7aj1DZChmfDAsUHwwLGp8MCxDfDApfDA7UD1EZChpfDAsT3wwLDMzNTU0NDMyLDApfDA7UD1FZChQfDAsQ3wwLDI2KXwwO2Y9QztVPURkKFh8MCxXfDAsVnwwLFV8MCl8MDtTPURkKFV8MCxDfDAsVHwwLFN8MCl8MDtRPURkKFN8MCxDfDAsUnwwLFF8MCl8MDtoPURkKFF8MCxDfDAsQXwwLGh8MCl8MDtoPURkKGh8MCxDfDAsUHwwLGZ8MCl8MDtBPUM7Zj1IZChQfDAsZnwwLDI2KXwwO2Y9Q2QoaXwwLE98MCxmfDAsQ3wwKXwwO089RGQoZXwwLER8MCwxNjc3NzIxNiwwKXwwO089RWQoT3wwLEN8MCwyNSl8MDtpPUM7ZD1EZChPfDAsaXwwLHJ8MCxkfDApfDA7cj1DO2k9SGQoT3wwLGl8MCwyNSl8MDtpPUNkKGV8MCxEfDAsaXwwLEN8MCl8MDtEPURkKGh8MCxBfDAsMTY3NzcyMTYsMCl8MDtEPUVkKER8MCxDfDAsMjUpfDA7ZT1DO0s9RGQoTnwwLE18MCxMfDAsS3wwKXwwO0k9RGQoS3wwLEN8MCxKfDAsSXwwKXwwO0c9RGQoSXwwLEN8MCxIfDAsR3wwKXwwO0U9RGQoR3wwLEN8MCxGfDAsRXwwKXwwO2I9RGQoRXwwLEN8MCxxfDAsYnwwKXwwO2I9RGQoYnwwLEN8MCxEfDAsZXwwKXwwO3E9QztlPUhkKER8MCxlfDAsMjUpfDA7ZT1DZChofDAsQXwwLGV8MCxDfDApfDA7QT1EZChkfDAscnwwLDMzNTU0NDMyLDApfDA7QT1FZChBfDAsQ3wwLDI2KXwwO2g9QztnPURkKEJ8MCxnfDAsQXwwLGh8MCl8MDtoPUhkKEF8MCxofDAsMjYpfDA7aD1DZChkfDAscnwwLGh8MCxDfDApfDA7cj1EZChifDAscXwwLDMzNTU0NDMyLDApfDA7cj1FZChyfDAsQ3wwLDI2KXwwO2Q9Qzt3PURkKHp8MCx5fDAseHwwLHd8MCl8MDt1PURkKHd8MCxDfDAsdnwwLHV8MCl8MDtzPURkKHV8MCxDfDAsdHwwLHN8MCl8MDtsPURkKHN8MCxDfDAsb3wwLGx8MCl8MDtsPURkKGx8MCxDfDAscnwwLGR8MCl8MDtvPUM7ZD1IZChyfDAsZHwwLDI2KXwwO2Q9Q2QoYnwwLHF8MCxkfDAsQ3wwKXwwO3E9RGQobHwwLG98MCwxNjc3NzIxNiwwKXwwO3E9RWQocXwwLEN8MCwyNSl8MDtiPUM7cj1PZChxfDAsYnwwLDE5LDApfDA7bj1EZChyfDAsQ3wwLG18MCxufDApfDA7bT1DO2I9SGQocXwwLGJ8MCwyNSl8MDtiPUNkKGx8MCxvfDAsYnwwLEN8MCl8MDtvPURkKG58MCxtfDAsMzM1NTQ0MzIsMCl8MDtvPUVkKG98MCxDfDAsMjYpfDA7bD1DO2s9RGQocHwwLGt8MCxvfDAsbHwwKXwwO2w9SGQob3wwLGx8MCwyNil8MDtsPUNkKG58MCxtfDAsbHwwLEN8MCl8MDtjW2E+PjJdPWw7Y1thKzQ+PjJdPWs7Y1thKzg+PjJdPWo7Y1thKzEyPj4yXT1pO2NbYSsxNj4+Ml09aDtjW2ErMjA+PjJdPWc7Y1thKzI0Pj4yXT1mO2NbYSsyOD4+Ml09ZTtjW2ErMzI+PjJdPWQ7Y1thKzM2Pj4yXT1iO3JldHVybn1mdW5jdGlvbiBMYyhiLGQpe2I9YnwwO2Q9ZHwwO3ZhciBlPTAsZj0wLGc9MCxoPTAsaT0wLGo9MCxrPTAsbD0wLG09MCxuPTAsbz0wO209Y1tkPj4yXXwwO2w9Y1tkKzQ+PjJdfDA7az1jW2QrOD4+Ml18MDtqPWNbZCsxMj4+Ml18MDtpPWNbZCsxNj4+Ml18MDtoPWNbZCsyMD4+Ml18MDtnPWNbZCsyND4+Ml18MDtmPWNbZCsyOD4+Ml18MDtvPWNbZCszMj4+Ml18MDtlPWNbZCszNj4+Ml18MDttPSgoKCgoKCgoKCgoKChlKjE5fDApKzE2Nzc3MjE2Pj4yNSkrbT4+MjYpK2w+PjI1KStrPj4yNikraj4+MjUpK2k+PjI2KStoPj4yNSkrZz4+MjYpK2Y+PjI1KStvPj4yNikrZT4+MjUpKjE5fDApK218MDtuPW0+PjI2O2w9bitsfDA7bj1tLShuPDwyNil8MDttPWw+PjI1O2s9bStrfDA7bT1sLShtPDwyNSl8MDtsPWs+PjI2O2o9bCtqfDA7bD1rLShsPDwyNil8MDtrPWo+PjI1O2k9aytpfDA7az1qLShrPDwyNSl8MDtqPWk+PjI2O2g9aitofDA7aj1pLShqPDwyNil8MDtpPWg+PjI1O2c9aStnfDA7aT1oLShpPDwyNSl8MDtoPWc+PjI2O2Y9aCtmfDA7aD1nLShoPDwyNil8MDtnPWY+PjI1O2Q9ZytvfDA7Zz1mLShnPDwyNSl8MDtmPWQ+PjI2O2U9ZitlfDA7Zj1kLShmPDwyNil8MDtkPWUmMzM1NTQ0MzE7YVtiPj4wXT1uO2FbYisxPj4wXT1uPj4+ODthW2IrMj4+MF09bj4+PjE2O2FbYiszPj4wXT1tPDwyfG4+Pj4yNDthW2IrND4+MF09bT4+PjY7YVtiKzU+PjBdPW0+Pj4xNDthW2IrNj4+MF09bDw8M3xtPj4+MjI7YVtiKzc+PjBdPWw+Pj41O2FbYis4Pj4wXT1sPj4+MTM7YVtiKzk+PjBdPWs8PDV8bD4+PjIxO2FbYisxMD4+MF09az4+PjM7YVtiKzExPj4wXT1rPj4+MTE7YVtiKzEyPj4wXT1qPDw2fGs+Pj4xOTthW2IrMTM+PjBdPWo+Pj4yO2FbYisxND4+MF09aj4+PjEwO2FbYisxNT4+MF09aj4+PjE4O2FbYisxNj4+MF09aTthW2IrMTc+PjBdPWk+Pj44O2FbYisxOD4+MF09aT4+PjE2O2FbYisxOT4+MF09aDw8MXxpPj4+MjQ7YVtiKzIwPj4wXT1oPj4+NzthW2IrMjE+PjBdPWg+Pj4xNTthW2IrMjI+PjBdPWc8PDN8aD4+PjIzO2FbYisyMz4+MF09Zz4+PjU7YVtiKzI0Pj4wXT1nPj4+MTM7YVtiKzI1Pj4wXT1mPDw0fGc+Pj4yMTthW2IrMjY+PjBdPWY+Pj40O2FbYisyNz4+MF09Zj4+PjEyO2FbYisyOD4+MF09Zj4+PjIwfGQ8PDY7YVtiKzI5Pj4wXT1lPj4+MjthW2IrMzA+PjBdPWU+Pj4xMDthW2IrMzE+PjBdPWQ+Pj4xODtyZXR1cm59ZnVuY3Rpb24gTWMoYSxiLGQpe2E9YXwwO2I9YnwwO2Q9ZHwwO3ZhciBlPTAsZj0wLGc9MCxoPTAsaT0wLGo9MCxrPTAsbD0wLG09MCxuPTAsbz0wLHA9MCxxPTAscj0wLHM9MCx0PTAsdT0wLHY9MCx3PTAseD0wLHk9MCx6PTAsQT0wLEI9MCxDPTAsRD0wLEU9MCxGPTAsRz0wLEg9MCxJPTAsSj0wLEs9MCxMPTAsTT0wLE49MCxPPTAsUD0wLFE9MCxSPTAsUz0wLFQ9MCxVPTAsVj0wLFc9MCxYPTAsWT0wLFo9MCxfPTAsJD0wLGFhPTAsYmE9MCxjYT0wLGRhPTAsZWE9MCxmYT0wLGdhPTAsaGE9MDtWPWIrNDB8MDtqPWIrNDR8MDttPWIrNDh8MDtwPWIrNTJ8MDtzPWIrNTZ8MDt2PWIrNjB8MDt5PWIrNjR8MDtCPWIrNjh8MDtFPWIrNzJ8MDtDPWIrNzZ8MDtTPWIrNHwwO1A9Yis4fDA7ZT1iKzEyfDA7bD1iKzE2fDA7bj1iKzIwfDA7dT1iKzI0fDA7dz1iKzI4fDA7RD1iKzMyfDA7Tz1iKzM2fDA7Z2E9KGNbUz4+Ml18MCkrKGNbaj4+Ml18MCl8MDtmYT0oY1tQPj4yXXwwKSsoY1ttPj4yXXwwKXwwO2VhPShjW2U+PjJdfDApKyhjW3A+PjJdfDApfDA7ZGE9KGNbbD4+Ml18MCkrKGNbcz4+Ml18MCl8MDtjYT0oY1tuPj4yXXwwKSsoY1t2Pj4yXXwwKXwwO2JhPShjW3U+PjJdfDApKyhjW3k+PjJdfDApfDA7YWE9KGNbdz4+Ml18MCkrKGNbQj4+Ml18MCl8MDskPShjW0Q+PjJdfDApKyhjW0U+PjJdfDApfDA7WT0oY1tPPj4yXXwwKSsoY1tDPj4yXXwwKXwwO2NbYT4+Ml09KGNbYj4+Ml18MCkrKGNbVj4+Ml18MCk7aGE9YSs0fDA7Y1toYT4+Ml09Z2E7Z2E9YSs4fDA7Y1tnYT4+Ml09ZmE7ZmE9YSsxMnwwO2NbZmE+PjJdPWVhO2VhPWErMTZ8MDtjW2VhPj4yXT1kYTtkYT1hKzIwfDA7Y1tkYT4+Ml09Y2E7Y2E9YSsyNHwwO2NbY2E+PjJdPWJhO2JhPWErMjh8MDtjW2JhPj4yXT1hYTthYT1hKzMyfDA7Y1thYT4+Ml09JDskPWErMzZ8MDtjWyQ+PjJdPVk7WT1hKzQwfDA7Uz0oY1tqPj4yXXwwKS0oY1tTPj4yXXwwKXwwO1A9KGNbbT4+Ml18MCktKGNbUD4+Ml18MCl8MDtlPShjW3A+PjJdfDApLShjW2U+PjJdfDApfDA7bD0oY1tzPj4yXXwwKS0oY1tsPj4yXXwwKXwwO249KGNbdj4+Ml18MCktKGNbbj4+Ml18MCl8MDt1PShjW3k+PjJdfDApLShjW3U+PjJdfDApfDA7dz0oY1tCPj4yXXwwKS0oY1t3Pj4yXXwwKXwwO0Q9KGNbRT4+Ml18MCktKGNbRD4+Ml18MCl8MDtPPShjW0M+PjJdfDApLShjW08+PjJdfDApfDA7Y1tZPj4yXT0oY1tWPj4yXXwwKS0oY1tiPj4yXXwwKTtWPWErNDR8MDtjW1Y+PjJdPVM7Uz1hKzQ4fDA7Y1tTPj4yXT1QO1A9YSs1MnwwO2NbUD4+Ml09ZTtlPWErNTZ8MDtjW2U+PjJdPWw7bD1hKzYwfDA7Y1tsPj4yXT1uO249YSs2NHwwO2Nbbj4+Ml09dTt1PWErNjh8MDtjW3U+PjJdPXc7dz1hKzcyfDA7Y1t3Pj4yXT1EO0Q9YSs3NnwwO2NbRD4+Ml09TztPPWErODB8MDtKYyhPLGEsZCk7SmMoWSxZLGQrNDB8MCk7Qz1hKzEyMHwwO0pjKEMsZCsxMjB8MCxiKzEyMHwwKTtKYyhhLGIrODB8MCxkKzgwfDApO0U9Y1thPj4yXTw8MTtCPWNbaGE+PjJdPDwxO3k9Y1tnYT4+Ml08PDE7dj1jW2ZhPj4yXTw8MTtzPWNbZWE+PjJdPDwxO3A9Y1tkYT4+Ml08PDE7bT1jW2NhPj4yXTw8MTtqPWNbYmE+PjJdPDwxO2c9Y1thYT4+Ml08PDE7Yj1jWyQ+PjJdPDwxO1o9Y1tPPj4yXXwwO049YSs4NHwwO1c9Y1tOPj4yXXwwO009YSs4OHwwO1Q9Y1tNPj4yXXwwO0w9YSs5MnwwO1E9Y1tMPj4yXXwwO0s9YSs5NnwwO2Y9Y1tLPj4yXXwwO0o9YSsxMDB8MDtoPWNbSj4+Ml18MDtJPWErMTA0fDA7bz1jW0k+PjJdfDA7SD1hKzEwOHwwO3E9Y1tIPj4yXXwwO0c9YSsxMTJ8MDt4PWNbRz4+Ml18MDtGPWErMTE2fDA7ej1jW0Y+PjJdfDA7Xz1jW1k+PjJdfDA7WD1jW1Y+PjJdfDA7VT1jW1M+PjJdfDA7Uj1jW1A+PjJdfDA7ZD1jW2U+PjJdfDA7aT1jW2w+PjJdfDA7az1jW24+PjJdfDA7cj1jW3U+PjJdfDA7dD1jW3c+PjJdfDA7QT1jW0Q+PjJdfDA7Y1thPj4yXT1aLV87Y1toYT4+Ml09Vy1YO2NbZ2E+PjJdPVQtVTtjW2ZhPj4yXT1RLVI7Y1tlYT4+Ml09Zi1kO2NbZGE+PjJdPWgtaTtjW2NhPj4yXT1vLWs7Y1tiYT4+Ml09cS1yO2NbYWE+PjJdPXgtdDtjWyQ+PjJdPXotQTtjW1k+PjJdPV8rWjtjW1Y+PjJdPVgrVztjW1M+PjJdPVUrVDtjW1A+PjJdPVIrUTtjW2U+PjJdPWQrZjtjW2w+PjJdPWkraDtjW24+PjJdPWsrbztjW3U+PjJdPXIrcTtjW3c+PjJdPXQreDtjW0Q+PjJdPUErejtEPWNbQz4+Ml18MDt6PWErMTI0fDA7QT1jW3o+PjJdfDA7dz1hKzEyOHwwO3g9Y1t3Pj4yXXwwO3Q9YSsxMzJ8MDt1PWNbdD4+Ml18MDtxPWErMTM2fDA7cj1jW3E+PjJdfDA7bj1hKzE0MHwwO289Y1tuPj4yXXwwO2s9YSsxNDR8MDtsPWNbaz4+Ml18MDtoPWErMTQ4fDA7aT1jW2g+PjJdfDA7ZT1hKzE1MnwwO2Y9Y1tlPj4yXXwwO2E9YSsxNTZ8MDtkPWNbYT4+Ml18MDtjW08+PjJdPUQrRTtjW04+PjJdPUErQjtjW00+PjJdPXgreTtjW0w+PjJdPXUrdjtjW0s+PjJdPXIrcztjW0o+PjJdPW8rcDtjW0k+PjJdPWwrbTtjW0g+PjJdPWkrajtjW0c+PjJdPWYrZztjW0Y+PjJdPWQrYjtjW0M+PjJdPUUtRDtjW3o+PjJdPUItQTtjW3c+PjJdPXkteDtjW3Q+PjJdPXYtdTtjW3E+PjJdPXMtcjtjW24+PjJdPXAtbztjW2s+PjJdPW0tbDtjW2g+PjJdPWotaTtjW2U+PjJdPWctZjtjW2E+PjJdPWItZDtyZXR1cm59XG5mdW5jdGlvbiBIYShhKXthPWF8MDt2YXIgYj0wO2I9aTtpPWkrYXwwO2k9aSsxNSYtMTY7cmV0dXJuIGJ8MH1mdW5jdGlvbiBJYSgpe3JldHVybiBpfDB9ZnVuY3Rpb24gSmEoYSl7YT1hfDA7aT1hfWZ1bmN0aW9uIEthKGEsYil7YT1hfDA7Yj1ifDA7aT1hO2o9Yn1mdW5jdGlvbiBMYShhLGIpe2E9YXwwO2I9YnwwO2lmKCFuKXtuPWE7bz1ifX1mdW5jdGlvbiBNYShiKXtiPWJ8MDthW2s+PjBdPWFbYj4+MF07YVtrKzE+PjBdPWFbYisxPj4wXTthW2srMj4+MF09YVtiKzI+PjBdO2FbayszPj4wXT1hW2IrMz4+MF19ZnVuY3Rpb24gTmEoYil7Yj1ifDA7YVtrPj4wXT1hW2I+PjBdO2FbaysxPj4wXT1hW2IrMT4+MF07YVtrKzI+PjBdPWFbYisyPj4wXTthW2srMz4+MF09YVtiKzM+PjBdO2Fbays0Pj4wXT1hW2IrND4+MF07YVtrKzU+PjBdPWFbYis1Pj4wXTthW2srNj4+MF09YVtiKzY+PjBdO2Fbays3Pj4wXT1hW2IrNz4+MF19ZnVuY3Rpb24gT2EoYSl7YT1hfDA7Qz1hfWZ1bmN0aW9uIFBhKCl7cmV0dXJuIEN8MH1mdW5jdGlvbiBRYSgpe3JldHVybiAzMn1mdW5jdGlvbiBSYSgpe3JldHVybiAzMn1mdW5jdGlvbiBTYShhLGIsYyxkLGUpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO1VhKGEsYixjLGQsZSk7cmV0dXJuIDB9ZnVuY3Rpb24gVGEoYixjLGQsZSxmKXtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmPWZ8MDt2YXIgZz0wLGg9MDtoPWk7aT1pKzMyfDA7Zz1oO1VhKGcsYyxkLGUsZik7ZD1ZYyhiLGcpfDA7ZT0oZ3wwKT09KGJ8MCk7Yz0wO2Y9MDtkb3tjPWFbYitmPj4wXV5hW2crZj4+MF18YztmPWYrMXwwfXdoaWxlKChmfDApIT0zMik7aT1oO3JldHVybiAoZT8tMTpkKXwoKChjJjI1NSkrNTExfDApPj4+OCYxKSstMXwwfWZ1bmN0aW9uIFVhKGIsZCxlLGYsZyl7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7dmFyIGg9MCxqPTAsaz0wLGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTA7cz1pO2k9aSs2MDh8MDtyPXMrNDgwfDA7bz1zKzQxNnwwO249cztqPW4rNjR8MDtjW2o+PjJdPTA7Y1tqKzQ+PjJdPTA7Y1tqKzg+PjJdPTA7Y1tqKzEyPj4yXT0wO2g9bjtrPTg7bD1oKzY0fDA7ZG97Y1toPj4yXT1jW2s+PjJdO2g9aCs0fDA7az1rKzR8MH13aGlsZSgoaHwwKTwobHwwKSk7aD1yO2w9aCsxMjh8MDtkb3thW2g+PjBdPTU0O2g9aCsxfDB9d2hpbGUoKGh8MCk8KGx8MCkpO2Fbcj4+MF09YVtnPj4wXV41NDtoPTE7ZG97cT1yK2h8MDthW3E+PjBdPWFbcT4+MF1eYVtnK2g+PjBdO2g9aCsxfDB9d2hpbGUoKGh8MCkhPTMyKTtoPW4rNzJ8MDtjW2g+PjJdPTEwMjQ7Y1toKzQ+PjJdPTA7Y1tqPj4yXT0wO2Nbais0Pj4yXT0wO2o9bis4MHwwO2g9ajtrPXI7bD1oKzEyOHwwO2Rve2FbaD4+MF09YVtrPj4wXXwwO2g9aCsxfDA7az1rKzF8MH13aGlsZSgoaHwwKTwobHwwKSk7SGIobixqKTtqPWFbZz4+MF18MDtxPW4rMjA4fDA7bT1uKzI3MnwwO2NbbT4+Ml09MDtjW20rND4+Ml09MDtjW20rOD4+Ml09MDtjW20rMTI+PjJdPTA7aD1xO2s9ODtsPWgrNjR8MDtkb3tjW2g+PjJdPWNbaz4+Ml07aD1oKzR8MDtrPWsrNHwwfXdoaWxlKChofDApPChsfDApKTtoPXI7bD1oKzEyOHwwO2Rve2FbaD4+MF09OTI7aD1oKzF8MH13aGlsZSgoaHwwKTwobHwwKSk7YVtyPj4wXT1qXjkyO2g9MTtkb3twPXIraHwwO2FbcD4+MF09YVtwPj4wXV5hW2craD4+MF07aD1oKzF8MH13aGlsZSgoaHwwKSE9MzIpO2o9bisyODB8MDtwPWo7Y1twPj4yXT0xMDI0O2NbcCs0Pj4yXT0wO3A9bTtjW3A+PjJdPTA7Y1twKzQ+PjJdPTA7cD1uKzI4OHwwO2g9cDtrPXI7bD1oKzEyOHwwO2Rve2FbaD4+MF09YVtrPj4wXXwwO2g9aCsxfDA7az1rKzF8MH13aGlsZSgoaHwwKTwobHwwKSk7SGIocSxwKTtGYihuLGQsZSxmKTtHYihuLG8pO2Y9ajtkPWNbZj4+Ml18MDtmPWNbZis0Pj4yXXwwO2s9R2QoZHwwLGZ8MCwzKXwwO2s9ayYxMjc7aD1EZChkfDAsZnwwLDUxMiwwKXwwO2Nbaj4+Ml09aDtjW2orND4+Ml09QztqPW07aD1jW2o+PjJdfDA7aj1jW2orND4+Ml18MDtpZihmPj4+MD40Mjk0OTY3Mjk1fChmfDApPT0tMSZkPj4+MD40Mjk0OTY2NzgzKXtoPURkKGh8MCxqfDAsMSwwKXwwO2o9QztkPW07Y1tkPj4yXT1oO2NbZCs0Pj4yXT1qfWc9bTtjW2c+PjJdPWg7Y1tnKzQ+PjJdPWo7aj1DZCgxMjgsMCxrfDAsMCl8MDtnPUM7aD1uKzI4OCtrfDA7aWYoZz4+PjA+MHwoZ3wwKT09MCZqPj4+MD42NCl7az1vO2w9aCs2NHwwO2Rve2FbaD4+MF09YVtrPj4wXXwwO2g9aCsxfDA7az1rKzF8MH13aGlsZSgoaHwwKTwobHwwKSk7R2IocSxyKTtoPWI7az1yO2w9aCszMnwwO2Rve2FbaD4+MF09YVtrPj4wXXwwO2g9aCsxfDA7az1rKzF8MH13aGlsZSgoaHwwKTwobHwwKSk7aT1zO3JldHVybn1JZChofDAsb3wwLGp8MCl8MDtIYihxLHApO2g9bytqfDA7aj1DZCg2NCwwLGp8MCxnfDApfDA7Zz1DO2lmKGc+Pj4wPjB8KGd8MCk9PTAmaj4+PjA+MTI3KWRve0hiKHEsaCk7aD1oKzEyOHwwO2o9RGQoanwwLGd8MCwtMTI4LC0xKXwwO2c9Q313aGlsZShnPj4+MD4wfChnfDApPT0wJmo+Pj4wPjEyNyk7SWQocHwwLGh8MCxqfDApfDA7R2IocSxyKTtoPWI7az1yO2w9aCszMnwwO2Rve2FbaD4+MF09YVtrPj4wXXwwO2g9aCsxfDA7az1rKzF8MH13aGlsZSgoaHwwKTwobHwwKSk7aT1zO3JldHVybn1mdW5jdGlvbiBWYSgpe3JldHVybiAzMn1mdW5jdGlvbiBXYSgpe3JldHVybiAzMn1mdW5jdGlvbiBYYSgpe3JldHVybiAzMn1mdW5jdGlvbiBZYSgpe3JldHVybiAzMn1mdW5jdGlvbiBaYSgpe3JldHVybiAyNH1mdW5jdGlvbiBfYSgpe3JldHVybiAxNn1mdW5jdGlvbiAkYShiLGQsZSl7Yj1ifDA7ZD1kfDA7ZT1lfDA7dmFyIGY9MCxnPTAsaD0wLGo9MCxrPTAsbD0wLG09MDtrPWk7aT1pKzI3MnwwO2g9aztnPWsrMjA4fDA7Zj1oKzY0fDA7aj1oO2w9ODttPWorNjR8MDtkb3tjW2o+PjJdPWNbbD4+Ml07aj1qKzR8MDtsPWwrNHwwfXdoaWxlKChqfDApPChtfDApKTtqPWgrNzJ8MDtjW2o+PjJdPTI1NjtjW2orND4+Ml09MDtqPWY7Y1tqPj4yXT0wO2Nbais0Pj4yXT0wO2o9aCs4MHwwO2w9ZTttPWorMzJ8MDtkb3thW2o+PjBdPWFbbD4+MF18MDtqPWorMXwwO2w9bCsxfDB9d2hpbGUoKGp8MCk8KG18MCkpO0diKGgsZyk7aj1kO2w9ZzttPWorMzJ8MDtkb3thW2o+PjBdPWFbbD4+MF18MDtqPWorMXwwO2w9bCsxfDB9d2hpbGUoKGp8MCk8KG18MCkpO21kKGIsZCwzMzc4NSk7aT1rO3JldHVybiAwfWZ1bmN0aW9uIGFiKGIsYyl7Yj1ifDA7Yz1jfDA7dmFyIGQ9MDtkPTA7ZG97YVtjK2Q+PjBdPUJhKDApfDA7ZD1kKzF8MH13aGlsZSgoZHwwKSE9MzIpO21kKGIsYywzMzc4NSk7cmV0dXJuIDB9ZnVuY3Rpb24gYmIoYSxiLGMpe2E9YXwwO2I9YnwwO2M9Y3wwO3ZhciBkPTAsZT0wO2Q9aTtpPWkrMzJ8MDtlPWQ7bWQoZSxjLGIpO25iKGEsMzI1NzYsZSwzMjU5Mik7aT1kO3JldHVybiAwfWZ1bmN0aW9uIGNiKGEsYixjLGQsZSxmLGcpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO3JjKGEsYixjLGQsZSxmLGcpfDA7cmV0dXJuIDB9ZnVuY3Rpb24gZGIoYSxiLGMsZCxlLGYsZyxoKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDt2YXIgaj0wLGs9MCxsPTA7aj1pO2k9aSs2NHwwO2w9aiszMnwwO2s9ajttZChsLGgsZyk7bmIoaywzMjU3NixsLDMyNTkyKTtyYyhhLGIsYyxkLGUsZixrKXwwO2k9ajtyZXR1cm4gMH1mdW5jdGlvbiBlYihhLGIsYyxkLGUsZil7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7aWYoZD4+PjA+MHwoZHwwKT09MCZjPj4+MD40Mjk0OTY3Mjc5KXtlPS0xO3JldHVybiBlfDB9cmMoYSsxNnwwLGEsYixjLGQsZSxmKXwwO2U9MDtyZXR1cm4gZXwwfWZ1bmN0aW9uIGZiKGEsYixjLGQsZSxmLGcpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO3ZhciBoPTAsaj0wLGs9MDtrPWk7aT1pKzY0fDA7aj1rKzMyfDA7aD1rO2lmKGQ+Pj4wPjB8KGR8MCk9PTAmYz4+PjA+NDI5NDk2NzI3OSl7Zz0tMTtpPWs7cmV0dXJuIGd8MH1tZChqLGcsZik7bmIoaCwzMjU3NixqLDMyNTkyKTtyYyhhKzE2fDAsYSxiLGMsZCxlLGgpfDA7Zz0wO2k9aztyZXR1cm4gZ3wwfWZ1bmN0aW9uIGdiKGEsYixjLGQsZSxmLGcpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO3JldHVybiB0YyhhLGIsYyxkLGUsZixnKXwwfWZ1bmN0aW9uIGhiKGEsYixjLGQsZSxmLGcsaCl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7dmFyIGo9MCxrPTAsbD0wO2o9aTtpPWkrNjR8MDtsPWorMzJ8MDtrPWo7bWQobCxoLGcpO25iKGssMzI1NzYsbCwzMjU5Mik7aD10YyhhLGIsYyxkLGUsZixrKXwwO2k9ajtyZXR1cm4gaHwwfWZ1bmN0aW9uIGliKGEsYixjLGQsZSxmKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmPWZ8MDtpZihkPj4+MDwwfChkfDApPT0wJmM+Pj4wPDE2KXtlPS0xO3JldHVybiBlfDB9ZD1EZChjfDAsZHwwLC0xNiwtMSl8MDtlPXRjKGEsYisxNnwwLGIsZCxDLGUsZil8MDtyZXR1cm4gZXwwfWZ1bmN0aW9uIGpiKGEsYixjLGQsZSxmLGcpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO3ZhciBoPTAsaj0wLGs9MDtrPWk7aT1pKzY0fDA7aj1rKzMyfDA7aD1rO2lmKGQ+Pj4wPDB8KGR8MCk9PTAmYz4+PjA8MTYpe2c9LTE7aT1rO3JldHVybiBnfDB9Yz1EZChjfDAsZHwwLC0xNiwtMSl8MDtkPUM7bWQoaixnLGYpO25iKGgsMzI1NzYsaiwzMjU5Mik7Zz10YyhhLGIrMTZ8MCxiLGMsZCxlLGgpfDA7aT1rO3JldHVybiBnfDB9ZnVuY3Rpb24ga2IoYixkLGUsZixnKXtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDt2YXIgaD0wLGo9MCxrPTAsbD0wLG09MCxuPTAsbz0wLHA9MCxxPTAscj0wLHM9MCx0PTAsdT0wLHY9MCx3PTAseD0wLHk9MCx6PTAsQT0wO0E9aTt2PWk9aSs2MyYtNjQ7aT1pKzQ4MHwwO3k9djt3PXYrNDQ4fDA7eD12KzQyNHwwO2o9diszOTJ8MDt2PXYrMzYwfDA7aD0wO2Rve2FbditoPj4wXT1CYSgwKXwwO2g9aCsxfDB9d2hpbGUoKGh8MCkhPTMyKTttZChqLHYsMzM3ODUpO2g9YjtvPWo7cD1oKzMyfDA7ZG97YVtoPj4wXT1hW28+PjBdfDA7aD1oKzF8MDtvPW8rMXwwfXdoaWxlKChofDApPChwfDApKTtGZCh5fDAsMCwzNTcpfDA7cT15O2NbcT4+Ml09LTIyMjQ0MzI0ODtjW3ErND4+Ml09MTc3OTAzMzcwMztxPXkrOHwwO2NbcT4+Ml09LTIwNjcwOTM3MDE7Y1txKzQ+PjJdPS0xMTUwODMzMDE5O3E9eSsxNnwwO2NbcT4+Ml09LTIzNzkxNTczO2NbcSs0Pj4yXT0xMDEzOTA0MjQyO3E9eSsyNHwwO2NbcT4+Ml09MTU5NTc1MDEyOTtjW3ErND4+Ml09LTE1MjE0ODY1MzQ7cT15KzMyfDA7Y1txPj4yXT0tMTM3NzQwMjE1OTtjW3ErND4+Ml09MTM1OTg5MzExOTtxPXkrNDB8MDtjW3E+PjJdPTcyNTUxMTE5OTtjW3ErND4+Ml09LTE2OTQxNDQzNzI7cT15KzQ4fDA7Y1txPj4yXT0tNzk1Nzc3NDk7Y1txKzQ+PjJdPTUyODczNDYzNTtxPXkrNTZ8MDtjW3E+PjJdPTMyNzAzMzIwOTtjW3ErND4+Ml09MTU0MTQ1OTIyNTtxPXkrMzUyfDA7cj15Kzk2fDA7cz15KzY0fDA7dD15KzcyfDA7dT15KzIyNHwwO2g9MDttPTA7bj0zMjt3aGlsZSgxKXtsPTI1Ni1ofDA7aD15Kzk2K2h8MDtpZighKG0+Pj4wPjB8KG18MCk9PTAmbj4+PjA+bD4+PjApKXt6PTU7YnJlYWt9SWQoaHwwLGp8MCxsfDApfDA7Y1txPj4yXT0oY1txPj4yXXwwKStsO3A9cztoPWNbcD4+Ml18MDtwPWNbcCs0Pj4yXXwwO2s9RGQoaHwwLHB8MCwxMjgsMCl8MDtvPXM7Y1tvPj4yXT1rO2Nbbys0Pj4yXT1DO289dDtvPURkKChwPj4+MD40Mjk0OTY3Mjk1fChwfDApPT0tMSZoPj4+MD40Mjk0OTY3MTY3KSYxfDAsMCxjW28+PjJdfDAsY1tvKzQ+PjJdfDApfDA7aD10O2NbaD4+Ml09bztjW2grND4+Ml09QztBYih5LHIpO2g9cjtvPXU7cD1oKzEyOHwwO2Rve2NbaD4+Ml09Y1tvPj4yXTtoPWgrNHwwO289bys0fDB9d2hpbGUoKGh8MCk8KHB8MCkpO2g9KGNbcT4+Ml18MCkrLTEyOHwwO2NbcT4+Ml09aDtrPUNkKG58MCxtfDAsbHwwLDApfDA7aWYoKG58MCk9PShsfDApJihtfDApPT0wKXtuPWc7bD0wO209MzI7YnJlYWt9ZWxzZXtqPWorbHwwO209QztuPWt9fWlmKCh6fDApPT01KXtJZChofDAsanwwLG58MCl8MDtoPURkKGNbcT4+Ml18MCwwLG58MCxtfDApfDA7Y1txPj4yXT1oO249ZztsPTA7bT0zMn13aGlsZSgxKXtrPTI1Ni1ofDA7aD15Kzk2K2h8MDtpZighKGw+Pj4wPjB8KGx8MCk9PTAmbT4+PjA+az4+PjApKXt6PTg7YnJlYWt9SWQoaHwwLG58MCxrfDApfDA7Y1txPj4yXT0oY1txPj4yXXwwKStrO3A9cztoPWNbcD4+Ml18MDtwPWNbcCs0Pj4yXXwwO2o9RGQoaHwwLHB8MCwxMjgsMCl8MDtvPXM7Y1tvPj4yXT1qO2Nbbys0Pj4yXT1DO289dDtvPURkKChwPj4+MD40Mjk0OTY3Mjk1fChwfDApPT0tMSZoPj4+MD40Mjk0OTY3MTY3KSYxfDAsMCxjW28+PjJdfDAsY1tvKzQ+PjJdfDApfDA7aD10O2NbaD4+Ml09bztjW2grND4+Ml09QztBYih5LHIpO2g9cjtvPXU7cD1oKzEyOHwwO2Rve2NbaD4+Ml09Y1tvPj4yXTtoPWgrNHwwO289bys0fDB9d2hpbGUoKGh8MCk8KHB8MCkpO2g9KGNbcT4+Ml18MCkrLTEyOHwwO2NbcT4+Ml09aDtqPUNkKG18MCxsfDAsa3wwLDApfDA7aWYoKG18MCk9PShrfDApJihsfDApPT0wKWJyZWFrO2Vsc2V7bj1uK2t8MDtsPUM7bT1qfX1pZigoenwwKT09OCl7SWQoaHwwLG58MCxtfDApfDA7ej1EZChjW3E+PjJdfDAsMCxtfDAsbHwwKXwwO2NbcT4+Ml09en16Yih5LHgsMjQpfDA7aWYoZj4+PjA+MHwoZnwwKT09MCZlPj4+MD40Mjk0OTY3Mjc5KXt6PS0xO2k9QTtyZXR1cm4genwwfW1kKHksdixnKTtuYih3LDMyNTc2LHksMzI1OTIpO3JjKGIrNDh8MCxiKzMyfDAsZCxlLGYseCx3KXwwO3o9MDtpPUE7cmV0dXJuIHp8MH1mdW5jdGlvbiBsYihhLGIsZCxlLGYsZyl7YT1hfDA7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7dmFyIGg9MCxqPTAsaz0wLGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MCx2PTAsdz0wLHg9MCx5PTAsej0wO3k9aTt2PWk9aSs2MyYtNjQ7aT1pKzQxNnwwO3c9djt1PXYrMzg0fDA7dj12KzM2MHwwO2lmKGU+Pj4wPDB8KGV8MCk9PTAmZD4+PjA8NDgpe3g9LTE7aT15O3JldHVybiB4fDB9RmQod3wwLDAsMzU3KXwwO3A9dztjW3A+PjJdPS0yMjI0NDMyNDg7Y1twKzQ+PjJdPTE3NzkwMzM3MDM7cD13Kzh8MDtjW3A+PjJdPS0yMDY3MDkzNzAxO2NbcCs0Pj4yXT0tMTE1MDgzMzAxOTtwPXcrMTZ8MDtjW3A+PjJdPS0yMzc5MTU3MztjW3ArND4+Ml09MTAxMzkwNDI0MjtwPXcrMjR8MDtjW3A+PjJdPTE1OTU3NTAxMjk7Y1twKzQ+PjJdPS0xNTIxNDg2NTM0O3A9dyszMnwwO2NbcD4+Ml09LTEzNzc0MDIxNTk7Y1twKzQ+PjJdPTEzNTk4OTMxMTk7cD13KzQwfDA7Y1twPj4yXT03MjU1MTExOTk7Y1twKzQ+PjJdPS0xNjk0MTQ0MzcyO3A9dys0OHwwO2NbcD4+Ml09LTc5NTc3NzQ5O2NbcCs0Pj4yXT01Mjg3MzQ2MzU7cD13KzU2fDA7Y1twPj4yXT0zMjcwMzMyMDk7Y1twKzQ+PjJdPTE1NDE0NTkyMjU7cD13KzM1MnwwO3E9dys5NnwwO3I9dys2NHwwO3M9dys3MnwwO3Q9dysyMjR8MDtrPWI7aD0wO209MDtuPTMyO3doaWxlKDEpe2w9MjU2LWh8MDtoPXcrOTYraHwwO2lmKCEobT4+PjA+MHwobXwwKT09MCZuPj4+MD5sPj4+MCkpe3g9NDticmVha31JZChofDAsa3wwLGx8MCl8MDtjW3A+PjJdPShjW3A+PjJdfDApK2w7bz1yO2g9Y1tvPj4yXXwwO289Y1tvKzQ+PjJdfDA7ej1EZChofDAsb3wwLDEyOCwwKXwwO2o9cjtjW2o+PjJdPXo7Y1tqKzQ+PjJdPUM7aj1zO2o9RGQoKG8+Pj4wPjQyOTQ5NjcyOTV8KG98MCk9PS0xJmg+Pj4wPjQyOTQ5NjcxNjcpJjF8MCwwLGNbaj4+Ml18MCxjW2orND4+Ml18MCl8MDtoPXM7Y1toPj4yXT1qO2NbaCs0Pj4yXT1DO0FiKHcscSk7aD1xO2o9dDtvPWgrMTI4fDA7ZG97Y1toPj4yXT1jW2o+PjJdO2g9aCs0fDA7aj1qKzR8MH13aGlsZSgoaHwwKTwob3wwKSk7aD0oY1twPj4yXXwwKSstMTI4fDA7Y1twPj4yXT1oO2o9Q2QobnwwLG18MCxsfDAsMCl8MDtpZigobnwwKT09KGx8MCkmKG18MCk9PTApe2w9MDttPTMyO2JyZWFrfWVsc2V7az1rK2x8MDttPUM7bj1qfX1pZigoeHwwKT09NCl7SWQoaHwwLGt8MCxufDApfDA7aD1EZChjW3A+PjJdfDAsMCxufDAsbXwwKXwwO2NbcD4+Ml09aDtsPTA7bT0zMn13aGlsZSgxKXtrPTI1Ni1ofDA7aD13Kzk2K2h8MDtpZighKGw+Pj4wPjB8KGx8MCk9PTAmbT4+PjA+az4+PjApKXt4PTc7YnJlYWt9SWQoaHwwLGZ8MCxrfDApfDA7Y1twPj4yXT0oY1twPj4yXXwwKStrO289cjtoPWNbbz4+Ml18MDtvPWNbbys0Pj4yXXwwO3o9RGQoaHwwLG98MCwxMjgsMCl8MDtqPXI7Y1tqPj4yXT16O2Nbais0Pj4yXT1DO2o9cztqPURkKChvPj4+MD40Mjk0OTY3Mjk1fChvfDApPT0tMSZoPj4+MD40Mjk0OTY3MTY3KSYxfDAsMCxjW2o+PjJdfDAsY1tqKzQ+PjJdfDApfDA7aD1zO2NbaD4+Ml09ajtjW2grND4+Ml09QztBYih3LHEpO2g9cTtqPXQ7bz1oKzEyOHwwO2Rve2NbaD4+Ml09Y1tqPj4yXTtoPWgrNHwwO2o9ais0fDB9d2hpbGUoKGh8MCk8KG98MCkpO2g9KGNbcD4+Ml18MCkrLTEyOHwwO2NbcD4+Ml09aDtqPUNkKG18MCxsfDAsa3wwLDApfDA7aWYoKG18MCk9PShrfDApJihsfDApPT0wKWJyZWFrO2Vsc2V7Zj1mK2t8MDtsPUM7bT1qfX1pZigoeHwwKT09Nyl7SWQoaHwwLGZ8MCxtfDApfDA7ej1EZChjW3A+PjJdfDAsMCxtfDAsbHwwKXwwO2NbcD4+Ml09en16Yih3LHYsMjQpfDA7aWYoKGQmLTE2fDApPT0zMiYoZXwwKT09MCl7ej0tMTtpPXk7cmV0dXJuIHp8MH14PURkKGR8MCxlfDAsLTQ4LC0xKXwwO3o9QzttZCh3LGcsYik7bmIodSwzMjU3Nix3LDMyNTkyKTt6PXRjKGEsYis0OHwwLGIrMzJ8MCx4LHosdix1KXwwO2k9eTtyZXR1cm4genwwfWZ1bmN0aW9uIG1iKCl7cmV0dXJuIDQ4fWZ1bmN0aW9uIG5iKGIsYyxlLGYpe2I9YnwwO2M9Y3wwO2U9ZXwwO2Y9ZnwwO3ZhciBnPTAsaD0wLGk9MCxqPTAsaz0wLGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MCx2PTAsdz0wLHg9MCx5PTAsej0wLEE9MCxCPTAsQz0wLEQ9MCxFPTAsRj0wLEc9MCxIPTAsST0wLEo9MCxLPTA7az0yMDtsPShkW2YrMT4+MF18MCk8PDh8KGRbZj4+MF18MCl8KGRbZisyPj4wXXwwKTw8MTZ8KGRbZiszPj4wXXwwKTw8MjQ7bT0oZFtlKzE+PjBdfDApPDw4fChkW2U+PjBdfDApfChkW2UrMj4+MF18MCk8PDE2fChkW2UrMz4+MF18MCk8PDI0O249KGRbZis5Pj4wXXwwKTw8OHwoZFtmKzg+PjBdfDApfChkW2YrMTA+PjBdfDApPDwxNnwoZFtmKzExPj4wXXwwKTw8MjQ7bz0oZFtlKzE3Pj4wXXwwKTw8OHwoZFtlKzE2Pj4wXXwwKXwoZFtlKzE4Pj4wXXwwKTw8MTZ8KGRbZSsxOT4+MF18MCk8PDI0O3A9KGRbZSsyMT4+MF18MCk8PDh8KGRbZSsyMD4+MF18MCl8KGRbZSsyMj4+MF18MCk8PDE2fChkW2UrMjM+PjBdfDApPDwyNDtxPShkW2UrMjU+PjBdfDApPDw4fChkW2UrMjQ+PjBdfDApfChkW2UrMjY+PjBdfDApPDwxNnwoZFtlKzI3Pj4wXXwwKTw8MjQ7cj0oZFtlKzI5Pj4wXXwwKTw8OHwoZFtlKzI4Pj4wXXwwKXwoZFtlKzMwPj4wXXwwKTw8MTZ8KGRbZSszMT4+MF18MCk8PDI0O3M9KGRbZisxMz4+MF18MCk8PDh8KGRbZisxMj4+MF18MCl8KGRbZisxND4+MF18MCk8PDE2fChkW2YrMTU+PjBdfDApPDwyNDt0PShkW2UrNT4+MF18MCk8PDh8KGRbZSs0Pj4wXXwwKXwoZFtlKzY+PjBdfDApPDwxNnwoZFtlKzc+PjBdfDApPDwyNDt1PShkW2UrOT4+MF18MCk8PDh8KGRbZSs4Pj4wXXwwKXwoZFtlKzEwPj4wXXwwKTw8MTZ8KGRbZSsxMT4+MF18MCk8PDI0O2o9KGRbZSsxMz4+MF18MCk8PDh8KGRbZSsxMj4+MF18MCl8KGRbZSsxND4+MF18MCk8PDE2fChkW2UrMTU+PjBdfDApPDwyNDtmPShkW2YrNT4+MF18MCk8PDh8KGRbZis0Pj4wXXwwKXwoZFtmKzY+PjBdfDApPDwxNnwoZFtmKzc+PjBdfDApPDwyNDtnPShkW2MrMT4+MF18MCk8PDh8KGRbYz4+MF18MCl8KGRbYysyPj4wXXwwKTw8MTZ8KGRbYyszPj4wXXwwKTw8MjQ7aD0oZFtjKzU+PjBdfDApPDw4fChkW2MrND4+MF18MCl8KGRbYys2Pj4wXXwwKTw8MTZ8KGRbYys3Pj4wXXwwKTw8MjQ7aT0oZFtjKzk+PjBdfDApPDw4fChkW2MrOD4+MF18MCl8KGRbYysxMD4+MF18MCk8PDE2fChkW2MrMTE+PjBdfDApPDwyNDtlPShkW2MrMTM+PjBdfDApPDw4fChkW2MrMTI+PjBdfDApfChkW2MrMTQ+PjBdfDApPDwxNnwoZFtjKzE1Pj4wXXwwKTw8MjQ7d2hpbGUoMSl7RD1wK2x8MDtEPShEPj4+MjV8RDw8NyleajtBPUQrbHwwO0E9KEE+Pj4yM3xBPDw5KV5pO3g9QStEfDA7eD0oeD4+PjE5fHg8PDEzKV5wO0c9eCtBfDA7Rz0oRz4+PjE0fEc8PDE4KV5sO3o9ZittfDA7ej1lXih6Pj4+MjV8ejw8Nyk7dz16K2Z8MDt3PXFeKHc+Pj4yM3x3PDw5KTtKPXcrenwwO0o9KEo+Pj4xOXxKPDwxMylebTtDPUord3wwO0M9KEM+Pj4xNHxDPDwxOCleZjt2PW4rZ3wwO3Y9cl4odj4+PjI1fHY8PDcpO0k9ditufDA7ST0oST4+PjIzfEk8PDkpXnQ7Rj1JK3Z8MDtGPShGPj4+MTl8Rjw8MTMpXmc7eT1GK0l8MDt5PSh5Pj4+MTR8eTw8MTgpXm47SD1zK298MDtIPShIPj4+MjV8SDw8NyledTtFPUgrc3wwO0U9KEU+Pj4yM3xFPDw5KV5oO0I9RStIfDA7Qj0oQj4+PjE5fEI8PDEzKV5vO2M9QitFfDA7Yz0oYz4+PjE0fGM8PDE4KV5zO0s9RytIfDA7bT0oSz4+PjI1fEs8PDcpXko7Sj1tK0d8MDt0PShKPj4+MjN8Sjw8OSleSTtJPXQrbXwwO3U9KEk+Pj4xOXxJPDwxMyleSDtIPXUrdHwwO2w9KEg+Pj4xNHxIPDwxOCleRztHPUMrRHwwO2c9KEc+Pj4yNXxHPDw3KV5GO0Y9ZytDfDA7aD0oRj4+PjIzfEY8PDkpXkU7RT1oK2d8MDtqPShFPj4+MTl8RTw8MTMpXkQ7RD1qK2h8MDtmPShEPj4+MTR8RDw8MTgpXkM7Qz15K3p8MDtvPShDPj4+MjV8Qzw8NyleQjtCPW8reXwwO2k9KEI+Pj4yM3xCPDw5KV5BO0E9aStvfDA7ZT0oQT4+PjE5fEE8PDEzKV56O3o9ZStpfDA7bj0oej4+PjE0fHo8PDE4KV55O3k9Yyt2fDA7cD0oeT4+PjI1fHk8PDcpXng7eD1wK2N8MDtxPSh4Pj4+MjN8eDw8OSledzt3PXErcHwwO3I9KHc+Pj4xOXx3PDwxMyledjt2PXIrcXwwO3M9KHY+Pj4xNHx2PDwxOCleYztpZigoa3wwKTw9MilicmVhaztlbHNlIGs9aystMnwwfWFbYj4+MF09bDthW2IrMT4+MF09bD4+Pjg7YVtiKzI+PjBdPWw+Pj4xNjthW2IrMz4+MF09bD4+PjI0O2FbYis0Pj4wXT1mO2FbYis1Pj4wXT1mPj4+ODthW2IrNj4+MF09Zj4+PjE2O2FbYis3Pj4wXT1mPj4+MjQ7YVtiKzg+PjBdPW47YVtiKzk+PjBdPW4+Pj44O2FbYisxMD4+MF09bj4+PjE2O2FbYisxMT4+MF09bj4+PjI0O2FbYisxMj4+MF09czthW2IrMTM+PjBdPXM+Pj44O2FbYisxND4+MF09cz4+PjE2O2FbYisxNT4+MF09cz4+PjI0O2FbYisxNj4+MF09ZzthW2IrMTc+PjBdPWc+Pj44O2FbYisxOD4+MF09Zz4+PjE2O2FbYisxOT4+MF09Zz4+PjI0O2FbYisyMD4+MF09aDthW2IrMjE+PjBdPWg+Pj44O2FbYisyMj4+MF09aD4+PjE2O2FbYisyMz4+MF09aD4+PjI0O2FbYisyND4+MF09aTthW2IrMjU+PjBdPWk+Pj44O2FbYisyNj4+MF09aT4+PjE2O2FbYisyNz4+MF09aT4+PjI0O2FbYisyOD4+MF09ZTthW2IrMjk+PjBdPWU+Pj44O2FbYiszMD4+MF09ZT4+PjE2O2FbYiszMT4+MF09ZT4+PjI0O3JldHVybn1mdW5jdGlvbiBvYihiLGMsZSxmKXtiPWJ8MDtjPWN8MDtlPWV8MDtmPWZ8MDt2YXIgZz0wLGg9MCxpPTAsaj0wLGs9MCxsPTAsbT0wLG49MCxvPTAscD0wLHE9MCxyPTAscz0wLHQ9MCx1PTAsdj0wLHc9MCx4PTAseT0wLHo9MCxBPTAsQj0wLEM9MCxEPTAsRT0wLEY9MCxHPTAsSD0wLEk9MCxKPTAsSz0wLEw9MCxNPTAsTj0wLE89MCxQPTAsUT0wLFI9MCxTPTAsVD0wLFU9MCxWPTAsVz0wLFg9MCxZPTAsWj0wLF89MDtGPShkW2YrMT4+MF18MCk8PDh8KGRbZj4+MF18MCl8KGRbZisyPj4wXXwwKTw8MTZ8KGRbZiszPj4wXXwwKTw8MjQ7Rz0oZFtlKzE+PjBdfDApPDw4fChkW2U+PjBdfDApfChkW2UrMj4+MF18MCk8PDE2fChkW2UrMz4+MF18MCk8PDI0O0g9KGRbZSs1Pj4wXXwwKTw8OHwoZFtlKzQ+PjBdfDApfChkW2UrNj4+MF18MCk8PDE2fChkW2UrNz4+MF18MCk8PDI0O0k9KGRbZSs5Pj4wXXwwKTw8OHwoZFtlKzg+PjBdfDApfChkW2UrMTA+PjBdfDApPDwxNnwoZFtlKzExPj4wXXwwKTw8MjQ7Sj0oZFtlKzEzPj4wXXwwKTw8OHwoZFtlKzEyPj4wXXwwKXwoZFtlKzE0Pj4wXXwwKTw8MTZ8KGRbZSsxNT4+MF18MCk8PDI0O0I9KGRbZis1Pj4wXXwwKTw8OHwoZFtmKzQ+PjBdfDApfChkW2YrNj4+MF18MCk8PDE2fChkW2YrNz4+MF18MCk8PDI0O0M9KGRbYysxPj4wXXwwKTw8OHwoZFtjPj4wXXwwKXwoZFtjKzI+PjBdfDApPDwxNnwoZFtjKzM+PjBdfDApPDwyNDtEPShkW2MrNT4+MF18MCk8PDh8KGRbYys0Pj4wXXwwKXwoZFtjKzY+PjBdfDApPDwxNnwoZFtjKzc+PjBdfDApPDwyNDtFPShkW2MrOT4+MF18MCk8PDh8KGRbYys4Pj4wXXwwKXwoZFtjKzEwPj4wXXwwKTw8MTZ8KGRbYysxMT4+MF18MCk8PDI0O3c9KGRbYysxMz4+MF18MCk8PDh8KGRbYysxMj4+MF18MCl8KGRbYysxND4+MF18MCk8PDE2fChkW2MrMTU+PjBdfDApPDwyNDt4PShkW2YrOT4+MF18MCk8PDh8KGRbZis4Pj4wXXwwKXwoZFtmKzEwPj4wXXwwKTw8MTZ8KGRbZisxMT4+MF18MCk8PDI0O3k9KGRbZSsxNz4+MF18MCk8PDh8KGRbZSsxNj4+MF18MCl8KGRbZSsxOD4+MF18MCk8PDE2fChkW2UrMTk+PjBdfDApPDwyNDt6PShkW2UrMjE+PjBdfDApPDw4fChkW2UrMjA+PjBdfDApfChkW2UrMjI+PjBdfDApPDwxNnwoZFtlKzIzPj4wXXwwKTw8MjQ7QT0oZFtlKzI1Pj4wXXwwKTw8OHwoZFtlKzI0Pj4wXXwwKXwoZFtlKzI2Pj4wXXwwKTw8MTZ8KGRbZSsyNz4+MF18MCk8PDI0O3Y9KGRbZSsyOT4+MF18MCk8PDh8KGRbZSsyOD4+MF18MCl8KGRbZSszMD4+MF18MCk8PDE2fChkW2UrMzE+PjBdfDApPDwyNDtjPShkW2YrMTM+PjBdfDApPDw4fChkW2YrMTI+PjBdfDApfChkW2YrMTQ+PjBdfDApPDwxNnwoZFtmKzE1Pj4wXXwwKTw8MjQ7ZT0yMDtmPUY7Zz1HO2g9eDtpPXk7aj16O2s9QTtsPXY7bT1jO249SDtvPUk7cD1KO3E9QjtyPUM7cz1EO3Q9RTt1PXc7d2hpbGUoMSl7VD1mK2p8MDtUPShUPj4+MjV8VDw8NylecDtRPVQrZnwwO1E9KFE+Pj4yM3xRPDw5KV50O049UStUfDA7Tj0oTj4+PjE5fE48PDEzKV5qO1c9TitRfDA7Vz0oVz4+PjE0fFc8PDE4KV5mO1A9ZytxfDA7UD0oUD4+PjI1fFA8PDcpXnU7TT1QK3F8MDtNPShNPj4+MjN8TTw8OSleaztaPU0rUHwwO1o9KFo+Pj4xOXxaPDwxMyleZztTPVorTXwwO1M9KFM+Pj4xNHxTPDwxOClecTtMPXIraHwwO0w9KEw+Pj4yNXxMPDw3KV5sO1k9TCtofDA7WT0oWT4+PjIzfFk8PDkpXm47Vj1ZK0x8MDtWPShWPj4+MTl8Vjw8MTMpXnI7Tz1WK1l8MDtPPShPPj4+MTR8Tzw8MTgpXmg7WD1pK218MDtYPW9eKFg+Pj4yNXxYPDw3KTtVPVgrbXwwO1U9KFU+Pj4yM3xVPDw5KV5zO1I9VStYfDA7Uj0oUj4+PjE5fFI8PDEzKV5pO0s9UitVfDA7Sz0oSz4+PjE0fEs8PDE4KV5tO189VytYfDA7Zz0oXz4+PjI1fF88PDcpXlo7Wj1nK1d8MDtuPShaPj4+MjN8Wjw8OSleWTtZPW4rZ3wwO289KFk+Pj4xOXxZPDwxMyleWDtYPW8rbnwwO2Y9KFg+Pj4xNHxYPDwxOCleVztXPVMrVHwwO3I9KFc+Pj4yNXxXPDw3KV5WO1Y9citTfDA7cz0oVj4+PjIzfFY8PDkpXlU7VT1zK3J8MDtwPShVPj4+MTl8VTw8MTMpXlQ7VD1wK3N8MDtxPShUPj4+MTR8VDw8MTgpXlM7Uz1PK1B8MDtpPShTPj4+MjV8Uzw8NyleUjtSPWkrT3wwO3Q9KFI+Pj4yM3xSPDw5KV5RO1E9dCtpfDA7dT0oUT4+PjE5fFE8PDEzKV5QO1A9dSt0fDA7aD0oUD4+PjE0fFA8PDE4KV5PO089SytMfDA7aj0oTz4+PjI1fE88PDcpXk47Tj1qK0t8MDtrPShOPj4+MjN8Tjw8OSleTTtNPWsranwwO2w9KE0+Pj4xOXxNPDwxMyleTDtMPWwra3wwO209KEw+Pj4xNHxMPDwxOCleSztpZigoZXwwKTw9MilicmVhaztlbHNlIGU9ZSstMnwwfUw9ZitGfDA7TT1nK0d8MDtOPW4rSHwwO089bytJfDA7UD1wK0p8MDtRPXErQnwwO1I9citDfDA7Uz1zK0R8MDtUPXQrRXwwO1U9dSt3fDA7Vj1oK3h8MDtXPWkreXwwO1g9ait6fDA7WT1rK0F8MDtaPWwrdnwwO189bStjfDA7YVtiPj4wXT1MO2FbYisxPj4wXT1MPj4+ODthW2IrMj4+MF09TD4+PjE2O2FbYiszPj4wXT1MPj4+MjQ7YVtiKzQ+PjBdPU07YVtiKzU+PjBdPU0+Pj44O2FbYis2Pj4wXT1NPj4+MTY7YVtiKzc+PjBdPU0+Pj4yNDthW2IrOD4+MF09TjthW2IrOT4+MF09Tj4+Pjg7YVtiKzEwPj4wXT1OPj4+MTY7YVtiKzExPj4wXT1OPj4+MjQ7YVtiKzEyPj4wXT1PO2FbYisxMz4+MF09Tz4+Pjg7YVtiKzE0Pj4wXT1PPj4+MTY7YVtiKzE1Pj4wXT1PPj4+MjQ7YVtiKzE2Pj4wXT1QO2FbYisxNz4+MF09UD4+Pjg7YVtiKzE4Pj4wXT1QPj4+MTY7YVtiKzE5Pj4wXT1QPj4+MjQ7YVtiKzIwPj4wXT1RO2FbYisyMT4+MF09UT4+Pjg7YVtiKzIyPj4wXT1RPj4+MTY7YVtiKzIzPj4wXT1RPj4+MjQ7YVtiKzI0Pj4wXT1SO2FbYisyNT4+MF09Uj4+Pjg7YVtiKzI2Pj4wXT1SPj4+MTY7YVtiKzI3Pj4wXT1SPj4+MjQ7YVtiKzI4Pj4wXT1TO2FbYisyOT4+MF09Uz4+Pjg7YVtiKzMwPj4wXT1TPj4+MTY7YVtiKzMxPj4wXT1TPj4+MjQ7YVtiKzMyPj4wXT1UO2FbYiszMz4+MF09VD4+Pjg7YVtiKzM0Pj4wXT1UPj4+MTY7YVtiKzM1Pj4wXT1UPj4+MjQ7YVtiKzM2Pj4wXT1VO2FbYiszNz4+MF09VT4+Pjg7YVtiKzM4Pj4wXT1VPj4+MTY7YVtiKzM5Pj4wXT1VPj4+MjQ7YVtiKzQwPj4wXT1WO2FbYis0MT4+MF09Vj4+Pjg7YVtiKzQyPj4wXT1WPj4+MTY7YVtiKzQzPj4wXT1WPj4+MjQ7YVtiKzQ0Pj4wXT1XO2FbYis0NT4+MF09Vz4+Pjg7YVtiKzQ2Pj4wXT1XPj4+MTY7YVtiKzQ3Pj4wXT1XPj4+MjQ7YVtiKzQ4Pj4wXT1YO2FbYis0OT4+MF09WD4+Pjg7YVtiKzUwPj4wXT1YPj4+MTY7YVtiKzUxPj4wXT1YPj4+MjQ7YVtiKzUyPj4wXT1ZO2FbYis1Mz4+MF09WT4+Pjg7YVtiKzU0Pj4wXT1ZPj4+MTY7YVtiKzU1Pj4wXT1ZPj4+MjQ7YVtiKzU2Pj4wXT1aO2FbYis1Nz4+MF09Wj4+Pjg7YVtiKzU4Pj4wXT1aPj4+MTY7YVtiKzU5Pj4wXT1aPj4+MjQ7YVtiKzYwPj4wXT1fO2FbYis2MT4+MF09Xz4+Pjg7YVtiKzYyPj4wXT1fPj4+MTY7YVtiKzYzPj4wXT1fPj4+MjQ7cmV0dXJufWZ1bmN0aW9uIHBiKCl7cmV0dXJuIDE2fWZ1bmN0aW9uIHFiKCl7cmV0dXJuIDY0fWZ1bmN0aW9uIHJiKCl7cmV0dXJuIDMyfWZ1bmN0aW9uIHNiKCl7cmV0dXJuIDE2fWZ1bmN0aW9uIHRiKCl7cmV0dXJuIDY0fWZ1bmN0aW9uIHViKCl7cmV0dXJuIDMyfWZ1bmN0aW9uIHZiKCl7cmV0dXJuIDM4NH1mdW5jdGlvbiB3YihiLGUsZixnLGgsaixrKXtiPWJ8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtqPWp8MDtrPWt8MDt2YXIgbD0wLG09MCxuPTAsbz0wLHA9MCxxPTAscj0wLHM9MCx0PTAsdT0wLHY9MDt2PWk7dD1pPWkrNjMmLTY0O2k9aSs0OTZ8MDtuPXQrMzYwfDA7aWYoKGUrLTF8MCk+Pj4wPjYzfGs+Pj4wPjY0KXt1PS0xO2k9djtyZXR1cm4gdXwwfWlmKGU+Pj4wPj0yNTYpemEoMzI2MDgsMzI2MjgsMTgsMzI2ODApO2lmKGs+Pj4wPj0yNTYpemEoMzI3MDcsMzI2MjgsMTksMzI2ODApO209ayYyNTU7ZG8gaWYoISgoYnwwKT09MHwoZnwwKT09MCYoKGd8MCkhPTB8KGh8MCkhPTApfCgoZSYyNTUpKy0xJjI1NSk+NjMpPyhsPW08PDI0Pj4yND09MCwhKChtJjI1NSk+NjR8KChqfDApIT0wfGwpXjEpKTowKXtpZihsKXtGZCh0fDAsMCwzNTcpfDA7bT10O2NbbT4+Ml09ZSYyNTVeLTIyMjQ0MzI1NjtjW20rND4+Ml09MTc3OTAzMzcwMzttPXQrOHwwO2NbbT4+Ml09LTIwNjcwOTM3MDE7Y1ttKzQ+PjJdPS0xMTUwODMzMDE5O209dCsxNnwwO2NbbT4+Ml09LTIzNzkxNTczO2NbbSs0Pj4yXT0xMDEzOTA0MjQyO209dCsyNHwwO2NbbT4+Ml09MTU5NTc1MDEyOTtjW20rND4+Ml09LTE1MjE0ODY1MzQ7bT10KzMyfDA7Y1ttPj4yXT0tMTM3NzQwMjE1OTtjW20rND4+Ml09MTM1OTg5MzExOTttPXQrNDB8MDtjW20+PjJdPTcyNTUxMTE5OTtjW20rND4+Ml09LTE2OTQxNDQzNzI7bT10KzQ4fDA7Y1ttPj4yXT0tNzk1Nzc3NDk7Y1ttKzQ+PjJdPTUyODczNDYzNTttPXQrNTZ8MDtjW20+PjJdPTMyNzAzMzIwOTtjW20rND4+Ml09MTU0MTQ1OTIyNTttPTB9ZWxzZXtpZigoanwwKT09MHwobSstMSYyNTUpPjYzKXtsPS0xO2JyZWFrfWw9ayYyNTU7RmQodHwwLDAsMzU3KXwwO3M9SGQobHwwLDAsOCl8MDtvPXQ7Y1tvPj4yXT0oc3xlJjI1NSleLTIyMjQ0MzI1NjtjW28rND4+Ml09Q14xNzc5MDMzNzAzO289dCs4fDA7Y1tvPj4yXT0tMjA2NzA5MzcwMTtjW28rND4+Ml09LTExNTA4MzMwMTk7bz10KzE2fDA7Y1tvPj4yXT0tMjM3OTE1NzM7Y1tvKzQ+PjJdPTEwMTM5MDQyNDI7bz10KzI0fDA7Y1tvPj4yXT0xNTk1NzUwMTI5O2Nbbys0Pj4yXT0tMTUyMTQ4NjUzNDtvPXQrMzJ8MDtjW28+PjJdPS0xMzc3NDAyMTU5O2Nbbys0Pj4yXT0xMzU5ODkzMTE5O289dCs0MHwwO2Nbbz4+Ml09NzI1NTExMTk5O2Nbbys0Pj4yXT0tMTY5NDE0NDM3MjtvPXQrNDh8MDtjW28+PjJdPS03OTU3Nzc0OTtjW28rND4+Ml09NTI4NzM0NjM1O289dCs1NnwwO2Nbbz4+Ml09MzI3MDMzMjA5O2Nbbys0Pj4yXT0xNTQxNDU5MjI1O0ZkKG4rbHwwLDAsKG08PDI0Pj4yNDwwPzA6MTI4LWx8MCl8MCl8MDtJZChufDAsanwwLGx8MCl8MDtsPXQrMzUyfDA7bz10Kzk2fDA7bT1vKzEyOHwwO2Rve2Fbbz4+MF09YVtuPj4wXXwwO289bysxfDA7bj1uKzF8MH13aGlsZSgob3wwKTwobXwwKSk7Y1tsPj4yXT0xMjg7bT0xMjh9az10KzM1MnwwO2lmKCEoKGd8MCk9PTAmKGh8MCk9PTApKXtxPXQrOTZ8MDtqPXQrNjR8MDtyPXQrNzJ8MDtzPXQrMjI0fDA7cD1mO3doaWxlKDEpe2Y9MjU2LW18MDtsPXQrOTYrbXwwO2lmKCEoaD4+PjA+MHwoaHwwKT09MCZnPj4+MD5mPj4+MCkpe3U9MTY7YnJlYWt9SWQobHwwLHB8MCxmfDApfDA7Y1trPj4yXT0oY1trPj4yXXwwKStmO209ajtvPWNbbT4+Ml18MDttPWNbbSs0Pj4yXXwwO2w9RGQob3wwLG18MCwxMjgsMCl8MDtuPWo7Y1tuPj4yXT1sO2Nbbis0Pj4yXT1DO249cjtuPURkKChtPj4+MD40Mjk0OTY3Mjk1fChtfDApPT0tMSZvPj4+MD40Mjk0OTY3MTY3KSYxfDAsMCxjW24+PjJdfDAsY1tuKzQ+PjJdfDApfDA7bz1yO2Nbbz4+Ml09bjtjW28rND4+Ml09QztBYih0LHEpO289cTtuPXM7bT1vKzEyOHwwO2Rve2Nbbz4+Ml09Y1tuPj4yXTtvPW8rNHwwO249bis0fDB9d2hpbGUoKG98MCk8KG18MCkpO209KGNbaz4+Ml18MCkrLTEyOHwwO2Nbaz4+Ml09bTtsPUNkKGd8MCxofDAsZnwwLDApfDA7aWYoKGd8MCk9PShmfDApJihofDApPT0wKWJyZWFrO2Vsc2V7cD1wK2Z8MDtoPUM7Zz1sfX1pZigodXwwKT09MTYpe0lkKGx8MCxwfDAsZ3wwKXwwO209RGQoY1trPj4yXXwwLDAsZ3wwLGh8MCl8MDtjW2s+PjJdPW19bD1lJjI1NTtpZihtPj4+MD4xMjgpe3M9ajtlPWNbcz4+Ml18MDtzPWNbcys0Pj4yXXwwO209RGQoZXwwLHN8MCwxMjgsMCl8MDtuPWo7Y1tuPj4yXT1tO2Nbbis0Pj4yXT1DO249dCs3MnwwO209bjttPURkKChzPj4+MD40Mjk0OTY3Mjk1fChzfDApPT0tMSZlPj4+MD40Mjk0OTY3MTY3KSYxfDAsMCxjW20+PjJdfDAsY1ttKzQ+PjJdfDApfDA7ZT1uO2NbZT4+Ml09bTtjW2UrND4+Ml09QztlPXQrOTZ8MDtBYih0LGUpO209KGNbaz4+Ml18MCkrLTEyOHwwO2Nbaz4+Ml09bTtKZChlfDAsdCsyMjR8MCxtfDApfDA7bT1jW2s+PjJdfDB9ZWxzZSB1PTE5fWVsc2V7aj10KzY0fDA7bD1lJjI1NTt1PTE5fWlmKCh1fDApPT0xOSluPXQrNzJ8MDt1PWo7dT1EZChjW3U+PjJdfDAsY1t1KzQ+PjJdfDAsbXwwLDApfDA7cz1DO3I9ajtjW3I+PjJdPXU7Y1tyKzQ+PjJdPXM7cj1uO2U9cjtyPXIrNHwwO3I9RGQoKHM+Pj4wPDB8KHN8MCk9PTAmdT4+PjA8bT4+PjApJjF8MCwwLGRbZT4+MF18ZFtlKzE+PjBdPDw4fGRbZSsyPj4wXTw8MTZ8ZFtlKzM+PjBdPDwyNHwwLGRbcj4+MF18ZFtyKzE+PjBdPDw4fGRbcisyPj4wXTw8MTZ8ZFtyKzM+PjBdPDwyNHwwKXwwO2U9Qzt1PW47cz11O2Fbcz4+MF09cjthW3MrMT4+MF09cj4+ODthW3MrMj4+MF09cj4+MTY7YVtzKzM+PjBdPXI+PjI0O3U9dSs0fDA7YVt1Pj4wXT1lO2FbdSsxPj4wXT1lPj44O2FbdSsyPj4wXT1lPj4xNjthW3UrMz4+MF09ZT4+MjQ7aWYoYVt0KzM1Nj4+MF18MCl7dT10Kzg4fDA7Y1t1Pj4yXT0tMTtjW3UrND4+Ml09LTF9dT10KzgwfDA7Y1t1Pj4yXT0tMTtjW3UrND4+Ml09LTE7RmQodCs5NittfDAsMCwyNTYtbXwwKXwwO0FiKHQsdCs5NnwwKTtJZChifDAsdHwwLGx8MCl8MDtsPTB9ZWxzZSBsPS0xO3doaWxlKDApO3U9bDtpPXY7cmV0dXJuIHV8MH1mdW5jdGlvbiB4YihiLGMsZCxlKXtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDt2YXIgZj0wLGc9MCxoPTAsaj0wLGs9MCxsPTA7aj1pO2Y9aT1pKzYzJi02NDtpPWkrMTI4fDA7aWYoZD4+PjA+NjR8KGUrLTF8MCk+Pj4wPjYzKXtiPS0xO2k9ajtyZXR1cm4gYnwwfWlmKGU+Pj4wPj0yNTYpemEoMzI2MDgsMzI2MjgsNTMsMzI3MjcpO2lmKGQ+Pj4wPj0yNTYpemEoMzI3MDcsMzI2MjgsNTQsMzI3MjcpO2g9ZSYyNTU7aWYoKGN8MCk9PTB8KGR8MCk9PTApe2lmKChoKy0xJjI1NSk+NjMpe2I9LTE7aT1qO3JldHVybiBifDB9RmQoYnwwLDAsMzU3KXwwO2M9ZSYyNTVeLTIyMjQ0MzI1NjtlPWI7ZD1lO2FbZD4+MF09YzthW2QrMT4+MF09Yz4+ODthW2QrMj4+MF09Yz4+MTY7YVtkKzM+PjBdPWM+PjI0O2U9ZSs0fDA7YVtlPj4wXT0xMDM7YVtlKzE+PjBdPTIzMDthW2UrMj4+MF09OTthW2UrMz4+MF09MTA2O2U9Yis4fDA7ZD1lO2FbZD4+MF09LTIwNjcwOTM3MDE7YVtkKzE+PjBdPS0yMDY3MDkzNzAxPj44O2FbZCsyPj4wXT0tMjA2NzA5MzcwMT4+MTY7YVtkKzM+PjBdPS0yMDY3MDkzNzAxPj4yNDtlPWUrNHwwO2FbZT4+MF09LTExNTA4MzMwMTk7YVtlKzE+PjBdPS0xMTUwODMzMDE5Pj44O2FbZSsyPj4wXT0tMTE1MDgzMzAxOT4+MTY7YVtlKzM+PjBdPS0xMTUwODMzMDE5Pj4yNDtlPWIrMTZ8MDtkPWU7YVtkPj4wXT0tMjM3OTE1NzM7YVtkKzE+PjBdPS0yMzc5MTU3Mz4+ODthW2QrMj4+MF09LTIzNzkxNTczPj4xNjthW2QrMz4+MF09LTIzNzkxNTczPj4yNDtlPWUrNHwwO2FbZT4+MF09MTE0O2FbZSsxPj4wXT0yNDM7YVtlKzI+PjBdPTExMDthW2UrMz4+MF09NjA7ZT1iKzI0fDA7ZD1lO2FbZD4+MF09MjQxO2FbZCsxPj4wXT01NDthW2QrMj4+MF09Mjk7YVtkKzM+PjBdPTk1O2U9ZSs0fDA7YVtlPj4wXT0tMTUyMTQ4NjUzNDthW2UrMT4+MF09LTE1MjE0ODY1MzQ+Pjg7YVtlKzI+PjBdPS0xNTIxNDg2NTM0Pj4xNjthW2UrMz4+MF09LTE1MjE0ODY1MzQ+PjI0O2U9YiszMnwwO2Q9ZTthW2Q+PjBdPS0xMzc3NDAyMTU5O2FbZCsxPj4wXT0tMTM3NzQwMjE1OT4+ODthW2QrMj4+MF09LTEzNzc0MDIxNTk+PjE2O2FbZCszPj4wXT0tMTM3NzQwMjE1OT4+MjQ7ZT1lKzR8MDthW2U+PjBdPTEyNzthW2UrMT4+MF09ODI7YVtlKzI+PjBdPTE0O2FbZSszPj4wXT04MTtlPWIrNDB8MDtkPWU7YVtkPj4wXT0zMTthW2QrMT4+MF09MTA4O2FbZCsyPj4wXT02MjthW2QrMz4+MF09NDM7ZT1lKzR8MDthW2U+PjBdPS0xNjk0MTQ0MzcyO2FbZSsxPj4wXT0tMTY5NDE0NDM3Mj4+ODthW2UrMj4+MF09LTE2OTQxNDQzNzI+PjE2O2FbZSszPj4wXT0tMTY5NDE0NDM3Mj4+MjQ7ZT1iKzQ4fDA7ZD1lO2FbZD4+MF09LTc5NTc3NzQ5O2FbZCsxPj4wXT0tNzk1Nzc3NDk+Pjg7YVtkKzI+PjBdPS03OTU3Nzc0OT4+MTY7YVtkKzM+PjBdPS03OTU3Nzc0OT4+MjQ7ZT1lKzR8MDthW2U+PjBdPTE3MTthW2UrMT4+MF09MjE3O2FbZSsyPj4wXT0xMzE7YVtlKzM+PjBdPTMxO2I9Yis1NnwwO2U9YjthW2U+PjBdPTEyMTthW2UrMT4+MF09MzM7YVtlKzI+PjBdPTEyNjthW2UrMz4+MF09MTk7Yj1iKzR8MDthW2I+PjBdPTI1O2FbYisxPj4wXT0yMDU7YVtiKzI+PjBdPTIyNDthW2IrMz4+MF09OTE7Yj0wO2k9ajtyZXR1cm4gYnwwfWVsc2V7Zz1kJjI1NTtpZigoaCstMSYyNTUpPjYzfChnKy0xJjI1NSk+NjMpe2I9LTE7aT1qO3JldHVybiBifDB9aD1kJjI1NTtGZChifDAsMCwzNTcpfDA7bD1IZChofDAsMCw4KXwwO2w9KGx8ZSYyNTUpXi0yMjI0NDMyNTY7ZD1DXjE3NzkwMzM3MDM7ZT1iO2s9ZTthW2s+PjBdPWw7YVtrKzE+PjBdPWw+Pjg7YVtrKzI+PjBdPWw+PjE2O2FbayszPj4wXT1sPj4yNDtlPWUrNHwwO2FbZT4+MF09ZDthW2UrMT4+MF09ZD4+ODthW2UrMj4+MF09ZD4+MTY7YVtlKzM+PjBdPWQ+PjI0O2U9Yis4fDA7ZD1lO2FbZD4+MF09LTIwNjcwOTM3MDE7YVtkKzE+PjBdPS0yMDY3MDkzNzAxPj44O2FbZCsyPj4wXT0tMjA2NzA5MzcwMT4+MTY7YVtkKzM+PjBdPS0yMDY3MDkzNzAxPj4yNDtlPWUrNHwwO2FbZT4+MF09LTExNTA4MzMwMTk7YVtlKzE+PjBdPS0xMTUwODMzMDE5Pj44O2FbZSsyPj4wXT0tMTE1MDgzMzAxOT4+MTY7YVtlKzM+PjBdPS0xMTUwODMzMDE5Pj4yNDtlPWIrMTZ8MDtkPWU7YVtkPj4wXT0tMjM3OTE1NzM7YVtkKzE+PjBdPS0yMzc5MTU3Mz4+ODthW2QrMj4+MF09LTIzNzkxNTczPj4xNjthW2QrMz4+MF09LTIzNzkxNTczPj4yNDtlPWUrNHwwO2FbZT4+MF09MTE0O2FbZSsxPj4wXT0yNDM7YVtlKzI+PjBdPTExMDthW2UrMz4+MF09NjA7ZT1iKzI0fDA7ZD1lO2FbZD4+MF09MjQxO2FbZCsxPj4wXT01NDthW2QrMj4+MF09Mjk7YVtkKzM+PjBdPTk1O2U9ZSs0fDA7YVtlPj4wXT0tMTUyMTQ4NjUzNDthW2UrMT4+MF09LTE1MjE0ODY1MzQ+Pjg7YVtlKzI+PjBdPS0xNTIxNDg2NTM0Pj4xNjthW2UrMz4+MF09LTE1MjE0ODY1MzQ+PjI0O2U9YiszMnwwO2Q9ZTthW2Q+PjBdPS0xMzc3NDAyMTU5O2FbZCsxPj4wXT0tMTM3NzQwMjE1OT4+ODthW2QrMj4+MF09LTEzNzc0MDIxNTk+PjE2O2FbZCszPj4wXT0tMTM3NzQwMjE1OT4+MjQ7ZT1lKzR8MDthW2U+PjBdPTEyNzthW2UrMT4+MF09ODI7YVtlKzI+PjBdPTE0O2FbZSszPj4wXT04MTtlPWIrNDB8MDtkPWU7YVtkPj4wXT0zMTthW2QrMT4+MF09MTA4O2FbZCsyPj4wXT02MjthW2QrMz4+MF09NDM7ZT1lKzR8MDthW2U+PjBdPS0xNjk0MTQ0MzcyO2FbZSsxPj4wXT0tMTY5NDE0NDM3Mj4+ODthW2UrMj4+MF09LTE2OTQxNDQzNzI+PjE2O2FbZSszPj4wXT0tMTY5NDE0NDM3Mj4+MjQ7ZT1iKzQ4fDA7ZD1lO2FbZD4+MF09LTc5NTc3NzQ5O2FbZCsxPj4wXT0tNzk1Nzc3NDk+Pjg7YVtkKzI+PjBdPS03OTU3Nzc0OT4+MTY7YVtkKzM+PjBdPS03OTU3Nzc0OT4+MjQ7ZT1lKzR8MDthW2U+PjBdPTE3MTthW2UrMT4+MF09MjE3O2FbZSsyPj4wXT0xMzE7YVtlKzM+PjBdPTMxO2U9Yis1NnwwO2Q9ZTthW2Q+PjBdPTEyMTthW2QrMT4+MF09MzM7YVtkKzI+PjBdPTEyNjthW2QrMz4+MF09MTk7ZT1lKzR8MDthW2U+PjBdPTI1O2FbZSsxPj4wXT0yMDU7YVtlKzI+PjBdPTIyNDthW2UrMz4+MF09OTE7RmQoZitofDAsMCwoZzw8MjQ+PjI0PDA/MDoxMjgtaHwwKXwwKXwwO0lkKGZ8MCxjfDAsaHwwKXwwO2M9YiszNTJ8MDtoPWIrOTZ8MDtnPWgrMTI4fDA7ZG97YVtoPj4wXT1hW2Y+PjBdfDA7aD1oKzF8MDtmPWYrMXwwfXdoaWxlKChofDApPChnfDApKTthW2M+PjBdPTEyODthW2MrMT4+MF09MDthW2MrMj4+MF09MDthW2MrMz4+MF09MDtsPTA7aT1qO3JldHVybiBsfDB9cmV0dXJuIDB9ZnVuY3Rpb24geWIoYixjLGUsZil7Yj1ifDA7Yz1jfDA7ZT1lfDA7Zj1mfDA7dmFyIGc9MCxoPTAsaT0wLGo9MCxrPTAsbD0wLG09MCxuPTAsbz0wLHA9MCxxPTAscj0wLHM9MDtpZigoZXwwKT09MCYoZnwwKT09MClyZXR1cm4gMDtrPWIrMzUyfDA7bD1iKzk2fDA7bT1iKzY0fDA7bj1iKzcyfDA7bz1iKzIyNHwwO2c9ZFtrPj4wXXxkW2srMT4+MF08PDh8ZFtrKzI+PjBdPDwxNnxkW2srMz4+MF08PDI0O2o9ZTt3aGlsZSgxKXtpPTI1Ni1nfDA7ZT1iKzk2K2d8MDtpZighKGY+Pj4wPjB8KGZ8MCk9PTAmaj4+PjA+aT4+PjApKWJyZWFrO0lkKGV8MCxjfDAsaXwwKXwwO2g9KGRbaz4+MF18ZFtrKzE+PjBdPDw4fGRbaysyPj4wXTw8MTZ8ZFtrKzM+PjBdPDwyNCkraXwwO2Fbaz4+MF09aDthW2srMT4+MF09aD4+ODthW2srMj4+MF09aD4+MTY7YVtrKzM+PjBdPWg+PjI0O2g9bTtlPWg7ZT1kW2U+PjBdfGRbZSsxPj4wXTw8OHxkW2UrMj4+MF08PDE2fGRbZSszPj4wXTw8MjQ7aD1oKzR8MDtoPWRbaD4+MF18ZFtoKzE+PjBdPDw4fGRbaCsyPj4wXTw8MTZ8ZFtoKzM+PjBdPDwyNDtzPURkKGV8MCxofDAsMTI4LDApfDA7Zz1DO3E9bTtyPXE7YVtyPj4wXT1zO2FbcisxPj4wXT1zPj44O2FbcisyPj4wXT1zPj4xNjthW3IrMz4+MF09cz4+MjQ7cT1xKzR8MDthW3E+PjBdPWc7YVtxKzE+PjBdPWc+Pjg7YVtxKzI+PjBdPWc+PjE2O2FbcSszPj4wXT1nPj4yNDtxPW47Zz1xO3E9cSs0fDA7cT1EZCgoaD4+PjA+NDI5NDk2NzI5NXwoaHwwKT09LTEmZT4+PjA+NDI5NDk2NzE2NykmMXwwLDAsZFtnPj4wXXxkW2crMT4+MF08PDh8ZFtnKzI+PjBdPDwxNnxkW2crMz4+MF08PDI0fDAsZFtxPj4wXXxkW3ErMT4+MF08PDh8ZFtxKzI+PjBdPDwxNnxkW3ErMz4+MF08PDI0fDApfDA7Zz1DO2U9bjtoPWU7YVtoPj4wXT1xO2FbaCsxPj4wXT1xPj44O2FbaCsyPj4wXT1xPj4xNjthW2grMz4+MF09cT4+MjQ7ZT1lKzR8MDthW2U+PjBdPWc7YVtlKzE+PjBdPWc+Pjg7YVtlKzI+PjBdPWc+PjE2O2FbZSszPj4wXT1nPj4yNDtBYihiLGwpO2U9bDtnPW87aD1lKzEyOHwwO2Rve2FbZT4+MF09YVtnPj4wXXwwO2U9ZSsxfDA7Zz1nKzF8MH13aGlsZSgoZXwwKTwoaHwwKSk7Zz0oZFtrPj4wXXxkW2srMT4+MF08PDh8ZFtrKzI+PjBdPDwxNnxkW2srMz4+MF08PDI0KSstMTI4fDA7YVtrPj4wXT1nO2FbaysxPj4wXT1nPj44O2FbaysyPj4wXT1nPj4xNjthW2srMz4+MF09Zz4+MjQ7ZT1DZChqfDAsZnwwLGl8MCwwKXwwO2lmKChqfDApPT0oaXwwKSYoZnwwKT09MCl7cD02O2JyZWFrfWVsc2V7Yz1jK2l8MDtmPUM7aj1lfX1pZigocHwwKT09NilyZXR1cm4gMDtJZChlfDAsY3wwLGp8MCl8MDtzPURkKGRbaz4+MF18ZFtrKzE+PjBdPDw4fGRbaysyPj4wXTw8MTZ8ZFtrKzM+PjBdPDwyNHwwLDAsanwwLGZ8MCl8MDthW2s+PjBdPXM7YVtrKzE+PjBdPXM+Pjg7YVtrKzI+PjBdPXM+PjE2O2FbayszPj4wXT1zPj4yNDtyZXR1cm4gMH1mdW5jdGlvbiB6YihiLGMsZSl7Yj1ifDA7Yz1jfDA7ZT1lfDA7dmFyIGY9MCxnPTAsaD0wLGk9MCxqPTAsaz0wLGw9MCxtPTA7aWYoZT4+PjA+PTI1Nil6YSgzMjYwOCwzMjYyOCwxMDYsMzI3NTkpO2Y9ZSYyNTU7aWYoIShmPDwyND4+MjQpKXtiPS0xO3JldHVybiBifDB9aWYoKGYmMjU1KT42NCl7Yj0tMTtyZXR1cm4gYnwwfWc9YiszNTJ8MDtmPWRbZz4+MF18ZFtnKzE+PjBdPDw4fGRbZysyPj4wXTw8MTZ8ZFtnKzM+PjBdPDwyNDtpPWIrNjR8MDtpZihmPj4+MD4xMjgpe2s9aTtqPWs7aj1kW2o+PjBdfGRbaisxPj4wXTw8OHxkW2orMj4+MF08PDE2fGRbaiszPj4wXTw8MjQ7az1rKzR8MDtrPWRbaz4+MF18ZFtrKzE+PjBdPDw4fGRbaysyPj4wXTw8MTZ8ZFtrKzM+PjBdPDwyNDttPURkKGp8MCxrfDAsMTI4LDApfDA7bD1DO2g9aTtmPWg7YVtmPj4wXT1tO2FbZisxPj4wXT1tPj44O2FbZisyPj4wXT1tPj4xNjthW2YrMz4+MF09bT4+MjQ7aD1oKzR8MDthW2g+PjBdPWw7YVtoKzE+PjBdPWw+Pjg7YVtoKzI+PjBdPWw+PjE2O2FbaCszPj4wXT1sPj4yNDtoPWIrNzJ8MDtsPWg7Zj1sO2w9bCs0fDA7bD1EZCgoaz4+PjA+NDI5NDk2NzI5NXwoa3wwKT09LTEmaj4+PjA+NDI5NDk2NzE2NykmMXwwLDAsZFtmPj4wXXxkW2YrMT4+MF08PDh8ZFtmKzI+PjBdPDwxNnxkW2YrMz4+MF08PDI0fDAsZFtsPj4wXXxkW2wrMT4+MF08PDh8ZFtsKzI+PjBdPDwxNnxkW2wrMz4+MF08PDI0fDApfDA7Zj1DO2o9aDtrPWo7YVtrPj4wXT1sO2FbaysxPj4wXT1sPj44O2FbaysyPj4wXT1sPj4xNjthW2srMz4+MF09bD4+MjQ7aj1qKzR8MDthW2o+PjBdPWY7YVtqKzE+PjBdPWY+Pjg7YVtqKzI+PjBdPWY+PjE2O2FbaiszPj4wXT1mPj4yNDtqPWIrOTZ8MDtBYihiLGopO2Y9KGRbZz4+MF18ZFtnKzE+PjBdPDw4fGRbZysyPj4wXTw8MTZ8ZFtnKzM+PjBdPDwyNCkrLTEyOHwwO2FbZz4+MF09ZjthW2crMT4+MF09Zj4+ODthW2crMj4+MF09Zj4+MTY7YVtnKzM+PjBdPWY+PjI0O0pkKGp8MCxiKzIyNHwwLGZ8MCl8MDtmPWRbZz4+MF18ZFtnKzE+PjBdPDw4fGRbZysyPj4wXTw8MTZ8ZFtnKzM+PjBdPDwyNH1lbHNlIGg9Yis3MnwwO209aTtrPW07bT1tKzR8MDttPURkKGRbaz4+MF18ZFtrKzE+PjBdPDw4fGRbaysyPj4wXTw8MTZ8ZFtrKzM+PjBdPDwyNHwwLGRbbT4+MF18ZFttKzE+PjBdPDw4fGRbbSsyPj4wXTw8MTZ8ZFttKzM+PjBdPDwyNHwwLGZ8MCwwKXwwO2s9QztqPWk7bD1qO2FbbD4+MF09bTthW2wrMT4+MF09bT4+ODthW2wrMj4+MF09bT4+MTY7YVtsKzM+PjBdPW0+PjI0O2o9ais0fDA7YVtqPj4wXT1rO2FbaisxPj4wXT1rPj44O2FbaisyPj4wXT1rPj4xNjthW2orMz4+MF09az4+MjQ7aj1oO2w9ajtqPWorNHwwO2o9RGQoKGs+Pj4wPDB8KGt8MCk9PTAmbT4+PjA8Zj4+PjApJjF8MCwwLGRbbD4+MF18ZFtsKzE+PjBdPDw4fGRbbCsyPj4wXTw8MTZ8ZFtsKzM+PjBdPDwyNHwwLGRbaj4+MF18ZFtqKzE+PjBdPDw4fGRbaisyPj4wXTw8MTZ8ZFtqKzM+PjBdPDwyNHwwKXwwO2w9QzttPWg7az1tO2Fbaz4+MF09ajthW2srMT4+MF09aj4+ODthW2srMj4+MF09aj4+MTY7YVtrKzM+PjBdPWo+PjI0O209bSs0fDA7YVttPj4wXT1sO2FbbSsxPj4wXT1sPj44O2FbbSsyPj4wXT1sPj4xNjthW20rMz4+MF09bD4+MjQ7aWYoYVtiKzM1Nj4+MF18MCl7bT1iKzg4fDA7bD1tO2FbbD4+MF09LTE7YVtsKzE+PjBdPS0xPj44O2FbbCsyPj4wXT0tMT4+MTY7YVtsKzM+PjBdPS0xPj4yNDttPW0rNHwwO2FbbT4+MF09LTE7YVttKzE+PjBdPS0xPj44O2FbbSsyPj4wXT0tMT4+MTY7YVttKzM+PjBdPS0xPj4yNH1tPWIrODB8MDtsPW07YVtsPj4wXT0tMTthW2wrMT4+MF09LTE+Pjg7YVtsKzI+PjBdPS0xPj4xNjthW2wrMz4+MF09LTE+PjI0O209bSs0fDA7YVttPj4wXT0tMTthW20rMT4+MF09LTE+Pjg7YVttKzI+PjBdPS0xPj4xNjthW20rMz4+MF09LTE+PjI0O0ZkKGIrOTYrZnwwLDAsMjU2LWZ8MCl8MDtBYihiLGIrOTZ8MCk7SWQoY3wwLGJ8MCxlJjI1NXwwKXwwO209MDtyZXR1cm4gbXwwfWZ1bmN0aW9uIEFiKGIsYyl7Yj1ifDA7Yz1jfDA7dmFyIGU9MCxmPTAsZz0wLGg9MCxpPTAsaj0wLGs9MCxsPTAsbT0wLG49MCxvPTAscD0wLHE9MCxyPTAscz0wLHQ9MCx1PTAsdj0wLHc9MCx4PTAseT0wLHo9MCxBPTAsQj0wLEQ9MCxFPTAsRj0wLEc9MCxIPTAsST0wLEo9MCxLPTAsTD0wLE09MCxOPTAsTz0wLFA9MCxRPTAsUj0wLFM9MCxUPTAsVT0wLFY9MCxXPTAsWD0wLFk9MCxaPTAsXz0wLCQ9MCxhYT0wLGJhPTAsY2E9MCxkYT0wLGVhPTAsZmE9MCxnYT0wLGhhPTAsaWE9MCxqYT0wLGthPTAsbGE9MCxtYT0wLG5hPTAsb2E9MCxwYT0wLHFhPTAscmE9MCxzYT0wLHRhPTAsdWE9MCx2YT0wLHdhPTA7UD1jO1I9UDtSPWRbUj4+MF18ZFtSKzE+PjBdPDw4fGRbUisyPj4wXTw8MTZ8ZFtSKzM+PjBdPDwyNDtQPVArNHwwO1A9ZFtQPj4wXXxkW1ArMT4+MF08PDh8ZFtQKzI+PjBdPDwxNnxkW1ArMz4+MF08PDI0O1U9Yys4fDA7Vz1VO1c9ZFtXPj4wXXxkW1crMT4+MF08PDh8ZFtXKzI+PjBdPDwxNnxkW1crMz4+MF08PDI0O1U9VSs0fDA7VT1kW1U+PjBdfGRbVSsxPj4wXTw8OHxkW1UrMj4+MF08PDE2fGRbVSszPj4wXTw8MjQ7eD1jKzE2fDA7dD14O3Q9ZFt0Pj4wXXxkW3QrMT4+MF08PDh8ZFt0KzI+PjBdPDwxNnxkW3QrMz4+MF08PDI0O3g9eCs0fDA7eD1kW3g+PjBdfGRbeCsxPj4wXTw8OHxkW3grMj4+MF08PDE2fGRbeCszPj4wXTw8MjQ7bD1jKzI0fDA7aD1sO2g9ZFtoPj4wXXxkW2grMT4+MF08PDh8ZFtoKzI+PjBdPDwxNnxkW2grMz4+MF08PDI0O2w9bCs0fDA7bD1kW2w+PjBdfGRbbCsxPj4wXTw8OHxkW2wrMj4+MF08PDE2fGRbbCszPj4wXTw8MjQ7JD1jKzMyfDA7cD0kO3A9ZFtwPj4wXXxkW3ArMT4+MF08PDh8ZFtwKzI+PjBdPDwxNnxkW3ArMz4+MF08PDI0OyQ9JCs0fDA7JD1kWyQ+PjBdfGRbJCsxPj4wXTw8OHxkWyQrMj4+MF08PDE2fGRbJCszPj4wXTw8MjQ7Rj1jKzQwfDA7SD1GO0g9ZFtIPj4wXXxkW0grMT4+MF08PDh8ZFtIKzI+PjBdPDwxNnxkW0grMz4+MF08PDI0O0Y9Ris0fDA7Rj1kW0Y+PjBdfGRbRisxPj4wXTw8OHxkW0YrMj4+MF08PDE2fGRbRiszPj4wXTw8MjQ7dT1jKzQ4fDA7cz11O3M9ZFtzPj4wXXxkW3MrMT4+MF08PDh8ZFtzKzI+PjBdPDwxNnxkW3MrMz4+MF08PDI0O3U9dSs0fDA7dT1kW3U+PjBdfGRbdSsxPj4wXTw8OHxkW3UrMj4+MF08PDE2fGRbdSszPj4wXTw8MjQ7cj1jKzU2fDA7bj1yO249ZFtuPj4wXXxkW24rMT4+MF08PDh8ZFtuKzI+PjBdPDwxNnxkW24rMz4+MF08PDI0O3I9cis0fDA7cj1kW3I+PjBdfGRbcisxPj4wXTw8OHxkW3IrMj4+MF08PDE2fGRbciszPj4wXTw8MjQ7aT1jKzY0fDA7Zz1pO2c9ZFtnPj4wXXxkW2crMT4+MF08PDh8ZFtnKzI+PjBdPDwxNnxkW2crMz4+MF08PDI0O2k9aSs0fDA7aT1kW2k+PjBdfGRbaSsxPj4wXTw8OHxkW2krMj4+MF08PDE2fGRbaSszPj4wXTw8MjQ7WT1jKzcyfDA7aj1ZO2o9ZFtqPj4wXXxkW2orMT4+MF08PDh8ZFtqKzI+PjBdPDwxNnxkW2orMz4+MF08PDI0O1k9WSs0fDA7WT1kW1k+PjBdfGRbWSsxPj4wXTw8OHxkW1krMj4+MF08PDE2fGRbWSszPj4wXTw8MjQ7bz1jKzgwfDA7bT1vO209ZFttPj4wXXxkW20rMT4+MF08PDh8ZFttKzI+PjBdPDwxNnxkW20rMz4+MF08PDI0O289bys0fDA7bz1kW28+PjBdfGRbbysxPj4wXTw8OHxkW28rMj4+MF08PDE2fGRbbyszPj4wXTw8MjQ7Sz1jKzg4fDA7TT1LO009ZFtNPj4wXXxkW00rMT4+MF08PDh8ZFtNKzI+PjBdPDwxNnxkW00rMz4+MF08PDI0O0s9Sys0fDA7Sz1kW0s+PjBdfGRbSysxPj4wXTw8OHxkW0srMj4+MF08PDE2fGRbSyszPj4wXTw8MjQ7Zj1jKzk2fDA7ZT1mO2U9ZFtlPj4wXXxkW2UrMT4+MF08PDh8ZFtlKzI+PjBdPDwxNnxkW2UrMz4+MF08PDI0O2Y9Zis0fDA7Zj1kW2Y+PjBdfGRbZisxPj4wXTw8OHxkW2YrMj4+MF08PDE2fGRbZiszPj4wXTw8MjQ7Uz1jKzEwNHwwO0I9UztCPWRbQj4+MF18ZFtCKzE+PjBdPDw4fGRbQisyPj4wXTw8MTZ8ZFtCKzM+PjBdPDwyNDtTPVMrNHwwO1M9ZFtTPj4wXXxkW1MrMT4+MF08PDh8ZFtTKzI+PjBdPDwxNnxkW1MrMz4+MF08PDI0O3NhPWMrMTEyfDA7cmE9c2E7cmE9ZFtyYT4+MF18ZFtyYSsxPj4wXTw8OHxkW3JhKzI+PjBdPDwxNnxkW3JhKzM+PjBdPDwyNDtzYT1zYSs0fDA7c2E9ZFtzYT4+MF18ZFtzYSsxPj4wXTw8OHxkW3NhKzI+PjBdPDwxNnxkW3NhKzM+PjBdPDwyNDtBPWMrMTIwfDA7eT1BO3k9ZFt5Pj4wXXxkW3krMT4+MF08PDh8ZFt5KzI+PjBdPDwxNnxkW3krMz4+MF08PDI0O0E9QSs0fDA7QT1kW0E+PjBdfGRbQSsxPj4wXTw8OHxkW0ErMj4+MF08PDE2fGRbQSszPj4wXTw8MjQ7Y2E9Yjt2PWNhO2NhPWNhKzR8MDtOPWIrOHwwO29hPU47bmE9b2E7bmE9ZFtuYT4+MF18ZFtuYSsxPj4wXTw8OHxkW25hKzI+PjBdPDwxNnxkW25hKzM+PjBdPDwyNDtvYT1vYSs0fDA7b2E9ZFtvYT4+MF18ZFtvYSsxPj4wXTw8OHxkW29hKzI+PjBdPDwxNnxkW29hKzM+PjBdPDwyNDtJPWIrMTZ8MDtrYT1JO2phPWthO2phPWRbamE+PjBdfGRbamErMT4+MF08PDh8ZFtqYSsyPj4wXTw8MTZ8ZFtqYSszPj4wXTw8MjQ7a2E9a2ErNHwwO2thPWRba2E+PjBdfGRba2ErMT4+MF08PDh8ZFtrYSsyPj4wXTw8MTZ8ZFtrYSszPj4wXTw8MjQ7RD1iKzI0fDA7Z2E9RDtmYT1nYTtmYT1kW2ZhPj4wXXxkW2ZhKzE+PjBdPDw4fGRbZmErMj4+MF08PDE2fGRbZmErMz4+MF08PDI0O2dhPWdhKzR8MDtnYT1kW2dhPj4wXXxkW2dhKzE+PjBdPDw4fGRbZ2ErMj4+MF08PDE2fGRbZ2ErMz4+MF08PDI0O3c9YiszMnwwO21hPXc7bGE9bWE7bGE9ZFtsYT4+MF18ZFtsYSsxPj4wXTw8OHxkW2xhKzI+PjBdPDwxNnxkW2xhKzM+PjBdPDwyNDttYT1tYSs0fDA7bWE9ZFttYT4+MF18ZFttYSsxPj4wXTw8OHxkW21hKzI+PjBdPDwxNnxkW21hKzM+PjBdPDwyNDtxPWIrNDB8MDtpYT1xO2hhPWlhO2hhPWRbaGE+PjBdfGRbaGErMT4+MF08PDh8ZFtoYSsyPj4wXTw8MTZ8ZFtoYSszPj4wXTw8MjQ7aWE9aWErNHwwO2lhPWRbaWE+PjBdfGRbaWErMT4+MF08PDh8ZFtpYSsyPj4wXTw8MTZ8ZFtpYSszPj4wXTw8MjQ7az1iKzQ4fDA7dWE9azt0YT11YTt0YT1kW3RhPj4wXXxkW3RhKzE+PjBdPDw4fGRbdGErMj4+MF08PDE2fGRbdGErMz4+MF08PDI0O3VhPXVhKzR8MDt1YT1kW3VhPj4wXXxkW3VhKzE+PjBdPDw4fGRbdWErMj4+MF08PDE2fGRbdWErMz4+MF08PDI0O2M9Yis1NnwwO3FhPWM7cGE9cWE7cGE9ZFtwYT4+MF18ZFtwYSsxPj4wXTw8OHxkW3BhKzI+PjBdPDwxNnxkW3BhKzM+PjBdPDwyNDtxYT1xYSs0fDA7cWE9ZFtxYT4+MF18ZFtxYSsxPj4wXTw8OHxkW3FhKzI+PjBdPDwxNnxkW3FhKzM+PjBdPDwyNDtiYT1iKzY0fDA7YWE9YmE7YmE9YmErNHwwO2FhPShkW2FhPj4wXXxkW2FhKzE+PjBdPDw4fGRbYWErMj4+MF08PDE2fGRbYWErMz4+MF08PDI0KV4tMTM3NzQwMjE1OTtiYT0oZFtiYT4+MF18ZFtiYSsxPj4wXTw8OHxkW2JhKzI+PjBdPDwxNnxkW2JhKzM+PjBdPDwyNCleMTM1OTg5MzExOTtfPWIrNzJ8MDtaPV87Xz1fKzR8MDtaPShkW1o+PjBdfGRbWisxPj4wXTw8OHxkW1orMj4+MF08PDE2fGRbWiszPj4wXTw8MjQpXjcyNTUxMTE5OTtfPShkW18+PjBdfGRbXysxPj4wXTw8OHxkW18rMj4+MF08PDE2fGRbXyszPj4wXTw8MjQpXi0xNjk0MTQ0MzcyO1g9Yis4MHwwO1Y9WDtYPVgrNHwwO1Y9KGRbVj4+MF18ZFtWKzE+PjBdPDw4fGRbVisyPj4wXTw8MTZ8ZFtWKzM+PjBdPDwyNCleLTc5NTc3NzQ5O1g9KGRbWD4+MF18ZFtYKzE+PjBdPDw4fGRbWCsyPj4wXTw8MTZ8ZFtYKzM+PjBdPDwyNCleNTI4NzM0NjM1O2VhPWIrODh8MDtkYT1lYTtlYT1lYSs0fDA7ZGE9KGRbZGE+PjBdfGRbZGErMT4+MF08PDh8ZFtkYSsyPj4wXTw8MTZ8ZFtkYSszPj4wXTw8MjQpXjMyNzAzMzIwOTtlYT0oZFtlYT4+MF18ZFtlYSsxPj4wXTw8OHxkW2VhKzI+PjBdPDwxNnxkW2VhKzM+PjBdPDwyNCleMTU0MTQ1OTIyNTtjYT1EZChsYXwwLG1hfDAsZFt2Pj4wXXxkW3YrMT4+MF08PDh8ZFt2KzI+PjBdPDwxNnxkW3YrMz4+MF08PDI0fDAsZFtjYT4+MF18ZFtjYSsxPj4wXTw8OHxkW2NhKzI+PjBdPDwxNnxkW2NhKzM+PjBdPDwyNHwwKXwwO2NhPURkKGNhfDAsQ3wwLFJ8MCxQfDApfDA7dj1DO2FhPWFhXmNhO2JhPWJhXnY7UT1EZChiYXwwLGFhfDAsLTIwNTczMTU3NiwxNzc5MDMzNzAzKXwwO1Q9QztsYT1RXmxhO21hPVRebWE7Tz1HZChsYXwwLG1hfDAsMjQpfDA7TD1DO21hPUhkKGxhfDAsbWF8MCw0MCl8MDtPPW1hfE87TD1DfEw7dj1EZChXfDAsVXwwLGNhfDAsdnwwKXwwO3Y9RGQodnwwLEN8MCxPfDAsTHwwKXwwO2NhPUM7YmE9dl5iYTthYT1jYV5hYTttYT1HZChiYXwwLGFhfDAsMTYpfDA7bGE9QzthYT1IZChiYXwwLGFhfDAsNDgpfDA7bWE9YWF8bWE7bGE9Q3xsYTtUPURkKG1hfDAsbGF8MCxRfDAsVHwwKXwwO1E9QztPPVReTztMPVFeTDthYT1HZChPfDAsTHwwLDYzKXwwO2JhPUM7TD1IZChPfDAsTHwwLDEpfDA7YWE9THxhYTtiYT1DfGJhO29hPURkKGhhfDAsaWF8MCxuYXwwLG9hfDApfDA7b2E9RGQob2F8MCxDfDAsdHwwLHh8MCl8MDtuYT1DO1o9Wl5vYTtfPV9ebmE7TD1EZChffDAsWnwwLC0yMDY3MDkzNzAxLC0xMTUwODMzMDE5KXwwO089QztoYT1MXmhhO2lhPU9eaWE7Sj1HZChoYXwwLGlhfDAsMjQpfDA7Rz1DO2lhPUhkKGhhfDAsaWF8MCw0MCl8MDtKPWlhfEo7Rz1DfEc7bmE9RGQoaHwwLGx8MCxvYXwwLG5hfDApfDA7bmE9RGQobmF8MCxDfDAsSnwwLEd8MCl8MDtvYT1DO189bmFeXztaPW9hXlo7aWE9R2QoX3wwLFp8MCwxNil8MDtoYT1DO1o9SGQoX3wwLFp8MCw0OCl8MDtpYT1afGlhO2hhPUN8aGE7Tz1EZChpYXwwLGhhfDAsTHwwLE98MCl8MDtMPUM7Sj1PXko7Rz1MXkc7Wj1HZChKfDAsR3wwLDYzKXwwO189QztHPUhkKEp8MCxHfDAsMSl8MDtaPUd8WjtfPUN8XztrYT1EZCh0YXwwLHVhfDAsamF8MCxrYXwwKXwwO2thPURkKGthfDAsQ3wwLHB8MCwkfDApfDA7amE9QztWPVZea2E7WD1YXmphO0c9RGQoWHwwLFZ8MCwtMjM3OTE1NzMsMTAxMzkwNDI0Mil8MDtKPUM7dGE9R150YTt1YT1KXnVhO0U9R2QodGF8MCx1YXwwLDI0KXwwO3o9Qzt1YT1IZCh0YXwwLHVhfDAsNDApfDA7RT11YXxFO3o9Q3x6O2phPURkKEh8MCxGfDAsa2F8MCxqYXwwKXwwO2phPURkKGphfDAsQ3wwLEV8MCx6fDApfDA7a2E9QztYPWphXlg7Vj1rYV5WO3VhPUdkKFh8MCxWfDAsMTYpfDA7dGE9QztWPUhkKFh8MCxWfDAsNDgpfDA7dWE9Vnx1YTt0YT1DfHRhO0o9RGQodWF8MCx0YXwwLEd8MCxKfDApfDA7Rz1DO0U9Sl5FO3o9R156O1Y9R2QoRXwwLHp8MCw2Myl8MDtYPUM7ej1IZChFfDAsenwwLDEpfDA7Vj16fFY7WD1DfFg7Z2E9RGQocGF8MCxxYXwwLGZhfDAsZ2F8MCl8MDtnYT1EZChnYXwwLEN8MCxzfDAsdXwwKXwwO2ZhPUM7ZGE9ZGFeZ2E7ZWE9ZWFeZmE7ej1EZChlYXwwLGRhfDAsMTU5NTc1MDEyOSwtMTUyMTQ4NjUzNCl8MDtFPUM7cGE9el5wYTtxYT1FXnFhO3dhPUdkKHBhfDAscWF8MCwyNCl8MDt2YT1DO3FhPUhkKHBhfDAscWF8MCw0MCl8MDt3YT1xYXx3YTt2YT1DfHZhO2ZhPURkKG58MCxyfDAsZ2F8MCxmYXwwKXwwO2ZhPURkKGZhfDAsQ3wwLHdhfDAsdmF8MCl8MDtnYT1DO2VhPWZhXmVhO2RhPWdhXmRhO3FhPUdkKGVhfDAsZGF8MCwxNil8MDtwYT1DO2RhPUhkKGVhfDAsZGF8MCw0OCl8MDtxYT1kYXxxYTtwYT1DfHBhO0U9RGQocWF8MCxwYXwwLHp8MCxFfDApfDA7ej1DO3dhPUVed2E7dmE9el52YTtkYT1HZCh3YXwwLHZhfDAsNjMpfDA7ZWE9Qzt2YT1IZCh3YXwwLHZhfDAsMSl8MDtkYT12YXxkYTtlYT1DfGVhO2NhPURkKFp8MCxffDAsdnwwLGNhfDApfDA7Y2E9RGQoY2F8MCxDfDAsZ3wwLGl8MCl8MDt2PUM7cWE9cWFeY2E7cGE9cGFedjtHPURkKHBhfDAscWF8MCxKfDAsR3wwKXwwO0o9QztaPUdeWjtfPUpeXzt2YT1HZChafDAsX3wwLDI0KXwwO3dhPUM7Xz1IZChafDAsX3wwLDQwKXwwO3ZhPV98dmE7d2E9Q3x3YTt2PURkKGp8MCxZfDAsY2F8MCx2fDApfDA7dj1EZCh2fDAsQ3wwLHZhfDAsd2F8MCl8MDtjYT1DO3BhPXZecGE7cWE9Y2FecWE7Xz1HZChwYXwwLHFhfDAsMTYpfDA7Wj1DO3FhPUhkKHBhfDAscWF8MCw0OCl8MDtfPXFhfF87Wj1DfFo7Sj1EZChffDAsWnwwLEd8MCxKfDApfDA7Rz1DO3ZhPUpedmE7d2E9R153YTtxYT1HZCh2YXwwLHdhfDAsNjMpfDA7cGE9Qzt3YT1IZCh2YXwwLHdhfDAsMSl8MDtxYT13YXxxYTtwYT1DfHBhO29hPURkKFZ8MCxYfDAsbmF8MCxvYXwwKXwwO29hPURkKG9hfDAsQ3wwLG18MCxvfDApfDA7bmE9QzttYT1tYV5vYTtsYT1sYV5uYTt6PURkKGxhfDAsbWF8MCxFfDAsenwwKXwwO0U9QztWPXpeVjtYPUVeWDt3YT1HZChWfDAsWHwwLDI0KXwwO3ZhPUM7WD1IZChWfDAsWHwwLDQwKXwwO3dhPVh8d2E7dmE9Q3x2YTtuYT1EZChNfDAsS3wwLG9hfDAsbmF8MCl8MDtuYT1EZChuYXwwLEN8MCx3YXwwLHZhfDApfDA7b2E9QztsYT1uYV5sYTttYT1vYV5tYTtYPUdkKGxhfDAsbWF8MCwxNil8MDtWPUM7bWE9SGQobGF8MCxtYXwwLDQ4KXwwO1g9bWF8WDtWPUN8VjtFPURkKFh8MCxWfDAsenwwLEV8MCl8MDt6PUM7d2E9RV53YTt2YT16XnZhO21hPUdkKHdhfDAsdmF8MCw2Myl8MDtsYT1DO3ZhPUhkKHdhfDAsdmF8MCwxKXwwO21hPXZhfG1hO2xhPUN8bGE7a2E9RGQoZGF8MCxlYXwwLGphfDAsa2F8MCl8MDtrYT1EZChrYXwwLEN8MCxlfDAsZnwwKXwwO2phPUM7aWE9aWFea2E7aGE9aGFeamE7UT1EZChoYXwwLGlhfDAsVHwwLFF8MCl8MDtUPUM7ZGE9UV5kYTtlYT1UXmVhO3ZhPUdkKGRhfDAsZWF8MCwyNCl8MDt3YT1DO2VhPUhkKGRhfDAsZWF8MCw0MCl8MDt2YT1lYXx2YTt3YT1DfHdhO2phPURkKEJ8MCxTfDAsa2F8MCxqYXwwKXwwO2phPURkKGphfDAsQ3wwLHZhfDAsd2F8MCl8MDtrYT1DO2hhPWphXmhhO2lhPWthXmlhO2VhPUdkKGhhfDAsaWF8MCwxNil8MDtkYT1DO2lhPUhkKGhhfDAsaWF8MCw0OCl8MDtlYT1pYXxlYTtkYT1DfGRhO1Q9RGQoZWF8MCxkYXwwLFF8MCxUfDApfDA7UT1DO3ZhPVRedmE7d2E9UV53YTtpYT1HZCh2YXwwLHdhfDAsNjMpfDA7aGE9Qzt3YT1IZCh2YXwwLHdhfDAsMSl8MDtpYT13YXxpYTtoYT1DfGhhO2dhPURkKGFhfDAsYmF8MCxmYXwwLGdhfDApfDA7Z2E9RGQoZ2F8MCxDfDAscmF8MCxzYXwwKXwwO2ZhPUM7dWE9dWFeZ2E7dGE9dGFeZmE7TD1EZCh0YXwwLHVhfDAsT3wwLEx8MCl8MDtPPUM7YWE9TF5hYTtiYT1PXmJhO3dhPUdkKGFhfDAsYmF8MCwyNCl8MDt2YT1DO2JhPUhkKGFhfDAsYmF8MCw0MCl8MDt3YT1iYXx3YTt2YT1DfHZhO2ZhPURkKHl8MCxBfDAsZ2F8MCxmYXwwKXwwO2ZhPURkKGZhfDAsQ3wwLHdhfDAsdmF8MCl8MDtnYT1DO3RhPWZhXnRhO3VhPWdhXnVhO2JhPUdkKHRhfDAsdWF8MCwxNil8MDthYT1DO3VhPUhkKHRhfDAsdWF8MCw0OCl8MDtiYT11YXxiYTthYT1DfGFhO089RGQoYmF8MCxhYXwwLEx8MCxPfDApfDA7TD1DO3dhPU9ed2E7dmE9TF52YTt1YT1HZCh3YXwwLHZhfDAsNjMpfDA7dGE9Qzt2YT1IZCh3YXwwLHZhfDAsMSl8MDt1YT12YXx1YTt0YT1DfHRhO2NhPURkKHJhfDAsc2F8MCx2fDAsY2F8MCl8MDtjYT1EZChjYXwwLEN8MCx1YXwwLHRhfDApfDA7dj1DO1g9Y2FeWDtWPXZeVjtRPURkKFZ8MCxYfDAsVHwwLFF8MCl8MDtUPUM7dWE9UV51YTt0YT1UXnRhO3ZhPUdkKHVhfDAsdGF8MCwyNCl8MDt3YT1DO3RhPUhkKHVhfDAsdGF8MCw0MCl8MDt2YT10YXx2YTt3YT1DfHdhO3Y9RGQobXwwLG98MCxjYXwwLHZ8MCl8MDt2PURkKHZ8MCxDfDAsdmF8MCx3YXwwKXwwO2NhPUM7Vj12XlY7WD1jYV5YO3RhPUdkKFZ8MCxYfDAsMTYpfDA7dWE9QztYPUhkKFZ8MCxYfDAsNDgpfDA7dGE9WHx0YTt1YT1DfHVhO1Q9RGQodGF8MCx1YXwwLFF8MCxUfDApfDA7UT1DO3ZhPVRedmE7d2E9UV53YTtYPUdkKHZhfDAsd2F8MCw2Myl8MDtWPUM7d2E9SGQodmF8MCx3YXwwLDEpfDA7WD13YXxYO1Y9Q3xWO29hPURkKHFhfDAscGF8MCxuYXwwLG9hfDApfDA7b2E9RGQob2F8MCxDfDAscHwwLCR8MCl8MDtuYT1DO2VhPWVhXm9hO2RhPWRhXm5hO0w9RGQoZGF8MCxlYXwwLE98MCxMfDApfDA7Tz1DO3FhPUxecWE7cGE9T15wYTt3YT1HZChxYXwwLHBhfDAsMjQpfDA7dmE9QztwYT1IZChxYXwwLHBhfDAsNDApfDA7d2E9cGF8d2E7dmE9Q3x2YTtuYT1EZChnfDAsaXwwLG9hfDAsbmF8MCl8MDtuYT1EZChuYXwwLEN8MCx3YXwwLHZhfDApfDA7b2E9QztkYT1uYV5kYTtlYT1vYV5lYTtwYT1HZChkYXwwLGVhfDAsMTYpfDA7cWE9QztlYT1IZChkYXwwLGVhfDAsNDgpfDA7cGE9ZWF8cGE7cWE9Q3xxYTtPPURkKHBhfDAscWF8MCxMfDAsT3wwKXwwO0w9Qzt3YT1PXndhO3ZhPUxedmE7ZWE9R2Qod2F8MCx2YXwwLDYzKXwwO2RhPUM7dmE9SGQod2F8MCx2YXwwLDEpfDA7ZWE9dmF8ZWE7ZGE9Q3xkYTtrYT1EZChtYXwwLGxhfDAsamF8MCxrYXwwKXwwO2thPURkKGthfDAsQ3wwLGp8MCxZfDApfDA7amE9QztiYT1iYV5rYTthYT1hYV5qYTtHPURkKGFhfDAsYmF8MCxKfDAsR3wwKXwwO0o9QzttYT1HXm1hO2xhPUpebGE7dmE9R2QobWF8MCxsYXwwLDI0KXwwO3dhPUM7bGE9SGQobWF8MCxsYXwwLDQwKXwwO3ZhPWxhfHZhO3dhPUN8d2E7amE9RGQoeXwwLEF8MCxrYXwwLGphfDApfDA7amE9RGQoamF8MCxDfDAsdmF8MCx3YXwwKXwwO2thPUM7YWE9amFeYWE7YmE9a2FeYmE7bGE9R2QoYWF8MCxiYXwwLDE2KXwwO21hPUM7YmE9SGQoYWF8MCxiYXwwLDQ4KXwwO2xhPWJhfGxhO21hPUN8bWE7Sj1EZChsYXwwLG1hfDAsR3wwLEp8MCl8MDtHPUM7dmE9Sl52YTt3YT1HXndhO2JhPUdkKHZhfDAsd2F8MCw2Myl8MDthYT1DO3dhPUhkKHZhfDAsd2F8MCwxKXwwO2JhPXdhfGJhO2FhPUN8YWE7Z2E9RGQoaWF8MCxoYXwwLGZhfDAsZ2F8MCl8MDtnYT1EZChnYXwwLEN8MCxCfDAsU3wwKXwwO2ZhPUM7Xz1fXmdhO1o9Wl5mYTt6PURkKFp8MCxffDAsRXwwLHp8MCl8MDtFPUM7aWE9el5pYTtoYT1FXmhhO3dhPUdkKGlhfDAsaGF8MCwyNCl8MDt2YT1DO2hhPUhkKGlhfDAsaGF8MCw0MCl8MDt3YT1oYXx3YTt2YT1DfHZhO2ZhPURkKHN8MCx1fDAsZ2F8MCxmYXwwKXwwO2ZhPURkKGZhfDAsQ3wwLHdhfDAsdmF8MCl8MDtnYT1DO1o9ZmFeWjtfPWdhXl87aGE9R2QoWnwwLF98MCwxNil8MDtpYT1DO189SGQoWnwwLF98MCw0OCl8MDtoYT1ffGhhO2lhPUN8aWE7RT1EZChoYXwwLGlhfDAsenwwLEV8MCl8MDt6PUM7d2E9RV53YTt2YT16XnZhO189R2Qod2F8MCx2YXwwLDYzKXwwO1o9Qzt2YT1IZCh3YXwwLHZhfDAsMSl8MDtfPXZhfF87Wj1DfFo7Y2E9RGQoZWF8MCxkYXwwLHZ8MCxjYXwwKXwwO2NhPURkKGNhfDAsQ3wwLFd8MCxVfDApfDA7dj1DO2hhPWhhXmNhO2lhPWlhXnY7Rz1EZChpYXwwLGhhfDAsSnwwLEd8MCl8MDtKPUM7ZWE9R15lYTtkYT1KXmRhO3ZhPUdkKGVhfDAsZGF8MCwyNCl8MDt3YT1DO2RhPUhkKGVhfDAsZGF8MCw0MCl8MDt2YT1kYXx2YTt3YT1DfHdhO3Y9RGQoZXwwLGZ8MCxjYXwwLHZ8MCl8MDt2PURkKHZ8MCxDfDAsdmF8MCx3YXwwKXwwO2NhPUM7aWE9dl5pYTtoYT1jYV5oYTtkYT1HZChpYXwwLGhhfDAsMTYpfDA7ZWE9QztoYT1IZChpYXwwLGhhfDAsNDgpfDA7ZGE9aGF8ZGE7ZWE9Q3xlYTtKPURkKGRhfDAsZWF8MCxHfDAsSnwwKXwwO0c9Qzt2YT1KXnZhO3dhPUded2E7aGE9R2QodmF8MCx3YXwwLDYzKXwwO2lhPUM7d2E9SGQodmF8MCx3YXwwLDEpfDA7aGE9d2F8aGE7aWE9Q3xpYTtvYT1EZChiYXwwLGFhfDAsbmF8MCxvYXwwKXwwO29hPURkKG9hfDAsQ3wwLFJ8MCxQfDApfDA7bmE9Qzt0YT10YV5vYTt1YT11YV5uYTt6PURkKHVhfDAsdGF8MCxFfDAsenwwKXwwO0U9QztiYT16XmJhO2FhPUVeYWE7d2E9R2QoYmF8MCxhYXwwLDI0KXwwO3ZhPUM7YWE9SGQoYmF8MCxhYXwwLDQwKXwwO3dhPWFhfHdhO3ZhPUN8dmE7bmE9RGQodHwwLHh8MCxvYXwwLG5hfDApfDA7bmE9RGQobmF8MCxDfDAsd2F8MCx2YXwwKXwwO29hPUM7dWE9bmFedWE7dGE9b2FedGE7YWE9R2QodWF8MCx0YXwwLDE2KXwwO2JhPUM7dGE9SGQodWF8MCx0YXwwLDQ4KXwwO2FhPXRhfGFhO2JhPUN8YmE7RT1EZChhYXwwLGJhfDAsenwwLEV8MCl8MDt6PUM7d2E9RV53YTt2YT16XnZhO3RhPUdkKHdhfDAsdmF8MCw2Myl8MDt1YT1DO3ZhPUhkKHdhfDAsdmF8MCwxKXwwO3RhPXZhfHRhO3VhPUN8dWE7a2E9RGQoX3wwLFp8MCxqYXwwLGthfDApfDA7a2E9RGQoa2F8MCxDfDAsTXwwLEt8MCl8MDtqYT1DO3BhPXBhXmthO3FhPXFhXmphO1E9RGQocWF8MCxwYXwwLFR8MCxRfDApfDA7VD1DO189UV5fO1o9VF5aO3ZhPUdkKF98MCxafDAsMjQpfDA7d2E9QztaPUhkKF98MCxafDAsNDApfDA7dmE9Wnx2YTt3YT1DfHdhO2phPURkKG58MCxyfDAsa2F8MCxqYXwwKXwwO2phPURkKGphfDAsQ3wwLHZhfDAsd2F8MCl8MDtrYT1DO3FhPWphXnFhO3BhPWthXnBhO1o9R2QocWF8MCxwYXwwLDE2KXwwO189QztwYT1IZChxYXwwLHBhfDAsNDgpfDA7Wj1wYXxaO189Q3xfO1Q9RGQoWnwwLF98MCxRfDAsVHwwKXwwO1E9Qzt2YT1UXnZhO3dhPVFed2E7cGE9R2QodmF8MCx3YXwwLDYzKXwwO3FhPUM7d2E9SGQodmF8MCx3YXwwLDEpfDA7cGE9d2F8cGE7cWE9Q3xxYTtnYT1EZChYfDAsVnwwLGZhfDAsZ2F8MCl8MDtnYT1EZChnYXwwLEN8MCxIfDAsRnwwKXwwO2ZhPUM7bGE9bGFeZ2E7bWE9bWFeZmE7TD1EZChtYXwwLGxhfDAsT3wwLEx8MCl8MDtPPUM7WD1MXlg7Vj1PXlY7d2E9R2QoWHwwLFZ8MCwyNCl8MDt2YT1DO1Y9SGQoWHwwLFZ8MCw0MCl8MDt3YT1WfHdhO3ZhPUN8dmE7ZmE9RGQoaHwwLGx8MCxnYXwwLGZhfDApfDA7ZmE9RGQoZmF8MCxDfDAsd2F8MCx2YXwwKXwwO2dhPUM7bWE9ZmFebWE7bGE9Z2FebGE7Vj1HZChtYXwwLGxhfDAsMTYpfDA7WD1DO2xhPUhkKG1hfDAsbGF8MCw0OCl8MDtWPWxhfFY7WD1DfFg7Tz1EZChWfDAsWHwwLEx8MCxPfDApfDA7TD1DO3dhPU9ed2E7dmE9TF52YTtsYT1HZCh3YXwwLHZhfDAsNjMpfDA7bWE9Qzt2YT1IZCh3YXwwLHZhfDAsMSl8MDtsYT12YXxsYTttYT1DfG1hO2NhPURkKE18MCxLfDAsdnwwLGNhfDApfDA7Y2E9RGQoY2F8MCxDfDAsbGF8MCxtYXwwKXwwO3Y9QzthYT1jYV5hYTtiYT12XmJhO1E9RGQoYmF8MCxhYXwwLFR8MCxRfDApfDA7VD1DO2xhPVFebGE7bWE9VF5tYTt2YT1HZChsYXwwLG1hfDAsMjQpfDA7d2E9QzttYT1IZChsYXwwLG1hfDAsNDApfDA7dmE9bWF8dmE7d2E9Q3x3YTt2PURkKGd8MCxpfDAsY2F8MCx2fDApfDA7dj1EZCh2fDAsQ3wwLHZhfDAsd2F8MCl8MDtjYT1DO2JhPXZeYmE7YWE9Y2FeYWE7bWE9R2QoYmF8MCxhYXwwLDE2KXwwO2xhPUM7YWE9SGQoYmF8MCxhYXwwLDQ4KXwwO21hPWFhfG1hO2xhPUN8bGE7VD1EZChtYXwwLGxhfDAsUXwwLFR8MCl8MDtRPUM7dmE9VF52YTt3YT1RXndhO2FhPUdkKHZhfDAsd2F8MCw2Myl8MDtiYT1DO3dhPUhkKHZhfDAsd2F8MCwxKXwwO2FhPXdhfGFhO2JhPUN8YmE7b2E9RGQoaGF8MCxpYXwwLG5hfDAsb2F8MCl8MDtvYT1EZChvYXwwLEN8MCxlfDAsZnwwKXwwO25hPUM7Wj1aXm9hO189X15uYTtMPURkKF98MCxafDAsT3wwLEx8MCl8MDtPPUM7aGE9TF5oYTtpYT1PXmlhO3dhPUdkKGhhfDAsaWF8MCwyNCl8MDt2YT1DO2lhPUhkKGhhfDAsaWF8MCw0MCl8MDt3YT1pYXx3YTt2YT1DfHZhO25hPURkKFJ8MCxQfDAsb2F8MCxuYXwwKXwwO25hPURkKG5hfDAsQ3wwLHdhfDAsdmF8MCl8MDtvYT1DO189bmFeXztaPW9hXlo7aWE9R2QoX3wwLFp8MCwxNil8MDtoYT1DO1o9SGQoX3wwLFp8MCw0OCl8MDtpYT1afGlhO2hhPUN8aGE7Tz1EZChpYXwwLGhhfDAsTHwwLE98MCl8MDtMPUM7d2E9T153YTt2YT1MXnZhO1o9R2Qod2F8MCx2YXwwLDYzKXwwO189Qzt2YT1IZCh3YXwwLHZhfDAsMSl8MDtaPXZhfFo7Xz1DfF87a2E9RGQodGF8MCx1YXwwLGphfDAsa2F8MCl8MDtrYT1EZChrYXwwLEN8MCxIfDAsRnwwKXwwO2phPUM7Vj1WXmthO1g9WF5qYTtHPURkKFh8MCxWfDAsSnwwLEd8MCl8MDtKPUM7dGE9R150YTt1YT1KXnVhO3ZhPUdkKHRhfDAsdWF8MCwyNCl8MDt3YT1DO3VhPUhkKHRhfDAsdWF8MCw0MCl8MDt2YT11YXx2YTt3YT1DfHdhO2phPURkKHR8MCx4fDAsa2F8MCxqYXwwKXwwO2phPURkKGphfDAsQ3wwLHZhfDAsd2F8MCl8MDtrYT1DO1g9amFeWDtWPWthXlY7dWE9R2QoWHwwLFZ8MCwxNil8MDt0YT1DO1Y9SGQoWHwwLFZ8MCw0OCl8MDt1YT1WfHVhO3RhPUN8dGE7Sj1EZCh1YXwwLHRhfDAsR3wwLEp8MCl8MDtHPUM7dmE9Sl52YTt3YT1HXndhO1Y9R2QodmF8MCx3YXwwLDYzKXwwO1g9Qzt3YT1IZCh2YXwwLHdhfDAsMSl8MDtWPXdhfFY7WD1DfFg7Z2E9RGQocGF8MCxxYXwwLGZhfDAsZ2F8MCl8MDtnYT1EZChnYXwwLEN8MCx5fDAsQXwwKXwwO2ZhPUM7ZGE9ZGFeZ2E7ZWE9ZWFeZmE7ej1EZChlYXwwLGRhfDAsRXwwLHp8MCl8MDtFPUM7cGE9el5wYTtxYT1FXnFhO3dhPUdkKHBhfDAscWF8MCwyNCl8MDt2YT1DO3FhPUhkKHBhfDAscWF8MCw0MCl8MDt3YT1xYXx3YTt2YT1DfHZhO2ZhPURkKEJ8MCxTfDAsZ2F8MCxmYXwwKXwwO2ZhPURkKGZhfDAsQ3wwLHdhfDAsdmF8MCl8MDtnYT1DO2VhPWZhXmVhO2RhPWdhXmRhO3FhPUdkKGVhfDAsZGF8MCwxNil8MDtwYT1DO2RhPUhkKGVhfDAsZGF8MCw0OCl8MDtxYT1kYXxxYTtwYT1DfHBhO0U9RGQocWF8MCxwYXwwLHp8MCxFfDApfDA7ej1DO3dhPUVed2E7dmE9el52YTtkYT1HZCh3YXwwLHZhfDAsNjMpfDA7ZWE9Qzt2YT1IZCh3YXwwLHZhfDAsMSl8MDtkYT12YXxkYTtlYT1DfGVhO2NhPURkKFp8MCxffDAsdnwwLGNhfDApfDA7Y2E9RGQoY2F8MCxDfDAsbXwwLG98MCl8MDt2PUM7cWE9cWFeY2E7cGE9cGFedjtHPURkKHBhfDAscWF8MCxKfDAsR3wwKXwwO0o9QztaPUdeWjtfPUpeXzt2YT1HZChafDAsX3wwLDI0KXwwO3dhPUM7Xz1IZChafDAsX3wwLDQwKXwwO3ZhPV98dmE7d2E9Q3x3YTt2PURkKHJhfDAsc2F8MCxjYXwwLHZ8MCl8MDt2PURkKHZ8MCxDfDAsdmF8MCx3YXwwKXwwO2NhPUM7cGE9dl5wYTtxYT1jYV5xYTtfPUdkKHBhfDAscWF8MCwxNil8MDtaPUM7cWE9SGQocGF8MCxxYXwwLDQ4KXwwO189cWF8XztaPUN8WjtKPURkKF98MCxafDAsR3wwLEp8MCl8MDtHPUM7dmE9Sl52YTt3YT1HXndhO3FhPUdkKHZhfDAsd2F8MCw2Myl8MDtwYT1DO3dhPUhkKHZhfDAsd2F8MCwxKXwwO3FhPXdhfHFhO3BhPUN8cGE7b2E9RGQoVnwwLFh8MCxuYXwwLG9hfDApfDA7b2E9RGQob2F8MCxDfDAsaHwwLGx8MCl8MDtuYT1DO21hPW1hXm9hO2xhPWxhXm5hO3o9RGQobGF8MCxtYXwwLEV8MCx6fDApfDA7RT1DO1Y9el5WO1g9RV5YO3dhPUdkKFZ8MCxYfDAsMjQpfDA7dmE9QztYPUhkKFZ8MCxYfDAsNDApfDA7d2E9WHx3YTt2YT1DfHZhO25hPURkKHN8MCx1fDAsb2F8MCxuYXwwKXwwO25hPURkKG5hfDAsQ3wwLHdhfDAsdmF8MCl8MDtvYT1DO2xhPW5hXmxhO21hPW9hXm1hO1g9R2QobGF8MCxtYXwwLDE2KXwwO1Y9QzttYT1IZChsYXwwLG1hfDAsNDgpfDA7WD1tYXxYO1Y9Q3xWO0U9RGQoWHwwLFZ8MCx6fDAsRXwwKXwwO3o9Qzt3YT1FXndhO3ZhPXpedmE7bWE9R2Qod2F8MCx2YXwwLDYzKXwwO2xhPUM7dmE9SGQod2F8MCx2YXwwLDEpfDA7bWE9dmF8bWE7bGE9Q3xsYTtrYT1EZChkYXwwLGVhfDAsamF8MCxrYXwwKXwwO2thPURkKGthfDAsQ3wwLG58MCxyfDApfDA7amE9QztpYT1pYV5rYTtoYT1oYV5qYTtRPURkKGhhfDAsaWF8MCxUfDAsUXwwKXwwO1Q9QztkYT1RXmRhO2VhPVReZWE7dmE9R2QoZGF8MCxlYXwwLDI0KXwwO3dhPUM7ZWE9SGQoZGF8MCxlYXwwLDQwKXwwO3ZhPWVhfHZhO3dhPUN8d2E7amE9RGQoV3wwLFV8MCxrYXwwLGphfDApfDA7amE9RGQoamF8MCxDfDAsdmF8MCx3YXwwKXwwO2thPUM7aGE9amFeaGE7aWE9a2FeaWE7ZWE9R2QoaGF8MCxpYXwwLDE2KXwwO2RhPUM7aWE9SGQoaGF8MCxpYXwwLDQ4KXwwO2VhPWlhfGVhO2RhPUN8ZGE7VD1EZChlYXwwLGRhfDAsUXwwLFR8MCl8MDtRPUM7dmE9VF52YTt3YT1RXndhO2lhPUdkKHZhfDAsd2F8MCw2Myl8MDtoYT1DO3dhPUhkKHZhfDAsd2F8MCwxKXwwO2lhPXdhfGlhO2hhPUN8aGE7Z2E9RGQoYWF8MCxiYXwwLGZhfDAsZ2F8MCl8MDtnYT1EZChnYXwwLEN8MCxqfDAsWXwwKXwwO2ZhPUM7dWE9dWFeZ2E7dGE9dGFeZmE7TD1EZCh0YXwwLHVhfDAsT3wwLEx8MCl8MDtPPUM7YWE9TF5hYTtiYT1PXmJhO3dhPUdkKGFhfDAsYmF8MCwyNCl8MDt2YT1DO2JhPUhkKGFhfDAsYmF8MCw0MCl8MDt3YT1iYXx3YTt2YT1DfHZhO2ZhPURkKHB8MCwkfDAsZ2F8MCxmYXwwKXwwO2ZhPURkKGZhfDAsQ3wwLHdhfDAsdmF8MCl8MDtnYT1DO3RhPWZhXnRhO3VhPWdhXnVhO2JhPUdkKHRhfDAsdWF8MCwxNil8MDthYT1DO3VhPUhkKHRhfDAsdWF8MCw0OCl8MDtiYT11YXxiYTthYT1DfGFhO089RGQoYmF8MCxhYXwwLEx8MCxPfDApfDA7TD1DO3dhPU9ed2E7dmE9TF52YTt1YT1HZCh3YXwwLHZhfDAsNjMpfDA7dGE9Qzt2YT1IZCh3YXwwLHZhfDAsMSl8MDt1YT12YXx1YTt0YT1DfHRhO2NhPURkKG58MCxyfDAsdnwwLGNhfDApfDA7Y2E9RGQoY2F8MCxDfDAsdWF8MCx0YXwwKXwwO3Y9QztYPWNhXlg7Vj12XlY7UT1EZChWfDAsWHwwLFR8MCxRfDApfDA7VD1DO3VhPVFedWE7dGE9VF50YTt2YT1HZCh1YXwwLHRhfDAsMjQpfDA7d2E9Qzt0YT1IZCh1YXwwLHRhfDAsNDApfDA7dmE9dGF8dmE7d2E9Q3x3YTt2PURkKGp8MCxZfDAsY2F8MCx2fDApfDA7dj1EZCh2fDAsQ3wwLHZhfDAsd2F8MCl8MDtjYT1DO1Y9dl5WO1g9Y2FeWDt0YT1HZChWfDAsWHwwLDE2KXwwO3VhPUM7WD1IZChWfDAsWHwwLDQ4KXwwO3RhPVh8dGE7dWE9Q3x1YTtUPURkKHRhfDAsdWF8MCxRfDAsVHwwKXwwO1E9Qzt2YT1UXnZhO3dhPVFed2E7WD1HZCh2YXwwLHdhfDAsNjMpfDA7Vj1DO3dhPUhkKHZhfDAsd2F8MCwxKXwwO1g9d2F8WDtWPUN8VjtvYT1EZChxYXwwLHBhfDAsbmF8MCxvYXwwKXwwO29hPURkKG9hfDAsQ3wwLGh8MCxsfDApfDA7bmE9QztlYT1lYV5vYTtkYT1kYV5uYTtMPURkKGRhfDAsZWF8MCxPfDAsTHwwKXwwO089QztxYT1MXnFhO3BhPU9ecGE7d2E9R2QocWF8MCxwYXwwLDI0KXwwO3ZhPUM7cGE9SGQocWF8MCxwYXwwLDQwKXwwO3dhPXBhfHdhO3ZhPUN8dmE7bmE9RGQoV3wwLFV8MCxvYXwwLG5hfDApfDA7bmE9RGQobmF8MCxDfDAsd2F8MCx2YXwwKXwwO29hPUM7ZGE9bmFeZGE7ZWE9b2FeZWE7cGE9R2QoZGF8MCxlYXwwLDE2KXwwO3FhPUM7ZWE9SGQoZGF8MCxlYXwwLDQ4KXwwO3BhPWVhfHBhO3FhPUN8cWE7Tz1EZChwYXwwLHFhfDAsTHwwLE98MCl8MDtMPUM7d2E9T153YTt2YT1MXnZhO2VhPUdkKHdhfDAsdmF8MCw2Myl8MDtkYT1DO3ZhPUhkKHdhfDAsdmF8MCwxKXwwO2VhPXZhfGVhO2RhPUN8ZGE7a2E9RGQobWF8MCxsYXwwLGphfDAsa2F8MCl8MDtrYT1EZChrYXwwLEN8MCxCfDAsU3wwKXwwO2phPUM7YmE9YmFea2E7YWE9YWFeamE7Rz1EZChhYXwwLGJhfDAsSnwwLEd8MCl8MDtKPUM7bWE9R15tYTtsYT1KXmxhO3ZhPUdkKG1hfDAsbGF8MCwyNCl8MDt3YT1DO2xhPUhkKG1hfDAsbGF8MCw0MCl8MDt2YT1sYXx2YTt3YT1DfHdhO2phPURkKGV8MCxmfDAsa2F8MCxqYXwwKXwwO2phPURkKGphfDAsQ3wwLHZhfDAsd2F8MCl8MDtrYT1DO2FhPWphXmFhO2JhPWthXmJhO2xhPUdkKGFhfDAsYmF8MCwxNil8MDttYT1DO2JhPUhkKGFhfDAsYmF8MCw0OCl8MDtsYT1iYXxsYTttYT1DfG1hO0o9RGQobGF8MCxtYXwwLEd8MCxKfDApfDA7Rz1DO3ZhPUpedmE7d2E9R153YTtiYT1HZCh2YXwwLHdhfDAsNjMpfDA7YWE9Qzt3YT1IZCh2YXwwLHdhfDAsMSl8MDtiYT13YXxiYTthYT1DfGFhO2dhPURkKGlhfDAsaGF8MCxmYXwwLGdhfDApfDA7Z2E9RGQoZ2F8MCxDfDAsTXwwLEt8MCl8MDtmYT1DO189X15nYTtaPVpeZmE7ej1EZChafDAsX3wwLEV8MCx6fDApfDA7RT1DO2lhPXpeaWE7aGE9RV5oYTt3YT1HZChpYXwwLGhhfDAsMjQpfDA7dmE9QztoYT1IZChpYXwwLGhhfDAsNDApfDA7d2E9aGF8d2E7dmE9Q3x2YTtmYT1EZChyYXwwLHNhfDAsZ2F8MCxmYXwwKXwwO2ZhPURkKGZhfDAsQ3wwLHdhfDAsdmF8MCl8MDtnYT1DO1o9ZmFeWjtfPWdhXl87aGE9R2QoWnwwLF98MCwxNil8MDtpYT1DO189SGQoWnwwLF98MCw0OCl8MDtoYT1ffGhhO2lhPUN8aWE7RT1EZChoYXwwLGlhfDAsenwwLEV8MCl8MDt6PUM7d2E9RV53YTt2YT16XnZhO189R2Qod2F8MCx2YXwwLDYzKXwwO1o9Qzt2YT1IZCh3YXwwLHZhfDAsMSl8MDtfPXZhfF87Wj1DfFo7Y2E9RGQoZWF8MCxkYXwwLHZ8MCxjYXwwKXwwO2NhPURkKGNhfDAsQ3wwLHR8MCx4fDApfDA7dj1DO2hhPWhhXmNhO2lhPWlhXnY7Rz1EZChpYXwwLGhhfDAsSnwwLEd8MCl8MDtKPUM7ZWE9R15lYTtkYT1KXmRhO3ZhPUdkKGVhfDAsZGF8MCwyNCl8MDt3YT1DO2RhPUhkKGVhfDAsZGF8MCw0MCl8MDt2YT1kYXx2YTt3YT1DfHdhO3Y9RGQoc3wwLHV8MCxjYXwwLHZ8MCl8MDt2PURkKHZ8MCxDfDAsdmF8MCx3YXwwKXwwO2NhPUM7aWE9dl5pYTtoYT1jYV5oYTtkYT1HZChpYXwwLGhhfDAsMTYpfDA7ZWE9QztoYT1IZChpYXwwLGhhfDAsNDgpfDA7ZGE9aGF8ZGE7ZWE9Q3xlYTtKPURkKGRhfDAsZWF8MCxHfDAsSnwwKXwwO0c9Qzt2YT1KXnZhO3dhPUded2E7aGE9R2QodmF8MCx3YXwwLDYzKXwwO2lhPUM7d2E9SGQodmF8MCx3YXwwLDEpfDA7aGE9d2F8aGE7aWE9Q3xpYTtvYT1EZChiYXwwLGFhfDAsbmF8MCxvYXwwKXwwO29hPURkKG9hfDAsQ3wwLEh8MCxGfDApfDA7bmE9Qzt0YT10YV5vYTt1YT11YV5uYTt6PURkKHVhfDAsdGF8MCxFfDAsenwwKXwwO0U9QztiYT16XmJhO2FhPUVeYWE7d2E9R2QoYmF8MCxhYXwwLDI0KXwwO3ZhPUM7YWE9SGQoYmF8MCxhYXwwLDQwKXwwO3dhPWFhfHdhO3ZhPUN8dmE7bmE9RGQobXwwLG98MCxvYXwwLG5hfDApfDA7bmE9RGQobmF8MCxDfDAsd2F8MCx2YXwwKXwwO29hPUM7dWE9bmFedWE7dGE9b2FedGE7YWE9R2QodWF8MCx0YXwwLDE2KXwwO2JhPUM7dGE9SGQodWF8MCx0YXwwLDQ4KXwwO2FhPXRhfGFhO2JhPUN8YmE7RT1EZChhYXwwLGJhfDAsenwwLEV8MCl8MDt6PUM7d2E9RV53YTt2YT16XnZhO3RhPUdkKHdhfDAsdmF8MCw2Myl8MDt1YT1DO3ZhPUhkKHdhfDAsdmF8MCwxKXwwO3RhPXZhfHRhO3VhPUN8dWE7a2E9RGQoX3wwLFp8MCxqYXwwLGthfDApfDA7a2E9RGQoa2F8MCxDfDAscHwwLCR8MCl8MDtqYT1DO3BhPXBhXmthO3FhPXFhXmphO1E9RGQocWF8MCxwYXwwLFR8MCxRfDApfDA7VD1DO189UV5fO1o9VF5aO3ZhPUdkKF98MCxafDAsMjQpfDA7d2E9QztaPUhkKF98MCxafDAsNDApfDA7dmE9Wnx2YTt3YT1DfHdhO2phPURkKFJ8MCxQfDAsa2F8MCxqYXwwKXwwO2phPURkKGphfDAsQ3wwLHZhfDAsd2F8MCl8MDtrYT1DO3FhPWphXnFhO3BhPWthXnBhO1o9R2QocWF8MCxwYXwwLDE2KXwwO189QztwYT1IZChxYXwwLHBhfDAsNDgpfDA7Wj1wYXxaO189Q3xfO1Q9RGQoWnwwLF98MCxRfDAsVHwwKXwwO1E9Qzt2YT1UXnZhO3dhPVFed2E7cGE9R2QodmF8MCx3YXwwLDYzKXwwO3FhPUM7d2E9SGQodmF8MCx3YXwwLDEpfDA7cGE9d2F8cGE7cWE9Q3xxYTtnYT1EZChYfDAsVnwwLGZhfDAsZ2F8MCl8MDtnYT1EZChnYXwwLEN8MCx5fDAsQXwwKXwwO2ZhPUM7bGE9bGFeZ2E7bWE9bWFeZmE7TD1EZChtYXwwLGxhfDAsT3wwLEx8MCl8MDtPPUM7WD1MXlg7Vj1PXlY7d2E9R2QoWHwwLFZ8MCwyNCl8MDt2YT1DO1Y9SGQoWHwwLFZ8MCw0MCl8MDt3YT1WfHdhO3ZhPUN8dmE7ZmE9RGQoZ3wwLGl8MCxnYXwwLGZhfDApfDA7ZmE9RGQoZmF8MCxDfDAsd2F8MCx2YXwwKXwwO2dhPUM7bWE9ZmFebWE7bGE9Z2FebGE7Vj1HZChtYXwwLGxhfDAsMTYpfDA7WD1DO2xhPUhkKG1hfDAsbGF8MCw0OCl8MDtWPWxhfFY7WD1DfFg7Tz1EZChWfDAsWHwwLEx8MCxPfDApfDA7TD1DO3dhPU9ed2E7dmE9TF52YTtsYT1HZCh3YXwwLHZhfDAsNjMpfDA7bWE9Qzt2YT1IZCh3YXwwLHZhfDAsMSl8MDtsYT12YXxsYTttYT1DfG1hO2NhPURkKGp8MCxZfDAsdnwwLGNhfDApfDA7Y2E9RGQoY2F8MCxDfDAsbGF8MCxtYXwwKXwwO3Y9QzthYT1jYV5hYTtiYT12XmJhO1E9RGQoYmF8MCxhYXwwLFR8MCxRfDApfDA7VD1DO2xhPVFebGE7bWE9VF5tYTt2YT1HZChsYXwwLG1hfDAsMjQpfDA7d2E9QzttYT1IZChsYXwwLG1hfDAsNDApfDA7dmE9bWF8dmE7d2E9Q3x3YTt2PURkKFJ8MCxQfDAsY2F8MCx2fDApfDA7dj1EZCh2fDAsQ3wwLHZhfDAsd2F8MCl8MDtjYT1DO2JhPXZeYmE7YWE9Y2FeYWE7bWE9R2QoYmF8MCxhYXwwLDE2KXwwO2xhPUM7YWE9SGQoYmF8MCxhYXwwLDQ4KXwwO21hPWFhfG1hO2xhPUN8bGE7VD1EZChtYXwwLGxhfDAsUXwwLFR8MCl8MDtRPUM7dmE9VF52YTt3YT1RXndhO2FhPUdkKHZhfDAsd2F8MCw2Myl8MDtiYT1DO3dhPUhkKHZhfDAsd2F8MCwxKXwwO2FhPXdhfGFhO2JhPUN8YmE7b2E9RGQoaGF8MCxpYXwwLG5hfDAsb2F8MCl8MDtvYT1EZChvYXwwLEN8MCxIfDAsRnwwKXwwO25hPUM7Wj1aXm9hO189X15uYTtMPURkKF98MCxafDAsT3wwLEx8MCl8MDtPPUM7aGE9TF5oYTtpYT1PXmlhO3dhPUdkKGhhfDAsaWF8MCwyNCl8MDt2YT1DO2lhPUhkKGhhfDAsaWF8MCw0MCl8MDt3YT1pYXx3YTt2YT1DfHZhO25hPURkKG58MCxyfDAsb2F8MCxuYXwwKXwwO25hPURkKG5hfDAsQ3wwLHdhfDAsdmF8MCl8MDtvYT1DO189bmFeXztaPW9hXlo7aWE9R2QoX3wwLFp8MCwxNil8MDtoYT1DO1o9SGQoX3wwLFp8MCw0OCl8MDtpYT1afGlhO2hhPUN8aGE7Tz1EZChpYXwwLGhhfDAsTHwwLE98MCl8MDtMPUM7d2E9T153YTt2YT1MXnZhO1o9R2Qod2F8MCx2YXwwLDYzKXwwO189Qzt2YT1IZCh3YXwwLHZhfDAsMSl8MDtaPXZhfFo7Xz1DfF87a2E9RGQodGF8MCx1YXwwLGphfDAsa2F8MCl8MDtrYT1EZChrYXwwLEN8MCx0fDAseHwwKXwwO2phPUM7Vj1WXmthO1g9WF5qYTtHPURkKFh8MCxWfDAsSnwwLEd8MCl8MDtKPUM7dGE9R150YTt1YT1KXnVhO3ZhPUdkKHRhfDAsdWF8MCwyNCl8MDt3YT1DO3VhPUhkKHRhfDAsdWF8MCw0MCl8MDt2YT11YXx2YTt3YT1DfHdhO2phPURkKHB8MCwkfDAsa2F8MCxqYXwwKXwwO2phPURkKGphfDAsQ3wwLHZhfDAsd2F8MCl8MDtrYT1DO1g9amFeWDtWPWthXlY7dWE9R2QoWHwwLFZ8MCwxNil8MDt0YT1DO1Y9SGQoWHwwLFZ8MCw0OCl8MDt1YT1WfHVhO3RhPUN8dGE7Sj1EZCh1YXwwLHRhfDAsR3wwLEp8MCl8MDtHPUM7dmE9Sl52YTt3YT1HXndhO1Y9R2QodmF8MCx3YXwwLDYzKXwwO1g9Qzt3YT1IZCh2YXwwLHdhfDAsMSl8MDtWPXdhfFY7WD1DfFg7Z2E9RGQocGF8MCxxYXwwLGZhfDAsZ2F8MCl8MDtnYT1EZChnYXwwLEN8MCxtfDAsb3wwKXwwO2ZhPUM7ZGE9ZGFeZ2E7ZWE9ZWFeZmE7ej1EZChlYXwwLGRhfDAsRXwwLHp8MCl8MDtFPUM7cGE9el5wYTtxYT1FXnFhO3dhPUdkKHBhfDAscWF8MCwyNCl8MDt2YT1DO3FhPUhkKHBhfDAscWF8MCw0MCl8MDt3YT1xYXx3YTt2YT1DfHZhO2ZhPURkKHl8MCxBfDAsZ2F8MCxmYXwwKXwwO2ZhPURkKGZhfDAsQ3wwLHdhfDAsdmF8MCl8MDtnYT1DO2VhPWZhXmVhO2RhPWdhXmRhO3FhPUdkKGVhfDAsZGF8MCwxNil8MDtwYT1DO2RhPUhkKGVhfDAsZGF8MCw0OCl8MDtxYT1kYXxxYTtwYT1DfHBhO0U9RGQocWF8MCxwYXwwLHp8MCxFfDApfDA7ej1DO3dhPUVed2E7dmE9el52YTtkYT1HZCh3YXwwLHZhfDAsNjMpfDA7ZWE9Qzt2YT1IZCh3YXwwLHZhfDAsMSl8MDtkYT12YXxkYTtlYT1DfGVhO2NhPURkKFp8MCxffDAsdnwwLGNhfDApfDA7Y2E9RGQoY2F8MCxDfDAscmF8MCxzYXwwKXwwO3Y9QztxYT1xYV5jYTtwYT1wYV52O0c9RGQocGF8MCxxYXwwLEp8MCxHfDApfDA7Sj1DO1o9R15aO189Sl5fO3ZhPUdkKFp8MCxffDAsMjQpfDA7d2E9QztfPUhkKFp8MCxffDAsNDApfDA7dmE9X3x2YTt3YT1DfHdhO3Y9RGQoV3wwLFV8MCxjYXwwLHZ8MCl8MDt2PURkKHZ8MCxDfDAsdmF8MCx3YXwwKXwwO2NhPUM7cGE9dl5wYTtxYT1jYV5xYTtfPUdkKHBhfDAscWF8MCwxNil8MDtaPUM7cWE9SGQocGF8MCxxYXwwLDQ4KXwwO189cWF8XztaPUN8WjtKPURkKF98MCxafDAsR3wwLEp8MCl8MDtHPUM7dmE9Sl52YTt3YT1HXndhO3FhPUdkKHZhfDAsd2F8MCw2Myl8MDtwYT1DO3dhPUhkKHZhfDAsd2F8MCwxKXwwO3FhPXdhfHFhO3BhPUN8cGE7b2E9RGQoVnwwLFh8MCxuYXwwLG9hfDApfDA7b2E9RGQob2F8MCxDfDAsTXwwLEt8MCl8MDtuYT1DO21hPW1hXm9hO2xhPWxhXm5hO3o9RGQobGF8MCxtYXwwLEV8MCx6fDApfDA7RT1DO1Y9el5WO1g9RV5YO3dhPUdkKFZ8MCxYfDAsMjQpfDA7dmE9QztYPUhkKFZ8MCxYfDAsNDApfDA7d2E9WHx3YTt2YT1DfHZhO25hPURkKGV8MCxmfDAsb2F8MCxuYXwwKXwwO25hPURkKG5hfDAsQ3wwLHdhfDAsdmF8MCl8MDtvYT1DO2xhPW5hXmxhO21hPW9hXm1hO1g9R2QobGF8MCxtYXwwLDE2KXwwO1Y9QzttYT1IZChsYXwwLG1hfDAsNDgpfDA7WD1tYXxYO1Y9Q3xWO0U9RGQoWHwwLFZ8MCx6fDAsRXwwKXwwO3o9Qzt3YT1FXndhO3ZhPXpedmE7bWE9R2Qod2F8MCx2YXwwLDYzKXwwO2xhPUM7dmE9SGQod2F8MCx2YXwwLDEpfDA7bWE9dmF8bWE7bGE9Q3xsYTtrYT1EZChkYXwwLGVhfDAsamF8MCxrYXwwKXwwO2thPURkKGthfDAsQ3wwLHN8MCx1fDApfDA7amE9QztpYT1pYV5rYTtoYT1oYV5qYTtRPURkKGhhfDAsaWF8MCxUfDAsUXwwKXwwO1Q9QztkYT1RXmRhO2VhPVReZWE7dmE9R2QoZGF8MCxlYXwwLDI0KXwwO3dhPUM7ZWE9SGQoZGF8MCxlYXwwLDQwKXwwO3ZhPWVhfHZhO3dhPUN8d2E7amE9RGQoZ3wwLGl8MCxrYXwwLGphfDApfDA7amE9RGQoamF8MCxDfDAsdmF8MCx3YXwwKXwwO2thPUM7aGE9amFeaGE7aWE9a2FeaWE7ZWE9R2QoaGF8MCxpYXwwLDE2KXwwO2RhPUM7aWE9SGQoaGF8MCxpYXwwLDQ4KXwwO2VhPWlhfGVhO2RhPUN8ZGE7VD1EZChlYXwwLGRhfDAsUXwwLFR8MCl8MDtRPUM7dmE9VF52YTt3YT1RXndhO2lhPUdkKHZhfDAsd2F8MCw2Myl8MDtoYT1DO3dhPUhkKHZhfDAsd2F8MCwxKXwwO2lhPXdhfGlhO2hhPUN8aGE7Z2E9RGQoYWF8MCxiYXwwLGZhfDAsZ2F8MCl8MDtnYT1EZChnYXwwLEN8MCxofDAsbHwwKXwwO2ZhPUM7dWE9dWFeZ2E7dGE9dGFeZmE7TD1EZCh0YXwwLHVhfDAsT3wwLEx8MCl8MDtPPUM7YWE9TF5hYTtiYT1PXmJhO3dhPUdkKGFhfDAsYmF8MCwyNCl8MDt2YT1DO2JhPUhkKGFhfDAsYmF8MCw0MCl8MDt3YT1iYXx3YTt2YT1DfHZhO2ZhPURkKEJ8MCxTfDAsZ2F8MCxmYXwwKXwwO2ZhPURkKGZhfDAsQ3wwLHdhfDAsdmF8MCl8MDtnYT1DO3RhPWZhXnRhO3VhPWdhXnVhO2JhPUdkKHRhfDAsdWF8MCwxNil8MDthYT1DO3VhPUhkKHRhfDAsdWF8MCw0OCl8MDtiYT11YXxiYTthYT1DfGFhO089RGQoYmF8MCxhYXwwLEx8MCxPfDApfDA7TD1DO3dhPU9ed2E7dmE9TF52YTt1YT1HZCh3YXwwLHZhfDAsNjMpfDA7dGE9Qzt2YT1IZCh3YXwwLHZhfDAsMSl8MDt1YT12YXx1YTt0YT1DfHRhO2NhPURkKHR8MCx4fDAsdnwwLGNhfDApfDA7Y2E9RGQoY2F8MCxDfDAsdWF8MCx0YXwwKXwwO3Y9QztYPWNhXlg7Vj12XlY7UT1EZChWfDAsWHwwLFR8MCxRfDApfDA7VD1DO3VhPVFedWE7dGE9VF50YTt2YT1HZCh1YXwwLHRhfDAsMjQpfDA7d2E9Qzt0YT1IZCh1YXwwLHRhfDAsNDApfDA7dmE9dGF8dmE7d2E9Q3x3YTt2PURkKGV8MCxmfDAsY2F8MCx2fDApfDA7dj1EZCh2fDAsQ3wwLHZhfDAsd2F8MCl8MDtjYT1DO1Y9dl5WO1g9Y2FeWDt0YT1HZChWfDAsWHwwLDE2KXwwO3VhPUM7WD1IZChWfDAsWHwwLDQ4KXwwO3RhPVh8dGE7dWE9Q3x1YTtUPURkKHRhfDAsdWF8MCxRfDAsVHwwKXwwO1E9Qzt2YT1UXnZhO3dhPVFed2E7WD1HZCh2YXwwLHdhfDAsNjMpfDA7Vj1DO3dhPUhkKHZhfDAsd2F8MCwxKXwwO1g9d2F8WDtWPUN8VjtvYT1EZChxYXwwLHBhfDAsbmF8MCxvYXwwKXwwO29hPURkKG9hfDAsQ3wwLHN8MCx1fDApfDA7bmE9QztlYT1lYV5vYTtkYT1kYV5uYTtMPURkKGRhfDAsZWF8MCxPfDAsTHwwKXwwO089QztxYT1MXnFhO3BhPU9ecGE7d2E9R2QocWF8MCxwYXwwLDI0KXwwO3ZhPUM7cGE9SGQocWF8MCxwYXwwLDQwKXwwO3dhPXBhfHdhO3ZhPUN8dmE7bmE9RGQobXwwLG98MCxvYXwwLG5hfDApfDA7bmE9RGQobmF8MCxDfDAsd2F8MCx2YXwwKXwwO29hPUM7ZGE9bmFeZGE7ZWE9b2FeZWE7cGE9R2QoZGF8MCxlYXwwLDE2KXwwO3FhPUM7ZWE9SGQoZGF8MCxlYXwwLDQ4KXwwO3BhPWVhfHBhO3FhPUN8cWE7Tz1EZChwYXwwLHFhfDAsTHwwLE98MCl8MDtMPUM7d2E9T153YTt2YT1MXnZhO2VhPUdkKHdhfDAsdmF8MCw2Myl8MDtkYT1DO3ZhPUhkKHdhfDAsdmF8MCwxKXwwO2VhPXZhfGVhO2RhPUN8ZGE7a2E9RGQobWF8MCxsYXwwLGphfDAsa2F8MCl8MDtrYT1EZChrYXwwLEN8MCxSfDAsUHwwKXwwO2phPUM7YmE9YmFea2E7YWE9YWFeamE7Rz1EZChhYXwwLGJhfDAsSnwwLEd8MCl8MDtKPUM7bWE9R15tYTtsYT1KXmxhO3ZhPUdkKG1hfDAsbGF8MCwyNCl8MDt3YT1DO2xhPUhkKG1hfDAsbGF8MCw0MCl8MDt2YT1sYXx2YTt3YT1DfHdhO2phPURkKE18MCxLfDAsa2F8MCxqYXwwKXwwO2phPURkKGphfDAsQ3wwLHZhfDAsd2F8MCl8MDtrYT1DO2FhPWphXmFhO2JhPWthXmJhO2xhPUdkKGFhfDAsYmF8MCwxNil8MDttYT1DO2JhPUhkKGFhfDAsYmF8MCw0OCl8MDtsYT1iYXxsYTttYT1DfG1hO0o9RGQobGF8MCxtYXwwLEd8MCxKfDApfDA7Rz1DO3ZhPUpedmE7d2E9R153YTtiYT1HZCh2YXwwLHdhfDAsNjMpfDA7YWE9Qzt3YT1IZCh2YXwwLHdhfDAsMSl8MDtiYT13YXxiYTthYT1DfGFhO2dhPURkKGlhfDAsaGF8MCxmYXwwLGdhfDApfDA7Z2E9RGQoZ2F8MCxDfDAsZ3wwLGl8MCl8MDtmYT1DO189X15nYTtaPVpeZmE7ej1EZChafDAsX3wwLEV8MCx6fDApfDA7RT1DO2lhPXpeaWE7aGE9RV5oYTt3YT1HZChpYXwwLGhhfDAsMjQpfDA7dmE9QztoYT1IZChpYXwwLGhhfDAsNDApfDA7d2E9aGF8d2E7dmE9Q3x2YTtmYT1EZChofDAsbHwwLGdhfDAsZmF8MCl8MDtmYT1EZChmYXwwLEN8MCx3YXwwLHZhfDApfDA7Z2E9QztaPWZhXlo7Xz1nYV5fO2hhPUdkKFp8MCxffDAsMTYpfDA7aWE9QztfPUhkKFp8MCxffDAsNDgpfDA7aGE9X3xoYTtpYT1DfGlhO0U9RGQoaGF8MCxpYXwwLHp8MCxFfDApfDA7ej1DO3dhPUVed2E7dmE9el52YTtfPUdkKHdhfDAsdmF8MCw2Myl8MDtaPUM7dmE9SGQod2F8MCx2YXwwLDEpfDA7Xz12YXxfO1o9Q3xaO2NhPURkKGVhfDAsZGF8MCx2fDAsY2F8MCl8MDtjYT1EZChjYXwwLEN8MCxwfDAsJHwwKXwwO3Y9QztoYT1oYV5jYTtpYT1pYV52O0c9RGQoaWF8MCxoYXwwLEp8MCxHfDApfDA7Sj1DO2VhPUdeZWE7ZGE9Sl5kYTt2YT1HZChlYXwwLGRhfDAsMjQpfDA7d2E9QztkYT1IZChlYXwwLGRhfDAsNDApfDA7dmE9ZGF8dmE7d2E9Q3x3YTt2PURkKEJ8MCxTfDAsY2F8MCx2fDApfDA7dj1EZCh2fDAsQ3wwLHZhfDAsd2F8MCl8MDtjYT1DO2lhPXZeaWE7aGE9Y2FeaGE7ZGE9R2QoaWF8MCxoYXwwLDE2KXwwO2VhPUM7aGE9SGQoaWF8MCxoYXwwLDQ4KXwwO2RhPWhhfGRhO2VhPUN8ZWE7Sj1EZChkYXwwLGVhfDAsR3wwLEp8MCl8MDtHPUM7dmE9Sl52YTt3YT1HXndhO2hhPUdkKHZhfDAsd2F8MCw2Myl8MDtpYT1DO3dhPUhkKHZhfDAsd2F8MCwxKXwwO2hhPXdhfGhhO2lhPUN8aWE7b2E9RGQoYmF8MCxhYXwwLG5hfDAsb2F8MCl8MDtvYT1EZChvYXwwLEN8MCxufDAscnwwKXwwO25hPUM7dGE9dGFeb2E7dWE9dWFebmE7ej1EZCh1YXwwLHRhfDAsRXwwLHp8MCl8MDtFPUM7YmE9el5iYTthYT1FXmFhO3dhPUdkKGJhfDAsYWF8MCwyNCl8MDt2YT1DO2FhPUhkKGJhfDAsYWF8MCw0MCl8MDt3YT1hYXx3YTt2YT1DfHZhO25hPURkKEh8MCxGfDAsb2F8MCxuYXwwKXwwO25hPURkKG5hfDAsQ3wwLHdhfDAsdmF8MCl8MDtvYT1DO3VhPW5hXnVhO3RhPW9hXnRhO2FhPUdkKHVhfDAsdGF8MCwxNil8MDtiYT1DO3RhPUhkKHVhfDAsdGF8MCw0OCl8MDthYT10YXxhYTtiYT1DfGJhO0U9RGQoYWF8MCxiYXwwLHp8MCxFfDApfDA7ej1DO3dhPUVed2E7dmE9el52YTt0YT1HZCh3YXwwLHZhfDAsNjMpfDA7dWE9Qzt2YT1IZCh3YXwwLHZhfDAsMSl8MDt0YT12YXx0YTt1YT1DfHVhO2thPURkKF98MCxafDAsamF8MCxrYXwwKXwwO2thPURkKGthfDAsQ3wwLHl8MCxBfDApfDA7amE9QztwYT1wYV5rYTtxYT1xYV5qYTtRPURkKHFhfDAscGF8MCxUfDAsUXwwKXwwO1Q9QztfPVFeXztaPVReWjt2YT1HZChffDAsWnwwLDI0KXwwO3dhPUM7Wj1IZChffDAsWnwwLDQwKXwwO3ZhPVp8dmE7d2E9Q3x3YTtqYT1EZChyYXwwLHNhfDAsa2F8MCxqYXwwKXwwO2phPURkKGphfDAsQ3wwLHZhfDAsd2F8MCl8MDtrYT1DO3FhPWphXnFhO3BhPWthXnBhO1o9R2QocWF8MCxwYXwwLDE2KXwwO189QztwYT1IZChxYXwwLHBhfDAsNDgpfDA7Wj1wYXxaO189Q3xfO1Q9RGQoWnwwLF98MCxRfDAsVHwwKXwwO1E9Qzt2YT1UXnZhO3dhPVFed2E7cGE9R2QodmF8MCx3YXwwLDYzKXwwO3FhPUM7d2E9SGQodmF8MCx3YXwwLDEpfDA7cGE9d2F8cGE7cWE9Q3xxYTtnYT1EZChYfDAsVnwwLGZhfDAsZ2F8MCl8MDtnYT1EZChnYXwwLEN8MCxXfDAsVXwwKXwwO2ZhPUM7bGE9bGFeZ2E7bWE9bWFeZmE7TD1EZChtYXwwLGxhfDAsT3wwLEx8MCl8MDtPPUM7WD1MXlg7Vj1PXlY7d2E9R2QoWHwwLFZ8MCwyNCl8MDt2YT1DO1Y9SGQoWHwwLFZ8MCw0MCl8MDt3YT1WfHdhO3ZhPUN8dmE7ZmE9RGQoanwwLFl8MCxnYXwwLGZhfDApfDA7ZmE9RGQoZmF8MCxDfDAsd2F8MCx2YXwwKXwwO2dhPUM7bWE9ZmFebWE7bGE9Z2FebGE7Vj1HZChtYXwwLGxhfDAsMTYpfDA7WD1DO2xhPUhkKG1hfDAsbGF8MCw0OCl8MDtWPWxhfFY7WD1DfFg7Tz1EZChWfDAsWHwwLEx8MCxPfDApfDA7TD1DO3dhPU9ed2E7dmE9TF52YTtsYT1HZCh3YXwwLHZhfDAsNjMpfDA7bWE9Qzt2YT1IZCh3YXwwLHZhfDAsMSl8MDtsYT12YXxsYTttYT1DfG1hO2NhPURkKGV8MCxmfDAsdnwwLGNhfDApfDA7Y2E9RGQoY2F8MCxDfDAsbGF8MCxtYXwwKXwwO3Y9QzthYT1jYV5hYTtiYT12XmJhO1E9RGQoYmF8MCxhYXwwLFR8MCxRfDApfDA7VD1DO2xhPVFebGE7bWE9VF5tYTt2YT1HZChsYXwwLG1hfDAsMjQpfDA7d2E9QzttYT1IZChsYXwwLG1hfDAsNDApfDA7dmE9bWF8dmE7d2E9Q3x3YTt2PURkKEh8MCxGfDAsY2F8MCx2fDApfDA7dj1EZCh2fDAsQ3wwLHZhfDAsd2F8MCl8MDtjYT1DO2JhPXZeYmE7YWE9Y2FeYWE7bWE9R2QoYmF8MCxhYXwwLDE2KXwwO2xhPUM7YWE9SGQoYmF8MCxhYXwwLDQ4KXwwO21hPWFhfG1hO2xhPUN8bGE7VD1EZChtYXwwLGxhfDAsUXwwLFR8MCl8MDtRPUM7dmE9VF52YTt3YT1RXndhO2FhPUdkKHZhfDAsd2F8MCw2Myl8MDtiYT1DO3dhPUhkKHZhfDAsd2F8MCwxKXwwO2FhPXdhfGFhO2JhPUN8YmE7b2E9RGQoaGF8MCxpYXwwLG5hfDAsb2F8MCl8MDtvYT1EZChvYXwwLEN8MCxXfDAsVXwwKXwwO25hPUM7Wj1aXm9hO189X15uYTtMPURkKF98MCxafDAsT3wwLEx8MCl8MDtPPUM7aGE9TF5oYTtpYT1PXmlhO3dhPUdkKGhhfDAsaWF8MCwyNCl8MDt2YT1DO2lhPUhkKGhhfDAsaWF8MCw0MCl8MDt3YT1pYXx3YTt2YT1DfHZhO25hPURkKHl8MCxBfDAsb2F8MCxuYXwwKXwwO25hPURkKG5hfDAsQ3wwLHdhfDAsdmF8MCl8MDtvYT1DO189bmFeXztaPW9hXlo7aWE9R2QoX3wwLFp8MCwxNil8MDtoYT1DO1o9SGQoX3wwLFp8MCw0OCl8MDtpYT1afGlhO2hhPUN8aGE7Tz1EZChpYXwwLGhhfDAsTHwwLE98MCl8MDtMPUM7d2E9T153YTt2YT1MXnZhO1o9R2Qod2F8MCx2YXwwLDYzKXwwO189Qzt2YT1IZCh3YXwwLHZhfDAsMSl8MDtaPXZhfFo7Xz1DfF87a2E9RGQodGF8MCx1YXwwLGphfDAsa2F8MCl8MDtrYT1EZChrYXwwLEN8MCxyYXwwLHNhfDApfDA7amE9QztWPVZea2E7WD1YXmphO0c9RGQoWHwwLFZ8MCxKfDAsR3wwKXwwO0o9Qzt0YT1HXnRhO3VhPUpedWE7dmE9R2QodGF8MCx1YXwwLDI0KXwwO3dhPUM7dWE9SGQodGF8MCx1YXwwLDQwKXwwO3ZhPXVhfHZhO3dhPUN8d2E7amE9RGQoQnwwLFN8MCxrYXwwLGphfDApfDA7amE9RGQoamF8MCxDfDAsdmF8MCx3YXwwKXwwO2thPUM7WD1qYV5YO1Y9a2FeVjt1YT1HZChYfDAsVnwwLDE2KXwwO3RhPUM7Vj1IZChYfDAsVnwwLDQ4KXwwO3VhPVZ8dWE7dGE9Q3x0YTtKPURkKHVhfDAsdGF8MCxHfDAsSnwwKXwwO0c9Qzt2YT1KXnZhO3dhPUded2E7Vj1HZCh2YXwwLHdhfDAsNjMpfDA7WD1DO3dhPUhkKHZhfDAsd2F8MCwxKXwwO1Y9d2F8VjtYPUN8WDtnYT1EZChwYXwwLHFhfDAsZmF8MCxnYXwwKXwwO2dhPURkKGdhfDAsQ3wwLHB8MCwkfDApfDA7ZmE9QztkYT1kYV5nYTtlYT1lYV5mYTt6PURkKGVhfDAsZGF8MCxFfDAsenwwKXwwO0U9QztwYT16XnBhO3FhPUVecWE7d2E9R2QocGF8MCxxYXwwLDI0KXwwO3ZhPUM7cWE9SGQocGF8MCxxYXwwLDQwKXwwO3dhPXFhfHdhO3ZhPUN8dmE7ZmE9RGQobXwwLG98MCxnYXwwLGZhfDApfDA7ZmE9RGQoZmF8MCxDfDAsd2F8MCx2YXwwKXwwO2dhPUM7ZWE9ZmFeZWE7ZGE9Z2FeZGE7cWE9R2QoZWF8MCxkYXwwLDE2KXwwO3BhPUM7ZGE9SGQoZWF8MCxkYXwwLDQ4KXwwO3FhPWRhfHFhO3BhPUN8cGE7RT1EZChxYXwwLHBhfDAsenwwLEV8MCl8MDt6PUM7d2E9RV53YTt2YT16XnZhO2RhPUdkKHdhfDAsdmF8MCw2Myl8MDtlYT1DO3ZhPUhkKHdhfDAsdmF8MCwxKXwwO2RhPXZhfGRhO2VhPUN8ZWE7Y2E9RGQoWnwwLF98MCx2fDAsY2F8MCl8MDtjYT1EZChjYXwwLEN8MCxSfDAsUHwwKXwwO3Y9QztxYT1xYV5jYTtwYT1wYV52O0c9RGQocGF8MCxxYXwwLEp8MCxHfDApfDA7Sj1DO1o9R15aO189Sl5fO3ZhPUdkKFp8MCxffDAsMjQpfDA7d2E9QztfPUhkKFp8MCxffDAsNDApfDA7dmE9X3x2YTt3YT1DfHdhO3Y9RGQobnwwLHJ8MCxjYXwwLHZ8MCl8MDt2PURkKHZ8MCxDfDAsdmF8MCx3YXwwKXwwO2NhPUM7cGE9dl5wYTtxYT1jYV5xYTtfPUdkKHBhfDAscWF8MCwxNil8MDtaPUM7cWE9SGQocGF8MCxxYXwwLDQ4KXwwO189cWF8XztaPUN8WjtKPURkKF98MCxafDAsR3wwLEp8MCl8MDtHPUM7dmE9Sl52YTt3YT1HXndhO3FhPUdkKHZhfDAsd2F8MCw2Myl8MDtwYT1DO3dhPUhkKHZhfDAsd2F8MCwxKXwwO3FhPXdhfHFhO3BhPUN8cGE7b2E9RGQoVnwwLFh8MCxuYXwwLG9hfDApfDA7b2E9RGQob2F8MCxDfDAsc3wwLHV8MCl8MDtuYT1DO21hPW1hXm9hO2xhPWxhXm5hO3o9RGQobGF8MCxtYXwwLEV8MCx6fDApfDA7RT1DO1Y9el5WO1g9RV5YO3dhPUdkKFZ8MCxYfDAsMjQpfDA7dmE9QztYPUhkKFZ8MCxYfDAsNDApfDA7d2E9WHx3YTt2YT1DfHZhO25hPURkKGh8MCxsfDAsb2F8MCxuYXwwKXwwO25hPURkKG5hfDAsQ3wwLHdhfDAsdmF8MCl8MDtvYT1DO2xhPW5hXmxhO21hPW9hXm1hO1g9R2QobGF8MCxtYXwwLDE2KXwwO1Y9QzttYT1IZChsYXwwLG1hfDAsNDgpfDA7WD1tYXxYO1Y9Q3xWO0U9RGQoWHwwLFZ8MCx6fDAsRXwwKXwwO3o9Qzt3YT1FXndhO3ZhPXpedmE7bWE9R2Qod2F8MCx2YXwwLDYzKXwwO2xhPUM7dmE9SGQod2F8MCx2YXwwLDEpfDA7bWE9dmF8bWE7bGE9Q3xsYTtrYT1EZChkYXwwLGVhfDAsamF8MCxrYXwwKXwwO2thPURkKGthfDAsQ3wwLGp8MCxZfDApfDA7amE9QztpYT1pYV5rYTtoYT1oYV5qYTtRPURkKGhhfDAsaWF8MCxUfDAsUXwwKXwwO1Q9QztkYT1RXmRhO2VhPVReZWE7dmE9R2QoZGF8MCxlYXwwLDI0KXwwO3dhPUM7ZWE9SGQoZGF8MCxlYXwwLDQwKXwwO3ZhPWVhfHZhO3dhPUN8d2E7amE9RGQodHwwLHh8MCxrYXwwLGphfDApfDA7amE9RGQoamF8MCxDfDAsdmF8MCx3YXwwKXwwO2thPUM7aGE9amFeaGE7aWE9a2FeaWE7ZWE9R2QoaGF8MCxpYXwwLDE2KXwwO2RhPUM7aWE9SGQoaGF8MCxpYXwwLDQ4KXwwO2VhPWlhfGVhO2RhPUN8ZGE7VD1EZChlYXwwLGRhfDAsUXwwLFR8MCl8MDtRPUM7dmE9VF52YTt3YT1RXndhO2lhPUdkKHZhfDAsd2F8MCw2Myl8MDtoYT1DO3dhPUhkKHZhfDAsd2F8MCwxKXwwO2lhPXdhfGlhO2hhPUN8aGE7Z2E9RGQoYWF8MCxiYXwwLGZhfDAsZ2F8MCl8MDtnYT1EZChnYXwwLEN8MCxnfDAsaXwwKXwwO2ZhPUM7dWE9dWFeZ2E7dGE9dGFeZmE7TD1EZCh0YXwwLHVhfDAsT3wwLEx8MCl8MDtPPUM7YWE9TF5hYTtiYT1PXmJhO3dhPUdkKGFhfDAsYmF8MCwyNCl8MDt2YT1DO2JhPUhkKGFhfDAsYmF8MCw0MCl8MDt3YT1iYXx3YTt2YT1DfHZhO2ZhPURkKE18MCxLfDAsZ2F8MCxmYXwwKXwwO2ZhPURkKGZhfDAsQ3wwLHdhfDAsdmF8MCl8MDtnYT1DO3RhPWZhXnRhO3VhPWdhXnVhO2JhPUdkKHRhfDAsdWF8MCwxNil8MDthYT1DO3VhPUhkKHRhfDAsdWF8MCw0OCl8MDtiYT11YXxiYTthYT1DfGFhO089RGQoYmF8MCxhYXwwLEx8MCxPfDApfDA7TD1DO3dhPU9ed2E7dmE9TF52YTt1YT1HZCh3YXwwLHZhfDAsNjMpfDA7dGE9Qzt2YT1IZCh3YXwwLHZhfDAsMSl8MDt1YT12YXx1YTt0YT1DfHRhO2NhPURkKEJ8MCxTfDAsdnwwLGNhfDApfDA7Y2E9RGQoY2F8MCxDfDAsdWF8MCx0YXwwKXwwO3Y9QztYPWNhXlg7Vj12XlY7UT1EZChWfDAsWHwwLFR8MCxRfDApfDA7VD1DO3VhPVFedWE7dGE9VF50YTt2YT1HZCh1YXwwLHRhfDAsMjQpfDA7d2E9Qzt0YT1IZCh1YXwwLHRhfDAsNDApfDA7dmE9dGF8dmE7d2E9Q3x3YTt2PURkKE18MCxLfDAsY2F8MCx2fDApfDA7dj1EZCh2fDAsQ3wwLHZhfDAsd2F8MCl8MDtjYT1DO1Y9dl5WO1g9Y2FeWDt0YT1HZChWfDAsWHwwLDE2KXwwO3VhPUM7WD1IZChWfDAsWHwwLDQ4KXwwO3RhPVh8dGE7dWE9Q3x1YTtUPURkKHRhfDAsdWF8MCxRfDAsVHwwKXwwO1E9Qzt2YT1UXnZhO3dhPVFed2E7WD1HZCh2YXwwLHdhfDAsNjMpfDA7Vj1DO3dhPUhkKHZhfDAsd2F8MCwxKXwwO1g9d2F8WDtWPUN8VjtvYT1EZChxYXwwLHBhfDAsbmF8MCxvYXwwKXwwO29hPURkKG9hfDAsQ3wwLG58MCxyfDApfDA7bmE9QztlYT1lYV5vYTtkYT1kYV5uYTtMPURkKGRhfDAsZWF8MCxPfDAsTHwwKXwwO089QztxYT1MXnFhO3BhPU9ecGE7d2E9R2QocWF8MCxwYXwwLDI0KXwwO3ZhPUM7cGE9SGQocWF8MCxwYXwwLDQwKXwwO3dhPXBhfHdhO3ZhPUN8dmE7bmE9RGQocmF8MCxzYXwwLG9hfDAsbmF8MCl8MDtuYT1EZChuYXwwLEN8MCx3YXwwLHZhfDApfDA7b2E9QztkYT1uYV5kYTtlYT1vYV5lYTtwYT1HZChkYXwwLGVhfDAsMTYpfDA7cWE9QztlYT1IZChkYXwwLGVhfDAsNDgpfDA7cGE9ZWF8cGE7cWE9Q3xxYTtPPURkKHBhfDAscWF8MCxMfDAsT3wwKXwwO0w9Qzt3YT1PXndhO3ZhPUxedmE7ZWE9R2Qod2F8MCx2YXwwLDYzKXwwO2RhPUM7dmE9SGQod2F8MCx2YXwwLDEpfDA7ZWE9dmF8ZWE7ZGE9Q3xkYTtrYT1EZChtYXwwLGxhfDAsamF8MCxrYXwwKXwwO2thPURkKGthfDAsQ3wwLGV8MCxmfDApfDA7amE9QztiYT1iYV5rYTthYT1hYV5qYTtHPURkKGFhfDAsYmF8MCxKfDAsR3wwKXwwO0o9QzttYT1HXm1hO2xhPUpebGE7dmE9R2QobWF8MCxsYXwwLDI0KXwwO3dhPUM7bGE9SGQobWF8MCxsYXwwLDQwKXwwO3ZhPWxhfHZhO3dhPUN8d2E7amE9RGQoV3wwLFV8MCxrYXwwLGphfDApfDA7amE9RGQoamF8MCxDfDAsdmF8MCx3YXwwKXwwO2thPUM7YWE9amFeYWE7YmE9a2FeYmE7bGE9R2QoYWF8MCxiYXwwLDE2KXwwO21hPUM7YmE9SGQoYWF8MCxiYXwwLDQ4KXwwO2xhPWJhfGxhO21hPUN8bWE7Sj1EZChsYXwwLG1hfDAsR3wwLEp8MCl8MDtHPUM7dmE9Sl52YTt3YT1HXndhO2JhPUdkKHZhfDAsd2F8MCw2Myl8MDthYT1DO3dhPUhkKHZhfDAsd2F8MCwxKXwwO2JhPXdhfGJhO2FhPUN8YWE7Z2E9RGQoaWF8MCxoYXwwLGZhfDAsZ2F8MCl8MDtnYT1EZChnYXwwLEN8MCxofDAsbHwwKXwwO2ZhPUM7Xz1fXmdhO1o9Wl5mYTt6PURkKFp8MCxffDAsRXwwLHp8MCl8MDtFPUM7aWE9el5pYTtoYT1FXmhhO3dhPUdkKGlhfDAsaGF8MCwyNCl8MDt2YT1DO2hhPUhkKGlhfDAsaGF8MCw0MCl8MDt3YT1oYXx3YTt2YT1DfHZhO2ZhPURkKGp8MCxZfDAsZ2F8MCxmYXwwKXwwO2ZhPURkKGZhfDAsQ3wwLHdhfDAsdmF8MCl8MDtnYT1DO1o9ZmFeWjtfPWdhXl87aGE9R2QoWnwwLF98MCwxNil8MDtpYT1DO189SGQoWnwwLF98MCw0OCl8MDtoYT1ffGhhO2lhPUN8aWE7RT1EZChoYXwwLGlhfDAsenwwLEV8MCl8MDt6PUM7d2E9RV53YTt2YT16XnZhO189R2Qod2F8MCx2YXwwLDYzKXwwO1o9Qzt2YT1IZCh3YXwwLHZhfDAsMSl8MDtfPXZhfF87Wj1DfFo7Y2E9RGQoZWF8MCxkYXwwLHZ8MCxjYXwwKXwwO2NhPURkKGNhfDAsQ3wwLEh8MCxGfDApfDA7dj1DO2hhPWhhXmNhO2lhPWlhXnY7Rz1EZChpYXwwLGhhfDAsSnwwLEd8MCl8MDtKPUM7ZWE9R15lYTtkYT1KXmRhO3ZhPUdkKGVhfDAsZGF8MCwyNCl8MDt3YT1DO2RhPUhkKGVhfDAsZGF8MCw0MCl8MDt2YT1kYXx2YTt3YT1DfHdhO3Y9RGQoUnwwLFB8MCxjYXwwLHZ8MCl8MDt2PURkKHZ8MCxDfDAsdmF8MCx3YXwwKXwwO2NhPUM7aWE9dl5pYTtoYT1jYV5oYTtkYT1HZChpYXwwLGhhfDAsMTYpfDA7ZWE9QztoYT1IZChpYXwwLGhhfDAsNDgpfDA7ZGE9aGF8ZGE7ZWE9Q3xlYTtKPURkKGRhfDAsZWF8MCxHfDAsSnwwKXwwO0c9Qzt2YT1KXnZhO3dhPUded2E7aGE9R2QodmF8MCx3YXwwLDYzKXwwO2lhPUM7d2E9SGQodmF8MCx3YXwwLDEpfDA7aGE9d2F8aGE7aWE9Q3xpYTtvYT1EZChiYXwwLGFhfDAsbmF8MCxvYXwwKXwwO29hPURkKG9hfDAsQ3wwLHl8MCxBfDApfDA7bmE9Qzt0YT10YV5vYTt1YT11YV5uYTt6PURkKHVhfDAsdGF8MCxFfDAsenwwKXwwO0U9QztiYT16XmJhO2FhPUVeYWE7d2E9R2QoYmF8MCxhYXwwLDI0KXwwO3ZhPUM7YWE9SGQoYmF8MCxhYXwwLDQwKXwwO3dhPWFhfHdhO3ZhPUN8dmE7bmE9RGQocHwwLCR8MCxvYXwwLG5hfDApfDA7bmE9RGQobmF8MCxDfDAsd2F8MCx2YXwwKXwwO29hPUM7dWE9bmFedWE7dGE9b2FedGE7YWE9R2QodWF8MCx0YXwwLDE2KXwwO2JhPUM7dGE9SGQodWF8MCx0YXwwLDQ4KXwwO2FhPXRhfGFhO2JhPUN8YmE7RT1EZChhYXwwLGJhfDAsenwwLEV8MCl8MDt6PUM7d2E9RV53YTt2YT16XnZhO3RhPUdkKHdhfDAsdmF8MCw2Myl8MDt1YT1DO3ZhPUhkKHdhfDAsdmF8MCwxKXwwO3RhPXZhfHRhO3VhPUN8dWE7a2E9RGQoX3wwLFp8MCxqYXwwLGthfDApfDA7a2E9RGQoa2F8MCxDfDAsZ3wwLGl8MCl8MDtqYT1DO3BhPXBhXmthO3FhPXFhXmphO1E9RGQocWF8MCxwYXwwLFR8MCxRfDApfDA7VD1DO189UV5fO1o9VF5aO3ZhPUdkKF98MCxafDAsMjQpfDA7d2E9QztaPUhkKF98MCxafDAsNDApfDA7dmE9Wnx2YTt3YT1DfHdhO2phPURkKHN8MCx1fDAsa2F8MCxqYXwwKXwwO2phPURkKGphfDAsQ3wwLHZhfDAsd2F8MCl8MDtrYT1DO3FhPWphXnFhO3BhPWthXnBhO1o9R2QocWF8MCxwYXwwLDE2KXwwO189QztwYT1IZChxYXwwLHBhfDAsNDgpfDA7Wj1wYXxaO189Q3xfO1Q9RGQoWnwwLF98MCxRfDAsVHwwKXwwO1E9Qzt2YT1UXnZhO3dhPVFed2E7cGE9R2QodmF8MCx3YXwwLDYzKXwwO3FhPUM7d2E9SGQodmF8MCx3YXwwLDEpfDA7cGE9d2F8cGE7cWE9Q3xxYTtnYT1EZChYfDAsVnwwLGZhfDAsZ2F8MCl8MDtnYT1EZChnYXwwLEN8MCx0fDAseHwwKXwwO2ZhPUM7bGE9bGFeZ2E7bWE9bWFeZmE7TD1EZChtYXwwLGxhfDAsT3wwLEx8MCl8MDtPPUM7WD1MXlg7Vj1PXlY7d2E9R2QoWHwwLFZ8MCwyNCl8MDt2YT1DO1Y9SGQoWHwwLFZ8MCw0MCl8MDt3YT1WfHdhO3ZhPUN8dmE7ZmE9RGQobXwwLG98MCxnYXwwLGZhfDApfDA7ZmE9RGQoZmF8MCxDfDAsd2F8MCx2YXwwKXwwO2dhPUM7bWE9ZmFebWE7bGE9Z2FebGE7Vj1HZChtYXwwLGxhfDAsMTYpfDA7WD1DO2xhPUhkKG1hfDAsbGF8MCw0OCl8MDtWPWxhfFY7WD1DfFg7Tz1EZChWfDAsWHwwLEx8MCxPfDApfDA7TD1DO3dhPU9ed2E7dmE9TF52YTtsYT1HZCh3YXwwLHZhfDAsNjMpfDA7bWE9Qzt2YT1IZCh3YXwwLHZhfDAsMSl8MDtsYT12YXxsYTttYT1DfG1hO2NhPURkKHN8MCx1fDAsdnwwLGNhfDApfDA7Y2E9RGQoY2F8MCxDfDAsbGF8MCxtYXwwKXwwO3Y9QzthYT1jYV5hYTtiYT12XmJhO1E9RGQoYmF8MCxhYXwwLFR8MCxRfDApfDA7VD1DO2xhPVFebGE7bWE9VF5tYTt2YT1HZChsYXwwLG1hfDAsMjQpfDA7d2E9QzttYT1IZChsYXwwLG1hfDAsNDApfDA7dmE9bWF8dmE7d2E9Q3x3YTt2PURkKHl8MCxBfDAsY2F8MCx2fDApfDA7dj1EZCh2fDAsQ3wwLHZhfDAsd2F8MCl8MDtjYT1DO2JhPXZeYmE7YWE9Y2FeYWE7bWE9R2QoYmF8MCxhYXwwLDE2KXwwO2xhPUM7YWE9SGQoYmF8MCxhYXwwLDQ4KXwwO21hPWFhfG1hO2xhPUN8bGE7VD1EZChtYXwwLGxhfDAsUXwwLFR8MCl8MDtRPUM7dmE9VF52YTt3YT1RXndhO2FhPUdkKHZhfDAsd2F8MCw2Myl8MDtiYT1DO3dhPUhkKHZhfDAsd2F8MCwxKXwwO2FhPXdhfGFhO2JhPUN8YmE7b2E9RGQoaGF8MCxpYXwwLG5hfDAsb2F8MCl8MDtvYT1EZChvYXwwLEN8MCxyYXwwLHNhfDApfDA7bmE9QztaPVpeb2E7Xz1fXm5hO0w9RGQoX3wwLFp8MCxPfDAsTHwwKXwwO089QztoYT1MXmhhO2lhPU9eaWE7d2E9R2QoaGF8MCxpYXwwLDI0KXwwO3ZhPUM7aWE9SGQoaGF8MCxpYXwwLDQwKXwwO3dhPWlhfHdhO3ZhPUN8dmE7bmE9RGQoanwwLFl8MCxvYXwwLG5hfDApfDA7bmE9RGQobmF8MCxDfDAsd2F8MCx2YXwwKXwwO29hPUM7Xz1uYV5fO1o9b2FeWjtpYT1HZChffDAsWnwwLDE2KXwwO2hhPUM7Wj1IZChffDAsWnwwLDQ4KXwwO2lhPVp8aWE7aGE9Q3xoYTtPPURkKGlhfDAsaGF8MCxMfDAsT3wwKXwwO0w9Qzt3YT1PXndhO3ZhPUxedmE7Wj1HZCh3YXwwLHZhfDAsNjMpfDA7Xz1DO3ZhPUhkKHdhfDAsdmF8MCwxKXwwO1o9dmF8WjtfPUN8XztrYT1EZCh0YXwwLHVhfDAsamF8MCxrYXwwKXwwO2thPURkKGthfDAsQ3wwLE18MCxLfDApfDA7amE9QztWPVZea2E7WD1YXmphO0c9RGQoWHwwLFZ8MCxKfDAsR3wwKXwwO0o9Qzt0YT1HXnRhO3VhPUpedWE7dmE9R2QodGF8MCx1YXwwLDI0KXwwO3dhPUM7dWE9SGQodGF8MCx1YXwwLDQwKXwwO3ZhPXVhfHZhO3dhPUN8d2E7amE9RGQoaHwwLGx8MCxrYXwwLGphfDApfDA7amE9RGQoamF8MCxDfDAsdmF8MCx3YXwwKXwwO2thPUM7WD1qYV5YO1Y9a2FeVjt1YT1HZChYfDAsVnwwLDE2KXwwO3RhPUM7Vj1IZChYfDAsVnwwLDQ4KXwwO3VhPVZ8dWE7dGE9Q3x0YTtKPURkKHVhfDAsdGF8MCxHfDAsSnwwKXwwO0c9Qzt2YT1KXnZhO3dhPUded2E7Vj1HZCh2YXwwLHdhfDAsNjMpfDA7WD1DO3dhPUhkKHZhfDAsd2F8MCwxKXwwO1Y9d2F8VjtYPUN8WDtnYT1EZChwYXwwLHFhfDAsZmF8MCxnYXwwKXwwO2dhPURkKGdhfDAsQ3wwLFJ8MCxQfDApfDA7ZmE9QztkYT1kYV5nYTtlYT1lYV5mYTt6PURkKGVhfDAsZGF8MCxFfDAsenwwKXwwO0U9QztwYT16XnBhO3FhPUVecWE7d2E9R2QocGF8MCxxYXwwLDI0KXwwO3ZhPUM7cWE9SGQocGF8MCxxYXwwLDQwKXwwO3dhPXFhfHdhO3ZhPUN8dmE7ZmE9RGQoZ3wwLGl8MCxnYXwwLGZhfDApfDA7ZmE9RGQoZmF8MCxDfDAsd2F8MCx2YXwwKXwwO2dhPUM7ZWE9ZmFeZWE7ZGE9Z2FeZGE7cWE9R2QoZWF8MCxkYXwwLDE2KXwwO3BhPUM7ZGE9SGQoZWF8MCxkYXwwLDQ4KXwwO3FhPWRhfHFhO3BhPUN8cGE7RT1EZChxYXwwLHBhfDAsenwwLEV8MCl8MDt6PUM7d2E9RV53YTt2YT16XnZhO2RhPUdkKHdhfDAsdmF8MCw2Myl8MDtlYT1DO3ZhPUhkKHdhfDAsdmF8MCwxKXwwO2RhPXZhfGRhO2VhPUN8ZWE7Y2E9RGQoWnwwLF98MCx2fDAsY2F8MCl8MDtjYT1EZChjYXwwLEN8MCxlfDAsZnwwKXwwO3Y9QztxYT1xYV5jYTtwYT1wYV52O0c9RGQocGF8MCxxYXwwLEp8MCxHfDApfDA7Sj1DO1o9R15aO189Sl5fO3ZhPUdkKFp8MCxffDAsMjQpfDA7d2E9QztfPUhkKFp8MCxffDAsNDApfDA7dmE9X3x2YTt3YT1DfHdhO3Y9RGQodHwwLHh8MCxjYXwwLHZ8MCl8MDt2PURkKHZ8MCxDfDAsdmF8MCx3YXwwKXwwO2NhPUM7cGE9dl5wYTtxYT1jYV5xYTtfPUdkKHBhfDAscWF8MCwxNil8MDtaPUM7cWE9SGQocGF8MCxxYXwwLDQ4KXwwO189cWF8XztaPUN8WjtKPURkKF98MCxafDAsR3wwLEp8MCl8MDtHPUM7dmE9Sl52YTt3YT1HXndhO3FhPUdkKHZhfDAsd2F8MCw2Myl8MDtwYT1DO3dhPUhkKHZhfDAsd2F8MCwxKXwwO3FhPXdhfHFhO3BhPUN8cGE7b2E9RGQoVnwwLFh8MCxuYXwwLG9hfDApfDA7b2E9RGQob2F8MCxDfDAsQnwwLFN8MCl8MDtuYT1DO21hPW1hXm9hO2xhPWxhXm5hO3o9RGQobGF8MCxtYXwwLEV8MCx6fDApfDA7RT1DO1Y9el5WO1g9RV5YO3dhPUdkKFZ8MCxYfDAsMjQpfDA7dmE9QztYPUhkKFZ8MCxYfDAsNDApfDA7d2E9WHx3YTt2YT1DfHZhO25hPURkKG58MCxyfDAsb2F8MCxuYXwwKXwwO25hPURkKG5hfDAsQ3wwLHdhfDAsdmF8MCl8MDtvYT1DO2xhPW5hXmxhO21hPW9hXm1hO1g9R2QobGF8MCxtYXwwLDE2KXwwO1Y9QzttYT1IZChsYXwwLG1hfDAsNDgpfDA7WD1tYXxYO1Y9Q3xWO0U9RGQoWHwwLFZ8MCx6fDAsRXwwKXwwO3o9Qzt3YT1FXndhO3ZhPXpedmE7bWE9R2Qod2F8MCx2YXwwLDYzKXwwO2xhPUM7dmE9SGQod2F8MCx2YXwwLDEpfDA7bWE9dmF8bWE7bGE9Q3xsYTtrYT1EZChkYXwwLGVhfDAsamF8MCxrYXwwKXwwO2thPURkKGthfDAsQ3wwLFd8MCxVfDApfDA7amE9QztpYT1pYV5rYTtoYT1oYV5qYTtRPURkKGhhfDAsaWF8MCxUfDAsUXwwKXwwO1Q9QztkYT1RXmRhO2VhPVReZWE7dmE9R2QoZGF8MCxlYXwwLDI0KXwwO3dhPUM7ZWE9SGQoZGF8MCxlYXwwLDQwKXwwO3ZhPWVhfHZhO3dhPUN8d2E7amE9RGQocHwwLCR8MCxrYXwwLGphfDApfDA7amE9RGQoamF8MCxDfDAsdmF8MCx3YXwwKXwwO2thPUM7aGE9amFeaGE7aWE9a2FeaWE7ZWE9R2QoaGF8MCxpYXwwLDE2KXwwO2RhPUM7aWE9SGQoaGF8MCxpYXwwLDQ4KXwwO2VhPWlhfGVhO2RhPUN8ZGE7VD1EZChlYXwwLGRhfDAsUXwwLFR8MCl8MDtRPUM7dmE9VF52YTt3YT1RXndhO2lhPUdkKHZhfDAsd2F8MCw2Myl8MDtoYT1DO3dhPUhkKHZhfDAsd2F8MCwxKXwwO2lhPXdhfGlhO2hhPUN8aGE7Z2E9RGQoYWF8MCxiYXwwLGZhfDAsZ2F8MCl8MDtnYT1EZChnYXwwLEN8MCxtfDAsb3wwKXwwO2ZhPUM7dWE9dWFeZ2E7dGE9dGFeZmE7TD1EZCh0YXwwLHVhfDAsT3wwLEx8MCl8MDtPPUM7YWE9TF5hYTtiYT1PXmJhO3dhPUdkKGFhfDAsYmF8MCwyNCl8MDt2YT1DO2JhPUhkKGFhfDAsYmF8MCw0MCl8MDt3YT1iYXx3YTt2YT1DfHZhO2ZhPURkKEh8MCxGfDAsZ2F8MCxmYXwwKXwwO2ZhPURkKGZhfDAsQ3wwLHdhfDAsdmF8MCl8MDtnYT1DO3RhPWZhXnRhO3VhPWdhXnVhO2JhPUdkKHRhfDAsdWF8MCwxNil8MDthYT1DO3VhPUhkKHRhfDAsdWF8MCw0OCl8MDtiYT11YXxiYTthYT1DfGFhO089RGQoYmF8MCxhYXwwLEx8MCxPfDApfDA7TD1DO3dhPU9ed2E7dmE9TF52YTt1YT1HZCh3YXwwLHZhfDAsNjMpfDA7dGE9Qzt2YT1IZCh3YXwwLHZhfDAsMSl8MDt1YT12YXx1YTt0YT1DfHRhO2NhPURkKG18MCxvfDAsdnwwLGNhfDApfDA7Y2E9RGQoY2F8MCxDfDAsdWF8MCx0YXwwKXwwO3Y9QztYPWNhXlg7Vj12XlY7UT1EZChWfDAsWHwwLFR8MCxRfDApfDA7VD1DO3VhPVFedWE7dGE9VF50YTt2YT1HZCh1YXwwLHRhfDAsMjQpfDA7d2E9Qzt0YT1IZCh1YXwwLHRhfDAsNDApfDA7dmE9dGF8dmE7d2E9Q3x3YTt2PURkKHR8MCx4fDAsY2F8MCx2fDApfDA7dj1EZCh2fDAsQ3wwLHZhfDAsd2F8MCl8MDtjYT1DO1Y9dl5WO1g9Y2FeWDt0YT1HZChWfDAsWHwwLDE2KXwwO3VhPUM7WD1IZChWfDAsWHwwLDQ4KXwwO3RhPVh8dGE7dWE9Q3x1YTtUPURkKHRhfDAsdWF8MCxRfDAsVHwwKXwwO1E9Qzt2YT1UXnZhO3dhPVFed2E7WD1HZCh2YXwwLHdhfDAsNjMpfDA7Vj1DO3dhPUhkKHZhfDAsd2F8MCwxKXwwO1g9d2F8WDtWPUN8VjtvYT1EZChxYXwwLHBhfDAsbmF8MCxvYXwwKXwwO29hPURkKG9hfDAsQ3wwLGd8MCxpfDApfDA7bmE9QztlYT1lYV5vYTtkYT1kYV5uYTtMPURkKGRhfDAsZWF8MCxPfDAsTHwwKXwwO089QztxYT1MXnFhO3BhPU9ecGE7d2E9R2QocWF8MCxwYXwwLDI0KXwwO3ZhPUM7cGE9SGQocWF8MCxwYXwwLDQwKXwwO3dhPXBhfHdhO3ZhPUN8dmE7bmE9RGQocHwwLCR8MCxvYXwwLG5hfDApfDA7bmE9RGQobmF8MCxDfDAsd2F8MCx2YXwwKXwwO29hPUM7ZGE9bmFeZGE7ZWE9b2FeZWE7cGE9R2QoZGF8MCxlYXwwLDE2KXwwO3FhPUM7ZWE9SGQoZGF8MCxlYXwwLDQ4KXwwO3BhPWVhfHBhO3FhPUN8cWE7Tz1EZChwYXwwLHFhfDAsTHwwLE98MCl8MDtMPUM7d2E9T153YTt2YT1MXnZhO2VhPUdkKHdhfDAsdmF8MCw2Myl8MDtkYT1DO3ZhPUhkKHdhfDAsdmF8MCwxKXwwO2VhPXZhfGVhO2RhPUN8ZGE7a2E9RGQobWF8MCxsYXwwLGphfDAsa2F8MCl8MDtrYT1EZChrYXwwLEN8MCxufDAscnwwKXwwO2phPUM7YmE9YmFea2E7YWE9YWFeamE7Rz1EZChhYXwwLGJhfDAsSnwwLEd8MCl8MDtKPUM7bWE9R15tYTtsYT1KXmxhO3ZhPUdkKG1hfDAsbGF8MCwyNCl8MDt3YT1DO2xhPUhkKG1hfDAsbGF8MCw0MCl8MDt2YT1sYXx2YTt3YT1DfHdhO2phPURkKHN8MCx1fDAsa2F8MCxqYXwwKXwwO2phPURkKGphfDAsQ3wwLHZhfDAsd2F8MCl8MDtrYT1DO2FhPWphXmFhO2JhPWthXmJhO2xhPUdkKGFhfDAsYmF8MCwxNil8MDttYT1DO2JhPUhkKGFhfDAsYmF8MCw0OCl8MDtsYT1iYXxsYTttYT1DfG1hO0o9RGQobGF8MCxtYXwwLEd8MCxKfDApfDA7Rz1DO3ZhPUpedmE7d2E9R153YTtiYT1HZCh2YXwwLHdhfDAsNjMpfDA7YWE9Qzt3YT1IZCh2YXwwLHdhfDAsMSl8MDtiYT13YXxiYTthYT1DfGFhO2dhPURkKGlhfDAsaGF8MCxmYXwwLGdhfDApfDA7Z2E9RGQoZ2F8MCxDfDAsV3wwLFV8MCl8MDtmYT1DO189X15nYTtaPVpeZmE7ej1EZChafDAsX3wwLEV8MCx6fDApfDA7RT1DO2lhPXpeaWE7aGE9RV5oYTt3YT1HZChpYXwwLGhhfDAsMjQpfDA7dmE9QztoYT1IZChpYXwwLGhhfDAsNDApfDA7d2E9aGF8d2E7dmE9Q3x2YTtmYT1EZChIfDAsRnwwLGdhfDAsZmF8MCl8MDtmYT1EZChmYXwwLEN8MCx3YXwwLHZhfDApfDA7Z2E9QztaPWZhXlo7Xz1nYV5fO2hhPUdkKFp8MCxffDAsMTYpfDA7aWE9QztfPUhkKFp8MCxffDAsNDgpfDA7aGE9X3xoYTtpYT1DfGlhO0U9RGQoaGF8MCxpYXwwLHp8MCxFfDApfDA7ej1DO3dhPUVed2E7dmE9el52YTtfPUdkKHdhfDAsdmF8MCw2Myl8MDtaPUM7dmE9SGQod2F8MCx2YXwwLDEpfDA7Xz12YXxfO1o9Q3xaO2NhPURkKGVhfDAsZGF8MCx2fDAsY2F8MCl8MDtjYT1EZChjYXwwLEN8MCx5fDAsQXwwKXwwO3Y9QztoYT1oYV5jYTtpYT1pYV52O0c9RGQoaWF8MCxoYXwwLEp8MCxHfDApfDA7Sj1DO2VhPUdeZWE7ZGE9Sl5kYTt2YT1HZChlYXwwLGRhfDAsMjQpfDA7d2E9QztkYT1IZChlYXwwLGRhfDAsNDApfDA7dmE9ZGF8dmE7d2E9Q3x3YTt2PURkKE18MCxLfDAsY2F8MCx2fDApfDA7dj1EZCh2fDAsQ3wwLHZhfDAsd2F8MCl8MDtjYT1DO2lhPXZeaWE7aGE9Y2FeaGE7ZGE9R2QoaWF8MCxoYXwwLDE2KXwwO2VhPUM7aGE9SGQoaWF8MCxoYXwwLDQ4KXwwO2RhPWhhfGRhO2VhPUN8ZWE7Sj1EZChkYXwwLGVhfDAsR3wwLEp8MCl8MDtHPUM7dmE9Sl52YTt3YT1HXndhO2hhPUdkKHZhfDAsd2F8MCw2Myl8MDtpYT1DO3dhPUhkKHZhfDAsd2F8MCwxKXwwO2hhPXdhfGhhO2lhPUN8aWE7b2E9RGQoYmF8MCxhYXwwLG5hfDAsb2F8MCl8MDtvYT1EZChvYXwwLEN8MCxqfDAsWXwwKXwwO25hPUM7dGE9dGFeb2E7dWE9dWFebmE7ej1EZCh1YXwwLHRhfDAsRXwwLHp8MCl8MDtFPUM7YmE9el5iYTthYT1FXmFhO3dhPUdkKGJhfDAsYWF8MCwyNCl8MDt2YT1DO2FhPUhkKGJhfDAsYWF8MCw0MCl8MDt3YT1hYXx3YTt2YT1DfHZhO25hPURkKHJhfDAsc2F8MCxvYXwwLG5hfDApfDA7bmE9RGQobmF8MCxDfDAsd2F8MCx2YXwwKXwwO29hPUM7dWE9bmFedWE7dGE9b2FedGE7YWE9R2QodWF8MCx0YXwwLDE2KXwwO2JhPUM7dGE9SGQodWF8MCx0YXwwLDQ4KXwwO2FhPXRhfGFhO2JhPUN8YmE7RT1EZChhYXwwLGJhfDAsenwwLEV8MCl8MDt6PUM7d2E9RV53YTt2YT16XnZhO3RhPUdkKHdhfDAsdmF8MCw2Myl8MDt1YT1DO3ZhPUhkKHdhfDAsdmF8MCwxKXwwO3RhPXZhfHRhO3VhPUN8dWE7a2E9RGQoX3wwLFp8MCxqYXwwLGthfDApfDA7a2E9RGQoa2F8MCxDfDAsaHwwLGx8MCl8MDtqYT1DO3BhPXBhXmthO3FhPXFhXmphO1E9RGQocWF8MCxwYXwwLFR8MCxRfDApfDA7VD1DO189UV5fO1o9VF5aO3ZhPUdkKF98MCxafDAsMjQpfDA7d2E9QztaPUhkKF98MCxafDAsNDApfDA7dmE9Wnx2YTt3YT1DfHdhO2phPURkKGV8MCxmfDAsa2F8MCxqYXwwKXwwO2phPURkKGphfDAsQ3wwLHZhfDAsd2F8MCl8MDtrYT1DO3FhPWphXnFhO3BhPWthXnBhO1o9R2QocWF8MCxwYXwwLDE2KXwwO189QztwYT1IZChxYXwwLHBhfDAsNDgpfDA7Wj1wYXxaO189Q3xfO1Q9RGQoWnwwLF98MCxRfDAsVHwwKXwwO1E9Qzt2YT1UXnZhO3dhPVFed2E7cGE9R2QodmF8MCx3YXwwLDYzKXwwO3FhPUM7d2E9SGQodmF8MCx3YXwwLDEpfDA7cGE9d2F8cGE7cWE9Q3xxYTtnYT1EZChYfDAsVnwwLGZhfDAsZ2F8MCl8MDtnYT1EZChnYXwwLEN8MCxCfDAsU3wwKXwwO2ZhPUM7bGE9bGFeZ2E7bWE9bWFeZmE7TD1EZChtYXwwLGxhfDAsT3wwLEx8MCl8MDtPPUM7WD1MXlg7Vj1PXlY7d2E9R2QoWHwwLFZ8MCwyNCl8MDt2YT1DO1Y9SGQoWHwwLFZ8MCw0MCl8MDt3YT1WfHdhO3ZhPUN8dmE7ZmE9RGQoUnwwLFB8MCxnYXwwLGZhfDApfDA7ZmE9RGQoZmF8MCxDfDAsd2F8MCx2YXwwKXwwO2dhPUM7bWE9ZmFebWE7bGE9Z2FebGE7Vj1HZChtYXwwLGxhfDAsMTYpfDA7WD1DO2xhPUhkKG1hfDAsbGF8MCw0OCl8MDtWPWxhfFY7WD1DfFg7Tz1EZChWfDAsWHwwLEx8MCxPfDApfDA7TD1DO3dhPU9ed2E7dmE9TF52YTtsYT1HZCh3YXwwLHZhfDAsNjMpfDA7bWE9Qzt2YT1IZCh3YXwwLHZhfDAsMSl8MDtsYT12YXxsYTttYT1DfG1hO2NhPURkKFJ8MCxQfDAsdnwwLGNhfDApfDA7Y2E9RGQoY2F8MCxDfDAsbGF8MCxtYXwwKXwwO3Y9QzthYT1jYV5hYTtiYT12XmJhO1E9RGQoYmF8MCxhYXwwLFR8MCxRfDApfDA7VD1DO2xhPVFebGE7bWE9VF5tYTt2YT1HZChsYXwwLG1hfDAsMjQpfDA7d2E9QzttYT1IZChsYXwwLG1hfDAsNDApfDA7dmE9bWF8dmE7d2E9Q3x3YTt2PURkKFd8MCxVfDAsY2F8MCx2fDApfDA7dj1EZCh2fDAsQ3wwLHZhfDAsd2F8MCl8MDtjYT1DO2JhPXZeYmE7YWE9Y2FeYWE7bWE9R2QoYmF8MCxhYXwwLDE2KXwwO2xhPUM7YWE9SGQoYmF8MCxhYXwwLDQ4KXwwO21hPWFhfG1hO2xhPUN8bGE7VD1EZChtYXwwLGxhfDAsUXwwLFR8MCl8MDtRPUM7dmE9VF52YTt3YT1RXndhO2FhPUdkKHZhfDAsd2F8MCw2Myl8MDtiYT1DO3dhPUhkKHZhfDAsd2F8MCwxKXwwO2FhPXdhfGFhO2JhPUN8YmE7b2E9RGQoaGF8MCxpYXwwLG5hfDAsb2F8MCl8MDtvYT1EZChvYXwwLEN8MCx0fDAseHwwKXwwO25hPUM7Wj1aXm9hO189X15uYTtMPURkKF98MCxafDAsT3wwLEx8MCl8MDtPPUM7aGE9TF5oYTtpYT1PXmlhO3dhPUdkKGhhfDAsaWF8MCwyNCl8MDt2YT1DO2lhPUhkKGhhfDAsaWF8MCw0MCl8MDt3YT1pYXx3YTt2YT1DfHZhO25hPURkKGh8MCxsfDAsb2F8MCxuYXwwKXwwO25hPURkKG5hfDAsQ3wwLHdhfDAsdmF8MCl8MDtvYT1DO189bmFeXztaPW9hXlo7aWE9R2QoX3wwLFp8MCwxNil8MDtoYT1DO1o9SGQoX3wwLFp8MCw0OCl8MDtpYT1afGlhO2hhPUN8aGE7Tz1EZChpYXwwLGhhfDAsTHwwLE98MCl8MDtMPUM7d2E9T153YTt2YT1MXnZhO1o9R2Qod2F8MCx2YXwwLDYzKXwwO189Qzt2YT1IZCh3YXwwLHZhfDAsMSl8MDtaPXZhfFo7Xz1DfF87a2E9RGQodGF8MCx1YXwwLGphfDAsa2F8MCl8MDtrYT1EZChrYXwwLEN8MCxwfDAsJHwwKXwwO2phPUM7Vj1WXmthO1g9WF5qYTtHPURkKFh8MCxWfDAsSnwwLEd8MCl8MDtKPUM7dGE9R150YTt1YT1KXnVhO3ZhPUdkKHRhfDAsdWF8MCwyNCl8MDt3YT1DO3VhPUhkKHRhfDAsdWF8MCw0MCl8MDt2YT11YXx2YTt3YT1DfHdhO2phPURkKEh8MCxGfDAsa2F8MCxqYXwwKXwwO2phPURkKGphfDAsQ3wwLHZhfDAsd2F8MCl8MDtrYT1DO1g9amFeWDtWPWthXlY7dWE9R2QoWHwwLFZ8MCwxNil8MDt0YT1DO1Y9SGQoWHwwLFZ8MCw0OCl8MDt1YT1WfHVhO3RhPUN8dGE7Sj1EZCh1YXwwLHRhfDAsR3wwLEp8MCl8MDtHPUM7dmE9Sl52YTt3YT1HXndhO1Y9R2QodmF8MCx3YXwwLDYzKXwwO1g9Qzt3YT1IZCh2YXwwLHdhfDAsMSl8MDtWPXdhfFY7WD1DfFg7Z2E9RGQocGF8MCxxYXwwLGZhfDAsZ2F8MCl8MDtnYT1EZChnYXwwLEN8MCxzfDAsdXwwKXwwO2ZhPUM7ZGE9ZGFeZ2E7ZWE9ZWFeZmE7ej1EZChlYXwwLGRhfDAsRXwwLHp8MCl8MDtFPUM7cGE9el5wYTtxYT1FXnFhO3dhPUdkKHBhfDAscWF8MCwyNCl8MDt2YT1DO3FhPUhkKHBhfDAscWF8MCw0MCl8MDt3YT1xYXx3YTt2YT1DfHZhO2ZhPURkKG58MCxyfDAsZ2F8MCxmYXwwKXwwO2ZhPURkKGZhfDAsQ3wwLHdhfDAsdmF8MCl8MDtnYT1DO2VhPWZhXmVhO2RhPWdhXmRhO3FhPUdkKGVhfDAsZGF8MCwxNil8MDtwYT1DO2RhPUhkKGVhfDAsZGF8MCw0OCl8MDtxYT1kYXxxYTtwYT1DfHBhO0U9RGQocWF8MCxwYXwwLHp8MCxFfDApfDA7ej1DO3dhPUVed2E7dmE9el52YTtkYT1HZCh3YXwwLHZhfDAsNjMpfDA7ZWE9Qzt2YT1IZCh3YXwwLHZhfDAsMSl8MDtkYT12YXxkYTtlYT1DfGVhO2NhPURkKFp8MCxffDAsdnwwLGNhfDApfDA7Y2E9RGQoY2F8MCxDfDAsZ3wwLGl8MCl8MDt2PUM7cWE9cWFeY2E7cGE9cGFedjtHPURkKHBhfDAscWF8MCxKfDAsR3wwKXwwO0o9QztaPUdeWjtfPUpeXzt2YT1HZChafDAsX3wwLDI0KXwwO3dhPUM7Xz1IZChafDAsX3wwLDQwKXwwO3ZhPV98dmE7d2E9Q3x3YTt2PURkKGp8MCxZfDAsY2F8MCx2fDApfDA7dj1EZCh2fDAsQ3wwLHZhfDAsd2F8MCl8MDtjYT1DO3BhPXZecGE7cWE9Y2FecWE7Xz1HZChwYXwwLHFhfDAsMTYpfDA7Wj1DO3FhPUhkKHBhfDAscWF8MCw0OCl8MDtfPXFhfF87Wj1DfFo7Sj1EZChffDAsWnwwLEd8MCxKfDApfDA7Rz1DO3ZhPUpedmE7d2E9R153YTtxYT1HZCh2YXwwLHdhfDAsNjMpfDA7cGE9Qzt3YT1IZCh2YXwwLHdhfDAsMSl8MDtxYT13YXxxYTtwYT1DfHBhO29hPURkKFZ8MCxYfDAsbmF8MCxvYXwwKXwwO29hPURkKG9hfDAsQ3wwLG18MCxvfDApfDA7bmE9QzttYT1tYV5vYTtsYT1sYV5uYTt6PURkKGxhfDAsbWF8MCxFfDAsenwwKXwwO0U9QztWPXpeVjtYPUVeWDt3YT1HZChWfDAsWHwwLDI0KXwwO3ZhPUM7WD1IZChWfDAsWHwwLDQwKXwwO3dhPVh8d2E7dmE9Q3x2YTtuYT1EZChNfDAsS3wwLG9hfDAsbmF8MCl8MDtuYT1EZChuYXwwLEN8MCx3YXwwLHZhfDApfDA7b2E9QztsYT1uYV5sYTttYT1vYV5tYTtYPUdkKGxhfDAsbWF8MCwxNil8MDtWPUM7bWE9SGQobGF8MCxtYXwwLDQ4KXwwO1g9bWF8WDtWPUN8VjtFPURkKFh8MCxWfDAsenwwLEV8MCl8MDt6PUM7d2E9RV53YTt2YT16XnZhO21hPUdkKHdhfDAsdmF8MCw2Myl8MDtsYT1DO3ZhPUhkKHdhfDAsdmF8MCwxKXwwO21hPXZhfG1hO2xhPUN8bGE7a2E9RGQoZGF8MCxlYXwwLGphfDAsa2F8MCl8MDtrYT1EZChrYXwwLEN8MCxlfDAsZnwwKXwwO2phPUM7aWE9aWFea2E7aGE9aGFeamE7UT1EZChoYXwwLGlhfDAsVHwwLFF8MCl8MDtUPUM7ZGE9UV5kYTtlYT1UXmVhO3ZhPUdkKGRhfDAsZWF8MCwyNCl8MDt3YT1DO2VhPUhkKGRhfDAsZWF8MCw0MCl8MDt2YT1lYXx2YTt3YT1DfHdhO2phPURkKEJ8MCxTfDAsa2F8MCxqYXwwKXwwO2phPURkKGphfDAsQ3wwLHZhfDAsd2F8MCl8MDtrYT1DO2hhPWphXmhhO2lhPWthXmlhO2VhPUdkKGhhfDAsaWF8MCwxNil8MDtkYT1DO2lhPUhkKGhhfDAsaWF8MCw0OCl8MDtlYT1pYXxlYTtkYT1DfGRhO1Q9RGQoZWF8MCxkYXwwLFF8MCxUfDApfDA7UT1DO3ZhPVRedmE7d2E9UV53YTtpYT1HZCh2YXwwLHdhfDAsNjMpfDA7aGE9Qzt3YT1IZCh2YXwwLHdhfDAsMSl8MDtpYT13YXxpYTtoYT1DfGhhO2dhPURkKGFhfDAsYmF8MCxmYXwwLGdhfDApfDA7Z2E9RGQoZ2F8MCxDfDAscmF8MCxzYXwwKXwwO2ZhPUM7dWE9dWFeZ2E7dGE9dGFeZmE7TD1EZCh0YXwwLHVhfDAsT3wwLEx8MCl8MDtPPUM7YWE9TF5hYTtiYT1PXmJhO3dhPUdkKGFhfDAsYmF8MCwyNCl8MDt2YT1DO2JhPUhkKGFhfDAsYmF8MCw0MCl8MDt3YT1iYXx3YTt2YT1DfHZhO2ZhPURkKHl8MCxBfDAsZ2F8MCxmYXwwKXwwO2ZhPURkKGZhfDAsQ3wwLHdhfDAsdmF8MCl8MDtnYT1DO3RhPWZhXnRhO3VhPWdhXnVhO2JhPUdkKHRhfDAsdWF8MCwxNil8MDthYT1DO3VhPUhkKHRhfDAsdWF8MCw0OCl8MDtiYT11YXxiYTthYT1DfGFhO089RGQoYmF8MCxhYXwwLEx8MCxPfDApfDA7TD1DO3dhPU9ed2E7dmE9TF52YTt1YT1HZCh3YXwwLHZhfDAsNjMpfDA7dGE9Qzt2YT1IZCh3YXwwLHZhfDAsMSl8MDt1YT12YXx1YTt0YT1DfHRhO2NhPURkKHJhfDAsc2F8MCx2fDAsY2F8MCl8MDtjYT1EZChjYXwwLEN8MCx1YXwwLHRhfDApfDA7dj1DO1g9Y2FeWDtWPXZeVjtRPURkKFZ8MCxYfDAsVHwwLFF8MCl8MDtUPUM7dWE9UV51YTt0YT1UXnRhO3NhPUdkKHVhfDAsdGF8MCwyNCl8MDtyYT1DO3RhPUhkKHVhfDAsdGF8MCw0MCl8MDtzYT10YXxzYTtyYT1DfHJhO3Y9RGQobXwwLG98MCxjYXwwLHZ8MCl8MDt2PURkKHZ8MCxDfDAsc2F8MCxyYXwwKXwwO2NhPUM7Vj12XlY7WD1jYV5YO289R2QoVnwwLFh8MCwxNil8MDttPUM7WD1IZChWfDAsWHwwLDQ4KXwwO289WHxvO209Q3xtO1Q9RGQob3wwLG18MCxRfDAsVHwwKXwwO1E9QztzYT1UXnNhO3JhPVFecmE7WD1HZChzYXwwLHJhfDAsNjMpfDA7Vj1DO3JhPUhkKHNhfDAscmF8MCwxKXwwO1g9cmF8WDtWPUN8VjtvYT1EZChxYXwwLHBhfDAsbmF8MCxvYXwwKXwwOyQ9RGQob2F8MCxDfDAscHwwLCR8MCl8MDtwPUM7ZWE9ZWFeJDtkYT1kYV5wO0w9RGQoZGF8MCxlYXwwLE98MCxMfDApfDA7Tz1DO3FhPUxecWE7cGE9T15wYTtvYT1HZChxYXwwLHBhfDAsMjQpfDA7bmE9QztwYT1IZChxYXwwLHBhfDAsNDApfDA7b2E9cGF8b2E7bmE9Q3xuYTtwPURkKGd8MCxpfDAsJHwwLHB8MCl8MDtwPURkKHB8MCxDfDAsb2F8MCxuYXwwKXwwOyQ9QztkYT1wXmRhO2VhPSReZWE7aT1HZChkYXwwLGVhfDAsMTYpfDA7Zz1DO2VhPUhkKGRhfDAsZWF8MCw0OCl8MDtpPWVhfGk7Zz1DfGc7Tz1EZChpfDAsZ3wwLEx8MCxPfDApfDA7TD1DO29hPU9eb2E7bmE9TF5uYTtlYT1HZChvYXwwLG5hfDAsNjMpfDA7ZGE9QztuYT1IZChvYXwwLG5hfDAsMSl8MDtlYT1uYXxlYTtkYT1DfGRhO2thPURkKG1hfDAsbGF8MCxqYXwwLGthfDApfDA7WT1EZChrYXwwLEN8MCxqfDAsWXwwKXwwO2o9QztiYT1iYV5ZO2FhPWFhXmo7Rz1EZChhYXwwLGJhfDAsSnwwLEd8MCl8MDtKPUM7bWE9R15tYTtsYT1KXmxhO2thPUdkKG1hfDAsbGF8MCwyNCl8MDtqYT1DO2xhPUhkKG1hfDAsbGF8MCw0MCl8MDtrYT1sYXxrYTtqYT1DfGphO2o9RGQoeXwwLEF8MCxZfDAsanwwKXwwO2o9RGQoanwwLEN8MCxrYXwwLGphfDApfDA7WT1DO2FhPWpeYWE7YmE9WV5iYTtBPUdkKGFhfDAsYmF8MCwxNil8MDt5PUM7YmE9SGQoYWF8MCxiYXwwLDQ4KXwwO0E9YmF8QTt5PUN8eTtKPURkKEF8MCx5fDAsR3wwLEp8MCl8MDtHPUM7a2E9Sl5rYTtqYT1HXmphO2JhPUdkKGthfDAsamF8MCw2Myl8MDthYT1DO2phPUhkKGthfDAsamF8MCwxKXwwO2JhPWphfGJhO2FhPUN8YWE7Z2E9RGQoaWF8MCxoYXwwLGZhfDAsZ2F8MCl8MDtTPURkKGdhfDAsQ3wwLEJ8MCxTfDApfDA7Qj1DO189X15TO1o9Wl5CO3o9RGQoWnwwLF98MCxFfDAsenwwKXwwO0U9QztpYT16XmlhO2hhPUVeaGE7Z2E9R2QoaWF8MCxoYXwwLDI0KXwwO2ZhPUM7aGE9SGQoaWF8MCxoYXwwLDQwKXwwO2dhPWhhfGdhO2ZhPUN8ZmE7Qj1EZChzfDAsdXwwLFN8MCxCfDApfDA7Qj1EZChCfDAsQ3wwLGdhfDAsZmF8MCl8MDtTPUM7Wj1CXlo7Xz1TXl87dT1HZChafDAsX3wwLDE2KXwwO3M9QztfPUhkKFp8MCxffDAsNDgpfDA7dT1ffHU7cz1DfHM7RT1EZCh1fDAsc3wwLHp8MCxFfDApfDA7ej1DO2dhPUVeZ2E7ZmE9el5mYTtfPUdkKGdhfDAsZmF8MCw2Myl8MDtaPUM7ZmE9SGQoZ2F8MCxmYXwwLDEpfDA7Xz1mYXxfO1o9Q3xaO2NhPURkKGVhfDAsZGF8MCx2fDAsY2F8MCl8MDtVPURkKGNhfDAsQ3wwLFd8MCxVfDApfDA7Vz1DO3U9dV5VO3M9c15XO0c9RGQoc3wwLHV8MCxKfDAsR3wwKXwwO0o9QztlYT1HXmVhO2RhPUpeZGE7Y2E9R2QoZWF8MCxkYXwwLDI0KXwwO3Y9QztkYT1IZChlYXwwLGRhfDAsNDApfDA7Y2E9ZGF8Y2E7dj1DfHY7Vz1EZChlfDAsZnwwLFV8MCxXfDApfDA7Vz1EZChXfDAsQ3wwLGNhfDAsdnwwKXwwO1U9QztzPVdeczt1PVVedTtmPUdkKHN8MCx1fDAsMTYpfDA7ZT1DO3U9SGQoc3wwLHV8MCw0OCl8MDtmPXV8ZjtlPUN8ZTtKPURkKGZ8MCxlfDAsR3wwLEp8MCl8MDtHPUM7Y2E9Sl5jYTt2PUdedjt1PUdkKGNhfDAsdnwwLDYzKXwwO3M9Qzt2PUhkKGNhfDAsdnwwLDEpfDA7cz1DfHM7JD1EZChiYXwwLGFhfDAscHwwLCR8MCl8MDtQPURkKCR8MCxDfDAsUnwwLFB8MCl8MDtSPUM7bz1vXlA7bT1tXlI7ej1EZChtfDAsb3wwLEV8MCx6fDApfDA7RT1DO2JhPXpeYmE7YWE9RV5hYTskPUdkKGJhfDAsYWF8MCwyNCl8MDtwPUM7YWE9SGQoYmF8MCxhYXwwLDQwKXwwOyQ9YWF8JDtwPUN8cDtSPURkKHR8MCx4fDAsUHwwLFJ8MCl8MDtSPURkKFJ8MCxDfDAsJHwwLHB8MCl8MDtQPUM7bT1SXm07bz1QXm87eD1HZChtfDAsb3wwLDE2KXwwO3Q9QztvPUhkKG18MCxvfDAsNDgpfDA7eD1vfHg7dD1DfHQ7RT1EZCh4fDAsdHwwLHp8MCxFfDApfDA7ej1DOyQ9RV4kO3A9el5wO289R2QoJHwwLHB8MCw2Myl8MDttPUM7cD1IZCgkfDAscHwwLDEpfDA7bT1DfG07WT1EZChffDAsWnwwLGp8MCxZfDApfDA7Sz1EZChZfDAsQ3wwLE18MCxLfDApfDA7TT1DO2k9aV5LO2c9Z15NO1E9RGQoZ3wwLGl8MCxUfDAsUXwwKXwwO1Q9QztfPVFeXztaPVReWjtZPUdkKF98MCxafDAsMjQpfDA7aj1DO1o9SGQoX3wwLFp8MCw0MCl8MDtZPVp8WTtqPUN8ajtNPURkKG58MCxyfDAsS3wwLE18MCl8MDtNPURkKE18MCxDfDAsWXwwLGp8MCl8MDtLPUM7Zz1NXmc7aT1LXmk7cj1HZChnfDAsaXwwLDE2KXwwO249QztpPUhkKGd8MCxpfDAsNDgpfDA7cj1pfHI7bj1DfG47VD1EZChyfDAsbnwwLFF8MCxUfDApfDA7UT1DO1k9VF5ZO2o9UV5qO2k9R2QoWXwwLGp8MCw2Myl8MDtnPUM7aj1IZChZfDAsanwwLDEpfDA7Zz1DfGc7Uz1EZChYfDAsVnwwLEJ8MCxTfDApfDA7Rj1EZChTfDAsQ3wwLEh8MCxGfDApfDA7SD1DO0E9QV5GO3k9eV5IO0w9RGQoeXwwLEF8MCxPfDAsTHwwKXwwO089QztYPUxeWDtWPU9eVjtTPUdkKFh8MCxWfDAsMjQpfDA7Qj1DO1Y9SGQoWHwwLFZ8MCw0MCl8MDtTPVZ8UztCPUN8QjtIPURkKGh8MCxsfDAsRnwwLEh8MCl8MDtIPURkKEh8MCxDfDAsU3wwLEJ8MCl8MDtGPUM7eT1IXnk7QT1GXkE7bD1HZCh5fDAsQXwwLDE2KXwwO2g9QztBPUhkKHl8MCxBfDAsNDgpfDA7bD1BfGw7aD1DfGg7Tz1EZChsfDAsaHwwLEx8MCxPfDApfDA7TD1DO1M9T15TO0I9TF5CO0E9R2QoU3wwLEJ8MCw2Myl8MDt5PUM7Qj1IZChTfDAsQnwwLDEpfDA7Uz1iO1Y9UztTPVMrNHwwO1Q9V14oZFtWPj4wXXxkW1YrMT4+MF08PDh8ZFtWKzI+PjBdPDwxNnxkW1YrMz4+MF08PDI0KV5UO1E9VV4oZFtTPj4wXXxkW1MrMT4+MF08PDh8ZFtTKzI+PjBdPDwxNnxkW1MrMz4+MF08PDI0KV5RO1M9YjthW1M+PjBdPVQ7YVtTKzE+PjBdPVQ+Pjg7YVtTKzI+PjBdPVQ+PjE2O2FbUyszPj4wXT1UPj4yNDtiPWIrNHwwO2FbYj4+MF09UTthW2IrMT4+MF09UT4+ODthW2IrMj4+MF09UT4+MTY7YVtiKzM+PjBdPVE+PjI0O2I9TjtRPWI7Yj1iKzR8MDtPPVJeKGRbUT4+MF18ZFtRKzE+PjBdPDw4fGRbUSsyPj4wXTw8MTZ8ZFtRKzM+PjBdPDwyNCleTztMPVBeKGRbYj4+MF18ZFtiKzE+PjBdPDw4fGRbYisyPj4wXTw8MTZ8ZFtiKzM+PjBdPDwyNCleTDtiPU47Tj1iO2FbTj4+MF09TzthW04rMT4+MF09Tz4+ODthW04rMj4+MF09Tz4+MTY7YVtOKzM+PjBdPU8+PjI0O2I9Yis0fDA7YVtiPj4wXT1MO2FbYisxPj4wXT1MPj44O2FbYisyPj4wXT1MPj4xNjthW2IrMz4+MF09TD4+MjQ7Yj1JO0w9YjtiPWIrNHwwO0o9TV4oZFtMPj4wXXxkW0wrMT4+MF08PDh8ZFtMKzI+PjBdPDwxNnxkW0wrMz4+MF08PDI0KV5KO0c9S14oZFtiPj4wXXxkW2IrMT4+MF08PDh8ZFtiKzI+PjBdPDwxNnxkW2IrMz4+MF08PDI0KV5HO2I9STtJPWI7YVtJPj4wXT1KO2FbSSsxPj4wXT1KPj44O2FbSSsyPj4wXT1KPj4xNjthW0krMz4+MF09Sj4+MjQ7Yj1iKzR8MDthW2I+PjBdPUc7YVtiKzE+PjBdPUc+Pjg7YVtiKzI+PjBdPUc+PjE2O2FbYiszPj4wXT1HPj4yNDtiPUQ7Rz1iO2I9Yis0fDA7RT1IXihkW0c+PjBdfGRbRysxPj4wXTw8OHxkW0crMj4+MF08PDE2fGRbRyszPj4wXTw8MjQpXkU7ej1GXihkW2I+PjBdfGRbYisxPj4wXTw8OHxkW2IrMj4+MF08PDE2fGRbYiszPj4wXTw8MjQpXno7Yj1EO0Q9YjthW0Q+PjBdPUU7YVtEKzE+PjBdPUU+Pjg7YVtEKzI+PjBdPUU+PjE2O2FbRCszPj4wXT1FPj4yNDtiPWIrNHwwO2FbYj4+MF09ejthW2IrMT4+MF09ej4+ODthW2IrMj4+MF09ej4+MTY7YVtiKzM+PjBdPXo+PjI0O2I9dzt6PWI7Yj1iKzR8MDt4PShCfEEpXihkW3o+PjBdfGRbeisxPj4wXTw8OHxkW3orMj4+MF08PDE2fGRbeiszPj4wXTw8MjQpXng7dD0oQ3x5KV4oZFtiPj4wXXxkW2IrMT4+MF08PDh8ZFtiKzI+PjBdPDwxNnxkW2IrMz4+MF08PDI0KV50O2I9dzt3PWI7YVt3Pj4wXT14O2FbdysxPj4wXT14Pj44O2FbdysyPj4wXT14Pj4xNjthW3crMz4+MF09eD4+MjQ7Yj1iKzR8MDthW2I+PjBdPXQ7YVtiKzE+PjBdPXQ+Pjg7YVtiKzI+PjBdPXQ+PjE2O2FbYiszPj4wXT10Pj4yNDtiPXE7dD1iO2I9Yis0fDA7cj0odnx1KV4oZFt0Pj4wXXxkW3QrMT4+MF08PDh8ZFt0KzI+PjBdPDwxNnxkW3QrMz4+MF08PDI0KV5yO249c14oZFtiPj4wXXxkW2IrMT4+MF08PDh8ZFtiKzI+PjBdPDwxNnxkW2IrMz4+MF08PDI0KV5uO2I9cTtxPWI7YVtxPj4wXT1yO2FbcSsxPj4wXT1yPj44O2FbcSsyPj4wXT1yPj4xNjthW3ErMz4+MF09cj4+MjQ7Yj1iKzR8MDthW2I+PjBdPW47YVtiKzE+PjBdPW4+Pjg7YVtiKzI+PjBdPW4+PjE2O2FbYiszPj4wXT1uPj4yNDtiPWs7bj1iO2I9Yis0fDA7bD0ocHxvKV4oZFtuPj4wXXxkW24rMT4+MF08PDh8ZFtuKzI+PjBdPDwxNnxkW24rMz4+MF08PDI0KV5sO2g9bV4oZFtiPj4wXXxkW2IrMT4+MF08PDh8ZFtiKzI+PjBdPDwxNnxkW2IrMz4+MF08PDI0KV5oO2I9aztrPWI7YVtrPj4wXT1sO2FbaysxPj4wXT1sPj44O2FbaysyPj4wXT1sPj4xNjthW2srMz4+MF09bD4+MjQ7Yj1iKzR8MDthW2I+PjBdPWg7YVtiKzE+PjBdPWg+Pjg7YVtiKzI+PjBdPWg+PjE2O2FbYiszPj4wXT1oPj4yNDtiPWM7aD1iO2I9Yis0fDA7Zj0oanxpKV4oZFtoPj4wXXxkW2grMT4+MF08PDh8ZFtoKzI+PjBdPDwxNnxkW2grMz4+MF08PDI0KV5mO2I9Z14oZFtiPj4wXXxkW2IrMT4+MF08PDh8ZFtiKzI+PjBdPDwxNnxkW2IrMz4+MF08PDI0KV5lO2U9YzthW2U+PjBdPWY7YVtlKzE+PjBdPWY+Pjg7YVtlKzI+PjBdPWY+PjE2O2FbZSszPj4wXT1mPj4yNDtjPWMrNHwwO2FbYz4+MF09YjthW2MrMT4+MF09Yj4+ODthW2MrMj4+MF09Yj4+MTY7YVtjKzM+PjBdPWI+PjI0O3JldHVybn1mdW5jdGlvbiBCYigpe3JldHVybiA2NH1mdW5jdGlvbiBDYihiLGQsZSxmKXtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDt2YXIgZz0wLGg9MCxqPTAsaz0wLGw9MCxtPTAsbj0wO249aTttPWk9aSs2MyYtNjQ7aT1pKzIwOHwwO2c9bSs2NHwwO2g9bTtqPTg7az1oKzY0fDA7ZG97Y1toPj4yXT1jW2o+PjJdO2g9aCs0fDA7aj1qKzR8MH13aGlsZSgoaHwwKTwoa3wwKSk7aD1IZChlfDAsZnwwLDMpfDA7aj1DO2s9R2QoZXwwLGZ8MCw2MSl8MDtsPW0rNzJ8MDtjW2w+PjJdPWg7Y1tsKzQ+PjJdPWo7bD1nO2NbbD4+Ml09aztjW2wrND4+Ml09QztsPW0rODB8MDtpZihmPj4+MDwwfChmfDApPT0wJmU+Pj4wPDEyOCl7SWQobHwwLGR8MCxlfDApfDA7R2IobSxiKTtpPW47cmV0dXJuIDB9aD1sO2o9ZDtrPWgrMTI4fDA7ZG97YVtoPj4wXT1hW2o+PjBdfDA7aD1oKzF8MDtqPWorMXwwfXdoaWxlKChofDApPChrfDApKTtIYihtLGwpO2c9ZCsxMjh8MDtkPURkKGV8MCxmfDAsLTEyOCwtMSl8MDtoPUM7aWYoaD4+PjA+MHwoaHwwKT09MCZkPj4+MD4xMjcpZG97SGIobSxnKTtnPWcrMTI4fDA7ZD1EZChkfDAsaHwwLC0xMjgsLTEpfDA7aD1DfXdoaWxlKGg+Pj4wPjB8KGh8MCk9PTAmZD4+PjA+MTI3KTtJZChsfDAsZ3wwLGR8MCl8MDtHYihtLGIpO2k9bjtyZXR1cm4gMH1mdW5jdGlvbiBEYihiLGQpe2I9YnwwO2Q9ZHwwO3ZhciBlPTAsZj0wLGc9MCxoPTAsaj0wLGs9MCxsPTAsbT0wLG49MDtuPWk7bT1pPWkrNjMmLTY0O2k9aSsxNnwwO2w9YiszMnwwO2U9bDtmPWNbZT4+Ml18MDtlPWNbZSs0Pj4yXXwwO2FbbSs3Pj4wXT1mO2c9R2QoZnwwLGV8MCw4KXwwO2FbbSs2Pj4wXT1nO2c9R2QoZnwwLGV8MCwxNil8MDthW20rNT4+MF09ZztnPUdkKGZ8MCxlfDAsMjQpfDA7YVttKzQ+PjBdPWc7YVttKzM+PjBdPWU7Zz1HZChmfDAsZXwwLDQwKXwwO2FbbSsyPj4wXT1nO2c9R2QoZnwwLGV8MCw0OCl8MDthW20rMT4+MF09ZztnPUdkKGZ8MCxlfDAsNTYpfDA7YVttPj4wXT1nO2c9R2QoZnwwLGV8MCwzKXwwO2c9ZyY2MztrPWc+Pj4wPDU2PzU2OjEyMDtqPWstZ3wwO2RvIGlmKChrfDApIT0oZ3wwKSl7aD1IZChqfDAsMCwzKXwwO2Y9RGQoaHwwLEN8MCxmfDAsZXwwKXwwO2U9QztoPWw7Y1toPj4yXT1mO2NbaCs0Pj4yXT1lO2g9NjQtZ3wwO2c9Yis0MCtnfDA7aWYoaj4+PjA8aD4+PjApe0lkKGd8MCwzMjc5MixqfDApfDA7YnJlYWt9SWQoZ3wwLDMyNzkyLGh8MCl8MDtrPWIrNDB8MDtFYihiLGspO2U9MzI3OTIraHwwO2c9Q2QoanwwLDAsaHwwLDApfDA7Zj1DO2lmKGY+Pj4wPjB8KGZ8MCk9PTAmZz4+PjA+NjMpe2Rve0ViKGIsZSk7ZT1lKzY0fDA7Zz1EZChnfDAsZnwwLC02NCwtMSl8MDtmPUN9d2hpbGUoZj4+PjA+MHwoZnwwKT09MCZnPj4+MD42Myk7Zj1nfWVsc2UgZj1nO0lkKGt8MCxlfDAsZnwwKXwwO2U9bDtmPWNbZT4+Ml18MDtlPWNbZSs0Pj4yXXwwfXdoaWxlKDApO2s9R2QoZnwwLGV8MCwzKXwwO2s9ayY2MztlPURkKGZ8MCxlfDAsNjQsMCl8MDtmPWw7Y1tmPj4yXT1lO2NbZis0Pj4yXT1DO2Y9NjQta3wwO2U9Yis0MCtrfDA7aWYoZj4+PjA+OCl7az1jW20+PjJdfDA7bT1jW20rND4+Ml18MDtsPWU7YVtsPj4wXT1rO2FbbCsxPj4wXT1rPj44O2FbbCsyPj4wXT1rPj4xNjthW2wrMz4+MF09az4+MjQ7ZT1lKzR8MDthW2U+PjBdPW07YVtlKzE+PjBdPW0+Pjg7YVtlKzI+PjBdPW0+PjE2O2FbZSszPj4wXT1tPj4yNDtlPWJ9ZWxzZXtJZChlfDAsbXwwLGZ8MCl8MDtoPWIrNDB8MDtFYihiLGgpO2U9bStmfDA7Zz1DZCg4LDAsZnwwLDApfDA7Zj1DO2lmKGY+Pj4wPjB8KGZ8MCk9PTAmZz4+PjA+NjMpe2Rve0ViKGIsZSk7ZT1lKzY0fDA7Zz1EZChnfDAsZnwwLC02NCwtMSl8MDtmPUN9d2hpbGUoZj4+PjA+MHwoZnwwKT09MCZnPj4+MD42Myk7Zj1nfWVsc2UgZj1nO0lkKGh8MCxlfDAsZnwwKXwwO2U9Yn1lPWNbZT4+Ml18MDthW2QrMz4+MF09ZTthW2QrMj4+MF09ZT4+Pjg7YVtkKzE+PjBdPWU+Pj4xNjthW2Q+PjBdPWU+Pj4yNDtlPWNbYis0Pj4yXXwwO2FbZCs3Pj4wXT1lO2FbZCs2Pj4wXT1lPj4+ODthW2QrNT4+MF09ZT4+PjE2O2FbZCs0Pj4wXT1lPj4+MjQ7ZT1jW2IrOD4+Ml18MDthW2QrMTE+PjBdPWU7YVtkKzEwPj4wXT1lPj4+ODthW2QrOT4+MF09ZT4+PjE2O2FbZCs4Pj4wXT1lPj4+MjQ7ZT1jW2IrMTI+PjJdfDA7YVtkKzE1Pj4wXT1lO2FbZCsxND4+MF09ZT4+Pjg7YVtkKzEzPj4wXT1lPj4+MTY7YVtkKzEyPj4wXT1lPj4+MjQ7ZT1jW2IrMTY+PjJdfDA7YVtkKzE5Pj4wXT1lO2FbZCsxOD4+MF09ZT4+Pjg7YVtkKzE3Pj4wXT1lPj4+MTY7YVtkKzE2Pj4wXT1lPj4+MjQ7ZT1jW2IrMjA+PjJdfDA7YVtkKzIzPj4wXT1lO2FbZCsyMj4+MF09ZT4+Pjg7YVtkKzIxPj4wXT1lPj4+MTY7YVtkKzIwPj4wXT1lPj4+MjQ7ZT1jW2IrMjQ+PjJdfDA7YVtkKzI3Pj4wXT1lO2FbZCsyNj4+MF09ZT4+Pjg7YVtkKzI1Pj4wXT1lPj4+MTY7YVtkKzI0Pj4wXT1lPj4+MjQ7ZT1jW2IrMjg+PjJdfDA7YVtkKzMxPj4wXT1lO2FbZCszMD4+MF09ZT4+Pjg7YVtkKzI5Pj4wXT1lPj4+MTY7YVtkKzI4Pj4wXT1lPj4+MjQ7ZT1iKzEwNHwwO2Rve2FbYj4+MF09MDtiPWIrMXwwfXdoaWxlKChifDApPChlfDApKTtpPW47cmV0dXJufWZ1bmN0aW9uIEViKGEsYil7YT1hfDA7Yj1ifDA7dmFyIGU9MCxmPTAsZz0wLGg9MCxqPTAsaz0wLGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MDtnPWk7Zj1pPWkrNjMmLTY0O2k9aSsyNTZ8MDtlPTA7ZG97aD1iKyhlPDwyKXwwO2NbZisoZTw8Mik+PjJdPShkW2grMj4+MF18MCk8PDh8KGRbaCszPj4wXXwwKXwoZFtoKzE+PjBdfDApPDwxNnwoZFtoPj4wXXwwKTw8MjQ7ZT1lKzF8MH13aGlsZSgoZXwwKSE9MTYpO2I9Y1tmPj4yXXwwO2U9MTY7ZG97aD1jW2YrKGUrLTI8PDIpPj4yXXwwO2o9YjtiPWNbZisoZSstMTU8PDIpPj4yXXwwO2NbZisoZTw8Mik+PjJdPWorKGNbZisoZSstNzw8Mik+PjJdfDApKygoaD4+PjE5fGg8PDEzKV5oPj4+MTBeKGg+Pj4xN3xoPDwxNSkpKygoYj4+PjE4fGI8PDE0KV5iPj4+M14oYj4+Pjd8Yjw8MjUpKTtlPWUrMXwwfXdoaWxlKChlfDApIT02NCk7dT1jW2E+PjJdfDA7cz1hKzR8MDt0PWNbcz4+Ml18MDtxPWErOHwwO3I9Y1txPj4yXXwwO289YSsxMnwwO209YSsxNnwwO249Y1ttPj4yXXwwO2s9YSsyMHwwO2w9Y1trPj4yXXwwO2U9YSsyNHwwO2I9Y1tlPj4yXXwwO2o9YSsyOHwwO2g9KGNbaj4+Ml18MCkrMTExNjM1MjQwOCsoY1tmPj4yXXwwKSsoKG4+Pj42fG48PDI2KV4obj4+PjExfG48PDIxKV4obj4+PjI1fG48PDcpKSsoKGJebCkmbl5iKXwwO3A9KGNbbz4+Ml18MCkraHwwO2g9KChyfHQpJnV8ciZ0KSsoKHU+Pj4yfHU8PDMwKV4odT4+PjEzfHU8PDE5KV4odT4+PjIyfHU8PDEwKSkraHwwO2I9YisxODk5NDQ3NDQxKyhjW2YrND4+Ml18MCkrKChwPj4+NnxwPDwyNileKHA+Pj4xMXxwPDwyMSleKHA+Pj4yNXxwPDw3KSkrKChsXm4pJnBebCl8MDtyPXIrYnwwO2I9KCh0fHUpJmh8dCZ1KSsoKGg+Pj4yfGg8PDMwKV4oaD4+PjEzfGg8PDE5KV4oaD4+PjIyfGg8PDEwKSkrYnwwO2w9bCstMTI0NTY0MzgyNSsoY1tmKzg+PjJdfDApKygocj4+PjZ8cjw8MjYpXihyPj4+MTF8cjw8MjEpXihyPj4+MjV8cjw8NykpKygobl5wKSZyXm4pfDA7dD10K2x8MDtsPSgodXxoKSZifHUmaCkrKChiPj4+MnxiPDwzMCleKGI+Pj4xM3xiPDwxOSleKGI+Pj4yMnxiPDwxMCkpK2x8MDtuPW4rLTM3Mzk1NzcyMysoY1tmKzEyPj4yXXwwKSsoKHQ+Pj42fHQ8PDI2KV4odD4+PjExfHQ8PDIxKV4odD4+PjI1fHQ8PDcpKSsoKHBecikmdF5wKXwwO3U9dStufDA7bj0oKGh8YikmbHxoJmIpKygobD4+PjJ8bDw8MzApXihsPj4+MTN8bDw8MTkpXihsPj4+MjJ8bDw8MTApKStufDA7cD1wKzk2MTk4NzE2MysoY1tmKzE2Pj4yXXwwKSsoKHU+Pj42fHU8PDI2KV4odT4+PjExfHU8PDIxKV4odT4+PjI1fHU8PDcpKSsoKHJedCkmdV5yKXwwO2g9aCtwfDA7cD0oKGJ8bCkmbnxiJmwpKygobj4+PjJ8bjw8MzApXihuPj4+MTN8bjw8MTkpXihuPj4+MjJ8bjw8MTApKStwfDA7cj1yKzE1MDg5NzA5OTMrKGNbZisyMD4+Ml18MCkrKChoPj4+NnxoPDwyNileKGg+Pj4xMXxoPDwyMSleKGg+Pj4yNXxoPDw3KSkrKCh0XnUpJmhedCl8MDtiPWIrcnwwO3I9KChsfG4pJnB8bCZuKSsoKHA+Pj4yfHA8PDMwKV4ocD4+PjEzfHA8PDE5KV4ocD4+PjIyfHA8PDEwKSkrcnwwO3Q9dCstMTg0MTMzMTU0OCsoY1tmKzI0Pj4yXXwwKSsoKGI+Pj42fGI8PDI2KV4oYj4+PjExfGI8PDIxKV4oYj4+PjI1fGI8PDcpKSsoKHVeaCkmYl51KXwwO2w9bCt0fDA7dD0oKG58cCkmcnxuJnApKygocj4+PjJ8cjw8MzApXihyPj4+MTN8cjw8MTkpXihyPj4+MjJ8cjw8MTApKSt0fDA7dT11Ky0xNDI0MjA0MDc1KyhjW2YrMjg+PjJdfDApKygobD4+PjZ8bDw8MjYpXihsPj4+MTF8bDw8MjEpXihsPj4+MjV8bDw8NykpKygoaF5iKSZsXmgpfDA7bj1uK3V8MDt1PSgocHxyKSZ0fHAmcikrKCh0Pj4+Mnx0PDwzMCleKHQ+Pj4xM3x0PDwxOSleKHQ+Pj4yMnx0PDwxMCkpK3V8MDtoPWgrLTY3MDU4NjIxNisoY1tmKzMyPj4yXXwwKSsoKG4+Pj42fG48PDI2KV4obj4+PjExfG48PDIxKV4obj4+PjI1fG48PDcpKSsoKGJebCkmbl5iKXwwO3A9cCtofDA7aD0oKHJ8dCkmdXxyJnQpKygodT4+PjJ8dTw8MzApXih1Pj4+MTN8dTw8MTkpXih1Pj4+MjJ8dTw8MTApKStofDA7Yj1iKzMxMDU5ODQwMSsoY1tmKzM2Pj4yXXwwKSsoKHA+Pj42fHA8PDI2KV4ocD4+PjExfHA8PDIxKV4ocD4+PjI1fHA8PDcpKSsoKGxebikmcF5sKXwwO3I9citifDA7Yj0oKHR8dSkmaHx0JnUpKygoaD4+PjJ8aDw8MzApXihoPj4+MTN8aDw8MTkpXihoPj4+MjJ8aDw8MTApKStifDA7bD1sKzYwNzIyNTI3OCsoY1tmKzQwPj4yXXwwKSsoKHI+Pj42fHI8PDI2KV4ocj4+PjExfHI8PDIxKV4ocj4+PjI1fHI8PDcpKSsoKG5ecCkmcl5uKXwwO3Q9dCtsfDA7bD0oKHV8aCkmYnx1JmgpKygoYj4+PjJ8Yjw8MzApXihiPj4+MTN8Yjw8MTkpXihiPj4+MjJ8Yjw8MTApKStsfDA7bj1uKzE0MjY4ODE5ODcrKGNbZis0ND4+Ml18MCkrKCh0Pj4+Nnx0PDwyNileKHQ+Pj4xMXx0PDwyMSleKHQ+Pj4yNXx0PDw3KSkrKChwXnIpJnRecCl8MDt1PXUrbnwwO249KChofGIpJmx8aCZiKSsoKGw+Pj4yfGw8PDMwKV4obD4+PjEzfGw8PDE5KV4obD4+PjIyfGw8PDEwKSkrbnwwO3A9cCsxOTI1MDc4Mzg4KyhjW2YrNDg+PjJdfDApKygodT4+PjZ8dTw8MjYpXih1Pj4+MTF8dTw8MjEpXih1Pj4+MjV8dTw8NykpKygocl50KSZ1XnIpfDA7aD1oK3B8MDtwPSgoYnxsKSZufGImbCkrKChuPj4+MnxuPDwzMCleKG4+Pj4xM3xuPDwxOSleKG4+Pj4yMnxuPDwxMCkpK3B8MDtyPXIrLTIxMzI4ODkwOTArKGNbZis1Mj4+Ml18MCkrKChoPj4+NnxoPDwyNileKGg+Pj4xMXxoPDwyMSleKGg+Pj4yNXxoPDw3KSkrKCh0XnUpJmhedCl8MDtiPWIrcnwwO3I9KChsfG4pJnB8bCZuKSsoKHA+Pj4yfHA8PDMwKV4ocD4+PjEzfHA8PDE5KV4ocD4+PjIyfHA8PDEwKSkrcnwwO3Q9dCstMTY4MDA3OTE5MysoY1tmKzU2Pj4yXXwwKSsoKGI+Pj42fGI8PDI2KV4oYj4+PjExfGI8PDIxKV4oYj4+PjI1fGI8PDcpKSsoKHVeaCkmYl51KXwwO2w9bCt0fDA7dD0oKG58cCkmcnxuJnApKygocj4+PjJ8cjw8MzApXihyPj4+MTN8cjw8MTkpXihyPj4+MjJ8cjw8MTApKSt0fDA7dT11Ky0xMDQ2NzQ0NzE2KyhjW2YrNjA+PjJdfDApKygobD4+PjZ8bDw8MjYpXihsPj4+MTF8bDw8MjEpXihsPj4+MjV8bDw8NykpKygoaF5iKSZsXmgpfDA7bj1uK3V8MDt1PSgocHxyKSZ0fHAmcikrKCh0Pj4+Mnx0PDwzMCleKHQ+Pj4xM3x0PDwxOSleKHQ+Pj4yMnx0PDwxMCkpK3V8MDtoPWgrLTQ1OTU3Njg5NSsoY1tmKzY0Pj4yXXwwKSsoKG4+Pj42fG48PDI2KV4obj4+PjExfG48PDIxKV4obj4+PjI1fG48PDcpKSsoKGJebCkmbl5iKXwwO3A9cCtofDA7aD0oKHJ8dCkmdXxyJnQpKygodT4+PjJ8dTw8MzApXih1Pj4+MTN8dTw8MTkpXih1Pj4+MjJ8dTw8MTApKStofDA7Yj1iKy0yNzI3NDI1MjIrKGNbZis2OD4+Ml18MCkrKChwPj4+NnxwPDwyNileKHA+Pj4xMXxwPDwyMSleKHA+Pj4yNXxwPDw3KSkrKChsXm4pJnBebCl8MDtyPXIrYnwwO2I9KCh0fHUpJmh8dCZ1KSsoKGg+Pj4yfGg8PDMwKV4oaD4+PjEzfGg8PDE5KV4oaD4+PjIyfGg8PDEwKSkrYnwwO2w9bCsyNjQzNDcwNzgrKGNbZis3Mj4+Ml18MCkrKChyPj4+NnxyPDwyNileKHI+Pj4xMXxyPDwyMSleKHI+Pj4yNXxyPDw3KSkrKChuXnApJnJebil8MDt0PXQrbHwwO2w9KCh1fGgpJmJ8dSZoKSsoKGI+Pj4yfGI8PDMwKV4oYj4+PjEzfGI8PDE5KV4oYj4+PjIyfGI8PDEwKSkrbHwwO249bis2MDQ4MDc2MjgrKGNbZis3Nj4+Ml18MCkrKCh0Pj4+Nnx0PDwyNileKHQ+Pj4xMXx0PDwyMSleKHQ+Pj4yNXx0PDw3KSkrKChwXnIpJnRecCl8MDt1PXUrbnwwO249KChofGIpJmx8aCZiKSsoKGw+Pj4yfGw8PDMwKV4obD4+PjEzfGw8PDE5KV4obD4+PjIyfGw8PDEwKSkrbnwwO3A9cCs3NzAyNTU5ODMrKGNbZis4MD4+Ml18MCkrKCh1Pj4+Nnx1PDwyNileKHU+Pj4xMXx1PDwyMSleKHU+Pj4yNXx1PDw3KSkrKChyXnQpJnVecil8MDtoPWgrcHwwO3A9KChifGwpJm58YiZsKSsoKG4+Pj4yfG48PDMwKV4obj4+PjEzfG48PDE5KV4obj4+PjIyfG48PDEwKSkrcHwwO3I9cisxMjQ5MTUwMTIyKyhjW2YrODQ+PjJdfDApKygoaD4+PjZ8aDw8MjYpXihoPj4+MTF8aDw8MjEpXihoPj4+MjV8aDw8NykpKygodF51KSZoXnQpfDA7Yj1iK3J8MDtyPSgobHxuKSZwfGwmbikrKChwPj4+MnxwPDwzMCleKHA+Pj4xM3xwPDwxOSleKHA+Pj4yMnxwPDwxMCkpK3J8MDt0PXQrMTU1NTA4MTY5MisoY1tmKzg4Pj4yXXwwKSsoKGI+Pj42fGI8PDI2KV4oYj4+PjExfGI8PDIxKV4oYj4+PjI1fGI8PDcpKSsoKHVeaCkmYl51KXwwO2w9bCt0fDA7dD0oKG58cCkmcnxuJnApKygocj4+PjJ8cjw8MzApXihyPj4+MTN8cjw8MTkpXihyPj4+MjJ8cjw8MTApKSt0fDA7dT11KzE5OTYwNjQ5ODYrKGNbZis5Mj4+Ml18MCkrKChsPj4+NnxsPDwyNileKGw+Pj4xMXxsPDwyMSleKGw+Pj4yNXxsPDw3KSkrKChoXmIpJmxeaCl8MDtuPW4rdXwwO3U9KChwfHIpJnR8cCZyKSsoKHQ+Pj4yfHQ8PDMwKV4odD4+PjEzfHQ8PDE5KV4odD4+PjIyfHQ8PDEwKSkrdXwwO2g9aCstMTc0MDc0NjQxNCsoY1tmKzk2Pj4yXXwwKSsoKG4+Pj42fG48PDI2KV4obj4+PjExfG48PDIxKV4obj4+PjI1fG48PDcpKSsoKGJebCkmbl5iKXwwO3A9cCtofDA7aD0oKHJ8dCkmdXxyJnQpKygodT4+PjJ8dTw8MzApXih1Pj4+MTN8dTw8MTkpXih1Pj4+MjJ8dTw8MTApKStofDA7Yj1iKy0xNDczMTMyOTQ3KyhjW2YrMTAwPj4yXXwwKSsoKHA+Pj42fHA8PDI2KV4ocD4+PjExfHA8PDIxKV4ocD4+PjI1fHA8PDcpKSsoKGxebikmcF5sKXwwO3I9citifDA7Yj0oKHR8dSkmaHx0JnUpKygoaD4+PjJ8aDw8MzApXihoPj4+MTN8aDw8MTkpXihoPj4+MjJ8aDw8MTApKStifDA7bD1sKy0xMzQxOTcwNDg4KyhjW2YrMTA0Pj4yXXwwKSsoKHI+Pj42fHI8PDI2KV4ocj4+PjExfHI8PDIxKV4ocj4+PjI1fHI8PDcpKSsoKG5ecCkmcl5uKXwwO3Q9dCtsfDA7bD0oKHV8aCkmYnx1JmgpKygoYj4+PjJ8Yjw8MzApXihiPj4+MTN8Yjw8MTkpXihiPj4+MjJ8Yjw8MTApKStsfDA7bj1uKy0xMDg0NjUzNjI1KyhjW2YrMTA4Pj4yXXwwKSsoKHQ+Pj42fHQ8PDI2KV4odD4+PjExfHQ8PDIxKV4odD4+PjI1fHQ8PDcpKSsoKHBecikmdF5wKXwwO3U9dStufDA7bj0oKGh8YikmbHxoJmIpKygobD4+PjJ8bDw8MzApXihsPj4+MTN8bDw8MTkpXihsPj4+MjJ8bDw8MTApKStufDA7cD1wKy05NTgzOTU0MDUrKGNbZisxMTI+PjJdfDApKygodT4+PjZ8dTw8MjYpXih1Pj4+MTF8dTw8MjEpXih1Pj4+MjV8dTw8NykpKygocl50KSZ1XnIpfDA7aD1oK3B8MDtwPSgoYnxsKSZufGImbCkrKChuPj4+MnxuPDwzMCleKG4+Pj4xM3xuPDwxOSleKG4+Pj4yMnxuPDwxMCkpK3B8MDtyPXIrLTcxMDQzODU4NSsoY1tmKzExNj4+Ml18MCkrKChoPj4+NnxoPDwyNileKGg+Pj4xMXxoPDwyMSleKGg+Pj4yNXxoPDw3KSkrKCh0XnUpJmhedCl8MDtiPWIrcnwwO3I9KChsfG4pJnB8bCZuKSsoKHA+Pj4yfHA8PDMwKV4ocD4+PjEzfHA8PDE5KV4ocD4+PjIyfHA8PDEwKSkrcnwwO3Q9dCsxMTM5MjY5OTMrKGNbZisxMjA+PjJdfDApKygoYj4+PjZ8Yjw8MjYpXihiPj4+MTF8Yjw8MjEpXihiPj4+MjV8Yjw8NykpKygodV5oKSZiXnUpfDA7bD1sK3R8MDt0PSgobnxwKSZyfG4mcCkrKChyPj4+MnxyPDwzMCleKHI+Pj4xM3xyPDwxOSleKHI+Pj4yMnxyPDwxMCkpK3R8MDt1PXUrMzM4MjQxODk1KyhjW2YrMTI0Pj4yXXwwKSsoKGw+Pj42fGw8PDI2KV4obD4+PjExfGw8PDIxKV4obD4+PjI1fGw8PDcpKSsoKGheYikmbF5oKXwwO249bit1fDA7dT0oKHB8cikmdHxwJnIpKygodD4+PjJ8dDw8MzApXih0Pj4+MTN8dDw8MTkpXih0Pj4+MjJ8dDw8MTApKSt1fDA7aD1oKzY2NjMwNzIwNSsoY1tmKzEyOD4+Ml18MCkrKChuPj4+NnxuPDwyNileKG4+Pj4xMXxuPDwyMSleKG4+Pj4yNXxuPDw3KSkrKChiXmwpJm5eYil8MDtwPXAraHwwO2g9KChyfHQpJnV8ciZ0KSsoKHU+Pj4yfHU8PDMwKV4odT4+PjEzfHU8PDE5KV4odT4+PjIyfHU8PDEwKSkraHwwO2I9Yis3NzM1Mjk5MTIrKGNbZisxMzI+PjJdfDApKygocD4+PjZ8cDw8MjYpXihwPj4+MTF8cDw8MjEpXihwPj4+MjV8cDw8NykpKygobF5uKSZwXmwpfDA7cj1yK2J8MDtiPSgodHx1KSZofHQmdSkrKChoPj4+MnxoPDwzMCleKGg+Pj4xM3xoPDwxOSleKGg+Pj4yMnxoPDwxMCkpK2J8MDtsPWwrMTI5NDc1NzM3MisoY1tmKzEzNj4+Ml18MCkrKChyPj4+NnxyPDwyNileKHI+Pj4xMXxyPDwyMSleKHI+Pj4yNXxyPDw3KSkrKChuXnApJnJebil8MDt0PXQrbHwwO2w9KCh1fGgpJmJ8dSZoKSsoKGI+Pj4yfGI8PDMwKV4oYj4+PjEzfGI8PDE5KV4oYj4+PjIyfGI8PDEwKSkrbHwwO249bisxMzk2MTgyMjkxKyhjW2YrMTQwPj4yXXwwKSsoKHQ+Pj42fHQ8PDI2KV4odD4+PjExfHQ8PDIxKV4odD4+PjI1fHQ8PDcpKSsoKHBecikmdF5wKXwwO3U9dStufDA7bj0oKGh8YikmbHxoJmIpKygobD4+PjJ8bDw8MzApXihsPj4+MTN8bDw8MTkpXihsPj4+MjJ8bDw8MTApKStufDA7cD1wKzE2OTUxODM3MDArKGNbZisxNDQ+PjJdfDApKygodT4+PjZ8dTw8MjYpXih1Pj4+MTF8dTw8MjEpXih1Pj4+MjV8dTw8NykpKygocl50KSZ1XnIpfDA7aD1oK3B8MDtwPSgoYnxsKSZufGImbCkrKChuPj4+MnxuPDwzMCleKG4+Pj4xM3xuPDwxOSleKG4+Pj4yMnxuPDwxMCkpK3B8MDtyPXIrMTk4NjY2MTA1MSsoY1tmKzE0OD4+Ml18MCkrKChoPj4+NnxoPDwyNileKGg+Pj4xMXxoPDwyMSleKGg+Pj4yNXxoPDw3KSkrKCh0XnUpJmhedCl8MDtiPWIrcnwwO3I9KChsfG4pJnB8bCZuKSsoKHA+Pj4yfHA8PDMwKV4ocD4+PjEzfHA8PDE5KV4ocD4+PjIyfHA8PDEwKSkrcnwwO3Q9dCstMjExNzk0MDk0NisoY1tmKzE1Mj4+Ml18MCkrKChiPj4+NnxiPDwyNileKGI+Pj4xMXxiPDwyMSleKGI+Pj4yNXxiPDw3KSkrKCh1XmgpJmJedSl8MDtsPWwrdHwwO3Q9KChufHApJnJ8biZwKSsoKHI+Pj4yfHI8PDMwKV4ocj4+PjEzfHI8PDE5KV4ocj4+PjIyfHI8PDEwKSkrdHwwO3U9dSstMTgzODAxMTI1OSsoY1tmKzE1Nj4+Ml18MCkrKChsPj4+NnxsPDwyNileKGw+Pj4xMXxsPDwyMSleKGw+Pj4yNXxsPDw3KSkrKChoXmIpJmxeaCl8MDtuPW4rdXwwO3U9KChwfHIpJnR8cCZyKSsoKHQ+Pj4yfHQ8PDMwKV4odD4+PjEzfHQ8PDE5KV4odD4+PjIyfHQ8PDEwKSkrdXwwO2g9aCstMTU2NDQ4MTM3NSsoY1tmKzE2MD4+Ml18MCkrKChuPj4+NnxuPDwyNileKG4+Pj4xMXxuPDwyMSleKG4+Pj4yNXxuPDw3KSkrKChiXmwpJm5eYil8MDtwPXAraHwwO2g9KChyfHQpJnV8ciZ0KSsoKHU+Pj4yfHU8PDMwKV4odT4+PjEzfHU8PDE5KV4odT4+PjIyfHU8PDEwKSkraHwwO2I9YistMTQ3NDY2NDg4NSsoY1tmKzE2ND4+Ml18MCkrKChwPj4+NnxwPDwyNileKHA+Pj4xMXxwPDwyMSleKHA+Pj4yNXxwPDw3KSkrKChsXm4pJnBebCl8MDtyPXIrYnwwO2I9KCh0fHUpJmh8dCZ1KSsoKGg+Pj4yfGg8PDMwKV4oaD4+PjEzfGg8PDE5KV4oaD4+PjIyfGg8PDEwKSkrYnwwO2w9bCstMTAzNTIzNjQ5NisoY1tmKzE2OD4+Ml18MCkrKChyPj4+NnxyPDwyNileKHI+Pj4xMXxyPDwyMSleKHI+Pj4yNXxyPDw3KSkrKChuXnApJnJebil8MDt0PXQrbHwwO2w9KCh1fGgpJmJ8dSZoKSsoKGI+Pj4yfGI8PDMwKV4oYj4+PjEzfGI8PDE5KV4oYj4+PjIyfGI8PDEwKSkrbHwwO249bistOTQ5MjAyNTI1KyhjW2YrMTcyPj4yXXwwKSsoKHQ+Pj42fHQ8PDI2KV4odD4+PjExfHQ8PDIxKV4odD4+PjI1fHQ8PDcpKSsoKHBecikmdF5wKXwwO3U9dStufDA7bj0oKGh8YikmbHxoJmIpKygobD4+PjJ8bDw8MzApXihsPj4+MTN8bDw8MTkpXihsPj4+MjJ8bDw8MTApKStufDA7cD1wKy03Nzg5MDE0NzkrKGNbZisxNzY+PjJdfDApKygodT4+PjZ8dTw8MjYpXih1Pj4+MTF8dTw8MjEpXih1Pj4+MjV8dTw8NykpKygocl50KSZ1XnIpfDA7aD1oK3B8MDtwPSgoYnxsKSZufGImbCkrKChuPj4+MnxuPDwzMCleKG4+Pj4xM3xuPDwxOSleKG4+Pj4yMnxuPDwxMCkpK3B8MDtyPXIrLTY5NDYxNDQ5MisoY1tmKzE4MD4+Ml18MCkrKChoPj4+NnxoPDwyNileKGg+Pj4xMXxoPDwyMSleKGg+Pj4yNXxoPDw3KSkrKCh0XnUpJmhedCl8MDtiPWIrcnwwO3I9KChsfG4pJnB8bCZuKSsoKHA+Pj4yfHA8PDMwKV4ocD4+PjEzfHA8PDE5KV4ocD4+PjIyfHA8PDEwKSkrcnwwO3Q9dCstMjAwMzk1Mzg3KyhjW2YrMTg0Pj4yXXwwKSsoKGI+Pj42fGI8PDI2KV4oYj4+PjExfGI8PDIxKV4oYj4+PjI1fGI8PDcpKSsoKHVeaCkmYl51KXwwO2w9bCt0fDA7dD0oKG58cCkmcnxuJnApKygocj4+PjJ8cjw8MzApXihyPj4+MTN8cjw8MTkpXihyPj4+MjJ8cjw8MTApKSt0fDA7dT11KzI3NTQyMzM0NCsoY1tmKzE4OD4+Ml18MCkrKChsPj4+NnxsPDwyNileKGw+Pj4xMXxsPDwyMSleKGw+Pj4yNXxsPDw3KSkrKChoXmIpJmxeaCl8MDtuPW4rdXwwO3U9KChwfHIpJnR8cCZyKSsoKHQ+Pj4yfHQ8PDMwKV4odD4+PjEzfHQ8PDE5KV4odD4+PjIyfHQ8PDEwKSkrdXwwO2g9aCs0MzAyMjc3MzQrKGNbZisxOTI+PjJdfDApKygobj4+PjZ8bjw8MjYpXihuPj4+MTF8bjw8MjEpXihuPj4+MjV8bjw8NykpKygoYl5sKSZuXmIpfDA7cD1wK2h8MDtoPSgocnx0KSZ1fHImdCkrKCh1Pj4+Mnx1PDwzMCleKHU+Pj4xM3x1PDwxOSleKHU+Pj4yMnx1PDwxMCkpK2h8MDtiPWIrNTA2OTQ4NjE2KyhjW2YrMTk2Pj4yXXwwKSsoKHA+Pj42fHA8PDI2KV4ocD4+PjExfHA8PDIxKV4ocD4+PjI1fHA8PDcpKSsoKGxebikmcF5sKXwwO3I9citifDA7Yj0oKHR8dSkmaHx0JnUpKygoaD4+PjJ8aDw8MzApXihoPj4+MTN8aDw8MTkpXihoPj4+MjJ8aDw8MTApKStifDA7bD1sKzY1OTA2MDU1NisoY1tmKzIwMD4+Ml18MCkrKChyPj4+NnxyPDwyNileKHI+Pj4xMXxyPDwyMSleKHI+Pj4yNXxyPDw3KSkrKChuXnApJnJebil8MDt0PXQrbHwwO2w9KCh1fGgpJmJ8dSZoKSsoKGI+Pj4yfGI8PDMwKV4oYj4+PjEzfGI8PDE5KV4oYj4+PjIyfGI8PDEwKSkrbHwwO249bis4ODM5OTc4NzcrKGNbZisyMDQ+PjJdfDApKygodD4+PjZ8dDw8MjYpXih0Pj4+MTF8dDw8MjEpXih0Pj4+MjV8dDw8NykpKygocF5yKSZ0XnApfDA7dT11K258MDtuPSgoaHxiKSZsfGgmYikrKChsPj4+MnxsPDwzMCleKGw+Pj4xM3xsPDwxOSleKGw+Pj4yMnxsPDwxMCkpK258MDtwPXArOTU4MTM5NTcxKyhjW2YrMjA4Pj4yXXwwKSsoKHU+Pj42fHU8PDI2KV4odT4+PjExfHU8PDIxKV4odT4+PjI1fHU8PDcpKSsoKHJedCkmdV5yKXwwO2g9aCtwfDA7cD0oKGJ8bCkmbnxiJmwpKygobj4+PjJ8bjw8MzApXihuPj4+MTN8bjw8MTkpXihuPj4+MjJ8bjw8MTApKStwfDA7cj1yKzEzMjI4MjIyMTgrKGNbZisyMTI+PjJdfDApKygoaD4+PjZ8aDw8MjYpXihoPj4+MTF8aDw8MjEpXihoPj4+MjV8aDw8NykpKygodF51KSZoXnQpfDA7Yj1iK3J8MDtyPSgobHxuKSZwfGwmbikrKChwPj4+MnxwPDwzMCleKHA+Pj4xM3xwPDwxOSleKHA+Pj4yMnxwPDwxMCkpK3J8MDt0PXQrMTUzNzAwMjA2MysoY1tmKzIxNj4+Ml18MCkrKChiPj4+NnxiPDwyNileKGI+Pj4xMXxiPDwyMSleKGI+Pj4yNXxiPDw3KSkrKCh1XmgpJmJedSl8MDtsPWwrdHwwO3Q9KChufHApJnJ8biZwKSsoKHI+Pj4yfHI8PDMwKV4ocj4+PjEzfHI8PDE5KV4ocj4+PjIyfHI8PDEwKSkrdHwwO3U9dSsxNzQ3ODczNzc5KyhjW2YrMjIwPj4yXXwwKSsoKGw+Pj42fGw8PDI2KV4obD4+PjExfGw8PDIxKV4obD4+PjI1fGw8PDcpKSsoKGheYikmbF5oKXwwO249bit1fDA7dT0oKHB8cikmdHxwJnIpKygodD4+PjJ8dDw8MzApXih0Pj4+MTN8dDw8MTkpXih0Pj4+MjJ8dDw8MTApKSt1fDA7aD1oKzE5NTU1NjIyMjIrKGNbZisyMjQ+PjJdfDApKygobj4+PjZ8bjw8MjYpXihuPj4+MTF8bjw8MjEpXihuPj4+MjV8bjw8NykpKygoYl5sKSZuXmIpfDA7cD1wK2h8MDtoPSgocnx0KSZ1fHImdCkrKCh1Pj4+Mnx1PDwzMCleKHU+Pj4xM3x1PDwxOSleKHU+Pj4yMnx1PDwxMCkpK2h8MDtiPWIrMjAyNDEwNDgxNSsoY1tmKzIyOD4+Ml18MCkrKChwPj4+NnxwPDwyNileKHA+Pj4xMXxwPDwyMSleKHA+Pj4yNXxwPDw3KSkrKChsXm4pJnBebCl8MDtyPXIrYnwwO2I9KCh0fHUpJmh8dCZ1KSsoKGg+Pj4yfGg8PDMwKV4oaD4+PjEzfGg8PDE5KV4oaD4+PjIyfGg8PDEwKSkrYnwwO2w9bCstMjA2NzIzNjg0NCsoY1tmKzIzMj4+Ml18MCkrKChyPj4+NnxyPDwyNileKHI+Pj4xMXxyPDwyMSleKHI+Pj4yNXxyPDw3KSkrKChuXnApJnJebil8MDt0PXQrbHwwO2w9KCh1fGgpJmJ8dSZoKSsoKGI+Pj4yfGI8PDMwKV4oYj4+PjEzfGI8PDE5KV4oYj4+PjIyfGI8PDEwKSkrbHwwO249bistMTkzMzExNDg3MisoY1tmKzIzNj4+Ml18MCkrKCh0Pj4+Nnx0PDwyNileKHQ+Pj4xMXx0PDwyMSleKHQ+Pj4yNXx0PDw3KSkrKChwXnIpJnRecCl8MDt1PXUrbnwwO249KChofGIpJmx8aCZiKSsoKGw+Pj4yfGw8PDMwKV4obD4+PjEzfGw8PDE5KV4obD4+PjIyfGw8PDEwKSkrbnwwO3A9cCstMTg2NjUzMDgyMisoY1tmKzI0MD4+Ml18MCkrKCh1Pj4+Nnx1PDwyNileKHU+Pj4xMXx1PDwyMSleKHU+Pj4yNXx1PDw3KSkrKChyXnQpJnVecil8MDtoPWgrcHwwO3A9KChifGwpJm58YiZsKSsoKG4+Pj4yfG48PDMwKV4obj4+PjEzfG48PDE5KV4obj4+PjIyfG48PDEwKSkrcHwwO3I9cistMTUzODIzMzEwOSsoY1tmKzI0ND4+Ml18MCkrKChoPj4+NnxoPDwyNileKGg+Pj4xMXxoPDwyMSleKGg+Pj4yNXxoPDw3KSkrKCh0XnUpJmhedCl8MDtiPWIrcnwwO3I9KChsfG4pJnB8bCZuKSsoKHA+Pj4yfHA8PDMwKV4ocD4+PjEzfHA8PDE5KV4ocD4+PjIyfHA8PDEwKSkrcnwwO3Q9dCstMTA5MDkzNTgxNysoY1tmKzI0OD4+Ml18MCkrKChiPj4+NnxiPDwyNileKGI+Pj4xMXxiPDwyMSleKGI+Pj4yNXxiPDw3KSkrKCh1XmgpJmJedSl8MDtsPWwrdHwwO3Q9KChufHApJnJ8biZwKSsoKHI+Pj4yfHI8PDMwKV4ocj4+PjEzfHI8PDE5KV4ocj4+PjIyfHI8PDEwKSkrdHwwO2Y9dSstOTY1NjQxOTk4KyhjW2YrMjUyPj4yXXwwKSsoKGw+Pj42fGw8PDI2KV4obD4+PjExfGw8PDIxKV4obD4+PjI1fGw8PDcpKSsoKGheYikmbF5oKXwwO2NbYT4+Ml09KGNbYT4+Ml18MCkrKCgocHxyKSZ0fHAmcikrKCh0Pj4+Mnx0PDwzMCleKHQ+Pj4xM3x0PDwxOSleKHQ+Pj4yMnx0PDwxMCkpK2YpO2Nbcz4+Ml09KGNbcz4+Ml18MCkrdDtjW3E+PjJdPShjW3E+PjJdfDApK3I7Y1tvPj4yXT0oY1tvPj4yXXwwKStwO2NbbT4+Ml09KGNbbT4+Ml18MCkrKG4rZik7Y1trPj4yXT0oY1trPj4yXXwwKStsO2NbZT4+Ml09KGNbZT4+Ml18MCkrYjtjW2o+PjJdPShjW2o+PjJdfDApK2g7aT1nO3JldHVybn1mdW5jdGlvbiBGYihhLGIsZCxlKXthPWF8MDtiPWJ8MDtkPWR8MDtlPWV8MDt2YXIgZj0wLGc9MCxoPTAsaT0wLGo9MCxrPTAsbD0wLG09MCxuPTAsbz0wO2o9YSs3MnwwO209ajtvPWNbbT4+Ml18MDttPWNbbSs0Pj4yXXwwO2s9R2Qob3wwLG18MCwzKXwwO2s9ayYxMjc7bD1IZChkfDAsZXwwLDMpfDA7bj1DO2g9R2QoZHwwLGV8MCw2MSl8MDtpPUM7bT1EZChvfDAsbXwwLGx8MCxufDApfDA7bz1DO2Nbaj4+Ml09bTtjW2orND4+Ml09bztqPWErNjR8MDtnPWo7Zj1jW2c+PjJdfDA7Zz1jW2crND4+Ml18MDtpZihvPj4+MDxuPj4+MHwob3wwKT09KG58MCkmbT4+PjA8bD4+PjApe2Y9RGQoZnwwLGd8MCwxLDApfDA7Zz1DO289ajtjW28+PjJdPWY7Y1tvKzQ+PjJdPWd9aD1EZChmfDAsZ3wwLGh8MCxpfDApfDA7Zz1qO2NbZz4+Ml09aDtjW2crND4+Ml09QztnPUNkKDEyOCwwLGt8MCwwKXwwO2g9QztmPWErODAra3wwO2lmKGg+Pj4wPmU+Pj4wfChofDApPT0oZXwwKSZnPj4+MD5kPj4+MCl7SWQoZnwwLGJ8MCxkfDApfDA7cmV0dXJufUlkKGZ8MCxifDAsZ3wwKXwwO2k9YSs4MHwwO0hiKGEsaSk7Zj1iK2d8MDtnPUNkKGR8MCxlfDAsZ3wwLGh8MCl8MDtoPUM7aWYoaD4+PjA+MHwoaHwwKT09MCZnPj4+MD4xMjcpZG97SGIoYSxmKTtmPWYrMTI4fDA7Zz1EZChnfDAsaHwwLC0xMjgsLTEpfDA7aD1DfXdoaWxlKGg+Pj4wPjB8KGh8MCk9PTAmZz4+PjA+MTI3KTtJZChpfDAsZnwwLGd8MCl8MDtyZXR1cm59ZnVuY3Rpb24gR2IoYixkKXtiPWJ8MDtkPWR8MDt2YXIgZT0wLGY9MCxnPTAsaD0wLGo9MCxrPTAsbD0wLG09MCxuPTAsbz0wLHA9MCxxPTAscj0wLHM9MCx0PTAsdT0wO3M9aTtlPWk9aSs2MyYtNjQ7aT1pKzE2fDA7cj1iKzY0fDA7Zj1yO2c9Y1tmPj4yXXwwO2Y9Y1tmKzQ+PjJdfDA7YVtlKzc+PjBdPWc7cT1HZChnfDAsZnwwLDgpfDA7YVtlKzY+PjBdPXE7cT1HZChnfDAsZnwwLDE2KXwwO2FbZSs1Pj4wXT1xO3E9R2QoZ3wwLGZ8MCwyNCl8MDthW2UrND4+MF09cTthW2UrMz4+MF09ZjtxPUdkKGd8MCxmfDAsNDApfDA7YVtlKzI+PjBdPXE7cT1HZChnfDAsZnwwLDQ4KXwwO2FbZSsxPj4wXT1xO3E9R2QoZ3wwLGZ8MCw1Nil8MDthW2U+PjBdPXE7cT1iKzcyfDA7aj1xO2g9Y1tqPj4yXXwwO2o9Y1tqKzQ+PjJdfDA7YVtlKzE1Pj4wXT1oO249R2QoaHwwLGp8MCw4KXwwO2FbZSsxND4+MF09bjtuPUdkKGh8MCxqfDAsMTYpfDA7YVtlKzEzPj4wXT1uO249R2QoaHwwLGp8MCwyNCl8MDthW2UrMTI+PjBdPW47YVtlKzExPj4wXT1qO249R2QoaHwwLGp8MCw0MCl8MDthW2UrMTA+PjBdPW47bj1HZChofDAsanwwLDQ4KXwwO2FbZSs5Pj4wXT1uO249R2QoaHwwLGp8MCw1Nil8MDthW2UrOD4+MF09bjtuPUdkKGh8MCxqfDAsMyl8MDtuPW4mMTI3O289MDwwfDA9PTAmbj4+PjA8MTEyO289Q2QoKG8/MTEyOjI0MCl8MCwobz8wOjApfDAsbnwwLDApfDA7cD1DO209SGQob3wwLHB8MCwzKXwwO3Q9QztrPUdkKG98MCxwfDAsNjEpfDA7bD1DO2o9RGQobXwwLHR8MCxofDAsanwwKXwwO2g9Qzt1PXE7Y1t1Pj4yXT1qO2NbdSs0Pj4yXT1oO2lmKGg+Pj4wPHQ+Pj4wfChofDApPT0odHwwKSZqPj4+MDxtPj4+MCl7Zz1EZChnfDAsZnwwLDEsMCl8MDtmPUM7dT1yO2NbdT4+Ml09ZztjW3UrND4+Ml09Zn1nPURkKGd8MCxmfDAsa3wwLGx8MCl8MDtmPUM7bD1yO2NbbD4+Ml09ZztjW2wrND4+Ml09ZjtsPUNkKDEyOCwwLG58MCwwKXwwO209QztrPWIrODArbnwwO2lmKHA+Pj4wPG0+Pj4wfChwfDApPT0obXwwKSZvPj4+MDxsPj4+MClJZChrfDAsMzI4NTYsb3wwKXwwO2Vsc2V7SWQoa3wwLDMyODU2LGx8MCl8MDtqPWIrODB8MDtIYihiLGopO2Y9MzI4NTYrbHwwO2c9Q2Qob3wwLHB8MCxsfDAsbXwwKXwwO2g9QztpZihoPj4+MD4wfChofDApPT0wJmc+Pj4wPjEyNylkb3tIYihiLGYpO2Y9ZisxMjh8MDtnPURkKGd8MCxofDAsLTEyOCwtMSl8MDtoPUN9d2hpbGUoaD4+PjA+MHwoaHwwKT09MCZnPj4+MD4xMjcpO0lkKGp8MCxmfDAsZ3wwKXwwO2g9cTtmPXI7aj1jW2g+PjJdfDA7aD1jW2grND4+Ml18MDtnPWNbZj4+Ml18MDtmPWNbZis0Pj4yXXwwfWs9R2QoanwwLGh8MCwzKXwwO2s9ayYxMjc7dD1EZChqfDAsaHwwLDEyOCwwKXwwO3U9cTtjW3U+PjJdPXQ7Y1t1KzQ+PjJdPUM7aWYoaD4+PjA+NDI5NDk2NzI5NXwoaHwwKT09LTEmaj4+PjA+NDI5NDk2NzE2Nyl7Zz1EZChnfDAsZnwwLDEsMCl8MDtmPUM7dT1yO2NbdT4+Ml09ZztjW3UrND4+Ml09Zn1oPXI7Y1toPj4yXT1nO2NbaCs0Pj4yXT1mO2c9Q2QoMTI4LDAsa3wwLDApfDA7aD1DO2Y9Yis4MCtrfDA7aWYoaD4+PjA+MHwoaHwwKT09MCZnPj4+MD4xNil7Zz1mO2Y9ZysxNnwwO2Rve2FbZz4+MF09YVtlPj4wXXwwO2c9ZysxfDA7ZT1lKzF8MH13aGlsZSgoZ3wwKTwoZnwwKSl9ZWxzZXtJZChmfDAsZXwwLGd8MCl8MDtqPWIrODB8MDtIYihiLGopO2U9ZStnfDA7Zj1DZCgxNiwwLGd8MCxofDApfDA7Zz1DO2lmKGc+Pj4wPjB8KGd8MCk9PTAmZj4+PjA+MTI3KWRve0hiKGIsZSk7ZT1lKzEyOHwwO2Y9RGQoZnwwLGd8MCwtMTI4LC0xKXwwO2c9Q313aGlsZShnPj4+MD4wfChnfDApPT0wJmY+Pj4wPjEyNyk7SWQoanwwLGV8MCxmfDApfDB9ZT0wO2Rve3U9ZCsoZTw8Myl8MDt0PWIrKGU8PDMpfDA7cj1jW3Q+PjJdfDA7dD1jW3QrND4+Ml18MDthW3UrNz4+MF09cjtxPUdkKHJ8MCx0fDAsOCl8MDthW3UrNj4+MF09cTtxPUdkKHJ8MCx0fDAsMTYpfDA7YVt1KzU+PjBdPXE7cT1HZChyfDAsdHwwLDI0KXwwO2FbdSs0Pj4wXT1xO2FbdSszPj4wXT10O3E9R2QocnwwLHR8MCw0MCl8MDthW3UrMj4+MF09cTtxPUdkKHJ8MCx0fDAsNDgpfDA7YVt1KzE+PjBdPXE7dD1HZChyfDAsdHwwLDU2KXwwO2FbdT4+MF09dDtlPWUrMXwwfXdoaWxlKChlfDApIT04KTtGZChifDAsMCwyMDgpfDA7aT1zO3JldHVybn1cbmZ1bmN0aW9uIHlkKGEpe2E9YXwwO3ZhciBiPTAsZD0wLGU9MCxmPTAsZz0wLGg9MCxpPTAsaj0wLGs9MCxsPTAsbT0wLG49MCxvPTAscD0wLHE9MCxyPTAscz0wLHQ9MCx1PTAsdj0wLHc9MCx4PTAseT0wLHo9MCxBPTAsQj0wLEM9MCxEPTAsRT0wLEY9MCxHPTA7ZG8gaWYoYT4+PjA8MjQ1KXtvPWE+Pj4wPDExPzE2OmErMTEmLTg7YT1vPj4+MztqPWNbODAyMF18MDtiPWo+Pj5hO2lmKGImMyl7Yj0oYiYxXjEpK2F8MDtkPTMyMTIwKyhiPDwxPDwyKXwwO2U9ZCs4fDA7Zj1jW2U+PjJdfDA7Zz1mKzh8MDtoPWNbZz4+Ml18MDtkbyBpZigoZHwwKSE9KGh8MCkpe2lmKGg+Pj4wPChjWzgwMjRdfDApPj4+MClyYSgpO2E9aCsxMnwwO2lmKChjW2E+PjJdfDApPT0oZnwwKSl7Y1thPj4yXT1kO2NbZT4+Ml09aDticmVha31lbHNlIHJhKCl9ZWxzZSBjWzgwMjBdPWomfigxPDxiKTt3aGlsZSgwKTtHPWI8PDM7Y1tmKzQ+PjJdPUd8MztHPWYrRys0fDA7Y1tHPj4yXT1jW0c+PjJdfDE7Rz1nO3JldHVybiBHfDB9aD1jWzgwMjJdfDA7aWYobz4+PjA+aD4+PjApe2lmKGIpe2Q9Mjw8YTtkPWI8PGEmKGR8MC1kKTtkPShkJjAtZCkrLTF8MDtpPWQ+Pj4xMiYxNjtkPWQ+Pj5pO2Y9ZD4+PjUmODtkPWQ+Pj5mO2c9ZD4+PjImNDtkPWQ+Pj5nO2U9ZD4+PjEmMjtkPWQ+Pj5lO2I9ZD4+PjEmMTtiPShmfGl8Z3xlfGIpKyhkPj4+Yil8MDtkPTMyMTIwKyhiPDwxPDwyKXwwO2U9ZCs4fDA7Zz1jW2U+PjJdfDA7aT1nKzh8MDtmPWNbaT4+Ml18MDtkbyBpZigoZHwwKSE9KGZ8MCkpe2lmKGY+Pj4wPChjWzgwMjRdfDApPj4+MClyYSgpO2E9ZisxMnwwO2lmKChjW2E+PjJdfDApPT0oZ3wwKSl7Y1thPj4yXT1kO2NbZT4+Ml09ZjtrPWNbODAyMl18MDticmVha31lbHNlIHJhKCl9ZWxzZXtjWzgwMjBdPWomfigxPDxiKTtrPWh9d2hpbGUoMCk7aD0oYjw8Myktb3wwO2NbZys0Pj4yXT1vfDM7ZT1nK298MDtjW2UrND4+Ml09aHwxO2NbZStoPj4yXT1oO2lmKGspe2Y9Y1s4MDI1XXwwO2I9az4+PjM7ZD0zMjEyMCsoYjw8MTw8Mil8MDthPWNbODAyMF18MDtiPTE8PGI7aWYoYSZiKXthPWQrOHwwO2I9Y1thPj4yXXwwO2lmKGI+Pj4wPChjWzgwMjRdfDApPj4+MClyYSgpO2Vsc2V7bD1hO209Yn19ZWxzZXtjWzgwMjBdPWF8YjtsPWQrOHwwO209ZH1jW2w+PjJdPWY7Y1ttKzEyPj4yXT1mO2NbZis4Pj4yXT1tO2NbZisxMj4+Ml09ZH1jWzgwMjJdPWg7Y1s4MDI1XT1lO0c9aTtyZXR1cm4gR3wwfWE9Y1s4MDIxXXwwO2lmKGEpe2k9KGEmMC1hKSstMXwwO0Y9aT4+PjEyJjE2O2k9aT4+PkY7RT1pPj4+NSY4O2k9aT4+PkU7Rz1pPj4+MiY0O2k9aT4+Pkc7Yj1pPj4+MSYyO2k9aT4+PmI7aj1pPj4+MSYxO2o9Y1szMjM4NCsoKEV8RnxHfGJ8aikrKGk+Pj5qKTw8Mik+PjJdfDA7aT0oY1tqKzQ+PjJdJi04KS1vfDA7Yj1qO3doaWxlKDEpe2E9Y1tiKzE2Pj4yXXwwO2lmKCFhKXthPWNbYisyMD4+Ml18MDtpZighYSlicmVha31iPShjW2ErND4+Ml0mLTgpLW98MDtHPWI+Pj4wPGk+Pj4wO2k9Rz9iOmk7Yj1hO2o9Rz9hOmp9Zj1jWzgwMjRdfDA7aWYoaj4+PjA8Zj4+PjApcmEoKTtoPWorb3wwO2lmKGo+Pj4wPj1oPj4+MClyYSgpO2c9Y1tqKzI0Pj4yXXwwO2Q9Y1tqKzEyPj4yXXwwO2RvIGlmKChkfDApPT0oanwwKSl7Yj1qKzIwfDA7YT1jW2I+PjJdfDA7aWYoIWEpe2I9aisxNnwwO2E9Y1tiPj4yXXwwO2lmKCFhKXtuPTA7YnJlYWt9fXdoaWxlKDEpe2Q9YSsyMHwwO2U9Y1tkPj4yXXwwO2lmKGUpe2E9ZTtiPWQ7Y29udGludWV9ZD1hKzE2fDA7ZT1jW2Q+PjJdfDA7aWYoIWUpYnJlYWs7ZWxzZXthPWU7Yj1kfX1pZihiPj4+MDxmPj4+MClyYSgpO2Vsc2V7Y1tiPj4yXT0wO249YTticmVha319ZWxzZXtlPWNbais4Pj4yXXwwO2lmKGU+Pj4wPGY+Pj4wKXJhKCk7YT1lKzEyfDA7aWYoKGNbYT4+Ml18MCkhPShqfDApKXJhKCk7Yj1kKzh8MDtpZigoY1tiPj4yXXwwKT09KGp8MCkpe2NbYT4+Ml09ZDtjW2I+PjJdPWU7bj1kO2JyZWFrfWVsc2UgcmEoKX13aGlsZSgwKTtkbyBpZihnKXthPWNbaisyOD4+Ml18MDtiPTMyMzg0KyhhPDwyKXwwO2lmKChqfDApPT0oY1tiPj4yXXwwKSl7Y1tiPj4yXT1uO2lmKCFuKXtjWzgwMjFdPWNbODAyMV0mfigxPDxhKTticmVha319ZWxzZXtpZihnPj4+MDwoY1s4MDI0XXwwKT4+PjApcmEoKTthPWcrMTZ8MDtpZigoY1thPj4yXXwwKT09KGp8MCkpY1thPj4yXT1uO2Vsc2UgY1tnKzIwPj4yXT1uO2lmKCFuKWJyZWFrfWI9Y1s4MDI0XXwwO2lmKG4+Pj4wPGI+Pj4wKXJhKCk7Y1tuKzI0Pj4yXT1nO2E9Y1tqKzE2Pj4yXXwwO2RvIGlmKGEpaWYoYT4+PjA8Yj4+PjApcmEoKTtlbHNle2NbbisxNj4+Ml09YTtjW2ErMjQ+PjJdPW47YnJlYWt9d2hpbGUoMCk7YT1jW2orMjA+PjJdfDA7aWYoYSlpZihhPj4+MDwoY1s4MDI0XXwwKT4+PjApcmEoKTtlbHNle2NbbisyMD4+Ml09YTtjW2ErMjQ+PjJdPW47YnJlYWt9fXdoaWxlKDApO2lmKGk+Pj4wPDE2KXtHPWkrb3wwO2Nbais0Pj4yXT1HfDM7Rz1qK0crNHwwO2NbRz4+Ml09Y1tHPj4yXXwxfWVsc2V7Y1tqKzQ+PjJdPW98MztjW2grND4+Ml09aXwxO2NbaCtpPj4yXT1pO2E9Y1s4MDIyXXwwO2lmKGEpe2U9Y1s4MDI1XXwwO2I9YT4+PjM7ZD0zMjEyMCsoYjw8MTw8Mil8MDthPWNbODAyMF18MDtiPTE8PGI7aWYoYSZiKXthPWQrOHwwO2I9Y1thPj4yXXwwO2lmKGI+Pj4wPChjWzgwMjRdfDApPj4+MClyYSgpO2Vsc2V7cD1hO3E9Yn19ZWxzZXtjWzgwMjBdPWF8YjtwPWQrOHwwO3E9ZH1jW3A+PjJdPWU7Y1txKzEyPj4yXT1lO2NbZSs4Pj4yXT1xO2NbZSsxMj4+Ml09ZH1jWzgwMjJdPWk7Y1s4MDI1XT1ofUc9ais4fDA7cmV0dXJuIEd8MH19fWVsc2UgaWYoYT4+PjA8PTQyOTQ5NjcyMzEpe2E9YSsxMXwwO289YSYtODtrPWNbODAyMV18MDtpZihrKXtkPTAtb3wwO2E9YT4+Pjg7aWYoYSlpZihvPj4+MD4xNjc3NzIxNSlqPTMxO2Vsc2V7cT0oYSsxMDQ4MzIwfDApPj4+MTYmODt6PWE8PHE7cD0oeis1MjAxOTJ8MCk+Pj4xNiY0O3o9ejw8cDtqPSh6KzI0NTc2MHwwKT4+PjE2JjI7aj0xNC0ocHxxfGopKyh6PDxqPj4+MTUpfDA7aj1vPj4+KGorN3wwKSYxfGo8PDF9ZWxzZSBqPTA7Yj1jWzMyMzg0KyhqPDwyKT4+Ml18MDthOmRvIGlmKCFiKXthPTA7Yj0wO3o9ODZ9ZWxzZXtmPWQ7YT0wO2g9bzw8KChqfDApPT0zMT8wOjI1LShqPj4+MSl8MCk7aT1iO2I9MDt3aGlsZSgxKXtlPWNbaSs0Pj4yXSYtODtkPWUtb3wwO2lmKGQ+Pj4wPGY+Pj4wKWlmKChlfDApPT0ob3wwKSl7YT1pO2I9aTt6PTkwO2JyZWFrIGF9ZWxzZSBiPWk7ZWxzZSBkPWY7ZT1jW2krMjA+PjJdfDA7aT1jW2krMTYrKGg+Pj4zMTw8Mik+PjJdfDA7YT0oZXwwKT09MHwoZXwwKT09KGl8MCk/YTplO2U9KGl8MCk9PTA7aWYoZSl7ej04NjticmVha31lbHNle2Y9ZDtoPWg8PChlJjFeMSl9fX13aGlsZSgwKTtpZigoenwwKT09ODYpe2lmKChhfDApPT0wJihifDApPT0wKXthPTI8PGo7YT1rJihhfDAtYSk7aWYoIWEpYnJlYWs7cT0oYSYwLWEpKy0xfDA7bT1xPj4+MTImMTY7cT1xPj4+bTtsPXE+Pj41Jjg7cT1xPj4+bDtuPXE+Pj4yJjQ7cT1xPj4+bjtwPXE+Pj4xJjI7cT1xPj4+cDthPXE+Pj4xJjE7YT1jWzMyMzg0KygobHxtfG58cHxhKSsocT4+PmEpPDwyKT4+Ml18MH1pZighYSl7aT1kO2o9Yn1lbHNlIHo9OTB9aWYoKHp8MCk9PTkwKXdoaWxlKDEpe3o9MDtxPShjW2ErND4+Ml0mLTgpLW98MDtlPXE+Pj4wPGQ+Pj4wO2Q9ZT9xOmQ7Yj1lP2E6YjtlPWNbYSsxNj4+Ml18MDtpZihlKXthPWU7ej05MDtjb250aW51ZX1hPWNbYSsyMD4+Ml18MDtpZighYSl7aT1kO2o9YjticmVha31lbHNlIHo9OTB9aWYoKGp8MCkhPTA/aT4+PjA8KChjWzgwMjJdfDApLW98MCk+Pj4wOjApe2Y9Y1s4MDI0XXwwO2lmKGo+Pj4wPGY+Pj4wKXJhKCk7aD1qK298MDtpZihqPj4+MD49aD4+PjApcmEoKTtnPWNbaisyND4+Ml18MDtkPWNbaisxMj4+Ml18MDtkbyBpZigoZHwwKT09KGp8MCkpe2I9aisyMHwwO2E9Y1tiPj4yXXwwO2lmKCFhKXtiPWorMTZ8MDthPWNbYj4+Ml18MDtpZighYSl7cz0wO2JyZWFrfX13aGlsZSgxKXtkPWErMjB8MDtlPWNbZD4+Ml18MDtpZihlKXthPWU7Yj1kO2NvbnRpbnVlfWQ9YSsxNnwwO2U9Y1tkPj4yXXwwO2lmKCFlKWJyZWFrO2Vsc2V7YT1lO2I9ZH19aWYoYj4+PjA8Zj4+PjApcmEoKTtlbHNle2NbYj4+Ml09MDtzPWE7YnJlYWt9fWVsc2V7ZT1jW2orOD4+Ml18MDtpZihlPj4+MDxmPj4+MClyYSgpO2E9ZSsxMnwwO2lmKChjW2E+PjJdfDApIT0oanwwKSlyYSgpO2I9ZCs4fDA7aWYoKGNbYj4+Ml18MCk9PShqfDApKXtjW2E+PjJdPWQ7Y1tiPj4yXT1lO3M9ZDticmVha31lbHNlIHJhKCl9d2hpbGUoMCk7ZG8gaWYoZyl7YT1jW2orMjg+PjJdfDA7Yj0zMjM4NCsoYTw8Mil8MDtpZigoanwwKT09KGNbYj4+Ml18MCkpe2NbYj4+Ml09cztpZighcyl7Y1s4MDIxXT1jWzgwMjFdJn4oMTw8YSk7YnJlYWt9fWVsc2V7aWYoZz4+PjA8KGNbODAyNF18MCk+Pj4wKXJhKCk7YT1nKzE2fDA7aWYoKGNbYT4+Ml18MCk9PShqfDApKWNbYT4+Ml09cztlbHNlIGNbZysyMD4+Ml09cztpZighcylicmVha31iPWNbODAyNF18MDtpZihzPj4+MDxiPj4+MClyYSgpO2NbcysyND4+Ml09ZzthPWNbaisxNj4+Ml18MDtkbyBpZihhKWlmKGE+Pj4wPGI+Pj4wKXJhKCk7ZWxzZXtjW3MrMTY+PjJdPWE7Y1thKzI0Pj4yXT1zO2JyZWFrfXdoaWxlKDApO2E9Y1tqKzIwPj4yXXwwO2lmKGEpaWYoYT4+PjA8KGNbODAyNF18MCk+Pj4wKXJhKCk7ZWxzZXtjW3MrMjA+PjJdPWE7Y1thKzI0Pj4yXT1zO2JyZWFrfX13aGlsZSgwKTtkbyBpZihpPj4+MD49MTYpe2Nbais0Pj4yXT1vfDM7Y1toKzQ+PjJdPWl8MTtjW2graT4+Ml09aTthPWk+Pj4zO2lmKGk+Pj4wPDI1Nil7ZD0zMjEyMCsoYTw8MTw8Mil8MDtiPWNbODAyMF18MDthPTE8PGE7aWYoYiZhKXthPWQrOHwwO2I9Y1thPj4yXXwwO2lmKGI+Pj4wPChjWzgwMjRdfDApPj4+MClyYSgpO2Vsc2V7dD1hO3Y9Yn19ZWxzZXtjWzgwMjBdPWJ8YTt0PWQrOHwwO3Y9ZH1jW3Q+PjJdPWg7Y1t2KzEyPj4yXT1oO2NbaCs4Pj4yXT12O2NbaCsxMj4+Ml09ZDticmVha31hPWk+Pj44O2lmKGEpaWYoaT4+PjA+MTY3NzcyMTUpZD0zMTtlbHNle0Y9KGErMTA0ODMyMHwwKT4+PjE2Jjg7Rz1hPDxGO0U9KEcrNTIwMTkyfDApPj4+MTYmNDtHPUc8PEU7ZD0oRysyNDU3NjB8MCk+Pj4xNiYyO2Q9MTQtKEV8RnxkKSsoRzw8ZD4+PjE1KXwwO2Q9aT4+PihkKzd8MCkmMXxkPDwxfWVsc2UgZD0wO2U9MzIzODQrKGQ8PDIpfDA7Y1toKzI4Pj4yXT1kO2E9aCsxNnwwO2NbYSs0Pj4yXT0wO2NbYT4+Ml09MDthPWNbODAyMV18MDtiPTE8PGQ7aWYoIShhJmIpKXtjWzgwMjFdPWF8YjtjW2U+PjJdPWg7Y1toKzI0Pj4yXT1lO2NbaCsxMj4+Ml09aDtjW2grOD4+Ml09aDticmVha31kPWk8PCgoZHwwKT09MzE/MDoyNS0oZD4+PjEpfDApO2U9Y1tlPj4yXXwwO3doaWxlKDEpe2lmKChjW2UrND4+Ml0mLTh8MCk9PShpfDApKXt6PTE0ODticmVha31iPWUrMTYrKGQ+Pj4zMTw8Mil8MDthPWNbYj4+Ml18MDtpZighYSl7ej0xNDU7YnJlYWt9ZWxzZXtkPWQ8PDE7ZT1hfX1pZigoenwwKT09MTQ1KWlmKGI+Pj4wPChjWzgwMjRdfDApPj4+MClyYSgpO2Vsc2V7Y1tiPj4yXT1oO2NbaCsyND4+Ml09ZTtjW2grMTI+PjJdPWg7Y1toKzg+PjJdPWg7YnJlYWt9ZWxzZSBpZigoenwwKT09MTQ4KXthPWUrOHwwO2I9Y1thPj4yXXwwO0c9Y1s4MDI0XXwwO2lmKGI+Pj4wPj1HPj4+MCZlPj4+MD49Rz4+PjApe2NbYisxMj4+Ml09aDtjW2E+PjJdPWg7Y1toKzg+PjJdPWI7Y1toKzEyPj4yXT1lO2NbaCsyND4+Ml09MDticmVha31lbHNlIHJhKCl9fWVsc2V7Rz1pK298MDtjW2orND4+Ml09R3wzO0c9aitHKzR8MDtjW0c+PjJdPWNbRz4+Ml18MX13aGlsZSgwKTtHPWorOHwwO3JldHVybiBHfDB9fX1lbHNlIG89LTE7d2hpbGUoMCk7ZD1jWzgwMjJdfDA7aWYoZD4+PjA+PW8+Pj4wKXthPWQtb3wwO2I9Y1s4MDI1XXwwO2lmKGE+Pj4wPjE1KXtHPWIrb3wwO2NbODAyNV09RztjWzgwMjJdPWE7Y1tHKzQ+PjJdPWF8MTtjW0crYT4+Ml09YTtjW2IrND4+Ml09b3wzfWVsc2V7Y1s4MDIyXT0wO2NbODAyNV09MDtjW2IrND4+Ml09ZHwzO0c9YitkKzR8MDtjW0c+PjJdPWNbRz4+Ml18MX1HPWIrOHwwO3JldHVybiBHfDB9YT1jWzgwMjNdfDA7aWYoYT4+PjA+bz4+PjApe0U9YS1vfDA7Y1s4MDIzXT1FO0c9Y1s4MDI2XXwwO0Y9RytvfDA7Y1s4MDI2XT1GO2NbRis0Pj4yXT1FfDE7Y1tHKzQ+PjJdPW98MztHPUcrOHwwO3JldHVybiBHfDB9ZG8gaWYoIShjWzgxMzhdfDApKXthPW5hKDMwKXwwO2lmKCEoYSstMSZhKSl7Y1s4MTQwXT1hO2NbODEzOV09YTtjWzgxNDFdPS0xO2NbODE0Ml09LTE7Y1s4MTQzXT0wO2NbODEzMV09MDtjWzgxMzhdPSh0YSgwKXwwKSYtMTZeMTQzMTY1NTc2ODticmVha31lbHNlIHJhKCl9d2hpbGUoMCk7aD1vKzQ4fDA7ZT1jWzgxNDBdfDA7aT1vKzQ3fDA7ZD1lK2l8MDtlPTAtZXwwO2o9ZCZlO2lmKGo+Pj4wPD1vPj4+MCl7Rz0wO3JldHVybiBHfDB9YT1jWzgxMzBdfDA7aWYoKGF8MCkhPTA/KHQ9Y1s4MTI4XXwwLHY9dCtqfDAsdj4+PjA8PXQ+Pj4wfHY+Pj4wPmE+Pj4wKTowKXtHPTA7cmV0dXJuIEd8MH1iOmRvIGlmKCEoY1s4MTMxXSY0KSl7Yj1jWzgwMjZdfDA7YzpkbyBpZihiKXtmPTMyNTI4O3doaWxlKDEpe2E9Y1tmPj4yXXwwO2lmKGE+Pj4wPD1iPj4+MD8ocj1mKzR8MCwoYSsoY1tyPj4yXXwwKXwwKT4+PjA+Yj4+PjApOjApYnJlYWs7YT1jW2YrOD4+Ml18MDtpZighYSl7ej0xNzM7YnJlYWsgY31lbHNlIGY9YX1hPWQtKGNbODAyM118MCkmZTtpZihhPj4+MDwyMTQ3NDgzNjQ3KXtiPXNhKGF8MCl8MDtpZigoYnwwKT09KChjW2Y+PjJdfDApKyhjW3I+PjJdfDApfDApKXtpZigoYnwwKSE9KC0xfDApKXtoPWI7Zz1hO3o9MTkzO2JyZWFrIGJ9fWVsc2Ugej0xODN9fWVsc2Ugej0xNzM7d2hpbGUoMCk7ZG8gaWYoKHp8MCk9PTE3Mz8odT1zYSgwKXwwLCh1fDApIT0oLTF8MCkpOjApe2E9dTtiPWNbODEzOV18MDtkPWIrLTF8MDtpZighKGQmYSkpYT1qO2Vsc2UgYT1qLWErKGQrYSYwLWIpfDA7Yj1jWzgxMjhdfDA7ZD1iK2F8MDtpZihhPj4+MD5vPj4+MCZhPj4+MDwyMTQ3NDgzNjQ3KXt2PWNbODEzMF18MDtpZigodnwwKSE9MD9kPj4+MDw9Yj4+PjB8ZD4+PjA+dj4+PjA6MClicmVhaztiPXNhKGF8MCl8MDtpZigoYnwwKT09KHV8MCkpe2g9dTtnPWE7ej0xOTM7YnJlYWsgYn1lbHNlIHo9MTgzfX13aGlsZSgwKTtkOmRvIGlmKCh6fDApPT0xODMpe2Q9MC1hfDA7ZG8gaWYoaD4+PjA+YT4+PjAmKGE+Pj4wPDIxNDc0ODM2NDcmKGJ8MCkhPSgtMXwwKSk/KHc9Y1s4MTQwXXwwLHc9aS1hK3cmMC13LHc+Pj4wPDIxNDc0ODM2NDcpOjApaWYoKHNhKHd8MCl8MCk9PSgtMXwwKSl7c2EoZHwwKXwwO2JyZWFrIGR9ZWxzZXthPXcrYXwwO2JyZWFrfXdoaWxlKDApO2lmKChifDApIT0oLTF8MCkpe2g9YjtnPWE7ej0xOTM7YnJlYWsgYn19d2hpbGUoMCk7Y1s4MTMxXT1jWzgxMzFdfDQ7ej0xOTB9ZWxzZSB6PTE5MDt3aGlsZSgwKTtpZigoKCh6fDApPT0xOTA/aj4+PjA8MjE0NzQ4MzY0NzowKT8oeD1zYShqfDApfDAseT1zYSgwKXwwLHg+Pj4wPHk+Pj4wJigoeHwwKSE9KC0xfDApJih5fDApIT0oLTF8MCkpKTowKT8oZz15LXh8MCxnPj4+MD4obys0MHwwKT4+PjApOjApe2g9eDt6PTE5M31pZigoenwwKT09MTkzKXthPShjWzgxMjhdfDApK2d8MDtjWzgxMjhdPWE7aWYoYT4+PjA+KGNbODEyOV18MCk+Pj4wKWNbODEyOV09YTtrPWNbODAyNl18MDtkbyBpZihrKXtmPTMyNTI4O3doaWxlKDEpe2E9Y1tmPj4yXXwwO2I9Zis0fDA7ZD1jW2I+PjJdfDA7aWYoKGh8MCk9PShhK2R8MCkpe3o9MjAzO2JyZWFrfWU9Y1tmKzg+PjJdfDA7aWYoIWUpYnJlYWs7ZWxzZSBmPWV9aWYoKCh6fDApPT0yMDM/KGNbZisxMj4+Ml0mOHwwKT09MDowKT9rPj4+MDxoPj4+MCZrPj4+MD49YT4+PjA6MCl7Y1tiPj4yXT1kK2c7Rz1rKzh8MDtHPShHJjd8MCk9PTA/MDowLUcmNztGPWsrR3wwO0c9Zy1HKyhjWzgwMjNdfDApfDA7Y1s4MDI2XT1GO2NbODAyM109RztjW0YrND4+Ml09R3wxO2NbRitHKzQ+PjJdPTQwO2NbODAyN109Y1s4MTQyXTticmVha31hPWNbODAyNF18MDtpZihoPj4+MDxhPj4+MCl7Y1s4MDI0XT1oO2k9aH1lbHNlIGk9YTtiPWgrZ3wwO2E9MzI1Mjg7d2hpbGUoMSl7aWYoKGNbYT4+Ml18MCk9PShifDApKXt6PTIxMTticmVha31hPWNbYSs4Pj4yXXwwO2lmKCFhKXtiPTMyNTI4O2JyZWFrfX1pZigoenwwKT09MjExKWlmKCEoY1thKzEyPj4yXSY4KSl7Y1thPj4yXT1oO209YSs0fDA7Y1ttPj4yXT0oY1ttPj4yXXwwKStnO209aCs4fDA7bT1oKygobSY3fDApPT0wPzA6MC1tJjcpfDA7YT1iKzh8MDthPWIrKChhJjd8MCk9PTA/MDowLWEmNyl8MDtsPW0rb3wwO2o9YS1tLW98MDtjW20rND4+Ml09b3wzO2RvIGlmKChhfDApIT0oa3wwKSl7aWYoKGF8MCk9PShjWzgwMjVdfDApKXtHPShjWzgwMjJdfDApK2p8MDtjWzgwMjJdPUc7Y1s4MDI1XT1sO2NbbCs0Pj4yXT1HfDE7Y1tsK0c+PjJdPUc7YnJlYWt9Yj1jW2ErND4+Ml18MDtpZigoYiYzfDApPT0xKXtoPWImLTg7Zj1iPj4+MztlOmRvIGlmKGI+Pj4wPj0yNTYpe2c9Y1thKzI0Pj4yXXwwO2U9Y1thKzEyPj4yXXwwO2RvIGlmKChlfDApPT0oYXwwKSl7ZT1hKzE2fDA7ZD1lKzR8MDtiPWNbZD4+Ml18MDtpZighYil7Yj1jW2U+PjJdfDA7aWYoIWIpe0U9MDticmVha31lbHNlIGQ9ZX13aGlsZSgxKXtlPWIrMjB8MDtmPWNbZT4+Ml18MDtpZihmKXtiPWY7ZD1lO2NvbnRpbnVlfWU9YisxNnwwO2Y9Y1tlPj4yXXwwO2lmKCFmKWJyZWFrO2Vsc2V7Yj1mO2Q9ZX19aWYoZD4+PjA8aT4+PjApcmEoKTtlbHNle2NbZD4+Ml09MDtFPWI7YnJlYWt9fWVsc2V7Zj1jW2ErOD4+Ml18MDtpZihmPj4+MDxpPj4+MClyYSgpO2I9ZisxMnwwO2lmKChjW2I+PjJdfDApIT0oYXwwKSlyYSgpO2Q9ZSs4fDA7aWYoKGNbZD4+Ml18MCk9PShhfDApKXtjW2I+PjJdPWU7Y1tkPj4yXT1mO0U9ZTticmVha31lbHNlIHJhKCl9d2hpbGUoMCk7aWYoIWcpYnJlYWs7Yj1jW2ErMjg+PjJdfDA7ZD0zMjM4NCsoYjw8Mil8MDtkbyBpZigoYXwwKSE9KGNbZD4+Ml18MCkpe2lmKGc+Pj4wPChjWzgwMjRdfDApPj4+MClyYSgpO2I9ZysxNnwwO2lmKChjW2I+PjJdfDApPT0oYXwwKSljW2I+PjJdPUU7ZWxzZSBjW2crMjA+PjJdPUU7aWYoIUUpYnJlYWsgZX1lbHNle2NbZD4+Ml09RTtpZihFKWJyZWFrO2NbODAyMV09Y1s4MDIxXSZ+KDE8PGIpO2JyZWFrIGV9d2hpbGUoMCk7ZT1jWzgwMjRdfDA7aWYoRT4+PjA8ZT4+PjApcmEoKTtjW0UrMjQ+PjJdPWc7Yj1hKzE2fDA7ZD1jW2I+PjJdfDA7ZG8gaWYoZClpZihkPj4+MDxlPj4+MClyYSgpO2Vsc2V7Y1tFKzE2Pj4yXT1kO2NbZCsyND4+Ml09RTticmVha313aGlsZSgwKTtiPWNbYis0Pj4yXXwwO2lmKCFiKWJyZWFrO2lmKGI+Pj4wPChjWzgwMjRdfDApPj4+MClyYSgpO2Vsc2V7Y1tFKzIwPj4yXT1iO2NbYisyND4+Ml09RTticmVha319ZWxzZXtkPWNbYSs4Pj4yXXwwO2U9Y1thKzEyPj4yXXwwO2I9MzIxMjArKGY8PDE8PDIpfDA7ZG8gaWYoKGR8MCkhPShifDApKXtpZihkPj4+MDxpPj4+MClyYSgpO2lmKChjW2QrMTI+PjJdfDApPT0oYXwwKSlicmVhaztyYSgpfXdoaWxlKDApO2lmKChlfDApPT0oZHwwKSl7Y1s4MDIwXT1jWzgwMjBdJn4oMTw8Zik7YnJlYWt9ZG8gaWYoKGV8MCk9PShifDApKUI9ZSs4fDA7ZWxzZXtpZihlPj4+MDxpPj4+MClyYSgpO2I9ZSs4fDA7aWYoKGNbYj4+Ml18MCk9PShhfDApKXtCPWI7YnJlYWt9cmEoKX13aGlsZSgwKTtjW2QrMTI+PjJdPWU7Y1tCPj4yXT1kfXdoaWxlKDApO2E9YStofDA7Zj1oK2p8MH1lbHNlIGY9ajthPWErNHwwO2NbYT4+Ml09Y1thPj4yXSYtMjtjW2wrND4+Ml09ZnwxO2NbbCtmPj4yXT1mO2E9Zj4+PjM7aWYoZj4+PjA8MjU2KXtkPTMyMTIwKyhhPDwxPDwyKXwwO2I9Y1s4MDIwXXwwO2E9MTw8YTtkbyBpZighKGImYSkpe2NbODAyMF09YnxhO0Y9ZCs4fDA7Rz1kfWVsc2V7YT1kKzh8MDtiPWNbYT4+Ml18MDtpZihiPj4+MD49KGNbODAyNF18MCk+Pj4wKXtGPWE7Rz1iO2JyZWFrfXJhKCl9d2hpbGUoMCk7Y1tGPj4yXT1sO2NbRysxMj4+Ml09bDtjW2wrOD4+Ml09RztjW2wrMTI+PjJdPWQ7YnJlYWt9YT1mPj4+ODtkbyBpZighYSlkPTA7ZWxzZXtpZihmPj4+MD4xNjc3NzIxNSl7ZD0zMTticmVha31GPShhKzEwNDgzMjB8MCk+Pj4xNiY4O0c9YTw8RjtFPShHKzUyMDE5MnwwKT4+PjE2JjQ7Rz1HPDxFO2Q9KEcrMjQ1NzYwfDApPj4+MTYmMjtkPTE0LShFfEZ8ZCkrKEc8PGQ+Pj4xNSl8MDtkPWY+Pj4oZCs3fDApJjF8ZDw8MX13aGlsZSgwKTtlPTMyMzg0KyhkPDwyKXwwO2NbbCsyOD4+Ml09ZDthPWwrMTZ8MDtjW2ErND4+Ml09MDtjW2E+PjJdPTA7YT1jWzgwMjFdfDA7Yj0xPDxkO2lmKCEoYSZiKSl7Y1s4MDIxXT1hfGI7Y1tlPj4yXT1sO2NbbCsyND4+Ml09ZTtjW2wrMTI+PjJdPWw7Y1tsKzg+PjJdPWw7YnJlYWt9ZD1mPDwoKGR8MCk9PTMxPzA6MjUtKGQ+Pj4xKXwwKTtlPWNbZT4+Ml18MDt3aGlsZSgxKXtpZigoY1tlKzQ+PjJdJi04fDApPT0oZnwwKSl7ej0yODE7YnJlYWt9Yj1lKzE2KyhkPj4+MzE8PDIpfDA7YT1jW2I+PjJdfDA7aWYoIWEpe3o9Mjc4O2JyZWFrfWVsc2V7ZD1kPDwxO2U9YX19aWYoKHp8MCk9PTI3OClpZihiPj4+MDwoY1s4MDI0XXwwKT4+PjApcmEoKTtlbHNle2NbYj4+Ml09bDtjW2wrMjQ+PjJdPWU7Y1tsKzEyPj4yXT1sO2NbbCs4Pj4yXT1sO2JyZWFrfWVsc2UgaWYoKHp8MCk9PTI4MSl7YT1lKzh8MDtiPWNbYT4+Ml18MDtHPWNbODAyNF18MDtpZihiPj4+MD49Rz4+PjAmZT4+PjA+PUc+Pj4wKXtjW2IrMTI+PjJdPWw7Y1thPj4yXT1sO2NbbCs4Pj4yXT1iO2NbbCsxMj4+Ml09ZTtjW2wrMjQ+PjJdPTA7YnJlYWt9ZWxzZSByYSgpfX1lbHNle0c9KGNbODAyM118MCkranwwO2NbODAyM109RztjWzgwMjZdPWw7Y1tsKzQ+PjJdPUd8MX13aGlsZSgwKTtHPW0rOHwwO3JldHVybiBHfDB9ZWxzZSBiPTMyNTI4O3doaWxlKDEpe2E9Y1tiPj4yXXwwO2lmKGE+Pj4wPD1rPj4+MD8oQT1hKyhjW2IrND4+Ml18MCl8MCxBPj4+MD5rPj4+MCk6MClicmVhaztiPWNbYis4Pj4yXXwwfWY9QSstNDd8MDtiPWYrOHwwO2I9ZisoKGImN3wwKT09MD8wOjAtYiY3KXwwO2Y9aysxNnwwO2I9Yj4+PjA8Zj4+PjA/azpiO2E9Yis4fDA7ZD1oKzh8MDtkPShkJjd8MCk9PTA/MDowLWQmNztHPWgrZHwwO2Q9ZystNDAtZHwwO2NbODAyNl09RztjWzgwMjNdPWQ7Y1tHKzQ+PjJdPWR8MTtjW0crZCs0Pj4yXT00MDtjWzgwMjddPWNbODE0Ml07ZD1iKzR8MDtjW2Q+PjJdPTI3O2NbYT4+Ml09Y1s4MTMyXTtjW2ErND4+Ml09Y1s4MTMzXTtjW2ErOD4+Ml09Y1s4MTM0XTtjW2ErMTI+PjJdPWNbODEzNV07Y1s4MTMyXT1oO2NbODEzM109ZztjWzgxMzVdPTA7Y1s4MTM0XT1hO2E9YisyNHwwO2Rve2E9YSs0fDA7Y1thPj4yXT03fXdoaWxlKChhKzR8MCk+Pj4wPEE+Pj4wKTtpZigoYnwwKSE9KGt8MCkpe2c9Yi1rfDA7Y1tkPj4yXT1jW2Q+PjJdJi0yO2Nbays0Pj4yXT1nfDE7Y1tiPj4yXT1nO2E9Zz4+PjM7aWYoZz4+PjA8MjU2KXtkPTMyMTIwKyhhPDwxPDwyKXwwO2I9Y1s4MDIwXXwwO2E9MTw8YTtpZihiJmEpe2E9ZCs4fDA7Yj1jW2E+PjJdfDA7aWYoYj4+PjA8KGNbODAyNF18MCk+Pj4wKXJhKCk7ZWxzZXtDPWE7RD1ifX1lbHNle2NbODAyMF09YnxhO0M9ZCs4fDA7RD1kfWNbQz4+Ml09aztjW0QrMTI+PjJdPWs7Y1trKzg+PjJdPUQ7Y1trKzEyPj4yXT1kO2JyZWFrfWE9Zz4+Pjg7aWYoYSlpZihnPj4+MD4xNjc3NzIxNSlkPTMxO2Vsc2V7Rj0oYSsxMDQ4MzIwfDApPj4+MTYmODtHPWE8PEY7RT0oRys1MjAxOTJ8MCk+Pj4xNiY0O0c9Rzw8RTtkPShHKzI0NTc2MHwwKT4+PjE2JjI7ZD0xNC0oRXxGfGQpKyhHPDxkPj4+MTUpfDA7ZD1nPj4+KGQrN3wwKSYxfGQ8PDF9ZWxzZSBkPTA7ZT0zMjM4NCsoZDw8Mil8MDtjW2srMjg+PjJdPWQ7Y1trKzIwPj4yXT0wO2NbZj4+Ml09MDthPWNbODAyMV18MDtiPTE8PGQ7aWYoIShhJmIpKXtjWzgwMjFdPWF8YjtjW2U+PjJdPWs7Y1trKzI0Pj4yXT1lO2NbaysxMj4+Ml09aztjW2srOD4+Ml09azticmVha31kPWc8PCgoZHwwKT09MzE/MDoyNS0oZD4+PjEpfDApO2U9Y1tlPj4yXXwwO3doaWxlKDEpe2lmKChjW2UrND4+Ml0mLTh8MCk9PShnfDApKXt6PTMwNzticmVha31iPWUrMTYrKGQ+Pj4zMTw8Mil8MDthPWNbYj4+Ml18MDtpZighYSl7ej0zMDQ7YnJlYWt9ZWxzZXtkPWQ8PDE7ZT1hfX1pZigoenwwKT09MzA0KWlmKGI+Pj4wPChjWzgwMjRdfDApPj4+MClyYSgpO2Vsc2V7Y1tiPj4yXT1rO2NbaysyND4+Ml09ZTtjW2srMTI+PjJdPWs7Y1trKzg+PjJdPWs7YnJlYWt9ZWxzZSBpZigoenwwKT09MzA3KXthPWUrOHwwO2I9Y1thPj4yXXwwO0c9Y1s4MDI0XXwwO2lmKGI+Pj4wPj1HPj4+MCZlPj4+MD49Rz4+PjApe2NbYisxMj4+Ml09aztjW2E+PjJdPWs7Y1trKzg+PjJdPWI7Y1trKzEyPj4yXT1lO2NbaysyND4+Ml09MDticmVha31lbHNlIHJhKCl9fX1lbHNle0c9Y1s4MDI0XXwwO2lmKChHfDApPT0wfGg+Pj4wPEc+Pj4wKWNbODAyNF09aDtjWzgxMzJdPWg7Y1s4MTMzXT1nO2NbODEzNV09MDtjWzgwMjldPWNbODEzOF07Y1s4MDI4XT0tMTthPTA7ZG97Rz0zMjEyMCsoYTw8MTw8Mil8MDtjW0crMTI+PjJdPUc7Y1tHKzg+PjJdPUc7YT1hKzF8MH13aGlsZSgoYXwwKSE9MzIpO0c9aCs4fDA7Rz0oRyY3fDApPT0wPzA6MC1HJjc7Rj1oK0d8MDtHPWcrLTQwLUd8MDtjWzgwMjZdPUY7Y1s4MDIzXT1HO2NbRis0Pj4yXT1HfDE7Y1tGK0crND4+Ml09NDA7Y1s4MDI3XT1jWzgxNDJdfXdoaWxlKDApO2E9Y1s4MDIzXXwwO2lmKGE+Pj4wPm8+Pj4wKXtFPWEtb3wwO2NbODAyM109RTtHPWNbODAyNl18MDtGPUcrb3wwO2NbODAyNl09RjtjW0YrND4+Ml09RXwxO2NbRys0Pj4yXT1vfDM7Rz1HKzh8MDtyZXR1cm4gR3wwfX1pZighKGNbNzk3OV18MCkpYT0zMTk2NDtlbHNlIGE9Y1sob2EoKXwwKSs2MD4+Ml18MDtjW2E+PjJdPTEyO0c9MDtyZXR1cm4gR3wwfWZ1bmN0aW9uIHpkKGEpe2E9YXwwO3ZhciBiPTAsZD0wLGU9MCxmPTAsZz0wLGg9MCxpPTAsaj0wLGs9MCxsPTAsbT0wLG49MCxvPTAscD0wLHE9MDtpZighYSlyZXR1cm47ZD1hKy04fDA7aD1jWzgwMjRdfDA7aWYoZD4+PjA8aD4+PjApcmEoKTthPWNbYSstND4+Ml18MDtiPWEmMztpZigoYnwwKT09MSlyYSgpO2U9YSYtODttPWQrZXwwO2RvIGlmKCEoYSYxKSl7YT1jW2Q+PjJdfDA7aWYoIWIpcmV0dXJuO2s9ZCsoMC1hKXwwO2o9YStlfDA7aWYoaz4+PjA8aD4+PjApcmEoKTtpZigoa3wwKT09KGNbODAyNV18MCkpe2E9bSs0fDA7Yj1jW2E+PjJdfDA7aWYoKGImM3wwKSE9Myl7cT1rO2Y9ajticmVha31jWzgwMjJdPWo7Y1thPj4yXT1iJi0yO2Nbays0Pj4yXT1qfDE7Y1trK2o+PjJdPWo7cmV0dXJufWU9YT4+PjM7aWYoYT4+PjA8MjU2KXtiPWNbays4Pj4yXXwwO2Q9Y1trKzEyPj4yXXwwO2E9MzIxMjArKGU8PDE8PDIpfDA7aWYoKGJ8MCkhPShhfDApKXtpZihiPj4+MDxoPj4+MClyYSgpO2lmKChjW2IrMTI+PjJdfDApIT0oa3wwKSlyYSgpfWlmKChkfDApPT0oYnwwKSl7Y1s4MDIwXT1jWzgwMjBdJn4oMTw8ZSk7cT1rO2Y9ajticmVha31pZigoZHwwKSE9KGF8MCkpe2lmKGQ+Pj4wPGg+Pj4wKXJhKCk7YT1kKzh8MDtpZigoY1thPj4yXXwwKT09KGt8MCkpZz1hO2Vsc2UgcmEoKX1lbHNlIGc9ZCs4fDA7Y1tiKzEyPj4yXT1kO2NbZz4+Ml09YjtxPWs7Zj1qO2JyZWFrfWc9Y1trKzI0Pj4yXXwwO2Q9Y1trKzEyPj4yXXwwO2RvIGlmKChkfDApPT0oa3wwKSl7ZD1rKzE2fDA7Yj1kKzR8MDthPWNbYj4+Ml18MDtpZighYSl7YT1jW2Q+PjJdfDA7aWYoIWEpe2k9MDticmVha31lbHNlIGI9ZH13aGlsZSgxKXtkPWErMjB8MDtlPWNbZD4+Ml18MDtpZihlKXthPWU7Yj1kO2NvbnRpbnVlfWQ9YSsxNnwwO2U9Y1tkPj4yXXwwO2lmKCFlKWJyZWFrO2Vsc2V7YT1lO2I9ZH19aWYoYj4+PjA8aD4+PjApcmEoKTtlbHNle2NbYj4+Ml09MDtpPWE7YnJlYWt9fWVsc2V7ZT1jW2srOD4+Ml18MDtpZihlPj4+MDxoPj4+MClyYSgpO2E9ZSsxMnwwO2lmKChjW2E+PjJdfDApIT0oa3wwKSlyYSgpO2I9ZCs4fDA7aWYoKGNbYj4+Ml18MCk9PShrfDApKXtjW2E+PjJdPWQ7Y1tiPj4yXT1lO2k9ZDticmVha31lbHNlIHJhKCl9d2hpbGUoMCk7aWYoZyl7YT1jW2srMjg+PjJdfDA7Yj0zMjM4NCsoYTw8Mil8MDtpZigoa3wwKT09KGNbYj4+Ml18MCkpe2NbYj4+Ml09aTtpZighaSl7Y1s4MDIxXT1jWzgwMjFdJn4oMTw8YSk7cT1rO2Y9ajticmVha319ZWxzZXtpZihnPj4+MDwoY1s4MDI0XXwwKT4+PjApcmEoKTthPWcrMTZ8MDtpZigoY1thPj4yXXwwKT09KGt8MCkpY1thPj4yXT1pO2Vsc2UgY1tnKzIwPj4yXT1pO2lmKCFpKXtxPWs7Zj1qO2JyZWFrfX1kPWNbODAyNF18MDtpZihpPj4+MDxkPj4+MClyYSgpO2NbaSsyND4+Ml09ZzthPWsrMTZ8MDtiPWNbYT4+Ml18MDtkbyBpZihiKWlmKGI+Pj4wPGQ+Pj4wKXJhKCk7ZWxzZXtjW2krMTY+PjJdPWI7Y1tiKzI0Pj4yXT1pO2JyZWFrfXdoaWxlKDApO2E9Y1thKzQ+PjJdfDA7aWYoYSlpZihhPj4+MDwoY1s4MDI0XXwwKT4+PjApcmEoKTtlbHNle2NbaSsyMD4+Ml09YTtjW2ErMjQ+PjJdPWk7cT1rO2Y9ajticmVha31lbHNle3E9aztmPWp9fWVsc2V7cT1rO2Y9an19ZWxzZXtxPWQ7Zj1lfXdoaWxlKDApO2lmKHE+Pj4wPj1tPj4+MClyYSgpO2E9bSs0fDA7Yj1jW2E+PjJdfDA7aWYoIShiJjEpKXJhKCk7aWYoIShiJjIpKXtpZigobXwwKT09KGNbODAyNl18MCkpe3A9KGNbODAyM118MCkrZnwwO2NbODAyM109cDtjWzgwMjZdPXE7Y1txKzQ+PjJdPXB8MTtpZigocXwwKSE9KGNbODAyNV18MCkpcmV0dXJuO2NbODAyNV09MDtjWzgwMjJdPTA7cmV0dXJufWlmKChtfDApPT0oY1s4MDI1XXwwKSl7cD0oY1s4MDIyXXwwKStmfDA7Y1s4MDIyXT1wO2NbODAyNV09cTtjW3ErND4+Ml09cHwxO2NbcStwPj4yXT1wO3JldHVybn1mPShiJi04KStmfDA7ZT1iPj4+MztkbyBpZihiPj4+MD49MjU2KXtnPWNbbSsyND4+Ml18MDthPWNbbSsxMj4+Ml18MDtkbyBpZigoYXwwKT09KG18MCkpe2Q9bSsxNnwwO2I9ZCs0fDA7YT1jW2I+PjJdfDA7aWYoIWEpe2E9Y1tkPj4yXXwwO2lmKCFhKXtuPTA7YnJlYWt9ZWxzZSBiPWR9d2hpbGUoMSl7ZD1hKzIwfDA7ZT1jW2Q+PjJdfDA7aWYoZSl7YT1lO2I9ZDtjb250aW51ZX1kPWErMTZ8MDtlPWNbZD4+Ml18MDtpZighZSlicmVhaztlbHNle2E9ZTtiPWR9fWlmKGI+Pj4wPChjWzgwMjRdfDApPj4+MClyYSgpO2Vsc2V7Y1tiPj4yXT0wO249YTticmVha319ZWxzZXtiPWNbbSs4Pj4yXXwwO2lmKGI+Pj4wPChjWzgwMjRdfDApPj4+MClyYSgpO2Q9YisxMnwwO2lmKChjW2Q+PjJdfDApIT0obXwwKSlyYSgpO2U9YSs4fDA7aWYoKGNbZT4+Ml18MCk9PShtfDApKXtjW2Q+PjJdPWE7Y1tlPj4yXT1iO249YTticmVha31lbHNlIHJhKCl9d2hpbGUoMCk7aWYoZyl7YT1jW20rMjg+PjJdfDA7Yj0zMjM4NCsoYTw8Mil8MDtpZigobXwwKT09KGNbYj4+Ml18MCkpe2NbYj4+Ml09bjtpZighbil7Y1s4MDIxXT1jWzgwMjFdJn4oMTw8YSk7YnJlYWt9fWVsc2V7aWYoZz4+PjA8KGNbODAyNF18MCk+Pj4wKXJhKCk7YT1nKzE2fDA7aWYoKGNbYT4+Ml18MCk9PShtfDApKWNbYT4+Ml09bjtlbHNlIGNbZysyMD4+Ml09bjtpZighbilicmVha31kPWNbODAyNF18MDtpZihuPj4+MDxkPj4+MClyYSgpO2NbbisyND4+Ml09ZzthPW0rMTZ8MDtiPWNbYT4+Ml18MDtkbyBpZihiKWlmKGI+Pj4wPGQ+Pj4wKXJhKCk7ZWxzZXtjW24rMTY+PjJdPWI7Y1tiKzI0Pj4yXT1uO2JyZWFrfXdoaWxlKDApO2E9Y1thKzQ+PjJdfDA7aWYoYSlpZihhPj4+MDwoY1s4MDI0XXwwKT4+PjApcmEoKTtlbHNle2NbbisyMD4+Ml09YTtjW2ErMjQ+PjJdPW47YnJlYWt9fX1lbHNle2I9Y1ttKzg+PjJdfDA7ZD1jW20rMTI+PjJdfDA7YT0zMjEyMCsoZTw8MTw8Mil8MDtpZigoYnwwKSE9KGF8MCkpe2lmKGI+Pj4wPChjWzgwMjRdfDApPj4+MClyYSgpO2lmKChjW2IrMTI+PjJdfDApIT0obXwwKSlyYSgpfWlmKChkfDApPT0oYnwwKSl7Y1s4MDIwXT1jWzgwMjBdJn4oMTw8ZSk7YnJlYWt9aWYoKGR8MCkhPShhfDApKXtpZihkPj4+MDwoY1s4MDI0XXwwKT4+PjApcmEoKTthPWQrOHwwO2lmKChjW2E+PjJdfDApPT0obXwwKSlsPWE7ZWxzZSByYSgpfWVsc2UgbD1kKzh8MDtjW2IrMTI+PjJdPWQ7Y1tsPj4yXT1ifXdoaWxlKDApO2NbcSs0Pj4yXT1mfDE7Y1txK2Y+PjJdPWY7aWYoKHF8MCk9PShjWzgwMjVdfDApKXtjWzgwMjJdPWY7cmV0dXJufX1lbHNle2NbYT4+Ml09YiYtMjtjW3ErND4+Ml09ZnwxO2NbcStmPj4yXT1mfWE9Zj4+PjM7aWYoZj4+PjA8MjU2KXtkPTMyMTIwKyhhPDwxPDwyKXwwO2I9Y1s4MDIwXXwwO2E9MTw8YTtpZihiJmEpe2E9ZCs4fDA7Yj1jW2E+PjJdfDA7aWYoYj4+PjA8KGNbODAyNF18MCk+Pj4wKXJhKCk7ZWxzZXtvPWE7cD1ifX1lbHNle2NbODAyMF09YnxhO289ZCs4fDA7cD1kfWNbbz4+Ml09cTtjW3ArMTI+PjJdPXE7Y1txKzg+PjJdPXA7Y1txKzEyPj4yXT1kO3JldHVybn1hPWY+Pj44O2lmKGEpaWYoZj4+PjA+MTY3NzcyMTUpZD0zMTtlbHNle289KGErMTA0ODMyMHwwKT4+PjE2Jjg7cD1hPDxvO249KHArNTIwMTkyfDApPj4+MTYmNDtwPXA8PG47ZD0ocCsyNDU3NjB8MCk+Pj4xNiYyO2Q9MTQtKG58b3xkKSsocDw8ZD4+PjE1KXwwO2Q9Zj4+PihkKzd8MCkmMXxkPDwxfWVsc2UgZD0wO2U9MzIzODQrKGQ8PDIpfDA7Y1txKzI4Pj4yXT1kO2NbcSsyMD4+Ml09MDtjW3ErMTY+PjJdPTA7YT1jWzgwMjFdfDA7Yj0xPDxkO2RvIGlmKGEmYil7ZD1mPDwoKGR8MCk9PTMxPzA6MjUtKGQ+Pj4xKXwwKTtlPWNbZT4+Ml18MDt3aGlsZSgxKXtpZigoY1tlKzQ+PjJdJi04fDApPT0oZnwwKSl7YT0xMzA7YnJlYWt9Yj1lKzE2KyhkPj4+MzE8PDIpfDA7YT1jW2I+PjJdfDA7aWYoIWEpe2E9MTI3O2JyZWFrfWVsc2V7ZD1kPDwxO2U9YX19aWYoKGF8MCk9PTEyNylpZihiPj4+MDwoY1s4MDI0XXwwKT4+PjApcmEoKTtlbHNle2NbYj4+Ml09cTtjW3ErMjQ+PjJdPWU7Y1txKzEyPj4yXT1xO2NbcSs4Pj4yXT1xO2JyZWFrfWVsc2UgaWYoKGF8MCk9PTEzMCl7YT1lKzh8MDtiPWNbYT4+Ml18MDtwPWNbODAyNF18MDtpZihiPj4+MD49cD4+PjAmZT4+PjA+PXA+Pj4wKXtjW2IrMTI+PjJdPXE7Y1thPj4yXT1xO2NbcSs4Pj4yXT1iO2NbcSsxMj4+Ml09ZTtjW3ErMjQ+PjJdPTA7YnJlYWt9ZWxzZSByYSgpfX1lbHNle2NbODAyMV09YXxiO2NbZT4+Ml09cTtjW3ErMjQ+PjJdPWU7Y1txKzEyPj4yXT1xO2NbcSs4Pj4yXT1xfXdoaWxlKDApO3E9KGNbODAyOF18MCkrLTF8MDtjWzgwMjhdPXE7aWYoIXEpYT0zMjUzNjtlbHNlIHJldHVybjt3aGlsZSgxKXthPWNbYT4+Ml18MDtpZighYSlicmVhaztlbHNlIGE9YSs4fDB9Y1s4MDI4XT0tMTtyZXR1cm59ZnVuY3Rpb24gQWQoYSxiKXthPWF8MDtiPWJ8MDt2YXIgZD0wLGU9MCxmPTAsZz0wLGg9MCxpPTAsaj0wLGs9MCxsPTAsbT0wLG49MCxvPTAscD0wLHE9MCxyPTA7bz1hK2J8MDtkPWNbYSs0Pj4yXXwwO2RvIGlmKCEoZCYxKSl7Zz1jW2E+PjJdfDA7aWYoIShkJjMpKXJldHVybjtsPWErKDAtZyl8MDtrPWcrYnwwO2k9Y1s4MDI0XXwwO2lmKGw+Pj4wPGk+Pj4wKXJhKCk7aWYoKGx8MCk9PShjWzgwMjVdfDApKXthPW8rNHwwO2Q9Y1thPj4yXXwwO2lmKChkJjN8MCkhPTMpe3I9bDtmPWs7YnJlYWt9Y1s4MDIyXT1rO2NbYT4+Ml09ZCYtMjtjW2wrND4+Ml09a3wxO2NbbCtrPj4yXT1rO3JldHVybn1lPWc+Pj4zO2lmKGc+Pj4wPDI1Nil7YT1jW2wrOD4+Ml18MDtiPWNbbCsxMj4+Ml18MDtkPTMyMTIwKyhlPDwxPDwyKXwwO2lmKChhfDApIT0oZHwwKSl7aWYoYT4+PjA8aT4+PjApcmEoKTtpZigoY1thKzEyPj4yXXwwKSE9KGx8MCkpcmEoKX1pZigoYnwwKT09KGF8MCkpe2NbODAyMF09Y1s4MDIwXSZ+KDE8PGUpO3I9bDtmPWs7YnJlYWt9aWYoKGJ8MCkhPShkfDApKXtpZihiPj4+MDxpPj4+MClyYSgpO2Q9Yis4fDA7aWYoKGNbZD4+Ml18MCk9PShsfDApKWg9ZDtlbHNlIHJhKCl9ZWxzZSBoPWIrOHwwO2NbYSsxMj4+Ml09YjtjW2g+PjJdPWE7cj1sO2Y9azticmVha31nPWNbbCsyND4+Ml18MDtiPWNbbCsxMj4+Ml18MDtkbyBpZigoYnwwKT09KGx8MCkpe2I9bCsxNnwwO2E9Yis0fDA7ZD1jW2E+PjJdfDA7aWYoIWQpe2Q9Y1tiPj4yXXwwO2lmKCFkKXtqPTA7YnJlYWt9ZWxzZSBhPWJ9d2hpbGUoMSl7Yj1kKzIwfDA7ZT1jW2I+PjJdfDA7aWYoZSl7ZD1lO2E9Yjtjb250aW51ZX1iPWQrMTZ8MDtlPWNbYj4+Ml18MDtpZighZSlicmVhaztlbHNle2Q9ZTthPWJ9fWlmKGE+Pj4wPGk+Pj4wKXJhKCk7ZWxzZXtjW2E+PjJdPTA7aj1kO2JyZWFrfX1lbHNle2U9Y1tsKzg+PjJdfDA7aWYoZT4+PjA8aT4+PjApcmEoKTtkPWUrMTJ8MDtpZigoY1tkPj4yXXwwKSE9KGx8MCkpcmEoKTthPWIrOHwwO2lmKChjW2E+PjJdfDApPT0obHwwKSl7Y1tkPj4yXT1iO2NbYT4+Ml09ZTtqPWI7YnJlYWt9ZWxzZSByYSgpfXdoaWxlKDApO2lmKGcpe2Q9Y1tsKzI4Pj4yXXwwO2E9MzIzODQrKGQ8PDIpfDA7aWYoKGx8MCk9PShjW2E+PjJdfDApKXtjW2E+PjJdPWo7aWYoIWope2NbODAyMV09Y1s4MDIxXSZ+KDE8PGQpO3I9bDtmPWs7YnJlYWt9fWVsc2V7aWYoZz4+PjA8KGNbODAyNF18MCk+Pj4wKXJhKCk7ZD1nKzE2fDA7aWYoKGNbZD4+Ml18MCk9PShsfDApKWNbZD4+Ml09ajtlbHNlIGNbZysyMD4+Ml09ajtpZighail7cj1sO2Y9azticmVha319Yj1jWzgwMjRdfDA7aWYoaj4+PjA8Yj4+PjApcmEoKTtjW2orMjQ+PjJdPWc7ZD1sKzE2fDA7YT1jW2Q+PjJdfDA7ZG8gaWYoYSlpZihhPj4+MDxiPj4+MClyYSgpO2Vsc2V7Y1tqKzE2Pj4yXT1hO2NbYSsyND4+Ml09ajticmVha313aGlsZSgwKTtkPWNbZCs0Pj4yXXwwO2lmKGQpaWYoZD4+PjA8KGNbODAyNF18MCk+Pj4wKXJhKCk7ZWxzZXtjW2orMjA+PjJdPWQ7Y1tkKzI0Pj4yXT1qO3I9bDtmPWs7YnJlYWt9ZWxzZXtyPWw7Zj1rfX1lbHNle3I9bDtmPWt9fWVsc2V7cj1hO2Y9Yn13aGlsZSgwKTtoPWNbODAyNF18MDtpZihvPj4+MDxoPj4+MClyYSgpO2Q9bys0fDA7YT1jW2Q+PjJdfDA7aWYoIShhJjIpKXtpZigob3wwKT09KGNbODAyNl18MCkpe3E9KGNbODAyM118MCkrZnwwO2NbODAyM109cTtjWzgwMjZdPXI7Y1tyKzQ+PjJdPXF8MTtpZigocnwwKSE9KGNbODAyNV18MCkpcmV0dXJuO2NbODAyNV09MDtjWzgwMjJdPTA7cmV0dXJufWlmKChvfDApPT0oY1s4MDI1XXwwKSl7cT0oY1s4MDIyXXwwKStmfDA7Y1s4MDIyXT1xO2NbODAyNV09cjtjW3IrND4+Ml09cXwxO2NbcitxPj4yXT1xO3JldHVybn1mPShhJi04KStmfDA7ZT1hPj4+MztkbyBpZihhPj4+MD49MjU2KXtnPWNbbysyND4+Ml18MDtiPWNbbysxMj4+Ml18MDtkbyBpZigoYnwwKT09KG98MCkpe2I9bysxNnwwO2E9Yis0fDA7ZD1jW2E+PjJdfDA7aWYoIWQpe2Q9Y1tiPj4yXXwwO2lmKCFkKXtuPTA7YnJlYWt9ZWxzZSBhPWJ9d2hpbGUoMSl7Yj1kKzIwfDA7ZT1jW2I+PjJdfDA7aWYoZSl7ZD1lO2E9Yjtjb250aW51ZX1iPWQrMTZ8MDtlPWNbYj4+Ml18MDtpZighZSlicmVhaztlbHNle2Q9ZTthPWJ9fWlmKGE+Pj4wPGg+Pj4wKXJhKCk7ZWxzZXtjW2E+PjJdPTA7bj1kO2JyZWFrfX1lbHNle2U9Y1tvKzg+PjJdfDA7aWYoZT4+PjA8aD4+PjApcmEoKTtkPWUrMTJ8MDtpZigoY1tkPj4yXXwwKSE9KG98MCkpcmEoKTthPWIrOHwwO2lmKChjW2E+PjJdfDApPT0ob3wwKSl7Y1tkPj4yXT1iO2NbYT4+Ml09ZTtuPWI7YnJlYWt9ZWxzZSByYSgpfXdoaWxlKDApO2lmKGcpe2Q9Y1tvKzI4Pj4yXXwwO2E9MzIzODQrKGQ8PDIpfDA7aWYoKG98MCk9PShjW2E+PjJdfDApKXtjW2E+PjJdPW47aWYoIW4pe2NbODAyMV09Y1s4MDIxXSZ+KDE8PGQpO2JyZWFrfX1lbHNle2lmKGc+Pj4wPChjWzgwMjRdfDApPj4+MClyYSgpO2Q9ZysxNnwwO2lmKChjW2Q+PjJdfDApPT0ob3wwKSljW2Q+PjJdPW47ZWxzZSBjW2crMjA+PjJdPW47aWYoIW4pYnJlYWt9Yj1jWzgwMjRdfDA7aWYobj4+PjA8Yj4+PjApcmEoKTtjW24rMjQ+PjJdPWc7ZD1vKzE2fDA7YT1jW2Q+PjJdfDA7ZG8gaWYoYSlpZihhPj4+MDxiPj4+MClyYSgpO2Vsc2V7Y1tuKzE2Pj4yXT1hO2NbYSsyND4+Ml09bjticmVha313aGlsZSgwKTtkPWNbZCs0Pj4yXXwwO2lmKGQpaWYoZD4+PjA8KGNbODAyNF18MCk+Pj4wKXJhKCk7ZWxzZXtjW24rMjA+PjJdPWQ7Y1tkKzI0Pj4yXT1uO2JyZWFrfX19ZWxzZXthPWNbbys4Pj4yXXwwO2I9Y1tvKzEyPj4yXXwwO2Q9MzIxMjArKGU8PDE8PDIpfDA7aWYoKGF8MCkhPShkfDApKXtpZihhPj4+MDxoPj4+MClyYSgpO2lmKChjW2ErMTI+PjJdfDApIT0ob3wwKSlyYSgpfWlmKChifDApPT0oYXwwKSl7Y1s4MDIwXT1jWzgwMjBdJn4oMTw8ZSk7YnJlYWt9aWYoKGJ8MCkhPShkfDApKXtpZihiPj4+MDxoPj4+MClyYSgpO2Q9Yis4fDA7aWYoKGNbZD4+Ml18MCk9PShvfDApKW09ZDtlbHNlIHJhKCl9ZWxzZSBtPWIrOHwwO2NbYSsxMj4+Ml09YjtjW20+PjJdPWF9d2hpbGUoMCk7Y1tyKzQ+PjJdPWZ8MTtjW3IrZj4+Ml09ZjtpZigocnwwKT09KGNbODAyNV18MCkpe2NbODAyMl09ZjtyZXR1cm59fWVsc2V7Y1tkPj4yXT1hJi0yO2Nbcis0Pj4yXT1mfDE7Y1tyK2Y+PjJdPWZ9ZD1mPj4+MztpZihmPj4+MDwyNTYpe2I9MzIxMjArKGQ8PDE8PDIpfDA7YT1jWzgwMjBdfDA7ZD0xPDxkO2lmKGEmZCl7ZD1iKzh8MDthPWNbZD4+Ml18MDtpZihhPj4+MDwoY1s4MDI0XXwwKT4+PjApcmEoKTtlbHNle3A9ZDtxPWF9fWVsc2V7Y1s4MDIwXT1hfGQ7cD1iKzh8MDtxPWJ9Y1twPj4yXT1yO2NbcSsxMj4+Ml09cjtjW3IrOD4+Ml09cTtjW3IrMTI+PjJdPWI7cmV0dXJufWQ9Zj4+Pjg7aWYoZClpZihmPj4+MD4xNjc3NzIxNSliPTMxO2Vsc2V7cD0oZCsxMDQ4MzIwfDApPj4+MTYmODtxPWQ8PHA7bz0ocSs1MjAxOTJ8MCk+Pj4xNiY0O3E9cTw8bztiPShxKzI0NTc2MHwwKT4+PjE2JjI7Yj0xNC0ob3xwfGIpKyhxPDxiPj4+MTUpfDA7Yj1mPj4+KGIrN3wwKSYxfGI8PDF9ZWxzZSBiPTA7ZT0zMjM4NCsoYjw8Mil8MDtjW3IrMjg+PjJdPWI7Y1tyKzIwPj4yXT0wO2NbcisxNj4+Ml09MDtkPWNbODAyMV18MDthPTE8PGI7aWYoIShkJmEpKXtjWzgwMjFdPWR8YTtjW2U+PjJdPXI7Y1tyKzI0Pj4yXT1lO2NbcisxMj4+Ml09cjtjW3IrOD4+Ml09cjtyZXR1cm59Yj1mPDwoKGJ8MCk9PTMxPzA6MjUtKGI+Pj4xKXwwKTtlPWNbZT4+Ml18MDt3aGlsZSgxKXtpZigoY1tlKzQ+PjJdJi04fDApPT0oZnwwKSl7ZD0xMjc7YnJlYWt9YT1lKzE2KyhiPj4+MzE8PDIpfDA7ZD1jW2E+PjJdfDA7aWYoIWQpe2Q9MTI0O2JyZWFrfWVsc2V7Yj1iPDwxO2U9ZH19aWYoKGR8MCk9PTEyNCl7aWYoYT4+PjA8KGNbODAyNF18MCk+Pj4wKXJhKCk7Y1thPj4yXT1yO2NbcisyND4+Ml09ZTtjW3IrMTI+PjJdPXI7Y1tyKzg+PjJdPXI7cmV0dXJufWVsc2UgaWYoKGR8MCk9PTEyNyl7ZD1lKzh8MDthPWNbZD4+Ml18MDtxPWNbODAyNF18MDtpZighKGE+Pj4wPj1xPj4+MCZlPj4+MD49cT4+PjApKXJhKCk7Y1thKzEyPj4yXT1yO2NbZD4+Ml09cjtjW3IrOD4+Ml09YTtjW3IrMTI+PjJdPWU7Y1tyKzI0Pj4yXT0wO3JldHVybn19ZnVuY3Rpb24gQmQoKXt9ZnVuY3Rpb24gQ2QoYSxiLGMsZCl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZD1iLWQtKGM+Pj4wPmE+Pj4wfDApPj4+MDtyZXR1cm4gKEM9ZCxhLWM+Pj4wfDApfDB9ZnVuY3Rpb24gRGQoYSxiLGMsZCl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7Yz1hK2M+Pj4wO3JldHVybiAoQz1iK2QrKGM+Pj4wPGE+Pj4wfDApPj4+MCxjfDApfDB9ZnVuY3Rpb24gRWQoYSxiLGMpe2E9YXwwO2I9YnwwO2M9Y3wwO2lmKChjfDApPDMyKXtDPWI+PmM7cmV0dXJuIGE+Pj5jfChiJigxPDxjKS0xKTw8MzItY31DPShifDApPDA/LTE6MDtyZXR1cm4gYj4+Yy0zMnwwfWZ1bmN0aW9uIEZkKGIsZCxlKXtiPWJ8MDtkPWR8MDtlPWV8MDt2YXIgZj0wLGc9MCxoPTAsaT0wO2Y9YitlfDA7aWYoKGV8MCk+PTIwKXtkPWQmMjU1O2g9YiYzO2k9ZHxkPDw4fGQ8PDE2fGQ8PDI0O2c9ZiZ+MztpZihoKXtoPWIrNC1ofDA7d2hpbGUoKGJ8MCk8KGh8MCkpe2FbYj4+MF09ZDtiPWIrMXwwfX13aGlsZSgoYnwwKTwoZ3wwKSl7Y1tiPj4yXT1pO2I9Yis0fDB9fXdoaWxlKChifDApPChmfDApKXthW2I+PjBdPWQ7Yj1iKzF8MH1yZXR1cm4gYi1lfDB9ZnVuY3Rpb24gR2QoYSxiLGMpe2E9YXwwO2I9YnwwO2M9Y3wwO2lmKChjfDApPDMyKXtDPWI+Pj5jO3JldHVybiBhPj4+Y3woYiYoMTw8YyktMSk8PDMyLWN9Qz0wO3JldHVybiBiPj4+Yy0zMnwwfWZ1bmN0aW9uIEhkKGEsYixjKXthPWF8MDtiPWJ8MDtjPWN8MDtpZigoY3wwKTwzMil7Qz1iPDxjfChhJigxPDxjKS0xPDwzMi1jKT4+PjMyLWM7cmV0dXJuIGE8PGN9Qz1hPDxjLTMyO3JldHVybiAwfWZ1bmN0aW9uIElkKGIsZCxlKXtiPWJ8MDtkPWR8MDtlPWV8MDt2YXIgZj0wO2lmKChlfDApPj00MDk2KXJldHVybiB2YShifDAsZHwwLGV8MCl8MDtmPWJ8MDtpZigoYiYzKT09KGQmMykpe3doaWxlKGImMyl7aWYoIWUpcmV0dXJuIGZ8MDthW2I+PjBdPWFbZD4+MF18MDtiPWIrMXwwO2Q9ZCsxfDA7ZT1lLTF8MH13aGlsZSgoZXwwKT49NCl7Y1tiPj4yXT1jW2Q+PjJdO2I9Yis0fDA7ZD1kKzR8MDtlPWUtNHwwfX13aGlsZSgoZXwwKT4wKXthW2I+PjBdPWFbZD4+MF18MDtiPWIrMXwwO2Q9ZCsxfDA7ZT1lLTF8MH1yZXR1cm4gZnwwfWZ1bmN0aW9uIEpkKGIsYyxkKXtiPWJ8MDtjPWN8MDtkPWR8MDt2YXIgZT0wO2lmKChjfDApPChifDApJihifDApPChjK2R8MCkpe2U9YjtjPWMrZHwwO2I9YitkfDA7d2hpbGUoKGR8MCk+MCl7Yj1iLTF8MDtjPWMtMXwwO2Q9ZC0xfDA7YVtiPj4wXT1hW2M+PjBdfDB9Yj1lfWVsc2UgSWQoYixjLGQpfDA7cmV0dXJuIGJ8MH1mdW5jdGlvbiBLZChiKXtiPWJ8MDt2YXIgYz0wO2M9YVttKyhiJjI1NSk+PjBdfDA7aWYoKGN8MCk8OClyZXR1cm4gY3wwO2M9YVttKyhiPj44JjI1NSk+PjBdfDA7aWYoKGN8MCk8OClyZXR1cm4gYys4fDA7Yz1hW20rKGI+PjE2JjI1NSk+PjBdfDA7aWYoKGN8MCk8OClyZXR1cm4gYysxNnwwO3JldHVybiAoYVttKyhiPj4+MjQpPj4wXXwwKSsyNHwwfWZ1bmN0aW9uIExkKGEsYil7YT1hfDA7Yj1ifDA7dmFyIGM9MCxkPTAsZT0wLGY9MDtmPWEmNjU1MzU7ZT1iJjY1NTM1O2M9XyhlLGYpfDA7ZD1hPj4+MTY7YT0oYz4+PjE2KSsoXyhlLGQpfDApfDA7ZT1iPj4+MTY7Yj1fKGUsZil8MDtyZXR1cm4gKEM9KGE+Pj4xNikrKF8oZSxkKXwwKSsoKChhJjY1NTM1KStifDApPj4+MTYpfDAsYStiPDwxNnxjJjY1NTM1fDApfDB9ZnVuY3Rpb24gTWQoYSxiLGMsZCl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7dmFyIGU9MCxmPTAsZz0wLGg9MCxpPTAsaj0wO2o9Yj4+MzF8KChifDApPDA/LTE6MCk8PDE7aT0oKGJ8MCk8MD8tMTowKT4+MzF8KChifDApPDA/LTE6MCk8PDE7Zj1kPj4zMXwoKGR8MCk8MD8tMTowKTw8MTtlPSgoZHwwKTwwPy0xOjApPj4zMXwoKGR8MCk8MD8tMTowKTw8MTtoPUNkKGpeYSxpXmIsaixpKXwwO2c9QzthPWZeajtiPWVeaTtyZXR1cm4gQ2QoKFJkKGgsZyxDZChmXmMsZV5kLGYsZSl8MCxDLDApfDApXmEsQ15iLGEsYil8MH1mdW5jdGlvbiBOZChhLGIsZCxlKXthPWF8MDtiPWJ8MDtkPWR8MDtlPWV8MDt2YXIgZj0wLGc9MCxoPTAsaj0wLGs9MCxsPTA7Zj1pO2k9aSsxNnwwO2o9ZnwwO2g9Yj4+MzF8KChifDApPDA/LTE6MCk8PDE7Zz0oKGJ8MCk8MD8tMTowKT4+MzF8KChifDApPDA/LTE6MCk8PDE7bD1lPj4zMXwoKGV8MCk8MD8tMTowKTw8MTtrPSgoZXwwKTwwPy0xOjApPj4zMXwoKGV8MCk8MD8tMTowKTw8MTthPUNkKGheYSxnXmIsaCxnKXwwO2I9QztSZChhLGIsQ2QobF5kLGteZSxsLGspfDAsQyxqKXwwO2U9Q2QoY1tqPj4yXV5oLGNbais0Pj4yXV5nLGgsZyl8MDtkPUM7aT1mO3JldHVybiAoQz1kLGUpfDB9ZnVuY3Rpb24gT2QoYSxiLGMsZCl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7dmFyIGU9MCxmPTA7ZT1hO2Y9YztjPUxkKGUsZil8MDthPUM7cmV0dXJuIChDPShfKGIsZil8MCkrKF8oZCxlKXwwKSthfGEmMCxjfDB8MCl8MH1mdW5jdGlvbiBQZChhLGIsYyxkKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtyZXR1cm4gUmQoYSxiLGMsZCwwKXwwfWZ1bmN0aW9uIFFkKGEsYixkLGUpe2E9YXwwO2I9YnwwO2Q9ZHwwO2U9ZXwwO3ZhciBmPTAsZz0wO2c9aTtpPWkrMTZ8MDtmPWd8MDtSZChhLGIsZCxlLGYpfDA7aT1nO3JldHVybiAoQz1jW2YrND4+Ml18MCxjW2Y+PjJdfDApfDB9ZnVuY3Rpb24gUmQoYSxiLGQsZSxmKXthPWF8MDtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDt2YXIgZz0wLGg9MCxpPTAsaj0wLGs9MCxsPTAsbT0wLG49MCxvPTAscD0wO2w9YTtqPWI7az1qO2g9ZDtuPWU7aT1uO2lmKCFrKXtnPShmfDApIT0wO2lmKCFpKXtpZihnKXtjW2Y+PjJdPShsPj4+MCklKGg+Pj4wKTtjW2YrND4+Ml09MH1uPTA7Zj0obD4+PjApLyhoPj4+MCk+Pj4wO3JldHVybiAoQz1uLGYpfDB9ZWxzZXtpZighZyl7bj0wO2Y9MDtyZXR1cm4gKEM9bixmKXwwfWNbZj4+Ml09YXwwO2NbZis0Pj4yXT1iJjA7bj0wO2Y9MDtyZXR1cm4gKEM9bixmKXwwfX1nPShpfDApPT0wO2RvIGlmKGgpe2lmKCFnKXtnPShhYShpfDApfDApLShhYShrfDApfDApfDA7aWYoZz4+PjA8PTMxKXttPWcrMXwwO2k9MzEtZ3wwO2I9Zy0zMT4+MzE7aD1tO2E9bD4+PihtPj4+MCkmYnxrPDxpO2I9az4+PihtPj4+MCkmYjtnPTA7aT1sPDxpO2JyZWFrfWlmKCFmKXtuPTA7Zj0wO3JldHVybiAoQz1uLGYpfDB9Y1tmPj4yXT1hfDA7Y1tmKzQ+PjJdPWp8YiYwO249MDtmPTA7cmV0dXJuIChDPW4sZil8MH1nPWgtMXwwO2lmKGcmaCl7aT0oYWEoaHwwKXwwKSszMy0oYWEoa3wwKXwwKXwwO3A9NjQtaXwwO209MzItaXwwO2o9bT4+MzE7bz1pLTMyfDA7Yj1vPj4zMTtoPWk7YT1tLTE+PjMxJms+Pj4obz4+PjApfChrPDxtfGw+Pj4oaT4+PjApKSZiO2I9YiZrPj4+KGk+Pj4wKTtnPWw8PHAmajtpPShrPDxwfGw+Pj4obz4+PjApKSZqfGw8PG0maS0zMz4+MzE7YnJlYWt9aWYoZil7Y1tmPj4yXT1nJmw7Y1tmKzQ+PjJdPTB9aWYoKGh8MCk9PTEpe289anxiJjA7cD1hfDB8MDtyZXR1cm4gKEM9byxwKXwwfWVsc2V7cD1LZChofDApfDA7bz1rPj4+KHA+Pj4wKXwwO3A9azw8MzItcHxsPj4+KHA+Pj4wKXwwO3JldHVybiAoQz1vLHApfDB9fWVsc2V7aWYoZyl7aWYoZil7Y1tmPj4yXT0oaz4+PjApJShoPj4+MCk7Y1tmKzQ+PjJdPTB9bz0wO3A9KGs+Pj4wKS8oaD4+PjApPj4+MDtyZXR1cm4gKEM9byxwKXwwfWlmKCFsKXtpZihmKXtjW2Y+PjJdPTA7Y1tmKzQ+PjJdPShrPj4+MCklKGk+Pj4wKX1vPTA7cD0oaz4+PjApLyhpPj4+MCk+Pj4wO3JldHVybiAoQz1vLHApfDB9Zz1pLTF8MDtpZighKGcmaSkpe2lmKGYpe2NbZj4+Ml09YXwwO2NbZis0Pj4yXT1nJmt8YiYwfW89MDtwPWs+Pj4oKEtkKGl8MCl8MCk+Pj4wKTtyZXR1cm4gKEM9byxwKXwwfWc9KGFhKGl8MCl8MCktKGFhKGt8MCl8MCl8MDtpZihnPj4+MDw9MzApe2I9ZysxfDA7aT0zMS1nfDA7aD1iO2E9azw8aXxsPj4+KGI+Pj4wKTtiPWs+Pj4oYj4+PjApO2c9MDtpPWw8PGk7YnJlYWt9aWYoIWYpe289MDtwPTA7cmV0dXJuIChDPW8scCl8MH1jW2Y+PjJdPWF8MDtjW2YrND4+Ml09anxiJjA7bz0wO3A9MDtyZXR1cm4gKEM9byxwKXwwfXdoaWxlKDApO2lmKCFoKXtrPWk7aj0wO2k9MH1lbHNle209ZHwwfDA7bD1ufGUmMDtrPURkKG18MCxsfDAsLTEsLTEpfDA7ZD1DO2o9aTtpPTA7ZG97ZT1qO2o9Zz4+PjMxfGo8PDE7Zz1pfGc8PDE7ZT1hPDwxfGU+Pj4zMXwwO249YT4+PjMxfGI8PDF8MDtDZChrLGQsZSxuKXwwO3A9QztvPXA+PjMxfCgocHwwKTwwPy0xOjApPDwxO2k9byYxO2E9Q2QoZSxuLG8mbSwoKChwfDApPDA/LTE6MCk+PjMxfCgocHwwKTwwPy0xOjApPDwxKSZsKXwwO2I9QztoPWgtMXwwfXdoaWxlKChofDApIT0wKTtrPWo7aj0wfWg9MDtpZihmKXtjW2Y+PjJdPWE7Y1tmKzQ+PjJdPWJ9bz0oZ3wwKT4+PjMxfChrfGgpPDwxfChoPDwxfGc+Pj4zMSkmMHxqO3A9KGc8PDF8MD4+PjMxKSYtMnxpO3JldHVybiAoQz1vLHApfDB9ZnVuY3Rpb24gU2QoYSl7YT1hfDA7cmV0dXJuIERhW2EmMzFdKCl8MH1mdW5jdGlvbiBUZCgpe3JldHVybiBlYSgwKXwwfWZ1bmN0aW9uIFVkKCl7cmV0dXJuIGVhKDEpfDB9ZnVuY3Rpb24gVmQoKXtyZXR1cm4gZWEoMil8MH1mdW5jdGlvbiBXZCgpe3JldHVybiBlYSgzKXwwfWZ1bmN0aW9uIFhkKCl7cmV0dXJuIGVhKDQpfDB9ZnVuY3Rpb24gWWQoKXtyZXR1cm4gZWEoNSl8MH1mdW5jdGlvbiBaZCgpe3JldHVybiBlYSg2KXwwfWZ1bmN0aW9uIF9kKCl7cmV0dXJuIGVhKDcpfDB9ZnVuY3Rpb24gJGQoYSxiKXthPWF8MDtiPWJ8MDtyZXR1cm4gRWFbYSYzMV0oYnwwKXwwfWZ1bmN0aW9uIGFlKGEpe2E9YXwwO3JldHVybiBnYSgwLGF8MCl8MH1mdW5jdGlvbiBiZShhKXthPWF8MDtyZXR1cm4gZ2EoMSxhfDApfDB9ZnVuY3Rpb24gY2UoYSl7YT1hfDA7cmV0dXJuIGdhKDIsYXwwKXwwfWZ1bmN0aW9uIGRlKGEpe2E9YXwwO3JldHVybiBnYSgzLGF8MCl8MH1mdW5jdGlvbiBlZShhKXthPWF8MDtyZXR1cm4gZ2EoNCxhfDApfDB9ZnVuY3Rpb24gZmUoYSl7YT1hfDA7cmV0dXJuIGdhKDUsYXwwKXwwfWZ1bmN0aW9uIGdlKGEpe2E9YXwwO3JldHVybiBnYSg2LGF8MCl8MH1mdW5jdGlvbiBoZShhKXthPWF8MDtyZXR1cm4gZ2EoNyxhfDApfDB9ZnVuY3Rpb24gaWUoYSxiLGMsZCl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7cmV0dXJuIEZhW2EmMzFdKGJ8MCxjfDAsZHwwKXwwfWZ1bmN0aW9uIGplKGEsYixjKXthPWF8MDtiPWJ8MDtjPWN8MDtyZXR1cm4gaWEoMCxhfDAsYnwwLGN8MCl8MH1mdW5jdGlvbiBrZShhLGIsYyl7YT1hfDA7Yj1ifDA7Yz1jfDA7cmV0dXJuIGlhKDEsYXwwLGJ8MCxjfDApfDB9ZnVuY3Rpb24gbGUoYSxiLGMpe2E9YXwwO2I9YnwwO2M9Y3wwO3JldHVybiBpYSgyLGF8MCxifDAsY3wwKXwwfWZ1bmN0aW9uIG1lKGEsYixjKXthPWF8MDtiPWJ8MDtjPWN8MDtyZXR1cm4gaWEoMyxhfDAsYnwwLGN8MCl8MH1mdW5jdGlvbiBuZShhLGIsYyl7YT1hfDA7Yj1ifDA7Yz1jfDA7cmV0dXJuIGlhKDQsYXwwLGJ8MCxjfDApfDB9ZnVuY3Rpb24gb2UoYSxiLGMpe2E9YXwwO2I9YnwwO2M9Y3wwO3JldHVybiBpYSg1LGF8MCxifDAsY3wwKXwwfWZ1bmN0aW9uIHBlKGEsYixjKXthPWF8MDtiPWJ8MDtjPWN8MDtyZXR1cm4gaWEoNixhfDAsYnwwLGN8MCl8MH1mdW5jdGlvbiBxZShhLGIsYyl7YT1hfDA7Yj1ifDA7Yz1jfDA7cmV0dXJuIGlhKDcsYXwwLGJ8MCxjfDApfDB9ZnVuY3Rpb24gcmUoYSxiKXthPWF8MDtiPWJ8MDtHYVthJjMxXShifDApfWZ1bmN0aW9uIHNlKGEpe2E9YXwwO2thKDAsYXwwKX1mdW5jdGlvbiB0ZShhKXthPWF8MDtrYSgxLGF8MCl9ZnVuY3Rpb24gdWUoYSl7YT1hfDA7a2EoMixhfDApfWZ1bmN0aW9uIHZlKGEpe2E9YXwwO2thKDMsYXwwKX1mdW5jdGlvbiB3ZShhKXthPWF8MDtrYSg0LGF8MCl9ZnVuY3Rpb24geGUoYSl7YT1hfDA7a2EoNSxhfDApfWZ1bmN0aW9uIHllKGEpe2E9YXwwO2thKDYsYXwwKX1mdW5jdGlvbiB6ZShhKXthPWF8MDtrYSg3LGF8MCl9ZnVuY3Rpb24gQWUoKXtiYSgwKTtyZXR1cm4gMH1mdW5jdGlvbiBCZShhKXthPWF8MDtiYSgxKTtyZXR1cm4gMH1mdW5jdGlvbiBDZShhLGIsYyl7YT1hfDA7Yj1ifDA7Yz1jfDA7YmEoMik7cmV0dXJuIDB9ZnVuY3Rpb24gRGUoYSl7YT1hfDA7YmEoMyl9XG5cbi8vIEVNU0NSSVBURU5fRU5EX0ZVTkNTXG52YXIgRGE9W0FlLEFlLFRkLEFlLFVkLEFlLFZkLEFlLFdkLEFlLFhkLEFlLFlkLEFlLFpkLEFlLF9kLEFlLEFlLEFlLEFlLEFlLEFlLEFlLEFlLEFlLEFlLEFlLEFlLEFlLEFlLEFlXTt2YXIgRWE9W0JlLEJlLGFlLEJlLGJlLEJlLGNlLEJlLGRlLEJlLGVlLEJlLGZlLEJlLGdlLEJlLGhlLEJlLHBkLEJlLEJlLEJlLEJlLEJlLEJlLEJlLEJlLEJlLEJlLEJlLEJlLEJlXTt2YXIgRmE9W0NlLENlLGplLENlLGtlLENlLGxlLENlLG1lLENlLG5lLENlLG9lLENlLHBlLENlLHFlLENlLHNkLHFkLHJkLENlLENlLENlLENlLENlLENlLENlLENlLENlLENlLENlXTt2YXIgR2E9W0RlLERlLHNlLERlLHRlLERlLHVlLERlLHZlLERlLHdlLERlLHhlLERlLHllLERlLHplLERlLHdkLERlLERlLERlLERlLERlLERlLERlLERlLERlLERlLERlLERlLERlXTtyZXR1cm57X3NvZGl1bV9saWJyYXJ5X3ZlcnNpb25fbWlub3I6amQsX2NyeXB0b19vbmV0aW1lYXV0aF9ieXRlczpKYixfc29kaXVtX3ZlcnNpb25fc3RyaW5nOmhkLF9zb2RpdW1faGV4MmJpbjpnZCxfY3J5cHRvX3B3aGFzaF9zY3J5cHRzYWxzYTIwOHNoYTI1Nl9tZW1saW1pdF9zZW5zaXRpdmU6ZGMsX2JpdHNoaWZ0NjRMc2hyOkdkLF9jcnlwdG9fcHdoYXNoX3NjcnlwdHNhbHNhMjA4c2hhMjU2OmVjLF9jcnlwdG9fYm94X25vbmNlYnl0ZXM6WmEsX2NyeXB0b19ib3hfYmVmb3Jlbm06YmIsX2NyeXB0b19zY2FsYXJtdWx0X2Jhc2U6bWMsX2NyeXB0b19hdXRoX2J5dGVzOlFhLF9jcnlwdG9fc2lnbl9vcGVuOkZjLF9tZW1jcHk6SWQsX2NyeXB0b19ib3hfc2VlZF9rZXlwYWlyOiRhLF9jcnlwdG9fcHdoYXNoX3NjcnlwdHNhbHNhMjA4c2hhMjU2X21lbWxpbWl0X2ludGVyYWN0aXZlOmJjLF9jcnlwdG9fYm94X29wZW5fZWFzeV9hZnRlcm5tOmliLF9jcnlwdG9fc2lnbl9lZDI1NTE5X3NrX3RvX2N1cnZlMjU1MTk6VWMsX3NvZGl1bV9tZW16ZXJvOmVkLF9jcnlwdG9fYm94X3NlYWw6a2IsX2ZyZWU6emQsX2NyeXB0b19zaG9ydGhhc2g6eGMsX2NyeXB0b19hdXRoX2tleWJ5dGVzOlJhLF9jcnlwdG9fcHdoYXNoX3NjcnlwdHNhbHNhMjA4c2hhMjU2X3NhbHRieXRlczpaYixfY3J5cHRvX3NpZ25fc2VlZGJ5dGVzOnpjLF9jcnlwdG9fYm94X2RldGFjaGVkX2FmdGVybm06Y2IsX2NyeXB0b19hdXRoOlNhLF9yYW5kb21ieXRlc19yYW5kb206X2MsX2NyeXB0b19zaWduX2tleXBhaXI6RGMsX2NyeXB0b19zaG9ydGhhc2hfa2V5Ynl0ZXM6d2MsX2NyeXB0b19nZW5lcmljaGFzaF9zdGF0ZWJ5dGVzOnZiLF9jcnlwdG9fcHdoYXNoX3NjcnlwdHNhbHNhMjA4c2hhMjU2X3N0cl92ZXJpZnk6Z2MsX2NyeXB0b19nZW5lcmljaGFzaF9pbml0OnhiLF9jcnlwdG9fZ2VuZXJpY2hhc2hfa2V5Ynl0ZXNfbWF4OnRiLF9jcnlwdG9fc2lnbl9lZDI1NTE5X3BrX3RvX2N1cnZlMjU1MTk6VGMsX2NyeXB0b19ib3hfYmVmb3Jlbm1ieXRlczpZYSxfY3J5cHRvX2dlbmVyaWNoYXNoOndiLF9zb2RpdW1fbGlicmFyeV92ZXJzaW9uX21ham9yOmlkLF9yYW5kb21ieXRlc19zdGlyOiRjLF9yYW5kb21ieXRlc19jbG9zZTpjZCxfY3J5cHRvX29uZXRpbWVhdXRoX2tleWJ5dGVzOktiLF9jcnlwdG9fb25ldGltZWF1dGg6TGIsX2NyeXB0b19zaG9ydGhhc2hfYnl0ZXM6dmMsX2NyeXB0b19ib3hfc2VjcmV0a2V5Ynl0ZXM6WGEsX2NyeXB0b19vbmV0aW1lYXV0aF91cGRhdGU6T2IsX2NyeXB0b19wd2hhc2hfc2NyeXB0c2Fsc2EyMDhzaGEyNTZfbGw6V2IsX2NyeXB0b19ib3hfZGV0YWNoZWQ6ZGIsX3JhbmRvbWJ5dGVzX2J1ZjpiZCxfY3J5cHRvX3B3aGFzaF9zY3J5cHRzYWxzYTIwOHNoYTI1Nl9zdHI6ZmMsX2JpdHNoaWZ0NjRBc2hyOkVkLF9jcnlwdG9fYm94X29wZW5fZGV0YWNoZWQ6aGIsX2NyeXB0b19zY2FsYXJtdWx0X2J5dGVzOmtjLF9jcnlwdG9fYXV0aF92ZXJpZnk6VGEsX2NyeXB0b19ib3hfc2VhbF9vcGVuOmxiLF9jcnlwdG9fc2VjcmV0Ym94X2RldGFjaGVkOnJjLF9jcnlwdG9fc2VjcmV0Ym94X2Vhc3k6c2MsX2NyeXB0b19wd2hhc2hfc2NyeXB0c2Fsc2EyMDhzaGEyNTZfc3RyYnl0ZXM6X2IsX21lbXNldDpGZCxfY3J5cHRvX2JveF9vcGVuX2RldGFjaGVkX2FmdGVybm06Z2IsX2NyeXB0b19ib3hfc2VhbGJ5dGVzOm1iLF9pNjRTdWJ0cmFjdDpDZCxfY3J5cHRvX3B3aGFzaF9zY3J5cHRzYWxzYTIwOHNoYTI1Nl9zdHJwcmVmaXg6JGIsX2NyeXB0b19ib3hfc2VlZGJ5dGVzOlZhLF9jcnlwdG9faGFzaDpDYixfY3J5cHRvX2JveF9lYXN5X2FmdGVybm06ZWIsX2NyeXB0b19ib3hfbWFjYnl0ZXM6X2EsX2NyeXB0b19ib3hfcHVibGlja2V5Ynl0ZXM6V2EsX3NvZGl1bV9iaW4yaGV4OmZkLF9jcnlwdG9fc2lnbl9zZWNyZXRrZXlieXRlczpCYyxfY3J5cHRvX3NjYWxhcm11bHRfc2NhbGFyYnl0ZXM6bGMsX2NyeXB0b19vbmV0aW1lYXV0aF9zdGF0ZWJ5dGVzOkliLF9jcnlwdG9fZ2VuZXJpY2hhc2hfa2V5Ynl0ZXNfbWluOnNiLF9tYWxsb2M6eWQsX21lbW1vdmU6SmQsX2NyeXB0b19zaWduOkVjLF9jcnlwdG9fc2VjcmV0Ym94X25vbmNlYnl0ZXM6cGMsX3JhbmRvbWJ5dGVzX3NldF9pbXBsZW1lbnRhdGlvbjpaYyxfY3J5cHRvX2JveF9rZXlwYWlyOmFiLF9jcnlwdG9fZ2VuZXJpY2hhc2hfa2V5Ynl0ZXM6dWIsX2NyeXB0b19nZW5lcmljaGFzaF9ieXRlc19taW46cGIsX3NvZGl1bV9pbml0OmRkLF9jcnlwdG9fc2VjcmV0Ym94X21hY2J5dGVzOnFjLF9jcnlwdG9fc2VjcmV0Ym94X2tleWJ5dGVzOm9jLF9iaXRzaGlmdDY0U2hsOkhkLF9jcnlwdG9faGFzaF9ieXRlczpCYixfZmZsdXNoOnRkLF9jcnlwdG9fZ2VuZXJpY2hhc2hfYnl0ZXM6cmIsX2NyeXB0b19nZW5lcmljaGFzaF9ieXRlc19tYXg6cWIsX2NyeXB0b19zZWNyZXRib3hfb3Blbl9kZXRhY2hlZDp0YyxfY3J5cHRvX3NpZ25fdmVyaWZ5X2RldGFjaGVkOkhjLF9jcnlwdG9fb25ldGltZWF1dGhfdmVyaWZ5Ok1iLF9jcnlwdG9fYm94X29wZW5fZWFzeTpqYixfY3J5cHRvX3B3aGFzaF9zY3J5cHRzYWxzYTIwOHNoYTI1Nl9vcHNsaW1pdF9zZW5zaXRpdmU6Y2MsX2NyeXB0b19zaWduX3B1YmxpY2tleWJ5dGVzOkFjLF9pNjRBZGQ6RGQsX2NyeXB0b19zaWduX2J5dGVzOnljLF9jcnlwdG9fZ2VuZXJpY2hhc2hfdXBkYXRlOnliLF9jcnlwdG9fc2NhbGFybXVsdDpuYyxfY3J5cHRvX3NpZ25fZGV0YWNoZWQ6R2MsX2NyeXB0b19ib3hfZWFzeTpmYixfX19lcnJub19sb2NhdGlvbjpvZCxfY3J5cHRvX29uZXRpbWVhdXRoX2ZpbmFsOlBiLF9jcnlwdG9fc2VjcmV0Ym94X29wZW5fZWFzeTp1YyxfY3J5cHRvX2dlbmVyaWNoYXNoX2ZpbmFsOnpiLF9yYW5kb21ieXRlc191bmlmb3JtOmFkLF9jcnlwdG9fc2lnbl9zZWVkX2tleXBhaXI6Q2MsX2NyeXB0b19wd2hhc2hfc2NyeXB0c2Fsc2EyMDhzaGEyNTZfb3BzbGltaXRfaW50ZXJhY3RpdmU6YWMsX2NyeXB0b19vbmV0aW1lYXV0aF9pbml0Ok5iLHJ1blBvc3RTZXRzOkJkLHN0YWNrQWxsb2M6SGEsc3RhY2tTYXZlOklhLHN0YWNrUmVzdG9yZTpKYSxlc3RhYmxpc2hTdGFja1NwYWNlOkthLHNldFRocmV3OkxhLHNldFRlbXBSZXQwOk9hLGdldFRlbXBSZXQwOlBhLGR5bkNhbGxfaTpTZCxkeW5DYWxsX2lpOiRkLGR5bkNhbGxfaWlpaTppZSxkeW5DYWxsX3ZpOnJlfX0pXG5cblxuLy8gRU1TQ1JJUFRFTl9FTkRfQVNNXG4oTW9kdWxlLmFzbUdsb2JhbEFyZyxNb2R1bGUuYXNtTGlicmFyeUFyZyxidWZmZXIpO3ZhciBfc29kaXVtX2xpYnJhcnlfdmVyc2lvbl9taW5vcj1Nb2R1bGVbXCJfc29kaXVtX2xpYnJhcnlfdmVyc2lvbl9taW5vclwiXT1hc21bXCJfc29kaXVtX2xpYnJhcnlfdmVyc2lvbl9taW5vclwiXTt2YXIgX2NyeXB0b19vbmV0aW1lYXV0aF9ieXRlcz1Nb2R1bGVbXCJfY3J5cHRvX29uZXRpbWVhdXRoX2J5dGVzXCJdPWFzbVtcIl9jcnlwdG9fb25ldGltZWF1dGhfYnl0ZXNcIl07dmFyIF9jcnlwdG9fcHdoYXNoX3NjcnlwdHNhbHNhMjA4c2hhMjU2X21lbWxpbWl0X3NlbnNpdGl2ZT1Nb2R1bGVbXCJfY3J5cHRvX3B3aGFzaF9zY3J5cHRzYWxzYTIwOHNoYTI1Nl9tZW1saW1pdF9zZW5zaXRpdmVcIl09YXNtW1wiX2NyeXB0b19wd2hhc2hfc2NyeXB0c2Fsc2EyMDhzaGEyNTZfbWVtbGltaXRfc2Vuc2l0aXZlXCJdO3ZhciBfYml0c2hpZnQ2NExzaHI9TW9kdWxlW1wiX2JpdHNoaWZ0NjRMc2hyXCJdPWFzbVtcIl9iaXRzaGlmdDY0THNoclwiXTt2YXIgX2NyeXB0b19wd2hhc2hfc2NyeXB0c2Fsc2EyMDhzaGEyNTY9TW9kdWxlW1wiX2NyeXB0b19wd2hhc2hfc2NyeXB0c2Fsc2EyMDhzaGEyNTZcIl09YXNtW1wiX2NyeXB0b19wd2hhc2hfc2NyeXB0c2Fsc2EyMDhzaGEyNTZcIl07dmFyIF9jcnlwdG9fYm94X25vbmNlYnl0ZXM9TW9kdWxlW1wiX2NyeXB0b19ib3hfbm9uY2VieXRlc1wiXT1hc21bXCJfY3J5cHRvX2JveF9ub25jZWJ5dGVzXCJdO3ZhciBfY3J5cHRvX2JveF9iZWZvcmVubT1Nb2R1bGVbXCJfY3J5cHRvX2JveF9iZWZvcmVubVwiXT1hc21bXCJfY3J5cHRvX2JveF9iZWZvcmVubVwiXTt2YXIgX2NyeXB0b19zY2FsYXJtdWx0X2Jhc2U9TW9kdWxlW1wiX2NyeXB0b19zY2FsYXJtdWx0X2Jhc2VcIl09YXNtW1wiX2NyeXB0b19zY2FsYXJtdWx0X2Jhc2VcIl07dmFyIF9jcnlwdG9fYXV0aF9ieXRlcz1Nb2R1bGVbXCJfY3J5cHRvX2F1dGhfYnl0ZXNcIl09YXNtW1wiX2NyeXB0b19hdXRoX2J5dGVzXCJdO3ZhciBfY3J5cHRvX3NpZ25fb3Blbj1Nb2R1bGVbXCJfY3J5cHRvX3NpZ25fb3BlblwiXT1hc21bXCJfY3J5cHRvX3NpZ25fb3BlblwiXTt2YXIgX21lbWNweT1Nb2R1bGVbXCJfbWVtY3B5XCJdPWFzbVtcIl9tZW1jcHlcIl07dmFyIF9jcnlwdG9fYm94X3NlZWRfa2V5cGFpcj1Nb2R1bGVbXCJfY3J5cHRvX2JveF9zZWVkX2tleXBhaXJcIl09YXNtW1wiX2NyeXB0b19ib3hfc2VlZF9rZXlwYWlyXCJdO3ZhciBfY3J5cHRvX3B3aGFzaF9zY3J5cHRzYWxzYTIwOHNoYTI1Nl9tZW1saW1pdF9pbnRlcmFjdGl2ZT1Nb2R1bGVbXCJfY3J5cHRvX3B3aGFzaF9zY3J5cHRzYWxzYTIwOHNoYTI1Nl9tZW1saW1pdF9pbnRlcmFjdGl2ZVwiXT1hc21bXCJfY3J5cHRvX3B3aGFzaF9zY3J5cHRzYWxzYTIwOHNoYTI1Nl9tZW1saW1pdF9pbnRlcmFjdGl2ZVwiXTt2YXIgX2NyeXB0b19ib3hfb3Blbl9lYXN5X2FmdGVybm09TW9kdWxlW1wiX2NyeXB0b19ib3hfb3Blbl9lYXN5X2FmdGVybm1cIl09YXNtW1wiX2NyeXB0b19ib3hfb3Blbl9lYXN5X2FmdGVybm1cIl07dmFyIF9jcnlwdG9fc2lnbl9lZDI1NTE5X3NrX3RvX2N1cnZlMjU1MTk9TW9kdWxlW1wiX2NyeXB0b19zaWduX2VkMjU1MTlfc2tfdG9fY3VydmUyNTUxOVwiXT1hc21bXCJfY3J5cHRvX3NpZ25fZWQyNTUxOV9za190b19jdXJ2ZTI1NTE5XCJdO3ZhciBfc29kaXVtX21lbXplcm89TW9kdWxlW1wiX3NvZGl1bV9tZW16ZXJvXCJdPWFzbVtcIl9zb2RpdW1fbWVtemVyb1wiXTt2YXIgX2NyeXB0b19ib3hfc2VhbD1Nb2R1bGVbXCJfY3J5cHRvX2JveF9zZWFsXCJdPWFzbVtcIl9jcnlwdG9fYm94X3NlYWxcIl07dmFyIF9mcmVlPU1vZHVsZVtcIl9mcmVlXCJdPWFzbVtcIl9mcmVlXCJdO3ZhciBydW5Qb3N0U2V0cz1Nb2R1bGVbXCJydW5Qb3N0U2V0c1wiXT1hc21bXCJydW5Qb3N0U2V0c1wiXTt2YXIgX2NyeXB0b19zaG9ydGhhc2g9TW9kdWxlW1wiX2NyeXB0b19zaG9ydGhhc2hcIl09YXNtW1wiX2NyeXB0b19zaG9ydGhhc2hcIl07dmFyIF9jcnlwdG9fYXV0aF9rZXlieXRlcz1Nb2R1bGVbXCJfY3J5cHRvX2F1dGhfa2V5Ynl0ZXNcIl09YXNtW1wiX2NyeXB0b19hdXRoX2tleWJ5dGVzXCJdO3ZhciBfY3J5cHRvX3B3aGFzaF9zY3J5cHRzYWxzYTIwOHNoYTI1Nl9zYWx0Ynl0ZXM9TW9kdWxlW1wiX2NyeXB0b19wd2hhc2hfc2NyeXB0c2Fsc2EyMDhzaGEyNTZfc2FsdGJ5dGVzXCJdPWFzbVtcIl9jcnlwdG9fcHdoYXNoX3NjcnlwdHNhbHNhMjA4c2hhMjU2X3NhbHRieXRlc1wiXTt2YXIgX2NyeXB0b19zaWduX3NlZWRieXRlcz1Nb2R1bGVbXCJfY3J5cHRvX3NpZ25fc2VlZGJ5dGVzXCJdPWFzbVtcIl9jcnlwdG9fc2lnbl9zZWVkYnl0ZXNcIl07dmFyIF9jcnlwdG9fYm94X2RldGFjaGVkX2FmdGVybm09TW9kdWxlW1wiX2NyeXB0b19ib3hfZGV0YWNoZWRfYWZ0ZXJubVwiXT1hc21bXCJfY3J5cHRvX2JveF9kZXRhY2hlZF9hZnRlcm5tXCJdO3ZhciBfY3J5cHRvX2F1dGg9TW9kdWxlW1wiX2NyeXB0b19hdXRoXCJdPWFzbVtcIl9jcnlwdG9fYXV0aFwiXTt2YXIgX3JhbmRvbWJ5dGVzX3JhbmRvbT1Nb2R1bGVbXCJfcmFuZG9tYnl0ZXNfcmFuZG9tXCJdPWFzbVtcIl9yYW5kb21ieXRlc19yYW5kb21cIl07dmFyIF9jcnlwdG9fc2lnbl9rZXlwYWlyPU1vZHVsZVtcIl9jcnlwdG9fc2lnbl9rZXlwYWlyXCJdPWFzbVtcIl9jcnlwdG9fc2lnbl9rZXlwYWlyXCJdO3ZhciBfY3J5cHRvX2dlbmVyaWNoYXNoX2tleWJ5dGVzX21pbj1Nb2R1bGVbXCJfY3J5cHRvX2dlbmVyaWNoYXNoX2tleWJ5dGVzX21pblwiXT1hc21bXCJfY3J5cHRvX2dlbmVyaWNoYXNoX2tleWJ5dGVzX21pblwiXTt2YXIgX2NyeXB0b19nZW5lcmljaGFzaF9zdGF0ZWJ5dGVzPU1vZHVsZVtcIl9jcnlwdG9fZ2VuZXJpY2hhc2hfc3RhdGVieXRlc1wiXT1hc21bXCJfY3J5cHRvX2dlbmVyaWNoYXNoX3N0YXRlYnl0ZXNcIl07dmFyIF9jcnlwdG9fcHdoYXNoX3NjcnlwdHNhbHNhMjA4c2hhMjU2X3N0cl92ZXJpZnk9TW9kdWxlW1wiX2NyeXB0b19wd2hhc2hfc2NyeXB0c2Fsc2EyMDhzaGEyNTZfc3RyX3ZlcmlmeVwiXT1hc21bXCJfY3J5cHRvX3B3aGFzaF9zY3J5cHRzYWxzYTIwOHNoYTI1Nl9zdHJfdmVyaWZ5XCJdO3ZhciBfc29kaXVtX3ZlcnNpb25fc3RyaW5nPU1vZHVsZVtcIl9zb2RpdW1fdmVyc2lvbl9zdHJpbmdcIl09YXNtW1wiX3NvZGl1bV92ZXJzaW9uX3N0cmluZ1wiXTt2YXIgX2NyeXB0b19nZW5lcmljaGFzaF9rZXlieXRlc19tYXg9TW9kdWxlW1wiX2NyeXB0b19nZW5lcmljaGFzaF9rZXlieXRlc19tYXhcIl09YXNtW1wiX2NyeXB0b19nZW5lcmljaGFzaF9rZXlieXRlc19tYXhcIl07dmFyIF9jcnlwdG9fc2lnbl9lZDI1NTE5X3BrX3RvX2N1cnZlMjU1MTk9TW9kdWxlW1wiX2NyeXB0b19zaWduX2VkMjU1MTlfcGtfdG9fY3VydmUyNTUxOVwiXT1hc21bXCJfY3J5cHRvX3NpZ25fZWQyNTUxOV9wa190b19jdXJ2ZTI1NTE5XCJdO3ZhciBfY3J5cHRvX3NpZ25fcHVibGlja2V5Ynl0ZXM9TW9kdWxlW1wiX2NyeXB0b19zaWduX3B1YmxpY2tleWJ5dGVzXCJdPWFzbVtcIl9jcnlwdG9fc2lnbl9wdWJsaWNrZXlieXRlc1wiXTt2YXIgX2NyeXB0b19ib3hfYmVmb3Jlbm1ieXRlcz1Nb2R1bGVbXCJfY3J5cHRvX2JveF9iZWZvcmVubWJ5dGVzXCJdPWFzbVtcIl9jcnlwdG9fYm94X2JlZm9yZW5tYnl0ZXNcIl07dmFyIF9jcnlwdG9fZ2VuZXJpY2hhc2g9TW9kdWxlW1wiX2NyeXB0b19nZW5lcmljaGFzaFwiXT1hc21bXCJfY3J5cHRvX2dlbmVyaWNoYXNoXCJdO3ZhciBfc29kaXVtX2xpYnJhcnlfdmVyc2lvbl9tYWpvcj1Nb2R1bGVbXCJfc29kaXVtX2xpYnJhcnlfdmVyc2lvbl9tYWpvclwiXT1hc21bXCJfc29kaXVtX2xpYnJhcnlfdmVyc2lvbl9tYWpvclwiXTt2YXIgX3JhbmRvbWJ5dGVzX3N0aXI9TW9kdWxlW1wiX3JhbmRvbWJ5dGVzX3N0aXJcIl09YXNtW1wiX3JhbmRvbWJ5dGVzX3N0aXJcIl07dmFyIF9jcnlwdG9fc2hvcnRoYXNoX2tleWJ5dGVzPU1vZHVsZVtcIl9jcnlwdG9fc2hvcnRoYXNoX2tleWJ5dGVzXCJdPWFzbVtcIl9jcnlwdG9fc2hvcnRoYXNoX2tleWJ5dGVzXCJdO3ZhciBfcmFuZG9tYnl0ZXNfY2xvc2U9TW9kdWxlW1wiX3JhbmRvbWJ5dGVzX2Nsb3NlXCJdPWFzbVtcIl9yYW5kb21ieXRlc19jbG9zZVwiXTt2YXIgX2NyeXB0b19vbmV0aW1lYXV0aF9rZXlieXRlcz1Nb2R1bGVbXCJfY3J5cHRvX29uZXRpbWVhdXRoX2tleWJ5dGVzXCJdPWFzbVtcIl9jcnlwdG9fb25ldGltZWF1dGhfa2V5Ynl0ZXNcIl07dmFyIF9jcnlwdG9fb25ldGltZWF1dGg9TW9kdWxlW1wiX2NyeXB0b19vbmV0aW1lYXV0aFwiXT1hc21bXCJfY3J5cHRvX29uZXRpbWVhdXRoXCJdO3ZhciBfY3J5cHRvX3Nob3J0aGFzaF9ieXRlcz1Nb2R1bGVbXCJfY3J5cHRvX3Nob3J0aGFzaF9ieXRlc1wiXT1hc21bXCJfY3J5cHRvX3Nob3J0aGFzaF9ieXRlc1wiXTt2YXIgX2NyeXB0b19ib3hfc2VjcmV0a2V5Ynl0ZXM9TW9kdWxlW1wiX2NyeXB0b19ib3hfc2VjcmV0a2V5Ynl0ZXNcIl09YXNtW1wiX2NyeXB0b19ib3hfc2VjcmV0a2V5Ynl0ZXNcIl07dmFyIF9jcnlwdG9fb25ldGltZWF1dGhfdXBkYXRlPU1vZHVsZVtcIl9jcnlwdG9fb25ldGltZWF1dGhfdXBkYXRlXCJdPWFzbVtcIl9jcnlwdG9fb25ldGltZWF1dGhfdXBkYXRlXCJdO3ZhciBfY3J5cHRvX3B3aGFzaF9zY3J5cHRzYWxzYTIwOHNoYTI1Nl9sbD1Nb2R1bGVbXCJfY3J5cHRvX3B3aGFzaF9zY3J5cHRzYWxzYTIwOHNoYTI1Nl9sbFwiXT1hc21bXCJfY3J5cHRvX3B3aGFzaF9zY3J5cHRzYWxzYTIwOHNoYTI1Nl9sbFwiXTt2YXIgX2NyeXB0b19ib3hfZGV0YWNoZWQ9TW9kdWxlW1wiX2NyeXB0b19ib3hfZGV0YWNoZWRcIl09YXNtW1wiX2NyeXB0b19ib3hfZGV0YWNoZWRcIl07dmFyIF9yYW5kb21ieXRlc19idWY9TW9kdWxlW1wiX3JhbmRvbWJ5dGVzX2J1ZlwiXT1hc21bXCJfcmFuZG9tYnl0ZXNfYnVmXCJdO3ZhciBfY3J5cHRvX3B3aGFzaF9zY3J5cHRzYWxzYTIwOHNoYTI1Nl9zdHJieXRlcz1Nb2R1bGVbXCJfY3J5cHRvX3B3aGFzaF9zY3J5cHRzYWxzYTIwOHNoYTI1Nl9zdHJieXRlc1wiXT1hc21bXCJfY3J5cHRvX3B3aGFzaF9zY3J5cHRzYWxzYTIwOHNoYTI1Nl9zdHJieXRlc1wiXTt2YXIgX2JpdHNoaWZ0NjRBc2hyPU1vZHVsZVtcIl9iaXRzaGlmdDY0QXNoclwiXT1hc21bXCJfYml0c2hpZnQ2NEFzaHJcIl07dmFyIF9jcnlwdG9fYm94X29wZW5fZGV0YWNoZWQ9TW9kdWxlW1wiX2NyeXB0b19ib3hfb3Blbl9kZXRhY2hlZFwiXT1hc21bXCJfY3J5cHRvX2JveF9vcGVuX2RldGFjaGVkXCJdO3ZhciBfY3J5cHRvX3NjYWxhcm11bHRfYnl0ZXM9TW9kdWxlW1wiX2NyeXB0b19zY2FsYXJtdWx0X2J5dGVzXCJdPWFzbVtcIl9jcnlwdG9fc2NhbGFybXVsdF9ieXRlc1wiXTt2YXIgX2NyeXB0b19hdXRoX3ZlcmlmeT1Nb2R1bGVbXCJfY3J5cHRvX2F1dGhfdmVyaWZ5XCJdPWFzbVtcIl9jcnlwdG9fYXV0aF92ZXJpZnlcIl07dmFyIF9jcnlwdG9fc2lnbl9kZXRhY2hlZD1Nb2R1bGVbXCJfY3J5cHRvX3NpZ25fZGV0YWNoZWRcIl09YXNtW1wiX2NyeXB0b19zaWduX2RldGFjaGVkXCJdO3ZhciBfY3J5cHRvX3NlY3JldGJveF9kZXRhY2hlZD1Nb2R1bGVbXCJfY3J5cHRvX3NlY3JldGJveF9kZXRhY2hlZFwiXT1hc21bXCJfY3J5cHRvX3NlY3JldGJveF9kZXRhY2hlZFwiXTt2YXIgX2NyeXB0b19zZWNyZXRib3hfZWFzeT1Nb2R1bGVbXCJfY3J5cHRvX3NlY3JldGJveF9lYXN5XCJdPWFzbVtcIl9jcnlwdG9fc2VjcmV0Ym94X2Vhc3lcIl07dmFyIF9jcnlwdG9fcHdoYXNoX3NjcnlwdHNhbHNhMjA4c2hhMjU2X3N0cj1Nb2R1bGVbXCJfY3J5cHRvX3B3aGFzaF9zY3J5cHRzYWxzYTIwOHNoYTI1Nl9zdHJcIl09YXNtW1wiX2NyeXB0b19wd2hhc2hfc2NyeXB0c2Fsc2EyMDhzaGEyNTZfc3RyXCJdO3ZhciBfbWVtc2V0PU1vZHVsZVtcIl9tZW1zZXRcIl09YXNtW1wiX21lbXNldFwiXTt2YXIgX2NyeXB0b19ib3hfb3Blbl9kZXRhY2hlZF9hZnRlcm5tPU1vZHVsZVtcIl9jcnlwdG9fYm94X29wZW5fZGV0YWNoZWRfYWZ0ZXJubVwiXT1hc21bXCJfY3J5cHRvX2JveF9vcGVuX2RldGFjaGVkX2FmdGVybm1cIl07dmFyIF9jcnlwdG9fYm94X3NlYWxieXRlcz1Nb2R1bGVbXCJfY3J5cHRvX2JveF9zZWFsYnl0ZXNcIl09YXNtW1wiX2NyeXB0b19ib3hfc2VhbGJ5dGVzXCJdO3ZhciBfaTY0U3VidHJhY3Q9TW9kdWxlW1wiX2k2NFN1YnRyYWN0XCJdPWFzbVtcIl9pNjRTdWJ0cmFjdFwiXTt2YXIgX2NyeXB0b19wd2hhc2hfc2NyeXB0c2Fsc2EyMDhzaGEyNTZfc3RycHJlZml4PU1vZHVsZVtcIl9jcnlwdG9fcHdoYXNoX3NjcnlwdHNhbHNhMjA4c2hhMjU2X3N0cnByZWZpeFwiXT1hc21bXCJfY3J5cHRvX3B3aGFzaF9zY3J5cHRzYWxzYTIwOHNoYTI1Nl9zdHJwcmVmaXhcIl07dmFyIF9jcnlwdG9fYm94X3NlZWRieXRlcz1Nb2R1bGVbXCJfY3J5cHRvX2JveF9zZWVkYnl0ZXNcIl09YXNtW1wiX2NyeXB0b19ib3hfc2VlZGJ5dGVzXCJdO3ZhciBfY3J5cHRvX2hhc2g9TW9kdWxlW1wiX2NyeXB0b19oYXNoXCJdPWFzbVtcIl9jcnlwdG9faGFzaFwiXTt2YXIgX2NyeXB0b19ib3hfZWFzeV9hZnRlcm5tPU1vZHVsZVtcIl9jcnlwdG9fYm94X2Vhc3lfYWZ0ZXJubVwiXT1hc21bXCJfY3J5cHRvX2JveF9lYXN5X2FmdGVybm1cIl07dmFyIF9jcnlwdG9fYm94X21hY2J5dGVzPU1vZHVsZVtcIl9jcnlwdG9fYm94X21hY2J5dGVzXCJdPWFzbVtcIl9jcnlwdG9fYm94X21hY2J5dGVzXCJdO3ZhciBfY3J5cHRvX2JveF9wdWJsaWNrZXlieXRlcz1Nb2R1bGVbXCJfY3J5cHRvX2JveF9wdWJsaWNrZXlieXRlc1wiXT1hc21bXCJfY3J5cHRvX2JveF9wdWJsaWNrZXlieXRlc1wiXTt2YXIgX3NvZGl1bV9iaW4yaGV4PU1vZHVsZVtcIl9zb2RpdW1fYmluMmhleFwiXT1hc21bXCJfc29kaXVtX2JpbjJoZXhcIl07dmFyIF9jcnlwdG9fc2lnbl9zZWNyZXRrZXlieXRlcz1Nb2R1bGVbXCJfY3J5cHRvX3NpZ25fc2VjcmV0a2V5Ynl0ZXNcIl09YXNtW1wiX2NyeXB0b19zaWduX3NlY3JldGtleWJ5dGVzXCJdO3ZhciBfY3J5cHRvX3NjYWxhcm11bHRfc2NhbGFyYnl0ZXM9TW9kdWxlW1wiX2NyeXB0b19zY2FsYXJtdWx0X3NjYWxhcmJ5dGVzXCJdPWFzbVtcIl9jcnlwdG9fc2NhbGFybXVsdF9zY2FsYXJieXRlc1wiXTt2YXIgX2NyeXB0b19vbmV0aW1lYXV0aF9zdGF0ZWJ5dGVzPU1vZHVsZVtcIl9jcnlwdG9fb25ldGltZWF1dGhfc3RhdGVieXRlc1wiXT1hc21bXCJfY3J5cHRvX29uZXRpbWVhdXRoX3N0YXRlYnl0ZXNcIl07dmFyIF9jcnlwdG9fZ2VuZXJpY2hhc2hfYnl0ZXNfbWluPU1vZHVsZVtcIl9jcnlwdG9fZ2VuZXJpY2hhc2hfYnl0ZXNfbWluXCJdPWFzbVtcIl9jcnlwdG9fZ2VuZXJpY2hhc2hfYnl0ZXNfbWluXCJdO3ZhciBfbWFsbG9jPU1vZHVsZVtcIl9tYWxsb2NcIl09YXNtW1wiX21hbGxvY1wiXTt2YXIgX2NyeXB0b19zZWNyZXRib3hfb3Blbl9lYXN5PU1vZHVsZVtcIl9jcnlwdG9fc2VjcmV0Ym94X29wZW5fZWFzeVwiXT1hc21bXCJfY3J5cHRvX3NlY3JldGJveF9vcGVuX2Vhc3lcIl07dmFyIF9jcnlwdG9fc2lnbj1Nb2R1bGVbXCJfY3J5cHRvX3NpZ25cIl09YXNtW1wiX2NyeXB0b19zaWduXCJdO3ZhciBfY3J5cHRvX3NlY3JldGJveF9ub25jZWJ5dGVzPU1vZHVsZVtcIl9jcnlwdG9fc2VjcmV0Ym94X25vbmNlYnl0ZXNcIl09YXNtW1wiX2NyeXB0b19zZWNyZXRib3hfbm9uY2VieXRlc1wiXTt2YXIgX3JhbmRvbWJ5dGVzX3NldF9pbXBsZW1lbnRhdGlvbj1Nb2R1bGVbXCJfcmFuZG9tYnl0ZXNfc2V0X2ltcGxlbWVudGF0aW9uXCJdPWFzbVtcIl9yYW5kb21ieXRlc19zZXRfaW1wbGVtZW50YXRpb25cIl07dmFyIF9jcnlwdG9fYm94X2tleXBhaXI9TW9kdWxlW1wiX2NyeXB0b19ib3hfa2V5cGFpclwiXT1hc21bXCJfY3J5cHRvX2JveF9rZXlwYWlyXCJdO3ZhciBfY3J5cHRvX2dlbmVyaWNoYXNoX2tleWJ5dGVzPU1vZHVsZVtcIl9jcnlwdG9fZ2VuZXJpY2hhc2hfa2V5Ynl0ZXNcIl09YXNtW1wiX2NyeXB0b19nZW5lcmljaGFzaF9rZXlieXRlc1wiXTt2YXIgX3NvZGl1bV9oZXgyYmluPU1vZHVsZVtcIl9zb2RpdW1faGV4MmJpblwiXT1hc21bXCJfc29kaXVtX2hleDJiaW5cIl07dmFyIF9zb2RpdW1faW5pdD1Nb2R1bGVbXCJfc29kaXVtX2luaXRcIl09YXNtW1wiX3NvZGl1bV9pbml0XCJdO3ZhciBfY3J5cHRvX3NlY3JldGJveF9tYWNieXRlcz1Nb2R1bGVbXCJfY3J5cHRvX3NlY3JldGJveF9tYWNieXRlc1wiXT1hc21bXCJfY3J5cHRvX3NlY3JldGJveF9tYWNieXRlc1wiXTt2YXIgX2NyeXB0b19zZWNyZXRib3hfa2V5Ynl0ZXM9TW9kdWxlW1wiX2NyeXB0b19zZWNyZXRib3hfa2V5Ynl0ZXNcIl09YXNtW1wiX2NyeXB0b19zZWNyZXRib3hfa2V5Ynl0ZXNcIl07dmFyIF9iaXRzaGlmdDY0U2hsPU1vZHVsZVtcIl9iaXRzaGlmdDY0U2hsXCJdPWFzbVtcIl9iaXRzaGlmdDY0U2hsXCJdO3ZhciBfY3J5cHRvX2hhc2hfYnl0ZXM9TW9kdWxlW1wiX2NyeXB0b19oYXNoX2J5dGVzXCJdPWFzbVtcIl9jcnlwdG9faGFzaF9ieXRlc1wiXTt2YXIgX2ZmbHVzaD1Nb2R1bGVbXCJfZmZsdXNoXCJdPWFzbVtcIl9mZmx1c2hcIl07dmFyIF9jcnlwdG9fZ2VuZXJpY2hhc2hfYnl0ZXM9TW9kdWxlW1wiX2NyeXB0b19nZW5lcmljaGFzaF9ieXRlc1wiXT1hc21bXCJfY3J5cHRvX2dlbmVyaWNoYXNoX2J5dGVzXCJdO3ZhciBfY3J5cHRvX2dlbmVyaWNoYXNoX2J5dGVzX21heD1Nb2R1bGVbXCJfY3J5cHRvX2dlbmVyaWNoYXNoX2J5dGVzX21heFwiXT1hc21bXCJfY3J5cHRvX2dlbmVyaWNoYXNoX2J5dGVzX21heFwiXTt2YXIgX2NyeXB0b19zZWNyZXRib3hfb3Blbl9kZXRhY2hlZD1Nb2R1bGVbXCJfY3J5cHRvX3NlY3JldGJveF9vcGVuX2RldGFjaGVkXCJdPWFzbVtcIl9jcnlwdG9fc2VjcmV0Ym94X29wZW5fZGV0YWNoZWRcIl07dmFyIF9jcnlwdG9fc2lnbl92ZXJpZnlfZGV0YWNoZWQ9TW9kdWxlW1wiX2NyeXB0b19zaWduX3ZlcmlmeV9kZXRhY2hlZFwiXT1hc21bXCJfY3J5cHRvX3NpZ25fdmVyaWZ5X2RldGFjaGVkXCJdO3ZhciBfY3J5cHRvX29uZXRpbWVhdXRoX3ZlcmlmeT1Nb2R1bGVbXCJfY3J5cHRvX29uZXRpbWVhdXRoX3ZlcmlmeVwiXT1hc21bXCJfY3J5cHRvX29uZXRpbWVhdXRoX3ZlcmlmeVwiXTt2YXIgX2NyeXB0b19ib3hfb3Blbl9lYXN5PU1vZHVsZVtcIl9jcnlwdG9fYm94X29wZW5fZWFzeVwiXT1hc21bXCJfY3J5cHRvX2JveF9vcGVuX2Vhc3lcIl07dmFyIF9jcnlwdG9fcHdoYXNoX3NjcnlwdHNhbHNhMjA4c2hhMjU2X29wc2xpbWl0X3NlbnNpdGl2ZT1Nb2R1bGVbXCJfY3J5cHRvX3B3aGFzaF9zY3J5cHRzYWxzYTIwOHNoYTI1Nl9vcHNsaW1pdF9zZW5zaXRpdmVcIl09YXNtW1wiX2NyeXB0b19wd2hhc2hfc2NyeXB0c2Fsc2EyMDhzaGEyNTZfb3BzbGltaXRfc2Vuc2l0aXZlXCJdO3ZhciBfY3J5cHRvX2dlbmVyaWNoYXNoX2luaXQ9TW9kdWxlW1wiX2NyeXB0b19nZW5lcmljaGFzaF9pbml0XCJdPWFzbVtcIl9jcnlwdG9fZ2VuZXJpY2hhc2hfaW5pdFwiXTt2YXIgX2k2NEFkZD1Nb2R1bGVbXCJfaTY0QWRkXCJdPWFzbVtcIl9pNjRBZGRcIl07dmFyIF9jcnlwdG9fc2lnbl9ieXRlcz1Nb2R1bGVbXCJfY3J5cHRvX3NpZ25fYnl0ZXNcIl09YXNtW1wiX2NyeXB0b19zaWduX2J5dGVzXCJdO3ZhciBfY3J5cHRvX2dlbmVyaWNoYXNoX3VwZGF0ZT1Nb2R1bGVbXCJfY3J5cHRvX2dlbmVyaWNoYXNoX3VwZGF0ZVwiXT1hc21bXCJfY3J5cHRvX2dlbmVyaWNoYXNoX3VwZGF0ZVwiXTt2YXIgX2NyeXB0b19zY2FsYXJtdWx0PU1vZHVsZVtcIl9jcnlwdG9fc2NhbGFybXVsdFwiXT1hc21bXCJfY3J5cHRvX3NjYWxhcm11bHRcIl07dmFyIF9jcnlwdG9fYm94X3NlYWxfb3Blbj1Nb2R1bGVbXCJfY3J5cHRvX2JveF9zZWFsX29wZW5cIl09YXNtW1wiX2NyeXB0b19ib3hfc2VhbF9vcGVuXCJdO3ZhciBfY3J5cHRvX2JveF9lYXN5PU1vZHVsZVtcIl9jcnlwdG9fYm94X2Vhc3lcIl09YXNtW1wiX2NyeXB0b19ib3hfZWFzeVwiXTt2YXIgX19fZXJybm9fbG9jYXRpb249TW9kdWxlW1wiX19fZXJybm9fbG9jYXRpb25cIl09YXNtW1wiX19fZXJybm9fbG9jYXRpb25cIl07dmFyIF9jcnlwdG9fb25ldGltZWF1dGhfZmluYWw9TW9kdWxlW1wiX2NyeXB0b19vbmV0aW1lYXV0aF9maW5hbFwiXT1hc21bXCJfY3J5cHRvX29uZXRpbWVhdXRoX2ZpbmFsXCJdO3ZhciBfbWVtbW92ZT1Nb2R1bGVbXCJfbWVtbW92ZVwiXT1hc21bXCJfbWVtbW92ZVwiXTt2YXIgX2NyeXB0b19nZW5lcmljaGFzaF9maW5hbD1Nb2R1bGVbXCJfY3J5cHRvX2dlbmVyaWNoYXNoX2ZpbmFsXCJdPWFzbVtcIl9jcnlwdG9fZ2VuZXJpY2hhc2hfZmluYWxcIl07dmFyIF9yYW5kb21ieXRlc191bmlmb3JtPU1vZHVsZVtcIl9yYW5kb21ieXRlc191bmlmb3JtXCJdPWFzbVtcIl9yYW5kb21ieXRlc191bmlmb3JtXCJdO3ZhciBfY3J5cHRvX3NpZ25fc2VlZF9rZXlwYWlyPU1vZHVsZVtcIl9jcnlwdG9fc2lnbl9zZWVkX2tleXBhaXJcIl09YXNtW1wiX2NyeXB0b19zaWduX3NlZWRfa2V5cGFpclwiXTt2YXIgX2NyeXB0b19wd2hhc2hfc2NyeXB0c2Fsc2EyMDhzaGEyNTZfb3BzbGltaXRfaW50ZXJhY3RpdmU9TW9kdWxlW1wiX2NyeXB0b19wd2hhc2hfc2NyeXB0c2Fsc2EyMDhzaGEyNTZfb3BzbGltaXRfaW50ZXJhY3RpdmVcIl09YXNtW1wiX2NyeXB0b19wd2hhc2hfc2NyeXB0c2Fsc2EyMDhzaGEyNTZfb3BzbGltaXRfaW50ZXJhY3RpdmVcIl07dmFyIF9jcnlwdG9fb25ldGltZWF1dGhfaW5pdD1Nb2R1bGVbXCJfY3J5cHRvX29uZXRpbWVhdXRoX2luaXRcIl09YXNtW1wiX2NyeXB0b19vbmV0aW1lYXV0aF9pbml0XCJdO3ZhciBkeW5DYWxsX2k9TW9kdWxlW1wiZHluQ2FsbF9pXCJdPWFzbVtcImR5bkNhbGxfaVwiXTt2YXIgZHluQ2FsbF9paT1Nb2R1bGVbXCJkeW5DYWxsX2lpXCJdPWFzbVtcImR5bkNhbGxfaWlcIl07dmFyIGR5bkNhbGxfaWlpaT1Nb2R1bGVbXCJkeW5DYWxsX2lpaWlcIl09YXNtW1wiZHluQ2FsbF9paWlpXCJdO3ZhciBkeW5DYWxsX3ZpPU1vZHVsZVtcImR5bkNhbGxfdmlcIl09YXNtW1wiZHluQ2FsbF92aVwiXTtSdW50aW1lLnN0YWNrQWxsb2M9YXNtW1wic3RhY2tBbGxvY1wiXTtSdW50aW1lLnN0YWNrU2F2ZT1hc21bXCJzdGFja1NhdmVcIl07UnVudGltZS5zdGFja1Jlc3RvcmU9YXNtW1wic3RhY2tSZXN0b3JlXCJdO1J1bnRpbWUuZXN0YWJsaXNoU3RhY2tTcGFjZT1hc21bXCJlc3RhYmxpc2hTdGFja1NwYWNlXCJdO1J1bnRpbWUuc2V0VGVtcFJldDA9YXNtW1wic2V0VGVtcFJldDBcIl07UnVudGltZS5nZXRUZW1wUmV0MD1hc21bXCJnZXRUZW1wUmV0MFwiXTtmdW5jdGlvbiBFeGl0U3RhdHVzKHN0YXR1cyl7dGhpcy5uYW1lPVwiRXhpdFN0YXR1c1wiO3RoaXMubWVzc2FnZT1cIlByb2dyYW0gdGVybWluYXRlZCB3aXRoIGV4aXQoXCIrc3RhdHVzK1wiKVwiO3RoaXMuc3RhdHVzPXN0YXR1c31FeGl0U3RhdHVzLnByb3RvdHlwZT1uZXcgRXJyb3I7RXhpdFN0YXR1cy5wcm90b3R5cGUuY29uc3RydWN0b3I9RXhpdFN0YXR1czt2YXIgaW5pdGlhbFN0YWNrVG9wO3ZhciBwcmVsb2FkU3RhcnRUaW1lPW51bGw7dmFyIGNhbGxlZE1haW49ZmFsc2U7ZGVwZW5kZW5jaWVzRnVsZmlsbGVkPWZ1bmN0aW9uIHJ1bkNhbGxlcigpe2lmKCFNb2R1bGVbXCJjYWxsZWRSdW5cIl0pcnVuKCk7aWYoIU1vZHVsZVtcImNhbGxlZFJ1blwiXSlkZXBlbmRlbmNpZXNGdWxmaWxsZWQ9cnVuQ2FsbGVyfTtNb2R1bGVbXCJjYWxsTWFpblwiXT1Nb2R1bGUuY2FsbE1haW49ZnVuY3Rpb24gY2FsbE1haW4oYXJncyl7YXNzZXJ0KHJ1bkRlcGVuZGVuY2llcz09MCxcImNhbm5vdCBjYWxsIG1haW4gd2hlbiBhc3luYyBkZXBlbmRlbmNpZXMgcmVtYWluISAobGlzdGVuIG9uIF9fQVRNQUlOX18pXCIpO2Fzc2VydChfX0FUUFJFUlVOX18ubGVuZ3RoPT0wLFwiY2Fubm90IGNhbGwgbWFpbiB3aGVuIHByZVJ1biBmdW5jdGlvbnMgcmVtYWluIHRvIGJlIGNhbGxlZFwiKTthcmdzPWFyZ3N8fFtdO2Vuc3VyZUluaXRSdW50aW1lKCk7dmFyIGFyZ2M9YXJncy5sZW5ndGgrMTtmdW5jdGlvbiBwYWQoKXtmb3IodmFyIGk9MDtpPDQtMTtpKyspe2FyZ3YucHVzaCgwKX19dmFyIGFyZ3Y9W2FsbG9jYXRlKGludEFycmF5RnJvbVN0cmluZyhNb2R1bGVbXCJ0aGlzUHJvZ3JhbVwiXSksXCJpOFwiLEFMTE9DX05PUk1BTCldO3BhZCgpO2Zvcih2YXIgaT0wO2k8YXJnYy0xO2k9aSsxKXthcmd2LnB1c2goYWxsb2NhdGUoaW50QXJyYXlGcm9tU3RyaW5nKGFyZ3NbaV0pLFwiaThcIixBTExPQ19OT1JNQUwpKTtwYWQoKX1hcmd2LnB1c2goMCk7YXJndj1hbGxvY2F0ZShhcmd2LFwiaTMyXCIsQUxMT0NfTk9STUFMKTt0cnl7dmFyIHJldD1Nb2R1bGVbXCJfbWFpblwiXShhcmdjLGFyZ3YsMCk7ZXhpdChyZXQsdHJ1ZSl9Y2F0Y2goZSl7aWYoZSBpbnN0YW5jZW9mIEV4aXRTdGF0dXMpe3JldHVybn1lbHNlIGlmKGU9PVwiU2ltdWxhdGVJbmZpbml0ZUxvb3BcIil7TW9kdWxlW1wibm9FeGl0UnVudGltZVwiXT10cnVlO3JldHVybn1lbHNle2lmKGUmJnR5cGVvZiBlPT09XCJvYmplY3RcIiYmZS5zdGFjaylNb2R1bGUucHJpbnRFcnIoXCJleGNlcHRpb24gdGhyb3duOiBcIitbZSxlLnN0YWNrXSk7dGhyb3cgZX19ZmluYWxseXtjYWxsZWRNYWluPXRydWV9fTtmdW5jdGlvbiBydW4oYXJncyl7YXJncz1hcmdzfHxNb2R1bGVbXCJhcmd1bWVudHNcIl07aWYocHJlbG9hZFN0YXJ0VGltZT09PW51bGwpcHJlbG9hZFN0YXJ0VGltZT1EYXRlLm5vdygpO2lmKHJ1bkRlcGVuZGVuY2llcz4wKXtyZXR1cm59cHJlUnVuKCk7aWYocnVuRGVwZW5kZW5jaWVzPjApcmV0dXJuO2lmKE1vZHVsZVtcImNhbGxlZFJ1blwiXSlyZXR1cm47ZnVuY3Rpb24gZG9SdW4oKXtpZihNb2R1bGVbXCJjYWxsZWRSdW5cIl0pcmV0dXJuO01vZHVsZVtcImNhbGxlZFJ1blwiXT10cnVlO2lmKEFCT1JUKXJldHVybjtlbnN1cmVJbml0UnVudGltZSgpO3ByZU1haW4oKTtpZihNb2R1bGVbXCJvblJ1bnRpbWVJbml0aWFsaXplZFwiXSlNb2R1bGVbXCJvblJ1bnRpbWVJbml0aWFsaXplZFwiXSgpO2lmKE1vZHVsZVtcIl9tYWluXCJdJiZzaG91bGRSdW5Ob3cpTW9kdWxlW1wiY2FsbE1haW5cIl0oYXJncyk7cG9zdFJ1bigpfWlmKE1vZHVsZVtcInNldFN0YXR1c1wiXSl7TW9kdWxlW1wic2V0U3RhdHVzXCJdKFwiUnVubmluZy4uLlwiKTtzZXRUaW1lb3V0KChmdW5jdGlvbigpe3NldFRpbWVvdXQoKGZ1bmN0aW9uKCl7TW9kdWxlW1wic2V0U3RhdHVzXCJdKFwiXCIpfSksMSk7ZG9SdW4oKX0pLDEpfWVsc2V7ZG9SdW4oKX19TW9kdWxlW1wicnVuXCJdPU1vZHVsZS5ydW49cnVuO2Z1bmN0aW9uIGV4aXQoc3RhdHVzLGltcGxpY2l0KXtpZihpbXBsaWNpdCYmTW9kdWxlW1wibm9FeGl0UnVudGltZVwiXSl7cmV0dXJufWlmKE1vZHVsZVtcIm5vRXhpdFJ1bnRpbWVcIl0pe31lbHNle0FCT1JUPXRydWU7RVhJVFNUQVRVUz1zdGF0dXM7U1RBQ0tUT1A9aW5pdGlhbFN0YWNrVG9wO2V4aXRSdW50aW1lKCk7aWYoTW9kdWxlW1wib25FeGl0XCJdKU1vZHVsZVtcIm9uRXhpdFwiXShzdGF0dXMpfWlmKEVOVklST05NRU5UX0lTX05PREUpe3Byb2Nlc3NbXCJzdGRvdXRcIl1bXCJvbmNlXCJdKFwiZHJhaW5cIiwoZnVuY3Rpb24oKXtwcm9jZXNzW1wiZXhpdFwiXShzdGF0dXMpfSkpO2NvbnNvbGUubG9nKFwiIFwiKTtzZXRUaW1lb3V0KChmdW5jdGlvbigpe3Byb2Nlc3NbXCJleGl0XCJdKHN0YXR1cyl9KSw1MDApfWVsc2UgaWYoRU5WSVJPTk1FTlRfSVNfU0hFTEwmJnR5cGVvZiBxdWl0PT09XCJmdW5jdGlvblwiKXtxdWl0KHN0YXR1cyl9dGhyb3cgbmV3IEV4aXRTdGF0dXMoc3RhdHVzKX1Nb2R1bGVbXCJleGl0XCJdPU1vZHVsZS5leGl0PWV4aXQ7dmFyIGFib3J0RGVjb3JhdG9ycz1bXTtmdW5jdGlvbiBhYm9ydCh3aGF0KXtpZih3aGF0IT09dW5kZWZpbmVkKXtNb2R1bGUucHJpbnQod2hhdCk7TW9kdWxlLnByaW50RXJyKHdoYXQpO3doYXQ9SlNPTi5zdHJpbmdpZnkod2hhdCl9ZWxzZXt3aGF0PVwiXCJ9QUJPUlQ9dHJ1ZTtFWElUU1RBVFVTPTE7dmFyIGV4dHJhPVwiXFxuSWYgdGhpcyBhYm9ydCgpIGlzIHVuZXhwZWN0ZWQsIGJ1aWxkIHdpdGggLXMgQVNTRVJUSU9OUz0xIHdoaWNoIGNhbiBnaXZlIG1vcmUgaW5mb3JtYXRpb24uXCI7dmFyIG91dHB1dD1cImFib3J0KFwiK3doYXQrXCIpIGF0IFwiK3N0YWNrVHJhY2UoKStleHRyYTtpZihhYm9ydERlY29yYXRvcnMpe2Fib3J0RGVjb3JhdG9ycy5mb3JFYWNoKChmdW5jdGlvbihkZWNvcmF0b3Ipe291dHB1dD1kZWNvcmF0b3Iob3V0cHV0LHdoYXQpfSkpfXRocm93IG91dHB1dH1Nb2R1bGVbXCJhYm9ydFwiXT1Nb2R1bGUuYWJvcnQ9YWJvcnQ7aWYoTW9kdWxlW1wicHJlSW5pdFwiXSl7aWYodHlwZW9mIE1vZHVsZVtcInByZUluaXRcIl09PVwiZnVuY3Rpb25cIilNb2R1bGVbXCJwcmVJbml0XCJdPVtNb2R1bGVbXCJwcmVJbml0XCJdXTt3aGlsZShNb2R1bGVbXCJwcmVJbml0XCJdLmxlbmd0aD4wKXtNb2R1bGVbXCJwcmVJbml0XCJdLnBvcCgpKCl9fXZhciBzaG91bGRSdW5Ob3c9dHJ1ZTtpZihNb2R1bGVbXCJub0luaXRpYWxSdW5cIl0pe3Nob3VsZFJ1bk5vdz1mYWxzZX1ydW4oKVxuXG5cblxuXG4gICAgcmV0dXJuIE1vZHVsZTtcbn0pO1xuIiwidmFyIHJhZiA9IHJlcXVpcmUoXCJyYWZcIilcbnZhciBUeXBlZEVycm9yID0gcmVxdWlyZShcImVycm9yL3R5cGVkXCIpXG5cbnZhciBJbnZhbGlkVXBkYXRlSW5SZW5kZXIgPSBUeXBlZEVycm9yKHtcbiAgICB0eXBlOiBcIm1haW4tbG9vcC5pbnZhbGlkLnVwZGF0ZS5pbi1yZW5kZXJcIixcbiAgICBtZXNzYWdlOiBcIm1haW4tbG9vcDogVW5leHBlY3RlZCB1cGRhdGUgb2NjdXJyZWQgaW4gbG9vcC5cXG5cIiArXG4gICAgICAgIFwiV2UgYXJlIGN1cnJlbnRseSByZW5kZXJpbmcgYSB2aWV3LCBcIiArXG4gICAgICAgICAgICBcInlvdSBjYW4ndCBjaGFuZ2Ugc3RhdGUgcmlnaHQgbm93LlxcblwiICtcbiAgICAgICAgXCJUaGUgZGlmZiBpczoge3N0cmluZ0RpZmZ9LlxcblwiICtcbiAgICAgICAgXCJTVUdHRVNURUQgRklYOiBmaW5kIHRoZSBzdGF0ZSBtdXRhdGlvbiBpbiB5b3VyIHZpZXcgXCIgK1xuICAgICAgICAgICAgXCJvciByZW5kZXJpbmcgZnVuY3Rpb24gYW5kIHJlbW92ZSBpdC5cXG5cIiArXG4gICAgICAgIFwiVGhlIHZpZXcgc2hvdWxkIG5vdCBoYXZlIGFueSBzaWRlIGVmZmVjdHMuXFxuXCIsXG4gICAgZGlmZjogbnVsbCxcbiAgICBzdHJpbmdEaWZmOiBudWxsXG59KVxuXG5tb2R1bGUuZXhwb3J0cyA9IG1haW5cblxuZnVuY3Rpb24gbWFpbihpbml0aWFsU3RhdGUsIHZpZXcsIG9wdHMpIHtcbiAgICBvcHRzID0gb3B0cyB8fCB7fVxuXG4gICAgdmFyIGN1cnJlbnRTdGF0ZSA9IGluaXRpYWxTdGF0ZVxuICAgIHZhciBjcmVhdGUgPSBvcHRzLmNyZWF0ZVxuICAgIHZhciBkaWZmID0gb3B0cy5kaWZmXG4gICAgdmFyIHBhdGNoID0gb3B0cy5wYXRjaFxuICAgIHZhciByZWRyYXdTY2hlZHVsZWQgPSBmYWxzZVxuXG4gICAgdmFyIHRyZWUgPSBvcHRzLmluaXRpYWxUcmVlIHx8IHZpZXcoY3VycmVudFN0YXRlKVxuICAgIHZhciB0YXJnZXQgPSBvcHRzLnRhcmdldCB8fCBjcmVhdGUodHJlZSwgb3B0cylcbiAgICB2YXIgaW5SZW5kZXJpbmdUcmFuc2FjdGlvbiA9IGZhbHNlXG5cbiAgICBjdXJyZW50U3RhdGUgPSBudWxsXG5cbiAgICB2YXIgbG9vcCA9IHtcbiAgICAgICAgc3RhdGU6IGluaXRpYWxTdGF0ZSxcbiAgICAgICAgdGFyZ2V0OiB0YXJnZXQsXG4gICAgICAgIHVwZGF0ZTogdXBkYXRlXG4gICAgfVxuICAgIHJldHVybiBsb29wXG5cbiAgICBmdW5jdGlvbiB1cGRhdGUoc3RhdGUpIHtcbiAgICAgICAgaWYgKGluUmVuZGVyaW5nVHJhbnNhY3Rpb24pIHtcbiAgICAgICAgICAgIHRocm93IEludmFsaWRVcGRhdGVJblJlbmRlcih7XG4gICAgICAgICAgICAgICAgZGlmZjogc3RhdGUuX2RpZmYsXG4gICAgICAgICAgICAgICAgc3RyaW5nRGlmZjogSlNPTi5zdHJpbmdpZnkoc3RhdGUuX2RpZmYpXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGN1cnJlbnRTdGF0ZSA9PT0gbnVsbCAmJiAhcmVkcmF3U2NoZWR1bGVkKSB7XG4gICAgICAgICAgICByZWRyYXdTY2hlZHVsZWQgPSB0cnVlXG4gICAgICAgICAgICByYWYocmVkcmF3KVxuICAgICAgICB9XG5cbiAgICAgICAgY3VycmVudFN0YXRlID0gc3RhdGVcbiAgICAgICAgbG9vcC5zdGF0ZSA9IHN0YXRlXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVkcmF3KCkge1xuICAgICAgICByZWRyYXdTY2hlZHVsZWQgPSBmYWxzZVxuICAgICAgICBpZiAoY3VycmVudFN0YXRlID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGluUmVuZGVyaW5nVHJhbnNhY3Rpb24gPSB0cnVlXG4gICAgICAgIHZhciBuZXdUcmVlID0gdmlldyhjdXJyZW50U3RhdGUpXG5cbiAgICAgICAgaWYgKG9wdHMuY3JlYXRlT25seSkge1xuICAgICAgICAgICAgaW5SZW5kZXJpbmdUcmFuc2FjdGlvbiA9IGZhbHNlXG4gICAgICAgICAgICBjcmVhdGUobmV3VHJlZSwgb3B0cylcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciBwYXRjaGVzID0gZGlmZih0cmVlLCBuZXdUcmVlLCBvcHRzKVxuICAgICAgICAgICAgaW5SZW5kZXJpbmdUcmFuc2FjdGlvbiA9IGZhbHNlXG4gICAgICAgICAgICB0YXJnZXQgPSBwYXRjaCh0YXJnZXQsIHBhdGNoZXMsIG9wdHMpXG4gICAgICAgIH1cblxuICAgICAgICB0cmVlID0gbmV3VHJlZVxuICAgICAgICBjdXJyZW50U3RhdGUgPSBudWxsXG4gICAgfVxufVxuIiwidmFyIGxldmVsdXAgPSByZXF1aXJlKCdsZXZlbHVwJyk7XG52YXIgbWVtZG93biA9IHJlcXVpcmUoJ21lbWRvd24nKTtcblxubW9kdWxlLmV4cG9ydHMgPSBNZW1EQjtcblxuZnVuY3Rpb24gTWVtREIgKG9wdHMsIGZuKSB7XG4gIGlmICh0eXBlb2Ygb3B0cyA9PSAnZnVuY3Rpb24nKSB7XG4gICAgZm4gPSBvcHRzO1xuICAgIG9wdHMgPSB7fTtcbiAgfVxuICBpZiAodHlwZW9mIG9wdHMgPT0gJ3N0cmluZycpIG9wdHMgPSB7fTtcbiAgb3B0cyA9IG9wdHMgfHwge307XG4gIG9wdHMuZGIgPSBmdW5jdGlvbiAobCkgeyByZXR1cm4gbmV3IG1lbWRvd24obCkgfTtcbiAgcmV0dXJuIGxldmVsdXAoJycsIG9wdHMsIGZuKTtcbn1cblxuIiwidmFyIGluaGVyaXRzICAgICAgICAgID0gcmVxdWlyZSgnaW5oZXJpdHMnKVxuICAsIEFic3RyYWN0TGV2ZWxET1dOID0gcmVxdWlyZSgnYWJzdHJhY3QtbGV2ZWxkb3duJykuQWJzdHJhY3RMZXZlbERPV05cbiAgLCBBYnN0cmFjdEl0ZXJhdG9yICA9IHJlcXVpcmUoJ2Fic3RyYWN0LWxldmVsZG93bicpLkFic3RyYWN0SXRlcmF0b3JcbiAgLCBsdGd0ICAgICAgICAgICAgICA9IHJlcXVpcmUoJ2x0Z3QnKVxuICAsIHNldEltbWVkaWF0ZSAgICAgID0gZ2xvYmFsLnNldEltbWVkaWF0ZSB8fCBwcm9jZXNzLm5leHRUaWNrXG4gICwgY3JlYXRlUkJUID0gcmVxdWlyZSgnZnVuY3Rpb25hbC1yZWQtYmxhY2stdHJlZScpXG4gICwgZ2xvYmFsU3RvcmUgICAgICAgPSB7fVxuXG5mdW5jdGlvbiB0b0tleSAoa2V5KSB7XG4gIHJldHVybiB0eXBlb2Yga2V5ID09ICdzdHJpbmcnID8gJyQnICsga2V5IDogSlNPTi5zdHJpbmdpZnkoa2V5KVxufVxuXG5mdW5jdGlvbiBndCh2YWx1ZSkge1xuICByZXR1cm4gbHRndC5jb21wYXJlKHZhbHVlLCB0aGlzLl9lbmQpID4gMFxufVxuXG5mdW5jdGlvbiBndGUodmFsdWUpIHtcbiAgcmV0dXJuIGx0Z3QuY29tcGFyZSh2YWx1ZSwgdGhpcy5fZW5kKSA+PSAwXG59XG5cbmZ1bmN0aW9uIGx0KHZhbHVlKSB7XG4gIHJldHVybiBsdGd0LmNvbXBhcmUodmFsdWUsIHRoaXMuX2VuZCkgPCAwXG59XG5cbmZ1bmN0aW9uIGx0ZSh2YWx1ZSkge1xuICByZXR1cm4gbHRndC5jb21wYXJlKHZhbHVlLCB0aGlzLl9lbmQpIDw9IDBcbn1cblxuXG5mdW5jdGlvbiBNZW1JdGVyYXRvciAoZGIsIG9wdGlvbnMpIHtcbiAgQWJzdHJhY3RJdGVyYXRvci5jYWxsKHRoaXMsIGRiKVxuICB0aGlzLl9saW1pdCAgID0gb3B0aW9ucy5saW1pdFxuXG4gIGlmICh0aGlzLl9saW1pdCA9PT0gLTEpXG4gICAgdGhpcy5fbGltaXQgPSBJbmZpbml0eVxuXG4gIHZhciB0cmVlID0gZGIuX3N0b3JlW2RiLl9sb2NhdGlvbl07XG5cbiAgdGhpcy5rZXlBc0J1ZmZlciA9IG9wdGlvbnMua2V5QXNCdWZmZXIgIT09IGZhbHNlXG4gIHRoaXMudmFsdWVBc0J1ZmZlciA9IG9wdGlvbnMudmFsdWVBc0J1ZmZlciAhPT0gZmFsc2VcbiAgdGhpcy5fcmV2ZXJzZSAgID0gb3B0aW9ucy5yZXZlcnNlXG4gIHRoaXMuX29wdGlvbnMgPSBvcHRpb25zXG4gIHRoaXMuX2RvbmUgPSAwXG5cbiAgaWYgKCF0aGlzLl9yZXZlcnNlKSB7XG4gICAgdGhpcy5faW5jciA9ICduZXh0JztcbiAgICB0aGlzLl9zdGFydCA9IGx0Z3QubG93ZXJCb3VuZChvcHRpb25zKTtcbiAgICB0aGlzLl9lbmQgPSBsdGd0LnVwcGVyQm91bmQob3B0aW9ucylcblxuICAgIGlmICh0eXBlb2YgdGhpcy5fc3RhcnQgPT09ICd1bmRlZmluZWQnKVxuICAgICAgdGhpcy5fdHJlZSA9IHRyZWUuYmVnaW47XG4gICAgZWxzZSBpZiAobHRndC5sb3dlckJvdW5kSW5jbHVzaXZlKG9wdGlvbnMpKVxuICAgICAgdGhpcy5fdHJlZSA9IHRyZWUuZ2UodGhpcy5fc3RhcnQpO1xuICAgIGVsc2VcbiAgICAgIHRoaXMuX3RyZWUgPSB0cmVlLmd0KHRoaXMuX3N0YXJ0KTtcblxuICAgIGlmICh0aGlzLl9lbmQpIHtcbiAgICAgIGlmIChsdGd0LnVwcGVyQm91bmRJbmNsdXNpdmUob3B0aW9ucykpXG4gICAgICAgIHRoaXMuX3Rlc3QgPSBsdGVcbiAgICAgIGVsc2VcbiAgICAgICAgdGhpcy5fdGVzdCA9IGx0XG4gICAgfVxuXG4gIH0gZWxzZSB7XG4gICAgdGhpcy5faW5jciA9ICdwcmV2JztcbiAgICB0aGlzLl9zdGFydCA9IGx0Z3QudXBwZXJCb3VuZChvcHRpb25zKVxuICAgIHRoaXMuX2VuZCA9IGx0Z3QubG93ZXJCb3VuZChvcHRpb25zKVxuXG4gICAgaWYgKHR5cGVvZiB0aGlzLl9zdGFydCA9PT0gJ3VuZGVmaW5lZCcpXG4gICAgICB0aGlzLl90cmVlID0gdHJlZS5lbmQ7XG4gICAgZWxzZSBpZiAobHRndC51cHBlckJvdW5kSW5jbHVzaXZlKG9wdGlvbnMpKVxuICAgICAgdGhpcy5fdHJlZSA9IHRyZWUubGUodGhpcy5fc3RhcnQpXG4gICAgZWxzZVxuICAgICAgdGhpcy5fdHJlZSA9IHRyZWUubHQodGhpcy5fc3RhcnQpXG5cbiAgICBpZiAodGhpcy5fZW5kKSB7XG4gICAgICBpZiAobHRndC5sb3dlckJvdW5kSW5jbHVzaXZlKG9wdGlvbnMpKVxuICAgICAgICB0aGlzLl90ZXN0ID0gZ3RlXG4gICAgICBlbHNlXG4gICAgICAgIHRoaXMuX3Rlc3QgPSBndFxuICAgIH1cblxuICB9XG5cbn1cblxuaW5oZXJpdHMoTWVtSXRlcmF0b3IsIEFic3RyYWN0SXRlcmF0b3IpXG5cbk1lbUl0ZXJhdG9yLnByb3RvdHlwZS5fbmV4dCA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICB2YXIga2V5XG4gICAgLCB2YWx1ZVxuXG4gIGlmICh0aGlzLl9kb25lKysgPj0gdGhpcy5fbGltaXQpXG4gICAgcmV0dXJuIHNldEltbWVkaWF0ZShjYWxsYmFjaylcblxuICBpZiAoIXRoaXMuX3RyZWUudmFsaWQpXG4gICAgcmV0dXJuIHNldEltbWVkaWF0ZShjYWxsYmFjaylcblxuICBrZXkgPSB0aGlzLl90cmVlLmtleVxuICB2YWx1ZSA9IHRoaXMuX3RyZWUudmFsdWVcblxuICBpZiAoIXRoaXMuX3Rlc3Qoa2V5KSlcbiAgICByZXR1cm4gc2V0SW1tZWRpYXRlKGNhbGxiYWNrKVxuXG4gIGlmICh0aGlzLmtleUFzQnVmZmVyKVxuICAgIGtleSA9IG5ldyBCdWZmZXIoa2V5KVxuXG4gIGlmICh0aGlzLnZhbHVlQXNCdWZmZXIpXG4gICAgdmFsdWUgPSBuZXcgQnVmZmVyKHZhbHVlKVxuXG4gIHRoaXMuX3RyZWVbdGhpcy5faW5jcl0oKVxuXG4gIHNldEltbWVkaWF0ZShmdW5jdGlvbiBjYWxsTmV4dCgpIHtcbiAgICBjYWxsYmFjayhudWxsLCBrZXksIHZhbHVlKVxuICB9KVxufVxuXG5NZW1JdGVyYXRvci5wcm90b3R5cGUuX3Rlc3QgPSBmdW5jdGlvbiAoKSB7cmV0dXJuIHRydWV9XG5cbmZ1bmN0aW9uIE1lbURPV04gKGxvY2F0aW9uKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBNZW1ET1dOKSlcbiAgICByZXR1cm4gbmV3IE1lbURPV04obG9jYXRpb24pXG5cbiAgQWJzdHJhY3RMZXZlbERPV04uY2FsbCh0aGlzLCB0eXBlb2YgbG9jYXRpb24gPT0gJ3N0cmluZycgPyBsb2NhdGlvbiA6ICcnKVxuXG4gIHRoaXMuX2xvY2F0aW9uID0gdGhpcy5sb2NhdGlvbiA/IHRvS2V5KHRoaXMubG9jYXRpb24pIDogJ190cmVlJ1xuICB0aGlzLl9zdG9yZSA9IHRoaXMubG9jYXRpb24gPyBnbG9iYWxTdG9yZTogdGhpc1xuICB0aGlzLl9zdG9yZVt0aGlzLl9sb2NhdGlvbl0gPSB0aGlzLl9zdG9yZVt0aGlzLl9sb2NhdGlvbl0gfHwgY3JlYXRlUkJUKGx0Z3QuY29tcGFyZSlcbn1cblxuTWVtRE9XTi5jbGVhckdsb2JhbFN0b3JlID0gZnVuY3Rpb24gKHN0cmljdCkge1xuICBpZiAoc3RyaWN0KSB7XG4gICAgT2JqZWN0LmtleXMoZ2xvYmFsU3RvcmUpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgZGVsZXRlIGdsb2JhbFN0b3JlW2tleV07XG4gICAgfSlcbiAgfSBlbHNlIHtcbiAgICBnbG9iYWxTdG9yZSA9IHt9XG4gIH1cbn1cblxuaW5oZXJpdHMoTWVtRE9XTiwgQWJzdHJhY3RMZXZlbERPV04pXG5cbk1lbURPV04ucHJvdG90eXBlLl9vcGVuID0gZnVuY3Rpb24gKG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gIHZhciBzZWxmID0gdGhpc1xuICBzZXRJbW1lZGlhdGUoZnVuY3Rpb24gY2FsbE5leHQoKSB7IGNhbGxiYWNrKG51bGwsIHNlbGYpIH0pXG59XG5cbk1lbURPV04ucHJvdG90eXBlLl9wdXQgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSwgb3B0aW9ucywgY2FsbGJhY2spIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3VuZGVmaW5lZCcgfHwgdmFsdWUgPT09IG51bGwpIHZhbHVlID0gJydcblxuICB2YXIgaXRlciA9IHRoaXMuX3N0b3JlW3RoaXMuX2xvY2F0aW9uXS5maW5kKGtleSlcblxuICBpZiAoaXRlci52YWxpZCkge1xuICAgIHRoaXMuX3N0b3JlW3RoaXMuX2xvY2F0aW9uXSA9IGl0ZXIudXBkYXRlKHZhbHVlKVxuICB9IGVsc2Uge1xuICAgIHRoaXMuX3N0b3JlW3RoaXMuX2xvY2F0aW9uXSA9IHRoaXMuX3N0b3JlW3RoaXMuX2xvY2F0aW9uXS5pbnNlcnQoa2V5LCB2YWx1ZSlcbiAgfVxuXG4gIHNldEltbWVkaWF0ZShjYWxsYmFjaylcbn1cblxuTWVtRE9XTi5wcm90b3R5cGUuX2dldCA9IGZ1bmN0aW9uIChrZXksIG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gIHZhciB2YWx1ZSA9IHRoaXMuX3N0b3JlW3RoaXMuX2xvY2F0aW9uXS5nZXQoa2V5KVxuXG4gIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gJ05vdEZvdW5kJyBlcnJvciwgY29uc2lzdGVudCB3aXRoIExldmVsRE9XTiBBUElcbiAgICB2YXIgZXJyID0gbmV3IEVycm9yKCdOb3RGb3VuZCcpXG4gICAgcmV0dXJuIHNldEltbWVkaWF0ZShmdW5jdGlvbiBjYWxsTmV4dCgpIHsgY2FsbGJhY2soZXJyKSB9KVxuICB9XG5cbiAgaWYgKG9wdGlvbnMuYXNCdWZmZXIgIT09IGZhbHNlICYmICF0aGlzLl9pc0J1ZmZlcih2YWx1ZSkpXG4gICAgdmFsdWUgPSBuZXcgQnVmZmVyKFN0cmluZyh2YWx1ZSkpXG5cbiAgc2V0SW1tZWRpYXRlKGZ1bmN0aW9uIGNhbGxOZXh0ICgpIHtcbiAgICBjYWxsYmFjayhudWxsLCB2YWx1ZSlcbiAgfSlcblxufVxuXG5NZW1ET1dOLnByb3RvdHlwZS5fZGVsID0gZnVuY3Rpb24gKGtleSwgb3B0aW9ucywgY2FsbGJhY2spIHtcbiAgdGhpcy5fc3RvcmVbdGhpcy5fbG9jYXRpb25dID0gdGhpcy5fc3RvcmVbdGhpcy5fbG9jYXRpb25dLnJlbW92ZShrZXkpXG4gIHNldEltbWVkaWF0ZShjYWxsYmFjaylcbn1cblxuTWVtRE9XTi5wcm90b3R5cGUuX2JhdGNoID0gZnVuY3Rpb24gKGFycmF5LCBvcHRpb25zLCBjYWxsYmFjaykge1xuICB2YXIgZXJyXG4gICAgLCBpID0gLTFcbiAgICAsIGtleVxuICAgICwgdmFsdWVcbiAgICAsIGl0ZXJcbiAgICAsIGxlbiA9IGFycmF5Lmxlbmd0aFxuICAgICwgdHJlZSA9IHRoaXMuX3N0b3JlW3RoaXMuX2xvY2F0aW9uXVxuXG4gIHdoaWxlICgrK2kgPCBsZW4pIHtcbiAgICBpZiAoIWFycmF5W2ldKVxuICAgICAgY29udGludWU7XG5cbiAgICBrZXkgPSB0aGlzLl9pc0J1ZmZlcihhcnJheVtpXS5rZXkpID8gYXJyYXlbaV0ua2V5IDogU3RyaW5nKGFycmF5W2ldLmtleSlcbiAgICBlcnIgPSB0aGlzLl9jaGVja0tleShrZXksICdrZXknKVxuICAgIGlmIChlcnIpXG4gICAgICByZXR1cm4gc2V0SW1tZWRpYXRlKGZ1bmN0aW9uIGVycm9yQ2FsbCgpIHsgY2FsbGJhY2soZXJyKSB9KVxuXG4gICAgaXRlciA9IHRyZWUuZmluZChrZXkpXG5cbiAgICBpZiAoYXJyYXlbaV0udHlwZSA9PT0gJ3B1dCcpIHtcbiAgICAgIHZhbHVlID0gdGhpcy5faXNCdWZmZXIoYXJyYXlbaV0udmFsdWUpID8gYXJyYXlbaV0udmFsdWUgOiBTdHJpbmcoYXJyYXlbaV0udmFsdWUpXG4gICAgICBlcnIgPSB0aGlzLl9jaGVja0tleSh2YWx1ZSwgJ3ZhbHVlJylcblxuICAgICAgaWYgKGVycilcbiAgICAgICAgcmV0dXJuIHNldEltbWVkaWF0ZShmdW5jdGlvbiBlcnJvckNhbGwoKSB7IGNhbGxiYWNrKGVycikgfSlcblxuICAgICAgdHJlZSA9IGl0ZXIudmFsaWQgPyBpdGVyLnVwZGF0ZSh2YWx1ZSkgOiB0cmVlLmluc2VydChrZXksIHZhbHVlKVxuICAgIH0gZWxzZSB7XG4gICAgICB0cmVlID0gaXRlci5yZW1vdmUoKVxuICAgIH1cbiAgfVxuXG4gIHRoaXMuX3N0b3JlW3RoaXMuX2xvY2F0aW9uXSA9IHRyZWU7XG5cbiAgc2V0SW1tZWRpYXRlKGNhbGxiYWNrKVxufVxuXG5NZW1ET1dOLnByb3RvdHlwZS5faXRlcmF0b3IgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICByZXR1cm4gbmV3IE1lbUl0ZXJhdG9yKHRoaXMsIG9wdGlvbnMpXG59XG5cbk1lbURPV04ucHJvdG90eXBlLl9pc0J1ZmZlciA9IGZ1bmN0aW9uIChvYmopIHtcbiAgcmV0dXJuIEJ1ZmZlci5pc0J1ZmZlcihvYmopXG59XG5cbk1lbURPV04uZGVzdHJveSA9IGZ1bmN0aW9uIChuYW1lLCBjYWxsYmFjaykge1xuICB2YXIga2V5ID0gdG9LZXkobmFtZSlcblxuICBpZiAoa2V5IGluIGdsb2JhbFN0b3JlKVxuICAgIGRlbGV0ZSBnbG9iYWxTdG9yZVtrZXldXG5cbiAgc2V0SW1tZWRpYXRlKGNhbGxiYWNrKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IE1lbURPV05cbiIsIlxuZXhwb3J0cy5jb21wYXJlID0gZnVuY3Rpb24gKGEsIGIpIHtcblxuICBpZihCdWZmZXIuaXNCdWZmZXIoYSkpIHtcbiAgICB2YXIgbCA9IE1hdGgubWluKGEubGVuZ3RoLCBiLmxlbmd0aClcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgbDsgaSsrKSB7XG4gICAgICB2YXIgY21wID0gYVtpXSAtIGJbaV1cbiAgICAgIGlmKGNtcCkgcmV0dXJuIGNtcFxuICAgIH1cbiAgICByZXR1cm4gYS5sZW5ndGggLSBiLmxlbmd0aFxuICB9XG5cbiAgcmV0dXJuIGEgPCBiID8gLTEgOiBhID4gYiA/IDEgOiAwXG59XG5cbmZ1bmN0aW9uIGhhcyhvYmosIGtleSkge1xuICByZXR1cm4gT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpXG59XG5cbi8vIHRvIGJlIGNvbXBhdGlibGUgd2l0aCB0aGUgY3VycmVudCBhYnN0cmFjdC1sZXZlbGRvd24gdGVzdHNcbi8vIG51bGxpc2ggb3IgZW1wdHkgc3RyaW5ncy5cbi8vIEkgY291bGQgdXNlICEhdmFsIGJ1dCBJIHdhbnQgdG8gcGVybWl0IG51bWJlcnMgYW5kIGJvb2xlYW5zLFxuLy8gaWYgcG9zc2libGUuXG5cbmZ1bmN0aW9uIGlzRGVmICh2YWwpIHtcbiAgcmV0dXJuIHZhbCAhPSBudWxsICYmIHZhbCAhPT0gJydcbn1cblxudmFyIGxvd2VyQm91bmQgPSBleHBvcnRzLmxvd2VyQm91bmQgPSBmdW5jdGlvbiAocmFuZ2UpIHtcbiAgcmV0dXJuIChcbiAgICAgIGlzRGVmKHJhbmdlLmd0KSAgICAgICAgICAgICAgICAgICAgICA/IHJhbmdlLmd0XG4gICAgOiBpc0RlZihyYW5nZS5ndGUpICAgICAgICAgICAgICAgICAgICAgPyByYW5nZS5ndGVcbiAgICA6IGlzRGVmKHJhbmdlLm1pbikgICAgICAgICAgICAgICAgICAgICA/IHJhbmdlLm1pblxuICAgIDogaXNEZWYocmFuZ2Uuc3RhcnQpICYmICFyYW5nZS5yZXZlcnNlID8gcmFuZ2Uuc3RhcnRcbiAgICA6IGlzRGVmKHJhbmdlLmVuZCkgJiYgcmFuZ2UucmV2ZXJzZSAgICA/IHJhbmdlLmVuZFxuICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWZpbmVkXG4gIClcbn1cblxuZXhwb3J0cy5sb3dlckJvdW5kSW5jbHVzaXZlID0gZnVuY3Rpb24gKHJhbmdlKSB7XG4gIHJldHVybiBpc0RlZihyYW5nZS5ndCkgPyBmYWxzZSA6IHRydWVcbn1cblxuZXhwb3J0cy51cHBlckJvdW5kSW5jbHVzaXZlID1cbiAgZnVuY3Rpb24gKHJhbmdlKSB7XG4gICAgcmV0dXJuIGlzRGVmKHJhbmdlLmx0KSA/IGZhbHNlIDogdHJ1ZVxuICB9XG5cbnZhciBsb3dlckJvdW5kRXhjbHVzaXZlID0gZXhwb3J0cy5sb3dlckJvdW5kRXhjbHVzaXZlID1cbiAgZnVuY3Rpb24gKHJhbmdlKSB7XG4gICAgcmV0dXJuIGlzRGVmKHJhbmdlLmd0KSA/IHRydWUgOiBmYWxzZVxuICB9XG5cbnZhciB1cHBlckJvdW5kRXhjbHVzaXZlID0gZXhwb3J0cy51cHBlckJvdW5kRXhjbHVzaXZlID1cbiAgZnVuY3Rpb24gKHJhbmdlKSB7XG4gICAgcmV0dXJuIGlzRGVmKHJhbmdlLmx0KSA/IHRydWUgOiBmYWxzZVxuICB9XG5cbnZhciB1cHBlckJvdW5kID0gZXhwb3J0cy51cHBlckJvdW5kID0gZnVuY3Rpb24gKHJhbmdlKSB7XG4gIHJldHVybiAoXG4gICAgICBpc0RlZihyYW5nZS5sdCkgICAgICAgICAgICAgICAgICAgICA/IHJhbmdlLmx0XG4gICAgOiBpc0RlZihyYW5nZS5sdGUpICAgICAgICAgICAgICAgICAgICA/IHJhbmdlLmx0ZVxuICAgIDogaXNEZWYocmFuZ2UubWF4KSAgICAgICAgICAgICAgICAgICAgPyByYW5nZS5tYXhcbiAgICA6IGlzRGVmKHJhbmdlLnN0YXJ0KSAmJiByYW5nZS5yZXZlcnNlID8gcmFuZ2Uuc3RhcnRcbiAgICA6IGlzRGVmKHJhbmdlLmVuZCkgJiYgIXJhbmdlLnJldmVyc2UgID8gcmFuZ2UuZW5kXG4gICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmaW5lZFxuICApXG59XG5cblxuZXhwb3J0cy5jb250YWlucyA9IGZ1bmN0aW9uIChyYW5nZSwga2V5LCBjb21wYXJlKSB7XG4gIGNvbXBhcmUgPSBjb21wYXJlIHx8IGV4cG9ydHMuY29tcGFyZVxuXG4gIHZhciBsYiA9IGxvd2VyQm91bmQocmFuZ2UpXG4gIGlmKGlzRGVmKGxiKSkge1xuICAgIHZhciBjbXAgPSBjb21wYXJlKGtleSwgbGIpXG4gICAgaWYoY21wIDwgMCB8fCAoY21wID09PSAwICYmIGxvd2VyQm91bmRFeGNsdXNpdmUocmFuZ2UpKSlcbiAgICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgdmFyIHViID0gdXBwZXJCb3VuZChyYW5nZSlcbiAgaWYoaXNEZWYodWIpKSB7XG4gICAgdmFyIGNtcCA9IGNvbXBhcmUoa2V5LCB1YilcbiAgICBpZihjbXAgPiAwIHx8IChjbXAgPT09IDApICYmIHVwcGVyQm91bmRFeGNsdXNpdmUocmFuZ2UpKVxuICAgICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICByZXR1cm4gdHJ1ZVxufVxuXG5leHBvcnRzLmZpbHRlciA9IGZ1bmN0aW9uIChyYW5nZSwgY29tcGFyZSkge1xuICByZXR1cm4gZnVuY3Rpb24gKGtleSkge1xuICAgIHJldHVybiBleHBvcnRzLmNvbnRhaW5zKHJhbmdlLCBrZXksIGNvbXBhcmUpXG4gIH1cbn1cbiIsIi8qKlxuICogSGVscGVycy5cbiAqL1xuXG52YXIgcyA9IDEwMDA7XG52YXIgbSA9IHMgKiA2MDtcbnZhciBoID0gbSAqIDYwO1xudmFyIGQgPSBoICogMjQ7XG52YXIgeSA9IGQgKiAzNjUuMjU7XG5cbi8qKlxuICogUGFyc2Ugb3IgZm9ybWF0IHRoZSBnaXZlbiBgdmFsYC5cbiAqXG4gKiBPcHRpb25zOlxuICpcbiAqICAtIGBsb25nYCB2ZXJib3NlIGZvcm1hdHRpbmcgW2ZhbHNlXVxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfE51bWJlcn0gdmFsXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICogQHJldHVybiB7U3RyaW5nfE51bWJlcn1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbih2YWwsIG9wdGlvbnMpe1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgaWYgKCdzdHJpbmcnID09IHR5cGVvZiB2YWwpIHJldHVybiBwYXJzZSh2YWwpO1xuICByZXR1cm4gb3B0aW9ucy5sb25nXG4gICAgPyBsb25nKHZhbClcbiAgICA6IHNob3J0KHZhbCk7XG59O1xuXG4vKipcbiAqIFBhcnNlIHRoZSBnaXZlbiBgc3RyYCBhbmQgcmV0dXJuIG1pbGxpc2Vjb25kcy5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyXG4gKiBAcmV0dXJuIHtOdW1iZXJ9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBwYXJzZShzdHIpIHtcbiAgc3RyID0gJycgKyBzdHI7XG4gIGlmIChzdHIubGVuZ3RoID4gMTAwMDApIHJldHVybjtcbiAgdmFyIG1hdGNoID0gL14oKD86XFxkKyk/XFwuP1xcZCspICoobWlsbGlzZWNvbmRzP3xtc2Vjcz98bXN8c2Vjb25kcz98c2Vjcz98c3xtaW51dGVzP3xtaW5zP3xtfGhvdXJzP3xocnM/fGh8ZGF5cz98ZHx5ZWFycz98eXJzP3x5KT8kL2kuZXhlYyhzdHIpO1xuICBpZiAoIW1hdGNoKSByZXR1cm47XG4gIHZhciBuID0gcGFyc2VGbG9hdChtYXRjaFsxXSk7XG4gIHZhciB0eXBlID0gKG1hdGNoWzJdIHx8ICdtcycpLnRvTG93ZXJDYXNlKCk7XG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgJ3llYXJzJzpcbiAgICBjYXNlICd5ZWFyJzpcbiAgICBjYXNlICd5cnMnOlxuICAgIGNhc2UgJ3lyJzpcbiAgICBjYXNlICd5JzpcbiAgICAgIHJldHVybiBuICogeTtcbiAgICBjYXNlICdkYXlzJzpcbiAgICBjYXNlICdkYXknOlxuICAgIGNhc2UgJ2QnOlxuICAgICAgcmV0dXJuIG4gKiBkO1xuICAgIGNhc2UgJ2hvdXJzJzpcbiAgICBjYXNlICdob3VyJzpcbiAgICBjYXNlICdocnMnOlxuICAgIGNhc2UgJ2hyJzpcbiAgICBjYXNlICdoJzpcbiAgICAgIHJldHVybiBuICogaDtcbiAgICBjYXNlICdtaW51dGVzJzpcbiAgICBjYXNlICdtaW51dGUnOlxuICAgIGNhc2UgJ21pbnMnOlxuICAgIGNhc2UgJ21pbic6XG4gICAgY2FzZSAnbSc6XG4gICAgICByZXR1cm4gbiAqIG07XG4gICAgY2FzZSAnc2Vjb25kcyc6XG4gICAgY2FzZSAnc2Vjb25kJzpcbiAgICBjYXNlICdzZWNzJzpcbiAgICBjYXNlICdzZWMnOlxuICAgIGNhc2UgJ3MnOlxuICAgICAgcmV0dXJuIG4gKiBzO1xuICAgIGNhc2UgJ21pbGxpc2Vjb25kcyc6XG4gICAgY2FzZSAnbWlsbGlzZWNvbmQnOlxuICAgIGNhc2UgJ21zZWNzJzpcbiAgICBjYXNlICdtc2VjJzpcbiAgICBjYXNlICdtcyc6XG4gICAgICByZXR1cm4gbjtcbiAgfVxufVxuXG4vKipcbiAqIFNob3J0IGZvcm1hdCBmb3IgYG1zYC5cbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gbXNcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHNob3J0KG1zKSB7XG4gIGlmIChtcyA+PSBkKSByZXR1cm4gTWF0aC5yb3VuZChtcyAvIGQpICsgJ2QnO1xuICBpZiAobXMgPj0gaCkgcmV0dXJuIE1hdGgucm91bmQobXMgLyBoKSArICdoJztcbiAgaWYgKG1zID49IG0pIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gbSkgKyAnbSc7XG4gIGlmIChtcyA+PSBzKSByZXR1cm4gTWF0aC5yb3VuZChtcyAvIHMpICsgJ3MnO1xuICByZXR1cm4gbXMgKyAnbXMnO1xufVxuXG4vKipcbiAqIExvbmcgZm9ybWF0IGZvciBgbXNgLlxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBtc1xuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gbG9uZyhtcykge1xuICByZXR1cm4gcGx1cmFsKG1zLCBkLCAnZGF5JylcbiAgICB8fCBwbHVyYWwobXMsIGgsICdob3VyJylcbiAgICB8fCBwbHVyYWwobXMsIG0sICdtaW51dGUnKVxuICAgIHx8IHBsdXJhbChtcywgcywgJ3NlY29uZCcpXG4gICAgfHwgbXMgKyAnIG1zJztcbn1cblxuLyoqXG4gKiBQbHVyYWxpemF0aW9uIGhlbHBlci5cbiAqL1xuXG5mdW5jdGlvbiBwbHVyYWwobXMsIG4sIG5hbWUpIHtcbiAgaWYgKG1zIDwgbikgcmV0dXJuO1xuICBpZiAobXMgPCBuICogMS41KSByZXR1cm4gTWF0aC5mbG9vcihtcyAvIG4pICsgJyAnICsgbmFtZTtcbiAgcmV0dXJuIE1hdGguY2VpbChtcyAvIG4pICsgJyAnICsgbmFtZSArICdzJztcbn1cbiIsInZhciBtdXRleGlmeSA9IGZ1bmN0aW9uKCkge1xuICB2YXIgcXVldWUgPSBbXVxuICB2YXIgdXNlZCA9IG51bGxcblxuICB2YXIgY2FsbCA9IGZ1bmN0aW9uICgpIHtcbiAgICB1c2VkKHJlbGVhc2UpXG4gIH1cblxuICB2YXIgYWNxdWlyZSA9IGZ1bmN0aW9uIChmbikge1xuICAgIGlmICh1c2VkKSByZXR1cm4gcXVldWUucHVzaChmbilcbiAgICB1c2VkID0gZm5cbiAgICBwcm9jZXNzLm5leHRUaWNrKGNhbGwpXG4gICAgcmV0dXJuIDBcbiAgfVxuXG4gIHZhciByZWxlYXNlID0gZnVuY3Rpb24gKGZuLCBlcnIsIHZhbHVlKSB7XG4gICAgdXNlZCA9IG51bGxcbiAgICBpZiAocXVldWUubGVuZ3RoKSBhY3F1aXJlKHF1ZXVlLnNoaWZ0KCkpXG4gICAgaWYgKGZuKSBmbihlcnIsIHZhbHVlKVxuICB9XG5cbiAgcmV0dXJuIGFjcXVpcmVcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBtdXRleGlmeSIsInZhciByZXEgPSByZXF1aXJlKCdyZXF1ZXN0JylcblxubW9kdWxlLmV4cG9ydHMgPSBOZXRzXG5cbmZ1bmN0aW9uIE5ldHMgKG9wdHMsIGNiKSB7XG4gIGlmICh0eXBlb2Ygb3B0cyA9PT0gJ3N0cmluZycpIG9wdHMgPSB7IHVyaTogb3B0cyB9XG5cbiAgLy8gaW4gbm9kZSwgaWYgZW5jb2RpbmcgPT09IG51bGwgdGhlbiByZXNwb25zZSB3aWxsIGJlIGEgQnVmZmVyLiB3ZSB3YW50IHRoaXMgdG8gYmUgdGhlIGRlZmF1bHRcbiAgaWYgKCFvcHRzLmhhc093blByb3BlcnR5KCdlbmNvZGluZycpKSBvcHRzLmVuY29kaW5nID0gbnVsbFxuXG4gIC8vIGluIGJyb3dzZXIsIHdlIHNob3VsZCBieSBkZWZhdWx0IGNvbnZlcnQgdGhlIGFycmF5YnVmZmVyIGludG8gYSBCdWZmZXJcbiAgaWYgKHByb2Nlc3MuYnJvd3NlciAmJiAhb3B0cy5oYXNPd25Qcm9wZXJ0eSgnanNvbicpICYmIG9wdHMuZW5jb2RpbmcgPT09IG51bGwpIHtcbiAgICBvcHRzLnJlc3BvbnNlVHlwZSA9ICdhcnJheWJ1ZmZlcidcbiAgICB2YXIgb3JpZ2luYWxDYiA9IGNiXG4gICAgY2IgPSBidWZmZXJpZnlcbiAgfVxuXG4gIGZ1bmN0aW9uIGJ1ZmZlcmlmeSAoZXJyLCByZXNwLCBib2R5KSB7XG4gICAgaWYgKGJvZHkpIGJvZHkgPSBuZXcgQnVmZmVyKG5ldyBVaW50OEFycmF5KGJvZHkpKVxuICAgIG9yaWdpbmFsQ2IoZXJyLCByZXNwLCBib2R5KVxuICB9XG5cbiAgcmV0dXJuIHJlcShvcHRzLCBjYilcbn1cbiIsInZhciB3cmFwcHkgPSByZXF1aXJlKCd3cmFwcHknKVxubW9kdWxlLmV4cG9ydHMgPSB3cmFwcHkob25jZSlcblxub25jZS5wcm90byA9IG9uY2UoZnVuY3Rpb24gKCkge1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRnVuY3Rpb24ucHJvdG90eXBlLCAnb25jZScsIHtcbiAgICB2YWx1ZTogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIG9uY2UodGhpcylcbiAgICB9LFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9KVxufSlcblxuZnVuY3Rpb24gb25jZSAoZm4pIHtcbiAgdmFyIGYgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGYuY2FsbGVkKSByZXR1cm4gZi52YWx1ZVxuICAgIGYuY2FsbGVkID0gdHJ1ZVxuICAgIHJldHVybiBmLnZhbHVlID0gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKVxuICB9XG4gIGYuY2FsbGVkID0gZmFsc2VcbiAgcmV0dXJuIGZcbn1cbiIsInZhciB0cmltID0gcmVxdWlyZSgndHJpbScpXG4gICwgZm9yRWFjaCA9IHJlcXVpcmUoJ2Zvci1lYWNoJylcbiAgLCBpc0FycmF5ID0gZnVuY3Rpb24oYXJnKSB7XG4gICAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGFyZykgPT09ICdbb2JqZWN0IEFycmF5XSc7XG4gICAgfVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChoZWFkZXJzKSB7XG4gIGlmICghaGVhZGVycylcbiAgICByZXR1cm4ge31cblxuICB2YXIgcmVzdWx0ID0ge31cblxuICBmb3JFYWNoKFxuICAgICAgdHJpbShoZWFkZXJzKS5zcGxpdCgnXFxuJylcbiAgICAsIGZ1bmN0aW9uIChyb3cpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gcm93LmluZGV4T2YoJzonKVxuICAgICAgICAgICwga2V5ID0gdHJpbShyb3cuc2xpY2UoMCwgaW5kZXgpKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgLCB2YWx1ZSA9IHRyaW0ocm93LnNsaWNlKGluZGV4ICsgMSkpXG5cbiAgICAgICAgaWYgKHR5cGVvZihyZXN1bHRba2V5XSkgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgcmVzdWx0W2tleV0gPSB2YWx1ZVxuICAgICAgICB9IGVsc2UgaWYgKGlzQXJyYXkocmVzdWx0W2tleV0pKSB7XG4gICAgICAgICAgcmVzdWx0W2tleV0ucHVzaCh2YWx1ZSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXN1bHRba2V5XSA9IFsgcmVzdWx0W2tleV0sIHZhbHVlIF1cbiAgICAgICAgfVxuICAgICAgfVxuICApXG5cbiAgcmV0dXJuIHJlc3VsdFxufSIsIi8vIEdlbmVyYXRlZCBieSBDb2ZmZWVTY3JpcHQgMS42LjNcbihmdW5jdGlvbigpIHtcbiAgdmFyIGdldE5hbm9TZWNvbmRzLCBocnRpbWUsIGxvYWRUaW1lO1xuXG4gIGlmICgodHlwZW9mIHBlcmZvcm1hbmNlICE9PSBcInVuZGVmaW5lZFwiICYmIHBlcmZvcm1hbmNlICE9PSBudWxsKSAmJiBwZXJmb3JtYW5jZS5ub3cpIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHBlcmZvcm1hbmNlLm5vdygpO1xuICAgIH07XG4gIH0gZWxzZSBpZiAoKHR5cGVvZiBwcm9jZXNzICE9PSBcInVuZGVmaW5lZFwiICYmIHByb2Nlc3MgIT09IG51bGwpICYmIHByb2Nlc3MuaHJ0aW1lKSB7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiAoZ2V0TmFub1NlY29uZHMoKSAtIGxvYWRUaW1lKSAvIDFlNjtcbiAgICB9O1xuICAgIGhydGltZSA9IHByb2Nlc3MuaHJ0aW1lO1xuICAgIGdldE5hbm9TZWNvbmRzID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgaHI7XG4gICAgICBociA9IGhydGltZSgpO1xuICAgICAgcmV0dXJuIGhyWzBdICogMWU5ICsgaHJbMV07XG4gICAgfTtcbiAgICBsb2FkVGltZSA9IGdldE5hbm9TZWNvbmRzKCk7XG4gIH0gZWxzZSBpZiAoRGF0ZS5ub3cpIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIERhdGUubm93KCkgLSBsb2FkVGltZTtcbiAgICB9O1xuICAgIGxvYWRUaW1lID0gRGF0ZS5ub3coKTtcbiAgfSBlbHNlIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gbG9hZFRpbWU7XG4gICAgfTtcbiAgICBsb2FkVGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICB9XG5cbn0pLmNhbGwodGhpcyk7XG5cbi8qXG4vL0Agc291cmNlTWFwcGluZ1VSTD1wZXJmb3JtYW5jZS1ub3cubWFwXG4qL1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pZiAoIXByb2Nlc3MudmVyc2lvbiB8fFxuICAgIHByb2Nlc3MudmVyc2lvbi5pbmRleE9mKCd2MC4nKSA9PT0gMCB8fFxuICAgIHByb2Nlc3MudmVyc2lvbi5pbmRleE9mKCd2MS4nKSA9PT0gMCAmJiBwcm9jZXNzLnZlcnNpb24uaW5kZXhPZigndjEuOC4nKSAhPT0gMCkge1xuICBtb2R1bGUuZXhwb3J0cyA9IG5leHRUaWNrO1xufSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSBwcm9jZXNzLm5leHRUaWNrO1xufVxuXG5mdW5jdGlvbiBuZXh0VGljayhmbikge1xuICB2YXIgYXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoIC0gMSk7XG4gIHZhciBpID0gMDtcbiAgd2hpbGUgKGkgPCBhcmdzLmxlbmd0aCkge1xuICAgIGFyZ3NbaSsrXSA9IGFyZ3VtZW50c1tpXTtcbiAgfVxuICBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uIGFmdGVyVGljaygpIHtcbiAgICBmbi5hcHBseShudWxsLCBhcmdzKTtcbiAgfSk7XG59XG4iLCJ2YXIgcGFyc2UgPSByZXF1aXJlKCcuL3BhcnNlJylcbnZhciBzdHJpbmdpZnkgPSByZXF1aXJlKCcuL3N0cmluZ2lmeScpXG5cbm1vZHVsZS5leHBvcnRzID0gcGFyc2Vcbm1vZHVsZS5leHBvcnRzLnBhcnNlID0gcGFyc2Vcbm1vZHVsZS5leHBvcnRzLnN0cmluZ2lmeSA9IHN0cmluZ2lmeVxuIiwidmFyIHRva2VuaXplID0gcmVxdWlyZSgnLi90b2tlbml6ZScpXG52YXIgTUFYX1JBTkdFID0gMHgxRkZGRkZGRlxuXG52YXIgb25maWVsZG9wdGlvbnMgPSBmdW5jdGlvbiAodG9rZW5zKSB7XG4gIHZhciBvcHRzID0ge31cblxuICB3aGlsZSAodG9rZW5zLmxlbmd0aCkge1xuICAgIHN3aXRjaCAodG9rZW5zWzBdKSB7XG4gICAgICBjYXNlICdbJzpcbiAgICAgIGNhc2UgJywnOlxuICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICB2YXIgbmFtZSA9IHRva2Vucy5zaGlmdCgpXG4gICAgICAgIGlmIChuYW1lID09PSAnKCcpIHsgICAgICAgLy8gaGFuZGxpbmcgWyhBKSA9IEJdXG4gICAgICAgICAgbmFtZSA9IHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgdG9rZW5zLnNoaWZ0KCkgICAgICAgICAgLy8gcmVtb3ZlIHRoZSBlbmQgb2YgYnJhY2tldFxuICAgICAgICB9XG4gICAgICAgIGlmICh0b2tlbnNbMF0gIT09ICc9JykgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIHRva2VuIGluIGZpZWxkIG9wdGlvbnM6ICcgKyB0b2tlbnNbMF0pXG4gICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgIGlmICh0b2tlbnNbMF0gPT09ICddJykgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIF0gaW4gZmllbGQgb3B0aW9uJylcbiAgICAgICAgb3B0c1tuYW1lXSA9IHRva2Vucy5zaGlmdCgpXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlICddJzpcbiAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgcmV0dXJuIG9wdHNcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIHRva2VuIGluIGZpZWxkIG9wdGlvbnM6ICcgKyB0b2tlbnNbMF0pXG4gICAgfVxuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKCdObyBjbG9zaW5nIHRhZyBmb3IgZmllbGQgb3B0aW9ucycpXG59XG5cbnZhciBvbmZpZWxkID0gZnVuY3Rpb24gKHRva2Vucykge1xuICB2YXIgZmllbGQgPSB7XG4gICAgbmFtZTogbnVsbCxcbiAgICB0eXBlOiBudWxsLFxuICAgIHRhZzogMCxcbiAgICBtYXA6IG51bGwsXG4gICAgb25lb2Y6IG51bGwsXG4gICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgIHJlcGVhdGVkOiBmYWxzZSxcbiAgICBvcHRpb25zOiB7fVxuICB9XG5cbiAgd2hpbGUgKHRva2Vucy5sZW5ndGgpIHtcbiAgICBzd2l0Y2ggKHRva2Vuc1swXSkge1xuICAgICAgY2FzZSAnPSc6XG4gICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgIGZpZWxkLnRhZyA9IE51bWJlcih0b2tlbnMuc2hpZnQoKSlcbiAgICAgICAgYnJlYWtcblxuICAgICAgY2FzZSAnbWFwJzpcbiAgICAgICAgZmllbGQudHlwZSA9ICdtYXAnXG4gICAgICAgIGZpZWxkLm1hcCA9IHtmcm9tOiBudWxsLCB0bzogbnVsbH1cbiAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgaWYgKHRva2Vuc1swXSAhPT0gJzwnKSB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgdG9rZW4gaW4gbWFwIHR5cGU6ICcgKyB0b2tlbnNbMF0pXG4gICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgIGZpZWxkLm1hcC5mcm9tID0gdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgaWYgKHRva2Vuc1swXSAhPT0gJywnKSB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgdG9rZW4gaW4gbWFwIHR5cGU6ICcgKyB0b2tlbnNbMF0pXG4gICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgIGZpZWxkLm1hcC50byA9IHRva2Vucy5zaGlmdCgpXG4gICAgICAgIGlmICh0b2tlbnNbMF0gIT09ICc+JykgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIHRva2VuIGluIG1hcCB0eXBlOiAnICsgdG9rZW5zWzBdKVxuICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICBmaWVsZC5uYW1lID0gdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgYnJlYWtcblxuICAgICAgY2FzZSAncmVwZWF0ZWQnOlxuICAgICAgY2FzZSAncmVxdWlyZWQnOlxuICAgICAgY2FzZSAnb3B0aW9uYWwnOlxuICAgICAgICB2YXIgdCA9IHRva2Vucy5zaGlmdCgpXG4gICAgICAgIGZpZWxkLnJlcXVpcmVkID0gdCA9PT0gJ3JlcXVpcmVkJ1xuICAgICAgICBmaWVsZC5yZXBlYXRlZCA9IHQgPT09ICdyZXBlYXRlZCdcbiAgICAgICAgZmllbGQudHlwZSA9IHRva2Vucy5zaGlmdCgpXG4gICAgICAgIGZpZWxkLm5hbWUgPSB0b2tlbnMuc2hpZnQoKVxuICAgICAgICBicmVha1xuXG4gICAgICBjYXNlICdbJzpcbiAgICAgICAgZmllbGQub3B0aW9ucyA9IG9uZmllbGRvcHRpb25zKHRva2VucylcbiAgICAgICAgYnJlYWtcblxuICAgICAgY2FzZSAnOyc6XG4gICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgIHJldHVybiBmaWVsZFxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgdG9rZW4gaW4gbWVzc2FnZSBmaWVsZDogJyArIHRva2Vuc1swXSlcbiAgICB9XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoJ05vIDsgZm91bmQgZm9yIG1lc3NhZ2UgZmllbGQnKVxufVxuXG52YXIgb25tZXNzYWdlYm9keSA9IGZ1bmN0aW9uICh0b2tlbnMpIHtcbiAgdmFyIGJvZHkgPSB7XG4gICAgZW51bXM6IFtdLFxuICAgIG1lc3NhZ2VzOiBbXSxcbiAgICBmaWVsZHM6IFtdLFxuICAgIGV4dGVuc2lvbnM6IG51bGxcbiAgfVxuXG4gIHdoaWxlICh0b2tlbnMubGVuZ3RoKSB7XG4gICAgc3dpdGNoICh0b2tlbnNbMF0pIHtcbiAgICAgIGNhc2UgJ21hcCc6XG4gICAgICBjYXNlICdyZXBlYXRlZCc6XG4gICAgICBjYXNlICdvcHRpb25hbCc6XG4gICAgICBjYXNlICdyZXF1aXJlZCc6XG4gICAgICAgIGJvZHkuZmllbGRzLnB1c2gob25maWVsZCh0b2tlbnMpKVxuICAgICAgICBicmVha1xuXG4gICAgICBjYXNlICdlbnVtJzpcbiAgICAgICAgYm9keS5lbnVtcy5wdXNoKG9uZW51bSh0b2tlbnMpKVxuICAgICAgICBicmVha1xuXG4gICAgICBjYXNlICdtZXNzYWdlJzpcbiAgICAgICAgYm9keS5tZXNzYWdlcy5wdXNoKG9ubWVzc2FnZSh0b2tlbnMpKVxuICAgICAgICBicmVha1xuXG4gICAgICBjYXNlICdleHRlbnNpb25zJzpcbiAgICAgICAgYm9keS5leHRlbnNpb25zID0gb25leHRlbnNpb25zKHRva2VucylcbiAgICAgICAgYnJlYWtcblxuICAgICAgY2FzZSAnb25lb2YnOlxuICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICB2YXIgbmFtZSA9IHRva2Vucy5zaGlmdCgpXG4gICAgICAgIGlmICh0b2tlbnNbMF0gIT09ICd7JykgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIHRva2VuIGluIG9uZW9mOiAnICsgdG9rZW5zWzBdKVxuICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICB3aGlsZSAodG9rZW5zWzBdICE9PSAnfScpIHtcbiAgICAgICAgICB0b2tlbnMudW5zaGlmdCgnb3B0aW9uYWwnKVxuICAgICAgICAgIHZhciBmaWVsZCA9IG9uZmllbGQodG9rZW5zKVxuICAgICAgICAgIGZpZWxkLm9uZW9mID0gbmFtZVxuICAgICAgICAgIGJvZHkuZmllbGRzLnB1c2goZmllbGQpXG4gICAgICAgIH1cbiAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgYnJlYWtcblxuICAgICAgY2FzZSAnOyc6XG4gICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgIGJyZWFrXG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIC8vIHByb3RvMyBkb2VzIG5vdCByZXF1aXJlIHRoZSB1c2Ugb2Ygb3B0aW9uYWwvcmVxdWlyZWQsIGFzc3VtZWQgYXMgb3B0aW9uYWxcbiAgICAgICAgLy8gXCJzaW5ndWxhcjogYSB3ZWxsLWZvcm1lZCBtZXNzYWdlIGNhbiBoYXZlIHplcm8gb3Igb25lIG9mIHRoaXMgZmllbGQgKGJ1dCBub3QgbW9yZSB0aGFuIG9uZSkuXCJcbiAgICAgICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy9kb2NzL3Byb3RvMyNzcGVjaWZ5aW5nLWZpZWxkLXJ1bGVzXG4gICAgICAgIHRva2Vucy51bnNoaWZ0KCdvcHRpb25hbCcpXG4gICAgICAgIGJvZHkuZmllbGRzLnB1c2gob25maWVsZCh0b2tlbnMpKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBib2R5XG59XG5cbnZhciBvbmV4dGVuZCA9IGZ1bmN0aW9uICh0b2tlbnMpIHtcbiAgdmFyIG91dCA9IHtcbiAgICBuYW1lOiB0b2tlbnNbMV0sXG4gICAgbWVzc2FnZTogb25tZXNzYWdlKHRva2VucylcbiAgfVxuICByZXR1cm4gb3V0XG59XG5cbnZhciBvbmV4dGVuc2lvbnMgPSBmdW5jdGlvbiAodG9rZW5zKSB7XG4gIHRva2Vucy5zaGlmdCgpXG4gIHZhciBmcm9tID0gTnVtYmVyKHRva2Vucy5zaGlmdCgpKVxuICBpZiAoaXNOYU4oZnJvbSkpIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBmcm9tIGluIGV4dGVuc2lvbnMgZGVmaW5pdGlvbicpXG4gIGlmICh0b2tlbnMuc2hpZnQoKSAhPT0gJ3RvJykgdGhyb3cgbmV3IEVycm9yKFwiRXhwZWN0ZWQga2V5d29yZCAndG8nIGluIGV4dGVuc2lvbnMgZGVmaW5pdGlvblwiKVxuICB2YXIgdG8gPSB0b2tlbnMuc2hpZnQoKVxuICBpZiAodG8gPT09ICdtYXgnKSB0byA9IE1BWF9SQU5HRVxuICB0byA9IE51bWJlcih0bylcbiAgaWYgKGlzTmFOKHRvKSkgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHRvIGluIGV4dGVuc2lvbnMgZGVmaW5pdGlvbicpXG4gIGlmICh0b2tlbnMuc2hpZnQoKSAhPT0gJzsnKSB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgOyBpbiBleHRlbnNpb25zIGRlZmluaXRpb24nKVxuICByZXR1cm4ge2Zyb206IGZyb20sIHRvOiB0b31cbn1cbnZhciBvbm1lc3NhZ2UgPSBmdW5jdGlvbiAodG9rZW5zKSB7XG4gIHRva2Vucy5zaGlmdCgpXG5cbiAgdmFyIGx2bCA9IDFcbiAgdmFyIGJvZHkgPSBbXVxuICB2YXIgbXNnID0ge1xuICAgIG5hbWU6IHRva2Vucy5zaGlmdCgpLFxuICAgIGVudW1zOiBbXSxcbiAgICBtZXNzYWdlczogW10sXG4gICAgZmllbGRzOiBbXVxuICB9XG5cbiAgaWYgKHRva2Vuc1swXSAhPT0gJ3snKSB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHsgYnV0IGZvdW5kICcgKyB0b2tlbnNbMF0pXG4gIHRva2Vucy5zaGlmdCgpXG5cbiAgd2hpbGUgKHRva2Vucy5sZW5ndGgpIHtcbiAgICBpZiAodG9rZW5zWzBdID09PSAneycpIGx2bCsrXG4gICAgZWxzZSBpZiAodG9rZW5zWzBdID09PSAnfScpIGx2bC0tXG5cbiAgICBpZiAoIWx2bCkge1xuICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgIGJvZHkgPSBvbm1lc3NhZ2Vib2R5KGJvZHkpXG4gICAgICBtc2cuZW51bXMgPSBib2R5LmVudW1zXG4gICAgICBtc2cubWVzc2FnZXMgPSBib2R5Lm1lc3NhZ2VzXG4gICAgICBtc2cuZmllbGRzID0gYm9keS5maWVsZHNcbiAgICAgIG1zZy5leHRlbnNpb25zID0gYm9keS5leHRlbnNpb25zXG4gICAgICByZXR1cm4gbXNnXG4gICAgfVxuXG4gICAgYm9keS5wdXNoKHRva2Vucy5zaGlmdCgpKVxuICB9XG5cbiAgaWYgKGx2bCkgdGhyb3cgbmV3IEVycm9yKCdObyBjbG9zaW5nIHRhZyBmb3IgbWVzc2FnZScpXG59XG5cbnZhciBvbnBhY2thZ2VuYW1lID0gZnVuY3Rpb24gKHRva2Vucykge1xuICB0b2tlbnMuc2hpZnQoKVxuICB2YXIgbmFtZSA9IHRva2Vucy5zaGlmdCgpXG4gIGlmICh0b2tlbnNbMF0gIT09ICc7JykgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCA7IGJ1dCBmb3VuZCAnICsgdG9rZW5zWzBdKVxuICB0b2tlbnMuc2hpZnQoKVxuICByZXR1cm4gbmFtZVxufVxuXG52YXIgb25zeW50YXh2ZXJzaW9uID0gZnVuY3Rpb24gKHRva2Vucykge1xuICB0b2tlbnMuc2hpZnQoKVxuXG4gIGlmICh0b2tlbnNbMF0gIT09ICc9JykgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCA9IGJ1dCBmb3VuZCAnICsgdG9rZW5zWzBdKVxuICB0b2tlbnMuc2hpZnQoKVxuXG4gIHZhciB2ZXJzaW9uID0gdG9rZW5zLnNoaWZ0KClcbiAgc3dpdGNoICh2ZXJzaW9uKSB7XG4gICAgY2FzZSAnXCJwcm90bzJcIic6XG4gICAgICB2ZXJzaW9uID0gMlxuICAgICAgYnJlYWtcblxuICAgIGNhc2UgJ1wicHJvdG8zXCInOlxuICAgICAgdmVyc2lvbiA9IDNcbiAgICAgIGJyZWFrXG5cbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBwcm90b2J1ZiBzeW50YXggdmVyc2lvbiBidXQgZm91bmQgJyArIHZlcnNpb24pXG4gIH1cblxuICBpZiAodG9rZW5zWzBdICE9PSAnOycpIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgOyBidXQgZm91bmQgJyArIHRva2Vuc1swXSlcbiAgdG9rZW5zLnNoaWZ0KClcblxuICByZXR1cm4gdmVyc2lvblxufVxuXG52YXIgb25lbnVtdmFsdWUgPSBmdW5jdGlvbiAodG9rZW5zKSB7XG4gIGlmICh0b2tlbnMubGVuZ3RoIDwgNCkgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGVudW0gdmFsdWU6ICcgKyB0b2tlbnMuc2xpY2UoMCwgMykuam9pbignICcpKVxuICBpZiAodG9rZW5zWzFdICE9PSAnPScpIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgPSBidXQgZm91bmQgJyArIHRva2Vuc1sxXSlcbiAgaWYgKHRva2Vuc1szXSAhPT0gJzsnKSB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIDsgYnV0IGZvdW5kICcgKyB0b2tlbnNbMV0pXG5cbiAgdmFyIG5hbWUgPSB0b2tlbnMuc2hpZnQoKVxuICB0b2tlbnMuc2hpZnQoKVxuXG4gIHZhciB2YWx1ZSA9IE51bWJlcih0b2tlbnMuc2hpZnQoKSlcbiAgdG9rZW5zLnNoaWZ0KClcblxuICByZXR1cm4ge1xuICAgIG5hbWU6IG5hbWUsXG4gICAgdmFsdWU6IHZhbHVlXG4gIH1cbn1cblxudmFyIG9uZW51bSA9IGZ1bmN0aW9uICh0b2tlbnMpIHtcbiAgdG9rZW5zLnNoaWZ0KClcblxuICB2YXIgZSA9IHtcbiAgICBuYW1lOiB0b2tlbnMuc2hpZnQoKSxcbiAgICB2YWx1ZXM6IHt9XG4gIH1cblxuICBpZiAodG9rZW5zWzBdICE9PSAneycpIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgeyBidXQgZm91bmQgJyArIHRva2Vuc1swXSlcbiAgdG9rZW5zLnNoaWZ0KClcblxuICB3aGlsZSAodG9rZW5zLmxlbmd0aCkge1xuICAgIGlmICh0b2tlbnNbMF0gPT09ICd9Jykge1xuICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgIC8vIHRoZXJlIGdvZXMgb3B0aW9uYWwgc2VtaWNvbG9uIGFmdGVyIHRoZSBlbmNsb3NpbmcgXCJ9XCJcbiAgICAgIGlmICh0b2tlbnNbMF0gPT09ICc7JykgdG9rZW5zLnNoaWZ0KClcbiAgICAgIHJldHVybiBlXG4gICAgfVxuICAgIGlmICh0b2tlbnNbMF0gPT09ICdvcHRpb24nKSB7XG4gICAgICAvLyBqdXN0IHNraXAgXCJvcHRpb24gYWxsb3dfYWxpYXMgPSB0cnVlO1wiXG4gICAgICB3aGlsZSAodG9rZW5zLnNoaWZ0KCkgIT09ICc7Jykge1xuICAgICAgICAvLyBkbyBub3RoaW5nXG4gICAgICB9XG4gICAgfVxuICAgIHZhciB2YWwgPSBvbmVudW12YWx1ZSh0b2tlbnMpXG4gICAgZS52YWx1ZXNbdmFsLm5hbWVdID0gdmFsLnZhbHVlXG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoJ05vIGNsb3NpbmcgdGFnIGZvciBlbnVtJylcbn1cblxudmFyIG9ub3B0aW9uID0gZnVuY3Rpb24gKHRva2Vucykge1xuICB2YXIgbmFtZSA9IG51bGxcbiAgdmFyIHZhbHVlID0gbnVsbFxuXG4gIHZhciBwYXJzZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSA9PT0gJ3RydWUnKSByZXR1cm4gdHJ1ZVxuICAgIGlmICh2YWx1ZSA9PT0gJ2ZhbHNlJykgcmV0dXJuIGZhbHNlXG4gICAgcmV0dXJuIHZhbHVlLnJlcGxhY2UoL15cIit8XCIrJC9nbSwgJycpXG4gIH1cblxuICB3aGlsZSAodG9rZW5zLmxlbmd0aCkge1xuICAgIGlmICh0b2tlbnNbMF0gPT09ICc7Jykge1xuICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgIHJldHVybiB7bmFtZTogbmFtZSwgdmFsdWU6IHZhbHVlfVxuICAgIH1cbiAgICBzd2l0Y2ggKHRva2Vuc1swXSkge1xuICAgICAgY2FzZSAnb3B0aW9uJzpcbiAgICAgICAgdG9rZW5zLnNoaWZ0KClcblxuICAgICAgICB2YXIgaGFzQnJhY2tldCA9IHRva2Vuc1swXSA9PT0gJygnXG4gICAgICAgIGlmIChoYXNCcmFja2V0KSB0b2tlbnMuc2hpZnQoKVxuXG4gICAgICAgIG5hbWUgPSB0b2tlbnMuc2hpZnQoKVxuXG4gICAgICAgIGlmIChoYXNCcmFja2V0KSB7XG4gICAgICAgICAgaWYgKHRva2Vuc1swXSAhPT0gJyknKSB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkICkgYnV0IGZvdW5kICcgKyB0b2tlbnNbMF0pXG4gICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgfVxuICAgICAgICBicmVha1xuXG4gICAgICBjYXNlICc9JzpcbiAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgaWYgKG5hbWUgPT09IG51bGwpIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQga2V5IGZvciBvcHRpb24gd2l0aCB2YWx1ZTogJyArIHRva2Vuc1swXSlcbiAgICAgICAgdmFsdWUgPSBwYXJzZSh0b2tlbnMuc2hpZnQoKSlcblxuICAgICAgICBpZiAobmFtZSA9PT0gJ29wdGltaXplX2ZvcicgJiYgIS9eKFNQRUVEfENPREVfU0laRXxMSVRFX1JVTlRJTUUpJC8udGVzdCh2YWx1ZSkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgdmFsdWUgZm9yIG9wdGlvbiBvcHRpbWl6ZV9mb3I6ICcgKyB2YWx1ZSlcbiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gJ3snKSB7XG4gICAgICAgICAgLy8gb3B0aW9uIGZvbyA9IHtiYXI6IGJhen1cbiAgICAgICAgICB2YWx1ZSA9IG9ub3B0aW9uTWFwKHRva2VucylcbiAgICAgICAgfVxuICAgICAgICBicmVha1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgdG9rZW4gaW4gb3B0aW9uOiAnICsgdG9rZW5zWzBdKVxuICAgIH1cbiAgfVxufVxuXG52YXIgb25vcHRpb25NYXAgPSBmdW5jdGlvbiAodG9rZW5zKSB7XG4gIHZhciBwYXJzZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSA9PT0gJ3RydWUnKSByZXR1cm4gdHJ1ZVxuICAgIGlmICh2YWx1ZSA9PT0gJ2ZhbHNlJykgcmV0dXJuIGZhbHNlXG4gICAgcmV0dXJuIHZhbHVlLnJlcGxhY2UoL15cIit8XCIrJC9nbSwgJycpXG4gIH1cblxuICB2YXIgbWFwID0ge31cblxuICB3aGlsZSAodG9rZW5zLmxlbmd0aCkge1xuICAgIGlmICh0b2tlbnNbMF0gPT09ICd9Jykge1xuICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgIHJldHVybiBtYXBcbiAgICB9XG5cbiAgICB2YXIgaGFzQnJhY2tldCA9IHRva2Vuc1swXSA9PT0gJygnXG4gICAgaWYgKGhhc0JyYWNrZXQpIHRva2Vucy5zaGlmdCgpXG5cbiAgICB2YXIga2V5ID0gdG9rZW5zLnNoaWZ0KClcbiAgICBpZiAoaGFzQnJhY2tldCkge1xuICAgICAgaWYgKHRva2Vuc1swXSAhPT0gJyknKSB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkICkgYnV0IGZvdW5kICcgKyB0b2tlbnNbMF0pXG4gICAgICB0b2tlbnMuc2hpZnQoKVxuICAgIH1cblxuICAgIHZhciB2YWx1ZSA9IG51bGxcblxuICAgIHN3aXRjaCAodG9rZW5zWzBdKSB7XG4gICAgICBjYXNlICc6JzpcbiAgICAgICAgaWYgKG1hcFtrZXldICE9PSB1bmRlZmluZWQpIHRocm93IG5ldyBFcnJvcignRHVwbGljYXRlIG9wdGlvbiBtYXAga2V5ICcgKyBrZXkpXG5cbiAgICAgICAgdG9rZW5zLnNoaWZ0KClcblxuICAgICAgICB2YWx1ZSA9IHBhcnNlKHRva2Vucy5zaGlmdCgpKVxuXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gJ3snKSB7XG4gICAgICAgICAgLy8gb3B0aW9uIGZvbyA9IHtiYXI6IGJhen1cbiAgICAgICAgICB2YWx1ZSA9IG9ub3B0aW9uTWFwKHRva2VucylcbiAgICAgICAgfVxuXG4gICAgICAgIG1hcFtrZXldID0gdmFsdWVcbiAgICAgICAgYnJlYWtcblxuICAgICAgY2FzZSAneyc6XG4gICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgIHZhbHVlID0gb25vcHRpb25NYXAodG9rZW5zKVxuXG4gICAgICAgIGlmIChtYXBba2V5XSA9PT0gdW5kZWZpbmVkKSBtYXBba2V5XSA9IFtdXG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShtYXBba2V5XSkpIHRocm93IG5ldyBFcnJvcignRHVwbGljYXRlIG9wdGlvbiBtYXAga2V5ICcgKyBrZXkpXG5cbiAgICAgICAgbWFwW2tleV0ucHVzaCh2YWx1ZSlcbiAgICAgICAgYnJlYWtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIHRva2VuIGluIG9wdGlvbiBtYXA6ICcgKyB0b2tlbnNbMF0pXG4gICAgfVxuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKCdObyBjbG9zaW5nIHRhZyBmb3Igb3B0aW9uIG1hcCcpXG59XG5cbnZhciBvbmltcG9ydCA9IGZ1bmN0aW9uICh0b2tlbnMpIHtcbiAgdG9rZW5zLnNoaWZ0KClcbiAgdmFyIGZpbGUgPSB0b2tlbnMuc2hpZnQoKS5yZXBsYWNlKC9eXCIrfFwiKyQvZ20sICcnKVxuXG4gIGlmICh0b2tlbnNbMF0gIT09ICc7JykgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIHRva2VuOiAnICsgdG9rZW5zWzBdICsgJy4gRXhwZWN0ZWQgXCI7XCInKVxuXG4gIHRva2Vucy5zaGlmdCgpXG4gIHJldHVybiBmaWxlXG59XG5cbnZhciBvbnNlcnZpY2UgPSBmdW5jdGlvbiAodG9rZW5zKSB7XG4gIHRva2Vucy5zaGlmdCgpXG5cbiAgdmFyIHNlcnZpY2UgPSB7XG4gICAgbmFtZTogdG9rZW5zLnNoaWZ0KCksXG4gICAgbWV0aG9kczogW10sXG4gICAgb3B0aW9uczoge31cbiAgfVxuXG4gIGlmICh0b2tlbnNbMF0gIT09ICd7JykgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCB7IGJ1dCBmb3VuZCAnICsgdG9rZW5zWzBdKVxuICB0b2tlbnMuc2hpZnQoKVxuXG4gIHdoaWxlICh0b2tlbnMubGVuZ3RoKSB7XG4gICAgaWYgKHRva2Vuc1swXSA9PT0gJ30nKSB7XG4gICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgLy8gdGhlcmUgZ29lcyBvcHRpb25hbCBzZW1pY29sb24gYWZ0ZXIgdGhlIGVuY2xvc2luZyBcIn1cIlxuICAgICAgaWYgKHRva2Vuc1swXSA9PT0gJzsnKSB0b2tlbnMuc2hpZnQoKVxuICAgICAgcmV0dXJuIHNlcnZpY2VcbiAgICB9XG5cbiAgICBzd2l0Y2ggKHRva2Vuc1swXSkge1xuICAgICAgY2FzZSAnb3B0aW9uJzpcbiAgICAgICAgdmFyIG9wdCA9IG9ub3B0aW9uKHRva2VucylcbiAgICAgICAgaWYgKHNlcnZpY2Uub3B0aW9uc1tvcHQubmFtZV0gIT09IHVuZGVmaW5lZCkgdGhyb3cgbmV3IEVycm9yKCdEdXBsaWNhdGUgb3B0aW9uICcgKyBvcHQubmFtZSlcbiAgICAgICAgc2VydmljZS5vcHRpb25zW29wdC5uYW1lXSA9IG9wdC52YWx1ZVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSAncnBjJzpcbiAgICAgICAgc2VydmljZS5tZXRob2RzLnB1c2gob25ycGModG9rZW5zKSlcbiAgICAgICAgYnJlYWtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCB0b2tlbiBpbiBzZXJ2aWNlOiAnICsgdG9rZW5zWzBdKVxuICAgIH1cbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcignTm8gY2xvc2luZyB0YWcgZm9yIHNlcnZpY2UnKVxufVxuXG52YXIgb25ycGMgPSBmdW5jdGlvbiAodG9rZW5zKSB7XG4gIHRva2Vucy5zaGlmdCgpXG5cbiAgdmFyIHJwYyA9IHtcbiAgICBuYW1lOiB0b2tlbnMuc2hpZnQoKSxcbiAgICBpbnB1dF90eXBlOiBudWxsLFxuICAgIG91dHB1dF90eXBlOiBudWxsLFxuICAgIGNsaWVudF9zdHJlYW1pbmc6IGZhbHNlLFxuICAgIHNlcnZlcl9zdHJlYW1pbmc6IGZhbHNlLFxuICAgIG9wdGlvbnM6IHt9XG4gIH1cblxuICBpZiAodG9rZW5zWzBdICE9PSAnKCcpIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgKCBidXQgZm91bmQgJyArIHRva2Vuc1swXSlcbiAgdG9rZW5zLnNoaWZ0KClcblxuICBpZiAodG9rZW5zWzBdID09PSAnc3RyZWFtJykge1xuICAgIHRva2Vucy5zaGlmdCgpXG4gICAgcnBjLmNsaWVudF9zdHJlYW1pbmcgPSB0cnVlXG4gIH1cblxuICBycGMuaW5wdXRfdHlwZSA9IHRva2Vucy5zaGlmdCgpXG5cbiAgaWYgKHRva2Vuc1swXSAhPT0gJyknKSB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkICkgYnV0IGZvdW5kICcgKyB0b2tlbnNbMF0pXG4gIHRva2Vucy5zaGlmdCgpXG5cbiAgaWYgKHRva2Vuc1swXSAhPT0gJ3JldHVybnMnKSB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHJldHVybnMgYnV0IGZvdW5kICcgKyB0b2tlbnNbMF0pXG4gIHRva2Vucy5zaGlmdCgpXG5cbiAgaWYgKHRva2Vuc1swXSAhPT0gJygnKSB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkICggYnV0IGZvdW5kICcgKyB0b2tlbnNbMF0pXG4gIHRva2Vucy5zaGlmdCgpXG5cbiAgaWYgKHRva2Vuc1swXSA9PT0gJ3N0cmVhbScpIHtcbiAgICB0b2tlbnMuc2hpZnQoKVxuICAgIHJwYy5zZXJ2ZXJfc3RyZWFtaW5nID0gdHJ1ZVxuICB9XG5cbiAgcnBjLm91dHB1dF90eXBlID0gdG9rZW5zLnNoaWZ0KClcblxuICBpZiAodG9rZW5zWzBdICE9PSAnKScpIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgKSBidXQgZm91bmQgJyArIHRva2Vuc1swXSlcbiAgdG9rZW5zLnNoaWZ0KClcblxuICBpZiAodG9rZW5zWzBdID09PSAnOycpIHtcbiAgICB0b2tlbnMuc2hpZnQoKVxuICAgIHJldHVybiBycGNcbiAgfVxuXG4gIGlmICh0b2tlbnNbMF0gIT09ICd7JykgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCB7IGJ1dCBmb3VuZCAnICsgdG9rZW5zWzBdKVxuICB0b2tlbnMuc2hpZnQoKVxuXG4gIHdoaWxlICh0b2tlbnMubGVuZ3RoKSB7XG4gICAgaWYgKHRva2Vuc1swXSA9PT0gJ30nKSB7XG4gICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgLy8gdGhlcmUgZ29lcyBvcHRpb25hbCBzZW1pY29sb24gYWZ0ZXIgdGhlIGVuY2xvc2luZyBcIn1cIlxuICAgICAgaWYgKHRva2Vuc1swXSA9PT0gJzsnKSB0b2tlbnMuc2hpZnQoKVxuICAgICAgcmV0dXJuIHJwY1xuICAgIH1cblxuICAgIGlmICh0b2tlbnNbMF0gPT09ICdvcHRpb24nKSB7XG4gICAgICB2YXIgb3B0ID0gb25vcHRpb24odG9rZW5zKVxuICAgICAgaWYgKHJwYy5vcHRpb25zW29wdC5uYW1lXSAhPT0gdW5kZWZpbmVkKSB0aHJvdyBuZXcgRXJyb3IoJ0R1cGxpY2F0ZSBvcHRpb24gJyArIG9wdC5uYW1lKVxuICAgICAgcnBjLm9wdGlvbnNbb3B0Lm5hbWVdID0gb3B0LnZhbHVlXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCB0b2tlbiBpbiBycGMgb3B0aW9uczogJyArIHRva2Vuc1swXSlcbiAgICB9XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoJ05vIGNsb3NpbmcgdGFnIGZvciBycGMnKVxufVxuXG52YXIgcGFyc2UgPSBmdW5jdGlvbiAoYnVmKSB7XG4gIHZhciB0b2tlbnMgPSB0b2tlbml6ZShidWYudG9TdHJpbmcoKSlcbiAgLy8gY2hlY2sgZm9yIGlzb2xhdGVkIHN0cmluZ3MgaW4gdG9rZW5zIGJ5IGxvb2tpbmcgZm9yIG9wZW5pbmcgcXVvdGVcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoL14oXFxcInxcXCcpKFteXFwnXFxcIl0qKSQvLnRlc3QodG9rZW5zW2ldKSkge1xuICAgICAgdmFyIGpcbiAgICAgIGlmICh0b2tlbnNbaV0ubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIGogPSBpICsgMVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaiA9IGlcbiAgICAgIH1cbiAgICAgIC8vIGxvb2sgYWhlYWQgZm9yIHRoZSBjbG9zaW5nIHF1b3RlIGFuZCBjb2xsYXBzZSBhbGxcbiAgICAgIC8vIGluLWJldHdlZW4gdG9rZW5zIGludG8gYSBzaW5nbGUgdG9rZW5cbiAgICAgIGZvciAoajsgaiA8IHRva2Vucy5sZW5ndGg7IGorKykge1xuICAgICAgICBpZiAoL14oW15cXCdcXFwiXSopKFxcXCJ8XFwnKSQvLnRlc3QodG9rZW5zW2pdKSkge1xuICAgICAgICAgIHRva2VucyA9IHRva2Vucy5zbGljZSgwLCBpKS5jb25jYXQodG9rZW5zLnNsaWNlKGksIGogKyAxKS5qb2luKCcnKSkuY29uY2F0KHRva2Vucy5zbGljZShqICsgMSkpXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICB2YXIgc2NoZW1hID0ge1xuICAgIHN5bnRheDogMyxcbiAgICBwYWNrYWdlOiBudWxsLFxuICAgIGltcG9ydHM6IFtdLFxuICAgIGVudW1zOiBbXSxcbiAgICBtZXNzYWdlczogW10sXG4gICAgb3B0aW9uczoge30sXG4gICAgZXh0ZW5kczogW11cbiAgfVxuXG4gIHZhciBmaXJzdGxpbmUgPSB0cnVlXG5cbiAgd2hpbGUgKHRva2Vucy5sZW5ndGgpIHtcbiAgICBzd2l0Y2ggKHRva2Vuc1swXSkge1xuICAgICAgY2FzZSAncGFja2FnZSc6XG4gICAgICAgIHNjaGVtYS5wYWNrYWdlID0gb25wYWNrYWdlbmFtZSh0b2tlbnMpXG4gICAgICAgIGJyZWFrXG5cbiAgICAgIGNhc2UgJ3N5bnRheCc6XG4gICAgICAgIGlmICghZmlyc3RsaW5lKSB0aHJvdyBuZXcgRXJyb3IoJ1Byb3RvYnVmIHN5bnRheCB2ZXJzaW9uIHNob3VsZCBiZSBmaXJzdCB0aGluZyBpbiBmaWxlJylcbiAgICAgICAgc2NoZW1hLnN5bnRheCA9IG9uc3ludGF4dmVyc2lvbih0b2tlbnMpXG4gICAgICAgIGJyZWFrXG5cbiAgICAgIGNhc2UgJ21lc3NhZ2UnOlxuICAgICAgICBzY2hlbWEubWVzc2FnZXMucHVzaChvbm1lc3NhZ2UodG9rZW5zKSlcbiAgICAgICAgYnJlYWtcblxuICAgICAgY2FzZSAnZW51bSc6XG4gICAgICAgIHNjaGVtYS5lbnVtcy5wdXNoKG9uZW51bSh0b2tlbnMpKVxuICAgICAgICBicmVha1xuXG4gICAgICBjYXNlICdvcHRpb24nOlxuICAgICAgICB2YXIgb3B0ID0gb25vcHRpb24odG9rZW5zKVxuICAgICAgICBpZiAoc2NoZW1hLm9wdGlvbnNbb3B0Lm5hbWVdKSB0aHJvdyBuZXcgRXJyb3IoJ0R1cGxpY2F0ZSBvcHRpb24gJyArIG9wdC5uYW1lKVxuICAgICAgICBzY2hlbWEub3B0aW9uc1tvcHQubmFtZV0gPSBvcHQudmFsdWVcbiAgICAgICAgYnJlYWtcblxuICAgICAgY2FzZSAnaW1wb3J0JzpcbiAgICAgICAgc2NoZW1hLmltcG9ydHMucHVzaChvbmltcG9ydCh0b2tlbnMpKVxuICAgICAgICBicmVha1xuXG4gICAgICBjYXNlICdleHRlbmQnOlxuICAgICAgICBzY2hlbWEuZXh0ZW5kcy5wdXNoKG9uZXh0ZW5kKHRva2VucykpXG4gICAgICAgIGJyZWFrXG5cbiAgICAgIGNhc2UgJ3NlcnZpY2UnOlxuICAgICAgICBpZiAoIXNjaGVtYS5zZXJ2aWNlcykgc2NoZW1hLnNlcnZpY2VzID0gW11cbiAgICAgICAgc2NoZW1hLnNlcnZpY2VzLnB1c2gob25zZXJ2aWNlKHRva2VucykpXG4gICAgICAgIGJyZWFrXG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCB0b2tlbjogJyArIHRva2Vuc1swXSlcbiAgICB9XG4gICAgZmlyc3RsaW5lID0gZmFsc2VcbiAgfVxuXG4gIC8vIG5vdyBpdGVyYXRlIG92ZXIgbWVzc2FnZXMgYW5kIHByb3BhZ2F0ZSBleHRlbmRzXG4gIHNjaGVtYS5leHRlbmRzLmZvckVhY2goZnVuY3Rpb24gKGV4dCkge1xuICAgIHNjaGVtYS5tZXNzYWdlcy5mb3JFYWNoKGZ1bmN0aW9uIChtc2cpIHtcbiAgICAgIGlmIChtc2cubmFtZSA9PT0gZXh0Lm5hbWUpIHtcbiAgICAgICAgZXh0Lm1lc3NhZ2UuZmllbGRzLmZvckVhY2goZnVuY3Rpb24gKGZpZWxkKSB7XG4gICAgICAgICAgaWYgKCFtc2cuZXh0ZW5zaW9ucyB8fCBmaWVsZC50YWcgPCBtc2cuZXh0ZW5zaW9ucy5mcm9tIHx8IGZpZWxkLnRhZyA+IG1zZy5leHRlbnNpb25zLnRvKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IobXNnLm5hbWUgKyAnIGRvZXMgbm90IGRlY2xhcmUgJyArIGZpZWxkLnRhZyArICcgYXMgYW4gZXh0ZW5zaW9uIG51bWJlcicpXG4gICAgICAgICAgfVxuICAgICAgICAgIG1zZy5maWVsZHMucHVzaChmaWVsZClcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuICB9KVxuXG4gIHJldHVybiBzY2hlbWFcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBwYXJzZVxuIiwidmFyIG9uZmllbGQgPSBmdW5jdGlvbiAoZiwgcmVzdWx0KSB7XG4gIHZhciBwcmVmaXggPSBmLnJlcGVhdGVkID8gJ3JlcGVhdGVkJyA6IGYucmVxdWlyZWQgPyAncmVxdWlyZWQnIDogJ29wdGlvbmFsJ1xuICBpZiAoZi50eXBlID09PSAnbWFwJykgcHJlZml4ID0gJ21hcDwnICsgZi5tYXAuZnJvbSArICcsJyArIGYubWFwLnRvICsgJz4nXG4gIGlmIChmLm9uZW9mKSBwcmVmaXggPSAnJ1xuXG4gIHZhciBvcHRzID0gT2JqZWN0LmtleXMoZi5vcHRpb25zIHx8IHt9KS5tYXAoZnVuY3Rpb24gKGtleSkge1xuICAgIHJldHVybiBrZXkgKyAnID0gJyArIGYub3B0aW9uc1trZXldXG4gIH0pLmpvaW4oJywnKVxuXG4gIGlmIChvcHRzKSBvcHRzID0gJyBbJyArIG9wdHMgKyAnXSdcblxuICByZXN1bHQucHVzaCgocHJlZml4ID8gcHJlZml4ICsgJyAnIDogJycpICsgKGYubWFwID09PSAnbWFwJyA/ICcnIDogZi50eXBlICsgJyAnKSArIGYubmFtZSArICcgPSAnICsgZi50YWcgKyBvcHRzICsgJzsnKVxuICByZXR1cm4gcmVzdWx0XG59XG5cbnZhciBvbm1lc3NhZ2UgPSBmdW5jdGlvbiAobSwgcmVzdWx0KSB7XG4gIHJlc3VsdC5wdXNoKCdtZXNzYWdlICcgKyBtLm5hbWUgKyAnIHsnKVxuXG4gIGlmICghbS5lbnVtcykgbS5lbnVtcyA9IFtdXG4gIG0uZW51bXMuZm9yRWFjaChmdW5jdGlvbiAoZSkge1xuICAgIHJlc3VsdC5wdXNoKG9uZW51bShlLCBbXSkpXG4gIH0pXG5cbiAgaWYgKCFtLm1lc3NhZ2VzKSBtLm1lc3NhZ2VzID0gW11cbiAgbS5tZXNzYWdlcy5mb3JFYWNoKGZ1bmN0aW9uIChtKSB7XG4gICAgcmVzdWx0LnB1c2gob25tZXNzYWdlKG0sIFtdKSlcbiAgfSlcblxuICB2YXIgb25lb2ZzID0ge31cblxuICBpZiAoIW0uZmllbGRzKSBtLmZpZWxkcyA9IFtdXG4gIG0uZmllbGRzLmZvckVhY2goZnVuY3Rpb24gKGYpIHtcbiAgICBpZiAoZi5vbmVvZikge1xuICAgICAgaWYgKCFvbmVvZnNbZi5vbmVvZl0pIG9uZW9mc1tmLm9uZW9mXSA9IFtdXG4gICAgICBvbmVvZnNbZi5vbmVvZl0ucHVzaChvbmZpZWxkKGYsIFtdKSlcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0LnB1c2gob25maWVsZChmLCBbXSkpXG4gICAgfVxuICB9KVxuXG4gIE9iamVjdC5rZXlzKG9uZW9mcykuZm9yRWFjaChmdW5jdGlvbiAobikge1xuICAgIG9uZW9mc1tuXS51bnNoaWZ0KCdvbmVvZiAnICsgbiArICcgeycpXG4gICAgb25lb2ZzW25dLnB1c2goJ30nKVxuICAgIHJlc3VsdC5wdXNoKG9uZW9mc1tuXSlcbiAgfSlcblxuICByZXN1bHQucHVzaCgnfScsICcnKVxuICByZXR1cm4gcmVzdWx0XG59XG5cbnZhciBvbmVudW0gPSBmdW5jdGlvbiAoZSwgcmVzdWx0KSB7XG4gIHJlc3VsdC5wdXNoKCdlbnVtICcgKyBlLm5hbWUgKyAnIHsnKVxuXG4gIHZhciB2YWxzID0gT2JqZWN0LmtleXMoZS52YWx1ZXMpLm1hcChmdW5jdGlvbiAoa2V5KSB7XG4gICAgcmV0dXJuIGtleSArICcgPSAnICsgZS52YWx1ZXNba2V5XSArICc7J1xuICB9KVxuXG4gIHJlc3VsdC5wdXNoKHZhbHMpXG4gIHJlc3VsdC5wdXNoKCd9JywgJycpXG4gIHJldHVybiByZXN1bHRcbn1cblxudmFyIG9ub3B0aW9uID0gZnVuY3Rpb24gKG8sIHJlc3VsdCkge1xuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG8pXG4gIGtleXMuZm9yRWFjaChmdW5jdGlvbiAob3B0aW9uKSB7XG4gICAgdmFyIHYgPSBvW29wdGlvbl1cblxuICAgIGlmICh+b3B0aW9uLmluZGV4T2YoJy4nKSkgb3B0aW9uID0gJygnICsgb3B0aW9uICsgJyknXG5cbiAgICB2YXIgdHlwZSA9IHR5cGVvZiB2XG5cbiAgICBpZiAodHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHYgPSBvbm9wdGlvbk1hcCh2LCBbXSlcbiAgICAgIGlmICh2Lmxlbmd0aCkgcmVzdWx0LnB1c2goJ29wdGlvbiAnICsgb3B0aW9uICsgJyA9IHsnLCB2LCAnfTsnKVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodHlwZSA9PT0gJ3N0cmluZycgJiYgb3B0aW9uICE9PSAnb3B0aW1pemVfZm9yJykgdiA9ICdcIicgKyB2ICsgJ1wiJ1xuICAgICAgcmVzdWx0LnB1c2goJ29wdGlvbiAnICsgb3B0aW9uICsgJyA9ICcgKyB2ICsgJzsnKVxuICAgIH1cbiAgfSlcbiAgaWYgKGtleXMubGVuZ3RoID4gMCkge1xuICAgIHJlc3VsdC5wdXNoKCcnKVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG52YXIgb25vcHRpb25NYXAgPSBmdW5jdGlvbiAobywgcmVzdWx0KSB7XG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMobylcbiAga2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7XG4gICAgdmFyIHYgPSBvW2tdXG5cbiAgICB2YXIgdHlwZSA9IHR5cGVvZiB2XG5cbiAgICBpZiAodHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHYpKSB7XG4gICAgICAgIHYuZm9yRWFjaChmdW5jdGlvbiAodikge1xuICAgICAgICAgIHYgPSBvbm9wdGlvbk1hcCh2LCBbXSlcbiAgICAgICAgICBpZiAodi5sZW5ndGgpIHJlc3VsdC5wdXNoKGsgKyAnIHsnLCB2LCAnfScpXG4gICAgICAgIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2ID0gb25vcHRpb25NYXAodiwgW10pXG4gICAgICAgIGlmICh2Lmxlbmd0aCkgcmVzdWx0LnB1c2goayArICcgeycsIHYsICd9JylcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHR5cGUgPT09ICdzdHJpbmcnKSB2ID0gJ1wiJyArIHYgKyAnXCInXG4gICAgICByZXN1bHQucHVzaChrICsgJzogJyArIHYpXG4gICAgfVxuICB9KVxuXG4gIHJldHVybiByZXN1bHRcbn1cblxudmFyIG9uc2VydmljZXMgPSBmdW5jdGlvbiAocywgcmVzdWx0KSB7XG4gIHJlc3VsdC5wdXNoKCdzZXJ2aWNlICcgKyBzLm5hbWUgKyAnIHsnKVxuXG4gIGlmICghcy5vcHRpb25zKSBzLm9wdGlvbnMgPSB7fVxuXG4gIG9ub3B0aW9uKHMub3B0aW9ucywgcmVzdWx0KVxuXG4gIGlmICghcy5tZXRob2RzKSBzLm1ldGhvZHMgPSBbXVxuICBzLm1ldGhvZHMuZm9yRWFjaChmdW5jdGlvbiAobSkge1xuICAgIHJlc3VsdC5wdXNoKG9ucnBjKG0sIFtdKSlcbiAgfSlcblxuICByZXN1bHQucHVzaCgnfScsICcnKVxuICByZXR1cm4gcmVzdWx0XG59XG5cbnZhciBvbnJwYyA9IGZ1bmN0aW9uIChycGMsIHJlc3VsdCkge1xuICB2YXIgZGVmID0gJ3JwYyAnICsgcnBjLm5hbWUgKyAnKCdcbiAgaWYgKHJwYy5jbGllbnRfc3RyZWFtaW5nKSBkZWYgKz0gJ3N0cmVhbSAnXG4gIGRlZiArPSBycGMuaW5wdXRfdHlwZSArICcpIHJldHVybnMgKCdcbiAgaWYgKHJwYy5zZXJ2ZXJfc3RyZWFtaW5nKSBkZWYgKz0gJ3N0cmVhbSAnXG4gIGRlZiArPSBycGMub3V0cHV0X3R5cGUgKyAnKSdcblxuICBpZiAoIXJwYy5vcHRpb25zKSBycGMub3B0aW9ucyA9IHt9XG5cbiAgdmFyIG9wdGlvbnMgPSBvbm9wdGlvbihycGMub3B0aW9ucywgW10pXG4gIGlmIChvcHRpb25zLmxlbmd0aCA+IDEpIHtcbiAgICByZXN1bHQucHVzaChkZWYgKyAnIHsnLCBvcHRpb25zLnNsaWNlKDAsIC0xKSwgJ30nKVxuICB9IGVsc2Uge1xuICAgIHJlc3VsdC5wdXNoKGRlZiArICc7JylcbiAgfVxuXG4gIHJldHVybiByZXN1bHRcbn1cblxudmFyIGluZGVudCA9IGZ1bmN0aW9uIChsdmwpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChsaW5lKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkobGluZSkpIHJldHVybiBsaW5lLm1hcChpbmRlbnQobHZsICsgJyAgJykpLmpvaW4oJ1xcbicpXG4gICAgcmV0dXJuIGx2bCArIGxpbmVcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChzY2hlbWEpIHtcbiAgdmFyIHJlc3VsdCA9IFtdXG5cbiAgcmVzdWx0LnB1c2goJ3N5bnRheCA9IFwicHJvdG8nICsgc2NoZW1hLnN5bnRheCArICdcIjsnLCAnJylcblxuICBpZiAoc2NoZW1hLnBhY2thZ2UpIHJlc3VsdC5wdXNoKCdwYWNrYWdlICcgKyBzY2hlbWEucGFja2FnZSArICc7JywgJycpXG5cbiAgaWYgKCFzY2hlbWEub3B0aW9ucykgc2NoZW1hLm9wdGlvbnMgPSB7fVxuXG4gIG9ub3B0aW9uKHNjaGVtYS5vcHRpb25zLCByZXN1bHQpXG5cbiAgaWYgKCFzY2hlbWEuZW51bXMpIHNjaGVtYS5lbnVtcyA9IFtdXG4gIHNjaGVtYS5lbnVtcy5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7XG4gICAgb25lbnVtKGUsIHJlc3VsdClcbiAgfSlcblxuICBpZiAoIXNjaGVtYS5tZXNzYWdlcykgc2NoZW1hLm1lc3NhZ2VzID0gW11cbiAgc2NoZW1hLm1lc3NhZ2VzLmZvckVhY2goZnVuY3Rpb24gKG0pIHtcbiAgICBvbm1lc3NhZ2UobSwgcmVzdWx0KVxuICB9KVxuXG4gIGlmIChzY2hlbWEuc2VydmljZXMpIHtcbiAgICBzY2hlbWEuc2VydmljZXMuZm9yRWFjaChmdW5jdGlvbiAocykge1xuICAgICAgb25zZXJ2aWNlcyhzLCByZXN1bHQpXG4gICAgfSlcbiAgfVxuXG4gIHJldHVybiByZXN1bHQubWFwKGluZGVudCgnJykpLmpvaW4oJ1xcbicpXG59XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChzY2gpIHtcbiAgdmFyIG5vQ29tbWVudHMgPSBmdW5jdGlvbiAobGluZSkge1xuICAgIHZhciBpID0gbGluZS5pbmRleE9mKCcvLycpXG4gICAgcmV0dXJuIGkgPiAtMSA/IGxpbmUuc2xpY2UoMCwgaSkgOiBsaW5lXG4gIH1cblxuICB2YXIgbm9NdWx0aWxpbmVDb21tZW50cyA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgaW5zaWRlID0gZmFsc2VcbiAgICByZXR1cm4gZnVuY3Rpb24gKHRva2VuKSB7XG4gICAgICBpZiAodG9rZW4gPT09ICcvKicpIHtcbiAgICAgICAgaW5zaWRlID0gdHJ1ZVxuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICAgIGlmICh0b2tlbiA9PT0gJyovJykge1xuICAgICAgICBpbnNpZGUgPSBmYWxzZVxuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICAgIHJldHVybiAhaW5zaWRlXG4gICAgfVxuICB9XG5cbiAgdmFyIHRyaW0gPSBmdW5jdGlvbiAobGluZSkge1xuICAgIHJldHVybiBsaW5lLnRyaW0oKVxuICB9XG5cbiAgcmV0dXJuIHNjaFxuICAgIC5yZXBsYWNlKC8oWzsse31cXChcXCk9XFw6XFxbXFxdPD5dfFxcL1xcKnxcXCpcXC8pL2csICcgJDEgJylcbiAgICAuc3BsaXQoL1xcbi8pXG4gICAgLm1hcCh0cmltKVxuICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAubWFwKG5vQ29tbWVudHMpXG4gICAgLm1hcCh0cmltKVxuICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAuam9pbignXFxuJylcbiAgICAuc3BsaXQoL1xccyt8XFxuKy9nbSlcbiAgICAuZmlsdGVyKG5vTXVsdGlsaW5lQ29tbWVudHMoKSlcbn1cbiIsIi8qIGVzbGludC1kaXNhYmxlIG5vLXNwYWNlZC1mdW5jICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby11bmV4cGVjdGVkLW11bHRpbGluZSAqL1xudmFyIGVuY29kaW5ncyA9IHJlcXVpcmUoJy4vZW5jb2RpbmdzJylcbnZhciB2YXJpbnQgPSByZXF1aXJlKCd2YXJpbnQnKVxudmFyIGdlbm9iaiA9IHJlcXVpcmUoJ2dlbmVyYXRlLW9iamVjdC1wcm9wZXJ0eScpXG52YXIgZ2VuZnVuID0gcmVxdWlyZSgnZ2VuZXJhdGUtZnVuY3Rpb24nKVxuXG52YXIgc2tpcCA9IGZ1bmN0aW9uICh0eXBlLCBidWZmZXIsIG9mZnNldCkge1xuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIDA6XG4gICAgICB2YXJpbnQuZGVjb2RlKGJ1ZmZlciwgb2Zmc2V0KVxuICAgICAgcmV0dXJuIG9mZnNldCArIHZhcmludC5kZWNvZGUuYnl0ZXNcblxuICAgIGNhc2UgMTpcbiAgICAgIHJldHVybiBvZmZzZXQgKyA4XG5cbiAgICBjYXNlIDI6XG4gICAgICB2YXIgbGVuID0gdmFyaW50LmRlY29kZShidWZmZXIsIG9mZnNldClcbiAgICAgIHJldHVybiBvZmZzZXQgKyB2YXJpbnQuZGVjb2RlLmJ5dGVzICsgbGVuXG5cbiAgICBjYXNlIDM6XG4gICAgY2FzZSA0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdHcm91cHMgYXJlIG5vdCBzdXBwb3J0ZWQnKVxuXG4gICAgY2FzZSA1OlxuICAgICAgcmV0dXJuIG9mZnNldCArIDRcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcignVW5rbm93biB3aXJlIHR5cGU6ICcgKyB0eXBlKVxufVxuXG52YXIgZGVmaW5lZCA9IGZ1bmN0aW9uICh2YWwpIHtcbiAgcmV0dXJuIHZhbCAhPT0gbnVsbCAmJiB2YWwgIT09IHVuZGVmaW5lZCAmJiAodHlwZW9mIHZhbCAhPT0gJ251bWJlcicgfHwgIWlzTmFOKHZhbCkpXG59XG5cbnZhciBpc1N0cmluZyA9IGZ1bmN0aW9uIChkZWYpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gISFkZWYgJiYgdHlwZW9mIEpTT04ucGFyc2UoZGVmKSA9PT0gJ3N0cmluZydcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxudmFyIGRlZmF1bHRWYWx1ZSA9IGZ1bmN0aW9uIChmLCBkZWYpIHtcbiAgaWYgKGYubWFwKSByZXR1cm4gJ3t9J1xuICBpZiAoZi5yZXBlYXRlZCkgcmV0dXJuICdbXSdcblxuICBzd2l0Y2ggKGYudHlwZSkge1xuICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICByZXR1cm4gaXNTdHJpbmcoZGVmKSA/IGRlZiA6ICdcIlwiJ1xuXG4gICAgY2FzZSAnYm9vbCc6XG4gICAgICBpZiAoZGVmID09PSAndHJ1ZScpIHJldHVybiAndHJ1ZSdcbiAgICAgIHJldHVybiAnZmFsc2UnXG5cbiAgICBjYXNlICdmbG9hdCc6XG4gICAgY2FzZSAnZG91YmxlJzpcbiAgICBjYXNlICdzZml4ZWQzMic6XG4gICAgY2FzZSAnZml4ZWQzMic6XG4gICAgY2FzZSAndmFyaW50JzpcbiAgICBjYXNlICdlbnVtJzpcbiAgICBjYXNlICd1aW50NjQnOlxuICAgIGNhc2UgJ3VpbnQzMic6XG4gICAgY2FzZSAnaW50NjQnOlxuICAgIGNhc2UgJ2ludDMyJzpcbiAgICBjYXNlICdzaW50NjQnOlxuICAgIGNhc2UgJ3NpbnQzMic6XG4gICAgICByZXR1cm4gJycgKyBOdW1iZXIoZGVmIHx8IDApXG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuICdudWxsJ1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHNjaGVtYSwgZXh0cmFFbmNvZGluZ3MpIHtcbiAgdmFyIG1lc3NhZ2VzID0ge31cbiAgdmFyIGVudW1zID0ge31cbiAgdmFyIGNhY2hlID0ge31cblxuICB2YXIgdmlzaXQgPSBmdW5jdGlvbiAoc2NoZW1hLCBwcmVmaXgpIHtcbiAgICBpZiAoc2NoZW1hLmVudW1zKSB7XG4gICAgICBzY2hlbWEuZW51bXMuZm9yRWFjaChmdW5jdGlvbiAoZSkge1xuICAgICAgICBlLmlkID0gcHJlZml4ICsgKHByZWZpeCA/ICcuJyA6ICcnKSArIGUubmFtZVxuICAgICAgICBlbnVtc1tlLmlkXSA9IGVcbiAgICAgICAgdmlzaXQoZSwgZS5pZClcbiAgICAgIH0pXG4gICAgfVxuICAgIGlmIChzY2hlbWEubWVzc2FnZXMpIHtcbiAgICAgIHNjaGVtYS5tZXNzYWdlcy5mb3JFYWNoKGZ1bmN0aW9uIChtKSB7XG4gICAgICAgIG0uaWQgPSBwcmVmaXggKyAocHJlZml4ID8gJy4nIDogJycpICsgbS5uYW1lXG4gICAgICAgIG1lc3NhZ2VzW20uaWRdID0gbVxuICAgICAgICBtLmZpZWxkcy5mb3JFYWNoKGZ1bmN0aW9uIChmKSB7XG4gICAgICAgICAgaWYgKCFmLm1hcCkgcmV0dXJuXG5cbiAgICAgICAgICB2YXIgbmFtZSA9ICdNYXBfJyArIGYubWFwLmZyb20gKyAnXycgKyBmLm1hcC50b1xuICAgICAgICAgIHZhciBtYXAgPSB7XG4gICAgICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgICAgICAgZW51bXM6IFtdLFxuICAgICAgICAgICAgbWVzc2FnZXM6IFtdLFxuICAgICAgICAgICAgZmllbGRzOiBbe1xuICAgICAgICAgICAgICBuYW1lOiAna2V5JyxcbiAgICAgICAgICAgICAgdHlwZTogZi5tYXAuZnJvbSxcbiAgICAgICAgICAgICAgdGFnOiAxLFxuICAgICAgICAgICAgICByZXBlYXRlZDogZmFsc2UsXG4gICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgIG5hbWU6ICd2YWx1ZScsXG4gICAgICAgICAgICAgIHR5cGU6IGYubWFwLnRvLFxuICAgICAgICAgICAgICB0YWc6IDIsXG4gICAgICAgICAgICAgIHJlcGVhdGVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlXG4gICAgICAgICAgICB9XSxcbiAgICAgICAgICAgIGV4dGVuc2lvbnM6IG51bGwsXG4gICAgICAgICAgICBpZDogcHJlZml4ICsgKHByZWZpeCA/ICcuJyA6ICcnKSArIG5hbWVcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoIW1lc3NhZ2VzW21hcC5pZF0pIHtcbiAgICAgICAgICAgIG1lc3NhZ2VzW21hcC5pZF0gPSBtYXBcbiAgICAgICAgICAgIHNjaGVtYS5tZXNzYWdlcy5wdXNoKG1hcClcbiAgICAgICAgICB9XG4gICAgICAgICAgZi50eXBlID0gbmFtZVxuICAgICAgICAgIGYucmVwZWF0ZWQgPSB0cnVlXG4gICAgICAgIH0pXG4gICAgICAgIHZpc2l0KG0sIG0uaWQpXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIHZpc2l0KHNjaGVtYSwgJycpXG5cbiAgdmFyIGNvbXBpbGVFbnVtID0gZnVuY3Rpb24gKGUpIHtcbiAgICB2YXIgY29uZGl0aW9ucyA9IE9iamVjdC5rZXlzKGUudmFsdWVzKVxuICAgICAgLm1hcChmdW5jdGlvbiAoaykge1xuICAgICAgICByZXR1cm4gJ3ZhbCAhPT0gJyArIHBhcnNlSW50KGUudmFsdWVzW2tdLCAxMClcbiAgICAgIH0pXG4gICAgICAuam9pbignICYmICcpXG5cbiAgICBpZiAoIWNvbmRpdGlvbnMpIGNvbmRpdGlvbnMgPSAndHJ1ZSdcblxuICAgIHZhciBlbmNvZGUgPSBnZW5mdW4oKVxuICAgICAgKCdmdW5jdGlvbiBlbmNvZGUgKHZhbCwgYnVmLCBvZmZzZXQpIHsnKVxuICAgICAgICAoJ2lmICglcykgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBlbnVtIHZhbHVlOiBcIit2YWwpJywgY29uZGl0aW9ucylcbiAgICAgICAgKCd2YXJpbnQuZW5jb2RlKHZhbCwgYnVmLCBvZmZzZXQpJylcbiAgICAgICAgKCdlbmNvZGUuYnl0ZXMgPSB2YXJpbnQuZW5jb2RlLmJ5dGVzJylcbiAgICAgICAgKCdyZXR1cm4gYnVmJylcbiAgICAgICgnfScpXG4gICAgICAudG9GdW5jdGlvbih7XG4gICAgICAgIHZhcmludDogdmFyaW50XG4gICAgICB9KVxuXG4gICAgdmFyIGRlY29kZSA9IGdlbmZ1bigpXG4gICAgICAoJ2Z1bmN0aW9uIGRlY29kZSAoYnVmLCBvZmZzZXQpIHsnKVxuICAgICAgICAoJ3ZhciB2YWwgPSB2YXJpbnQuZGVjb2RlKGJ1Ziwgb2Zmc2V0KScpXG4gICAgICAgICgnaWYgKCVzKSB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGVudW0gdmFsdWU6IFwiK3ZhbCknLCBjb25kaXRpb25zKVxuICAgICAgICAoJ2RlY29kZS5ieXRlcyA9IHZhcmludC5kZWNvZGUuYnl0ZXMnKVxuICAgICAgICAoJ3JldHVybiB2YWwnKVxuICAgICAgKCd9JylcbiAgICAgIC50b0Z1bmN0aW9uKHtcbiAgICAgICAgdmFyaW50OiB2YXJpbnRcbiAgICAgIH0pXG5cbiAgICByZXR1cm4gZW5jb2RpbmdzLm1ha2UoMCwgZW5jb2RlLCBkZWNvZGUsIHZhcmludC5lbmNvZGluZ0xlbmd0aClcbiAgfVxuXG4gIHZhciBjb21waWxlTWVzc2FnZSA9IGZ1bmN0aW9uIChtLCBleHBvcnRzKSB7XG4gICAgbS5tZXNzYWdlcy5mb3JFYWNoKGZ1bmN0aW9uIChuZXN0ZWQpIHtcbiAgICAgIGV4cG9ydHNbbmVzdGVkLm5hbWVdID0gcmVzb2x2ZShuZXN0ZWQubmFtZSwgbS5pZClcbiAgICB9KVxuXG4gICAgbS5lbnVtcy5mb3JFYWNoKGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgIGV4cG9ydHNbdmFsLm5hbWVdID0gdmFsLnZhbHVlc1xuICAgIH0pXG5cbiAgICBleHBvcnRzLnR5cGUgPSAyXG4gICAgZXhwb3J0cy5tZXNzYWdlID0gdHJ1ZVxuICAgIGV4cG9ydHMubmFtZSA9IG0ubmFtZVxuXG4gICAgdmFyIG9uZW9mcyA9IHt9XG5cbiAgICBtLmZpZWxkcy5mb3JFYWNoKGZ1bmN0aW9uIChmKSB7XG4gICAgICBpZiAoIWYub25lb2YpIHJldHVyblxuICAgICAgaWYgKCFvbmVvZnNbZi5vbmVvZl0pIG9uZW9mc1tmLm9uZW9mXSA9IFtdXG4gICAgICBvbmVvZnNbZi5vbmVvZl0ucHVzaChmLm5hbWUpXG4gICAgfSlcblxuICAgIHZhciBlbmMgPSBtLmZpZWxkcy5tYXAoZnVuY3Rpb24gKGYpIHtcbiAgICAgIHJldHVybiByZXNvbHZlKGYudHlwZSwgbS5pZClcbiAgICB9KVxuXG4gICAgdmFyIGZvckVhY2ggPSBmdW5jdGlvbiAoZm4pIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZW5jLmxlbmd0aDsgaSsrKSBmbihlbmNbaV0sIG0uZmllbGRzW2ldLCBnZW5vYmooJ29iaicsIG0uZmllbGRzW2ldLm5hbWUpLCBpKVxuICAgIH1cblxuICAgIC8vIGNvbXBpbGUgZW5jb2RpbmdMZW5ndGhcblxuICAgIHZhciBlbmNvZGluZ0xlbmd0aCA9IGdlbmZ1bigpXG4gICAgICAoJ2Z1bmN0aW9uIGVuY29kaW5nTGVuZ3RoIChvYmopIHsnKVxuICAgICAgICAoJ3ZhciBsZW5ndGggPSAwJylcblxuICAgIE9iamVjdC5rZXlzKG9uZW9mcykuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICAgICAgdmFyIG1zZyA9IEpTT04uc3RyaW5naWZ5KCdvbmx5IG9uZSBvZiB0aGUgcHJvcGVydGllcyBkZWZpbmVkIGluIG9uZW9mICcgKyBuYW1lICsgJyBjYW4gYmUgc2V0JylcbiAgICAgIHZhciBjbnQgPSBvbmVvZnNbbmFtZV1cbiAgICAgICAgLm1hcChmdW5jdGlvbiAocHJvcCkge1xuICAgICAgICAgIHJldHVybiAnK2RlZmluZWQoJyArIGdlbm9iaignb2JqJywgcHJvcCkgKyAnKSdcbiAgICAgICAgfSlcbiAgICAgICAgLmpvaW4oJyArICcpXG5cbiAgICAgIGVuY29kaW5nTGVuZ3RoKCdpZiAoKCVzKSA+IDEpIHRocm93IG5ldyBFcnJvciglcyknLCBjbnQsIG1zZylcbiAgICB9KVxuXG4gICAgZm9yRWFjaChmdW5jdGlvbiAoZSwgZiwgdmFsLCBpKSB7XG4gICAgICB2YXIgcGFja2VkID0gZi5yZXBlYXRlZCAmJiBmLm9wdGlvbnMgJiYgZi5vcHRpb25zLnBhY2tlZFxuICAgICAgdmFyIGhsID0gdmFyaW50LmVuY29kaW5nTGVuZ3RoKGYudGFnIDw8IDMgfCBlLnR5cGUpXG5cbiAgICAgIGlmIChmLnJlcXVpcmVkKSBlbmNvZGluZ0xlbmd0aCgnaWYgKCFkZWZpbmVkKCVzKSkgdGhyb3cgbmV3IEVycm9yKCVzKScsIHZhbCwgSlNPTi5zdHJpbmdpZnkoZi5uYW1lICsgJyBpcyByZXF1aXJlZCcpKVxuICAgICAgZWxzZSBlbmNvZGluZ0xlbmd0aCgnaWYgKGRlZmluZWQoJXMpKSB7JywgdmFsKVxuXG4gICAgICBpZiAoZi5tYXApIHtcbiAgICAgICAgZW5jb2RpbmdMZW5ndGgoKVxuICAgICAgICAgICgndmFyIHRtcCA9IE9iamVjdC5rZXlzKCVzKScsIHZhbClcbiAgICAgICAgICAoJ2ZvciAodmFyIGkgPSAwOyBpIDwgdG1wLmxlbmd0aDsgaSsrKSB7JylcbiAgICAgICAgICAgICgndG1wW2ldID0ge2tleTogdG1wW2ldLCB2YWx1ZTogJXNbdG1wW2ldXX0nLCB2YWwpXG4gICAgICAgICAgKCd9JylcbiAgICAgICAgdmFsID0gJ3RtcCdcbiAgICAgIH1cblxuICAgICAgaWYgKHBhY2tlZCkge1xuICAgICAgICBlbmNvZGluZ0xlbmd0aCgpXG4gICAgICAgICAgKCd2YXIgcGFja2VkTGVuID0gMCcpXG4gICAgICAgICAgKCdmb3IgKHZhciBpID0gMDsgaSA8ICVzLmxlbmd0aDsgaSsrKSB7JywgdmFsKVxuICAgICAgICAgICAgKCdpZiAoIWRlZmluZWQoJXMpKSBjb250aW51ZScsIHZhbCArICdbaV0nKVxuICAgICAgICAgICAgKCd2YXIgbGVuID0gZW5jWyVkXS5lbmNvZGluZ0xlbmd0aCglcyknLCBpLCB2YWwgKyAnW2ldJylcbiAgICAgICAgICAgICgncGFja2VkTGVuICs9IGxlbicpXG5cbiAgICAgICAgaWYgKGUubWVzc2FnZSkgZW5jb2RpbmdMZW5ndGgoJ3BhY2tlZExlbiArPSB2YXJpbnQuZW5jb2RpbmdMZW5ndGgobGVuKScpXG5cbiAgICAgICAgZW5jb2RpbmdMZW5ndGgoJ30nKVxuICAgICAgICAgICgnaWYgKHBhY2tlZExlbikgeycpXG4gICAgICAgICAgICAoJ2xlbmd0aCArPSAlZCArIHBhY2tlZExlbiArIHZhcmludC5lbmNvZGluZ0xlbmd0aChwYWNrZWRMZW4pJywgaGwpXG4gICAgICAgICAgKCd9JylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChmLnJlcGVhdGVkKSB7XG4gICAgICAgICAgZW5jb2RpbmdMZW5ndGgoJ2ZvciAodmFyIGkgPSAwOyBpIDwgJXMubGVuZ3RoOyBpKyspIHsnLCB2YWwpXG4gICAgICAgICAgdmFsICs9ICdbaV0nXG4gICAgICAgICAgZW5jb2RpbmdMZW5ndGgoJ2lmICghZGVmaW5lZCglcykpIGNvbnRpbnVlJywgdmFsKVxuICAgICAgICB9XG5cbiAgICAgICAgZW5jb2RpbmdMZW5ndGgoJ3ZhciBsZW4gPSBlbmNbJWRdLmVuY29kaW5nTGVuZ3RoKCVzKScsIGksIHZhbClcbiAgICAgICAgaWYgKGUubWVzc2FnZSkgZW5jb2RpbmdMZW5ndGgoJ2xlbmd0aCArPSB2YXJpbnQuZW5jb2RpbmdMZW5ndGgobGVuKScpXG4gICAgICAgIGVuY29kaW5nTGVuZ3RoKCdsZW5ndGggKz0gJWQgKyBsZW4nLCBobClcbiAgICAgICAgaWYgKGYucmVwZWF0ZWQpIGVuY29kaW5nTGVuZ3RoKCd9JylcbiAgICAgIH1cblxuICAgICAgaWYgKCFmLnJlcXVpcmVkKSBlbmNvZGluZ0xlbmd0aCgnfScpXG4gICAgfSlcblxuICAgIGVuY29kaW5nTGVuZ3RoKClcbiAgICAgICAgKCdyZXR1cm4gbGVuZ3RoJylcbiAgICAgICgnfScpXG5cbiAgICBlbmNvZGluZ0xlbmd0aCA9IGVuY29kaW5nTGVuZ3RoLnRvRnVuY3Rpb24oe1xuICAgICAgZGVmaW5lZDogZGVmaW5lZCxcbiAgICAgIHZhcmludDogdmFyaW50LFxuICAgICAgZW5jOiBlbmNcbiAgICB9KVxuXG4gICAgLy8gY29tcGlsZSBlbmNvZGVcblxuICAgIHZhciBlbmNvZGUgPSBnZW5mdW4oKVxuICAgICAgKCdmdW5jdGlvbiBlbmNvZGUgKG9iaiwgYnVmLCBvZmZzZXQpIHsnKVxuICAgICAgICAoJ2lmICghb2Zmc2V0KSBvZmZzZXQgPSAwJylcbiAgICAgICAgKCdpZiAoIWJ1ZikgYnVmID0gbmV3IEJ1ZmZlcihlbmNvZGluZ0xlbmd0aChvYmopKScpXG4gICAgICAgICgndmFyIG9sZE9mZnNldCA9IG9mZnNldCcpXG5cbiAgICBPYmplY3Qua2V5cyhvbmVvZnMpLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgIHZhciBtc2cgPSBKU09OLnN0cmluZ2lmeSgnb25seSBvbmUgb2YgdGhlIHByb3BlcnRpZXMgZGVmaW5lZCBpbiBvbmVvZiAnICsgbmFtZSArICcgY2FuIGJlIHNldCcpXG4gICAgICB2YXIgY250ID0gb25lb2ZzW25hbWVdXG4gICAgICAgIC5tYXAoZnVuY3Rpb24gKHByb3ApIHtcbiAgICAgICAgICByZXR1cm4gJytkZWZpbmVkKCcgKyBnZW5vYmooJ29iaicsIHByb3ApICsgJyknXG4gICAgICAgIH0pXG4gICAgICAgIC5qb2luKCcgKyAnKVxuXG4gICAgICBlbmNvZGUoJ2lmICgoJXMpID4gMSkgdGhyb3cgbmV3IEVycm9yKCVzKScsIGNudCwgbXNnKVxuICAgIH0pXG5cbiAgICBmb3JFYWNoKGZ1bmN0aW9uIChlLCBmLCB2YWwsIGkpIHtcbiAgICAgIGlmIChmLnJlcXVpcmVkKSBlbmNvZGUoJ2lmICghZGVmaW5lZCglcykpIHRocm93IG5ldyBFcnJvciglcyknLCB2YWwsIEpTT04uc3RyaW5naWZ5KGYubmFtZSArICcgaXMgcmVxdWlyZWQnKSlcbiAgICAgIGVsc2UgZW5jb2RlKCdpZiAoZGVmaW5lZCglcykpIHsnLCB2YWwpXG5cbiAgICAgIHZhciBwYWNrZWQgPSBmLnJlcGVhdGVkICYmIGYub3B0aW9ucyAmJiBmLm9wdGlvbnMucGFja2VkXG4gICAgICB2YXIgcCA9IHZhcmludC5lbmNvZGUoZi50YWcgPDwgMyB8IDIpXG4gICAgICB2YXIgaCA9IHZhcmludC5lbmNvZGUoZi50YWcgPDwgMyB8IGUudHlwZSlcbiAgICAgIHZhciBqXG5cbiAgICAgIGlmIChmLm1hcCkge1xuICAgICAgICBlbmNvZGUoKVxuICAgICAgICAgICgndmFyIHRtcCA9IE9iamVjdC5rZXlzKCVzKScsIHZhbClcbiAgICAgICAgICAoJ2ZvciAodmFyIGkgPSAwOyBpIDwgdG1wLmxlbmd0aDsgaSsrKSB7JylcbiAgICAgICAgICAgICgndG1wW2ldID0ge2tleTogdG1wW2ldLCB2YWx1ZTogJXNbdG1wW2ldXX0nLCB2YWwpXG4gICAgICAgICAgKCd9JylcbiAgICAgICAgdmFsID0gJ3RtcCdcbiAgICAgIH1cblxuICAgICAgaWYgKHBhY2tlZCkge1xuICAgICAgICBlbmNvZGUoKVxuICAgICAgICAgICgndmFyIHBhY2tlZExlbiA9IDAnKVxuICAgICAgICAgICgnZm9yICh2YXIgaSA9IDA7IGkgPCAlcy5sZW5ndGg7IGkrKykgeycsIHZhbClcbiAgICAgICAgICAgICgnaWYgKCFkZWZpbmVkKCVzKSkgY29udGludWUnLCB2YWwgKyAnW2ldJylcbiAgICAgICAgICAgICgncGFja2VkTGVuICs9IGVuY1slZF0uZW5jb2RpbmdMZW5ndGgoJXMpJywgaSwgdmFsICsgJ1tpXScpXG4gICAgICAgICAgKCd9JylcblxuICAgICAgICBlbmNvZGUoJ2lmIChwYWNrZWRMZW4pIHsnKVxuICAgICAgICBmb3IgKGogPSAwOyBqIDwgaC5sZW5ndGg7IGorKykgZW5jb2RlKCdidWZbb2Zmc2V0KytdID0gJWQnLCBwW2pdKVxuICAgICAgICBlbmNvZGUoJ3ZhcmludC5lbmNvZGUocGFja2VkTGVuLCBidWYsIG9mZnNldCknKVxuICAgICAgICBlbmNvZGUoJ29mZnNldCArPSB2YXJpbnQuZW5jb2RlLmJ5dGVzJylcbiAgICAgICAgZW5jb2RlKCd9JylcbiAgICAgIH1cblxuICAgICAgaWYgKGYucmVwZWF0ZWQpIHtcbiAgICAgICAgZW5jb2RlKCdmb3IgKHZhciBpID0gMDsgaSA8ICVzLmxlbmd0aDsgaSsrKSB7JywgdmFsKVxuICAgICAgICB2YWwgKz0gJ1tpXSdcbiAgICAgICAgZW5jb2RlKCdpZiAoIWRlZmluZWQoJXMpKSBjb250aW51ZScsIHZhbClcbiAgICAgIH1cblxuICAgICAgaWYgKCFwYWNrZWQpIGZvciAoaiA9IDA7IGogPCBoLmxlbmd0aDsgaisrKSBlbmNvZGUoJ2J1ZltvZmZzZXQrK10gPSAlZCcsIGhbal0pXG5cbiAgICAgIGlmIChlLm1lc3NhZ2UpIHtcbiAgICAgICAgZW5jb2RlKCd2YXJpbnQuZW5jb2RlKGVuY1slZF0uZW5jb2RpbmdMZW5ndGgoJXMpLCBidWYsIG9mZnNldCknLCBpLCB2YWwpXG4gICAgICAgIGVuY29kZSgnb2Zmc2V0ICs9IHZhcmludC5lbmNvZGUuYnl0ZXMnKVxuICAgICAgfVxuXG4gICAgICBlbmNvZGUoJ2VuY1slZF0uZW5jb2RlKCVzLCBidWYsIG9mZnNldCknLCBpLCB2YWwpXG4gICAgICBlbmNvZGUoJ29mZnNldCArPSBlbmNbJWRdLmVuY29kZS5ieXRlcycsIGkpXG5cbiAgICAgIGlmIChmLnJlcGVhdGVkKSBlbmNvZGUoJ30nKVxuICAgICAgaWYgKCFmLnJlcXVpcmVkKSBlbmNvZGUoJ30nKVxuICAgIH0pXG5cbiAgICBlbmNvZGUoKVxuICAgICAgICAoJ2VuY29kZS5ieXRlcyA9IG9mZnNldCAtIG9sZE9mZnNldCcpXG4gICAgICAgICgncmV0dXJuIGJ1ZicpXG4gICAgICAoJ30nKVxuXG4gICAgZW5jb2RlID0gZW5jb2RlLnRvRnVuY3Rpb24oe1xuICAgICAgZW5jb2RpbmdMZW5ndGg6IGVuY29kaW5nTGVuZ3RoLFxuICAgICAgZGVmaW5lZDogZGVmaW5lZCxcbiAgICAgIHZhcmludDogdmFyaW50LFxuICAgICAgZW5jOiBlbmMsXG4gICAgICBCdWZmZXI6IEJ1ZmZlclxuICAgIH0pXG5cbiAgICAvLyBjb21waWxlIGRlY29kZVxuXG4gICAgdmFyIGludmFsaWQgPSBtLmZpZWxkc1xuICAgICAgLm1hcChmdW5jdGlvbiAoZiwgaSkge1xuICAgICAgICByZXR1cm4gZi5yZXF1aXJlZCAmJiAnIWZvdW5kJyArIGlcbiAgICAgIH0pXG4gICAgICAuZmlsdGVyKGZ1bmN0aW9uIChmKSB7XG4gICAgICAgIHJldHVybiBmXG4gICAgICB9KVxuICAgICAgLmpvaW4oJyB8fCAnKVxuXG4gICAgdmFyIGRlY29kZSA9IGdlbmZ1bigpXG5cbiAgICB2YXIgb2JqZWN0S2V5cyA9IFtdXG4gICAgZm9yRWFjaChmdW5jdGlvbiAoZSwgZikge1xuICAgICAgdmFyIGRlZiA9IGYub3B0aW9ucyAmJiBmLm9wdGlvbnMuZGVmYXVsdFxuICAgICAgdmFyIHJlc29sdmVkID0gcmVzb2x2ZShmLnR5cGUsIG0uaWQsIGZhbHNlKVxuICAgICAgdmFyIHZhbHMgPSByZXNvbHZlZCAmJiByZXNvbHZlZC52YWx1ZXNcblxuICAgICAgaWYgKHZhbHMpIHsgLy8gaXMgZW51bVxuICAgICAgICBpZiAoZi5yZXBlYXRlZCkge1xuICAgICAgICAgIG9iamVjdEtleXMucHVzaChnZW5vYmoucHJvcGVydHkoZi5uYW1lKSArICc6IFtdJylcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkZWYgPSAoZGVmICYmIGRlZiBpbiB2YWxzKSA/IHZhbHNbZGVmXSA6IHZhbHNbT2JqZWN0LmtleXModmFscylbMF1dXG4gICAgICAgICAgb2JqZWN0S2V5cy5wdXNoKGdlbm9iai5wcm9wZXJ0eShmLm5hbWUpICsgJzogJyArIHBhcnNlSW50KGRlZiB8fCAwLCAxMCkpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGlmICghZi5vbmVvZikge1xuICAgICAgICBvYmplY3RLZXlzLnB1c2goZ2Vub2JqLnByb3BlcnR5KGYubmFtZSkgKyAnOiAnICsgZGVmYXVsdFZhbHVlKGYsIGRlZikpXG4gICAgICB9XG4gICAgfSlcblxuICAgIGRlY29kZSgpXG4gICAgICAoJ2Z1bmN0aW9uIGRlY29kZSAoYnVmLCBvZmZzZXQsIGVuZCkgeycpXG4gICAgICAgICgnaWYgKCFvZmZzZXQpIG9mZnNldCA9IDAnKVxuICAgICAgICAoJ2lmICghZW5kKSBlbmQgPSBidWYubGVuZ3RoJylcbiAgICAgICAgKCdpZiAoIShlbmQgPD0gYnVmLmxlbmd0aCAmJiBvZmZzZXQgPD0gYnVmLmxlbmd0aCkpIHRocm93IG5ldyBFcnJvcihcIkRlY29kZWQgbWVzc2FnZSBpcyBub3QgdmFsaWRcIiknKVxuICAgICAgICAoJ3ZhciBvbGRPZmZzZXQgPSBvZmZzZXQnKVxuICAgICAgICAoJ3ZhciBvYmogPSB7JylcblxuICAgIG9iamVjdEtleXMuZm9yRWFjaChmdW5jdGlvbiAocHJvcCwgaSkge1xuICAgICAgZGVjb2RlKHByb3AgKyAoaSA9PT0gb2JqZWN0S2V5cy5sZW5ndGggLSAxID8gJycgOiAnLCcpKVxuICAgIH0pXG5cbiAgICBkZWNvZGUoJ30nKVxuXG4gICAgZm9yRWFjaChmdW5jdGlvbiAoZSwgZiwgdmFsLCBpKSB7XG4gICAgICBpZiAoZi5yZXF1aXJlZCkgZGVjb2RlKCd2YXIgZm91bmQlZCA9IGZhbHNlJywgaSlcbiAgICB9KVxuXG4gICAgZGVjb2RlKCd3aGlsZSAodHJ1ZSkgeycpXG4gICAgICAoJ2lmIChlbmQgPD0gb2Zmc2V0KSB7JylcbiAgICAgICAgKGludmFsaWQgJiYgJ2lmICglcykgdGhyb3cgbmV3IEVycm9yKFwiRGVjb2RlZCBtZXNzYWdlIGlzIG5vdCB2YWxpZFwiKScsIGludmFsaWQpXG4gICAgICAgICgnZGVjb2RlLmJ5dGVzID0gb2Zmc2V0IC0gb2xkT2Zmc2V0JylcbiAgICAgICAgKCdyZXR1cm4gb2JqJylcbiAgICAgICgnfScpXG4gICAgICAoJ3ZhciBwcmVmaXggPSB2YXJpbnQuZGVjb2RlKGJ1Ziwgb2Zmc2V0KScpXG4gICAgICAoJ29mZnNldCArPSB2YXJpbnQuZGVjb2RlLmJ5dGVzJylcbiAgICAgICgndmFyIHRhZyA9IHByZWZpeCA+PiAzJylcbiAgICAgICgnc3dpdGNoICh0YWcpIHsnKVxuXG4gICAgZm9yRWFjaChmdW5jdGlvbiAoZSwgZiwgdmFsLCBpKSB7XG4gICAgICB2YXIgcGFja2VkID0gZi5yZXBlYXRlZCAmJiBmLm9wdGlvbnMgJiYgZi5vcHRpb25zLnBhY2tlZFxuXG4gICAgICBkZWNvZGUoJ2Nhc2UgJWQ6JywgZi50YWcpXG5cbiAgICAgIGlmIChmLm9uZW9mKSB7XG4gICAgICAgIG0uZmllbGRzLmZvckVhY2goZnVuY3Rpb24gKG90aGVyRmllbGQpIHtcbiAgICAgICAgICBpZiAob3RoZXJGaWVsZC5vbmVvZiA9PT0gZi5vbmVvZiAmJiBmLm5hbWUgIT09IG90aGVyRmllbGQubmFtZSkge1xuICAgICAgICAgICAgZGVjb2RlKCdkZWxldGUgJXMnLCBnZW5vYmooJ29iaicsIG90aGVyRmllbGQubmFtZSkpXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICBpZiAocGFja2VkKSB7XG4gICAgICAgIGRlY29kZSgpXG4gICAgICAgICAgKCd2YXIgcGFja2VkRW5kID0gdmFyaW50LmRlY29kZShidWYsIG9mZnNldCknKVxuICAgICAgICAgICgnb2Zmc2V0ICs9IHZhcmludC5kZWNvZGUuYnl0ZXMnKVxuICAgICAgICAgICgncGFja2VkRW5kICs9IG9mZnNldCcpXG4gICAgICAgICAgKCd3aGlsZSAob2Zmc2V0IDwgcGFja2VkRW5kKSB7JylcbiAgICAgIH1cblxuICAgICAgaWYgKGUubWVzc2FnZSkge1xuICAgICAgICBkZWNvZGUoJ3ZhciBsZW4gPSB2YXJpbnQuZGVjb2RlKGJ1Ziwgb2Zmc2V0KScpXG4gICAgICAgIGRlY29kZSgnb2Zmc2V0ICs9IHZhcmludC5kZWNvZGUuYnl0ZXMnKVxuICAgICAgICBpZiAoZi5tYXApIHtcbiAgICAgICAgICBkZWNvZGUoJ3ZhciB0bXAgPSBlbmNbJWRdLmRlY29kZShidWYsIG9mZnNldCwgb2Zmc2V0ICsgbGVuKScsIGkpXG4gICAgICAgICAgZGVjb2RlKCclc1t0bXAua2V5XSA9IHRtcC52YWx1ZScsIHZhbClcbiAgICAgICAgfSBlbHNlIGlmIChmLnJlcGVhdGVkKSB7XG4gICAgICAgICAgZGVjb2RlKCclcy5wdXNoKGVuY1slZF0uZGVjb2RlKGJ1Ziwgb2Zmc2V0LCBvZmZzZXQgKyBsZW4pKScsIHZhbCwgaSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkZWNvZGUoJyVzID0gZW5jWyVkXS5kZWNvZGUoYnVmLCBvZmZzZXQsIG9mZnNldCArIGxlbiknLCB2YWwsIGkpXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChmLnJlcGVhdGVkKSB7XG4gICAgICAgICAgZGVjb2RlKCclcy5wdXNoKGVuY1slZF0uZGVjb2RlKGJ1Ziwgb2Zmc2V0KSknLCB2YWwsIGkpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGVjb2RlKCclcyA9IGVuY1slZF0uZGVjb2RlKGJ1Ziwgb2Zmc2V0KScsIHZhbCwgaSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBkZWNvZGUoJ29mZnNldCArPSBlbmNbJWRdLmRlY29kZS5ieXRlcycsIGkpXG5cbiAgICAgIGlmIChwYWNrZWQpIGRlY29kZSgnfScpXG4gICAgICBpZiAoZi5yZXF1aXJlZCkgZGVjb2RlKCdmb3VuZCVkID0gdHJ1ZScsIGkpXG4gICAgICBkZWNvZGUoJ2JyZWFrJylcbiAgICB9KVxuXG4gICAgZGVjb2RlKClcbiAgICAgICAgICAoJ2RlZmF1bHQ6JylcbiAgICAgICAgICAoJ29mZnNldCA9IHNraXAocHJlZml4ICYgNywgYnVmLCBvZmZzZXQpJylcbiAgICAgICAgKCd9JylcbiAgICAgICgnfScpXG4gICAgKCd9JylcblxuICAgIGRlY29kZSA9IGRlY29kZS50b0Z1bmN0aW9uKHtcbiAgICAgIHZhcmludDogdmFyaW50LFxuICAgICAgc2tpcDogc2tpcCxcbiAgICAgIGVuYzogZW5jXG4gICAgfSlcblxuICAgIC8vIGVuZCBvZiBjb21waWxhdGlvbiAtIHJldHVybiBhbGwgdGhlIHRoaW5nc1xuXG4gICAgZW5jb2RlLmJ5dGVzID0gZGVjb2RlLmJ5dGVzID0gMFxuXG4gICAgZXhwb3J0cy5idWZmZXIgPSB0cnVlXG4gICAgZXhwb3J0cy5lbmNvZGUgPSBlbmNvZGVcbiAgICBleHBvcnRzLmRlY29kZSA9IGRlY29kZVxuICAgIGV4cG9ydHMuZW5jb2RpbmdMZW5ndGggPSBlbmNvZGluZ0xlbmd0aFxuXG4gICAgcmV0dXJuIGV4cG9ydHNcbiAgfVxuXG4gIHZhciByZXNvbHZlID0gZnVuY3Rpb24gKG5hbWUsIGZyb20sIGNvbXBpbGUpIHtcbiAgICBpZiAoZXh0cmFFbmNvZGluZ3MgJiYgZXh0cmFFbmNvZGluZ3NbbmFtZV0pIHJldHVybiBleHRyYUVuY29kaW5nc1tuYW1lXVxuICAgIGlmIChlbmNvZGluZ3NbbmFtZV0pIHJldHVybiBlbmNvZGluZ3NbbmFtZV1cblxuICAgIHZhciBtID0gKGZyb20gPyBmcm9tICsgJy4nICsgbmFtZSA6IG5hbWUpLnNwbGl0KCcuJylcbiAgICAgIC5tYXAoZnVuY3Rpb24gKHBhcnQsIGksIGxpc3QpIHtcbiAgICAgICAgcmV0dXJuIGxpc3Quc2xpY2UoMCwgaSkuY29uY2F0KG5hbWUpLmpvaW4oJy4nKVxuICAgICAgfSlcbiAgICAgIC5yZXZlcnNlKClcbiAgICAgIC5yZWR1Y2UoZnVuY3Rpb24gKHJlc3VsdCwgaWQpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdCB8fCBtZXNzYWdlc1tpZF0gfHwgZW51bXNbaWRdXG4gICAgICB9LCBudWxsKVxuXG4gICAgaWYgKGNvbXBpbGUgPT09IGZhbHNlKSByZXR1cm4gbVxuICAgIGlmICghbSkgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgcmVzb2x2ZSAnICsgbmFtZSlcblxuICAgIGlmIChtLnZhbHVlcykgcmV0dXJuIGNvbXBpbGVFbnVtKG0pXG4gICAgcmV0dXJuIGNhY2hlW20uaWRdIHx8IGNvbXBpbGVNZXNzYWdlKG0sIGNhY2hlW20uaWRdID0ge30pXG4gIH1cblxuICByZXR1cm4gKHNjaGVtYS5lbnVtcyB8fCBbXSkuY29uY2F0KChzY2hlbWEubWVzc2FnZXMgfHwgW10pLm1hcChmdW5jdGlvbiAobWVzc2FnZSkge1xuICAgIHJldHVybiByZXNvbHZlKG1lc3NhZ2UuaWQpXG4gIH0pKVxufVxuIiwidmFyIHZhcmludCA9IHJlcXVpcmUoJ3ZhcmludCcpXG52YXIgc3ZhcmludCA9IHJlcXVpcmUoJ3NpZ25lZC12YXJpbnQnKVxuXG52YXIgZW5jb2RlciA9IGZ1bmN0aW9uICh0eXBlLCBlbmNvZGUsIGRlY29kZSwgZW5jb2RpbmdMZW5ndGgpIHtcbiAgZW5jb2RlLmJ5dGVzID0gZGVjb2RlLmJ5dGVzID0gMFxuXG4gIHJldHVybiB7XG4gICAgdHlwZTogdHlwZSxcbiAgICBlbmNvZGU6IGVuY29kZSxcbiAgICBkZWNvZGU6IGRlY29kZSxcbiAgICBlbmNvZGluZ0xlbmd0aDogZW5jb2RpbmdMZW5ndGhcbiAgfVxufVxuXG5leHBvcnRzLm1ha2UgPSBlbmNvZGVyXG5cbmV4cG9ydHMuYnl0ZXMgPSAoZnVuY3Rpb24gKHRhZykge1xuICB2YXIgYnVmZmVyTGVuZ3RoID0gZnVuY3Rpb24gKHZhbCkge1xuICAgIHJldHVybiBCdWZmZXIuaXNCdWZmZXIodmFsKSA/IHZhbC5sZW5ndGggOiBCdWZmZXIuYnl0ZUxlbmd0aCh2YWwpXG4gIH1cblxuICB2YXIgZW5jb2RpbmdMZW5ndGggPSBmdW5jdGlvbiAodmFsKSB7XG4gICAgdmFyIGxlbiA9IGJ1ZmZlckxlbmd0aCh2YWwpXG4gICAgcmV0dXJuIHZhcmludC5lbmNvZGluZ0xlbmd0aChsZW4pICsgbGVuXG4gIH1cblxuICB2YXIgZW5jb2RlID0gZnVuY3Rpb24gKHZhbCwgYnVmZmVyLCBvZmZzZXQpIHtcbiAgICB2YXIgb2xkT2Zmc2V0ID0gb2Zmc2V0XG4gICAgdmFyIGxlbiA9IGJ1ZmZlckxlbmd0aCh2YWwpXG5cbiAgICB2YXJpbnQuZW5jb2RlKGxlbiwgYnVmZmVyLCBvZmZzZXQpXG4gICAgb2Zmc2V0ICs9IHZhcmludC5lbmNvZGUuYnl0ZXNcblxuICAgIGlmIChCdWZmZXIuaXNCdWZmZXIodmFsKSkgdmFsLmNvcHkoYnVmZmVyLCBvZmZzZXQpXG4gICAgZWxzZSBidWZmZXIud3JpdGUodmFsLCBvZmZzZXQsIGxlbilcbiAgICBvZmZzZXQgKz0gbGVuXG5cbiAgICBlbmNvZGUuYnl0ZXMgPSBvZmZzZXQgLSBvbGRPZmZzZXRcbiAgICByZXR1cm4gYnVmZmVyXG4gIH1cblxuICB2YXIgZGVjb2RlID0gZnVuY3Rpb24gKGJ1ZmZlciwgb2Zmc2V0KSB7XG4gICAgdmFyIG9sZE9mZnNldCA9IG9mZnNldFxuXG4gICAgdmFyIGxlbiA9IHZhcmludC5kZWNvZGUoYnVmZmVyLCBvZmZzZXQpXG4gICAgb2Zmc2V0ICs9IHZhcmludC5kZWNvZGUuYnl0ZXNcblxuICAgIHZhciB2YWwgPSBidWZmZXIuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBsZW4pXG4gICAgb2Zmc2V0ICs9IHZhbC5sZW5ndGhcblxuICAgIGRlY29kZS5ieXRlcyA9IG9mZnNldCAtIG9sZE9mZnNldFxuICAgIHJldHVybiB2YWxcbiAgfVxuXG4gIHJldHVybiBlbmNvZGVyKDIsIGVuY29kZSwgZGVjb2RlLCBlbmNvZGluZ0xlbmd0aClcbn0pKClcblxuZXhwb3J0cy5zdHJpbmcgPSAoZnVuY3Rpb24gKCkge1xuICB2YXIgZW5jb2RpbmdMZW5ndGggPSBmdW5jdGlvbiAodmFsKSB7XG4gICAgdmFyIGxlbiA9IEJ1ZmZlci5ieXRlTGVuZ3RoKHZhbClcbiAgICByZXR1cm4gdmFyaW50LmVuY29kaW5nTGVuZ3RoKGxlbikgKyBsZW5cbiAgfVxuXG4gIHZhciBlbmNvZGUgPSBmdW5jdGlvbiAodmFsLCBidWZmZXIsIG9mZnNldCkge1xuICAgIHZhciBvbGRPZmZzZXQgPSBvZmZzZXRcbiAgICB2YXIgbGVuID0gQnVmZmVyLmJ5dGVMZW5ndGgodmFsKVxuXG4gICAgdmFyaW50LmVuY29kZShsZW4sIGJ1ZmZlciwgb2Zmc2V0LCAndXRmLTgnKVxuICAgIG9mZnNldCArPSB2YXJpbnQuZW5jb2RlLmJ5dGVzXG5cbiAgICBidWZmZXIud3JpdGUodmFsLCBvZmZzZXQsIGxlbilcbiAgICBvZmZzZXQgKz0gbGVuXG5cbiAgICBlbmNvZGUuYnl0ZXMgPSBvZmZzZXQgLSBvbGRPZmZzZXRcbiAgICByZXR1cm4gYnVmZmVyXG4gIH1cblxuICB2YXIgZGVjb2RlID0gZnVuY3Rpb24gKGJ1ZmZlciwgb2Zmc2V0KSB7XG4gICAgdmFyIG9sZE9mZnNldCA9IG9mZnNldFxuXG4gICAgdmFyIGxlbiA9IHZhcmludC5kZWNvZGUoYnVmZmVyLCBvZmZzZXQpXG4gICAgb2Zmc2V0ICs9IHZhcmludC5kZWNvZGUuYnl0ZXNcblxuICAgIHZhciB2YWwgPSBidWZmZXIudG9TdHJpbmcoJ3V0Zi04Jywgb2Zmc2V0LCBvZmZzZXQgKyBsZW4pXG4gICAgb2Zmc2V0ICs9IGxlblxuXG4gICAgZGVjb2RlLmJ5dGVzID0gb2Zmc2V0IC0gb2xkT2Zmc2V0XG4gICAgcmV0dXJuIHZhbFxuICB9XG5cbiAgcmV0dXJuIGVuY29kZXIoMiwgZW5jb2RlLCBkZWNvZGUsIGVuY29kaW5nTGVuZ3RoKVxufSkoKVxuXG5leHBvcnRzLmJvb2wgPSAoZnVuY3Rpb24gKCkge1xuICB2YXIgZW5jb2RpbmdMZW5ndGggPSBmdW5jdGlvbiAodmFsKSB7XG4gICAgcmV0dXJuIDFcbiAgfVxuXG4gIHZhciBlbmNvZGUgPSBmdW5jdGlvbiAodmFsLCBidWZmZXIsIG9mZnNldCkge1xuICAgIGJ1ZmZlcltvZmZzZXRdID0gdmFsID8gMSA6IDBcbiAgICBlbmNvZGUuYnl0ZXMgPSAxXG4gICAgcmV0dXJuIGJ1ZmZlclxuICB9XG5cbiAgdmFyIGRlY29kZSA9IGZ1bmN0aW9uIChidWZmZXIsIG9mZnNldCkge1xuICAgIHZhciBib29sID0gYnVmZmVyW29mZnNldF0gPiAwXG4gICAgZGVjb2RlLmJ5dGVzID0gMVxuICAgIHJldHVybiBib29sXG4gIH1cblxuICByZXR1cm4gZW5jb2RlcigwLCBlbmNvZGUsIGRlY29kZSwgZW5jb2RpbmdMZW5ndGgpXG59KSgpXG5cbmV4cG9ydHMuaW50MzIgPSAoZnVuY3Rpb24gKCkge1xuICB2YXIgZGVjb2RlID0gZnVuY3Rpb24gKGJ1ZmZlciwgb2Zmc2V0KSB7XG4gICAgdmFyIHZhbCA9IHZhcmludC5kZWNvZGUoYnVmZmVyLCBvZmZzZXQpXG4gICAgZGVjb2RlLmJ5dGVzID0gdmFyaW50LmRlY29kZS5ieXRlc1xuICAgIHJldHVybiB2YWwgPiAyMTQ3NDgzNjQ3ID8gdmFsIC0gNDI5NDk2NzI5NiA6IHZhbFxuICB9XG5cbiAgdmFyIGVuY29kZSA9IGZ1bmN0aW9uICh2YWwsIGJ1ZmZlciwgb2Zmc2V0KSB7XG4gICAgdmFyaW50LmVuY29kZSh2YWwgPCAwID8gdmFsICsgNDI5NDk2NzI5NiA6IHZhbCwgYnVmZmVyLCBvZmZzZXQpXG4gICAgZW5jb2RlLmJ5dGVzID0gdmFyaW50LmVuY29kZS5ieXRlc1xuICAgIHJldHVybiBidWZmZXJcbiAgfVxuXG4gIHZhciBlbmNvZGluZ0xlbmd0aCA9IGZ1bmN0aW9uICh2YWwpIHtcbiAgICByZXR1cm4gdmFyaW50LmVuY29kaW5nTGVuZ3RoKHZhbCA8IDAgPyB2YWwgKyA0Mjk0OTY3Mjk2IDogdmFsKVxuICB9XG5cbiAgcmV0dXJuIGVuY29kZXIoMCwgdmFyaW50LmVuY29kZSwgZGVjb2RlLCBlbmNvZGluZ0xlbmd0aClcbn0pKClcblxuZXhwb3J0cy5pbnQ2NCA9IChmdW5jdGlvbiAoKSB7XG4gIHZhciBkZWNvZGUgPSBmdW5jdGlvbiAoYnVmZmVyLCBvZmZzZXQpIHtcbiAgICB2YXIgdmFsID0gdmFyaW50LmRlY29kZShidWZmZXIsIG9mZnNldClcbiAgICBpZiAodmFsID49IE1hdGgucG93KDIsIDYzKSkge1xuICAgICAgdmFyIGxpbWl0ID0gOVxuICAgICAgd2hpbGUgKGJ1ZmZlcltvZmZzZXQgKyBsaW1pdCAtIDFdID09PSAweGZmKSBsaW1pdC0tXG4gICAgICBsaW1pdCA9IGxpbWl0IHx8IDlcbiAgICAgIHZhciBzdWJzZXQgPSBuZXcgQnVmZmVyKGxpbWl0KVxuICAgICAgYnVmZmVyLmNvcHkoc3Vic2V0LCAwLCBvZmZzZXQsIG9mZnNldCArIGxpbWl0KVxuICAgICAgc3Vic2V0W2xpbWl0IC0gMV0gPSBzdWJzZXRbbGltaXQgLSAxXSAmIDB4N2ZcbiAgICAgIHZhbCA9IC0xICogdmFyaW50LmRlY29kZShzdWJzZXQsIDApXG4gICAgICBkZWNvZGUuYnl0ZXMgPSAxMFxuICAgIH0gZWxzZSB7XG4gICAgICBkZWNvZGUuYnl0ZXMgPSB2YXJpbnQuZGVjb2RlLmJ5dGVzXG4gICAgfVxuICAgIHJldHVybiB2YWxcbiAgfVxuXG4gIHZhciBlbmNvZGUgPSBmdW5jdGlvbiAodmFsLCBidWZmZXIsIG9mZnNldCkge1xuICAgIGlmICh2YWwgPCAwKSB7XG4gICAgICB2YXIgbGFzdCA9IG9mZnNldCArIDlcbiAgICAgIHZhcmludC5lbmNvZGUodmFsICogLTEsIGJ1ZmZlciwgb2Zmc2V0KVxuICAgICAgb2Zmc2V0ICs9IHZhcmludC5lbmNvZGUuYnl0ZXMgLSAxXG4gICAgICBidWZmZXJbb2Zmc2V0XSA9IGJ1ZmZlcltvZmZzZXRdIHwgMHg4MFxuICAgICAgd2hpbGUgKG9mZnNldCA8IGxhc3QgLSAxKSB7XG4gICAgICAgIG9mZnNldCsrXG4gICAgICAgIGJ1ZmZlcltvZmZzZXRdID0gMHhmZlxuICAgICAgfVxuICAgICAgYnVmZmVyW2xhc3RdID0gMHgwMVxuICAgICAgZW5jb2RlLmJ5dGVzID0gMTBcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyaW50LmVuY29kZSh2YWwsIGJ1ZmZlciwgb2Zmc2V0KVxuICAgICAgZW5jb2RlLmJ5dGVzID0gdmFyaW50LmVuY29kZS5ieXRlc1xuICAgIH1cbiAgICByZXR1cm4gYnVmZmVyXG4gIH1cblxuICB2YXIgZW5jb2RpbmdMZW5ndGggPSBmdW5jdGlvbiAodmFsKSB7XG4gICAgcmV0dXJuIHZhbCA8IDAgPyAxMCA6IHZhcmludC5lbmNvZGluZ0xlbmd0aCh2YWwpXG4gIH1cblxuICByZXR1cm4gZW5jb2RlcigwLCBlbmNvZGUsIGRlY29kZSwgZW5jb2RpbmdMZW5ndGgpXG59KSgpXG5cbmV4cG9ydHMuc2ludDMyID1cbmV4cG9ydHMuc2ludDY0ID0gKGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGVuY29kZXIoMCwgc3ZhcmludC5lbmNvZGUsIHN2YXJpbnQuZGVjb2RlLCBzdmFyaW50LmVuY29kaW5nTGVuZ3RoKVxufSkoKVxuXG5leHBvcnRzLnVpbnQzMiA9XG5leHBvcnRzLnVpbnQ2NCA9XG5leHBvcnRzLmVudW0gPVxuZXhwb3J0cy52YXJpbnQgPSAoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gZW5jb2RlcigwLCB2YXJpbnQuZW5jb2RlLCB2YXJpbnQuZGVjb2RlLCB2YXJpbnQuZW5jb2RpbmdMZW5ndGgpXG59KSgpXG5cbi8vIHdlIGNhbm5vdCByZXByZXNlbnQgdGhlc2UgaW4gamF2YXNjcmlwdCBzbyB3ZSBqdXN0IHVzZSBidWZmZXJzXG5leHBvcnRzLmZpeGVkNjQgPVxuZXhwb3J0cy5zZml4ZWQ2NCA9IChmdW5jdGlvbiAoKSB7XG4gIHZhciBlbmNvZGluZ0xlbmd0aCA9IGZ1bmN0aW9uICh2YWwpIHtcbiAgICByZXR1cm4gOFxuICB9XG5cbiAgdmFyIGVuY29kZSA9IGZ1bmN0aW9uICh2YWwsIGJ1ZmZlciwgb2Zmc2V0KSB7XG4gICAgdmFsLmNvcHkoYnVmZmVyLCBvZmZzZXQpXG4gICAgZW5jb2RlLmJ5dGVzID0gOFxuICAgIHJldHVybiBidWZmZXJcbiAgfVxuXG4gIHZhciBkZWNvZGUgPSBmdW5jdGlvbiAoYnVmZmVyLCBvZmZzZXQpIHtcbiAgICB2YXIgdmFsID0gYnVmZmVyLnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgOClcbiAgICBkZWNvZGUuYnl0ZXMgPSA4XG4gICAgcmV0dXJuIHZhbFxuICB9XG5cbiAgcmV0dXJuIGVuY29kZXIoMSwgZW5jb2RlLCBkZWNvZGUsIGVuY29kaW5nTGVuZ3RoKVxufSkoKVxuXG5leHBvcnRzLmRvdWJsZSA9IChmdW5jdGlvbiAoKSB7XG4gIHZhciBlbmNvZGluZ0xlbmd0aCA9IGZ1bmN0aW9uICh2YWwpIHtcbiAgICByZXR1cm4gOFxuICB9XG5cbiAgdmFyIGVuY29kZSA9IGZ1bmN0aW9uICh2YWwsIGJ1ZmZlciwgb2Zmc2V0KSB7XG4gICAgYnVmZmVyLndyaXRlRG91YmxlTEUodmFsLCBvZmZzZXQpXG4gICAgZW5jb2RlLmJ5dGVzID0gOFxuICAgIHJldHVybiBidWZmZXJcbiAgfVxuXG4gIHZhciBkZWNvZGUgPSBmdW5jdGlvbiAoYnVmZmVyLCBvZmZzZXQpIHtcbiAgICB2YXIgdmFsID0gYnVmZmVyLnJlYWREb3VibGVMRShvZmZzZXQpXG4gICAgZGVjb2RlLmJ5dGVzID0gOFxuICAgIHJldHVybiB2YWxcbiAgfVxuXG4gIHJldHVybiBlbmNvZGVyKDEsIGVuY29kZSwgZGVjb2RlLCBlbmNvZGluZ0xlbmd0aClcbn0pKClcblxuZXhwb3J0cy5maXhlZDMyID0gKGZ1bmN0aW9uICgpIHtcbiAgdmFyIGVuY29kaW5nTGVuZ3RoID0gZnVuY3Rpb24gKHZhbCkge1xuICAgIHJldHVybiA0XG4gIH1cblxuICB2YXIgZW5jb2RlID0gZnVuY3Rpb24gKHZhbCwgYnVmZmVyLCBvZmZzZXQpIHtcbiAgICBidWZmZXIud3JpdGVVSW50MzJMRSh2YWwsIG9mZnNldClcbiAgICBlbmNvZGUuYnl0ZXMgPSA0XG4gICAgcmV0dXJuIGJ1ZmZlclxuICB9XG5cbiAgdmFyIGRlY29kZSA9IGZ1bmN0aW9uIChidWZmZXIsIG9mZnNldCkge1xuICAgIHZhciB2YWwgPSBidWZmZXIucmVhZFVJbnQzMkxFKG9mZnNldClcbiAgICBkZWNvZGUuYnl0ZXMgPSA0XG4gICAgcmV0dXJuIHZhbFxuICB9XG5cbiAgcmV0dXJuIGVuY29kZXIoNSwgZW5jb2RlLCBkZWNvZGUsIGVuY29kaW5nTGVuZ3RoKVxufSkoKVxuXG5leHBvcnRzLnNmaXhlZDMyID0gKGZ1bmN0aW9uICgpIHtcbiAgdmFyIGVuY29kaW5nTGVuZ3RoID0gZnVuY3Rpb24gKHZhbCkge1xuICAgIHJldHVybiA0XG4gIH1cblxuICB2YXIgZW5jb2RlID0gZnVuY3Rpb24gKHZhbCwgYnVmZmVyLCBvZmZzZXQpIHtcbiAgICBidWZmZXIud3JpdGVJbnQzMkxFKHZhbCwgb2Zmc2V0KVxuICAgIGVuY29kZS5ieXRlcyA9IDRcbiAgICByZXR1cm4gYnVmZmVyXG4gIH1cblxuICB2YXIgZGVjb2RlID0gZnVuY3Rpb24gKGJ1ZmZlciwgb2Zmc2V0KSB7XG4gICAgdmFyIHZhbCA9IGJ1ZmZlci5yZWFkSW50MzJMRShvZmZzZXQpXG4gICAgZGVjb2RlLmJ5dGVzID0gNFxuICAgIHJldHVybiB2YWxcbiAgfVxuXG4gIHJldHVybiBlbmNvZGVyKDUsIGVuY29kZSwgZGVjb2RlLCBlbmNvZGluZ0xlbmd0aClcbn0pKClcblxuZXhwb3J0cy5mbG9hdCA9IChmdW5jdGlvbiAoKSB7XG4gIHZhciBlbmNvZGluZ0xlbmd0aCA9IGZ1bmN0aW9uICh2YWwpIHtcbiAgICByZXR1cm4gNFxuICB9XG5cbiAgdmFyIGVuY29kZSA9IGZ1bmN0aW9uICh2YWwsIGJ1ZmZlciwgb2Zmc2V0KSB7XG4gICAgYnVmZmVyLndyaXRlRmxvYXRMRSh2YWwsIG9mZnNldClcbiAgICBlbmNvZGUuYnl0ZXMgPSA0XG4gICAgcmV0dXJuIGJ1ZmZlclxuICB9XG5cbiAgdmFyIGRlY29kZSA9IGZ1bmN0aW9uIChidWZmZXIsIG9mZnNldCkge1xuICAgIHZhciB2YWwgPSBidWZmZXIucmVhZEZsb2F0TEUob2Zmc2V0KVxuICAgIGRlY29kZS5ieXRlcyA9IDRcbiAgICByZXR1cm4gdmFsXG4gIH1cblxuICByZXR1cm4gZW5jb2Rlcig1LCBlbmNvZGUsIGRlY29kZSwgZW5jb2RpbmdMZW5ndGgpXG59KSgpXG4iLCJ2YXIgc2NoZW1hID0gcmVxdWlyZSgncHJvdG9jb2wtYnVmZmVycy1zY2hlbWEnKVxudmFyIGNvbXBpbGUgPSByZXF1aXJlKCcuL2NvbXBpbGUnKVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChwcm90bywgb3B0cykge1xuICBpZiAoIW9wdHMpIG9wdHMgPSB7fVxuICBpZiAoIXByb3RvKSB0aHJvdyBuZXcgRXJyb3IoJ1Bhc3MgaW4gYSAucHJvdG8gc3RyaW5nIG9yIGEgcHJvdG9idWYtc2NoZW1hIHBhcnNlZCBvYmplY3QnKVxuXG4gIHZhciBzY2ggPSAodHlwZW9mIHByb3RvID09PSAnb2JqZWN0JyAmJiAhQnVmZmVyLmlzQnVmZmVyKHByb3RvKSkgPyBwcm90byA6IHNjaGVtYS5wYXJzZShwcm90bylcblxuICAvLyB0byBub3QgbWFrZSB0b1N0cmluZyx0b0pTT04gZW51bWFyYWJsZSB3ZSBtYWtlIGEgZmlyZS1hbmQtZm9yZ2V0IHByb3RvdHlwZVxuICB2YXIgTWVzc2FnZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzXG5cbiAgICBjb21waWxlKHNjaCwgb3B0cy5lbmNvZGluZ3MgfHwge30pLmZvckVhY2goZnVuY3Rpb24gKG0pIHtcbiAgICAgIHNlbGZbbS5uYW1lXSA9IG0udmFsdWVzIHx8IG1cbiAgICB9KVxuICB9XG5cbiAgTWVzc2FnZXMucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBzY2hlbWEuc3RyaW5naWZ5KHNjaClcbiAgfVxuXG4gIE1lc3NhZ2VzLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHNjaFxuICB9XG5cbiAgcmV0dXJuIG5ldyBNZXNzYWdlcygpXG59XG4iLCJ2YXIgb25jZSA9IHJlcXVpcmUoJ29uY2UnKVxudmFyIGVvcyA9IHJlcXVpcmUoJ2VuZC1vZi1zdHJlYW0nKVxudmFyIGZzID0gcmVxdWlyZSgnZnMnKSAvLyB3ZSBvbmx5IG5lZWQgZnMgdG8gZ2V0IHRoZSBSZWFkU3RyZWFtIGFuZCBXcml0ZVN0cmVhbSBwcm90b3R5cGVzXG5cbnZhciBub29wID0gZnVuY3Rpb24gKCkge31cblxudmFyIGlzRm4gPSBmdW5jdGlvbiAoZm4pIHtcbiAgcmV0dXJuIHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJ1xufVxuXG52YXIgaXNGUyA9IGZ1bmN0aW9uIChzdHJlYW0pIHtcbiAgcmV0dXJuIChzdHJlYW0gaW5zdGFuY2VvZiAoZnMuUmVhZFN0cmVhbSB8fCBub29wKSB8fCBzdHJlYW0gaW5zdGFuY2VvZiAoZnMuV3JpdGVTdHJlYW0gfHwgbm9vcCkpICYmIGlzRm4oc3RyZWFtLmNsb3NlKVxufVxuXG52YXIgaXNSZXF1ZXN0ID0gZnVuY3Rpb24gKHN0cmVhbSkge1xuICByZXR1cm4gc3RyZWFtLnNldEhlYWRlciAmJiBpc0ZuKHN0cmVhbS5hYm9ydClcbn1cblxudmFyIGRlc3Ryb3llciA9IGZ1bmN0aW9uIChzdHJlYW0sIHJlYWRpbmcsIHdyaXRpbmcsIGNhbGxiYWNrKSB7XG4gIGNhbGxiYWNrID0gb25jZShjYWxsYmFjaylcblxuICB2YXIgY2xvc2VkID0gZmFsc2VcbiAgc3RyZWFtLm9uKCdjbG9zZScsIGZ1bmN0aW9uICgpIHtcbiAgICBjbG9zZWQgPSB0cnVlXG4gIH0pXG5cbiAgZW9zKHN0cmVhbSwge3JlYWRhYmxlOiByZWFkaW5nLCB3cml0YWJsZTogd3JpdGluZ30sIGZ1bmN0aW9uIChlcnIpIHtcbiAgICBpZiAoZXJyKSByZXR1cm4gY2FsbGJhY2soZXJyKVxuICAgIGNsb3NlZCA9IHRydWVcbiAgICBjYWxsYmFjaygpXG4gIH0pXG5cbiAgdmFyIGRlc3Ryb3llZCA9IGZhbHNlXG4gIHJldHVybiBmdW5jdGlvbiAoZXJyKSB7XG4gICAgaWYgKGNsb3NlZCkgcmV0dXJuXG4gICAgaWYgKGRlc3Ryb3llZCkgcmV0dXJuXG4gICAgZGVzdHJveWVkID0gdHJ1ZVxuXG4gICAgaWYgKGlzRlMoc3RyZWFtKSkgcmV0dXJuIHN0cmVhbS5jbG9zZSgpIC8vIHVzZSBjbG9zZSBmb3IgZnMgc3RyZWFtcyB0byBhdm9pZCBmZCBsZWFrc1xuICAgIGlmIChpc1JlcXVlc3Qoc3RyZWFtKSkgcmV0dXJuIHN0cmVhbS5hYm9ydCgpIC8vIHJlcXVlc3QuZGVzdHJveSBqdXN0IGRvIC5lbmQgLSAuYWJvcnQgaXMgd2hhdCB3ZSB3YW50XG5cbiAgICBpZiAoaXNGbihzdHJlYW0uZGVzdHJveSkpIHJldHVybiBzdHJlYW0uZGVzdHJveSgpXG5cbiAgICBjYWxsYmFjayhlcnIgfHwgbmV3IEVycm9yKCdzdHJlYW0gd2FzIGRlc3Ryb3llZCcpKVxuICB9XG59XG5cbnZhciBjYWxsID0gZnVuY3Rpb24gKGZuKSB7XG4gIGZuKClcbn1cblxudmFyIHBpcGUgPSBmdW5jdGlvbiAoZnJvbSwgdG8pIHtcbiAgcmV0dXJuIGZyb20ucGlwZSh0bylcbn1cblxudmFyIHB1bXAgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzdHJlYW1zID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKVxuICB2YXIgY2FsbGJhY2sgPSBpc0ZuKHN0cmVhbXNbc3RyZWFtcy5sZW5ndGggLSAxXSB8fCBub29wKSAmJiBzdHJlYW1zLnBvcCgpIHx8IG5vb3BcblxuICBpZiAoQXJyYXkuaXNBcnJheShzdHJlYW1zWzBdKSkgc3RyZWFtcyA9IHN0cmVhbXNbMF1cbiAgaWYgKHN0cmVhbXMubGVuZ3RoIDwgMikgdGhyb3cgbmV3IEVycm9yKCdwdW1wIHJlcXVpcmVzIHR3byBzdHJlYW1zIHBlciBtaW5pbXVtJylcblxuICB2YXIgZXJyb3JcbiAgdmFyIGRlc3Ryb3lzID0gc3RyZWFtcy5tYXAoZnVuY3Rpb24gKHN0cmVhbSwgaSkge1xuICAgIHZhciByZWFkaW5nID0gaSA8IHN0cmVhbXMubGVuZ3RoIC0gMVxuICAgIHZhciB3cml0aW5nID0gaSA+IDBcbiAgICByZXR1cm4gZGVzdHJveWVyKHN0cmVhbSwgcmVhZGluZywgd3JpdGluZywgZnVuY3Rpb24gKGVycikge1xuICAgICAgaWYgKCFlcnJvcikgZXJyb3IgPSBlcnJcbiAgICAgIGlmIChlcnIpIGRlc3Ryb3lzLmZvckVhY2goY2FsbClcbiAgICAgIGlmIChyZWFkaW5nKSByZXR1cm5cbiAgICAgIGRlc3Ryb3lzLmZvckVhY2goY2FsbClcbiAgICAgIGNhbGxiYWNrKGVycm9yKVxuICAgIH0pXG4gIH0pXG5cbiAgcmV0dXJuIHN0cmVhbXMucmVkdWNlKHBpcGUpXG59XG5cbm1vZHVsZS5leHBvcnRzID0gcHVtcFxuIiwidmFyIG5vdyA9IHJlcXVpcmUoJ3BlcmZvcm1hbmNlLW5vdycpXG4gICwgZ2xvYmFsID0gdHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgPyB7fSA6IHdpbmRvd1xuICAsIHZlbmRvcnMgPSBbJ21veicsICd3ZWJraXQnXVxuICAsIHN1ZmZpeCA9ICdBbmltYXRpb25GcmFtZSdcbiAgLCByYWYgPSBnbG9iYWxbJ3JlcXVlc3QnICsgc3VmZml4XVxuICAsIGNhZiA9IGdsb2JhbFsnY2FuY2VsJyArIHN1ZmZpeF0gfHwgZ2xvYmFsWydjYW5jZWxSZXF1ZXN0JyArIHN1ZmZpeF1cbiAgLCBpc05hdGl2ZSA9IHRydWVcblxuZm9yKHZhciBpID0gMDsgaSA8IHZlbmRvcnMubGVuZ3RoICYmICFyYWY7IGkrKykge1xuICByYWYgPSBnbG9iYWxbdmVuZG9yc1tpXSArICdSZXF1ZXN0JyArIHN1ZmZpeF1cbiAgY2FmID0gZ2xvYmFsW3ZlbmRvcnNbaV0gKyAnQ2FuY2VsJyArIHN1ZmZpeF1cbiAgICAgIHx8IGdsb2JhbFt2ZW5kb3JzW2ldICsgJ0NhbmNlbFJlcXVlc3QnICsgc3VmZml4XVxufVxuXG4vLyBTb21lIHZlcnNpb25zIG9mIEZGIGhhdmUgckFGIGJ1dCBub3QgY0FGXG5pZighcmFmIHx8ICFjYWYpIHtcbiAgaXNOYXRpdmUgPSBmYWxzZVxuXG4gIHZhciBsYXN0ID0gMFxuICAgICwgaWQgPSAwXG4gICAgLCBxdWV1ZSA9IFtdXG4gICAgLCBmcmFtZUR1cmF0aW9uID0gMTAwMCAvIDYwXG5cbiAgcmFmID0gZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgICBpZihxdWV1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgIHZhciBfbm93ID0gbm93KClcbiAgICAgICAgLCBuZXh0ID0gTWF0aC5tYXgoMCwgZnJhbWVEdXJhdGlvbiAtIChfbm93IC0gbGFzdCkpXG4gICAgICBsYXN0ID0gbmV4dCArIF9ub3dcbiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBjcCA9IHF1ZXVlLnNsaWNlKDApXG4gICAgICAgIC8vIENsZWFyIHF1ZXVlIGhlcmUgdG8gcHJldmVudFxuICAgICAgICAvLyBjYWxsYmFja3MgZnJvbSBhcHBlbmRpbmcgbGlzdGVuZXJzXG4gICAgICAgIC8vIHRvIHRoZSBjdXJyZW50IGZyYW1lJ3MgcXVldWVcbiAgICAgICAgcXVldWUubGVuZ3RoID0gMFxuICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgY3AubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZighY3BbaV0uY2FuY2VsbGVkKSB7XG4gICAgICAgICAgICB0cnl7XG4gICAgICAgICAgICAgIGNwW2ldLmNhbGxiYWNrKGxhc3QpXG4gICAgICAgICAgICB9IGNhdGNoKGUpIHtcbiAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsgdGhyb3cgZSB9LCAwKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSwgTWF0aC5yb3VuZChuZXh0KSlcbiAgICB9XG4gICAgcXVldWUucHVzaCh7XG4gICAgICBoYW5kbGU6ICsraWQsXG4gICAgICBjYWxsYmFjazogY2FsbGJhY2ssXG4gICAgICBjYW5jZWxsZWQ6IGZhbHNlXG4gICAgfSlcbiAgICByZXR1cm4gaWRcbiAgfVxuXG4gIGNhZiA9IGZ1bmN0aW9uKGhhbmRsZSkge1xuICAgIGZvcih2YXIgaSA9IDA7IGkgPCBxdWV1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYocXVldWVbaV0uaGFuZGxlID09PSBoYW5kbGUpIHtcbiAgICAgICAgcXVldWVbaV0uY2FuY2VsbGVkID0gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGZuKSB7XG4gIC8vIFdyYXAgaW4gYSBuZXcgZnVuY3Rpb24gdG8gcHJldmVudFxuICAvLyBgY2FuY2VsYCBwb3RlbnRpYWxseSBiZWluZyBhc3NpZ25lZFxuICAvLyB0byB0aGUgbmF0aXZlIHJBRiBmdW5jdGlvblxuICBpZighaXNOYXRpdmUpIHtcbiAgICByZXR1cm4gcmFmLmNhbGwoZ2xvYmFsLCBmbilcbiAgfVxuICByZXR1cm4gcmFmLmNhbGwoZ2xvYmFsLCBmdW5jdGlvbigpIHtcbiAgICB0cnl7XG4gICAgICBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG4gICAgfSBjYXRjaChlKSB7XG4gICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyB0aHJvdyBlIH0sIDApXG4gICAgfVxuICB9KVxufVxubW9kdWxlLmV4cG9ydHMuY2FuY2VsID0gZnVuY3Rpb24oKSB7XG4gIGNhZi5hcHBseShnbG9iYWwsIGFyZ3VtZW50cylcbn1cbiIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4vLyBhIGR1cGxleCBzdHJlYW0gaXMganVzdCBhIHN0cmVhbSB0aGF0IGlzIGJvdGggcmVhZGFibGUgYW5kIHdyaXRhYmxlLlxuLy8gU2luY2UgSlMgZG9lc24ndCBoYXZlIG11bHRpcGxlIHByb3RvdHlwYWwgaW5oZXJpdGFuY2UsIHRoaXMgY2xhc3Ncbi8vIHByb3RvdHlwYWxseSBpbmhlcml0cyBmcm9tIFJlYWRhYmxlLCBhbmQgdGhlbiBwYXJhc2l0aWNhbGx5IGZyb21cbi8vIFdyaXRhYmxlLlxuXG5tb2R1bGUuZXhwb3J0cyA9IER1cGxleDtcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBvYmplY3RLZXlzID0gT2JqZWN0LmtleXMgfHwgZnVuY3Rpb24gKG9iaikge1xuICB2YXIga2V5cyA9IFtdO1xuICBmb3IgKHZhciBrZXkgaW4gb2JqKSBrZXlzLnB1c2goa2V5KTtcbiAgcmV0dXJuIGtleXM7XG59XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIHV0aWwgPSByZXF1aXJlKCdjb3JlLXV0aWwtaXMnKTtcbnV0aWwuaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbnZhciBSZWFkYWJsZSA9IHJlcXVpcmUoJy4vX3N0cmVhbV9yZWFkYWJsZScpO1xudmFyIFdyaXRhYmxlID0gcmVxdWlyZSgnLi9fc3RyZWFtX3dyaXRhYmxlJyk7XG5cbnV0aWwuaW5oZXJpdHMoRHVwbGV4LCBSZWFkYWJsZSk7XG5cbmZvckVhY2gob2JqZWN0S2V5cyhXcml0YWJsZS5wcm90b3R5cGUpLCBmdW5jdGlvbihtZXRob2QpIHtcbiAgaWYgKCFEdXBsZXgucHJvdG90eXBlW21ldGhvZF0pXG4gICAgRHVwbGV4LnByb3RvdHlwZVttZXRob2RdID0gV3JpdGFibGUucHJvdG90eXBlW21ldGhvZF07XG59KTtcblxuZnVuY3Rpb24gRHVwbGV4KG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIER1cGxleCkpXG4gICAgcmV0dXJuIG5ldyBEdXBsZXgob3B0aW9ucyk7XG5cbiAgUmVhZGFibGUuY2FsbCh0aGlzLCBvcHRpb25zKTtcbiAgV3JpdGFibGUuY2FsbCh0aGlzLCBvcHRpb25zKTtcblxuICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLnJlYWRhYmxlID09PSBmYWxzZSlcbiAgICB0aGlzLnJlYWRhYmxlID0gZmFsc2U7XG5cbiAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy53cml0YWJsZSA9PT0gZmFsc2UpXG4gICAgdGhpcy53cml0YWJsZSA9IGZhbHNlO1xuXG4gIHRoaXMuYWxsb3dIYWxmT3BlbiA9IHRydWU7XG4gIGlmIChvcHRpb25zICYmIG9wdGlvbnMuYWxsb3dIYWxmT3BlbiA9PT0gZmFsc2UpXG4gICAgdGhpcy5hbGxvd0hhbGZPcGVuID0gZmFsc2U7XG5cbiAgdGhpcy5vbmNlKCdlbmQnLCBvbmVuZCk7XG59XG5cbi8vIHRoZSBuby1oYWxmLW9wZW4gZW5mb3JjZXJcbmZ1bmN0aW9uIG9uZW5kKCkge1xuICAvLyBpZiB3ZSBhbGxvdyBoYWxmLW9wZW4gc3RhdGUsIG9yIGlmIHRoZSB3cml0YWJsZSBzaWRlIGVuZGVkLFxuICAvLyB0aGVuIHdlJ3JlIG9rLlxuICBpZiAodGhpcy5hbGxvd0hhbGZPcGVuIHx8IHRoaXMuX3dyaXRhYmxlU3RhdGUuZW5kZWQpXG4gICAgcmV0dXJuO1xuXG4gIC8vIG5vIG1vcmUgZGF0YSBjYW4gYmUgd3JpdHRlbi5cbiAgLy8gQnV0IGFsbG93IG1vcmUgd3JpdGVzIHRvIGhhcHBlbiBpbiB0aGlzIHRpY2suXG4gIHByb2Nlc3MubmV4dFRpY2sodGhpcy5lbmQuYmluZCh0aGlzKSk7XG59XG5cbmZ1bmN0aW9uIGZvckVhY2ggKHhzLCBmKSB7XG4gIGZvciAodmFyIGkgPSAwLCBsID0geHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgZih4c1tpXSwgaSk7XG4gIH1cbn1cbiIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4vLyBhIHBhc3N0aHJvdWdoIHN0cmVhbS5cbi8vIGJhc2ljYWxseSBqdXN0IHRoZSBtb3N0IG1pbmltYWwgc29ydCBvZiBUcmFuc2Zvcm0gc3RyZWFtLlxuLy8gRXZlcnkgd3JpdHRlbiBjaHVuayBnZXRzIG91dHB1dCBhcy1pcy5cblxubW9kdWxlLmV4cG9ydHMgPSBQYXNzVGhyb3VnaDtcblxudmFyIFRyYW5zZm9ybSA9IHJlcXVpcmUoJy4vX3N0cmVhbV90cmFuc2Zvcm0nKTtcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciB1dGlsID0gcmVxdWlyZSgnY29yZS11dGlsLWlzJyk7XG51dGlsLmluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG51dGlsLmluaGVyaXRzKFBhc3NUaHJvdWdoLCBUcmFuc2Zvcm0pO1xuXG5mdW5jdGlvbiBQYXNzVGhyb3VnaChvcHRpb25zKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBQYXNzVGhyb3VnaCkpXG4gICAgcmV0dXJuIG5ldyBQYXNzVGhyb3VnaChvcHRpb25zKTtcblxuICBUcmFuc2Zvcm0uY2FsbCh0aGlzLCBvcHRpb25zKTtcbn1cblxuUGFzc1Rocm91Z2gucHJvdG90eXBlLl90cmFuc2Zvcm0gPSBmdW5jdGlvbihjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIGNiKG51bGwsIGNodW5rKTtcbn07XG4iLCIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxubW9kdWxlLmV4cG9ydHMgPSBSZWFkYWJsZTtcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBpc0FycmF5ID0gcmVxdWlyZSgnaXNhcnJheScpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBCdWZmZXIgPSByZXF1aXJlKCdidWZmZXInKS5CdWZmZXI7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuUmVhZGFibGUuUmVhZGFibGVTdGF0ZSA9IFJlYWRhYmxlU3RhdGU7XG5cbnZhciBFRSA9IHJlcXVpcmUoJ2V2ZW50cycpLkV2ZW50RW1pdHRlcjtcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbmlmICghRUUubGlzdGVuZXJDb3VudCkgRUUubGlzdGVuZXJDb3VudCA9IGZ1bmN0aW9uKGVtaXR0ZXIsIHR5cGUpIHtcbiAgcmV0dXJuIGVtaXR0ZXIubGlzdGVuZXJzKHR5cGUpLmxlbmd0aDtcbn07XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxudmFyIFN0cmVhbSA9IHJlcXVpcmUoJ3N0cmVhbScpO1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIHV0aWwgPSByZXF1aXJlKCdjb3JlLXV0aWwtaXMnKTtcbnV0aWwuaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbnZhciBTdHJpbmdEZWNvZGVyO1xuXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgZGVidWcgPSByZXF1aXJlKCd1dGlsJyk7XG5pZiAoZGVidWcgJiYgZGVidWcuZGVidWdsb2cpIHtcbiAgZGVidWcgPSBkZWJ1Zy5kZWJ1Z2xvZygnc3RyZWFtJyk7XG59IGVsc2Uge1xuICBkZWJ1ZyA9IGZ1bmN0aW9uICgpIHt9O1xufVxuLyo8L3JlcGxhY2VtZW50PiovXG5cblxudXRpbC5pbmhlcml0cyhSZWFkYWJsZSwgU3RyZWFtKTtcblxuZnVuY3Rpb24gUmVhZGFibGVTdGF0ZShvcHRpb25zLCBzdHJlYW0pIHtcbiAgdmFyIER1cGxleCA9IHJlcXVpcmUoJy4vX3N0cmVhbV9kdXBsZXgnKTtcblxuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAvLyB0aGUgcG9pbnQgYXQgd2hpY2ggaXQgc3RvcHMgY2FsbGluZyBfcmVhZCgpIHRvIGZpbGwgdGhlIGJ1ZmZlclxuICAvLyBOb3RlOiAwIGlzIGEgdmFsaWQgdmFsdWUsIG1lYW5zIFwiZG9uJ3QgY2FsbCBfcmVhZCBwcmVlbXB0aXZlbHkgZXZlclwiXG4gIHZhciBod20gPSBvcHRpb25zLmhpZ2hXYXRlck1hcms7XG4gIHZhciBkZWZhdWx0SHdtID0gb3B0aW9ucy5vYmplY3RNb2RlID8gMTYgOiAxNiAqIDEwMjQ7XG4gIHRoaXMuaGlnaFdhdGVyTWFyayA9IChod20gfHwgaHdtID09PSAwKSA/IGh3bSA6IGRlZmF1bHRId207XG5cbiAgLy8gY2FzdCB0byBpbnRzLlxuICB0aGlzLmhpZ2hXYXRlck1hcmsgPSB+fnRoaXMuaGlnaFdhdGVyTWFyaztcblxuICB0aGlzLmJ1ZmZlciA9IFtdO1xuICB0aGlzLmxlbmd0aCA9IDA7XG4gIHRoaXMucGlwZXMgPSBudWxsO1xuICB0aGlzLnBpcGVzQ291bnQgPSAwO1xuICB0aGlzLmZsb3dpbmcgPSBudWxsO1xuICB0aGlzLmVuZGVkID0gZmFsc2U7XG4gIHRoaXMuZW5kRW1pdHRlZCA9IGZhbHNlO1xuICB0aGlzLnJlYWRpbmcgPSBmYWxzZTtcblxuICAvLyBhIGZsYWcgdG8gYmUgYWJsZSB0byB0ZWxsIGlmIHRoZSBvbndyaXRlIGNiIGlzIGNhbGxlZCBpbW1lZGlhdGVseSxcbiAgLy8gb3Igb24gYSBsYXRlciB0aWNrLiAgV2Ugc2V0IHRoaXMgdG8gdHJ1ZSBhdCBmaXJzdCwgYmVjYXVzZSBhbnlcbiAgLy8gYWN0aW9ucyB0aGF0IHNob3VsZG4ndCBoYXBwZW4gdW50aWwgXCJsYXRlclwiIHNob3VsZCBnZW5lcmFsbHkgYWxzb1xuICAvLyBub3QgaGFwcGVuIGJlZm9yZSB0aGUgZmlyc3Qgd3JpdGUgY2FsbC5cbiAgdGhpcy5zeW5jID0gdHJ1ZTtcblxuICAvLyB3aGVuZXZlciB3ZSByZXR1cm4gbnVsbCwgdGhlbiB3ZSBzZXQgYSBmbGFnIHRvIHNheVxuICAvLyB0aGF0IHdlJ3JlIGF3YWl0aW5nIGEgJ3JlYWRhYmxlJyBldmVudCBlbWlzc2lvbi5cbiAgdGhpcy5uZWVkUmVhZGFibGUgPSBmYWxzZTtcbiAgdGhpcy5lbWl0dGVkUmVhZGFibGUgPSBmYWxzZTtcbiAgdGhpcy5yZWFkYWJsZUxpc3RlbmluZyA9IGZhbHNlO1xuXG5cbiAgLy8gb2JqZWN0IHN0cmVhbSBmbGFnLiBVc2VkIHRvIG1ha2UgcmVhZChuKSBpZ25vcmUgbiBhbmQgdG9cbiAgLy8gbWFrZSBhbGwgdGhlIGJ1ZmZlciBtZXJnaW5nIGFuZCBsZW5ndGggY2hlY2tzIGdvIGF3YXlcbiAgdGhpcy5vYmplY3RNb2RlID0gISFvcHRpb25zLm9iamVjdE1vZGU7XG5cbiAgaWYgKHN0cmVhbSBpbnN0YW5jZW9mIER1cGxleClcbiAgICB0aGlzLm9iamVjdE1vZGUgPSB0aGlzLm9iamVjdE1vZGUgfHwgISFvcHRpb25zLnJlYWRhYmxlT2JqZWN0TW9kZTtcblxuICAvLyBDcnlwdG8gaXMga2luZCBvZiBvbGQgYW5kIGNydXN0eS4gIEhpc3RvcmljYWxseSwgaXRzIGRlZmF1bHQgc3RyaW5nXG4gIC8vIGVuY29kaW5nIGlzICdiaW5hcnknIHNvIHdlIGhhdmUgdG8gbWFrZSB0aGlzIGNvbmZpZ3VyYWJsZS5cbiAgLy8gRXZlcnl0aGluZyBlbHNlIGluIHRoZSB1bml2ZXJzZSB1c2VzICd1dGY4JywgdGhvdWdoLlxuICB0aGlzLmRlZmF1bHRFbmNvZGluZyA9IG9wdGlvbnMuZGVmYXVsdEVuY29kaW5nIHx8ICd1dGY4JztcblxuICAvLyB3aGVuIHBpcGluZywgd2Ugb25seSBjYXJlIGFib3V0ICdyZWFkYWJsZScgZXZlbnRzIHRoYXQgaGFwcGVuXG4gIC8vIGFmdGVyIHJlYWQoKWluZyBhbGwgdGhlIGJ5dGVzIGFuZCBub3QgZ2V0dGluZyBhbnkgcHVzaGJhY2suXG4gIHRoaXMucmFuT3V0ID0gZmFsc2U7XG5cbiAgLy8gdGhlIG51bWJlciBvZiB3cml0ZXJzIHRoYXQgYXJlIGF3YWl0aW5nIGEgZHJhaW4gZXZlbnQgaW4gLnBpcGUoKXNcbiAgdGhpcy5hd2FpdERyYWluID0gMDtcblxuICAvLyBpZiB0cnVlLCBhIG1heWJlUmVhZE1vcmUgaGFzIGJlZW4gc2NoZWR1bGVkXG4gIHRoaXMucmVhZGluZ01vcmUgPSBmYWxzZTtcblxuICB0aGlzLmRlY29kZXIgPSBudWxsO1xuICB0aGlzLmVuY29kaW5nID0gbnVsbDtcbiAgaWYgKG9wdGlvbnMuZW5jb2RpbmcpIHtcbiAgICBpZiAoIVN0cmluZ0RlY29kZXIpXG4gICAgICBTdHJpbmdEZWNvZGVyID0gcmVxdWlyZSgnc3RyaW5nX2RlY29kZXIvJykuU3RyaW5nRGVjb2RlcjtcbiAgICB0aGlzLmRlY29kZXIgPSBuZXcgU3RyaW5nRGVjb2RlcihvcHRpb25zLmVuY29kaW5nKTtcbiAgICB0aGlzLmVuY29kaW5nID0gb3B0aW9ucy5lbmNvZGluZztcbiAgfVxufVxuXG5mdW5jdGlvbiBSZWFkYWJsZShvcHRpb25zKSB7XG4gIHZhciBEdXBsZXggPSByZXF1aXJlKCcuL19zdHJlYW1fZHVwbGV4Jyk7XG5cbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFJlYWRhYmxlKSlcbiAgICByZXR1cm4gbmV3IFJlYWRhYmxlKG9wdGlvbnMpO1xuXG4gIHRoaXMuX3JlYWRhYmxlU3RhdGUgPSBuZXcgUmVhZGFibGVTdGF0ZShvcHRpb25zLCB0aGlzKTtcblxuICAvLyBsZWdhY3lcbiAgdGhpcy5yZWFkYWJsZSA9IHRydWU7XG5cbiAgU3RyZWFtLmNhbGwodGhpcyk7XG59XG5cbi8vIE1hbnVhbGx5IHNob3ZlIHNvbWV0aGluZyBpbnRvIHRoZSByZWFkKCkgYnVmZmVyLlxuLy8gVGhpcyByZXR1cm5zIHRydWUgaWYgdGhlIGhpZ2hXYXRlck1hcmsgaGFzIG5vdCBiZWVuIGhpdCB5ZXQsXG4vLyBzaW1pbGFyIHRvIGhvdyBXcml0YWJsZS53cml0ZSgpIHJldHVybnMgdHJ1ZSBpZiB5b3Ugc2hvdWxkXG4vLyB3cml0ZSgpIHNvbWUgbW9yZS5cblJlYWRhYmxlLnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24oY2h1bmssIGVuY29kaW5nKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG5cbiAgaWYgKHV0aWwuaXNTdHJpbmcoY2h1bmspICYmICFzdGF0ZS5vYmplY3RNb2RlKSB7XG4gICAgZW5jb2RpbmcgPSBlbmNvZGluZyB8fCBzdGF0ZS5kZWZhdWx0RW5jb2Rpbmc7XG4gICAgaWYgKGVuY29kaW5nICE9PSBzdGF0ZS5lbmNvZGluZykge1xuICAgICAgY2h1bmsgPSBuZXcgQnVmZmVyKGNodW5rLCBlbmNvZGluZyk7XG4gICAgICBlbmNvZGluZyA9ICcnO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZWFkYWJsZUFkZENodW5rKHRoaXMsIHN0YXRlLCBjaHVuaywgZW5jb2RpbmcsIGZhbHNlKTtcbn07XG5cbi8vIFVuc2hpZnQgc2hvdWxkICphbHdheXMqIGJlIHNvbWV0aGluZyBkaXJlY3RseSBvdXQgb2YgcmVhZCgpXG5SZWFkYWJsZS5wcm90b3R5cGUudW5zaGlmdCA9IGZ1bmN0aW9uKGNodW5rKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gIHJldHVybiByZWFkYWJsZUFkZENodW5rKHRoaXMsIHN0YXRlLCBjaHVuaywgJycsIHRydWUpO1xufTtcblxuZnVuY3Rpb24gcmVhZGFibGVBZGRDaHVuayhzdHJlYW0sIHN0YXRlLCBjaHVuaywgZW5jb2RpbmcsIGFkZFRvRnJvbnQpIHtcbiAgdmFyIGVyID0gY2h1bmtJbnZhbGlkKHN0YXRlLCBjaHVuayk7XG4gIGlmIChlcikge1xuICAgIHN0cmVhbS5lbWl0KCdlcnJvcicsIGVyKTtcbiAgfSBlbHNlIGlmICh1dGlsLmlzTnVsbE9yVW5kZWZpbmVkKGNodW5rKSkge1xuICAgIHN0YXRlLnJlYWRpbmcgPSBmYWxzZTtcbiAgICBpZiAoIXN0YXRlLmVuZGVkKVxuICAgICAgb25Fb2ZDaHVuayhzdHJlYW0sIHN0YXRlKTtcbiAgfSBlbHNlIGlmIChzdGF0ZS5vYmplY3RNb2RlIHx8IGNodW5rICYmIGNodW5rLmxlbmd0aCA+IDApIHtcbiAgICBpZiAoc3RhdGUuZW5kZWQgJiYgIWFkZFRvRnJvbnQpIHtcbiAgICAgIHZhciBlID0gbmV3IEVycm9yKCdzdHJlYW0ucHVzaCgpIGFmdGVyIEVPRicpO1xuICAgICAgc3RyZWFtLmVtaXQoJ2Vycm9yJywgZSk7XG4gICAgfSBlbHNlIGlmIChzdGF0ZS5lbmRFbWl0dGVkICYmIGFkZFRvRnJvbnQpIHtcbiAgICAgIHZhciBlID0gbmV3IEVycm9yKCdzdHJlYW0udW5zaGlmdCgpIGFmdGVyIGVuZCBldmVudCcpO1xuICAgICAgc3RyZWFtLmVtaXQoJ2Vycm9yJywgZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChzdGF0ZS5kZWNvZGVyICYmICFhZGRUb0Zyb250ICYmICFlbmNvZGluZylcbiAgICAgICAgY2h1bmsgPSBzdGF0ZS5kZWNvZGVyLndyaXRlKGNodW5rKTtcblxuICAgICAgaWYgKCFhZGRUb0Zyb250KVxuICAgICAgICBzdGF0ZS5yZWFkaW5nID0gZmFsc2U7XG5cbiAgICAgIC8vIGlmIHdlIHdhbnQgdGhlIGRhdGEgbm93LCBqdXN0IGVtaXQgaXQuXG4gICAgICBpZiAoc3RhdGUuZmxvd2luZyAmJiBzdGF0ZS5sZW5ndGggPT09IDAgJiYgIXN0YXRlLnN5bmMpIHtcbiAgICAgICAgc3RyZWFtLmVtaXQoJ2RhdGEnLCBjaHVuayk7XG4gICAgICAgIHN0cmVhbS5yZWFkKDApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gdXBkYXRlIHRoZSBidWZmZXIgaW5mby5cbiAgICAgICAgc3RhdGUubGVuZ3RoICs9IHN0YXRlLm9iamVjdE1vZGUgPyAxIDogY2h1bmsubGVuZ3RoO1xuICAgICAgICBpZiAoYWRkVG9Gcm9udClcbiAgICAgICAgICBzdGF0ZS5idWZmZXIudW5zaGlmdChjaHVuayk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICBzdGF0ZS5idWZmZXIucHVzaChjaHVuayk7XG5cbiAgICAgICAgaWYgKHN0YXRlLm5lZWRSZWFkYWJsZSlcbiAgICAgICAgICBlbWl0UmVhZGFibGUoc3RyZWFtKTtcbiAgICAgIH1cblxuICAgICAgbWF5YmVSZWFkTW9yZShzdHJlYW0sIHN0YXRlKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoIWFkZFRvRnJvbnQpIHtcbiAgICBzdGF0ZS5yZWFkaW5nID0gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gbmVlZE1vcmVEYXRhKHN0YXRlKTtcbn1cblxuXG5cbi8vIGlmIGl0J3MgcGFzdCB0aGUgaGlnaCB3YXRlciBtYXJrLCB3ZSBjYW4gcHVzaCBpbiBzb21lIG1vcmUuXG4vLyBBbHNvLCBpZiB3ZSBoYXZlIG5vIGRhdGEgeWV0LCB3ZSBjYW4gc3RhbmQgc29tZVxuLy8gbW9yZSBieXRlcy4gIFRoaXMgaXMgdG8gd29yayBhcm91bmQgY2FzZXMgd2hlcmUgaHdtPTAsXG4vLyBzdWNoIGFzIHRoZSByZXBsLiAgQWxzbywgaWYgdGhlIHB1c2goKSB0cmlnZ2VyZWQgYVxuLy8gcmVhZGFibGUgZXZlbnQsIGFuZCB0aGUgdXNlciBjYWxsZWQgcmVhZChsYXJnZU51bWJlcikgc3VjaCB0aGF0XG4vLyBuZWVkUmVhZGFibGUgd2FzIHNldCwgdGhlbiB3ZSBvdWdodCB0byBwdXNoIG1vcmUsIHNvIHRoYXQgYW5vdGhlclxuLy8gJ3JlYWRhYmxlJyBldmVudCB3aWxsIGJlIHRyaWdnZXJlZC5cbmZ1bmN0aW9uIG5lZWRNb3JlRGF0YShzdGF0ZSkge1xuICByZXR1cm4gIXN0YXRlLmVuZGVkICYmXG4gICAgICAgICAoc3RhdGUubmVlZFJlYWRhYmxlIHx8XG4gICAgICAgICAgc3RhdGUubGVuZ3RoIDwgc3RhdGUuaGlnaFdhdGVyTWFyayB8fFxuICAgICAgICAgIHN0YXRlLmxlbmd0aCA9PT0gMCk7XG59XG5cbi8vIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LlxuUmVhZGFibGUucHJvdG90eXBlLnNldEVuY29kaW5nID0gZnVuY3Rpb24oZW5jKSB7XG4gIGlmICghU3RyaW5nRGVjb2RlcilcbiAgICBTdHJpbmdEZWNvZGVyID0gcmVxdWlyZSgnc3RyaW5nX2RlY29kZXIvJykuU3RyaW5nRGVjb2RlcjtcbiAgdGhpcy5fcmVhZGFibGVTdGF0ZS5kZWNvZGVyID0gbmV3IFN0cmluZ0RlY29kZXIoZW5jKTtcbiAgdGhpcy5fcmVhZGFibGVTdGF0ZS5lbmNvZGluZyA9IGVuYztcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vLyBEb24ndCByYWlzZSB0aGUgaHdtID4gMTI4TUJcbnZhciBNQVhfSFdNID0gMHg4MDAwMDA7XG5mdW5jdGlvbiByb3VuZFVwVG9OZXh0UG93ZXJPZjIobikge1xuICBpZiAobiA+PSBNQVhfSFdNKSB7XG4gICAgbiA9IE1BWF9IV007XG4gIH0gZWxzZSB7XG4gICAgLy8gR2V0IHRoZSBuZXh0IGhpZ2hlc3QgcG93ZXIgb2YgMlxuICAgIG4tLTtcbiAgICBmb3IgKHZhciBwID0gMTsgcCA8IDMyOyBwIDw8PSAxKSBuIHw9IG4gPj4gcDtcbiAgICBuKys7XG4gIH1cbiAgcmV0dXJuIG47XG59XG5cbmZ1bmN0aW9uIGhvd011Y2hUb1JlYWQobiwgc3RhdGUpIHtcbiAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCAmJiBzdGF0ZS5lbmRlZClcbiAgICByZXR1cm4gMDtcblxuICBpZiAoc3RhdGUub2JqZWN0TW9kZSlcbiAgICByZXR1cm4gbiA9PT0gMCA/IDAgOiAxO1xuXG4gIGlmIChpc05hTihuKSB8fCB1dGlsLmlzTnVsbChuKSkge1xuICAgIC8vIG9ubHkgZmxvdyBvbmUgYnVmZmVyIGF0IGEgdGltZVxuICAgIGlmIChzdGF0ZS5mbG93aW5nICYmIHN0YXRlLmJ1ZmZlci5sZW5ndGgpXG4gICAgICByZXR1cm4gc3RhdGUuYnVmZmVyWzBdLmxlbmd0aDtcbiAgICBlbHNlXG4gICAgICByZXR1cm4gc3RhdGUubGVuZ3RoO1xuICB9XG5cbiAgaWYgKG4gPD0gMClcbiAgICByZXR1cm4gMDtcblxuICAvLyBJZiB3ZSdyZSBhc2tpbmcgZm9yIG1vcmUgdGhhbiB0aGUgdGFyZ2V0IGJ1ZmZlciBsZXZlbCxcbiAgLy8gdGhlbiByYWlzZSB0aGUgd2F0ZXIgbWFyay4gIEJ1bXAgdXAgdG8gdGhlIG5leHQgaGlnaGVzdFxuICAvLyBwb3dlciBvZiAyLCB0byBwcmV2ZW50IGluY3JlYXNpbmcgaXQgZXhjZXNzaXZlbHkgaW4gdGlueVxuICAvLyBhbW91bnRzLlxuICBpZiAobiA+IHN0YXRlLmhpZ2hXYXRlck1hcmspXG4gICAgc3RhdGUuaGlnaFdhdGVyTWFyayA9IHJvdW5kVXBUb05leHRQb3dlck9mMihuKTtcblxuICAvLyBkb24ndCBoYXZlIHRoYXQgbXVjaC4gIHJldHVybiBudWxsLCB1bmxlc3Mgd2UndmUgZW5kZWQuXG4gIGlmIChuID4gc3RhdGUubGVuZ3RoKSB7XG4gICAgaWYgKCFzdGF0ZS5lbmRlZCkge1xuICAgICAgc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICAgIHJldHVybiAwO1xuICAgIH0gZWxzZVxuICAgICAgcmV0dXJuIHN0YXRlLmxlbmd0aDtcbiAgfVxuXG4gIHJldHVybiBuO1xufVxuXG4vLyB5b3UgY2FuIG92ZXJyaWRlIGVpdGhlciB0aGlzIG1ldGhvZCwgb3IgdGhlIGFzeW5jIF9yZWFkKG4pIGJlbG93LlxuUmVhZGFibGUucHJvdG90eXBlLnJlYWQgPSBmdW5jdGlvbihuKSB7XG4gIGRlYnVnKCdyZWFkJywgbik7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gIHZhciBuT3JpZyA9IG47XG5cbiAgaWYgKCF1dGlsLmlzTnVtYmVyKG4pIHx8IG4gPiAwKVxuICAgIHN0YXRlLmVtaXR0ZWRSZWFkYWJsZSA9IGZhbHNlO1xuXG4gIC8vIGlmIHdlJ3JlIGRvaW5nIHJlYWQoMCkgdG8gdHJpZ2dlciBhIHJlYWRhYmxlIGV2ZW50LCBidXQgd2VcbiAgLy8gYWxyZWFkeSBoYXZlIGEgYnVuY2ggb2YgZGF0YSBpbiB0aGUgYnVmZmVyLCB0aGVuIGp1c3QgdHJpZ2dlclxuICAvLyB0aGUgJ3JlYWRhYmxlJyBldmVudCBhbmQgbW92ZSBvbi5cbiAgaWYgKG4gPT09IDAgJiZcbiAgICAgIHN0YXRlLm5lZWRSZWFkYWJsZSAmJlxuICAgICAgKHN0YXRlLmxlbmd0aCA+PSBzdGF0ZS5oaWdoV2F0ZXJNYXJrIHx8IHN0YXRlLmVuZGVkKSkge1xuICAgIGRlYnVnKCdyZWFkOiBlbWl0UmVhZGFibGUnLCBzdGF0ZS5sZW5ndGgsIHN0YXRlLmVuZGVkKTtcbiAgICBpZiAoc3RhdGUubGVuZ3RoID09PSAwICYmIHN0YXRlLmVuZGVkKVxuICAgICAgZW5kUmVhZGFibGUodGhpcyk7XG4gICAgZWxzZVxuICAgICAgZW1pdFJlYWRhYmxlKHRoaXMpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgbiA9IGhvd011Y2hUb1JlYWQobiwgc3RhdGUpO1xuXG4gIC8vIGlmIHdlJ3ZlIGVuZGVkLCBhbmQgd2UncmUgbm93IGNsZWFyLCB0aGVuIGZpbmlzaCBpdCB1cC5cbiAgaWYgKG4gPT09IDAgJiYgc3RhdGUuZW5kZWQpIHtcbiAgICBpZiAoc3RhdGUubGVuZ3RoID09PSAwKVxuICAgICAgZW5kUmVhZGFibGUodGhpcyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyBBbGwgdGhlIGFjdHVhbCBjaHVuayBnZW5lcmF0aW9uIGxvZ2ljIG5lZWRzIHRvIGJlXG4gIC8vICpiZWxvdyogdGhlIGNhbGwgdG8gX3JlYWQuICBUaGUgcmVhc29uIGlzIHRoYXQgaW4gY2VydGFpblxuICAvLyBzeW50aGV0aWMgc3RyZWFtIGNhc2VzLCBzdWNoIGFzIHBhc3N0aHJvdWdoIHN0cmVhbXMsIF9yZWFkXG4gIC8vIG1heSBiZSBhIGNvbXBsZXRlbHkgc3luY2hyb25vdXMgb3BlcmF0aW9uIHdoaWNoIG1heSBjaGFuZ2VcbiAgLy8gdGhlIHN0YXRlIG9mIHRoZSByZWFkIGJ1ZmZlciwgcHJvdmlkaW5nIGVub3VnaCBkYXRhIHdoZW5cbiAgLy8gYmVmb3JlIHRoZXJlIHdhcyAqbm90KiBlbm91Z2guXG4gIC8vXG4gIC8vIFNvLCB0aGUgc3RlcHMgYXJlOlxuICAvLyAxLiBGaWd1cmUgb3V0IHdoYXQgdGhlIHN0YXRlIG9mIHRoaW5ncyB3aWxsIGJlIGFmdGVyIHdlIGRvXG4gIC8vIGEgcmVhZCBmcm9tIHRoZSBidWZmZXIuXG4gIC8vXG4gIC8vIDIuIElmIHRoYXQgcmVzdWx0aW5nIHN0YXRlIHdpbGwgdHJpZ2dlciBhIF9yZWFkLCB0aGVuIGNhbGwgX3JlYWQuXG4gIC8vIE5vdGUgdGhhdCB0aGlzIG1heSBiZSBhc3luY2hyb25vdXMsIG9yIHN5bmNocm9ub3VzLiAgWWVzLCBpdCBpc1xuICAvLyBkZWVwbHkgdWdseSB0byB3cml0ZSBBUElzIHRoaXMgd2F5LCBidXQgdGhhdCBzdGlsbCBkb2Vzbid0IG1lYW5cbiAgLy8gdGhhdCB0aGUgUmVhZGFibGUgY2xhc3Mgc2hvdWxkIGJlaGF2ZSBpbXByb3Blcmx5LCBhcyBzdHJlYW1zIGFyZVxuICAvLyBkZXNpZ25lZCB0byBiZSBzeW5jL2FzeW5jIGFnbm9zdGljLlxuICAvLyBUYWtlIG5vdGUgaWYgdGhlIF9yZWFkIGNhbGwgaXMgc3luYyBvciBhc3luYyAoaWUsIGlmIHRoZSByZWFkIGNhbGxcbiAgLy8gaGFzIHJldHVybmVkIHlldCksIHNvIHRoYXQgd2Uga25vdyB3aGV0aGVyIG9yIG5vdCBpdCdzIHNhZmUgdG8gZW1pdFxuICAvLyAncmVhZGFibGUnIGV0Yy5cbiAgLy9cbiAgLy8gMy4gQWN0dWFsbHkgcHVsbCB0aGUgcmVxdWVzdGVkIGNodW5rcyBvdXQgb2YgdGhlIGJ1ZmZlciBhbmQgcmV0dXJuLlxuXG4gIC8vIGlmIHdlIG5lZWQgYSByZWFkYWJsZSBldmVudCwgdGhlbiB3ZSBuZWVkIHRvIGRvIHNvbWUgcmVhZGluZy5cbiAgdmFyIGRvUmVhZCA9IHN0YXRlLm5lZWRSZWFkYWJsZTtcbiAgZGVidWcoJ25lZWQgcmVhZGFibGUnLCBkb1JlYWQpO1xuXG4gIC8vIGlmIHdlIGN1cnJlbnRseSBoYXZlIGxlc3MgdGhhbiB0aGUgaGlnaFdhdGVyTWFyaywgdGhlbiBhbHNvIHJlYWQgc29tZVxuICBpZiAoc3RhdGUubGVuZ3RoID09PSAwIHx8IHN0YXRlLmxlbmd0aCAtIG4gPCBzdGF0ZS5oaWdoV2F0ZXJNYXJrKSB7XG4gICAgZG9SZWFkID0gdHJ1ZTtcbiAgICBkZWJ1ZygnbGVuZ3RoIGxlc3MgdGhhbiB3YXRlcm1hcmsnLCBkb1JlYWQpO1xuICB9XG5cbiAgLy8gaG93ZXZlciwgaWYgd2UndmUgZW5kZWQsIHRoZW4gdGhlcmUncyBubyBwb2ludCwgYW5kIGlmIHdlJ3JlIGFscmVhZHlcbiAgLy8gcmVhZGluZywgdGhlbiBpdCdzIHVubmVjZXNzYXJ5LlxuICBpZiAoc3RhdGUuZW5kZWQgfHwgc3RhdGUucmVhZGluZykge1xuICAgIGRvUmVhZCA9IGZhbHNlO1xuICAgIGRlYnVnKCdyZWFkaW5nIG9yIGVuZGVkJywgZG9SZWFkKTtcbiAgfVxuXG4gIGlmIChkb1JlYWQpIHtcbiAgICBkZWJ1ZygnZG8gcmVhZCcpO1xuICAgIHN0YXRlLnJlYWRpbmcgPSB0cnVlO1xuICAgIHN0YXRlLnN5bmMgPSB0cnVlO1xuICAgIC8vIGlmIHRoZSBsZW5ndGggaXMgY3VycmVudGx5IHplcm8sIHRoZW4gd2UgKm5lZWQqIGEgcmVhZGFibGUgZXZlbnQuXG4gICAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMClcbiAgICAgIHN0YXRlLm5lZWRSZWFkYWJsZSA9IHRydWU7XG4gICAgLy8gY2FsbCBpbnRlcm5hbCByZWFkIG1ldGhvZFxuICAgIHRoaXMuX3JlYWQoc3RhdGUuaGlnaFdhdGVyTWFyayk7XG4gICAgc3RhdGUuc3luYyA9IGZhbHNlO1xuICB9XG5cbiAgLy8gSWYgX3JlYWQgcHVzaGVkIGRhdGEgc3luY2hyb25vdXNseSwgdGhlbiBgcmVhZGluZ2Agd2lsbCBiZSBmYWxzZSxcbiAgLy8gYW5kIHdlIG5lZWQgdG8gcmUtZXZhbHVhdGUgaG93IG11Y2ggZGF0YSB3ZSBjYW4gcmV0dXJuIHRvIHRoZSB1c2VyLlxuICBpZiAoZG9SZWFkICYmICFzdGF0ZS5yZWFkaW5nKVxuICAgIG4gPSBob3dNdWNoVG9SZWFkKG5PcmlnLCBzdGF0ZSk7XG5cbiAgdmFyIHJldDtcbiAgaWYgKG4gPiAwKVxuICAgIHJldCA9IGZyb21MaXN0KG4sIHN0YXRlKTtcbiAgZWxzZVxuICAgIHJldCA9IG51bGw7XG5cbiAgaWYgKHV0aWwuaXNOdWxsKHJldCkpIHtcbiAgICBzdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlO1xuICAgIG4gPSAwO1xuICB9XG5cbiAgc3RhdGUubGVuZ3RoIC09IG47XG5cbiAgLy8gSWYgd2UgaGF2ZSBub3RoaW5nIGluIHRoZSBidWZmZXIsIHRoZW4gd2Ugd2FudCB0byBrbm93XG4gIC8vIGFzIHNvb24gYXMgd2UgKmRvKiBnZXQgc29tZXRoaW5nIGludG8gdGhlIGJ1ZmZlci5cbiAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCAmJiAhc3RhdGUuZW5kZWQpXG4gICAgc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcblxuICAvLyBJZiB3ZSB0cmllZCB0byByZWFkKCkgcGFzdCB0aGUgRU9GLCB0aGVuIGVtaXQgZW5kIG9uIHRoZSBuZXh0IHRpY2suXG4gIGlmIChuT3JpZyAhPT0gbiAmJiBzdGF0ZS5lbmRlZCAmJiBzdGF0ZS5sZW5ndGggPT09IDApXG4gICAgZW5kUmVhZGFibGUodGhpcyk7XG5cbiAgaWYgKCF1dGlsLmlzTnVsbChyZXQpKVxuICAgIHRoaXMuZW1pdCgnZGF0YScsIHJldCk7XG5cbiAgcmV0dXJuIHJldDtcbn07XG5cbmZ1bmN0aW9uIGNodW5rSW52YWxpZChzdGF0ZSwgY2h1bmspIHtcbiAgdmFyIGVyID0gbnVsbDtcbiAgaWYgKCF1dGlsLmlzQnVmZmVyKGNodW5rKSAmJlxuICAgICAgIXV0aWwuaXNTdHJpbmcoY2h1bmspICYmXG4gICAgICAhdXRpbC5pc051bGxPclVuZGVmaW5lZChjaHVuaykgJiZcbiAgICAgICFzdGF0ZS5vYmplY3RNb2RlKSB7XG4gICAgZXIgPSBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIG5vbi1zdHJpbmcvYnVmZmVyIGNodW5rJyk7XG4gIH1cbiAgcmV0dXJuIGVyO1xufVxuXG5cbmZ1bmN0aW9uIG9uRW9mQ2h1bmsoc3RyZWFtLCBzdGF0ZSkge1xuICBpZiAoc3RhdGUuZGVjb2RlciAmJiAhc3RhdGUuZW5kZWQpIHtcbiAgICB2YXIgY2h1bmsgPSBzdGF0ZS5kZWNvZGVyLmVuZCgpO1xuICAgIGlmIChjaHVuayAmJiBjaHVuay5sZW5ndGgpIHtcbiAgICAgIHN0YXRlLmJ1ZmZlci5wdXNoKGNodW5rKTtcbiAgICAgIHN0YXRlLmxlbmd0aCArPSBzdGF0ZS5vYmplY3RNb2RlID8gMSA6IGNodW5rLmxlbmd0aDtcbiAgICB9XG4gIH1cbiAgc3RhdGUuZW5kZWQgPSB0cnVlO1xuXG4gIC8vIGVtaXQgJ3JlYWRhYmxlJyBub3cgdG8gbWFrZSBzdXJlIGl0IGdldHMgcGlja2VkIHVwLlxuICBlbWl0UmVhZGFibGUoc3RyZWFtKTtcbn1cblxuLy8gRG9uJ3QgZW1pdCByZWFkYWJsZSByaWdodCBhd2F5IGluIHN5bmMgbW9kZSwgYmVjYXVzZSB0aGlzIGNhbiB0cmlnZ2VyXG4vLyBhbm90aGVyIHJlYWQoKSBjYWxsID0+IHN0YWNrIG92ZXJmbG93LiAgVGhpcyB3YXksIGl0IG1pZ2h0IHRyaWdnZXJcbi8vIGEgbmV4dFRpY2sgcmVjdXJzaW9uIHdhcm5pbmcsIGJ1dCB0aGF0J3Mgbm90IHNvIGJhZC5cbmZ1bmN0aW9uIGVtaXRSZWFkYWJsZShzdHJlYW0pIHtcbiAgdmFyIHN0YXRlID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlO1xuICBzdGF0ZS5uZWVkUmVhZGFibGUgPSBmYWxzZTtcbiAgaWYgKCFzdGF0ZS5lbWl0dGVkUmVhZGFibGUpIHtcbiAgICBkZWJ1ZygnZW1pdFJlYWRhYmxlJywgc3RhdGUuZmxvd2luZyk7XG4gICAgc3RhdGUuZW1pdHRlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICBpZiAoc3RhdGUuc3luYylcbiAgICAgIHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24oKSB7XG4gICAgICAgIGVtaXRSZWFkYWJsZV8oc3RyZWFtKTtcbiAgICAgIH0pO1xuICAgIGVsc2VcbiAgICAgIGVtaXRSZWFkYWJsZV8oc3RyZWFtKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBlbWl0UmVhZGFibGVfKHN0cmVhbSkge1xuICBkZWJ1ZygnZW1pdCByZWFkYWJsZScpO1xuICBzdHJlYW0uZW1pdCgncmVhZGFibGUnKTtcbiAgZmxvdyhzdHJlYW0pO1xufVxuXG5cbi8vIGF0IHRoaXMgcG9pbnQsIHRoZSB1c2VyIGhhcyBwcmVzdW1hYmx5IHNlZW4gdGhlICdyZWFkYWJsZScgZXZlbnQsXG4vLyBhbmQgY2FsbGVkIHJlYWQoKSB0byBjb25zdW1lIHNvbWUgZGF0YS4gIHRoYXQgbWF5IGhhdmUgdHJpZ2dlcmVkXG4vLyBpbiB0dXJuIGFub3RoZXIgX3JlYWQobikgY2FsbCwgaW4gd2hpY2ggY2FzZSByZWFkaW5nID0gdHJ1ZSBpZlxuLy8gaXQncyBpbiBwcm9ncmVzcy5cbi8vIEhvd2V2ZXIsIGlmIHdlJ3JlIG5vdCBlbmRlZCwgb3IgcmVhZGluZywgYW5kIHRoZSBsZW5ndGggPCBod20sXG4vLyB0aGVuIGdvIGFoZWFkIGFuZCB0cnkgdG8gcmVhZCBzb21lIG1vcmUgcHJlZW1wdGl2ZWx5LlxuZnVuY3Rpb24gbWF5YmVSZWFkTW9yZShzdHJlYW0sIHN0YXRlKSB7XG4gIGlmICghc3RhdGUucmVhZGluZ01vcmUpIHtcbiAgICBzdGF0ZS5yZWFkaW5nTW9yZSA9IHRydWU7XG4gICAgcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbigpIHtcbiAgICAgIG1heWJlUmVhZE1vcmVfKHN0cmVhbSwgc3RhdGUpO1xuICAgIH0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1heWJlUmVhZE1vcmVfKHN0cmVhbSwgc3RhdGUpIHtcbiAgdmFyIGxlbiA9IHN0YXRlLmxlbmd0aDtcbiAgd2hpbGUgKCFzdGF0ZS5yZWFkaW5nICYmICFzdGF0ZS5mbG93aW5nICYmICFzdGF0ZS5lbmRlZCAmJlxuICAgICAgICAgc3RhdGUubGVuZ3RoIDwgc3RhdGUuaGlnaFdhdGVyTWFyaykge1xuICAgIGRlYnVnKCdtYXliZVJlYWRNb3JlIHJlYWQgMCcpO1xuICAgIHN0cmVhbS5yZWFkKDApO1xuICAgIGlmIChsZW4gPT09IHN0YXRlLmxlbmd0aClcbiAgICAgIC8vIGRpZG4ndCBnZXQgYW55IGRhdGEsIHN0b3Agc3Bpbm5pbmcuXG4gICAgICBicmVhaztcbiAgICBlbHNlXG4gICAgICBsZW4gPSBzdGF0ZS5sZW5ndGg7XG4gIH1cbiAgc3RhdGUucmVhZGluZ01vcmUgPSBmYWxzZTtcbn1cblxuLy8gYWJzdHJhY3QgbWV0aG9kLiAgdG8gYmUgb3ZlcnJpZGRlbiBpbiBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBjbGFzc2VzLlxuLy8gY2FsbCBjYihlciwgZGF0YSkgd2hlcmUgZGF0YSBpcyA8PSBuIGluIGxlbmd0aC5cbi8vIGZvciB2aXJ0dWFsIChub24tc3RyaW5nLCBub24tYnVmZmVyKSBzdHJlYW1zLCBcImxlbmd0aFwiIGlzIHNvbWV3aGF0XG4vLyBhcmJpdHJhcnksIGFuZCBwZXJoYXBzIG5vdCB2ZXJ5IG1lYW5pbmdmdWwuXG5SZWFkYWJsZS5wcm90b3R5cGUuX3JlYWQgPSBmdW5jdGlvbihuKSB7XG4gIHRoaXMuZW1pdCgnZXJyb3InLCBuZXcgRXJyb3IoJ25vdCBpbXBsZW1lbnRlZCcpKTtcbn07XG5cblJlYWRhYmxlLnByb3RvdHlwZS5waXBlID0gZnVuY3Rpb24oZGVzdCwgcGlwZU9wdHMpIHtcbiAgdmFyIHNyYyA9IHRoaXM7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG5cbiAgc3dpdGNoIChzdGF0ZS5waXBlc0NvdW50KSB7XG4gICAgY2FzZSAwOlxuICAgICAgc3RhdGUucGlwZXMgPSBkZXN0O1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAxOlxuICAgICAgc3RhdGUucGlwZXMgPSBbc3RhdGUucGlwZXMsIGRlc3RdO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHN0YXRlLnBpcGVzLnB1c2goZGVzdCk7XG4gICAgICBicmVhaztcbiAgfVxuICBzdGF0ZS5waXBlc0NvdW50ICs9IDE7XG4gIGRlYnVnKCdwaXBlIGNvdW50PSVkIG9wdHM9JWonLCBzdGF0ZS5waXBlc0NvdW50LCBwaXBlT3B0cyk7XG5cbiAgdmFyIGRvRW5kID0gKCFwaXBlT3B0cyB8fCBwaXBlT3B0cy5lbmQgIT09IGZhbHNlKSAmJlxuICAgICAgICAgICAgICBkZXN0ICE9PSBwcm9jZXNzLnN0ZG91dCAmJlxuICAgICAgICAgICAgICBkZXN0ICE9PSBwcm9jZXNzLnN0ZGVycjtcblxuICB2YXIgZW5kRm4gPSBkb0VuZCA/IG9uZW5kIDogY2xlYW51cDtcbiAgaWYgKHN0YXRlLmVuZEVtaXR0ZWQpXG4gICAgcHJvY2Vzcy5uZXh0VGljayhlbmRGbik7XG4gIGVsc2VcbiAgICBzcmMub25jZSgnZW5kJywgZW5kRm4pO1xuXG4gIGRlc3Qub24oJ3VucGlwZScsIG9udW5waXBlKTtcbiAgZnVuY3Rpb24gb251bnBpcGUocmVhZGFibGUpIHtcbiAgICBkZWJ1Zygnb251bnBpcGUnKTtcbiAgICBpZiAocmVhZGFibGUgPT09IHNyYykge1xuICAgICAgY2xlYW51cCgpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG9uZW5kKCkge1xuICAgIGRlYnVnKCdvbmVuZCcpO1xuICAgIGRlc3QuZW5kKCk7XG4gIH1cblxuICAvLyB3aGVuIHRoZSBkZXN0IGRyYWlucywgaXQgcmVkdWNlcyB0aGUgYXdhaXREcmFpbiBjb3VudGVyXG4gIC8vIG9uIHRoZSBzb3VyY2UuICBUaGlzIHdvdWxkIGJlIG1vcmUgZWxlZ2FudCB3aXRoIGEgLm9uY2UoKVxuICAvLyBoYW5kbGVyIGluIGZsb3coKSwgYnV0IGFkZGluZyBhbmQgcmVtb3ZpbmcgcmVwZWF0ZWRseSBpc1xuICAvLyB0b28gc2xvdy5cbiAgdmFyIG9uZHJhaW4gPSBwaXBlT25EcmFpbihzcmMpO1xuICBkZXN0Lm9uKCdkcmFpbicsIG9uZHJhaW4pO1xuXG4gIGZ1bmN0aW9uIGNsZWFudXAoKSB7XG4gICAgZGVidWcoJ2NsZWFudXAnKTtcbiAgICAvLyBjbGVhbnVwIGV2ZW50IGhhbmRsZXJzIG9uY2UgdGhlIHBpcGUgaXMgYnJva2VuXG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLCBvbmNsb3NlKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdmaW5pc2gnLCBvbmZpbmlzaCk7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZHJhaW4nLCBvbmRyYWluKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdlcnJvcicsIG9uZXJyb3IpO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ3VucGlwZScsIG9udW5waXBlKTtcbiAgICBzcmMucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIG9uZW5kKTtcbiAgICBzcmMucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIGNsZWFudXApO1xuICAgIHNyYy5yZW1vdmVMaXN0ZW5lcignZGF0YScsIG9uZGF0YSk7XG5cbiAgICAvLyBpZiB0aGUgcmVhZGVyIGlzIHdhaXRpbmcgZm9yIGEgZHJhaW4gZXZlbnQgZnJvbSB0aGlzXG4gICAgLy8gc3BlY2lmaWMgd3JpdGVyLCB0aGVuIGl0IHdvdWxkIGNhdXNlIGl0IHRvIG5ldmVyIHN0YXJ0XG4gICAgLy8gZmxvd2luZyBhZ2Fpbi5cbiAgICAvLyBTbywgaWYgdGhpcyBpcyBhd2FpdGluZyBhIGRyYWluLCB0aGVuIHdlIGp1c3QgY2FsbCBpdCBub3cuXG4gICAgLy8gSWYgd2UgZG9uJ3Qga25vdywgdGhlbiBhc3N1bWUgdGhhdCB3ZSBhcmUgd2FpdGluZyBmb3Igb25lLlxuICAgIGlmIChzdGF0ZS5hd2FpdERyYWluICYmXG4gICAgICAgICghZGVzdC5fd3JpdGFibGVTdGF0ZSB8fCBkZXN0Ll93cml0YWJsZVN0YXRlLm5lZWREcmFpbikpXG4gICAgICBvbmRyYWluKCk7XG4gIH1cblxuICBzcmMub24oJ2RhdGEnLCBvbmRhdGEpO1xuICBmdW5jdGlvbiBvbmRhdGEoY2h1bmspIHtcbiAgICBkZWJ1Zygnb25kYXRhJyk7XG4gICAgdmFyIHJldCA9IGRlc3Qud3JpdGUoY2h1bmspO1xuICAgIGlmIChmYWxzZSA9PT0gcmV0KSB7XG4gICAgICBkZWJ1ZygnZmFsc2Ugd3JpdGUgcmVzcG9uc2UsIHBhdXNlJyxcbiAgICAgICAgICAgIHNyYy5fcmVhZGFibGVTdGF0ZS5hd2FpdERyYWluKTtcbiAgICAgIHNyYy5fcmVhZGFibGVTdGF0ZS5hd2FpdERyYWluKys7XG4gICAgICBzcmMucGF1c2UoKTtcbiAgICB9XG4gIH1cblxuICAvLyBpZiB0aGUgZGVzdCBoYXMgYW4gZXJyb3IsIHRoZW4gc3RvcCBwaXBpbmcgaW50byBpdC5cbiAgLy8gaG93ZXZlciwgZG9uJ3Qgc3VwcHJlc3MgdGhlIHRocm93aW5nIGJlaGF2aW9yIGZvciB0aGlzLlxuICBmdW5jdGlvbiBvbmVycm9yKGVyKSB7XG4gICAgZGVidWcoJ29uZXJyb3InLCBlcik7XG4gICAgdW5waXBlKCk7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBvbmVycm9yKTtcbiAgICBpZiAoRUUubGlzdGVuZXJDb3VudChkZXN0LCAnZXJyb3InKSA9PT0gMClcbiAgICAgIGRlc3QuZW1pdCgnZXJyb3InLCBlcik7XG4gIH1cbiAgLy8gVGhpcyBpcyBhIGJydXRhbGx5IHVnbHkgaGFjayB0byBtYWtlIHN1cmUgdGhhdCBvdXIgZXJyb3IgaGFuZGxlclxuICAvLyBpcyBhdHRhY2hlZCBiZWZvcmUgYW55IHVzZXJsYW5kIG9uZXMuICBORVZFUiBETyBUSElTLlxuICBpZiAoIWRlc3QuX2V2ZW50cyB8fCAhZGVzdC5fZXZlbnRzLmVycm9yKVxuICAgIGRlc3Qub24oJ2Vycm9yJywgb25lcnJvcik7XG4gIGVsc2UgaWYgKGlzQXJyYXkoZGVzdC5fZXZlbnRzLmVycm9yKSlcbiAgICBkZXN0Ll9ldmVudHMuZXJyb3IudW5zaGlmdChvbmVycm9yKTtcbiAgZWxzZVxuICAgIGRlc3QuX2V2ZW50cy5lcnJvciA9IFtvbmVycm9yLCBkZXN0Ll9ldmVudHMuZXJyb3JdO1xuXG5cblxuICAvLyBCb3RoIGNsb3NlIGFuZCBmaW5pc2ggc2hvdWxkIHRyaWdnZXIgdW5waXBlLCBidXQgb25seSBvbmNlLlxuICBmdW5jdGlvbiBvbmNsb3NlKCkge1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2ZpbmlzaCcsIG9uZmluaXNoKTtcbiAgICB1bnBpcGUoKTtcbiAgfVxuICBkZXN0Lm9uY2UoJ2Nsb3NlJywgb25jbG9zZSk7XG4gIGZ1bmN0aW9uIG9uZmluaXNoKCkge1xuICAgIGRlYnVnKCdvbmZpbmlzaCcpO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2Nsb3NlJywgb25jbG9zZSk7XG4gICAgdW5waXBlKCk7XG4gIH1cbiAgZGVzdC5vbmNlKCdmaW5pc2gnLCBvbmZpbmlzaCk7XG5cbiAgZnVuY3Rpb24gdW5waXBlKCkge1xuICAgIGRlYnVnKCd1bnBpcGUnKTtcbiAgICBzcmMudW5waXBlKGRlc3QpO1xuICB9XG5cbiAgLy8gdGVsbCB0aGUgZGVzdCB0aGF0IGl0J3MgYmVpbmcgcGlwZWQgdG9cbiAgZGVzdC5lbWl0KCdwaXBlJywgc3JjKTtcblxuICAvLyBzdGFydCB0aGUgZmxvdyBpZiBpdCBoYXNuJ3QgYmVlbiBzdGFydGVkIGFscmVhZHkuXG4gIGlmICghc3RhdGUuZmxvd2luZykge1xuICAgIGRlYnVnKCdwaXBlIHJlc3VtZScpO1xuICAgIHNyYy5yZXN1bWUoKTtcbiAgfVxuXG4gIHJldHVybiBkZXN0O1xufTtcblxuZnVuY3Rpb24gcGlwZU9uRHJhaW4oc3JjKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc3RhdGUgPSBzcmMuX3JlYWRhYmxlU3RhdGU7XG4gICAgZGVidWcoJ3BpcGVPbkRyYWluJywgc3RhdGUuYXdhaXREcmFpbik7XG4gICAgaWYgKHN0YXRlLmF3YWl0RHJhaW4pXG4gICAgICBzdGF0ZS5hd2FpdERyYWluLS07XG4gICAgaWYgKHN0YXRlLmF3YWl0RHJhaW4gPT09IDAgJiYgRUUubGlzdGVuZXJDb3VudChzcmMsICdkYXRhJykpIHtcbiAgICAgIHN0YXRlLmZsb3dpbmcgPSB0cnVlO1xuICAgICAgZmxvdyhzcmMpO1xuICAgIH1cbiAgfTtcbn1cblxuXG5SZWFkYWJsZS5wcm90b3R5cGUudW5waXBlID0gZnVuY3Rpb24oZGVzdCkge1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuXG4gIC8vIGlmIHdlJ3JlIG5vdCBwaXBpbmcgYW55d2hlcmUsIHRoZW4gZG8gbm90aGluZy5cbiAgaWYgKHN0YXRlLnBpcGVzQ291bnQgPT09IDApXG4gICAgcmV0dXJuIHRoaXM7XG5cbiAgLy8ganVzdCBvbmUgZGVzdGluYXRpb24uICBtb3N0IGNvbW1vbiBjYXNlLlxuICBpZiAoc3RhdGUucGlwZXNDb3VudCA9PT0gMSkge1xuICAgIC8vIHBhc3NlZCBpbiBvbmUsIGJ1dCBpdCdzIG5vdCB0aGUgcmlnaHQgb25lLlxuICAgIGlmIChkZXN0ICYmIGRlc3QgIT09IHN0YXRlLnBpcGVzKVxuICAgICAgcmV0dXJuIHRoaXM7XG5cbiAgICBpZiAoIWRlc3QpXG4gICAgICBkZXN0ID0gc3RhdGUucGlwZXM7XG5cbiAgICAvLyBnb3QgYSBtYXRjaC5cbiAgICBzdGF0ZS5waXBlcyA9IG51bGw7XG4gICAgc3RhdGUucGlwZXNDb3VudCA9IDA7XG4gICAgc3RhdGUuZmxvd2luZyA9IGZhbHNlO1xuICAgIGlmIChkZXN0KVxuICAgICAgZGVzdC5lbWl0KCd1bnBpcGUnLCB0aGlzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIHNsb3cgY2FzZS4gbXVsdGlwbGUgcGlwZSBkZXN0aW5hdGlvbnMuXG5cbiAgaWYgKCFkZXN0KSB7XG4gICAgLy8gcmVtb3ZlIGFsbC5cbiAgICB2YXIgZGVzdHMgPSBzdGF0ZS5waXBlcztcbiAgICB2YXIgbGVuID0gc3RhdGUucGlwZXNDb3VudDtcbiAgICBzdGF0ZS5waXBlcyA9IG51bGw7XG4gICAgc3RhdGUucGlwZXNDb3VudCA9IDA7XG4gICAgc3RhdGUuZmxvd2luZyA9IGZhbHNlO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKylcbiAgICAgIGRlc3RzW2ldLmVtaXQoJ3VucGlwZScsIHRoaXMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gdHJ5IHRvIGZpbmQgdGhlIHJpZ2h0IG9uZS5cbiAgdmFyIGkgPSBpbmRleE9mKHN0YXRlLnBpcGVzLCBkZXN0KTtcbiAgaWYgKGkgPT09IC0xKVxuICAgIHJldHVybiB0aGlzO1xuXG4gIHN0YXRlLnBpcGVzLnNwbGljZShpLCAxKTtcbiAgc3RhdGUucGlwZXNDb3VudCAtPSAxO1xuICBpZiAoc3RhdGUucGlwZXNDb3VudCA9PT0gMSlcbiAgICBzdGF0ZS5waXBlcyA9IHN0YXRlLnBpcGVzWzBdO1xuXG4gIGRlc3QuZW1pdCgndW5waXBlJywgdGhpcyk7XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vLyBzZXQgdXAgZGF0YSBldmVudHMgaWYgdGhleSBhcmUgYXNrZWQgZm9yXG4vLyBFbnN1cmUgcmVhZGFibGUgbGlzdGVuZXJzIGV2ZW50dWFsbHkgZ2V0IHNvbWV0aGluZ1xuUmVhZGFibGUucHJvdG90eXBlLm9uID0gZnVuY3Rpb24oZXYsIGZuKSB7XG4gIHZhciByZXMgPSBTdHJlYW0ucHJvdG90eXBlLm9uLmNhbGwodGhpcywgZXYsIGZuKTtcblxuICAvLyBJZiBsaXN0ZW5pbmcgdG8gZGF0YSwgYW5kIGl0IGhhcyBub3QgZXhwbGljaXRseSBiZWVuIHBhdXNlZCxcbiAgLy8gdGhlbiBjYWxsIHJlc3VtZSB0byBzdGFydCB0aGUgZmxvdyBvZiBkYXRhIG9uIHRoZSBuZXh0IHRpY2suXG4gIGlmIChldiA9PT0gJ2RhdGEnICYmIGZhbHNlICE9PSB0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcpIHtcbiAgICB0aGlzLnJlc3VtZSgpO1xuICB9XG5cbiAgaWYgKGV2ID09PSAncmVhZGFibGUnICYmIHRoaXMucmVhZGFibGUpIHtcbiAgICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICAgIGlmICghc3RhdGUucmVhZGFibGVMaXN0ZW5pbmcpIHtcbiAgICAgIHN0YXRlLnJlYWRhYmxlTGlzdGVuaW5nID0gdHJ1ZTtcbiAgICAgIHN0YXRlLmVtaXR0ZWRSZWFkYWJsZSA9IGZhbHNlO1xuICAgICAgc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICAgIGlmICghc3RhdGUucmVhZGluZykge1xuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICAgIHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24oKSB7XG4gICAgICAgICAgZGVidWcoJ3JlYWRhYmxlIG5leHR0aWNrIHJlYWQgMCcpO1xuICAgICAgICAgIHNlbGYucmVhZCgwKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKHN0YXRlLmxlbmd0aCkge1xuICAgICAgICBlbWl0UmVhZGFibGUodGhpcywgc3RhdGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXM7XG59O1xuUmVhZGFibGUucHJvdG90eXBlLmFkZExpc3RlbmVyID0gUmVhZGFibGUucHJvdG90eXBlLm9uO1xuXG4vLyBwYXVzZSgpIGFuZCByZXN1bWUoKSBhcmUgcmVtbmFudHMgb2YgdGhlIGxlZ2FjeSByZWFkYWJsZSBzdHJlYW0gQVBJXG4vLyBJZiB0aGUgdXNlciB1c2VzIHRoZW0sIHRoZW4gc3dpdGNoIGludG8gb2xkIG1vZGUuXG5SZWFkYWJsZS5wcm90b3R5cGUucmVzdW1lID0gZnVuY3Rpb24oKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gIGlmICghc3RhdGUuZmxvd2luZykge1xuICAgIGRlYnVnKCdyZXN1bWUnKTtcbiAgICBzdGF0ZS5mbG93aW5nID0gdHJ1ZTtcbiAgICBpZiAoIXN0YXRlLnJlYWRpbmcpIHtcbiAgICAgIGRlYnVnKCdyZXN1bWUgcmVhZCAwJyk7XG4gICAgICB0aGlzLnJlYWQoMCk7XG4gICAgfVxuICAgIHJlc3VtZSh0aGlzLCBzdGF0ZSk7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5mdW5jdGlvbiByZXN1bWUoc3RyZWFtLCBzdGF0ZSkge1xuICBpZiAoIXN0YXRlLnJlc3VtZVNjaGVkdWxlZCkge1xuICAgIHN0YXRlLnJlc3VtZVNjaGVkdWxlZCA9IHRydWU7XG4gICAgcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbigpIHtcbiAgICAgIHJlc3VtZV8oc3RyZWFtLCBzdGF0ZSk7XG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzdW1lXyhzdHJlYW0sIHN0YXRlKSB7XG4gIHN0YXRlLnJlc3VtZVNjaGVkdWxlZCA9IGZhbHNlO1xuICBzdHJlYW0uZW1pdCgncmVzdW1lJyk7XG4gIGZsb3coc3RyZWFtKTtcbiAgaWYgKHN0YXRlLmZsb3dpbmcgJiYgIXN0YXRlLnJlYWRpbmcpXG4gICAgc3RyZWFtLnJlYWQoMCk7XG59XG5cblJlYWRhYmxlLnByb3RvdHlwZS5wYXVzZSA9IGZ1bmN0aW9uKCkge1xuICBkZWJ1ZygnY2FsbCBwYXVzZSBmbG93aW5nPSVqJywgdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nKTtcbiAgaWYgKGZhbHNlICE9PSB0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcpIHtcbiAgICBkZWJ1ZygncGF1c2UnKTtcbiAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcgPSBmYWxzZTtcbiAgICB0aGlzLmVtaXQoJ3BhdXNlJyk7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5mdW5jdGlvbiBmbG93KHN0cmVhbSkge1xuICB2YXIgc3RhdGUgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGU7XG4gIGRlYnVnKCdmbG93Jywgc3RhdGUuZmxvd2luZyk7XG4gIGlmIChzdGF0ZS5mbG93aW5nKSB7XG4gICAgZG8ge1xuICAgICAgdmFyIGNodW5rID0gc3RyZWFtLnJlYWQoKTtcbiAgICB9IHdoaWxlIChudWxsICE9PSBjaHVuayAmJiBzdGF0ZS5mbG93aW5nKTtcbiAgfVxufVxuXG4vLyB3cmFwIGFuIG9sZC1zdHlsZSBzdHJlYW0gYXMgdGhlIGFzeW5jIGRhdGEgc291cmNlLlxuLy8gVGhpcyBpcyAqbm90KiBwYXJ0IG9mIHRoZSByZWFkYWJsZSBzdHJlYW0gaW50ZXJmYWNlLlxuLy8gSXQgaXMgYW4gdWdseSB1bmZvcnR1bmF0ZSBtZXNzIG9mIGhpc3RvcnkuXG5SZWFkYWJsZS5wcm90b3R5cGUud3JhcCA9IGZ1bmN0aW9uKHN0cmVhbSkge1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICB2YXIgcGF1c2VkID0gZmFsc2U7XG5cbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBzdHJlYW0ub24oJ2VuZCcsIGZ1bmN0aW9uKCkge1xuICAgIGRlYnVnKCd3cmFwcGVkIGVuZCcpO1xuICAgIGlmIChzdGF0ZS5kZWNvZGVyICYmICFzdGF0ZS5lbmRlZCkge1xuICAgICAgdmFyIGNodW5rID0gc3RhdGUuZGVjb2Rlci5lbmQoKTtcbiAgICAgIGlmIChjaHVuayAmJiBjaHVuay5sZW5ndGgpXG4gICAgICAgIHNlbGYucHVzaChjaHVuayk7XG4gICAgfVxuXG4gICAgc2VsZi5wdXNoKG51bGwpO1xuICB9KTtcblxuICBzdHJlYW0ub24oJ2RhdGEnLCBmdW5jdGlvbihjaHVuaykge1xuICAgIGRlYnVnKCd3cmFwcGVkIGRhdGEnKTtcbiAgICBpZiAoc3RhdGUuZGVjb2RlcilcbiAgICAgIGNodW5rID0gc3RhdGUuZGVjb2Rlci53cml0ZShjaHVuayk7XG4gICAgaWYgKCFjaHVuayB8fCAhc3RhdGUub2JqZWN0TW9kZSAmJiAhY2h1bmsubGVuZ3RoKVxuICAgICAgcmV0dXJuO1xuXG4gICAgdmFyIHJldCA9IHNlbGYucHVzaChjaHVuayk7XG4gICAgaWYgKCFyZXQpIHtcbiAgICAgIHBhdXNlZCA9IHRydWU7XG4gICAgICBzdHJlYW0ucGF1c2UoKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIHByb3h5IGFsbCB0aGUgb3RoZXIgbWV0aG9kcy5cbiAgLy8gaW1wb3J0YW50IHdoZW4gd3JhcHBpbmcgZmlsdGVycyBhbmQgZHVwbGV4ZXMuXG4gIGZvciAodmFyIGkgaW4gc3RyZWFtKSB7XG4gICAgaWYgKHV0aWwuaXNGdW5jdGlvbihzdHJlYW1baV0pICYmIHV0aWwuaXNVbmRlZmluZWQodGhpc1tpXSkpIHtcbiAgICAgIHRoaXNbaV0gPSBmdW5jdGlvbihtZXRob2QpIHsgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gc3RyZWFtW21ldGhvZF0uYXBwbHkoc3RyZWFtLCBhcmd1bWVudHMpO1xuICAgICAgfX0oaSk7XG4gICAgfVxuICB9XG5cbiAgLy8gcHJveHkgY2VydGFpbiBpbXBvcnRhbnQgZXZlbnRzLlxuICB2YXIgZXZlbnRzID0gWydlcnJvcicsICdjbG9zZScsICdkZXN0cm95JywgJ3BhdXNlJywgJ3Jlc3VtZSddO1xuICBmb3JFYWNoKGV2ZW50cywgZnVuY3Rpb24oZXYpIHtcbiAgICBzdHJlYW0ub24oZXYsIHNlbGYuZW1pdC5iaW5kKHNlbGYsIGV2KSk7XG4gIH0pO1xuXG4gIC8vIHdoZW4gd2UgdHJ5IHRvIGNvbnN1bWUgc29tZSBtb3JlIGJ5dGVzLCBzaW1wbHkgdW5wYXVzZSB0aGVcbiAgLy8gdW5kZXJseWluZyBzdHJlYW0uXG4gIHNlbGYuX3JlYWQgPSBmdW5jdGlvbihuKSB7XG4gICAgZGVidWcoJ3dyYXBwZWQgX3JlYWQnLCBuKTtcbiAgICBpZiAocGF1c2VkKSB7XG4gICAgICBwYXVzZWQgPSBmYWxzZTtcbiAgICAgIHN0cmVhbS5yZXN1bWUoKTtcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIHNlbGY7XG59O1xuXG5cblxuLy8gZXhwb3NlZCBmb3IgdGVzdGluZyBwdXJwb3NlcyBvbmx5LlxuUmVhZGFibGUuX2Zyb21MaXN0ID0gZnJvbUxpc3Q7XG5cbi8vIFBsdWNrIG9mZiBuIGJ5dGVzIGZyb20gYW4gYXJyYXkgb2YgYnVmZmVycy5cbi8vIExlbmd0aCBpcyB0aGUgY29tYmluZWQgbGVuZ3RocyBvZiBhbGwgdGhlIGJ1ZmZlcnMgaW4gdGhlIGxpc3QuXG5mdW5jdGlvbiBmcm9tTGlzdChuLCBzdGF0ZSkge1xuICB2YXIgbGlzdCA9IHN0YXRlLmJ1ZmZlcjtcbiAgdmFyIGxlbmd0aCA9IHN0YXRlLmxlbmd0aDtcbiAgdmFyIHN0cmluZ01vZGUgPSAhIXN0YXRlLmRlY29kZXI7XG4gIHZhciBvYmplY3RNb2RlID0gISFzdGF0ZS5vYmplY3RNb2RlO1xuICB2YXIgcmV0O1xuXG4gIC8vIG5vdGhpbmcgaW4gdGhlIGxpc3QsIGRlZmluaXRlbHkgZW1wdHkuXG4gIGlmIChsaXN0Lmxlbmd0aCA9PT0gMClcbiAgICByZXR1cm4gbnVsbDtcblxuICBpZiAobGVuZ3RoID09PSAwKVxuICAgIHJldCA9IG51bGw7XG4gIGVsc2UgaWYgKG9iamVjdE1vZGUpXG4gICAgcmV0ID0gbGlzdC5zaGlmdCgpO1xuICBlbHNlIGlmICghbiB8fCBuID49IGxlbmd0aCkge1xuICAgIC8vIHJlYWQgaXQgYWxsLCB0cnVuY2F0ZSB0aGUgYXJyYXkuXG4gICAgaWYgKHN0cmluZ01vZGUpXG4gICAgICByZXQgPSBsaXN0LmpvaW4oJycpO1xuICAgIGVsc2VcbiAgICAgIHJldCA9IEJ1ZmZlci5jb25jYXQobGlzdCwgbGVuZ3RoKTtcbiAgICBsaXN0Lmxlbmd0aCA9IDA7XG4gIH0gZWxzZSB7XG4gICAgLy8gcmVhZCBqdXN0IHNvbWUgb2YgaXQuXG4gICAgaWYgKG4gPCBsaXN0WzBdLmxlbmd0aCkge1xuICAgICAgLy8ganVzdCB0YWtlIGEgcGFydCBvZiB0aGUgZmlyc3QgbGlzdCBpdGVtLlxuICAgICAgLy8gc2xpY2UgaXMgdGhlIHNhbWUgZm9yIGJ1ZmZlcnMgYW5kIHN0cmluZ3MuXG4gICAgICB2YXIgYnVmID0gbGlzdFswXTtcbiAgICAgIHJldCA9IGJ1Zi5zbGljZSgwLCBuKTtcbiAgICAgIGxpc3RbMF0gPSBidWYuc2xpY2Uobik7XG4gICAgfSBlbHNlIGlmIChuID09PSBsaXN0WzBdLmxlbmd0aCkge1xuICAgICAgLy8gZmlyc3QgbGlzdCBpcyBhIHBlcmZlY3QgbWF0Y2hcbiAgICAgIHJldCA9IGxpc3Quc2hpZnQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gY29tcGxleCBjYXNlLlxuICAgICAgLy8gd2UgaGF2ZSBlbm91Z2ggdG8gY292ZXIgaXQsIGJ1dCBpdCBzcGFucyBwYXN0IHRoZSBmaXJzdCBidWZmZXIuXG4gICAgICBpZiAoc3RyaW5nTW9kZSlcbiAgICAgICAgcmV0ID0gJyc7XG4gICAgICBlbHNlXG4gICAgICAgIHJldCA9IG5ldyBCdWZmZXIobik7XG5cbiAgICAgIHZhciBjID0gMDtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gbGlzdC5sZW5ndGg7IGkgPCBsICYmIGMgPCBuOyBpKyspIHtcbiAgICAgICAgdmFyIGJ1ZiA9IGxpc3RbMF07XG4gICAgICAgIHZhciBjcHkgPSBNYXRoLm1pbihuIC0gYywgYnVmLmxlbmd0aCk7XG5cbiAgICAgICAgaWYgKHN0cmluZ01vZGUpXG4gICAgICAgICAgcmV0ICs9IGJ1Zi5zbGljZSgwLCBjcHkpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgYnVmLmNvcHkocmV0LCBjLCAwLCBjcHkpO1xuXG4gICAgICAgIGlmIChjcHkgPCBidWYubGVuZ3RoKVxuICAgICAgICAgIGxpc3RbMF0gPSBidWYuc2xpY2UoY3B5KTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgIGxpc3Quc2hpZnQoKTtcblxuICAgICAgICBjICs9IGNweTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmV0O1xufVxuXG5mdW5jdGlvbiBlbmRSZWFkYWJsZShzdHJlYW0pIHtcbiAgdmFyIHN0YXRlID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlO1xuXG4gIC8vIElmIHdlIGdldCBoZXJlIGJlZm9yZSBjb25zdW1pbmcgYWxsIHRoZSBieXRlcywgdGhlbiB0aGF0IGlzIGFcbiAgLy8gYnVnIGluIG5vZGUuICBTaG91bGQgbmV2ZXIgaGFwcGVuLlxuICBpZiAoc3RhdGUubGVuZ3RoID4gMClcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2VuZFJlYWRhYmxlIGNhbGxlZCBvbiBub24tZW1wdHkgc3RyZWFtJyk7XG5cbiAgaWYgKCFzdGF0ZS5lbmRFbWl0dGVkKSB7XG4gICAgc3RhdGUuZW5kZWQgPSB0cnVlO1xuICAgIHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24oKSB7XG4gICAgICAvLyBDaGVjayB0aGF0IHdlIGRpZG4ndCBnZXQgb25lIGxhc3QgdW5zaGlmdC5cbiAgICAgIGlmICghc3RhdGUuZW5kRW1pdHRlZCAmJiBzdGF0ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgc3RhdGUuZW5kRW1pdHRlZCA9IHRydWU7XG4gICAgICAgIHN0cmVhbS5yZWFkYWJsZSA9IGZhbHNlO1xuICAgICAgICBzdHJlYW0uZW1pdCgnZW5kJyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZm9yRWFjaCAoeHMsIGYpIHtcbiAgZm9yICh2YXIgaSA9IDAsIGwgPSB4cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBmKHhzW2ldLCBpKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpbmRleE9mICh4cywgeCkge1xuICBmb3IgKHZhciBpID0gMCwgbCA9IHhzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGlmICh4c1tpXSA9PT0geCkgcmV0dXJuIGk7XG4gIH1cbiAgcmV0dXJuIC0xO1xufVxuIiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cblxuLy8gYSB0cmFuc2Zvcm0gc3RyZWFtIGlzIGEgcmVhZGFibGUvd3JpdGFibGUgc3RyZWFtIHdoZXJlIHlvdSBkb1xuLy8gc29tZXRoaW5nIHdpdGggdGhlIGRhdGEuICBTb21ldGltZXMgaXQncyBjYWxsZWQgYSBcImZpbHRlclwiLFxuLy8gYnV0IHRoYXQncyBub3QgYSBncmVhdCBuYW1lIGZvciBpdCwgc2luY2UgdGhhdCBpbXBsaWVzIGEgdGhpbmcgd2hlcmVcbi8vIHNvbWUgYml0cyBwYXNzIHRocm91Z2gsIGFuZCBvdGhlcnMgYXJlIHNpbXBseSBpZ25vcmVkLiAgKFRoYXQgd291bGRcbi8vIGJlIGEgdmFsaWQgZXhhbXBsZSBvZiBhIHRyYW5zZm9ybSwgb2YgY291cnNlLilcbi8vXG4vLyBXaGlsZSB0aGUgb3V0cHV0IGlzIGNhdXNhbGx5IHJlbGF0ZWQgdG8gdGhlIGlucHV0LCBpdCdzIG5vdCBhXG4vLyBuZWNlc3NhcmlseSBzeW1tZXRyaWMgb3Igc3luY2hyb25vdXMgdHJhbnNmb3JtYXRpb24uICBGb3IgZXhhbXBsZSxcbi8vIGEgemxpYiBzdHJlYW0gbWlnaHQgdGFrZSBtdWx0aXBsZSBwbGFpbi10ZXh0IHdyaXRlcygpLCBhbmQgdGhlblxuLy8gZW1pdCBhIHNpbmdsZSBjb21wcmVzc2VkIGNodW5rIHNvbWUgdGltZSBpbiB0aGUgZnV0dXJlLlxuLy9cbi8vIEhlcmUncyBob3cgdGhpcyB3b3Jrczpcbi8vXG4vLyBUaGUgVHJhbnNmb3JtIHN0cmVhbSBoYXMgYWxsIHRoZSBhc3BlY3RzIG9mIHRoZSByZWFkYWJsZSBhbmQgd3JpdGFibGVcbi8vIHN0cmVhbSBjbGFzc2VzLiAgV2hlbiB5b3Ugd3JpdGUoY2h1bmspLCB0aGF0IGNhbGxzIF93cml0ZShjaHVuayxjYilcbi8vIGludGVybmFsbHksIGFuZCByZXR1cm5zIGZhbHNlIGlmIHRoZXJlJ3MgYSBsb3Qgb2YgcGVuZGluZyB3cml0ZXNcbi8vIGJ1ZmZlcmVkIHVwLiAgV2hlbiB5b3UgY2FsbCByZWFkKCksIHRoYXQgY2FsbHMgX3JlYWQobikgdW50aWxcbi8vIHRoZXJlJ3MgZW5vdWdoIHBlbmRpbmcgcmVhZGFibGUgZGF0YSBidWZmZXJlZCB1cC5cbi8vXG4vLyBJbiBhIHRyYW5zZm9ybSBzdHJlYW0sIHRoZSB3cml0dGVuIGRhdGEgaXMgcGxhY2VkIGluIGEgYnVmZmVyLiAgV2hlblxuLy8gX3JlYWQobikgaXMgY2FsbGVkLCBpdCB0cmFuc2Zvcm1zIHRoZSBxdWV1ZWQgdXAgZGF0YSwgY2FsbGluZyB0aGVcbi8vIGJ1ZmZlcmVkIF93cml0ZSBjYidzIGFzIGl0IGNvbnN1bWVzIGNodW5rcy4gIElmIGNvbnN1bWluZyBhIHNpbmdsZVxuLy8gd3JpdHRlbiBjaHVuayB3b3VsZCByZXN1bHQgaW4gbXVsdGlwbGUgb3V0cHV0IGNodW5rcywgdGhlbiB0aGUgZmlyc3Rcbi8vIG91dHB1dHRlZCBiaXQgY2FsbHMgdGhlIHJlYWRjYiwgYW5kIHN1YnNlcXVlbnQgY2h1bmtzIGp1c3QgZ28gaW50b1xuLy8gdGhlIHJlYWQgYnVmZmVyLCBhbmQgd2lsbCBjYXVzZSBpdCB0byBlbWl0ICdyZWFkYWJsZScgaWYgbmVjZXNzYXJ5LlxuLy9cbi8vIFRoaXMgd2F5LCBiYWNrLXByZXNzdXJlIGlzIGFjdHVhbGx5IGRldGVybWluZWQgYnkgdGhlIHJlYWRpbmcgc2lkZSxcbi8vIHNpbmNlIF9yZWFkIGhhcyB0byBiZSBjYWxsZWQgdG8gc3RhcnQgcHJvY2Vzc2luZyBhIG5ldyBjaHVuay4gIEhvd2V2ZXIsXG4vLyBhIHBhdGhvbG9naWNhbCBpbmZsYXRlIHR5cGUgb2YgdHJhbnNmb3JtIGNhbiBjYXVzZSBleGNlc3NpdmUgYnVmZmVyaW5nXG4vLyBoZXJlLiAgRm9yIGV4YW1wbGUsIGltYWdpbmUgYSBzdHJlYW0gd2hlcmUgZXZlcnkgYnl0ZSBvZiBpbnB1dCBpc1xuLy8gaW50ZXJwcmV0ZWQgYXMgYW4gaW50ZWdlciBmcm9tIDAtMjU1LCBhbmQgdGhlbiByZXN1bHRzIGluIHRoYXQgbWFueVxuLy8gYnl0ZXMgb2Ygb3V0cHV0LiAgV3JpdGluZyB0aGUgNCBieXRlcyB7ZmYsZmYsZmYsZmZ9IHdvdWxkIHJlc3VsdCBpblxuLy8gMWtiIG9mIGRhdGEgYmVpbmcgb3V0cHV0LiAgSW4gdGhpcyBjYXNlLCB5b3UgY291bGQgd3JpdGUgYSB2ZXJ5IHNtYWxsXG4vLyBhbW91bnQgb2YgaW5wdXQsIGFuZCBlbmQgdXAgd2l0aCBhIHZlcnkgbGFyZ2UgYW1vdW50IG9mIG91dHB1dC4gIEluXG4vLyBzdWNoIGEgcGF0aG9sb2dpY2FsIGluZmxhdGluZyBtZWNoYW5pc20sIHRoZXJlJ2QgYmUgbm8gd2F5IHRvIHRlbGxcbi8vIHRoZSBzeXN0ZW0gdG8gc3RvcCBkb2luZyB0aGUgdHJhbnNmb3JtLiAgQSBzaW5nbGUgNE1CIHdyaXRlIGNvdWxkXG4vLyBjYXVzZSB0aGUgc3lzdGVtIHRvIHJ1biBvdXQgb2YgbWVtb3J5LlxuLy9cbi8vIEhvd2V2ZXIsIGV2ZW4gaW4gc3VjaCBhIHBhdGhvbG9naWNhbCBjYXNlLCBvbmx5IGEgc2luZ2xlIHdyaXR0ZW4gY2h1bmtcbi8vIHdvdWxkIGJlIGNvbnN1bWVkLCBhbmQgdGhlbiB0aGUgcmVzdCB3b3VsZCB3YWl0ICh1bi10cmFuc2Zvcm1lZCkgdW50aWxcbi8vIHRoZSByZXN1bHRzIG9mIHRoZSBwcmV2aW91cyB0cmFuc2Zvcm1lZCBjaHVuayB3ZXJlIGNvbnN1bWVkLlxuXG5tb2R1bGUuZXhwb3J0cyA9IFRyYW5zZm9ybTtcblxudmFyIER1cGxleCA9IHJlcXVpcmUoJy4vX3N0cmVhbV9kdXBsZXgnKTtcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciB1dGlsID0gcmVxdWlyZSgnY29yZS11dGlsLWlzJyk7XG51dGlsLmluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG51dGlsLmluaGVyaXRzKFRyYW5zZm9ybSwgRHVwbGV4KTtcblxuXG5mdW5jdGlvbiBUcmFuc2Zvcm1TdGF0ZShvcHRpb25zLCBzdHJlYW0pIHtcbiAgdGhpcy5hZnRlclRyYW5zZm9ybSA9IGZ1bmN0aW9uKGVyLCBkYXRhKSB7XG4gICAgcmV0dXJuIGFmdGVyVHJhbnNmb3JtKHN0cmVhbSwgZXIsIGRhdGEpO1xuICB9O1xuXG4gIHRoaXMubmVlZFRyYW5zZm9ybSA9IGZhbHNlO1xuICB0aGlzLnRyYW5zZm9ybWluZyA9IGZhbHNlO1xuICB0aGlzLndyaXRlY2IgPSBudWxsO1xuICB0aGlzLndyaXRlY2h1bmsgPSBudWxsO1xufVxuXG5mdW5jdGlvbiBhZnRlclRyYW5zZm9ybShzdHJlYW0sIGVyLCBkYXRhKSB7XG4gIHZhciB0cyA9IHN0cmVhbS5fdHJhbnNmb3JtU3RhdGU7XG4gIHRzLnRyYW5zZm9ybWluZyA9IGZhbHNlO1xuXG4gIHZhciBjYiA9IHRzLndyaXRlY2I7XG5cbiAgaWYgKCFjYilcbiAgICByZXR1cm4gc3RyZWFtLmVtaXQoJ2Vycm9yJywgbmV3IEVycm9yKCdubyB3cml0ZWNiIGluIFRyYW5zZm9ybSBjbGFzcycpKTtcblxuICB0cy53cml0ZWNodW5rID0gbnVsbDtcbiAgdHMud3JpdGVjYiA9IG51bGw7XG5cbiAgaWYgKCF1dGlsLmlzTnVsbE9yVW5kZWZpbmVkKGRhdGEpKVxuICAgIHN0cmVhbS5wdXNoKGRhdGEpO1xuXG4gIGlmIChjYilcbiAgICBjYihlcik7XG5cbiAgdmFyIHJzID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlO1xuICBycy5yZWFkaW5nID0gZmFsc2U7XG4gIGlmIChycy5uZWVkUmVhZGFibGUgfHwgcnMubGVuZ3RoIDwgcnMuaGlnaFdhdGVyTWFyaykge1xuICAgIHN0cmVhbS5fcmVhZChycy5oaWdoV2F0ZXJNYXJrKTtcbiAgfVxufVxuXG5cbmZ1bmN0aW9uIFRyYW5zZm9ybShvcHRpb25zKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBUcmFuc2Zvcm0pKVxuICAgIHJldHVybiBuZXcgVHJhbnNmb3JtKG9wdGlvbnMpO1xuXG4gIER1cGxleC5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuXG4gIHRoaXMuX3RyYW5zZm9ybVN0YXRlID0gbmV3IFRyYW5zZm9ybVN0YXRlKG9wdGlvbnMsIHRoaXMpO1xuXG4gIC8vIHdoZW4gdGhlIHdyaXRhYmxlIHNpZGUgZmluaXNoZXMsIHRoZW4gZmx1c2ggb3V0IGFueXRoaW5nIHJlbWFpbmluZy5cbiAgdmFyIHN0cmVhbSA9IHRoaXM7XG5cbiAgLy8gc3RhcnQgb3V0IGFza2luZyBmb3IgYSByZWFkYWJsZSBldmVudCBvbmNlIGRhdGEgaXMgdHJhbnNmb3JtZWQuXG4gIHRoaXMuX3JlYWRhYmxlU3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcblxuICAvLyB3ZSBoYXZlIGltcGxlbWVudGVkIHRoZSBfcmVhZCBtZXRob2QsIGFuZCBkb25lIHRoZSBvdGhlciB0aGluZ3NcbiAgLy8gdGhhdCBSZWFkYWJsZSB3YW50cyBiZWZvcmUgdGhlIGZpcnN0IF9yZWFkIGNhbGwsIHNvIHVuc2V0IHRoZVxuICAvLyBzeW5jIGd1YXJkIGZsYWcuXG4gIHRoaXMuX3JlYWRhYmxlU3RhdGUuc3luYyA9IGZhbHNlO1xuXG4gIHRoaXMub25jZSgncHJlZmluaXNoJywgZnVuY3Rpb24oKSB7XG4gICAgaWYgKHV0aWwuaXNGdW5jdGlvbih0aGlzLl9mbHVzaCkpXG4gICAgICB0aGlzLl9mbHVzaChmdW5jdGlvbihlcikge1xuICAgICAgICBkb25lKHN0cmVhbSwgZXIpO1xuICAgICAgfSk7XG4gICAgZWxzZVxuICAgICAgZG9uZShzdHJlYW0pO1xuICB9KTtcbn1cblxuVHJhbnNmb3JtLnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24oY2h1bmssIGVuY29kaW5nKSB7XG4gIHRoaXMuX3RyYW5zZm9ybVN0YXRlLm5lZWRUcmFuc2Zvcm0gPSBmYWxzZTtcbiAgcmV0dXJuIER1cGxleC5wcm90b3R5cGUucHVzaC5jYWxsKHRoaXMsIGNodW5rLCBlbmNvZGluZyk7XG59O1xuXG4vLyBUaGlzIGlzIHRoZSBwYXJ0IHdoZXJlIHlvdSBkbyBzdHVmZiFcbi8vIG92ZXJyaWRlIHRoaXMgZnVuY3Rpb24gaW4gaW1wbGVtZW50YXRpb24gY2xhc3Nlcy5cbi8vICdjaHVuaycgaXMgYW4gaW5wdXQgY2h1bmsuXG4vL1xuLy8gQ2FsbCBgcHVzaChuZXdDaHVuaylgIHRvIHBhc3MgYWxvbmcgdHJhbnNmb3JtZWQgb3V0cHV0XG4vLyB0byB0aGUgcmVhZGFibGUgc2lkZS4gIFlvdSBtYXkgY2FsbCAncHVzaCcgemVybyBvciBtb3JlIHRpbWVzLlxuLy9cbi8vIENhbGwgYGNiKGVycilgIHdoZW4geW91IGFyZSBkb25lIHdpdGggdGhpcyBjaHVuay4gIElmIHlvdSBwYXNzXG4vLyBhbiBlcnJvciwgdGhlbiB0aGF0J2xsIHB1dCB0aGUgaHVydCBvbiB0aGUgd2hvbGUgb3BlcmF0aW9uLiAgSWYgeW91XG4vLyBuZXZlciBjYWxsIGNiKCksIHRoZW4geW91J2xsIG5ldmVyIGdldCBhbm90aGVyIGNodW5rLlxuVHJhbnNmb3JtLnByb3RvdHlwZS5fdHJhbnNmb3JtID0gZnVuY3Rpb24oY2h1bmssIGVuY29kaW5nLCBjYikge1xuICB0aHJvdyBuZXcgRXJyb3IoJ25vdCBpbXBsZW1lbnRlZCcpO1xufTtcblxuVHJhbnNmb3JtLnByb3RvdHlwZS5fd3JpdGUgPSBmdW5jdGlvbihjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIHZhciB0cyA9IHRoaXMuX3RyYW5zZm9ybVN0YXRlO1xuICB0cy53cml0ZWNiID0gY2I7XG4gIHRzLndyaXRlY2h1bmsgPSBjaHVuaztcbiAgdHMud3JpdGVlbmNvZGluZyA9IGVuY29kaW5nO1xuICBpZiAoIXRzLnRyYW5zZm9ybWluZykge1xuICAgIHZhciBycyA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gICAgaWYgKHRzLm5lZWRUcmFuc2Zvcm0gfHxcbiAgICAgICAgcnMubmVlZFJlYWRhYmxlIHx8XG4gICAgICAgIHJzLmxlbmd0aCA8IHJzLmhpZ2hXYXRlck1hcmspXG4gICAgICB0aGlzLl9yZWFkKHJzLmhpZ2hXYXRlck1hcmspO1xuICB9XG59O1xuXG4vLyBEb2Vzbid0IG1hdHRlciB3aGF0IHRoZSBhcmdzIGFyZSBoZXJlLlxuLy8gX3RyYW5zZm9ybSBkb2VzIGFsbCB0aGUgd29yay5cbi8vIFRoYXQgd2UgZ290IGhlcmUgbWVhbnMgdGhhdCB0aGUgcmVhZGFibGUgc2lkZSB3YW50cyBtb3JlIGRhdGEuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLl9yZWFkID0gZnVuY3Rpb24obikge1xuICB2YXIgdHMgPSB0aGlzLl90cmFuc2Zvcm1TdGF0ZTtcblxuICBpZiAoIXV0aWwuaXNOdWxsKHRzLndyaXRlY2h1bmspICYmIHRzLndyaXRlY2IgJiYgIXRzLnRyYW5zZm9ybWluZykge1xuICAgIHRzLnRyYW5zZm9ybWluZyA9IHRydWU7XG4gICAgdGhpcy5fdHJhbnNmb3JtKHRzLndyaXRlY2h1bmssIHRzLndyaXRlZW5jb2RpbmcsIHRzLmFmdGVyVHJhbnNmb3JtKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBtYXJrIHRoYXQgd2UgbmVlZCBhIHRyYW5zZm9ybSwgc28gdGhhdCBhbnkgZGF0YSB0aGF0IGNvbWVzIGluXG4gICAgLy8gd2lsbCBnZXQgcHJvY2Vzc2VkLCBub3cgdGhhdCB3ZSd2ZSBhc2tlZCBmb3IgaXQuXG4gICAgdHMubmVlZFRyYW5zZm9ybSA9IHRydWU7XG4gIH1cbn07XG5cblxuZnVuY3Rpb24gZG9uZShzdHJlYW0sIGVyKSB7XG4gIGlmIChlcilcbiAgICByZXR1cm4gc3RyZWFtLmVtaXQoJ2Vycm9yJywgZXIpO1xuXG4gIC8vIGlmIHRoZXJlJ3Mgbm90aGluZyBpbiB0aGUgd3JpdGUgYnVmZmVyLCB0aGVuIHRoYXQgbWVhbnNcbiAgLy8gdGhhdCBub3RoaW5nIG1vcmUgd2lsbCBldmVyIGJlIHByb3ZpZGVkXG4gIHZhciB3cyA9IHN0cmVhbS5fd3JpdGFibGVTdGF0ZTtcbiAgdmFyIHRzID0gc3RyZWFtLl90cmFuc2Zvcm1TdGF0ZTtcblxuICBpZiAod3MubGVuZ3RoKVxuICAgIHRocm93IG5ldyBFcnJvcignY2FsbGluZyB0cmFuc2Zvcm0gZG9uZSB3aGVuIHdzLmxlbmd0aCAhPSAwJyk7XG5cbiAgaWYgKHRzLnRyYW5zZm9ybWluZylcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2NhbGxpbmcgdHJhbnNmb3JtIGRvbmUgd2hlbiBzdGlsbCB0cmFuc2Zvcm1pbmcnKTtcblxuICByZXR1cm4gc3RyZWFtLnB1c2gobnVsbCk7XG59XG4iLCIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuLy8gQSBiaXQgc2ltcGxlciB0aGFuIHJlYWRhYmxlIHN0cmVhbXMuXG4vLyBJbXBsZW1lbnQgYW4gYXN5bmMgLl93cml0ZShjaHVuaywgY2IpLCBhbmQgaXQnbGwgaGFuZGxlIGFsbFxuLy8gdGhlIGRyYWluIGV2ZW50IGVtaXNzaW9uIGFuZCBidWZmZXJpbmcuXG5cbm1vZHVsZS5leHBvcnRzID0gV3JpdGFibGU7XG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgQnVmZmVyID0gcmVxdWlyZSgnYnVmZmVyJykuQnVmZmVyO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbldyaXRhYmxlLldyaXRhYmxlU3RhdGUgPSBXcml0YWJsZVN0YXRlO1xuXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgdXRpbCA9IHJlcXVpcmUoJ2NvcmUtdXRpbC1pcycpO1xudXRpbC5pbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxudmFyIFN0cmVhbSA9IHJlcXVpcmUoJ3N0cmVhbScpO1xuXG51dGlsLmluaGVyaXRzKFdyaXRhYmxlLCBTdHJlYW0pO1xuXG5mdW5jdGlvbiBXcml0ZVJlcShjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIHRoaXMuY2h1bmsgPSBjaHVuaztcbiAgdGhpcy5lbmNvZGluZyA9IGVuY29kaW5nO1xuICB0aGlzLmNhbGxiYWNrID0gY2I7XG59XG5cbmZ1bmN0aW9uIFdyaXRhYmxlU3RhdGUob3B0aW9ucywgc3RyZWFtKSB7XG4gIHZhciBEdXBsZXggPSByZXF1aXJlKCcuL19zdHJlYW1fZHVwbGV4Jyk7XG5cbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgLy8gdGhlIHBvaW50IGF0IHdoaWNoIHdyaXRlKCkgc3RhcnRzIHJldHVybmluZyBmYWxzZVxuICAvLyBOb3RlOiAwIGlzIGEgdmFsaWQgdmFsdWUsIG1lYW5zIHRoYXQgd2UgYWx3YXlzIHJldHVybiBmYWxzZSBpZlxuICAvLyB0aGUgZW50aXJlIGJ1ZmZlciBpcyBub3QgZmx1c2hlZCBpbW1lZGlhdGVseSBvbiB3cml0ZSgpXG4gIHZhciBod20gPSBvcHRpb25zLmhpZ2hXYXRlck1hcms7XG4gIHZhciBkZWZhdWx0SHdtID0gb3B0aW9ucy5vYmplY3RNb2RlID8gMTYgOiAxNiAqIDEwMjQ7XG4gIHRoaXMuaGlnaFdhdGVyTWFyayA9IChod20gfHwgaHdtID09PSAwKSA/IGh3bSA6IGRlZmF1bHRId207XG5cbiAgLy8gb2JqZWN0IHN0cmVhbSBmbGFnIHRvIGluZGljYXRlIHdoZXRoZXIgb3Igbm90IHRoaXMgc3RyZWFtXG4gIC8vIGNvbnRhaW5zIGJ1ZmZlcnMgb3Igb2JqZWN0cy5cbiAgdGhpcy5vYmplY3RNb2RlID0gISFvcHRpb25zLm9iamVjdE1vZGU7XG5cbiAgaWYgKHN0cmVhbSBpbnN0YW5jZW9mIER1cGxleClcbiAgICB0aGlzLm9iamVjdE1vZGUgPSB0aGlzLm9iamVjdE1vZGUgfHwgISFvcHRpb25zLndyaXRhYmxlT2JqZWN0TW9kZTtcblxuICAvLyBjYXN0IHRvIGludHMuXG4gIHRoaXMuaGlnaFdhdGVyTWFyayA9IH5+dGhpcy5oaWdoV2F0ZXJNYXJrO1xuXG4gIHRoaXMubmVlZERyYWluID0gZmFsc2U7XG4gIC8vIGF0IHRoZSBzdGFydCBvZiBjYWxsaW5nIGVuZCgpXG4gIHRoaXMuZW5kaW5nID0gZmFsc2U7XG4gIC8vIHdoZW4gZW5kKCkgaGFzIGJlZW4gY2FsbGVkLCBhbmQgcmV0dXJuZWRcbiAgdGhpcy5lbmRlZCA9IGZhbHNlO1xuICAvLyB3aGVuICdmaW5pc2gnIGlzIGVtaXR0ZWRcbiAgdGhpcy5maW5pc2hlZCA9IGZhbHNlO1xuXG4gIC8vIHNob3VsZCB3ZSBkZWNvZGUgc3RyaW5ncyBpbnRvIGJ1ZmZlcnMgYmVmb3JlIHBhc3NpbmcgdG8gX3dyaXRlP1xuICAvLyB0aGlzIGlzIGhlcmUgc28gdGhhdCBzb21lIG5vZGUtY29yZSBzdHJlYW1zIGNhbiBvcHRpbWl6ZSBzdHJpbmdcbiAgLy8gaGFuZGxpbmcgYXQgYSBsb3dlciBsZXZlbC5cbiAgdmFyIG5vRGVjb2RlID0gb3B0aW9ucy5kZWNvZGVTdHJpbmdzID09PSBmYWxzZTtcbiAgdGhpcy5kZWNvZGVTdHJpbmdzID0gIW5vRGVjb2RlO1xuXG4gIC8vIENyeXB0byBpcyBraW5kIG9mIG9sZCBhbmQgY3J1c3R5LiAgSGlzdG9yaWNhbGx5LCBpdHMgZGVmYXVsdCBzdHJpbmdcbiAgLy8gZW5jb2RpbmcgaXMgJ2JpbmFyeScgc28gd2UgaGF2ZSB0byBtYWtlIHRoaXMgY29uZmlndXJhYmxlLlxuICAvLyBFdmVyeXRoaW5nIGVsc2UgaW4gdGhlIHVuaXZlcnNlIHVzZXMgJ3V0ZjgnLCB0aG91Z2guXG4gIHRoaXMuZGVmYXVsdEVuY29kaW5nID0gb3B0aW9ucy5kZWZhdWx0RW5jb2RpbmcgfHwgJ3V0ZjgnO1xuXG4gIC8vIG5vdCBhbiBhY3R1YWwgYnVmZmVyIHdlIGtlZXAgdHJhY2sgb2YsIGJ1dCBhIG1lYXN1cmVtZW50XG4gIC8vIG9mIGhvdyBtdWNoIHdlJ3JlIHdhaXRpbmcgdG8gZ2V0IHB1c2hlZCB0byBzb21lIHVuZGVybHlpbmdcbiAgLy8gc29ja2V0IG9yIGZpbGUuXG4gIHRoaXMubGVuZ3RoID0gMDtcblxuICAvLyBhIGZsYWcgdG8gc2VlIHdoZW4gd2UncmUgaW4gdGhlIG1pZGRsZSBvZiBhIHdyaXRlLlxuICB0aGlzLndyaXRpbmcgPSBmYWxzZTtcblxuICAvLyB3aGVuIHRydWUgYWxsIHdyaXRlcyB3aWxsIGJlIGJ1ZmZlcmVkIHVudGlsIC51bmNvcmsoKSBjYWxsXG4gIHRoaXMuY29ya2VkID0gMDtcblxuICAvLyBhIGZsYWcgdG8gYmUgYWJsZSB0byB0ZWxsIGlmIHRoZSBvbndyaXRlIGNiIGlzIGNhbGxlZCBpbW1lZGlhdGVseSxcbiAgLy8gb3Igb24gYSBsYXRlciB0aWNrLiAgV2Ugc2V0IHRoaXMgdG8gdHJ1ZSBhdCBmaXJzdCwgYmVjYXVzZSBhbnlcbiAgLy8gYWN0aW9ucyB0aGF0IHNob3VsZG4ndCBoYXBwZW4gdW50aWwgXCJsYXRlclwiIHNob3VsZCBnZW5lcmFsbHkgYWxzb1xuICAvLyBub3QgaGFwcGVuIGJlZm9yZSB0aGUgZmlyc3Qgd3JpdGUgY2FsbC5cbiAgdGhpcy5zeW5jID0gdHJ1ZTtcblxuICAvLyBhIGZsYWcgdG8ga25vdyBpZiB3ZSdyZSBwcm9jZXNzaW5nIHByZXZpb3VzbHkgYnVmZmVyZWQgaXRlbXMsIHdoaWNoXG4gIC8vIG1heSBjYWxsIHRoZSBfd3JpdGUoKSBjYWxsYmFjayBpbiB0aGUgc2FtZSB0aWNrLCBzbyB0aGF0IHdlIGRvbid0XG4gIC8vIGVuZCB1cCBpbiBhbiBvdmVybGFwcGVkIG9ud3JpdGUgc2l0dWF0aW9uLlxuICB0aGlzLmJ1ZmZlclByb2Nlc3NpbmcgPSBmYWxzZTtcblxuICAvLyB0aGUgY2FsbGJhY2sgdGhhdCdzIHBhc3NlZCB0byBfd3JpdGUoY2h1bmssY2IpXG4gIHRoaXMub253cml0ZSA9IGZ1bmN0aW9uKGVyKSB7XG4gICAgb253cml0ZShzdHJlYW0sIGVyKTtcbiAgfTtcblxuICAvLyB0aGUgY2FsbGJhY2sgdGhhdCB0aGUgdXNlciBzdXBwbGllcyB0byB3cml0ZShjaHVuayxlbmNvZGluZyxjYilcbiAgdGhpcy53cml0ZWNiID0gbnVsbDtcblxuICAvLyB0aGUgYW1vdW50IHRoYXQgaXMgYmVpbmcgd3JpdHRlbiB3aGVuIF93cml0ZSBpcyBjYWxsZWQuXG4gIHRoaXMud3JpdGVsZW4gPSAwO1xuXG4gIHRoaXMuYnVmZmVyID0gW107XG5cbiAgLy8gbnVtYmVyIG9mIHBlbmRpbmcgdXNlci1zdXBwbGllZCB3cml0ZSBjYWxsYmFja3NcbiAgLy8gdGhpcyBtdXN0IGJlIDAgYmVmb3JlICdmaW5pc2gnIGNhbiBiZSBlbWl0dGVkXG4gIHRoaXMucGVuZGluZ2NiID0gMDtcblxuICAvLyBlbWl0IHByZWZpbmlzaCBpZiB0aGUgb25seSB0aGluZyB3ZSdyZSB3YWl0aW5nIGZvciBpcyBfd3JpdGUgY2JzXG4gIC8vIFRoaXMgaXMgcmVsZXZhbnQgZm9yIHN5bmNocm9ub3VzIFRyYW5zZm9ybSBzdHJlYW1zXG4gIHRoaXMucHJlZmluaXNoZWQgPSBmYWxzZTtcblxuICAvLyBUcnVlIGlmIHRoZSBlcnJvciB3YXMgYWxyZWFkeSBlbWl0dGVkIGFuZCBzaG91bGQgbm90IGJlIHRocm93biBhZ2FpblxuICB0aGlzLmVycm9yRW1pdHRlZCA9IGZhbHNlO1xufVxuXG5mdW5jdGlvbiBXcml0YWJsZShvcHRpb25zKSB7XG4gIHZhciBEdXBsZXggPSByZXF1aXJlKCcuL19zdHJlYW1fZHVwbGV4Jyk7XG5cbiAgLy8gV3JpdGFibGUgY3RvciBpcyBhcHBsaWVkIHRvIER1cGxleGVzLCB0aG91Z2ggdGhleSdyZSBub3RcbiAgLy8gaW5zdGFuY2VvZiBXcml0YWJsZSwgdGhleSdyZSBpbnN0YW5jZW9mIFJlYWRhYmxlLlxuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgV3JpdGFibGUpICYmICEodGhpcyBpbnN0YW5jZW9mIER1cGxleCkpXG4gICAgcmV0dXJuIG5ldyBXcml0YWJsZShvcHRpb25zKTtcblxuICB0aGlzLl93cml0YWJsZVN0YXRlID0gbmV3IFdyaXRhYmxlU3RhdGUob3B0aW9ucywgdGhpcyk7XG5cbiAgLy8gbGVnYWN5LlxuICB0aGlzLndyaXRhYmxlID0gdHJ1ZTtcblxuICBTdHJlYW0uY2FsbCh0aGlzKTtcbn1cblxuLy8gT3RoZXJ3aXNlIHBlb3BsZSBjYW4gcGlwZSBXcml0YWJsZSBzdHJlYW1zLCB3aGljaCBpcyBqdXN0IHdyb25nLlxuV3JpdGFibGUucHJvdG90eXBlLnBpcGUgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5lbWl0KCdlcnJvcicsIG5ldyBFcnJvcignQ2Fubm90IHBpcGUuIE5vdCByZWFkYWJsZS4nKSk7XG59O1xuXG5cbmZ1bmN0aW9uIHdyaXRlQWZ0ZXJFbmQoc3RyZWFtLCBzdGF0ZSwgY2IpIHtcbiAgdmFyIGVyID0gbmV3IEVycm9yKCd3cml0ZSBhZnRlciBlbmQnKTtcbiAgLy8gVE9ETzogZGVmZXIgZXJyb3IgZXZlbnRzIGNvbnNpc3RlbnRseSBldmVyeXdoZXJlLCBub3QganVzdCB0aGUgY2JcbiAgc3RyZWFtLmVtaXQoJ2Vycm9yJywgZXIpO1xuICBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uKCkge1xuICAgIGNiKGVyKTtcbiAgfSk7XG59XG5cbi8vIElmIHdlIGdldCBzb21ldGhpbmcgdGhhdCBpcyBub3QgYSBidWZmZXIsIHN0cmluZywgbnVsbCwgb3IgdW5kZWZpbmVkLFxuLy8gYW5kIHdlJ3JlIG5vdCBpbiBvYmplY3RNb2RlLCB0aGVuIHRoYXQncyBhbiBlcnJvci5cbi8vIE90aGVyd2lzZSBzdHJlYW0gY2h1bmtzIGFyZSBhbGwgY29uc2lkZXJlZCB0byBiZSBvZiBsZW5ndGg9MSwgYW5kIHRoZVxuLy8gd2F0ZXJtYXJrcyBkZXRlcm1pbmUgaG93IG1hbnkgb2JqZWN0cyB0byBrZWVwIGluIHRoZSBidWZmZXIsIHJhdGhlciB0aGFuXG4vLyBob3cgbWFueSBieXRlcyBvciBjaGFyYWN0ZXJzLlxuZnVuY3Rpb24gdmFsaWRDaHVuayhzdHJlYW0sIHN0YXRlLCBjaHVuaywgY2IpIHtcbiAgdmFyIHZhbGlkID0gdHJ1ZTtcbiAgaWYgKCF1dGlsLmlzQnVmZmVyKGNodW5rKSAmJlxuICAgICAgIXV0aWwuaXNTdHJpbmcoY2h1bmspICYmXG4gICAgICAhdXRpbC5pc051bGxPclVuZGVmaW5lZChjaHVuaykgJiZcbiAgICAgICFzdGF0ZS5vYmplY3RNb2RlKSB7XG4gICAgdmFyIGVyID0gbmV3IFR5cGVFcnJvcignSW52YWxpZCBub24tc3RyaW5nL2J1ZmZlciBjaHVuaycpO1xuICAgIHN0cmVhbS5lbWl0KCdlcnJvcicsIGVyKTtcbiAgICBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uKCkge1xuICAgICAgY2IoZXIpO1xuICAgIH0pO1xuICAgIHZhbGlkID0gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHZhbGlkO1xufVxuXG5Xcml0YWJsZS5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbihjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3dyaXRhYmxlU3RhdGU7XG4gIHZhciByZXQgPSBmYWxzZTtcblxuICBpZiAodXRpbC5pc0Z1bmN0aW9uKGVuY29kaW5nKSkge1xuICAgIGNiID0gZW5jb2Rpbmc7XG4gICAgZW5jb2RpbmcgPSBudWxsO1xuICB9XG5cbiAgaWYgKHV0aWwuaXNCdWZmZXIoY2h1bmspKVxuICAgIGVuY29kaW5nID0gJ2J1ZmZlcic7XG4gIGVsc2UgaWYgKCFlbmNvZGluZylcbiAgICBlbmNvZGluZyA9IHN0YXRlLmRlZmF1bHRFbmNvZGluZztcblxuICBpZiAoIXV0aWwuaXNGdW5jdGlvbihjYikpXG4gICAgY2IgPSBmdW5jdGlvbigpIHt9O1xuXG4gIGlmIChzdGF0ZS5lbmRlZClcbiAgICB3cml0ZUFmdGVyRW5kKHRoaXMsIHN0YXRlLCBjYik7XG4gIGVsc2UgaWYgKHZhbGlkQ2h1bmsodGhpcywgc3RhdGUsIGNodW5rLCBjYikpIHtcbiAgICBzdGF0ZS5wZW5kaW5nY2IrKztcbiAgICByZXQgPSB3cml0ZU9yQnVmZmVyKHRoaXMsIHN0YXRlLCBjaHVuaywgZW5jb2RpbmcsIGNiKTtcbiAgfVxuXG4gIHJldHVybiByZXQ7XG59O1xuXG5Xcml0YWJsZS5wcm90b3R5cGUuY29yayA9IGZ1bmN0aW9uKCkge1xuICB2YXIgc3RhdGUgPSB0aGlzLl93cml0YWJsZVN0YXRlO1xuXG4gIHN0YXRlLmNvcmtlZCsrO1xufTtcblxuV3JpdGFibGUucHJvdG90eXBlLnVuY29yayA9IGZ1bmN0aW9uKCkge1xuICB2YXIgc3RhdGUgPSB0aGlzLl93cml0YWJsZVN0YXRlO1xuXG4gIGlmIChzdGF0ZS5jb3JrZWQpIHtcbiAgICBzdGF0ZS5jb3JrZWQtLTtcblxuICAgIGlmICghc3RhdGUud3JpdGluZyAmJlxuICAgICAgICAhc3RhdGUuY29ya2VkICYmXG4gICAgICAgICFzdGF0ZS5maW5pc2hlZCAmJlxuICAgICAgICAhc3RhdGUuYnVmZmVyUHJvY2Vzc2luZyAmJlxuICAgICAgICBzdGF0ZS5idWZmZXIubGVuZ3RoKVxuICAgICAgY2xlYXJCdWZmZXIodGhpcywgc3RhdGUpO1xuICB9XG59O1xuXG5mdW5jdGlvbiBkZWNvZGVDaHVuayhzdGF0ZSwgY2h1bmssIGVuY29kaW5nKSB7XG4gIGlmICghc3RhdGUub2JqZWN0TW9kZSAmJlxuICAgICAgc3RhdGUuZGVjb2RlU3RyaW5ncyAhPT0gZmFsc2UgJiZcbiAgICAgIHV0aWwuaXNTdHJpbmcoY2h1bmspKSB7XG4gICAgY2h1bmsgPSBuZXcgQnVmZmVyKGNodW5rLCBlbmNvZGluZyk7XG4gIH1cbiAgcmV0dXJuIGNodW5rO1xufVxuXG4vLyBpZiB3ZSdyZSBhbHJlYWR5IHdyaXRpbmcgc29tZXRoaW5nLCB0aGVuIGp1c3QgcHV0IHRoaXNcbi8vIGluIHRoZSBxdWV1ZSwgYW5kIHdhaXQgb3VyIHR1cm4uICBPdGhlcndpc2UsIGNhbGwgX3dyaXRlXG4vLyBJZiB3ZSByZXR1cm4gZmFsc2UsIHRoZW4gd2UgbmVlZCBhIGRyYWluIGV2ZW50LCBzbyBzZXQgdGhhdCBmbGFnLlxuZnVuY3Rpb24gd3JpdGVPckJ1ZmZlcihzdHJlYW0sIHN0YXRlLCBjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIGNodW5rID0gZGVjb2RlQ2h1bmsoc3RhdGUsIGNodW5rLCBlbmNvZGluZyk7XG4gIGlmICh1dGlsLmlzQnVmZmVyKGNodW5rKSlcbiAgICBlbmNvZGluZyA9ICdidWZmZXInO1xuICB2YXIgbGVuID0gc3RhdGUub2JqZWN0TW9kZSA/IDEgOiBjaHVuay5sZW5ndGg7XG5cbiAgc3RhdGUubGVuZ3RoICs9IGxlbjtcblxuICB2YXIgcmV0ID0gc3RhdGUubGVuZ3RoIDwgc3RhdGUuaGlnaFdhdGVyTWFyaztcbiAgLy8gd2UgbXVzdCBlbnN1cmUgdGhhdCBwcmV2aW91cyBuZWVkRHJhaW4gd2lsbCBub3QgYmUgcmVzZXQgdG8gZmFsc2UuXG4gIGlmICghcmV0KVxuICAgIHN0YXRlLm5lZWREcmFpbiA9IHRydWU7XG5cbiAgaWYgKHN0YXRlLndyaXRpbmcgfHwgc3RhdGUuY29ya2VkKVxuICAgIHN0YXRlLmJ1ZmZlci5wdXNoKG5ldyBXcml0ZVJlcShjaHVuaywgZW5jb2RpbmcsIGNiKSk7XG4gIGVsc2VcbiAgICBkb1dyaXRlKHN0cmVhbSwgc3RhdGUsIGZhbHNlLCBsZW4sIGNodW5rLCBlbmNvZGluZywgY2IpO1xuXG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIGRvV3JpdGUoc3RyZWFtLCBzdGF0ZSwgd3JpdGV2LCBsZW4sIGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgc3RhdGUud3JpdGVsZW4gPSBsZW47XG4gIHN0YXRlLndyaXRlY2IgPSBjYjtcbiAgc3RhdGUud3JpdGluZyA9IHRydWU7XG4gIHN0YXRlLnN5bmMgPSB0cnVlO1xuICBpZiAod3JpdGV2KVxuICAgIHN0cmVhbS5fd3JpdGV2KGNodW5rLCBzdGF0ZS5vbndyaXRlKTtcbiAgZWxzZVxuICAgIHN0cmVhbS5fd3JpdGUoY2h1bmssIGVuY29kaW5nLCBzdGF0ZS5vbndyaXRlKTtcbiAgc3RhdGUuc3luYyA9IGZhbHNlO1xufVxuXG5mdW5jdGlvbiBvbndyaXRlRXJyb3Ioc3RyZWFtLCBzdGF0ZSwgc3luYywgZXIsIGNiKSB7XG4gIGlmIChzeW5jKVxuICAgIHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24oKSB7XG4gICAgICBzdGF0ZS5wZW5kaW5nY2ItLTtcbiAgICAgIGNiKGVyKTtcbiAgICB9KTtcbiAgZWxzZSB7XG4gICAgc3RhdGUucGVuZGluZ2NiLS07XG4gICAgY2IoZXIpO1xuICB9XG5cbiAgc3RyZWFtLl93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZCA9IHRydWU7XG4gIHN0cmVhbS5lbWl0KCdlcnJvcicsIGVyKTtcbn1cblxuZnVuY3Rpb24gb253cml0ZVN0YXRlVXBkYXRlKHN0YXRlKSB7XG4gIHN0YXRlLndyaXRpbmcgPSBmYWxzZTtcbiAgc3RhdGUud3JpdGVjYiA9IG51bGw7XG4gIHN0YXRlLmxlbmd0aCAtPSBzdGF0ZS53cml0ZWxlbjtcbiAgc3RhdGUud3JpdGVsZW4gPSAwO1xufVxuXG5mdW5jdGlvbiBvbndyaXRlKHN0cmVhbSwgZXIpIHtcbiAgdmFyIHN0YXRlID0gc3RyZWFtLl93cml0YWJsZVN0YXRlO1xuICB2YXIgc3luYyA9IHN0YXRlLnN5bmM7XG4gIHZhciBjYiA9IHN0YXRlLndyaXRlY2I7XG5cbiAgb253cml0ZVN0YXRlVXBkYXRlKHN0YXRlKTtcblxuICBpZiAoZXIpXG4gICAgb253cml0ZUVycm9yKHN0cmVhbSwgc3RhdGUsIHN5bmMsIGVyLCBjYik7XG4gIGVsc2Uge1xuICAgIC8vIENoZWNrIGlmIHdlJ3JlIGFjdHVhbGx5IHJlYWR5IHRvIGZpbmlzaCwgYnV0IGRvbid0IGVtaXQgeWV0XG4gICAgdmFyIGZpbmlzaGVkID0gbmVlZEZpbmlzaChzdHJlYW0sIHN0YXRlKTtcblxuICAgIGlmICghZmluaXNoZWQgJiZcbiAgICAgICAgIXN0YXRlLmNvcmtlZCAmJlxuICAgICAgICAhc3RhdGUuYnVmZmVyUHJvY2Vzc2luZyAmJlxuICAgICAgICBzdGF0ZS5idWZmZXIubGVuZ3RoKSB7XG4gICAgICBjbGVhckJ1ZmZlcihzdHJlYW0sIHN0YXRlKTtcbiAgICB9XG5cbiAgICBpZiAoc3luYykge1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbigpIHtcbiAgICAgICAgYWZ0ZXJXcml0ZShzdHJlYW0sIHN0YXRlLCBmaW5pc2hlZCwgY2IpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFmdGVyV3JpdGUoc3RyZWFtLCBzdGF0ZSwgZmluaXNoZWQsIGNiKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gYWZ0ZXJXcml0ZShzdHJlYW0sIHN0YXRlLCBmaW5pc2hlZCwgY2IpIHtcbiAgaWYgKCFmaW5pc2hlZClcbiAgICBvbndyaXRlRHJhaW4oc3RyZWFtLCBzdGF0ZSk7XG4gIHN0YXRlLnBlbmRpbmdjYi0tO1xuICBjYigpO1xuICBmaW5pc2hNYXliZShzdHJlYW0sIHN0YXRlKTtcbn1cblxuLy8gTXVzdCBmb3JjZSBjYWxsYmFjayB0byBiZSBjYWxsZWQgb24gbmV4dFRpY2ssIHNvIHRoYXQgd2UgZG9uJ3Rcbi8vIGVtaXQgJ2RyYWluJyBiZWZvcmUgdGhlIHdyaXRlKCkgY29uc3VtZXIgZ2V0cyB0aGUgJ2ZhbHNlJyByZXR1cm5cbi8vIHZhbHVlLCBhbmQgaGFzIGEgY2hhbmNlIHRvIGF0dGFjaCBhICdkcmFpbicgbGlzdGVuZXIuXG5mdW5jdGlvbiBvbndyaXRlRHJhaW4oc3RyZWFtLCBzdGF0ZSkge1xuICBpZiAoc3RhdGUubGVuZ3RoID09PSAwICYmIHN0YXRlLm5lZWREcmFpbikge1xuICAgIHN0YXRlLm5lZWREcmFpbiA9IGZhbHNlO1xuICAgIHN0cmVhbS5lbWl0KCdkcmFpbicpO1xuICB9XG59XG5cblxuLy8gaWYgdGhlcmUncyBzb21ldGhpbmcgaW4gdGhlIGJ1ZmZlciB3YWl0aW5nLCB0aGVuIHByb2Nlc3MgaXRcbmZ1bmN0aW9uIGNsZWFyQnVmZmVyKHN0cmVhbSwgc3RhdGUpIHtcbiAgc3RhdGUuYnVmZmVyUHJvY2Vzc2luZyA9IHRydWU7XG5cbiAgaWYgKHN0cmVhbS5fd3JpdGV2ICYmIHN0YXRlLmJ1ZmZlci5sZW5ndGggPiAxKSB7XG4gICAgLy8gRmFzdCBjYXNlLCB3cml0ZSBldmVyeXRoaW5nIHVzaW5nIF93cml0ZXYoKVxuICAgIHZhciBjYnMgPSBbXTtcbiAgICBmb3IgKHZhciBjID0gMDsgYyA8IHN0YXRlLmJ1ZmZlci5sZW5ndGg7IGMrKylcbiAgICAgIGNicy5wdXNoKHN0YXRlLmJ1ZmZlcltjXS5jYWxsYmFjayk7XG5cbiAgICAvLyBjb3VudCB0aGUgb25lIHdlIGFyZSBhZGRpbmcsIGFzIHdlbGwuXG4gICAgLy8gVE9ETyhpc2FhY3MpIGNsZWFuIHRoaXMgdXBcbiAgICBzdGF0ZS5wZW5kaW5nY2IrKztcbiAgICBkb1dyaXRlKHN0cmVhbSwgc3RhdGUsIHRydWUsIHN0YXRlLmxlbmd0aCwgc3RhdGUuYnVmZmVyLCAnJywgZnVuY3Rpb24oZXJyKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNicy5sZW5ndGg7IGkrKykge1xuICAgICAgICBzdGF0ZS5wZW5kaW5nY2ItLTtcbiAgICAgICAgY2JzW2ldKGVycik7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBDbGVhciBidWZmZXJcbiAgICBzdGF0ZS5idWZmZXIgPSBbXTtcbiAgfSBlbHNlIHtcbiAgICAvLyBTbG93IGNhc2UsIHdyaXRlIGNodW5rcyBvbmUtYnktb25lXG4gICAgZm9yICh2YXIgYyA9IDA7IGMgPCBzdGF0ZS5idWZmZXIubGVuZ3RoOyBjKyspIHtcbiAgICAgIHZhciBlbnRyeSA9IHN0YXRlLmJ1ZmZlcltjXTtcbiAgICAgIHZhciBjaHVuayA9IGVudHJ5LmNodW5rO1xuICAgICAgdmFyIGVuY29kaW5nID0gZW50cnkuZW5jb2Rpbmc7XG4gICAgICB2YXIgY2IgPSBlbnRyeS5jYWxsYmFjaztcbiAgICAgIHZhciBsZW4gPSBzdGF0ZS5vYmplY3RNb2RlID8gMSA6IGNodW5rLmxlbmd0aDtcblxuICAgICAgZG9Xcml0ZShzdHJlYW0sIHN0YXRlLCBmYWxzZSwgbGVuLCBjaHVuaywgZW5jb2RpbmcsIGNiKTtcblxuICAgICAgLy8gaWYgd2UgZGlkbid0IGNhbGwgdGhlIG9ud3JpdGUgaW1tZWRpYXRlbHksIHRoZW5cbiAgICAgIC8vIGl0IG1lYW5zIHRoYXQgd2UgbmVlZCB0byB3YWl0IHVudGlsIGl0IGRvZXMuXG4gICAgICAvLyBhbHNvLCB0aGF0IG1lYW5zIHRoYXQgdGhlIGNodW5rIGFuZCBjYiBhcmUgY3VycmVudGx5XG4gICAgICAvLyBiZWluZyBwcm9jZXNzZWQsIHNvIG1vdmUgdGhlIGJ1ZmZlciBjb3VudGVyIHBhc3QgdGhlbS5cbiAgICAgIGlmIChzdGF0ZS53cml0aW5nKSB7XG4gICAgICAgIGMrKztcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGMgPCBzdGF0ZS5idWZmZXIubGVuZ3RoKVxuICAgICAgc3RhdGUuYnVmZmVyID0gc3RhdGUuYnVmZmVyLnNsaWNlKGMpO1xuICAgIGVsc2VcbiAgICAgIHN0YXRlLmJ1ZmZlci5sZW5ndGggPSAwO1xuICB9XG5cbiAgc3RhdGUuYnVmZmVyUHJvY2Vzc2luZyA9IGZhbHNlO1xufVxuXG5Xcml0YWJsZS5wcm90b3R5cGUuX3dyaXRlID0gZnVuY3Rpb24oY2h1bmssIGVuY29kaW5nLCBjYikge1xuICBjYihuZXcgRXJyb3IoJ25vdCBpbXBsZW1lbnRlZCcpKTtcblxufTtcblxuV3JpdGFibGUucHJvdG90eXBlLl93cml0ZXYgPSBudWxsO1xuXG5Xcml0YWJsZS5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24oY2h1bmssIGVuY29kaW5nLCBjYikge1xuICB2YXIgc3RhdGUgPSB0aGlzLl93cml0YWJsZVN0YXRlO1xuXG4gIGlmICh1dGlsLmlzRnVuY3Rpb24oY2h1bmspKSB7XG4gICAgY2IgPSBjaHVuaztcbiAgICBjaHVuayA9IG51bGw7XG4gICAgZW5jb2RpbmcgPSBudWxsO1xuICB9IGVsc2UgaWYgKHV0aWwuaXNGdW5jdGlvbihlbmNvZGluZykpIHtcbiAgICBjYiA9IGVuY29kaW5nO1xuICAgIGVuY29kaW5nID0gbnVsbDtcbiAgfVxuXG4gIGlmICghdXRpbC5pc051bGxPclVuZGVmaW5lZChjaHVuaykpXG4gICAgdGhpcy53cml0ZShjaHVuaywgZW5jb2RpbmcpO1xuXG4gIC8vIC5lbmQoKSBmdWxseSB1bmNvcmtzXG4gIGlmIChzdGF0ZS5jb3JrZWQpIHtcbiAgICBzdGF0ZS5jb3JrZWQgPSAxO1xuICAgIHRoaXMudW5jb3JrKCk7XG4gIH1cblxuICAvLyBpZ25vcmUgdW5uZWNlc3NhcnkgZW5kKCkgY2FsbHMuXG4gIGlmICghc3RhdGUuZW5kaW5nICYmICFzdGF0ZS5maW5pc2hlZClcbiAgICBlbmRXcml0YWJsZSh0aGlzLCBzdGF0ZSwgY2IpO1xufTtcblxuXG5mdW5jdGlvbiBuZWVkRmluaXNoKHN0cmVhbSwgc3RhdGUpIHtcbiAgcmV0dXJuIChzdGF0ZS5lbmRpbmcgJiZcbiAgICAgICAgICBzdGF0ZS5sZW5ndGggPT09IDAgJiZcbiAgICAgICAgICAhc3RhdGUuZmluaXNoZWQgJiZcbiAgICAgICAgICAhc3RhdGUud3JpdGluZyk7XG59XG5cbmZ1bmN0aW9uIHByZWZpbmlzaChzdHJlYW0sIHN0YXRlKSB7XG4gIGlmICghc3RhdGUucHJlZmluaXNoZWQpIHtcbiAgICBzdGF0ZS5wcmVmaW5pc2hlZCA9IHRydWU7XG4gICAgc3RyZWFtLmVtaXQoJ3ByZWZpbmlzaCcpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmlzaE1heWJlKHN0cmVhbSwgc3RhdGUpIHtcbiAgdmFyIG5lZWQgPSBuZWVkRmluaXNoKHN0cmVhbSwgc3RhdGUpO1xuICBpZiAobmVlZCkge1xuICAgIGlmIChzdGF0ZS5wZW5kaW5nY2IgPT09IDApIHtcbiAgICAgIHByZWZpbmlzaChzdHJlYW0sIHN0YXRlKTtcbiAgICAgIHN0YXRlLmZpbmlzaGVkID0gdHJ1ZTtcbiAgICAgIHN0cmVhbS5lbWl0KCdmaW5pc2gnKTtcbiAgICB9IGVsc2VcbiAgICAgIHByZWZpbmlzaChzdHJlYW0sIHN0YXRlKTtcbiAgfVxuICByZXR1cm4gbmVlZDtcbn1cblxuZnVuY3Rpb24gZW5kV3JpdGFibGUoc3RyZWFtLCBzdGF0ZSwgY2IpIHtcbiAgc3RhdGUuZW5kaW5nID0gdHJ1ZTtcbiAgZmluaXNoTWF5YmUoc3RyZWFtLCBzdGF0ZSk7XG4gIGlmIChjYikge1xuICAgIGlmIChzdGF0ZS5maW5pc2hlZClcbiAgICAgIHByb2Nlc3MubmV4dFRpY2soY2IpO1xuICAgIGVsc2VcbiAgICAgIHN0cmVhbS5vbmNlKCdmaW5pc2gnLCBjYik7XG4gIH1cbiAgc3RhdGUuZW5kZWQgPSB0cnVlO1xufVxuIiwiZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9saWIvX3N0cmVhbV9yZWFkYWJsZS5qcycpO1xuZXhwb3J0cy5TdHJlYW0gPSByZXF1aXJlKCdzdHJlYW0nKTtcbmV4cG9ydHMuUmVhZGFibGUgPSBleHBvcnRzO1xuZXhwb3J0cy5Xcml0YWJsZSA9IHJlcXVpcmUoJy4vbGliL19zdHJlYW1fd3JpdGFibGUuanMnKTtcbmV4cG9ydHMuRHVwbGV4ID0gcmVxdWlyZSgnLi9saWIvX3N0cmVhbV9kdXBsZXguanMnKTtcbmV4cG9ydHMuVHJhbnNmb3JtID0gcmVxdWlyZSgnLi9saWIvX3N0cmVhbV90cmFuc2Zvcm0uanMnKTtcbmV4cG9ydHMuUGFzc1Rocm91Z2ggPSByZXF1aXJlKCcuL2xpYi9fc3RyZWFtX3Bhc3N0aHJvdWdoLmpzJyk7XG4iLCIvLyBwcm90b3R5cGUgY2xhc3MgZm9yIGhhc2ggZnVuY3Rpb25zXG5mdW5jdGlvbiBIYXNoIChibG9ja1NpemUsIGZpbmFsU2l6ZSkge1xuICB0aGlzLl9ibG9jayA9IG5ldyBCdWZmZXIoYmxvY2tTaXplKVxuICB0aGlzLl9maW5hbFNpemUgPSBmaW5hbFNpemVcbiAgdGhpcy5fYmxvY2tTaXplID0gYmxvY2tTaXplXG4gIHRoaXMuX2xlbiA9IDBcbiAgdGhpcy5fcyA9IDBcbn1cblxuSGFzaC5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gKGRhdGEsIGVuYykge1xuICBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgZW5jID0gZW5jIHx8ICd1dGY4J1xuICAgIGRhdGEgPSBuZXcgQnVmZmVyKGRhdGEsIGVuYylcbiAgfVxuXG4gIHZhciBsID0gdGhpcy5fbGVuICs9IGRhdGEubGVuZ3RoXG4gIHZhciBzID0gdGhpcy5fcyB8fCAwXG4gIHZhciBmID0gMFxuICB2YXIgYnVmZmVyID0gdGhpcy5fYmxvY2tcblxuICB3aGlsZSAocyA8IGwpIHtcbiAgICB2YXIgdCA9IE1hdGgubWluKGRhdGEubGVuZ3RoLCBmICsgdGhpcy5fYmxvY2tTaXplIC0gKHMgJSB0aGlzLl9ibG9ja1NpemUpKVxuICAgIHZhciBjaCA9ICh0IC0gZilcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2g7IGkrKykge1xuICAgICAgYnVmZmVyWyhzICUgdGhpcy5fYmxvY2tTaXplKSArIGldID0gZGF0YVtpICsgZl1cbiAgICB9XG5cbiAgICBzICs9IGNoXG4gICAgZiArPSBjaFxuXG4gICAgaWYgKChzICUgdGhpcy5fYmxvY2tTaXplKSA9PT0gMCkge1xuICAgICAgdGhpcy5fdXBkYXRlKGJ1ZmZlcilcbiAgICB9XG4gIH1cbiAgdGhpcy5fcyA9IHNcblxuICByZXR1cm4gdGhpc1xufVxuXG5IYXNoLnByb3RvdHlwZS5kaWdlc3QgPSBmdW5jdGlvbiAoZW5jKSB7XG4gIC8vIFN1cHBvc2UgdGhlIGxlbmd0aCBvZiB0aGUgbWVzc2FnZSBNLCBpbiBiaXRzLCBpcyBsXG4gIHZhciBsID0gdGhpcy5fbGVuICogOFxuXG4gIC8vIEFwcGVuZCB0aGUgYml0IDEgdG8gdGhlIGVuZCBvZiB0aGUgbWVzc2FnZVxuICB0aGlzLl9ibG9ja1t0aGlzLl9sZW4gJSB0aGlzLl9ibG9ja1NpemVdID0gMHg4MFxuXG4gIC8vIGFuZCB0aGVuIGsgemVybyBiaXRzLCB3aGVyZSBrIGlzIHRoZSBzbWFsbGVzdCBub24tbmVnYXRpdmUgc29sdXRpb24gdG8gdGhlIGVxdWF0aW9uIChsICsgMSArIGspID09PSBmaW5hbFNpemUgbW9kIGJsb2NrU2l6ZVxuICB0aGlzLl9ibG9jay5maWxsKDAsIHRoaXMuX2xlbiAlIHRoaXMuX2Jsb2NrU2l6ZSArIDEpXG5cbiAgaWYgKGwgJSAodGhpcy5fYmxvY2tTaXplICogOCkgPj0gdGhpcy5fZmluYWxTaXplICogOCkge1xuICAgIHRoaXMuX3VwZGF0ZSh0aGlzLl9ibG9jaylcbiAgICB0aGlzLl9ibG9jay5maWxsKDApXG4gIH1cblxuICAvLyB0byB0aGlzIGFwcGVuZCB0aGUgYmxvY2sgd2hpY2ggaXMgZXF1YWwgdG8gdGhlIG51bWJlciBsIHdyaXR0ZW4gaW4gYmluYXJ5XG4gIC8vIFRPRE86IGhhbmRsZSBjYXNlIHdoZXJlIGwgaXMgPiBNYXRoLnBvdygyLCAyOSlcbiAgdGhpcy5fYmxvY2sud3JpdGVJbnQzMkJFKGwsIHRoaXMuX2Jsb2NrU2l6ZSAtIDQpXG5cbiAgdmFyIGhhc2ggPSB0aGlzLl91cGRhdGUodGhpcy5fYmxvY2spIHx8IHRoaXMuX2hhc2goKVxuXG4gIHJldHVybiBlbmMgPyBoYXNoLnRvU3RyaW5nKGVuYykgOiBoYXNoXG59XG5cbkhhc2gucHJvdG90eXBlLl91cGRhdGUgPSBmdW5jdGlvbiAoKSB7XG4gIHRocm93IG5ldyBFcnJvcignX3VwZGF0ZSBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IHN1YmNsYXNzJylcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBIYXNoXG4iLCIvKipcbiAqIEEgSmF2YVNjcmlwdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgU2VjdXJlIEhhc2ggQWxnb3JpdGhtLCBTSEEtMjU2LCBhcyBkZWZpbmVkXG4gKiBpbiBGSVBTIDE4MC0yXG4gKiBWZXJzaW9uIDIuMi1iZXRhIENvcHlyaWdodCBBbmdlbCBNYXJpbiwgUGF1bCBKb2huc3RvbiAyMDAwIC0gMjAwOS5cbiAqIE90aGVyIGNvbnRyaWJ1dG9yczogR3JlZyBIb2x0LCBBbmRyZXcgS2VwZXJ0LCBZZG5hciwgTG9zdGluZXRcbiAqXG4gKi9cblxudmFyIGluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKVxudmFyIEhhc2ggPSByZXF1aXJlKCcuL2hhc2gnKVxuXG52YXIgSyA9IFtcbiAgMHg0MjhBMkY5OCwgMHg3MTM3NDQ5MSwgMHhCNUMwRkJDRiwgMHhFOUI1REJBNSxcbiAgMHgzOTU2QzI1QiwgMHg1OUYxMTFGMSwgMHg5MjNGODJBNCwgMHhBQjFDNUVENSxcbiAgMHhEODA3QUE5OCwgMHgxMjgzNUIwMSwgMHgyNDMxODVCRSwgMHg1NTBDN0RDMyxcbiAgMHg3MkJFNUQ3NCwgMHg4MERFQjFGRSwgMHg5QkRDMDZBNywgMHhDMTlCRjE3NCxcbiAgMHhFNDlCNjlDMSwgMHhFRkJFNDc4NiwgMHgwRkMxOURDNiwgMHgyNDBDQTFDQyxcbiAgMHgyREU5MkM2RiwgMHg0QTc0ODRBQSwgMHg1Q0IwQTlEQywgMHg3NkY5ODhEQSxcbiAgMHg5ODNFNTE1MiwgMHhBODMxQzY2RCwgMHhCMDAzMjdDOCwgMHhCRjU5N0ZDNyxcbiAgMHhDNkUwMEJGMywgMHhENUE3OTE0NywgMHgwNkNBNjM1MSwgMHgxNDI5Mjk2NyxcbiAgMHgyN0I3MEE4NSwgMHgyRTFCMjEzOCwgMHg0RDJDNkRGQywgMHg1MzM4MEQxMyxcbiAgMHg2NTBBNzM1NCwgMHg3NjZBMEFCQiwgMHg4MUMyQzkyRSwgMHg5MjcyMkM4NSxcbiAgMHhBMkJGRThBMSwgMHhBODFBNjY0QiwgMHhDMjRCOEI3MCwgMHhDNzZDNTFBMyxcbiAgMHhEMTkyRTgxOSwgMHhENjk5MDYyNCwgMHhGNDBFMzU4NSwgMHgxMDZBQTA3MCxcbiAgMHgxOUE0QzExNiwgMHgxRTM3NkMwOCwgMHgyNzQ4Nzc0QywgMHgzNEIwQkNCNSxcbiAgMHgzOTFDMENCMywgMHg0RUQ4QUE0QSwgMHg1QjlDQ0E0RiwgMHg2ODJFNkZGMyxcbiAgMHg3NDhGODJFRSwgMHg3OEE1NjM2RiwgMHg4NEM4NzgxNCwgMHg4Q0M3MDIwOCxcbiAgMHg5MEJFRkZGQSwgMHhBNDUwNkNFQiwgMHhCRUY5QTNGNywgMHhDNjcxNzhGMlxuXVxuXG52YXIgVyA9IG5ldyBBcnJheSg2NClcblxuZnVuY3Rpb24gU2hhMjU2ICgpIHtcbiAgdGhpcy5pbml0KClcblxuICB0aGlzLl93ID0gVyAvLyBuZXcgQXJyYXkoNjQpXG5cbiAgSGFzaC5jYWxsKHRoaXMsIDY0LCA1Nilcbn1cblxuaW5oZXJpdHMoU2hhMjU2LCBIYXNoKVxuXG5TaGEyNTYucHJvdG90eXBlLmluaXQgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuX2EgPSAweDZhMDllNjY3IHwgMFxuICB0aGlzLl9iID0gMHhiYjY3YWU4NSB8IDBcbiAgdGhpcy5fYyA9IDB4M2M2ZWYzNzIgfCAwXG4gIHRoaXMuX2QgPSAweGE1NGZmNTNhIHwgMFxuICB0aGlzLl9lID0gMHg1MTBlNTI3ZiB8IDBcbiAgdGhpcy5fZiA9IDB4OWIwNTY4OGMgfCAwXG4gIHRoaXMuX2cgPSAweDFmODNkOWFiIHwgMFxuICB0aGlzLl9oID0gMHg1YmUwY2QxOSB8IDBcblxuICByZXR1cm4gdGhpc1xufVxuXG5mdW5jdGlvbiBDaCAoeCwgeSwgeikge1xuICByZXR1cm4geiBeICh4ICYgKHkgXiB6KSlcbn1cblxuZnVuY3Rpb24gTWFqICh4LCB5LCB6KSB7XG4gIHJldHVybiAoeCAmIHkpIHwgKHogJiAoeCB8IHkpKVxufVxuXG5mdW5jdGlvbiBTaWdtYTAgKHgpIHtcbiAgcmV0dXJuICh4ID4+PiAyIHwgeCA8PCAzMCkgXiAoeCA+Pj4gMTMgfCB4IDw8IDE5KSBeICh4ID4+PiAyMiB8IHggPDwgMTApXG59XG5cbmZ1bmN0aW9uIFNpZ21hMSAoeCkge1xuICByZXR1cm4gKHggPj4+IDYgfCB4IDw8IDI2KSBeICh4ID4+PiAxMSB8IHggPDwgMjEpIF4gKHggPj4+IDI1IHwgeCA8PCA3KVxufVxuXG5mdW5jdGlvbiBHYW1tYTAgKHgpIHtcbiAgcmV0dXJuICh4ID4+PiA3IHwgeCA8PCAyNSkgXiAoeCA+Pj4gMTggfCB4IDw8IDE0KSBeICh4ID4+PiAzKVxufVxuXG5mdW5jdGlvbiBHYW1tYTEgKHgpIHtcbiAgcmV0dXJuICh4ID4+PiAxNyB8IHggPDwgMTUpIF4gKHggPj4+IDE5IHwgeCA8PCAxMykgXiAoeCA+Pj4gMTApXG59XG5cblNoYTI1Ni5wcm90b3R5cGUuX3VwZGF0ZSA9IGZ1bmN0aW9uIChNKSB7XG4gIHZhciBXID0gdGhpcy5fd1xuXG4gIHZhciBhID0gdGhpcy5fYSB8IDBcbiAgdmFyIGIgPSB0aGlzLl9iIHwgMFxuICB2YXIgYyA9IHRoaXMuX2MgfCAwXG4gIHZhciBkID0gdGhpcy5fZCB8IDBcbiAgdmFyIGUgPSB0aGlzLl9lIHwgMFxuICB2YXIgZiA9IHRoaXMuX2YgfCAwXG4gIHZhciBnID0gdGhpcy5fZyB8IDBcbiAgdmFyIGggPSB0aGlzLl9oIHwgMFxuXG4gIHZhciBqID0gMFxuXG4gIGZ1bmN0aW9uIGNhbGNXICgpIHsgcmV0dXJuIEdhbW1hMShXW2ogLSAyXSkgKyBXW2ogLSA3XSArIEdhbW1hMChXW2ogLSAxNV0pICsgV1tqIC0gMTZdIH1cbiAgZnVuY3Rpb24gbG9vcCAodykge1xuICAgIFdbal0gPSB3XG5cbiAgICB2YXIgVDEgPSBoICsgU2lnbWExKGUpICsgQ2goZSwgZiwgZykgKyBLW2pdICsgd1xuICAgIHZhciBUMiA9IFNpZ21hMChhKSArIE1haihhLCBiLCBjKVxuXG4gICAgaCA9IGdcbiAgICBnID0gZlxuICAgIGYgPSBlXG4gICAgZSA9IGQgKyBUMVxuICAgIGQgPSBjXG4gICAgYyA9IGJcbiAgICBiID0gYVxuICAgIGEgPSBUMSArIFQyXG5cbiAgICBqKytcbiAgfVxuXG4gIHdoaWxlIChqIDwgMTYpIGxvb3AoTS5yZWFkSW50MzJCRShqICogNCkpXG4gIHdoaWxlIChqIDwgNjQpIGxvb3AoY2FsY1coKSlcblxuICB0aGlzLl9hID0gKGEgKyB0aGlzLl9hKSB8IDBcbiAgdGhpcy5fYiA9IChiICsgdGhpcy5fYikgfCAwXG4gIHRoaXMuX2MgPSAoYyArIHRoaXMuX2MpIHwgMFxuICB0aGlzLl9kID0gKGQgKyB0aGlzLl9kKSB8IDBcbiAgdGhpcy5fZSA9IChlICsgdGhpcy5fZSkgfCAwXG4gIHRoaXMuX2YgPSAoZiArIHRoaXMuX2YpIHwgMFxuICB0aGlzLl9nID0gKGcgKyB0aGlzLl9nKSB8IDBcbiAgdGhpcy5faCA9IChoICsgdGhpcy5faCkgfCAwXG59XG5cblNoYTI1Ni5wcm90b3R5cGUuX2hhc2ggPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBIID0gbmV3IEJ1ZmZlcigzMilcblxuICBILndyaXRlSW50MzJCRSh0aGlzLl9hLCAwKVxuICBILndyaXRlSW50MzJCRSh0aGlzLl9iLCA0KVxuICBILndyaXRlSW50MzJCRSh0aGlzLl9jLCA4KVxuICBILndyaXRlSW50MzJCRSh0aGlzLl9kLCAxMilcbiAgSC53cml0ZUludDMyQkUodGhpcy5fZSwgMTYpXG4gIEgud3JpdGVJbnQzMkJFKHRoaXMuX2YsIDIwKVxuICBILndyaXRlSW50MzJCRSh0aGlzLl9nLCAyNClcbiAgSC53cml0ZUludDMyQkUodGhpcy5faCwgMjgpXG5cbiAgcmV0dXJuIEhcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBTaGEyNTZcbiIsInZhciBlc3MgPSByZXF1aXJlKCdldmVudC1zb3VyY2Utc3RyZWFtJylcbnZhciBuZXRzID0gcmVxdWlyZSgnbmV0cycpXG52YXIgcHVtcCA9IHJlcXVpcmUoJ3B1bXAnKVxudmFyIHRocm91Z2ggPSByZXF1aXJlKCd0aHJvdWdoMicpXG5cbnZhciBub29wID0gZnVuY3Rpb24gKCkge31cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXBwLCB1cmxzKSB7XG4gIGlmICghYXBwKSB0aHJvdyBuZXcgRXJyb3IoJ2FwcCBuYW1lIHJlcXVpcmVkJylcbiAgaWYgKCF1cmxzIHx8ICF1cmxzLmxlbmd0aCkgdGhyb3cgbmV3IEVycm9yKCdzaWduYWxodWIgdXJsKHMpIHJlcXVpcmVkJylcblxuICB2YXIgdGhhdCA9IHt9XG4gIGlmICghQXJyYXkuaXNBcnJheSh1cmxzKSkgdXJscyA9IFt1cmxzXVxuXG4gIHVybHMgPSB1cmxzLm1hcChmdW5jdGlvbiAodXJsKSB7XG4gICAgdXJsID0gdXJsLnJlcGxhY2UoL1xcLyQvLCAnJylcbiAgICByZXR1cm4gdXJsLmluZGV4T2YoJzovLycpID09PSAtMSA/ICdodHRwOi8vJyArIHVybCA6IHVybFxuICB9KVxuXG4gIHRoYXQuc3Vic2NyaWJlID0gZnVuY3Rpb24gKGNoYW5uZWwpIHtcbiAgICB2YXIgZW5kcG9pbnRcblxuICAgIGlmIChBcnJheS5pc0FycmF5KGNoYW5uZWwpKSB7XG4gICAgICBlbmRwb2ludCA9IGNoYW5uZWwuam9pbignLCcpXG4gICAgfSBlbHNlIHtcbiAgICAgIGVuZHBvaW50ID0gY2hhbm5lbFxuICAgIH1cblxuICAgIHZhciBhbGwgPSB0aHJvdWdoLm9iaigpXG4gICAgdmFyIHN0cmVhbXMgPSB1cmxzLm1hcChmdW5jdGlvbiAodXJsKSB7XG4gICAgICByZXR1cm4gZXNzKHVybCArICcvdjEvJyArIGFwcCArICcvJyArIGVuZHBvaW50LCB7anNvbjogdHJ1ZX0pXG4gICAgfSlcblxuICAgIGlmIChzdHJlYW1zLmxlbmd0aCA9PT0gMSkgcmV0dXJuIHN0cmVhbXNbMF1cblxuICAgIHZhciBhbGwgPSB0aHJvdWdoLm9iaigpXG5cbiAgICBhbGwuc2V0TWF4TGlzdGVuZXJzKDApXG4gICAgc3RyZWFtcy5mb3JFYWNoKGZ1bmN0aW9uIChzdHJlYW0pIHtcbiAgICAgIHN0cmVhbS5vbignb3BlbicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgYWxsLmVtaXQoJ29wZW4nKVxuICAgICAgfSlcbiAgICAgIHB1bXAoc3RyZWFtLCBhbGwpXG4gICAgfSlcblxuICAgIHJldHVybiBhbGxcbiAgfVxuXG4gIHZhciBicm9hZGNhc3QgPSBmdW5jdGlvbiAodXJsLCBjaGFubmVsLCBtZXNzYWdlLCBjYikge1xuICAgIG5ldHMoe1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBqc29uOiBtZXNzYWdlLFxuICAgICAgdXJsOiB1cmwgKyAnL3YxLycgKyBhcHAgKyAnLycgKyBjaGFubmVsXG4gICAgfSwgZnVuY3Rpb24gKGVyciwgcmVzKSB7XG4gICAgICBpZiAoZXJyKSByZXR1cm4gY2IoZXJyKVxuICAgICAgaWYgKHJlcy5zdGF0dXNDb2RlICE9PSAyMDApIHJldHVybiBjYihuZXcgRXJyb3IoJ0JhZCBzdGF0dXM6ICcgKyByZXMuc3RhdHVzQ29kZSkpXG4gICAgICBjYigpXG4gICAgfSlcbiAgfVxuXG4gIHRoYXQuYnJvYWRjYXN0ID0gZnVuY3Rpb24gKGNoYW5uZWwsIG1lc3NhZ2UsIGNiKSB7XG4gICAgaWYgKCFjYikgY2IgPSBub29wXG5cbiAgICB2YXIgcGVuZGluZyA9IHVybHMubGVuZ3RoXG4gICAgdmFyIGVycm9ycyA9IDBcblxuICAgIHVybHMuZm9yRWFjaChmdW5jdGlvbiAodXJsKSB7XG4gICAgICBicm9hZGNhc3QodXJsLCBjaGFubmVsLCBtZXNzYWdlLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgIGlmIChlcnIpIGVycm9ycysrXG4gICAgICAgIGlmICgtLXBlbmRpbmcpIHJldHVyblxuICAgICAgICBpZiAoZXJyb3JzID09PSB1cmxzLmxlbmd0aCkgcmV0dXJuIGNiKGVycilcbiAgICAgICAgY2IoKVxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgcmV0dXJuIHRoYXRcbn1cbiIsInZhciB2YXJpbnQgPSByZXF1aXJlKCd2YXJpbnQnKVxuZXhwb3J0cy5lbmNvZGUgPSBmdW5jdGlvbiBlbmNvZGUgKHYsIGIsIG8pIHtcbiAgdiA9IHYgPj0gMCA/IHYqMiA6IHYqLTIgLSAxXG4gIHZhciByID0gdmFyaW50LmVuY29kZSh2LCBiLCBvKVxuICBlbmNvZGUuYnl0ZXMgPSB2YXJpbnQuZW5jb2RlLmJ5dGVzXG4gIHJldHVybiByXG59XG5leHBvcnRzLmRlY29kZSA9IGZ1bmN0aW9uIGRlY29kZSAoYiwgbykge1xuICB2YXIgdiA9IHZhcmludC5kZWNvZGUoYiwgbylcbiAgZGVjb2RlLmJ5dGVzID0gdmFyaW50LmRlY29kZS5ieXRlc1xuICByZXR1cm4gdiAmIDEgPyAodisxKSAvIC0yIDogdiAvIDJcbn1cblxuZXhwb3J0cy5lbmNvZGluZ0xlbmd0aCA9IGZ1bmN0aW9uICh2KSB7XG4gIHJldHVybiB2YXJpbnQuZW5jb2RpbmdMZW5ndGgodiA+PSAwID8gdioyIDogdiotMiAtIDEpXG59XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHJlYWRcblxudmFyIE1TQiA9IDB4ODBcbiAgLCBSRVNUID0gMHg3RlxuXG5mdW5jdGlvbiByZWFkKGJ1Ziwgb2Zmc2V0KSB7XG4gIHZhciByZXMgICAgPSAwXG4gICAgLCBvZmZzZXQgPSBvZmZzZXQgfHwgMFxuICAgICwgc2hpZnQgID0gMFxuICAgICwgY291bnRlciA9IG9mZnNldFxuICAgICwgYlxuICAgICwgbCA9IGJ1Zi5sZW5ndGhcbiAgXG4gIGRvIHtcbiAgICBpZihjb3VudGVyID49IGwpIHtcbiAgICAgIHJlYWQuYnl0ZXNSZWFkID0gMFxuICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgIH1cbiAgICBiID0gYnVmW2NvdW50ZXIrK11cbiAgICByZXMgKz0gc2hpZnQgPCAyOFxuICAgICAgPyAoYiAmIFJFU1QpIDw8IHNoaWZ0XG4gICAgICA6IChiICYgUkVTVCkgKiBNYXRoLnBvdygyLCBzaGlmdClcbiAgICBzaGlmdCArPSA3XG4gIH0gd2hpbGUgKGIgPj0gTVNCKVxuICBcbiAgcmVhZC5ieXRlcyA9IGNvdW50ZXIgLSBvZmZzZXRcbiAgXG4gIHJldHVybiByZXNcbn1cbiIsIm1vZHVsZS5leHBvcnRzID0gZW5jb2RlXG5cbnZhciBNU0IgPSAweDgwXG4gICwgUkVTVCA9IDB4N0ZcbiAgLCBNU0JBTEwgPSB+UkVTVFxuICAsIElOVCA9IE1hdGgucG93KDIsIDMxKVxuXG5mdW5jdGlvbiBlbmNvZGUobnVtLCBvdXQsIG9mZnNldCkge1xuICBvdXQgPSBvdXQgfHwgW11cbiAgb2Zmc2V0ID0gb2Zmc2V0IHx8IDBcbiAgdmFyIG9sZE9mZnNldCA9IG9mZnNldFxuXG4gIHdoaWxlKG51bSA+PSBJTlQpIHtcbiAgICBvdXRbb2Zmc2V0KytdID0gKG51bSAmIDB4RkYpIHwgTVNCXG4gICAgbnVtIC89IDEyOFxuICB9XG4gIHdoaWxlKG51bSAmIE1TQkFMTCkge1xuICAgIG91dFtvZmZzZXQrK10gPSAobnVtICYgMHhGRikgfCBNU0JcbiAgICBudW0gPj4+PSA3XG4gIH1cbiAgb3V0W29mZnNldF0gPSBudW0gfCAwXG4gIFxuICBlbmNvZGUuYnl0ZXMgPSBvZmZzZXQgLSBvbGRPZmZzZXQgKyAxXG4gIFxuICByZXR1cm4gb3V0XG59XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBlbmNvZGU6IHJlcXVpcmUoJy4vZW5jb2RlLmpzJylcbiAgLCBkZWNvZGU6IHJlcXVpcmUoJy4vZGVjb2RlLmpzJylcbiAgLCBlbmNvZGluZ0xlbmd0aDogcmVxdWlyZSgnLi9sZW5ndGguanMnKVxufVxuIiwiXG52YXIgTjEgPSBNYXRoLnBvdygyLCAgNylcbnZhciBOMiA9IE1hdGgucG93KDIsIDE0KVxudmFyIE4zID0gTWF0aC5wb3coMiwgMjEpXG52YXIgTjQgPSBNYXRoLnBvdygyLCAyOClcbnZhciBONSA9IE1hdGgucG93KDIsIDM1KVxudmFyIE42ID0gTWF0aC5wb3coMiwgNDIpXG52YXIgTjcgPSBNYXRoLnBvdygyLCA0OSlcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgcmV0dXJuIChcbiAgICB2YWx1ZSA8IE4xID8gMVxuICA6IHZhbHVlIDwgTjIgPyAyXG4gIDogdmFsdWUgPCBOMyA/IDNcbiAgOiB2YWx1ZSA8IE40ID8gNFxuICA6IHZhbHVlIDwgTjUgPyA1XG4gIDogdmFsdWUgPCBONiA/IDZcbiAgOiB2YWx1ZSA8IE43ID8gN1xuICA6ICAgICAgICAgICAgICA4XG4gIClcbn1cbiIsIi8qIGdsb2JhbCBCbG9iICovXG5cbm1vZHVsZS5leHBvcnRzID0gUGVlclxuXG52YXIgZGVidWcgPSByZXF1aXJlKCdkZWJ1ZycpKCdzaW1wbGUtcGVlcicpXG52YXIgZ2V0QnJvd3NlclJUQyA9IHJlcXVpcmUoJ2dldC1icm93c2VyLXJ0YycpXG52YXIgaGF0ID0gcmVxdWlyZSgnaGF0JylcbnZhciBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJylcbnZhciBpc1R5cGVkQXJyYXkgPSByZXF1aXJlKCdpcy10eXBlZGFycmF5JylcbnZhciBvbmNlID0gcmVxdWlyZSgnb25jZScpXG52YXIgc3RyZWFtID0gcmVxdWlyZSgnc3RyZWFtJylcblxuaW5oZXJpdHMoUGVlciwgc3RyZWFtLkR1cGxleClcblxuLyoqXG4gKiBXZWJSVEMgcGVlciBjb25uZWN0aW9uLiBTYW1lIEFQSSBhcyBub2RlIGNvcmUgYG5ldC5Tb2NrZXRgLCBwbHVzIGEgZmV3IGV4dHJhIG1ldGhvZHMuXG4gKiBEdXBsZXggc3RyZWFtLlxuICogQHBhcmFtIHtPYmplY3R9IG9wdHNcbiAqL1xuZnVuY3Rpb24gUGVlciAob3B0cykge1xuICB2YXIgc2VsZiA9IHRoaXNcbiAgaWYgKCEoc2VsZiBpbnN0YW5jZW9mIFBlZXIpKSByZXR1cm4gbmV3IFBlZXIob3B0cylcbiAgc2VsZi5fZGVidWcoJ25ldyBwZWVyICVvJywgb3B0cylcblxuICBpZiAoIW9wdHMpIG9wdHMgPSB7fVxuICBvcHRzLmFsbG93SGFsZk9wZW4gPSBmYWxzZVxuICBpZiAob3B0cy5oaWdoV2F0ZXJNYXJrID09IG51bGwpIG9wdHMuaGlnaFdhdGVyTWFyayA9IDEwMjQgKiAxMDI0XG5cbiAgc3RyZWFtLkR1cGxleC5jYWxsKHNlbGYsIG9wdHMpXG5cbiAgc2VsZi5pbml0aWF0b3IgPSBvcHRzLmluaXRpYXRvciB8fCBmYWxzZVxuICBzZWxmLmNoYW5uZWxDb25maWcgPSBvcHRzLmNoYW5uZWxDb25maWcgfHwgUGVlci5jaGFubmVsQ29uZmlnXG4gIHNlbGYuY2hhbm5lbE5hbWUgPSBvcHRzLmluaXRpYXRvciA/IChvcHRzLmNoYW5uZWxOYW1lIHx8IGhhdCgxNjApKSA6IG51bGxcbiAgc2VsZi5jb25maWcgPSBvcHRzLmNvbmZpZyB8fCBQZWVyLmNvbmZpZ1xuICBzZWxmLmNvbnN0cmFpbnRzID0gb3B0cy5jb25zdHJhaW50cyB8fCBQZWVyLmNvbnN0cmFpbnRzXG4gIHNlbGYub2ZmZXJDb25zdHJhaW50cyA9IG9wdHMub2ZmZXJDb25zdHJhaW50c1xuICBzZWxmLmFuc3dlckNvbnN0cmFpbnRzID0gb3B0cy5hbnN3ZXJDb25zdHJhaW50c1xuICBzZWxmLnJlY29ubmVjdFRpbWVyID0gb3B0cy5yZWNvbm5lY3RUaW1lciB8fCBmYWxzZVxuICBzZWxmLnNkcFRyYW5zZm9ybSA9IG9wdHMuc2RwVHJhbnNmb3JtIHx8IGZ1bmN0aW9uIChzZHApIHsgcmV0dXJuIHNkcCB9XG4gIHNlbGYuc3RyZWFtID0gb3B0cy5zdHJlYW0gfHwgZmFsc2VcbiAgc2VsZi50cmlja2xlID0gb3B0cy50cmlja2xlICE9PSB1bmRlZmluZWQgPyBvcHRzLnRyaWNrbGUgOiB0cnVlXG5cbiAgc2VsZi5kZXN0cm95ZWQgPSBmYWxzZVxuICBzZWxmLmNvbm5lY3RlZCA9IGZhbHNlXG5cbiAgLy8gc28gUGVlciBvYmplY3QgYWx3YXlzIGhhcyBzYW1lIHNoYXBlIChWOCBvcHRpbWl6YXRpb24pXG4gIHNlbGYucmVtb3RlQWRkcmVzcyA9IHVuZGVmaW5lZFxuICBzZWxmLnJlbW90ZUZhbWlseSA9IHVuZGVmaW5lZFxuICBzZWxmLnJlbW90ZVBvcnQgPSB1bmRlZmluZWRcbiAgc2VsZi5sb2NhbEFkZHJlc3MgPSB1bmRlZmluZWRcbiAgc2VsZi5sb2NhbFBvcnQgPSB1bmRlZmluZWRcblxuICBzZWxmLl9pc1dydGMgPSAhIW9wdHMud3J0YyAvLyBIQUNLOiB0byBmaXggYHdydGNgIGJ1Zy4gU2VlIGlzc3VlOiAjNjBcbiAgc2VsZi5fd3J0YyA9IG9wdHMud3J0YyB8fCBnZXRCcm93c2VyUlRDKClcbiAgaWYgKCFzZWxmLl93cnRjKSB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIFdlYlJUQyBzdXBwb3J0OiBTcGVjaWZ5IGBvcHRzLndydGNgIG9wdGlvbiBpbiB0aGlzIGVudmlyb25tZW50JylcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBXZWJSVEMgc3VwcG9ydDogTm90IGEgc3VwcG9ydGVkIGJyb3dzZXInKVxuICAgIH1cbiAgfVxuXG4gIHNlbGYuX21heEJ1ZmZlcmVkQW1vdW50ID0gb3B0cy5oaWdoV2F0ZXJNYXJrXG4gIHNlbGYuX3BjUmVhZHkgPSBmYWxzZVxuICBzZWxmLl9jaGFubmVsUmVhZHkgPSBmYWxzZVxuICBzZWxmLl9pY2VDb21wbGV0ZSA9IGZhbHNlIC8vIGljZSBjYW5kaWRhdGUgdHJpY2tsZSBkb25lIChnb3QgbnVsbCBjYW5kaWRhdGUpXG4gIHNlbGYuX2NoYW5uZWwgPSBudWxsXG4gIHNlbGYuX3BlbmRpbmdDYW5kaWRhdGVzID0gW11cblxuICBzZWxmLl9jaHVuayA9IG51bGxcbiAgc2VsZi5fY2IgPSBudWxsXG4gIHNlbGYuX2ludGVydmFsID0gbnVsbFxuICBzZWxmLl9yZWNvbm5lY3RUaW1lb3V0ID0gbnVsbFxuXG4gIHNlbGYuX3BjID0gbmV3IChzZWxmLl93cnRjLlJUQ1BlZXJDb25uZWN0aW9uKShzZWxmLmNvbmZpZywgc2VsZi5jb25zdHJhaW50cylcbiAgc2VsZi5fcGMub25pY2Vjb25uZWN0aW9uc3RhdGVjaGFuZ2UgPSBzZWxmLl9vbkljZUNvbm5lY3Rpb25TdGF0ZUNoYW5nZS5iaW5kKHNlbGYpXG4gIHNlbGYuX3BjLm9uc2lnbmFsaW5nc3RhdGVjaGFuZ2UgPSBzZWxmLl9vblNpZ25hbGluZ1N0YXRlQ2hhbmdlLmJpbmQoc2VsZilcbiAgc2VsZi5fcGMub25pY2VjYW5kaWRhdGUgPSBzZWxmLl9vbkljZUNhbmRpZGF0ZS5iaW5kKHNlbGYpXG5cbiAgaWYgKHNlbGYuc3RyZWFtKSBzZWxmLl9wYy5hZGRTdHJlYW0oc2VsZi5zdHJlYW0pXG4gIHNlbGYuX3BjLm9uYWRkc3RyZWFtID0gc2VsZi5fb25BZGRTdHJlYW0uYmluZChzZWxmKVxuXG4gIGlmIChzZWxmLmluaXRpYXRvcikge1xuICAgIHNlbGYuX3NldHVwRGF0YSh7IGNoYW5uZWw6IHNlbGYuX3BjLmNyZWF0ZURhdGFDaGFubmVsKHNlbGYuY2hhbm5lbE5hbWUsIHNlbGYuY2hhbm5lbENvbmZpZykgfSlcbiAgICBzZWxmLl9wYy5vbm5lZ290aWF0aW9ubmVlZGVkID0gb25jZShzZWxmLl9jcmVhdGVPZmZlci5iaW5kKHNlbGYpKVxuICAgIC8vIE9ubHkgQ2hyb21lIHRyaWdnZXJzIFwibmVnb3RpYXRpb25uZWVkZWRcIjsgdGhpcyBpcyBhIHdvcmthcm91bmQgZm9yIG90aGVyXG4gICAgLy8gaW1wbGVtZW50YXRpb25zXG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8ICF3aW5kb3cud2Via2l0UlRDUGVlckNvbm5lY3Rpb24pIHtcbiAgICAgIHNlbGYuX3BjLm9ubmVnb3RpYXRpb25uZWVkZWQoKVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBzZWxmLl9wYy5vbmRhdGFjaGFubmVsID0gc2VsZi5fc2V0dXBEYXRhLmJpbmQoc2VsZilcbiAgfVxuXG4gIHNlbGYub24oJ2ZpbmlzaCcsIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoc2VsZi5jb25uZWN0ZWQpIHtcbiAgICAgIC8vIFdoZW4gbG9jYWwgcGVlciBpcyBmaW5pc2hlZCB3cml0aW5nLCBjbG9zZSBjb25uZWN0aW9uIHRvIHJlbW90ZSBwZWVyLlxuICAgICAgLy8gSGFsZiBvcGVuIGNvbm5lY3Rpb25zIGFyZSBjdXJyZW50bHkgbm90IHN1cHBvcnRlZC5cbiAgICAgIC8vIFdhaXQgYSBiaXQgYmVmb3JlIGRlc3Ryb3lpbmcgc28gdGhlIGRhdGFjaGFubmVsIGZsdXNoZXMuXG4gICAgICAvLyBUT0RPOiBpcyB0aGVyZSBhIG1vcmUgcmVsaWFibGUgd2F5IHRvIGFjY29tcGxpc2ggdGhpcz9cbiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICBzZWxmLl9kZXN0cm95KClcbiAgICAgIH0sIDEwMClcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSWYgZGF0YSBjaGFubmVsIGlzIG5vdCBjb25uZWN0ZWQgd2hlbiBsb2NhbCBwZWVyIGlzIGZpbmlzaGVkIHdyaXRpbmcsIHdhaXQgdW50aWxcbiAgICAgIC8vIGRhdGEgaXMgZmx1c2hlZCB0byBuZXR3b3JrIGF0IFwiY29ubmVjdFwiIGV2ZW50LlxuICAgICAgLy8gVE9ETzogaXMgdGhlcmUgYSBtb3JlIHJlbGlhYmxlIHdheSB0byBhY2NvbXBsaXNoIHRoaXM/XG4gICAgICBzZWxmLm9uY2UoJ2Nvbm5lY3QnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHNlbGYuX2Rlc3Ryb3koKVxuICAgICAgICB9LCAxMDApXG4gICAgICB9KVxuICAgIH1cbiAgfSlcbn1cblxuUGVlci5XRUJSVENfU1VQUE9SVCA9ICEhZ2V0QnJvd3NlclJUQygpXG5cbi8qKlxuICogRXhwb3NlIGNvbmZpZywgY29uc3RyYWludHMsIGFuZCBkYXRhIGNoYW5uZWwgY29uZmlnIGZvciBvdmVycmlkaW5nIGFsbCBQZWVyXG4gKiBpbnN0YW5jZXMuIE90aGVyd2lzZSwganVzdCBzZXQgb3B0cy5jb25maWcsIG9wdHMuY29uc3RyYWludHMsIG9yIG9wdHMuY2hhbm5lbENvbmZpZ1xuICogd2hlbiBjb25zdHJ1Y3RpbmcgYSBQZWVyLlxuICovXG5QZWVyLmNvbmZpZyA9IHtcbiAgaWNlU2VydmVyczogW1xuICAgIHtcbiAgICAgIHVybDogJ3N0dW46MjMuMjEuMTUwLjEyMScsIC8vIGRlcHJlY2F0ZWQsIHJlcGxhY2VkIGJ5IGB1cmxzYFxuICAgICAgdXJsczogJ3N0dW46MjMuMjEuMTUwLjEyMSdcbiAgICB9XG4gIF1cbn1cblBlZXIuY29uc3RyYWludHMgPSB7fVxuUGVlci5jaGFubmVsQ29uZmlnID0ge31cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KFBlZXIucHJvdG90eXBlLCAnYnVmZmVyU2l6ZScsIHtcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzXG4gICAgcmV0dXJuIChzZWxmLl9jaGFubmVsICYmIHNlbGYuX2NoYW5uZWwuYnVmZmVyZWRBbW91bnQpIHx8IDBcbiAgfVxufSlcblxuUGVlci5wcm90b3R5cGUuYWRkcmVzcyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHNlbGYgPSB0aGlzXG4gIHJldHVybiB7IHBvcnQ6IHNlbGYubG9jYWxQb3J0LCBmYW1pbHk6ICdJUHY0JywgYWRkcmVzczogc2VsZi5sb2NhbEFkZHJlc3MgfVxufVxuXG5QZWVyLnByb3RvdHlwZS5zaWduYWwgPSBmdW5jdGlvbiAoZGF0YSkge1xuICB2YXIgc2VsZiA9IHRoaXNcbiAgaWYgKHNlbGYuZGVzdHJveWVkKSB0aHJvdyBuZXcgRXJyb3IoJ2Nhbm5vdCBzaWduYWwgYWZ0ZXIgcGVlciBpcyBkZXN0cm95ZWQnKVxuICBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgdHJ5IHtcbiAgICAgIGRhdGEgPSBKU09OLnBhcnNlKGRhdGEpXG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBkYXRhID0ge31cbiAgICB9XG4gIH1cbiAgc2VsZi5fZGVidWcoJ3NpZ25hbCgpJylcblxuICBmdW5jdGlvbiBhZGRJY2VDYW5kaWRhdGUgKGNhbmRpZGF0ZSkge1xuICAgIHRyeSB7XG4gICAgICBzZWxmLl9wYy5hZGRJY2VDYW5kaWRhdGUoXG4gICAgICAgIG5ldyBzZWxmLl93cnRjLlJUQ0ljZUNhbmRpZGF0ZShjYW5kaWRhdGUpLCBub29wLCBzZWxmLl9vbkVycm9yLmJpbmQoc2VsZilcbiAgICAgIClcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHNlbGYuX2Rlc3Ryb3kobmV3IEVycm9yKCdlcnJvciBhZGRpbmcgY2FuZGlkYXRlOiAnICsgZXJyLm1lc3NhZ2UpKVxuICAgIH1cbiAgfVxuXG4gIGlmIChkYXRhLnNkcCkge1xuICAgIHNlbGYuX3BjLnNldFJlbW90ZURlc2NyaXB0aW9uKG5ldyAoc2VsZi5fd3J0Yy5SVENTZXNzaW9uRGVzY3JpcHRpb24pKGRhdGEpLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoc2VsZi5kZXN0cm95ZWQpIHJldHVyblxuICAgICAgaWYgKHNlbGYuX3BjLnJlbW90ZURlc2NyaXB0aW9uLnR5cGUgPT09ICdvZmZlcicpIHNlbGYuX2NyZWF0ZUFuc3dlcigpXG5cbiAgICAgIHNlbGYuX3BlbmRpbmdDYW5kaWRhdGVzLmZvckVhY2goYWRkSWNlQ2FuZGlkYXRlKVxuICAgICAgc2VsZi5fcGVuZGluZ0NhbmRpZGF0ZXMgPSBbXVxuICAgIH0sIHNlbGYuX29uRXJyb3IuYmluZChzZWxmKSlcbiAgfVxuICBpZiAoZGF0YS5jYW5kaWRhdGUpIHtcbiAgICBpZiAoc2VsZi5fcGMucmVtb3RlRGVzY3JpcHRpb24pIGFkZEljZUNhbmRpZGF0ZShkYXRhLmNhbmRpZGF0ZSlcbiAgICBlbHNlIHNlbGYuX3BlbmRpbmdDYW5kaWRhdGVzLnB1c2goZGF0YS5jYW5kaWRhdGUpXG4gIH1cbiAgaWYgKCFkYXRhLnNkcCAmJiAhZGF0YS5jYW5kaWRhdGUpIHtcbiAgICBzZWxmLl9kZXN0cm95KG5ldyBFcnJvcignc2lnbmFsKCkgY2FsbGVkIHdpdGggaW52YWxpZCBzaWduYWwgZGF0YScpKVxuICB9XG59XG5cbi8qKlxuICogU2VuZCB0ZXh0L2JpbmFyeSBkYXRhIHRvIHRoZSByZW1vdGUgcGVlci5cbiAqIEBwYXJhbSB7VHlwZWRBcnJheVZpZXd8QXJyYXlCdWZmZXJ8QnVmZmVyfHN0cmluZ3xCbG9ifE9iamVjdH0gY2h1bmtcbiAqL1xuUGVlci5wcm90b3R5cGUuc2VuZCA9IGZ1bmN0aW9uIChjaHVuaykge1xuICB2YXIgc2VsZiA9IHRoaXNcblxuICBpZiAoIWlzVHlwZWRBcnJheS5zdHJpY3QoY2h1bmspICYmICEoY2h1bmsgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikgJiZcbiAgICAhQnVmZmVyLmlzQnVmZmVyKGNodW5rKSAmJiB0eXBlb2YgY2h1bmsgIT09ICdzdHJpbmcnICYmXG4gICAgKHR5cGVvZiBCbG9iID09PSAndW5kZWZpbmVkJyB8fCAhKGNodW5rIGluc3RhbmNlb2YgQmxvYikpKSB7XG4gICAgY2h1bmsgPSBKU09OLnN0cmluZ2lmeShjaHVuaylcbiAgfVxuXG4gIC8vIEhBQ0s6IGB3cnRjYCBtb2R1bGUgZG9lc24ndCBhY2NlcHQgbm9kZS5qcyBidWZmZXIuIFNlZSBpc3N1ZTogIzYwXG4gIGlmIChCdWZmZXIuaXNCdWZmZXIoY2h1bmspICYmIHNlbGYuX2lzV3J0Yykge1xuICAgIGNodW5rID0gbmV3IFVpbnQ4QXJyYXkoY2h1bmspXG4gIH1cblxuICB2YXIgbGVuID0gY2h1bmsubGVuZ3RoIHx8IGNodW5rLmJ5dGVMZW5ndGggfHwgY2h1bmsuc2l6ZVxuICBzZWxmLl9jaGFubmVsLnNlbmQoY2h1bmspXG4gIHNlbGYuX2RlYnVnKCd3cml0ZTogJWQgYnl0ZXMnLCBsZW4pXG59XG5cblBlZXIucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbiAob25jbG9zZSkge1xuICB2YXIgc2VsZiA9IHRoaXNcbiAgc2VsZi5fZGVzdHJveShudWxsLCBvbmNsb3NlKVxufVxuXG5QZWVyLnByb3RvdHlwZS5fZGVzdHJveSA9IGZ1bmN0aW9uIChlcnIsIG9uY2xvc2UpIHtcbiAgdmFyIHNlbGYgPSB0aGlzXG4gIGlmIChzZWxmLmRlc3Ryb3llZCkgcmV0dXJuXG4gIGlmIChvbmNsb3NlKSBzZWxmLm9uY2UoJ2Nsb3NlJywgb25jbG9zZSlcblxuICBzZWxmLl9kZWJ1ZygnZGVzdHJveSAoZXJyb3I6ICVzKScsIGVyciAmJiBlcnIubWVzc2FnZSlcblxuICBzZWxmLnJlYWRhYmxlID0gc2VsZi53cml0YWJsZSA9IGZhbHNlXG5cbiAgaWYgKCFzZWxmLl9yZWFkYWJsZVN0YXRlLmVuZGVkKSBzZWxmLnB1c2gobnVsbClcbiAgaWYgKCFzZWxmLl93cml0YWJsZVN0YXRlLmZpbmlzaGVkKSBzZWxmLmVuZCgpXG5cbiAgc2VsZi5kZXN0cm95ZWQgPSB0cnVlXG4gIHNlbGYuY29ubmVjdGVkID0gZmFsc2VcbiAgc2VsZi5fcGNSZWFkeSA9IGZhbHNlXG4gIHNlbGYuX2NoYW5uZWxSZWFkeSA9IGZhbHNlXG5cbiAgc2VsZi5fY2h1bmsgPSBudWxsXG4gIHNlbGYuX2NiID0gbnVsbFxuICBjbGVhckludGVydmFsKHNlbGYuX2ludGVydmFsKVxuICBjbGVhclRpbWVvdXQoc2VsZi5fcmVjb25uZWN0VGltZW91dClcblxuICBpZiAoc2VsZi5fcGMpIHtcbiAgICB0cnkge1xuICAgICAgc2VsZi5fcGMuY2xvc2UoKVxuICAgIH0gY2F0Y2ggKGVycikge31cblxuICAgIHNlbGYuX3BjLm9uaWNlY29ubmVjdGlvbnN0YXRlY2hhbmdlID0gbnVsbFxuICAgIHNlbGYuX3BjLm9uc2lnbmFsaW5nc3RhdGVjaGFuZ2UgPSBudWxsXG4gICAgc2VsZi5fcGMub25pY2VjYW5kaWRhdGUgPSBudWxsXG4gIH1cblxuICBpZiAoc2VsZi5fY2hhbm5lbCkge1xuICAgIHRyeSB7XG4gICAgICBzZWxmLl9jaGFubmVsLmNsb3NlKClcbiAgICB9IGNhdGNoIChlcnIpIHt9XG5cbiAgICBzZWxmLl9jaGFubmVsLm9ubWVzc2FnZSA9IG51bGxcbiAgICBzZWxmLl9jaGFubmVsLm9ub3BlbiA9IG51bGxcbiAgICBzZWxmLl9jaGFubmVsLm9uY2xvc2UgPSBudWxsXG4gIH1cbiAgc2VsZi5fcGMgPSBudWxsXG4gIHNlbGYuX2NoYW5uZWwgPSBudWxsXG5cbiAgaWYgKGVycikgc2VsZi5lbWl0KCdlcnJvcicsIGVycilcbiAgc2VsZi5lbWl0KCdjbG9zZScpXG59XG5cblBlZXIucHJvdG90eXBlLl9zZXR1cERhdGEgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgdmFyIHNlbGYgPSB0aGlzXG4gIHNlbGYuX2NoYW5uZWwgPSBldmVudC5jaGFubmVsXG4gIHNlbGYuY2hhbm5lbE5hbWUgPSBzZWxmLl9jaGFubmVsLmxhYmVsXG5cbiAgc2VsZi5fY2hhbm5lbC5iaW5hcnlUeXBlID0gJ2FycmF5YnVmZmVyJ1xuICBzZWxmLl9jaGFubmVsLm9ubWVzc2FnZSA9IHNlbGYuX29uQ2hhbm5lbE1lc3NhZ2UuYmluZChzZWxmKVxuICBzZWxmLl9jaGFubmVsLm9ub3BlbiA9IHNlbGYuX29uQ2hhbm5lbE9wZW4uYmluZChzZWxmKVxuICBzZWxmLl9jaGFubmVsLm9uY2xvc2UgPSBzZWxmLl9vbkNoYW5uZWxDbG9zZS5iaW5kKHNlbGYpXG59XG5cblBlZXIucHJvdG90eXBlLl9yZWFkID0gZnVuY3Rpb24gKCkge31cblxuUGVlci5wcm90b3R5cGUuX3dyaXRlID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgdmFyIHNlbGYgPSB0aGlzXG4gIGlmIChzZWxmLmRlc3Ryb3llZCkgcmV0dXJuIGNiKG5ldyBFcnJvcignY2Fubm90IHdyaXRlIGFmdGVyIHBlZXIgaXMgZGVzdHJveWVkJykpXG5cbiAgaWYgKHNlbGYuY29ubmVjdGVkKSB7XG4gICAgdHJ5IHtcbiAgICAgIHNlbGYuc2VuZChjaHVuaylcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHJldHVybiBzZWxmLl9vbkVycm9yKGVycilcbiAgICB9XG4gICAgaWYgKHNlbGYuX2NoYW5uZWwuYnVmZmVyZWRBbW91bnQgPiBzZWxmLl9tYXhCdWZmZXJlZEFtb3VudCkge1xuICAgICAgc2VsZi5fZGVidWcoJ3N0YXJ0IGJhY2twcmVzc3VyZTogYnVmZmVyZWRBbW91bnQgJWQnLCBzZWxmLl9jaGFubmVsLmJ1ZmZlcmVkQW1vdW50KVxuICAgICAgc2VsZi5fY2IgPSBjYlxuICAgIH0gZWxzZSB7XG4gICAgICBjYihudWxsKVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBzZWxmLl9kZWJ1Zygnd3JpdGUgYmVmb3JlIGNvbm5lY3QnKVxuICAgIHNlbGYuX2NodW5rID0gY2h1bmtcbiAgICBzZWxmLl9jYiA9IGNiXG4gIH1cbn1cblxuUGVlci5wcm90b3R5cGUuX2NyZWF0ZU9mZmVyID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc2VsZiA9IHRoaXNcbiAgaWYgKHNlbGYuZGVzdHJveWVkKSByZXR1cm5cblxuICBzZWxmLl9wYy5jcmVhdGVPZmZlcihmdW5jdGlvbiAob2ZmZXIpIHtcbiAgICBpZiAoc2VsZi5kZXN0cm95ZWQpIHJldHVyblxuICAgIG9mZmVyLnNkcCA9IHNlbGYuc2RwVHJhbnNmb3JtKG9mZmVyLnNkcClcbiAgICBzZWxmLl9wYy5zZXRMb2NhbERlc2NyaXB0aW9uKG9mZmVyLCBub29wLCBzZWxmLl9vbkVycm9yLmJpbmQoc2VsZikpXG4gICAgdmFyIHNlbmRPZmZlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBzaWduYWwgPSBzZWxmLl9wYy5sb2NhbERlc2NyaXB0aW9uIHx8IG9mZmVyXG4gICAgICBzZWxmLl9kZWJ1Zygnc2lnbmFsJylcbiAgICAgIHNlbGYuZW1pdCgnc2lnbmFsJywge1xuICAgICAgICB0eXBlOiBzaWduYWwudHlwZSxcbiAgICAgICAgc2RwOiBzaWduYWwuc2RwXG4gICAgICB9KVxuICAgIH1cbiAgICBpZiAoc2VsZi50cmlja2xlIHx8IHNlbGYuX2ljZUNvbXBsZXRlKSBzZW5kT2ZmZXIoKVxuICAgIGVsc2Ugc2VsZi5vbmNlKCdfaWNlQ29tcGxldGUnLCBzZW5kT2ZmZXIpIC8vIHdhaXQgZm9yIGNhbmRpZGF0ZXNcbiAgfSwgc2VsZi5fb25FcnJvci5iaW5kKHNlbGYpLCBzZWxmLm9mZmVyQ29uc3RyYWludHMpXG59XG5cblBlZXIucHJvdG90eXBlLl9jcmVhdGVBbnN3ZXIgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzZWxmID0gdGhpc1xuICBpZiAoc2VsZi5kZXN0cm95ZWQpIHJldHVyblxuXG4gIHNlbGYuX3BjLmNyZWF0ZUFuc3dlcihmdW5jdGlvbiAoYW5zd2VyKSB7XG4gICAgaWYgKHNlbGYuZGVzdHJveWVkKSByZXR1cm5cbiAgICBhbnN3ZXIuc2RwID0gc2VsZi5zZHBUcmFuc2Zvcm0oYW5zd2VyLnNkcClcbiAgICBzZWxmLl9wYy5zZXRMb2NhbERlc2NyaXB0aW9uKGFuc3dlciwgbm9vcCwgc2VsZi5fb25FcnJvci5iaW5kKHNlbGYpKVxuICAgIHZhciBzZW5kQW5zd2VyID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHNpZ25hbCA9IHNlbGYuX3BjLmxvY2FsRGVzY3JpcHRpb24gfHwgYW5zd2VyXG4gICAgICBzZWxmLl9kZWJ1Zygnc2lnbmFsJylcbiAgICAgIHNlbGYuZW1pdCgnc2lnbmFsJywge1xuICAgICAgICB0eXBlOiBzaWduYWwudHlwZSxcbiAgICAgICAgc2RwOiBzaWduYWwuc2RwXG4gICAgICB9KVxuICAgIH1cbiAgICBpZiAoc2VsZi50cmlja2xlIHx8IHNlbGYuX2ljZUNvbXBsZXRlKSBzZW5kQW5zd2VyKClcbiAgICBlbHNlIHNlbGYub25jZSgnX2ljZUNvbXBsZXRlJywgc2VuZEFuc3dlcilcbiAgfSwgc2VsZi5fb25FcnJvci5iaW5kKHNlbGYpLCBzZWxmLmFuc3dlckNvbnN0cmFpbnRzKVxufVxuXG5QZWVyLnByb3RvdHlwZS5fb25JY2VDb25uZWN0aW9uU3RhdGVDaGFuZ2UgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzZWxmID0gdGhpc1xuICBpZiAoc2VsZi5kZXN0cm95ZWQpIHJldHVyblxuICB2YXIgaWNlR2F0aGVyaW5nU3RhdGUgPSBzZWxmLl9wYy5pY2VHYXRoZXJpbmdTdGF0ZVxuICB2YXIgaWNlQ29ubmVjdGlvblN0YXRlID0gc2VsZi5fcGMuaWNlQ29ubmVjdGlvblN0YXRlXG4gIHNlbGYuX2RlYnVnKCdpY2VDb25uZWN0aW9uU3RhdGVDaGFuZ2UgJXMgJXMnLCBpY2VHYXRoZXJpbmdTdGF0ZSwgaWNlQ29ubmVjdGlvblN0YXRlKVxuICBzZWxmLmVtaXQoJ2ljZUNvbm5lY3Rpb25TdGF0ZUNoYW5nZScsIGljZUdhdGhlcmluZ1N0YXRlLCBpY2VDb25uZWN0aW9uU3RhdGUpXG4gIGlmIChpY2VDb25uZWN0aW9uU3RhdGUgPT09ICdjb25uZWN0ZWQnIHx8IGljZUNvbm5lY3Rpb25TdGF0ZSA9PT0gJ2NvbXBsZXRlZCcpIHtcbiAgICBjbGVhclRpbWVvdXQoc2VsZi5fcmVjb25uZWN0VGltZW91dClcbiAgICBzZWxmLl9wY1JlYWR5ID0gdHJ1ZVxuICAgIHNlbGYuX21heWJlUmVhZHkoKVxuICB9XG4gIGlmIChpY2VDb25uZWN0aW9uU3RhdGUgPT09ICdkaXNjb25uZWN0ZWQnKSB7XG4gICAgaWYgKHNlbGYucmVjb25uZWN0VGltZXIpIHtcbiAgICAgIC8vIElmIHVzZXIgaGFzIHNldCBgb3B0LnJlY29ubmVjdFRpbWVyYCwgYWxsb3cgdGltZSBmb3IgSUNFIHRvIGF0dGVtcHQgYSByZWNvbm5lY3RcbiAgICAgIGNsZWFyVGltZW91dChzZWxmLl9yZWNvbm5lY3RUaW1lb3V0KVxuICAgICAgc2VsZi5fcmVjb25uZWN0VGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICBzZWxmLl9kZXN0cm95KClcbiAgICAgIH0sIHNlbGYucmVjb25uZWN0VGltZXIpXG4gICAgfSBlbHNlIHtcbiAgICAgIHNlbGYuX2Rlc3Ryb3koKVxuICAgIH1cbiAgfVxuICBpZiAoaWNlQ29ubmVjdGlvblN0YXRlID09PSAnZmFpbGVkJykge1xuICAgIHNlbGYuX2Rlc3Ryb3koKVxuICB9XG4gIGlmIChpY2VDb25uZWN0aW9uU3RhdGUgPT09ICdjbG9zZWQnKSB7XG4gICAgc2VsZi5fZGVzdHJveSgpXG4gIH1cbn1cblxuUGVlci5wcm90b3R5cGUuX21heWJlUmVhZHkgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzZWxmID0gdGhpc1xuICBzZWxmLl9kZWJ1ZygnbWF5YmVSZWFkeSBwYyAlcyBjaGFubmVsICVzJywgc2VsZi5fcGNSZWFkeSwgc2VsZi5fY2hhbm5lbFJlYWR5KVxuICBpZiAoc2VsZi5jb25uZWN0ZWQgfHwgc2VsZi5fY29ubmVjdGluZyB8fCAhc2VsZi5fcGNSZWFkeSB8fCAhc2VsZi5fY2hhbm5lbFJlYWR5KSByZXR1cm5cbiAgc2VsZi5fY29ubmVjdGluZyA9IHRydWVcblxuICBpZiAoIXNlbGYuX3BjLmdldFN0YXRzKSB7XG4gICAgb25TdGF0cyhbXSlcbiAgfSBlbHNlIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiAhIXdpbmRvdy5tb3pSVENQZWVyQ29ubmVjdGlvbikge1xuICAgIHNlbGYuX3BjLmdldFN0YXRzKG51bGwsIGZ1bmN0aW9uIChyZXMpIHtcbiAgICAgIHZhciBpdGVtcyA9IFtdXG4gICAgICByZXMuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICBpdGVtcy5wdXNoKGl0ZW0pXG4gICAgICB9KVxuICAgICAgb25TdGF0cyhpdGVtcylcbiAgICB9LCBzZWxmLl9vbkVycm9yLmJpbmQoc2VsZikpXG4gIH0gZWxzZSB7XG4gICAgc2VsZi5fcGMuZ2V0U3RhdHMoZnVuY3Rpb24gKHJlcykge1xuICAgICAgdmFyIGl0ZW1zID0gW11cbiAgICAgIHJlcy5yZXN1bHQoKS5mb3JFYWNoKGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICAgICAgdmFyIGl0ZW0gPSB7fVxuICAgICAgICByZXN1bHQubmFtZXMoKS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgICAgaXRlbVtuYW1lXSA9IHJlc3VsdC5zdGF0KG5hbWUpXG4gICAgICAgIH0pXG4gICAgICAgIGl0ZW0uaWQgPSByZXN1bHQuaWRcbiAgICAgICAgaXRlbS50eXBlID0gcmVzdWx0LnR5cGVcbiAgICAgICAgaXRlbS50aW1lc3RhbXAgPSByZXN1bHQudGltZXN0YW1wXG4gICAgICAgIGl0ZW1zLnB1c2goaXRlbSlcbiAgICAgIH0pXG4gICAgICBvblN0YXRzKGl0ZW1zKVxuICAgIH0pXG4gIH1cblxuICBmdW5jdGlvbiBvblN0YXRzIChpdGVtcykge1xuICAgIGl0ZW1zLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgIGlmIChpdGVtLnR5cGUgPT09ICdyZW1vdGVjYW5kaWRhdGUnICYmIGl0ZW0uY2FuZGlkYXRlVHlwZSA9PT0gJ2hvc3QnKSB7XG4gICAgICAgIHNlbGYucmVtb3RlQWRkcmVzcyA9IGl0ZW0uaXBBZGRyZXNzXG4gICAgICAgIHNlbGYucmVtb3RlUG9ydCA9IE51bWJlcihpdGVtLnBvcnROdW1iZXIpXG4gICAgICAgIHNlbGYucmVtb3RlRmFtaWx5ID0gJ0lQdjQnXG4gICAgICAgIHNlbGYuX2RlYnVnKFxuICAgICAgICAgICdjb25uZWN0IHJlbW90ZTogJXM6JXMgKCVzKScsXG4gICAgICAgICAgc2VsZi5yZW1vdGVBZGRyZXNzLCBzZWxmLnJlbW90ZVBvcnQsIHNlbGYucmVtb3RlRmFtaWx5XG4gICAgICAgIClcbiAgICAgIH0gZWxzZSBpZiAoaXRlbS50eXBlID09PSAnbG9jYWxjYW5kaWRhdGUnICYmIGl0ZW0uY2FuZGlkYXRlVHlwZSA9PT0gJ2hvc3QnKSB7XG4gICAgICAgIHNlbGYubG9jYWxBZGRyZXNzID0gaXRlbS5pcEFkZHJlc3NcbiAgICAgICAgc2VsZi5sb2NhbFBvcnQgPSBOdW1iZXIoaXRlbS5wb3J0TnVtYmVyKVxuICAgICAgICBzZWxmLl9kZWJ1ZygnY29ubmVjdCBsb2NhbDogJXM6JXMnLCBzZWxmLmxvY2FsQWRkcmVzcywgc2VsZi5sb2NhbFBvcnQpXG4gICAgICB9XG4gICAgfSlcblxuICAgIHNlbGYuX2Nvbm5lY3RpbmcgPSBmYWxzZVxuICAgIHNlbGYuY29ubmVjdGVkID0gdHJ1ZVxuXG4gICAgaWYgKHNlbGYuX2NodW5rKSB7XG4gICAgICB0cnkge1xuICAgICAgICBzZWxmLnNlbmQoc2VsZi5fY2h1bmspXG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgcmV0dXJuIHNlbGYuX29uRXJyb3IoZXJyKVxuICAgICAgfVxuICAgICAgc2VsZi5fY2h1bmsgPSBudWxsXG4gICAgICBzZWxmLl9kZWJ1Zygnc2VudCBjaHVuayBmcm9tIFwid3JpdGUgYmVmb3JlIGNvbm5lY3RcIicpXG5cbiAgICAgIHZhciBjYiA9IHNlbGYuX2NiXG4gICAgICBzZWxmLl9jYiA9IG51bGxcbiAgICAgIGNiKG51bGwpXG4gICAgfVxuXG4gICAgc2VsZi5faW50ZXJ2YWwgPSBzZXRJbnRlcnZhbChmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoIXNlbGYuX2NiIHx8ICFzZWxmLl9jaGFubmVsIHx8IHNlbGYuX2NoYW5uZWwuYnVmZmVyZWRBbW91bnQgPiBzZWxmLl9tYXhCdWZmZXJlZEFtb3VudCkgcmV0dXJuXG4gICAgICBzZWxmLl9kZWJ1ZygnZW5kaW5nIGJhY2twcmVzc3VyZTogYnVmZmVyZWRBbW91bnQgJWQnLCBzZWxmLl9jaGFubmVsLmJ1ZmZlcmVkQW1vdW50KVxuICAgICAgdmFyIGNiID0gc2VsZi5fY2JcbiAgICAgIHNlbGYuX2NiID0gbnVsbFxuICAgICAgY2IobnVsbClcbiAgICB9LCAxNTApXG4gICAgaWYgKHNlbGYuX2ludGVydmFsLnVucmVmKSBzZWxmLl9pbnRlcnZhbC51bnJlZigpXG5cbiAgICBzZWxmLl9kZWJ1ZygnY29ubmVjdCcpXG4gICAgc2VsZi5lbWl0KCdjb25uZWN0JylcbiAgfVxufVxuXG5QZWVyLnByb3RvdHlwZS5fb25TaWduYWxpbmdTdGF0ZUNoYW5nZSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHNlbGYgPSB0aGlzXG4gIGlmIChzZWxmLmRlc3Ryb3llZCkgcmV0dXJuXG4gIHNlbGYuX2RlYnVnKCdzaWduYWxpbmdTdGF0ZUNoYW5nZSAlcycsIHNlbGYuX3BjLnNpZ25hbGluZ1N0YXRlKVxuICBzZWxmLmVtaXQoJ3NpZ25hbGluZ1N0YXRlQ2hhbmdlJywgc2VsZi5fcGMuc2lnbmFsaW5nU3RhdGUpXG59XG5cblBlZXIucHJvdG90eXBlLl9vbkljZUNhbmRpZGF0ZSA9IGZ1bmN0aW9uIChldmVudCkge1xuICB2YXIgc2VsZiA9IHRoaXNcbiAgaWYgKHNlbGYuZGVzdHJveWVkKSByZXR1cm5cbiAgaWYgKGV2ZW50LmNhbmRpZGF0ZSAmJiBzZWxmLnRyaWNrbGUpIHtcbiAgICBzZWxmLmVtaXQoJ3NpZ25hbCcsIHtcbiAgICAgIGNhbmRpZGF0ZToge1xuICAgICAgICBjYW5kaWRhdGU6IGV2ZW50LmNhbmRpZGF0ZS5jYW5kaWRhdGUsXG4gICAgICAgIHNkcE1MaW5lSW5kZXg6IGV2ZW50LmNhbmRpZGF0ZS5zZHBNTGluZUluZGV4LFxuICAgICAgICBzZHBNaWQ6IGV2ZW50LmNhbmRpZGF0ZS5zZHBNaWRcbiAgICAgIH1cbiAgICB9KVxuICB9IGVsc2UgaWYgKCFldmVudC5jYW5kaWRhdGUpIHtcbiAgICBzZWxmLl9pY2VDb21wbGV0ZSA9IHRydWVcbiAgICBzZWxmLmVtaXQoJ19pY2VDb21wbGV0ZScpXG4gIH1cbn1cblxuUGVlci5wcm90b3R5cGUuX29uQ2hhbm5lbE1lc3NhZ2UgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgdmFyIHNlbGYgPSB0aGlzXG4gIGlmIChzZWxmLmRlc3Ryb3llZCkgcmV0dXJuXG4gIHZhciBkYXRhID0gZXZlbnQuZGF0YVxuICBzZWxmLl9kZWJ1ZygncmVhZDogJWQgYnl0ZXMnLCBkYXRhLmJ5dGVMZW5ndGggfHwgZGF0YS5sZW5ndGgpXG5cbiAgaWYgKGRhdGEgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgIGRhdGEgPSBuZXcgQnVmZmVyKGRhdGEpXG4gICAgc2VsZi5wdXNoKGRhdGEpXG4gIH0gZWxzZSB7XG4gICAgdHJ5IHtcbiAgICAgIGRhdGEgPSBKU09OLnBhcnNlKGRhdGEpXG4gICAgfSBjYXRjaCAoZXJyKSB7fVxuICAgIHNlbGYuZW1pdCgnZGF0YScsIGRhdGEpXG4gIH1cbn1cblxuUGVlci5wcm90b3R5cGUuX29uQ2hhbm5lbE9wZW4gPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzZWxmID0gdGhpc1xuICBpZiAoc2VsZi5jb25uZWN0ZWQgfHwgc2VsZi5kZXN0cm95ZWQpIHJldHVyblxuICBzZWxmLl9kZWJ1Zygnb24gY2hhbm5lbCBvcGVuJylcbiAgc2VsZi5fY2hhbm5lbFJlYWR5ID0gdHJ1ZVxuICBzZWxmLl9tYXliZVJlYWR5KClcbn1cblxuUGVlci5wcm90b3R5cGUuX29uQ2hhbm5lbENsb3NlID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc2VsZiA9IHRoaXNcbiAgaWYgKHNlbGYuZGVzdHJveWVkKSByZXR1cm5cbiAgc2VsZi5fZGVidWcoJ29uIGNoYW5uZWwgY2xvc2UnKVxuICBzZWxmLl9kZXN0cm95KClcbn1cblxuUGVlci5wcm90b3R5cGUuX29uQWRkU3RyZWFtID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gIHZhciBzZWxmID0gdGhpc1xuICBpZiAoc2VsZi5kZXN0cm95ZWQpIHJldHVyblxuICBzZWxmLl9kZWJ1Zygnb24gYWRkIHN0cmVhbScpXG4gIHNlbGYuZW1pdCgnc3RyZWFtJywgZXZlbnQuc3RyZWFtKVxufVxuXG5QZWVyLnByb3RvdHlwZS5fb25FcnJvciA9IGZ1bmN0aW9uIChlcnIpIHtcbiAgdmFyIHNlbGYgPSB0aGlzXG4gIGlmIChzZWxmLmRlc3Ryb3llZCkgcmV0dXJuXG4gIHNlbGYuX2RlYnVnKCdlcnJvciAlcycsIGVyci5tZXNzYWdlIHx8IGVycilcbiAgc2VsZi5fZGVzdHJveShlcnIpXG59XG5cblBlZXIucHJvdG90eXBlLl9kZWJ1ZyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHNlbGYgPSB0aGlzXG4gIHZhciBhcmdzID0gW10uc2xpY2UuY2FsbChhcmd1bWVudHMpXG4gIHZhciBpZCA9IHNlbGYuY2hhbm5lbE5hbWUgJiYgc2VsZi5jaGFubmVsTmFtZS5zdWJzdHJpbmcoMCwgNylcbiAgYXJnc1swXSA9ICdbJyArIGlkICsgJ10gJyArIGFyZ3NbMF1cbiAgZGVidWcuYXBwbHkobnVsbCwgYXJncylcbn1cblxuZnVuY3Rpb24gbm9vcCAoKSB7fVxuIiwiXG52YXIgc29kaXVtID0gcmVxdWlyZSgnbGlic29kaXVtLXdyYXBwZXJzJylcblxuZnVuY3Rpb24gSShiKSB7XG4gIHJldHVybiBCdWZmZXIuaXNCdWZmZXIoYikgPyBuZXcgVWludDhBcnJheShiKSA6IGJcbn1cblxuZnVuY3Rpb24gQihiKSB7XG4gIHJldHVybiAoYiBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpID8gbmV3IEJ1ZmZlcihiKSA6IGJcbn1cblxuZnVuY3Rpb24gYnVmZmVyaXplKGZuKSB7XG4gIGlmKCdmdW5jdGlvbicgIT09IHR5cGVvZiBmbilcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ25vdCBhIGZ1bmN0aW9uJylcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgYXJncyA9IFtdLm1hcC5jYWxsKGFyZ3VtZW50cywgSSlcbiAgICB2YXIgciA9ICBCKGZuLmFwcGx5KHRoaXMsIGFyZ3MpKVxuICAgIHJldHVybiByXG4gIH1cbn1cblxuZnVuY3Rpb24ga2V5cyAoaykge1xuICByZXR1cm4ge1xuICAgIHB1YmxpY0tleTogQihrLnB1YmxpY0tleSksXG4gICAgc2VjcmV0S2V5OiBCKGsuc2VjcmV0S2V5IHx8IGsucHJpdmF0ZUtleSlcbiAgfVxufVxuXG5leHBvcnRzLmNyeXB0b19zaWduX3NlZWRfa2V5cGFpciA9IGZ1bmN0aW9uIChzZWVkKSB7XG4gIHJldHVybiBrZXlzKHNvZGl1bS5jcnlwdG9fc2lnbl9zZWVkX2tleXBhaXIoSShzZWVkKSkpXG59XG5cbmV4cG9ydHMuY3J5cHRvX3NpZ25fa2V5cGFpciA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGtleXMoc29kaXVtLmNyeXB0b19zaWduX2tleXBhaXIoKSlcbn1cblxuZXhwb3J0cy5jcnlwdG9fYm94X2tleXBhaXIgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBrZXlzKHNvZGl1bS5jcnlwdG9fYm94X2tleXBhaXIoKSlcbn1cblxuO1tcbiAgJ3NpZ25fdmVyaWZ5X2RldGFjaGVkJyxcbiAgJ3NpZ25fZGV0YWNoZWQnLFxuICAnc2lnbicsXG4gICdzaWduX29wZW4nLFxuICAnc2lnbl9lZDI1NTE5X3BrX3RvX2N1cnZlMjU1MTknLFxuICAnc2lnbl9lZDI1NTE5X3NrX3RvX2N1cnZlMjU1MTknLFxuICAnc2NhbGFybXVsdCcsXG4gICdzZWNyZXRib3hfZWFzeScsXG4gICdzZWNyZXRib3hfb3Blbl9lYXN5JyxcbiAgJ2JveF9lYXN5JyxcbiAgJ2JveF9vcGVuX2Vhc3knLFxuICAnYXV0aCcsXG4gICdhdXRoX3ZlcmlmeScsXG4gICdoYXNoJ1xuXS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gIGlmKG5hbWUgPT09ICdhdXRoX3ZlcmlmeScpIHtcbiAgICAvL3RoaXMgaXMgaW5jb25zaXN0ZW50IHdpdGggc2lnbl92ZXJpZnkhIVxuICAgIHZhciBmbiA9IGJ1ZmZlcml6ZShzb2RpdW0uY3J5cHRvX2F1dGhfdmVyaWZ5KVxuICAgIGV4cG9ydHNbJ2NyeXB0b18nK25hbWVdID0gZnVuY3Rpb24gKG1zZywgdG9rLCBrZXkpIHsgcmV0dXJuIGZuKG1zZywgdG9rLCBrZXkpID8gMCA6IDEgfVxuICB9XG4gIGVsc2VcbiAgICBleHBvcnRzWydjcnlwdG9fJytuYW1lXSA9IGJ1ZmZlcml6ZShzb2RpdW1bJ2NyeXB0b18nK25hbWVdKVxufSlcblxudmFyIFNoYTI1NiA9IHJlcXVpcmUoJ3NoYS5qcy9zaGEyNTYnKVxuZXhwb3J0cy5jcnlwdG9faGFzaF9zaGEyNTYgPSBmdW5jdGlvbiAobXNnKSB7XG4gIHJldHVybiBuZXcgU2hhMjU2KCkudXBkYXRlKG1zZykuZGlnZXN0KClcbn1cblxuZnVuY3Rpb24gbnVsbElmVGhyZXcgKGZuKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgdHJ5IHsgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzKSkgfVxuICAgIGNhdGNoIChlcnIpIHsgcmV0dXJuIG51bGwgfVxuICB9XG59XG5cbmV4cG9ydHMuY3J5cHRvX3NlY3JldGJveF9vcGVuX2Vhc3kgPSBudWxsSWZUaHJldyhleHBvcnRzLmNyeXB0b19zZWNyZXRib3hfb3Blbl9lYXN5KVxuZXhwb3J0cy5jcnlwdG9fYm94X29wZW5fZWFzeSA9IG51bGxJZlRocmV3KGV4cG9ydHMuY3J5cHRvX2JveF9vcGVuX2Vhc3kpXG5cbiIsInZhciBvbmNlID0gcmVxdWlyZSgnb25jZScpXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oc3RyZWFtLCBjYikge1xuICBpZiAoIWNiKSByZXR1cm4gc3RyZWFtXG5cbiAgdmFyIGxpc3QgPSBbXVxuXG4gIGNiID0gb25jZShjYilcblxuICBzdHJlYW0ub24oJ2RhdGEnLCBmdW5jdGlvbihkYXRhKSB7XG4gICAgbGlzdC5wdXNoKGRhdGEpXG4gIH0pXG5cbiAgc3RyZWFtLm9uKCdlbmQnLCBmdW5jdGlvbigpIHtcbiAgICBjYihudWxsLCBsaXN0KVxuICB9KVxuXG4gIHN0cmVhbS5vbignY2xvc2UnLCBmdW5jdGlvbigpIHtcbiAgICBjYihuZXcgRXJyb3IoJ1ByZW1hdHVyZSBjbG9zZScpKVxuICB9KVxuXG4gIHN0cmVhbS5vbignZXJyb3InLCBjYilcblxuICByZXR1cm4gc3RyZWFtXG59IiwidmFyIG5hcmdzID0gL1xceyhbMC05YS16QS1aXSspXFx9L2dcbnZhciBzbGljZSA9IEFycmF5LnByb3RvdHlwZS5zbGljZVxuXG5tb2R1bGUuZXhwb3J0cyA9IHRlbXBsYXRlXG5cbmZ1bmN0aW9uIHRlbXBsYXRlKHN0cmluZykge1xuICAgIHZhciBhcmdzXG5cbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMiAmJiB0eXBlb2YgYXJndW1lbnRzWzFdID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgIGFyZ3MgPSBhcmd1bWVudHNbMV1cbiAgICB9IGVsc2Uge1xuICAgICAgICBhcmdzID0gc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpXG4gICAgfVxuXG4gICAgaWYgKCFhcmdzIHx8ICFhcmdzLmhhc093blByb3BlcnR5KSB7XG4gICAgICAgIGFyZ3MgPSB7fVxuICAgIH1cblxuICAgIHJldHVybiBzdHJpbmcucmVwbGFjZShuYXJncywgZnVuY3Rpb24gcmVwbGFjZUFyZyhtYXRjaCwgaSwgaW5kZXgpIHtcbiAgICAgICAgdmFyIHJlc3VsdFxuXG4gICAgICAgIGlmIChzdHJpbmdbaW5kZXggLSAxXSA9PT0gXCJ7XCIgJiZcbiAgICAgICAgICAgIHN0cmluZ1tpbmRleCArIG1hdGNoLmxlbmd0aF0gPT09IFwifVwiKSB7XG4gICAgICAgICAgICByZXR1cm4gaVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0ID0gYXJncy5oYXNPd25Qcm9wZXJ0eShpKSA/IGFyZ3NbaV0gOiBudWxsXG4gICAgICAgICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHJlc3VsdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiXCJcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgICAgICB9XG4gICAgfSlcbn1cbiIsInZhciBzd2FybSA9IHJlcXVpcmUoJ3dlYnJ0Yy1zd2FybScpXG52YXIgc2lnbmFsaHViID0gcmVxdWlyZSgnc2lnbmFsaHViJylcbnZhciBoc29kaXVtID0gcmVxdWlyZSgnaHlwZXJsb2ctc29kaXVtJylcbnZhciBoeXBlcmxvZyA9IHJlcXVpcmUoJ2h5cGVybG9nJylcbnZhciBkZWZpbmVkID0gcmVxdWlyZSgnZGVmaW5lZCcpXG52YXIgdGhyb3VnaCA9IHJlcXVpcmUoJ3Rocm91Z2gyJylcbnZhciBwdW1wID0gcmVxdWlyZSgncHVtcCcpXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9wdHMpIHtcbiAgaWYgKHR5cGVvZiBvcHRzID09PSAnc3RyaW5nJykgb3B0cyA9IHsgaWQ6IG9wdHMgfVxuICBpZiAoIW9wdHMpIG9wdHMgPSB7fVxuICB2YXIga2V5cyA9IG9wdHMua2V5cyB8fCB7fVxuICB2YXIga29wdHMgPSB7XG4gICAgcHVibGljS2V5OiBub3Jta2V5KGRlZmluZWQoXG4gICAgICBvcHRzLnB1YmxpY0tleSwgb3B0cy5wdWJsaWMsIG9wdHMucHViLCBvcHRzLmlkZW50aXR5LCBvcHRzLmlkLFxuICAgICAga2V5cy5wdWJsaWNLZXksIGtleXMucHVibGljLCBrZXlzLnB1Yiwga2V5cy5pZGVudGl0eSwga2V5cy5pZFxuICAgICkpLFxuICAgIHNlY3JldEtleTogbm9ybWtleShkZWZpbmVkKFxuICAgICAgb3B0cy5zZWNyZXRLZXksIG9wdHMuc2VjcmV0LCBvcHRzLnByaXZhdGUsIG9wdHMucHJpdixcbiAgICAgIGtleXMuc2VjcmV0S2V5LCBrZXlzLnNlY3JldCwga2V5cy5wcml2YXRlLCBrZXlzLnByaXZcbiAgICApKVxuICB9XG4gIHZhciB0b3BpYyA9IGtvcHRzLnB1YmxpY0tleS50b1N0cmluZygnaGV4JylcbiAgdmFyIGxvZyA9IGh5cGVybG9nKG9wdHMuZGIsIGhzb2RpdW0ob3B0cy5zb2RpdW0sIGtvcHRzLCBvcHRzKSlcbiAgdmFyIGh1YiA9IHNpZ25hbGh1Yignc3dhcm1sb2cuJyArIHRvcGljLCBvcHRzLmh1YnMpXG4gIHZhciBzdyA9IHN3YXJtKGh1Yiwgb3B0cylcbiAgdmFyIHBlZXJTdHJlYW0gPSBvcHRzLnBlZXJTdHJlYW0gfHwgZnVuY3Rpb24gKHBlZXIpIHsgcmV0dXJuIHBlZXIgfVxuXG4gIHN3Lm9uKCdwZWVyJywgZnVuY3Rpb24gKHBlZXIsIGlkKSB7XG4gICAgdmFyIHN0cmVhbSA9IHBlZXJTdHJlYW0ocGVlcilcbiAgICBwdW1wKHN0cmVhbSwgdG9CdWZmZXIoKSwgbG9nLnJlcGxpY2F0ZSh7IGxpdmU6IHRydWUgfSksIHN0cmVhbSlcbiAgfSlcbiAgcmV0dXJuIGxvZ1xufVxuXG5mdW5jdGlvbiBub3Jta2V5IChpZCkge1xuICBpZiAoL1xcLmVkMjU1MTkkLy50ZXN0KGlkKSkge1xuICAgIHZhciBiNjQgPSBpZC5yZXBsYWNlKC9cXC5lZDI1NTE5JC8sJycpLnJlcGxhY2UoL15ALywnJylcbiAgICByZXR1cm4gQnVmZmVyKGI2NCwnYmFzZTY0JylcbiAgfSBlbHNlIGlmIChCdWZmZXIuaXNCdWZmZXIoaWQpKSB7XG4gICAgcmV0dXJuIGlkXG4gIH0gZWxzZSBpZiAoaWQpIHJldHVybiBCdWZmZXIoaWQsICdoZXgnKVxufVxuXG5mdW5jdGlvbiB0b0J1ZmZlciAoKSB7XG4gIHJldHVybiB0aHJvdWdoLm9iaihmdW5jdGlvbiAoYnVmLCBlbmMsIG5leHQpIHtcbiAgICBuZXh0KG51bGwsIEJ1ZmZlci5pc0J1ZmZlcihidWYpID8gYnVmIDogQnVmZmVyKGJ1ZikpXG4gIH0pXG59XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhZGFibGU7XG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgcHJvY2Vzc05leHRUaWNrID0gcmVxdWlyZSgncHJvY2Vzcy1uZXh0aWNrLWFyZ3MnKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgaXNBcnJheSA9IHJlcXVpcmUoJ2lzYXJyYXknKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgQnVmZmVyID0gcmVxdWlyZSgnYnVmZmVyJykuQnVmZmVyO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cblJlYWRhYmxlLlJlYWRhYmxlU3RhdGUgPSBSZWFkYWJsZVN0YXRlO1xuXG52YXIgRUUgPSByZXF1aXJlKCdldmVudHMnKTtcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBFRWxpc3RlbmVyQ291bnQgPSBmdW5jdGlvbihlbWl0dGVyLCB0eXBlKSB7XG4gIHJldHVybiBlbWl0dGVyLmxpc3RlbmVycyh0eXBlKS5sZW5ndGg7XG59O1xuLyo8L3JlcGxhY2VtZW50PiovXG5cblxuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIFN0cmVhbTtcbihmdW5jdGlvbiAoKXt0cnl7XG4gIFN0cmVhbSA9IHJlcXVpcmUoJ3N0JyArICdyZWFtJyk7XG59Y2F0Y2goXyl7fWZpbmFsbHl7XG4gIGlmICghU3RyZWFtKVxuICAgIFN0cmVhbSA9IHJlcXVpcmUoJ2V2ZW50cycpLkV2ZW50RW1pdHRlcjtcbn19KCkpXG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ2J1ZmZlcicpLkJ1ZmZlcjtcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciB1dGlsID0gcmVxdWlyZSgnY29yZS11dGlsLWlzJyk7XG51dGlsLmluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG5cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBkZWJ1Z1V0aWwgPSByZXF1aXJlKCd1dGlsJyk7XG52YXIgZGVidWc7XG5pZiAoZGVidWdVdGlsICYmIGRlYnVnVXRpbC5kZWJ1Z2xvZykge1xuICBkZWJ1ZyA9IGRlYnVnVXRpbC5kZWJ1Z2xvZygnc3RyZWFtJyk7XG59IGVsc2Uge1xuICBkZWJ1ZyA9IGZ1bmN0aW9uICgpIHt9O1xufVxuLyo8L3JlcGxhY2VtZW50PiovXG5cbnZhciBTdHJpbmdEZWNvZGVyO1xuXG51dGlsLmluaGVyaXRzKFJlYWRhYmxlLCBTdHJlYW0pO1xuXG52YXIgRHVwbGV4O1xuZnVuY3Rpb24gUmVhZGFibGVTdGF0ZShvcHRpb25zLCBzdHJlYW0pIHtcbiAgRHVwbGV4ID0gRHVwbGV4IHx8IHJlcXVpcmUoJy4vX3N0cmVhbV9kdXBsZXgnKTtcblxuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAvLyBvYmplY3Qgc3RyZWFtIGZsYWcuIFVzZWQgdG8gbWFrZSByZWFkKG4pIGlnbm9yZSBuIGFuZCB0b1xuICAvLyBtYWtlIGFsbCB0aGUgYnVmZmVyIG1lcmdpbmcgYW5kIGxlbmd0aCBjaGVja3MgZ28gYXdheVxuICB0aGlzLm9iamVjdE1vZGUgPSAhIW9wdGlvbnMub2JqZWN0TW9kZTtcblxuICBpZiAoc3RyZWFtIGluc3RhbmNlb2YgRHVwbGV4KVxuICAgIHRoaXMub2JqZWN0TW9kZSA9IHRoaXMub2JqZWN0TW9kZSB8fCAhIW9wdGlvbnMucmVhZGFibGVPYmplY3RNb2RlO1xuXG4gIC8vIHRoZSBwb2ludCBhdCB3aGljaCBpdCBzdG9wcyBjYWxsaW5nIF9yZWFkKCkgdG8gZmlsbCB0aGUgYnVmZmVyXG4gIC8vIE5vdGU6IDAgaXMgYSB2YWxpZCB2YWx1ZSwgbWVhbnMgXCJkb24ndCBjYWxsIF9yZWFkIHByZWVtcHRpdmVseSBldmVyXCJcbiAgdmFyIGh3bSA9IG9wdGlvbnMuaGlnaFdhdGVyTWFyaztcbiAgdmFyIGRlZmF1bHRId20gPSB0aGlzLm9iamVjdE1vZGUgPyAxNiA6IDE2ICogMTAyNDtcbiAgdGhpcy5oaWdoV2F0ZXJNYXJrID0gKGh3bSB8fCBod20gPT09IDApID8gaHdtIDogZGVmYXVsdEh3bTtcblxuICAvLyBjYXN0IHRvIGludHMuXG4gIHRoaXMuaGlnaFdhdGVyTWFyayA9IH5+dGhpcy5oaWdoV2F0ZXJNYXJrO1xuXG4gIHRoaXMuYnVmZmVyID0gW107XG4gIHRoaXMubGVuZ3RoID0gMDtcbiAgdGhpcy5waXBlcyA9IG51bGw7XG4gIHRoaXMucGlwZXNDb3VudCA9IDA7XG4gIHRoaXMuZmxvd2luZyA9IG51bGw7XG4gIHRoaXMuZW5kZWQgPSBmYWxzZTtcbiAgdGhpcy5lbmRFbWl0dGVkID0gZmFsc2U7XG4gIHRoaXMucmVhZGluZyA9IGZhbHNlO1xuXG4gIC8vIGEgZmxhZyB0byBiZSBhYmxlIHRvIHRlbGwgaWYgdGhlIG9ud3JpdGUgY2IgaXMgY2FsbGVkIGltbWVkaWF0ZWx5LFxuICAvLyBvciBvbiBhIGxhdGVyIHRpY2suICBXZSBzZXQgdGhpcyB0byB0cnVlIGF0IGZpcnN0LCBiZWNhdXNlIGFueVxuICAvLyBhY3Rpb25zIHRoYXQgc2hvdWxkbid0IGhhcHBlbiB1bnRpbCBcImxhdGVyXCIgc2hvdWxkIGdlbmVyYWxseSBhbHNvXG4gIC8vIG5vdCBoYXBwZW4gYmVmb3JlIHRoZSBmaXJzdCB3cml0ZSBjYWxsLlxuICB0aGlzLnN5bmMgPSB0cnVlO1xuXG4gIC8vIHdoZW5ldmVyIHdlIHJldHVybiBudWxsLCB0aGVuIHdlIHNldCBhIGZsYWcgdG8gc2F5XG4gIC8vIHRoYXQgd2UncmUgYXdhaXRpbmcgYSAncmVhZGFibGUnIGV2ZW50IGVtaXNzaW9uLlxuICB0aGlzLm5lZWRSZWFkYWJsZSA9IGZhbHNlO1xuICB0aGlzLmVtaXR0ZWRSZWFkYWJsZSA9IGZhbHNlO1xuICB0aGlzLnJlYWRhYmxlTGlzdGVuaW5nID0gZmFsc2U7XG5cbiAgLy8gQ3J5cHRvIGlzIGtpbmQgb2Ygb2xkIGFuZCBjcnVzdHkuICBIaXN0b3JpY2FsbHksIGl0cyBkZWZhdWx0IHN0cmluZ1xuICAvLyBlbmNvZGluZyBpcyAnYmluYXJ5JyBzbyB3ZSBoYXZlIHRvIG1ha2UgdGhpcyBjb25maWd1cmFibGUuXG4gIC8vIEV2ZXJ5dGhpbmcgZWxzZSBpbiB0aGUgdW5pdmVyc2UgdXNlcyAndXRmOCcsIHRob3VnaC5cbiAgdGhpcy5kZWZhdWx0RW5jb2RpbmcgPSBvcHRpb25zLmRlZmF1bHRFbmNvZGluZyB8fCAndXRmOCc7XG5cbiAgLy8gd2hlbiBwaXBpbmcsIHdlIG9ubHkgY2FyZSBhYm91dCAncmVhZGFibGUnIGV2ZW50cyB0aGF0IGhhcHBlblxuICAvLyBhZnRlciByZWFkKClpbmcgYWxsIHRoZSBieXRlcyBhbmQgbm90IGdldHRpbmcgYW55IHB1c2hiYWNrLlxuICB0aGlzLnJhbk91dCA9IGZhbHNlO1xuXG4gIC8vIHRoZSBudW1iZXIgb2Ygd3JpdGVycyB0aGF0IGFyZSBhd2FpdGluZyBhIGRyYWluIGV2ZW50IGluIC5waXBlKClzXG4gIHRoaXMuYXdhaXREcmFpbiA9IDA7XG5cbiAgLy8gaWYgdHJ1ZSwgYSBtYXliZVJlYWRNb3JlIGhhcyBiZWVuIHNjaGVkdWxlZFxuICB0aGlzLnJlYWRpbmdNb3JlID0gZmFsc2U7XG5cbiAgdGhpcy5kZWNvZGVyID0gbnVsbDtcbiAgdGhpcy5lbmNvZGluZyA9IG51bGw7XG4gIGlmIChvcHRpb25zLmVuY29kaW5nKSB7XG4gICAgaWYgKCFTdHJpbmdEZWNvZGVyKVxuICAgICAgU3RyaW5nRGVjb2RlciA9IHJlcXVpcmUoJ3N0cmluZ19kZWNvZGVyLycpLlN0cmluZ0RlY29kZXI7XG4gICAgdGhpcy5kZWNvZGVyID0gbmV3IFN0cmluZ0RlY29kZXIob3B0aW9ucy5lbmNvZGluZyk7XG4gICAgdGhpcy5lbmNvZGluZyA9IG9wdGlvbnMuZW5jb2Rpbmc7XG4gIH1cbn1cblxudmFyIER1cGxleDtcbmZ1bmN0aW9uIFJlYWRhYmxlKG9wdGlvbnMpIHtcbiAgRHVwbGV4ID0gRHVwbGV4IHx8IHJlcXVpcmUoJy4vX3N0cmVhbV9kdXBsZXgnKTtcblxuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgUmVhZGFibGUpKVxuICAgIHJldHVybiBuZXcgUmVhZGFibGUob3B0aW9ucyk7XG5cbiAgdGhpcy5fcmVhZGFibGVTdGF0ZSA9IG5ldyBSZWFkYWJsZVN0YXRlKG9wdGlvbnMsIHRoaXMpO1xuXG4gIC8vIGxlZ2FjeVxuICB0aGlzLnJlYWRhYmxlID0gdHJ1ZTtcblxuICBpZiAob3B0aW9ucyAmJiB0eXBlb2Ygb3B0aW9ucy5yZWFkID09PSAnZnVuY3Rpb24nKVxuICAgIHRoaXMuX3JlYWQgPSBvcHRpb25zLnJlYWQ7XG5cbiAgU3RyZWFtLmNhbGwodGhpcyk7XG59XG5cbi8vIE1hbnVhbGx5IHNob3ZlIHNvbWV0aGluZyBpbnRvIHRoZSByZWFkKCkgYnVmZmVyLlxuLy8gVGhpcyByZXR1cm5zIHRydWUgaWYgdGhlIGhpZ2hXYXRlck1hcmsgaGFzIG5vdCBiZWVuIGhpdCB5ZXQsXG4vLyBzaW1pbGFyIHRvIGhvdyBXcml0YWJsZS53cml0ZSgpIHJldHVybnMgdHJ1ZSBpZiB5b3Ugc2hvdWxkXG4vLyB3cml0ZSgpIHNvbWUgbW9yZS5cblJlYWRhYmxlLnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24oY2h1bmssIGVuY29kaW5nKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG5cbiAgaWYgKCFzdGF0ZS5vYmplY3RNb2RlICYmIHR5cGVvZiBjaHVuayA9PT0gJ3N0cmluZycpIHtcbiAgICBlbmNvZGluZyA9IGVuY29kaW5nIHx8IHN0YXRlLmRlZmF1bHRFbmNvZGluZztcbiAgICBpZiAoZW5jb2RpbmcgIT09IHN0YXRlLmVuY29kaW5nKSB7XG4gICAgICBjaHVuayA9IG5ldyBCdWZmZXIoY2h1bmssIGVuY29kaW5nKTtcbiAgICAgIGVuY29kaW5nID0gJyc7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlYWRhYmxlQWRkQ2h1bmsodGhpcywgc3RhdGUsIGNodW5rLCBlbmNvZGluZywgZmFsc2UpO1xufTtcblxuLy8gVW5zaGlmdCBzaG91bGQgKmFsd2F5cyogYmUgc29tZXRoaW5nIGRpcmVjdGx5IG91dCBvZiByZWFkKClcblJlYWRhYmxlLnByb3RvdHlwZS51bnNoaWZ0ID0gZnVuY3Rpb24oY2h1bmspIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgcmV0dXJuIHJlYWRhYmxlQWRkQ2h1bmsodGhpcywgc3RhdGUsIGNodW5rLCAnJywgdHJ1ZSk7XG59O1xuXG5SZWFkYWJsZS5wcm90b3R5cGUuaXNQYXVzZWQgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyA9PT0gZmFsc2U7XG59O1xuXG5mdW5jdGlvbiByZWFkYWJsZUFkZENodW5rKHN0cmVhbSwgc3RhdGUsIGNodW5rLCBlbmNvZGluZywgYWRkVG9Gcm9udCkge1xuICB2YXIgZXIgPSBjaHVua0ludmFsaWQoc3RhdGUsIGNodW5rKTtcbiAgaWYgKGVyKSB7XG4gICAgc3RyZWFtLmVtaXQoJ2Vycm9yJywgZXIpO1xuICB9IGVsc2UgaWYgKGNodW5rID09PSBudWxsKSB7XG4gICAgc3RhdGUucmVhZGluZyA9IGZhbHNlO1xuICAgIG9uRW9mQ2h1bmsoc3RyZWFtLCBzdGF0ZSk7XG4gIH0gZWxzZSBpZiAoc3RhdGUub2JqZWN0TW9kZSB8fCBjaHVuayAmJiBjaHVuay5sZW5ndGggPiAwKSB7XG4gICAgaWYgKHN0YXRlLmVuZGVkICYmICFhZGRUb0Zyb250KSB7XG4gICAgICB2YXIgZSA9IG5ldyBFcnJvcignc3RyZWFtLnB1c2goKSBhZnRlciBFT0YnKTtcbiAgICAgIHN0cmVhbS5lbWl0KCdlcnJvcicsIGUpO1xuICAgIH0gZWxzZSBpZiAoc3RhdGUuZW5kRW1pdHRlZCAmJiBhZGRUb0Zyb250KSB7XG4gICAgICB2YXIgZSA9IG5ldyBFcnJvcignc3RyZWFtLnVuc2hpZnQoKSBhZnRlciBlbmQgZXZlbnQnKTtcbiAgICAgIHN0cmVhbS5lbWl0KCdlcnJvcicsIGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoc3RhdGUuZGVjb2RlciAmJiAhYWRkVG9Gcm9udCAmJiAhZW5jb2RpbmcpXG4gICAgICAgIGNodW5rID0gc3RhdGUuZGVjb2Rlci53cml0ZShjaHVuayk7XG5cbiAgICAgIGlmICghYWRkVG9Gcm9udClcbiAgICAgICAgc3RhdGUucmVhZGluZyA9IGZhbHNlO1xuXG4gICAgICAvLyBpZiB3ZSB3YW50IHRoZSBkYXRhIG5vdywganVzdCBlbWl0IGl0LlxuICAgICAgaWYgKHN0YXRlLmZsb3dpbmcgJiYgc3RhdGUubGVuZ3RoID09PSAwICYmICFzdGF0ZS5zeW5jKSB7XG4gICAgICAgIHN0cmVhbS5lbWl0KCdkYXRhJywgY2h1bmspO1xuICAgICAgICBzdHJlYW0ucmVhZCgwKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHVwZGF0ZSB0aGUgYnVmZmVyIGluZm8uXG4gICAgICAgIHN0YXRlLmxlbmd0aCArPSBzdGF0ZS5vYmplY3RNb2RlID8gMSA6IGNodW5rLmxlbmd0aDtcbiAgICAgICAgaWYgKGFkZFRvRnJvbnQpXG4gICAgICAgICAgc3RhdGUuYnVmZmVyLnVuc2hpZnQoY2h1bmspO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgc3RhdGUuYnVmZmVyLnB1c2goY2h1bmspO1xuXG4gICAgICAgIGlmIChzdGF0ZS5uZWVkUmVhZGFibGUpXG4gICAgICAgICAgZW1pdFJlYWRhYmxlKHN0cmVhbSk7XG4gICAgICB9XG5cbiAgICAgIG1heWJlUmVhZE1vcmUoc3RyZWFtLCBzdGF0ZSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKCFhZGRUb0Zyb250KSB7XG4gICAgc3RhdGUucmVhZGluZyA9IGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIG5lZWRNb3JlRGF0YShzdGF0ZSk7XG59XG5cblxuLy8gaWYgaXQncyBwYXN0IHRoZSBoaWdoIHdhdGVyIG1hcmssIHdlIGNhbiBwdXNoIGluIHNvbWUgbW9yZS5cbi8vIEFsc28sIGlmIHdlIGhhdmUgbm8gZGF0YSB5ZXQsIHdlIGNhbiBzdGFuZCBzb21lXG4vLyBtb3JlIGJ5dGVzLiAgVGhpcyBpcyB0byB3b3JrIGFyb3VuZCBjYXNlcyB3aGVyZSBod209MCxcbi8vIHN1Y2ggYXMgdGhlIHJlcGwuICBBbHNvLCBpZiB0aGUgcHVzaCgpIHRyaWdnZXJlZCBhXG4vLyByZWFkYWJsZSBldmVudCwgYW5kIHRoZSB1c2VyIGNhbGxlZCByZWFkKGxhcmdlTnVtYmVyKSBzdWNoIHRoYXRcbi8vIG5lZWRSZWFkYWJsZSB3YXMgc2V0LCB0aGVuIHdlIG91Z2h0IHRvIHB1c2ggbW9yZSwgc28gdGhhdCBhbm90aGVyXG4vLyAncmVhZGFibGUnIGV2ZW50IHdpbGwgYmUgdHJpZ2dlcmVkLlxuZnVuY3Rpb24gbmVlZE1vcmVEYXRhKHN0YXRlKSB7XG4gIHJldHVybiAhc3RhdGUuZW5kZWQgJiZcbiAgICAgICAgIChzdGF0ZS5uZWVkUmVhZGFibGUgfHxcbiAgICAgICAgICBzdGF0ZS5sZW5ndGggPCBzdGF0ZS5oaWdoV2F0ZXJNYXJrIHx8XG4gICAgICAgICAgc3RhdGUubGVuZ3RoID09PSAwKTtcbn1cblxuLy8gYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuXG5SZWFkYWJsZS5wcm90b3R5cGUuc2V0RW5jb2RpbmcgPSBmdW5jdGlvbihlbmMpIHtcbiAgaWYgKCFTdHJpbmdEZWNvZGVyKVxuICAgIFN0cmluZ0RlY29kZXIgPSByZXF1aXJlKCdzdHJpbmdfZGVjb2Rlci8nKS5TdHJpbmdEZWNvZGVyO1xuICB0aGlzLl9yZWFkYWJsZVN0YXRlLmRlY29kZXIgPSBuZXcgU3RyaW5nRGVjb2RlcihlbmMpO1xuICB0aGlzLl9yZWFkYWJsZVN0YXRlLmVuY29kaW5nID0gZW5jO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8vIERvbid0IHJhaXNlIHRoZSBod20gPiA4TUJcbnZhciBNQVhfSFdNID0gMHg4MDAwMDA7XG5mdW5jdGlvbiBjb21wdXRlTmV3SGlnaFdhdGVyTWFyayhuKSB7XG4gIGlmIChuID49IE1BWF9IV00pIHtcbiAgICBuID0gTUFYX0hXTTtcbiAgfSBlbHNlIHtcbiAgICAvLyBHZXQgdGhlIG5leHQgaGlnaGVzdCBwb3dlciBvZiAyXG4gICAgbi0tO1xuICAgIG4gfD0gbiA+Pj4gMTtcbiAgICBuIHw9IG4gPj4+IDI7XG4gICAgbiB8PSBuID4+PiA0O1xuICAgIG4gfD0gbiA+Pj4gODtcbiAgICBuIHw9IG4gPj4+IDE2O1xuICAgIG4rKztcbiAgfVxuICByZXR1cm4gbjtcbn1cblxuZnVuY3Rpb24gaG93TXVjaFRvUmVhZChuLCBzdGF0ZSkge1xuICBpZiAoc3RhdGUubGVuZ3RoID09PSAwICYmIHN0YXRlLmVuZGVkKVxuICAgIHJldHVybiAwO1xuXG4gIGlmIChzdGF0ZS5vYmplY3RNb2RlKVxuICAgIHJldHVybiBuID09PSAwID8gMCA6IDE7XG5cbiAgaWYgKG4gPT09IG51bGwgfHwgaXNOYU4obikpIHtcbiAgICAvLyBvbmx5IGZsb3cgb25lIGJ1ZmZlciBhdCBhIHRpbWVcbiAgICBpZiAoc3RhdGUuZmxvd2luZyAmJiBzdGF0ZS5idWZmZXIubGVuZ3RoKVxuICAgICAgcmV0dXJuIHN0YXRlLmJ1ZmZlclswXS5sZW5ndGg7XG4gICAgZWxzZVxuICAgICAgcmV0dXJuIHN0YXRlLmxlbmd0aDtcbiAgfVxuXG4gIGlmIChuIDw9IDApXG4gICAgcmV0dXJuIDA7XG5cbiAgLy8gSWYgd2UncmUgYXNraW5nIGZvciBtb3JlIHRoYW4gdGhlIHRhcmdldCBidWZmZXIgbGV2ZWwsXG4gIC8vIHRoZW4gcmFpc2UgdGhlIHdhdGVyIG1hcmsuICBCdW1wIHVwIHRvIHRoZSBuZXh0IGhpZ2hlc3RcbiAgLy8gcG93ZXIgb2YgMiwgdG8gcHJldmVudCBpbmNyZWFzaW5nIGl0IGV4Y2Vzc2l2ZWx5IGluIHRpbnlcbiAgLy8gYW1vdW50cy5cbiAgaWYgKG4gPiBzdGF0ZS5oaWdoV2F0ZXJNYXJrKVxuICAgIHN0YXRlLmhpZ2hXYXRlck1hcmsgPSBjb21wdXRlTmV3SGlnaFdhdGVyTWFyayhuKTtcblxuICAvLyBkb24ndCBoYXZlIHRoYXQgbXVjaC4gIHJldHVybiBudWxsLCB1bmxlc3Mgd2UndmUgZW5kZWQuXG4gIGlmIChuID4gc3RhdGUubGVuZ3RoKSB7XG4gICAgaWYgKCFzdGF0ZS5lbmRlZCkge1xuICAgICAgc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICAgIHJldHVybiAwO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gc3RhdGUubGVuZ3RoO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuO1xufVxuXG4vLyB5b3UgY2FuIG92ZXJyaWRlIGVpdGhlciB0aGlzIG1ldGhvZCwgb3IgdGhlIGFzeW5jIF9yZWFkKG4pIGJlbG93LlxuUmVhZGFibGUucHJvdG90eXBlLnJlYWQgPSBmdW5jdGlvbihuKSB7XG4gIGRlYnVnKCdyZWFkJywgbik7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gIHZhciBuT3JpZyA9IG47XG5cbiAgaWYgKHR5cGVvZiBuICE9PSAnbnVtYmVyJyB8fCBuID4gMClcbiAgICBzdGF0ZS5lbWl0dGVkUmVhZGFibGUgPSBmYWxzZTtcblxuICAvLyBpZiB3ZSdyZSBkb2luZyByZWFkKDApIHRvIHRyaWdnZXIgYSByZWFkYWJsZSBldmVudCwgYnV0IHdlXG4gIC8vIGFscmVhZHkgaGF2ZSBhIGJ1bmNoIG9mIGRhdGEgaW4gdGhlIGJ1ZmZlciwgdGhlbiBqdXN0IHRyaWdnZXJcbiAgLy8gdGhlICdyZWFkYWJsZScgZXZlbnQgYW5kIG1vdmUgb24uXG4gIGlmIChuID09PSAwICYmXG4gICAgICBzdGF0ZS5uZWVkUmVhZGFibGUgJiZcbiAgICAgIChzdGF0ZS5sZW5ndGggPj0gc3RhdGUuaGlnaFdhdGVyTWFyayB8fCBzdGF0ZS5lbmRlZCkpIHtcbiAgICBkZWJ1ZygncmVhZDogZW1pdFJlYWRhYmxlJywgc3RhdGUubGVuZ3RoLCBzdGF0ZS5lbmRlZCk7XG4gICAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCAmJiBzdGF0ZS5lbmRlZClcbiAgICAgIGVuZFJlYWRhYmxlKHRoaXMpO1xuICAgIGVsc2VcbiAgICAgIGVtaXRSZWFkYWJsZSh0aGlzKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIG4gPSBob3dNdWNoVG9SZWFkKG4sIHN0YXRlKTtcblxuICAvLyBpZiB3ZSd2ZSBlbmRlZCwgYW5kIHdlJ3JlIG5vdyBjbGVhciwgdGhlbiBmaW5pc2ggaXQgdXAuXG4gIGlmIChuID09PSAwICYmIHN0YXRlLmVuZGVkKSB7XG4gICAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMClcbiAgICAgIGVuZFJlYWRhYmxlKHRoaXMpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLy8gQWxsIHRoZSBhY3R1YWwgY2h1bmsgZ2VuZXJhdGlvbiBsb2dpYyBuZWVkcyB0byBiZVxuICAvLyAqYmVsb3cqIHRoZSBjYWxsIHRvIF9yZWFkLiAgVGhlIHJlYXNvbiBpcyB0aGF0IGluIGNlcnRhaW5cbiAgLy8gc3ludGhldGljIHN0cmVhbSBjYXNlcywgc3VjaCBhcyBwYXNzdGhyb3VnaCBzdHJlYW1zLCBfcmVhZFxuICAvLyBtYXkgYmUgYSBjb21wbGV0ZWx5IHN5bmNocm9ub3VzIG9wZXJhdGlvbiB3aGljaCBtYXkgY2hhbmdlXG4gIC8vIHRoZSBzdGF0ZSBvZiB0aGUgcmVhZCBidWZmZXIsIHByb3ZpZGluZyBlbm91Z2ggZGF0YSB3aGVuXG4gIC8vIGJlZm9yZSB0aGVyZSB3YXMgKm5vdCogZW5vdWdoLlxuICAvL1xuICAvLyBTbywgdGhlIHN0ZXBzIGFyZTpcbiAgLy8gMS4gRmlndXJlIG91dCB3aGF0IHRoZSBzdGF0ZSBvZiB0aGluZ3Mgd2lsbCBiZSBhZnRlciB3ZSBkb1xuICAvLyBhIHJlYWQgZnJvbSB0aGUgYnVmZmVyLlxuICAvL1xuICAvLyAyLiBJZiB0aGF0IHJlc3VsdGluZyBzdGF0ZSB3aWxsIHRyaWdnZXIgYSBfcmVhZCwgdGhlbiBjYWxsIF9yZWFkLlxuICAvLyBOb3RlIHRoYXQgdGhpcyBtYXkgYmUgYXN5bmNocm9ub3VzLCBvciBzeW5jaHJvbm91cy4gIFllcywgaXQgaXNcbiAgLy8gZGVlcGx5IHVnbHkgdG8gd3JpdGUgQVBJcyB0aGlzIHdheSwgYnV0IHRoYXQgc3RpbGwgZG9lc24ndCBtZWFuXG4gIC8vIHRoYXQgdGhlIFJlYWRhYmxlIGNsYXNzIHNob3VsZCBiZWhhdmUgaW1wcm9wZXJseSwgYXMgc3RyZWFtcyBhcmVcbiAgLy8gZGVzaWduZWQgdG8gYmUgc3luYy9hc3luYyBhZ25vc3RpYy5cbiAgLy8gVGFrZSBub3RlIGlmIHRoZSBfcmVhZCBjYWxsIGlzIHN5bmMgb3IgYXN5bmMgKGllLCBpZiB0aGUgcmVhZCBjYWxsXG4gIC8vIGhhcyByZXR1cm5lZCB5ZXQpLCBzbyB0aGF0IHdlIGtub3cgd2hldGhlciBvciBub3QgaXQncyBzYWZlIHRvIGVtaXRcbiAgLy8gJ3JlYWRhYmxlJyBldGMuXG4gIC8vXG4gIC8vIDMuIEFjdHVhbGx5IHB1bGwgdGhlIHJlcXVlc3RlZCBjaHVua3Mgb3V0IG9mIHRoZSBidWZmZXIgYW5kIHJldHVybi5cblxuICAvLyBpZiB3ZSBuZWVkIGEgcmVhZGFibGUgZXZlbnQsIHRoZW4gd2UgbmVlZCB0byBkbyBzb21lIHJlYWRpbmcuXG4gIHZhciBkb1JlYWQgPSBzdGF0ZS5uZWVkUmVhZGFibGU7XG4gIGRlYnVnKCduZWVkIHJlYWRhYmxlJywgZG9SZWFkKTtcblxuICAvLyBpZiB3ZSBjdXJyZW50bHkgaGF2ZSBsZXNzIHRoYW4gdGhlIGhpZ2hXYXRlck1hcmssIHRoZW4gYWxzbyByZWFkIHNvbWVcbiAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCB8fCBzdGF0ZS5sZW5ndGggLSBuIDwgc3RhdGUuaGlnaFdhdGVyTWFyaykge1xuICAgIGRvUmVhZCA9IHRydWU7XG4gICAgZGVidWcoJ2xlbmd0aCBsZXNzIHRoYW4gd2F0ZXJtYXJrJywgZG9SZWFkKTtcbiAgfVxuXG4gIC8vIGhvd2V2ZXIsIGlmIHdlJ3ZlIGVuZGVkLCB0aGVuIHRoZXJlJ3Mgbm8gcG9pbnQsIGFuZCBpZiB3ZSdyZSBhbHJlYWR5XG4gIC8vIHJlYWRpbmcsIHRoZW4gaXQncyB1bm5lY2Vzc2FyeS5cbiAgaWYgKHN0YXRlLmVuZGVkIHx8IHN0YXRlLnJlYWRpbmcpIHtcbiAgICBkb1JlYWQgPSBmYWxzZTtcbiAgICBkZWJ1ZygncmVhZGluZyBvciBlbmRlZCcsIGRvUmVhZCk7XG4gIH1cblxuICBpZiAoZG9SZWFkKSB7XG4gICAgZGVidWcoJ2RvIHJlYWQnKTtcbiAgICBzdGF0ZS5yZWFkaW5nID0gdHJ1ZTtcbiAgICBzdGF0ZS5zeW5jID0gdHJ1ZTtcbiAgICAvLyBpZiB0aGUgbGVuZ3RoIGlzIGN1cnJlbnRseSB6ZXJvLCB0aGVuIHdlICpuZWVkKiBhIHJlYWRhYmxlIGV2ZW50LlxuICAgIGlmIChzdGF0ZS5sZW5ndGggPT09IDApXG4gICAgICBzdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlO1xuICAgIC8vIGNhbGwgaW50ZXJuYWwgcmVhZCBtZXRob2RcbiAgICB0aGlzLl9yZWFkKHN0YXRlLmhpZ2hXYXRlck1hcmspO1xuICAgIHN0YXRlLnN5bmMgPSBmYWxzZTtcbiAgfVxuXG4gIC8vIElmIF9yZWFkIHB1c2hlZCBkYXRhIHN5bmNocm9ub3VzbHksIHRoZW4gYHJlYWRpbmdgIHdpbGwgYmUgZmFsc2UsXG4gIC8vIGFuZCB3ZSBuZWVkIHRvIHJlLWV2YWx1YXRlIGhvdyBtdWNoIGRhdGEgd2UgY2FuIHJldHVybiB0byB0aGUgdXNlci5cbiAgaWYgKGRvUmVhZCAmJiAhc3RhdGUucmVhZGluZylcbiAgICBuID0gaG93TXVjaFRvUmVhZChuT3JpZywgc3RhdGUpO1xuXG4gIHZhciByZXQ7XG4gIGlmIChuID4gMClcbiAgICByZXQgPSBmcm9tTGlzdChuLCBzdGF0ZSk7XG4gIGVsc2VcbiAgICByZXQgPSBudWxsO1xuXG4gIGlmIChyZXQgPT09IG51bGwpIHtcbiAgICBzdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlO1xuICAgIG4gPSAwO1xuICB9XG5cbiAgc3RhdGUubGVuZ3RoIC09IG47XG5cbiAgLy8gSWYgd2UgaGF2ZSBub3RoaW5nIGluIHRoZSBidWZmZXIsIHRoZW4gd2Ugd2FudCB0byBrbm93XG4gIC8vIGFzIHNvb24gYXMgd2UgKmRvKiBnZXQgc29tZXRoaW5nIGludG8gdGhlIGJ1ZmZlci5cbiAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCAmJiAhc3RhdGUuZW5kZWQpXG4gICAgc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcblxuICAvLyBJZiB3ZSB0cmllZCB0byByZWFkKCkgcGFzdCB0aGUgRU9GLCB0aGVuIGVtaXQgZW5kIG9uIHRoZSBuZXh0IHRpY2suXG4gIGlmIChuT3JpZyAhPT0gbiAmJiBzdGF0ZS5lbmRlZCAmJiBzdGF0ZS5sZW5ndGggPT09IDApXG4gICAgZW5kUmVhZGFibGUodGhpcyk7XG5cbiAgaWYgKHJldCAhPT0gbnVsbClcbiAgICB0aGlzLmVtaXQoJ2RhdGEnLCByZXQpO1xuXG4gIHJldHVybiByZXQ7XG59O1xuXG5mdW5jdGlvbiBjaHVua0ludmFsaWQoc3RhdGUsIGNodW5rKSB7XG4gIHZhciBlciA9IG51bGw7XG4gIGlmICghKEJ1ZmZlci5pc0J1ZmZlcihjaHVuaykpICYmXG4gICAgICB0eXBlb2YgY2h1bmsgIT09ICdzdHJpbmcnICYmXG4gICAgICBjaHVuayAhPT0gbnVsbCAmJlxuICAgICAgY2h1bmsgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgIXN0YXRlLm9iamVjdE1vZGUpIHtcbiAgICBlciA9IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgbm9uLXN0cmluZy9idWZmZXIgY2h1bmsnKTtcbiAgfVxuICByZXR1cm4gZXI7XG59XG5cblxuZnVuY3Rpb24gb25Fb2ZDaHVuayhzdHJlYW0sIHN0YXRlKSB7XG4gIGlmIChzdGF0ZS5lbmRlZCkgcmV0dXJuO1xuICBpZiAoc3RhdGUuZGVjb2Rlcikge1xuICAgIHZhciBjaHVuayA9IHN0YXRlLmRlY29kZXIuZW5kKCk7XG4gICAgaWYgKGNodW5rICYmIGNodW5rLmxlbmd0aCkge1xuICAgICAgc3RhdGUuYnVmZmVyLnB1c2goY2h1bmspO1xuICAgICAgc3RhdGUubGVuZ3RoICs9IHN0YXRlLm9iamVjdE1vZGUgPyAxIDogY2h1bmsubGVuZ3RoO1xuICAgIH1cbiAgfVxuICBzdGF0ZS5lbmRlZCA9IHRydWU7XG5cbiAgLy8gZW1pdCAncmVhZGFibGUnIG5vdyB0byBtYWtlIHN1cmUgaXQgZ2V0cyBwaWNrZWQgdXAuXG4gIGVtaXRSZWFkYWJsZShzdHJlYW0pO1xufVxuXG4vLyBEb24ndCBlbWl0IHJlYWRhYmxlIHJpZ2h0IGF3YXkgaW4gc3luYyBtb2RlLCBiZWNhdXNlIHRoaXMgY2FuIHRyaWdnZXJcbi8vIGFub3RoZXIgcmVhZCgpIGNhbGwgPT4gc3RhY2sgb3ZlcmZsb3cuICBUaGlzIHdheSwgaXQgbWlnaHQgdHJpZ2dlclxuLy8gYSBuZXh0VGljayByZWN1cnNpb24gd2FybmluZywgYnV0IHRoYXQncyBub3Qgc28gYmFkLlxuZnVuY3Rpb24gZW1pdFJlYWRhYmxlKHN0cmVhbSkge1xuICB2YXIgc3RhdGUgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGU7XG4gIHN0YXRlLm5lZWRSZWFkYWJsZSA9IGZhbHNlO1xuICBpZiAoIXN0YXRlLmVtaXR0ZWRSZWFkYWJsZSkge1xuICAgIGRlYnVnKCdlbWl0UmVhZGFibGUnLCBzdGF0ZS5mbG93aW5nKTtcbiAgICBzdGF0ZS5lbWl0dGVkUmVhZGFibGUgPSB0cnVlO1xuICAgIGlmIChzdGF0ZS5zeW5jKVxuICAgICAgcHJvY2Vzc05leHRUaWNrKGVtaXRSZWFkYWJsZV8sIHN0cmVhbSk7XG4gICAgZWxzZVxuICAgICAgZW1pdFJlYWRhYmxlXyhzdHJlYW0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGVtaXRSZWFkYWJsZV8oc3RyZWFtKSB7XG4gIGRlYnVnKCdlbWl0IHJlYWRhYmxlJyk7XG4gIHN0cmVhbS5lbWl0KCdyZWFkYWJsZScpO1xuICBmbG93KHN0cmVhbSk7XG59XG5cblxuLy8gYXQgdGhpcyBwb2ludCwgdGhlIHVzZXIgaGFzIHByZXN1bWFibHkgc2VlbiB0aGUgJ3JlYWRhYmxlJyBldmVudCxcbi8vIGFuZCBjYWxsZWQgcmVhZCgpIHRvIGNvbnN1bWUgc29tZSBkYXRhLiAgdGhhdCBtYXkgaGF2ZSB0cmlnZ2VyZWRcbi8vIGluIHR1cm4gYW5vdGhlciBfcmVhZChuKSBjYWxsLCBpbiB3aGljaCBjYXNlIHJlYWRpbmcgPSB0cnVlIGlmXG4vLyBpdCdzIGluIHByb2dyZXNzLlxuLy8gSG93ZXZlciwgaWYgd2UncmUgbm90IGVuZGVkLCBvciByZWFkaW5nLCBhbmQgdGhlIGxlbmd0aCA8IGh3bSxcbi8vIHRoZW4gZ28gYWhlYWQgYW5kIHRyeSB0byByZWFkIHNvbWUgbW9yZSBwcmVlbXB0aXZlbHkuXG5mdW5jdGlvbiBtYXliZVJlYWRNb3JlKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKCFzdGF0ZS5yZWFkaW5nTW9yZSkge1xuICAgIHN0YXRlLnJlYWRpbmdNb3JlID0gdHJ1ZTtcbiAgICBwcm9jZXNzTmV4dFRpY2sobWF5YmVSZWFkTW9yZV8sIHN0cmVhbSwgc3RhdGUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1heWJlUmVhZE1vcmVfKHN0cmVhbSwgc3RhdGUpIHtcbiAgdmFyIGxlbiA9IHN0YXRlLmxlbmd0aDtcbiAgd2hpbGUgKCFzdGF0ZS5yZWFkaW5nICYmICFzdGF0ZS5mbG93aW5nICYmICFzdGF0ZS5lbmRlZCAmJlxuICAgICAgICAgc3RhdGUubGVuZ3RoIDwgc3RhdGUuaGlnaFdhdGVyTWFyaykge1xuICAgIGRlYnVnKCdtYXliZVJlYWRNb3JlIHJlYWQgMCcpO1xuICAgIHN0cmVhbS5yZWFkKDApO1xuICAgIGlmIChsZW4gPT09IHN0YXRlLmxlbmd0aClcbiAgICAgIC8vIGRpZG4ndCBnZXQgYW55IGRhdGEsIHN0b3Agc3Bpbm5pbmcuXG4gICAgICBicmVhaztcbiAgICBlbHNlXG4gICAgICBsZW4gPSBzdGF0ZS5sZW5ndGg7XG4gIH1cbiAgc3RhdGUucmVhZGluZ01vcmUgPSBmYWxzZTtcbn1cblxuLy8gYWJzdHJhY3QgbWV0aG9kLiAgdG8gYmUgb3ZlcnJpZGRlbiBpbiBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBjbGFzc2VzLlxuLy8gY2FsbCBjYihlciwgZGF0YSkgd2hlcmUgZGF0YSBpcyA8PSBuIGluIGxlbmd0aC5cbi8vIGZvciB2aXJ0dWFsIChub24tc3RyaW5nLCBub24tYnVmZmVyKSBzdHJlYW1zLCBcImxlbmd0aFwiIGlzIHNvbWV3aGF0XG4vLyBhcmJpdHJhcnksIGFuZCBwZXJoYXBzIG5vdCB2ZXJ5IG1lYW5pbmdmdWwuXG5SZWFkYWJsZS5wcm90b3R5cGUuX3JlYWQgPSBmdW5jdGlvbihuKSB7XG4gIHRoaXMuZW1pdCgnZXJyb3InLCBuZXcgRXJyb3IoJ25vdCBpbXBsZW1lbnRlZCcpKTtcbn07XG5cblJlYWRhYmxlLnByb3RvdHlwZS5waXBlID0gZnVuY3Rpb24oZGVzdCwgcGlwZU9wdHMpIHtcbiAgdmFyIHNyYyA9IHRoaXM7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG5cbiAgc3dpdGNoIChzdGF0ZS5waXBlc0NvdW50KSB7XG4gICAgY2FzZSAwOlxuICAgICAgc3RhdGUucGlwZXMgPSBkZXN0O1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAxOlxuICAgICAgc3RhdGUucGlwZXMgPSBbc3RhdGUucGlwZXMsIGRlc3RdO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHN0YXRlLnBpcGVzLnB1c2goZGVzdCk7XG4gICAgICBicmVhaztcbiAgfVxuICBzdGF0ZS5waXBlc0NvdW50ICs9IDE7XG4gIGRlYnVnKCdwaXBlIGNvdW50PSVkIG9wdHM9JWonLCBzdGF0ZS5waXBlc0NvdW50LCBwaXBlT3B0cyk7XG5cbiAgdmFyIGRvRW5kID0gKCFwaXBlT3B0cyB8fCBwaXBlT3B0cy5lbmQgIT09IGZhbHNlKSAmJlxuICAgICAgICAgICAgICBkZXN0ICE9PSBwcm9jZXNzLnN0ZG91dCAmJlxuICAgICAgICAgICAgICBkZXN0ICE9PSBwcm9jZXNzLnN0ZGVycjtcblxuICB2YXIgZW5kRm4gPSBkb0VuZCA/IG9uZW5kIDogY2xlYW51cDtcbiAgaWYgKHN0YXRlLmVuZEVtaXR0ZWQpXG4gICAgcHJvY2Vzc05leHRUaWNrKGVuZEZuKTtcbiAgZWxzZVxuICAgIHNyYy5vbmNlKCdlbmQnLCBlbmRGbik7XG5cbiAgZGVzdC5vbigndW5waXBlJywgb251bnBpcGUpO1xuICBmdW5jdGlvbiBvbnVucGlwZShyZWFkYWJsZSkge1xuICAgIGRlYnVnKCdvbnVucGlwZScpO1xuICAgIGlmIChyZWFkYWJsZSA9PT0gc3JjKSB7XG4gICAgICBjbGVhbnVwKCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gb25lbmQoKSB7XG4gICAgZGVidWcoJ29uZW5kJyk7XG4gICAgZGVzdC5lbmQoKTtcbiAgfVxuXG4gIC8vIHdoZW4gdGhlIGRlc3QgZHJhaW5zLCBpdCByZWR1Y2VzIHRoZSBhd2FpdERyYWluIGNvdW50ZXJcbiAgLy8gb24gdGhlIHNvdXJjZS4gIFRoaXMgd291bGQgYmUgbW9yZSBlbGVnYW50IHdpdGggYSAub25jZSgpXG4gIC8vIGhhbmRsZXIgaW4gZmxvdygpLCBidXQgYWRkaW5nIGFuZCByZW1vdmluZyByZXBlYXRlZGx5IGlzXG4gIC8vIHRvbyBzbG93LlxuICB2YXIgb25kcmFpbiA9IHBpcGVPbkRyYWluKHNyYyk7XG4gIGRlc3Qub24oJ2RyYWluJywgb25kcmFpbik7XG5cbiAgdmFyIGNsZWFuZWRVcCA9IGZhbHNlO1xuICBmdW5jdGlvbiBjbGVhbnVwKCkge1xuICAgIGRlYnVnKCdjbGVhbnVwJyk7XG4gICAgLy8gY2xlYW51cCBldmVudCBoYW5kbGVycyBvbmNlIHRoZSBwaXBlIGlzIGJyb2tlblxuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2Nsb3NlJywgb25jbG9zZSk7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZmluaXNoJywgb25maW5pc2gpO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2RyYWluJywgb25kcmFpbik7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBvbmVycm9yKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCd1bnBpcGUnLCBvbnVucGlwZSk7XG4gICAgc3JjLnJlbW92ZUxpc3RlbmVyKCdlbmQnLCBvbmVuZCk7XG4gICAgc3JjLnJlbW92ZUxpc3RlbmVyKCdlbmQnLCBjbGVhbnVwKTtcbiAgICBzcmMucmVtb3ZlTGlzdGVuZXIoJ2RhdGEnLCBvbmRhdGEpO1xuXG4gICAgY2xlYW5lZFVwID0gdHJ1ZTtcblxuICAgIC8vIGlmIHRoZSByZWFkZXIgaXMgd2FpdGluZyBmb3IgYSBkcmFpbiBldmVudCBmcm9tIHRoaXNcbiAgICAvLyBzcGVjaWZpYyB3cml0ZXIsIHRoZW4gaXQgd291bGQgY2F1c2UgaXQgdG8gbmV2ZXIgc3RhcnRcbiAgICAvLyBmbG93aW5nIGFnYWluLlxuICAgIC8vIFNvLCBpZiB0aGlzIGlzIGF3YWl0aW5nIGEgZHJhaW4sIHRoZW4gd2UganVzdCBjYWxsIGl0IG5vdy5cbiAgICAvLyBJZiB3ZSBkb24ndCBrbm93LCB0aGVuIGFzc3VtZSB0aGF0IHdlIGFyZSB3YWl0aW5nIGZvciBvbmUuXG4gICAgaWYgKHN0YXRlLmF3YWl0RHJhaW4gJiZcbiAgICAgICAgKCFkZXN0Ll93cml0YWJsZVN0YXRlIHx8IGRlc3QuX3dyaXRhYmxlU3RhdGUubmVlZERyYWluKSlcbiAgICAgIG9uZHJhaW4oKTtcbiAgfVxuXG4gIHNyYy5vbignZGF0YScsIG9uZGF0YSk7XG4gIGZ1bmN0aW9uIG9uZGF0YShjaHVuaykge1xuICAgIGRlYnVnKCdvbmRhdGEnKTtcbiAgICB2YXIgcmV0ID0gZGVzdC53cml0ZShjaHVuayk7XG4gICAgaWYgKGZhbHNlID09PSByZXQpIHtcbiAgICAgIC8vIElmIHRoZSB1c2VyIHVucGlwZWQgZHVyaW5nIGBkZXN0LndyaXRlKClgLCBpdCBpcyBwb3NzaWJsZVxuICAgICAgLy8gdG8gZ2V0IHN0dWNrIGluIGEgcGVybWFuZW50bHkgcGF1c2VkIHN0YXRlIGlmIHRoYXQgd3JpdGVcbiAgICAgIC8vIGFsc28gcmV0dXJuZWQgZmFsc2UuXG4gICAgICBpZiAoc3RhdGUucGlwZXNDb3VudCA9PT0gMSAmJlxuICAgICAgICAgIHN0YXRlLnBpcGVzWzBdID09PSBkZXN0ICYmXG4gICAgICAgICAgc3JjLmxpc3RlbmVyQ291bnQoJ2RhdGEnKSA9PT0gMSAmJlxuICAgICAgICAgICFjbGVhbmVkVXApIHtcbiAgICAgICAgZGVidWcoJ2ZhbHNlIHdyaXRlIHJlc3BvbnNlLCBwYXVzZScsIHNyYy5fcmVhZGFibGVTdGF0ZS5hd2FpdERyYWluKTtcbiAgICAgICAgc3JjLl9yZWFkYWJsZVN0YXRlLmF3YWl0RHJhaW4rKztcbiAgICAgIH1cbiAgICAgIHNyYy5wYXVzZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8vIGlmIHRoZSBkZXN0IGhhcyBhbiBlcnJvciwgdGhlbiBzdG9wIHBpcGluZyBpbnRvIGl0LlxuICAvLyBob3dldmVyLCBkb24ndCBzdXBwcmVzcyB0aGUgdGhyb3dpbmcgYmVoYXZpb3IgZm9yIHRoaXMuXG4gIGZ1bmN0aW9uIG9uZXJyb3IoZXIpIHtcbiAgICBkZWJ1Zygnb25lcnJvcicsIGVyKTtcbiAgICB1bnBpcGUoKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdlcnJvcicsIG9uZXJyb3IpO1xuICAgIGlmIChFRWxpc3RlbmVyQ291bnQoZGVzdCwgJ2Vycm9yJykgPT09IDApXG4gICAgICBkZXN0LmVtaXQoJ2Vycm9yJywgZXIpO1xuICB9XG4gIC8vIFRoaXMgaXMgYSBicnV0YWxseSB1Z2x5IGhhY2sgdG8gbWFrZSBzdXJlIHRoYXQgb3VyIGVycm9yIGhhbmRsZXJcbiAgLy8gaXMgYXR0YWNoZWQgYmVmb3JlIGFueSB1c2VybGFuZCBvbmVzLiAgTkVWRVIgRE8gVEhJUy5cbiAgaWYgKCFkZXN0Ll9ldmVudHMgfHwgIWRlc3QuX2V2ZW50cy5lcnJvcilcbiAgICBkZXN0Lm9uKCdlcnJvcicsIG9uZXJyb3IpO1xuICBlbHNlIGlmIChpc0FycmF5KGRlc3QuX2V2ZW50cy5lcnJvcikpXG4gICAgZGVzdC5fZXZlbnRzLmVycm9yLnVuc2hpZnQob25lcnJvcik7XG4gIGVsc2VcbiAgICBkZXN0Ll9ldmVudHMuZXJyb3IgPSBbb25lcnJvciwgZGVzdC5fZXZlbnRzLmVycm9yXTtcblxuXG4gIC8vIEJvdGggY2xvc2UgYW5kIGZpbmlzaCBzaG91bGQgdHJpZ2dlciB1bnBpcGUsIGJ1dCBvbmx5IG9uY2UuXG4gIGZ1bmN0aW9uIG9uY2xvc2UoKSB7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZmluaXNoJywgb25maW5pc2gpO1xuICAgIHVucGlwZSgpO1xuICB9XG4gIGRlc3Qub25jZSgnY2xvc2UnLCBvbmNsb3NlKTtcbiAgZnVuY3Rpb24gb25maW5pc2goKSB7XG4gICAgZGVidWcoJ29uZmluaXNoJyk7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLCBvbmNsb3NlKTtcbiAgICB1bnBpcGUoKTtcbiAgfVxuICBkZXN0Lm9uY2UoJ2ZpbmlzaCcsIG9uZmluaXNoKTtcblxuICBmdW5jdGlvbiB1bnBpcGUoKSB7XG4gICAgZGVidWcoJ3VucGlwZScpO1xuICAgIHNyYy51bnBpcGUoZGVzdCk7XG4gIH1cblxuICAvLyB0ZWxsIHRoZSBkZXN0IHRoYXQgaXQncyBiZWluZyBwaXBlZCB0b1xuICBkZXN0LmVtaXQoJ3BpcGUnLCBzcmMpO1xuXG4gIC8vIHN0YXJ0IHRoZSBmbG93IGlmIGl0IGhhc24ndCBiZWVuIHN0YXJ0ZWQgYWxyZWFkeS5cbiAgaWYgKCFzdGF0ZS5mbG93aW5nKSB7XG4gICAgZGVidWcoJ3BpcGUgcmVzdW1lJyk7XG4gICAgc3JjLnJlc3VtZSgpO1xuICB9XG5cbiAgcmV0dXJuIGRlc3Q7XG59O1xuXG5mdW5jdGlvbiBwaXBlT25EcmFpbihzcmMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBzdGF0ZSA9IHNyYy5fcmVhZGFibGVTdGF0ZTtcbiAgICBkZWJ1ZygncGlwZU9uRHJhaW4nLCBzdGF0ZS5hd2FpdERyYWluKTtcbiAgICBpZiAoc3RhdGUuYXdhaXREcmFpbilcbiAgICAgIHN0YXRlLmF3YWl0RHJhaW4tLTtcbiAgICBpZiAoc3RhdGUuYXdhaXREcmFpbiA9PT0gMCAmJiBFRWxpc3RlbmVyQ291bnQoc3JjLCAnZGF0YScpKSB7XG4gICAgICBzdGF0ZS5mbG93aW5nID0gdHJ1ZTtcbiAgICAgIGZsb3coc3JjKTtcbiAgICB9XG4gIH07XG59XG5cblxuUmVhZGFibGUucHJvdG90eXBlLnVucGlwZSA9IGZ1bmN0aW9uKGRlc3QpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcblxuICAvLyBpZiB3ZSdyZSBub3QgcGlwaW5nIGFueXdoZXJlLCB0aGVuIGRvIG5vdGhpbmcuXG4gIGlmIChzdGF0ZS5waXBlc0NvdW50ID09PSAwKVxuICAgIHJldHVybiB0aGlzO1xuXG4gIC8vIGp1c3Qgb25lIGRlc3RpbmF0aW9uLiAgbW9zdCBjb21tb24gY2FzZS5cbiAgaWYgKHN0YXRlLnBpcGVzQ291bnQgPT09IDEpIHtcbiAgICAvLyBwYXNzZWQgaW4gb25lLCBidXQgaXQncyBub3QgdGhlIHJpZ2h0IG9uZS5cbiAgICBpZiAoZGVzdCAmJiBkZXN0ICE9PSBzdGF0ZS5waXBlcylcbiAgICAgIHJldHVybiB0aGlzO1xuXG4gICAgaWYgKCFkZXN0KVxuICAgICAgZGVzdCA9IHN0YXRlLnBpcGVzO1xuXG4gICAgLy8gZ290IGEgbWF0Y2guXG4gICAgc3RhdGUucGlwZXMgPSBudWxsO1xuICAgIHN0YXRlLnBpcGVzQ291bnQgPSAwO1xuICAgIHN0YXRlLmZsb3dpbmcgPSBmYWxzZTtcbiAgICBpZiAoZGVzdClcbiAgICAgIGRlc3QuZW1pdCgndW5waXBlJywgdGhpcyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBzbG93IGNhc2UuIG11bHRpcGxlIHBpcGUgZGVzdGluYXRpb25zLlxuXG4gIGlmICghZGVzdCkge1xuICAgIC8vIHJlbW92ZSBhbGwuXG4gICAgdmFyIGRlc3RzID0gc3RhdGUucGlwZXM7XG4gICAgdmFyIGxlbiA9IHN0YXRlLnBpcGVzQ291bnQ7XG4gICAgc3RhdGUucGlwZXMgPSBudWxsO1xuICAgIHN0YXRlLnBpcGVzQ291bnQgPSAwO1xuICAgIHN0YXRlLmZsb3dpbmcgPSBmYWxzZTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspXG4gICAgICBkZXN0c1tpXS5lbWl0KCd1bnBpcGUnLCB0aGlzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIHRyeSB0byBmaW5kIHRoZSByaWdodCBvbmUuXG4gIHZhciBpID0gaW5kZXhPZihzdGF0ZS5waXBlcywgZGVzdCk7XG4gIGlmIChpID09PSAtMSlcbiAgICByZXR1cm4gdGhpcztcblxuICBzdGF0ZS5waXBlcy5zcGxpY2UoaSwgMSk7XG4gIHN0YXRlLnBpcGVzQ291bnQgLT0gMTtcbiAgaWYgKHN0YXRlLnBpcGVzQ291bnQgPT09IDEpXG4gICAgc3RhdGUucGlwZXMgPSBzdGF0ZS5waXBlc1swXTtcblxuICBkZXN0LmVtaXQoJ3VucGlwZScsIHRoaXMpO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLy8gc2V0IHVwIGRhdGEgZXZlbnRzIGlmIHRoZXkgYXJlIGFza2VkIGZvclxuLy8gRW5zdXJlIHJlYWRhYmxlIGxpc3RlbmVycyBldmVudHVhbGx5IGdldCBzb21ldGhpbmdcblJlYWRhYmxlLnByb3RvdHlwZS5vbiA9IGZ1bmN0aW9uKGV2LCBmbikge1xuICB2YXIgcmVzID0gU3RyZWFtLnByb3RvdHlwZS5vbi5jYWxsKHRoaXMsIGV2LCBmbik7XG5cbiAgLy8gSWYgbGlzdGVuaW5nIHRvIGRhdGEsIGFuZCBpdCBoYXMgbm90IGV4cGxpY2l0bHkgYmVlbiBwYXVzZWQsXG4gIC8vIHRoZW4gY2FsbCByZXN1bWUgdG8gc3RhcnQgdGhlIGZsb3cgb2YgZGF0YSBvbiB0aGUgbmV4dCB0aWNrLlxuICBpZiAoZXYgPT09ICdkYXRhJyAmJiBmYWxzZSAhPT0gdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nKSB7XG4gICAgdGhpcy5yZXN1bWUoKTtcbiAgfVxuXG4gIGlmIChldiA9PT0gJ3JlYWRhYmxlJyAmJiB0aGlzLnJlYWRhYmxlKSB7XG4gICAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgICBpZiAoIXN0YXRlLnJlYWRhYmxlTGlzdGVuaW5nKSB7XG4gICAgICBzdGF0ZS5yZWFkYWJsZUxpc3RlbmluZyA9IHRydWU7XG4gICAgICBzdGF0ZS5lbWl0dGVkUmVhZGFibGUgPSBmYWxzZTtcbiAgICAgIHN0YXRlLm5lZWRSZWFkYWJsZSA9IHRydWU7XG4gICAgICBpZiAoIXN0YXRlLnJlYWRpbmcpIHtcbiAgICAgICAgcHJvY2Vzc05leHRUaWNrKG5SZWFkaW5nTmV4dFRpY2ssIHRoaXMpO1xuICAgICAgfSBlbHNlIGlmIChzdGF0ZS5sZW5ndGgpIHtcbiAgICAgICAgZW1pdFJlYWRhYmxlKHRoaXMsIHN0YXRlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzO1xufTtcblJlYWRhYmxlLnByb3RvdHlwZS5hZGRMaXN0ZW5lciA9IFJlYWRhYmxlLnByb3RvdHlwZS5vbjtcblxuZnVuY3Rpb24gblJlYWRpbmdOZXh0VGljayhzZWxmKSB7XG4gIGRlYnVnKCdyZWFkYWJsZSBuZXh0dGljayByZWFkIDAnKTtcbiAgc2VsZi5yZWFkKDApO1xufVxuXG4vLyBwYXVzZSgpIGFuZCByZXN1bWUoKSBhcmUgcmVtbmFudHMgb2YgdGhlIGxlZ2FjeSByZWFkYWJsZSBzdHJlYW0gQVBJXG4vLyBJZiB0aGUgdXNlciB1c2VzIHRoZW0sIHRoZW4gc3dpdGNoIGludG8gb2xkIG1vZGUuXG5SZWFkYWJsZS5wcm90b3R5cGUucmVzdW1lID0gZnVuY3Rpb24oKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gIGlmICghc3RhdGUuZmxvd2luZykge1xuICAgIGRlYnVnKCdyZXN1bWUnKTtcbiAgICBzdGF0ZS5mbG93aW5nID0gdHJ1ZTtcbiAgICByZXN1bWUodGhpcywgc3RhdGUpO1xuICB9XG4gIHJldHVybiB0aGlzO1xufTtcblxuZnVuY3Rpb24gcmVzdW1lKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKCFzdGF0ZS5yZXN1bWVTY2hlZHVsZWQpIHtcbiAgICBzdGF0ZS5yZXN1bWVTY2hlZHVsZWQgPSB0cnVlO1xuICAgIHByb2Nlc3NOZXh0VGljayhyZXN1bWVfLCBzdHJlYW0sIHN0YXRlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXN1bWVfKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKCFzdGF0ZS5yZWFkaW5nKSB7XG4gICAgZGVidWcoJ3Jlc3VtZSByZWFkIDAnKTtcbiAgICBzdHJlYW0ucmVhZCgwKTtcbiAgfVxuXG4gIHN0YXRlLnJlc3VtZVNjaGVkdWxlZCA9IGZhbHNlO1xuICBzdHJlYW0uZW1pdCgncmVzdW1lJyk7XG4gIGZsb3coc3RyZWFtKTtcbiAgaWYgKHN0YXRlLmZsb3dpbmcgJiYgIXN0YXRlLnJlYWRpbmcpXG4gICAgc3RyZWFtLnJlYWQoMCk7XG59XG5cblJlYWRhYmxlLnByb3RvdHlwZS5wYXVzZSA9IGZ1bmN0aW9uKCkge1xuICBkZWJ1ZygnY2FsbCBwYXVzZSBmbG93aW5nPSVqJywgdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nKTtcbiAgaWYgKGZhbHNlICE9PSB0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcpIHtcbiAgICBkZWJ1ZygncGF1c2UnKTtcbiAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcgPSBmYWxzZTtcbiAgICB0aGlzLmVtaXQoJ3BhdXNlJyk7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5mdW5jdGlvbiBmbG93KHN0cmVhbSkge1xuICB2YXIgc3RhdGUgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGU7XG4gIGRlYnVnKCdmbG93Jywgc3RhdGUuZmxvd2luZyk7XG4gIGlmIChzdGF0ZS5mbG93aW5nKSB7XG4gICAgZG8ge1xuICAgICAgdmFyIGNodW5rID0gc3RyZWFtLnJlYWQoKTtcbiAgICB9IHdoaWxlIChudWxsICE9PSBjaHVuayAmJiBzdGF0ZS5mbG93aW5nKTtcbiAgfVxufVxuXG4vLyB3cmFwIGFuIG9sZC1zdHlsZSBzdHJlYW0gYXMgdGhlIGFzeW5jIGRhdGEgc291cmNlLlxuLy8gVGhpcyBpcyAqbm90KiBwYXJ0IG9mIHRoZSByZWFkYWJsZSBzdHJlYW0gaW50ZXJmYWNlLlxuLy8gSXQgaXMgYW4gdWdseSB1bmZvcnR1bmF0ZSBtZXNzIG9mIGhpc3RvcnkuXG5SZWFkYWJsZS5wcm90b3R5cGUud3JhcCA9IGZ1bmN0aW9uKHN0cmVhbSkge1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICB2YXIgcGF1c2VkID0gZmFsc2U7XG5cbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBzdHJlYW0ub24oJ2VuZCcsIGZ1bmN0aW9uKCkge1xuICAgIGRlYnVnKCd3cmFwcGVkIGVuZCcpO1xuICAgIGlmIChzdGF0ZS5kZWNvZGVyICYmICFzdGF0ZS5lbmRlZCkge1xuICAgICAgdmFyIGNodW5rID0gc3RhdGUuZGVjb2Rlci5lbmQoKTtcbiAgICAgIGlmIChjaHVuayAmJiBjaHVuay5sZW5ndGgpXG4gICAgICAgIHNlbGYucHVzaChjaHVuayk7XG4gICAgfVxuXG4gICAgc2VsZi5wdXNoKG51bGwpO1xuICB9KTtcblxuICBzdHJlYW0ub24oJ2RhdGEnLCBmdW5jdGlvbihjaHVuaykge1xuICAgIGRlYnVnKCd3cmFwcGVkIGRhdGEnKTtcbiAgICBpZiAoc3RhdGUuZGVjb2RlcilcbiAgICAgIGNodW5rID0gc3RhdGUuZGVjb2Rlci53cml0ZShjaHVuayk7XG5cbiAgICAvLyBkb24ndCBza2lwIG92ZXIgZmFsc3kgdmFsdWVzIGluIG9iamVjdE1vZGVcbiAgICBpZiAoc3RhdGUub2JqZWN0TW9kZSAmJiAoY2h1bmsgPT09IG51bGwgfHwgY2h1bmsgPT09IHVuZGVmaW5lZCkpXG4gICAgICByZXR1cm47XG4gICAgZWxzZSBpZiAoIXN0YXRlLm9iamVjdE1vZGUgJiYgKCFjaHVuayB8fCAhY2h1bmsubGVuZ3RoKSlcbiAgICAgIHJldHVybjtcblxuICAgIHZhciByZXQgPSBzZWxmLnB1c2goY2h1bmspO1xuICAgIGlmICghcmV0KSB7XG4gICAgICBwYXVzZWQgPSB0cnVlO1xuICAgICAgc3RyZWFtLnBhdXNlKCk7XG4gICAgfVxuICB9KTtcblxuICAvLyBwcm94eSBhbGwgdGhlIG90aGVyIG1ldGhvZHMuXG4gIC8vIGltcG9ydGFudCB3aGVuIHdyYXBwaW5nIGZpbHRlcnMgYW5kIGR1cGxleGVzLlxuICBmb3IgKHZhciBpIGluIHN0cmVhbSkge1xuICAgIGlmICh0aGlzW2ldID09PSB1bmRlZmluZWQgJiYgdHlwZW9mIHN0cmVhbVtpXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhpc1tpXSA9IGZ1bmN0aW9uKG1ldGhvZCkgeyByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBzdHJlYW1bbWV0aG9kXS5hcHBseShzdHJlYW0sIGFyZ3VtZW50cyk7XG4gICAgICB9OyB9KGkpO1xuICAgIH1cbiAgfVxuXG4gIC8vIHByb3h5IGNlcnRhaW4gaW1wb3J0YW50IGV2ZW50cy5cbiAgdmFyIGV2ZW50cyA9IFsnZXJyb3InLCAnY2xvc2UnLCAnZGVzdHJveScsICdwYXVzZScsICdyZXN1bWUnXTtcbiAgZm9yRWFjaChldmVudHMsIGZ1bmN0aW9uKGV2KSB7XG4gICAgc3RyZWFtLm9uKGV2LCBzZWxmLmVtaXQuYmluZChzZWxmLCBldikpO1xuICB9KTtcblxuICAvLyB3aGVuIHdlIHRyeSB0byBjb25zdW1lIHNvbWUgbW9yZSBieXRlcywgc2ltcGx5IHVucGF1c2UgdGhlXG4gIC8vIHVuZGVybHlpbmcgc3RyZWFtLlxuICBzZWxmLl9yZWFkID0gZnVuY3Rpb24obikge1xuICAgIGRlYnVnKCd3cmFwcGVkIF9yZWFkJywgbik7XG4gICAgaWYgKHBhdXNlZCkge1xuICAgICAgcGF1c2VkID0gZmFsc2U7XG4gICAgICBzdHJlYW0ucmVzdW1lKCk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBzZWxmO1xufTtcblxuXG4vLyBleHBvc2VkIGZvciB0ZXN0aW5nIHB1cnBvc2VzIG9ubHkuXG5SZWFkYWJsZS5fZnJvbUxpc3QgPSBmcm9tTGlzdDtcblxuLy8gUGx1Y2sgb2ZmIG4gYnl0ZXMgZnJvbSBhbiBhcnJheSBvZiBidWZmZXJzLlxuLy8gTGVuZ3RoIGlzIHRoZSBjb21iaW5lZCBsZW5ndGhzIG9mIGFsbCB0aGUgYnVmZmVycyBpbiB0aGUgbGlzdC5cbmZ1bmN0aW9uIGZyb21MaXN0KG4sIHN0YXRlKSB7XG4gIHZhciBsaXN0ID0gc3RhdGUuYnVmZmVyO1xuICB2YXIgbGVuZ3RoID0gc3RhdGUubGVuZ3RoO1xuICB2YXIgc3RyaW5nTW9kZSA9ICEhc3RhdGUuZGVjb2RlcjtcbiAgdmFyIG9iamVjdE1vZGUgPSAhIXN0YXRlLm9iamVjdE1vZGU7XG4gIHZhciByZXQ7XG5cbiAgLy8gbm90aGluZyBpbiB0aGUgbGlzdCwgZGVmaW5pdGVseSBlbXB0eS5cbiAgaWYgKGxpc3QubGVuZ3RoID09PSAwKVxuICAgIHJldHVybiBudWxsO1xuXG4gIGlmIChsZW5ndGggPT09IDApXG4gICAgcmV0ID0gbnVsbDtcbiAgZWxzZSBpZiAob2JqZWN0TW9kZSlcbiAgICByZXQgPSBsaXN0LnNoaWZ0KCk7XG4gIGVsc2UgaWYgKCFuIHx8IG4gPj0gbGVuZ3RoKSB7XG4gICAgLy8gcmVhZCBpdCBhbGwsIHRydW5jYXRlIHRoZSBhcnJheS5cbiAgICBpZiAoc3RyaW5nTW9kZSlcbiAgICAgIHJldCA9IGxpc3Quam9pbignJyk7XG4gICAgZWxzZSBpZiAobGlzdC5sZW5ndGggPT09IDEpXG4gICAgICByZXQgPSBsaXN0WzBdO1xuICAgIGVsc2VcbiAgICAgIHJldCA9IEJ1ZmZlci5jb25jYXQobGlzdCwgbGVuZ3RoKTtcbiAgICBsaXN0Lmxlbmd0aCA9IDA7XG4gIH0gZWxzZSB7XG4gICAgLy8gcmVhZCBqdXN0IHNvbWUgb2YgaXQuXG4gICAgaWYgKG4gPCBsaXN0WzBdLmxlbmd0aCkge1xuICAgICAgLy8ganVzdCB0YWtlIGEgcGFydCBvZiB0aGUgZmlyc3QgbGlzdCBpdGVtLlxuICAgICAgLy8gc2xpY2UgaXMgdGhlIHNhbWUgZm9yIGJ1ZmZlcnMgYW5kIHN0cmluZ3MuXG4gICAgICB2YXIgYnVmID0gbGlzdFswXTtcbiAgICAgIHJldCA9IGJ1Zi5zbGljZSgwLCBuKTtcbiAgICAgIGxpc3RbMF0gPSBidWYuc2xpY2Uobik7XG4gICAgfSBlbHNlIGlmIChuID09PSBsaXN0WzBdLmxlbmd0aCkge1xuICAgICAgLy8gZmlyc3QgbGlzdCBpcyBhIHBlcmZlY3QgbWF0Y2hcbiAgICAgIHJldCA9IGxpc3Quc2hpZnQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gY29tcGxleCBjYXNlLlxuICAgICAgLy8gd2UgaGF2ZSBlbm91Z2ggdG8gY292ZXIgaXQsIGJ1dCBpdCBzcGFucyBwYXN0IHRoZSBmaXJzdCBidWZmZXIuXG4gICAgICBpZiAoc3RyaW5nTW9kZSlcbiAgICAgICAgcmV0ID0gJyc7XG4gICAgICBlbHNlXG4gICAgICAgIHJldCA9IG5ldyBCdWZmZXIobik7XG5cbiAgICAgIHZhciBjID0gMDtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gbGlzdC5sZW5ndGg7IGkgPCBsICYmIGMgPCBuOyBpKyspIHtcbiAgICAgICAgdmFyIGJ1ZiA9IGxpc3RbMF07XG4gICAgICAgIHZhciBjcHkgPSBNYXRoLm1pbihuIC0gYywgYnVmLmxlbmd0aCk7XG5cbiAgICAgICAgaWYgKHN0cmluZ01vZGUpXG4gICAgICAgICAgcmV0ICs9IGJ1Zi5zbGljZSgwLCBjcHkpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgYnVmLmNvcHkocmV0LCBjLCAwLCBjcHkpO1xuXG4gICAgICAgIGlmIChjcHkgPCBidWYubGVuZ3RoKVxuICAgICAgICAgIGxpc3RbMF0gPSBidWYuc2xpY2UoY3B5KTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgIGxpc3Quc2hpZnQoKTtcblxuICAgICAgICBjICs9IGNweTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmV0O1xufVxuXG5mdW5jdGlvbiBlbmRSZWFkYWJsZShzdHJlYW0pIHtcbiAgdmFyIHN0YXRlID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlO1xuXG4gIC8vIElmIHdlIGdldCBoZXJlIGJlZm9yZSBjb25zdW1pbmcgYWxsIHRoZSBieXRlcywgdGhlbiB0aGF0IGlzIGFcbiAgLy8gYnVnIGluIG5vZGUuICBTaG91bGQgbmV2ZXIgaGFwcGVuLlxuICBpZiAoc3RhdGUubGVuZ3RoID4gMClcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2VuZFJlYWRhYmxlIGNhbGxlZCBvbiBub24tZW1wdHkgc3RyZWFtJyk7XG5cbiAgaWYgKCFzdGF0ZS5lbmRFbWl0dGVkKSB7XG4gICAgc3RhdGUuZW5kZWQgPSB0cnVlO1xuICAgIHByb2Nlc3NOZXh0VGljayhlbmRSZWFkYWJsZU5ULCBzdGF0ZSwgc3RyZWFtKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBlbmRSZWFkYWJsZU5UKHN0YXRlLCBzdHJlYW0pIHtcbiAgLy8gQ2hlY2sgdGhhdCB3ZSBkaWRuJ3QgZ2V0IG9uZSBsYXN0IHVuc2hpZnQuXG4gIGlmICghc3RhdGUuZW5kRW1pdHRlZCAmJiBzdGF0ZS5sZW5ndGggPT09IDApIHtcbiAgICBzdGF0ZS5lbmRFbWl0dGVkID0gdHJ1ZTtcbiAgICBzdHJlYW0ucmVhZGFibGUgPSBmYWxzZTtcbiAgICBzdHJlYW0uZW1pdCgnZW5kJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZm9yRWFjaCAoeHMsIGYpIHtcbiAgZm9yICh2YXIgaSA9IDAsIGwgPSB4cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBmKHhzW2ldLCBpKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpbmRleE9mICh4cywgeCkge1xuICBmb3IgKHZhciBpID0gMCwgbCA9IHhzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGlmICh4c1tpXSA9PT0geCkgcmV0dXJuIGk7XG4gIH1cbiAgcmV0dXJuIC0xO1xufVxuIiwidmFyIFRyYW5zZm9ybSA9IHJlcXVpcmUoJ3JlYWRhYmxlLXN0cmVhbS90cmFuc2Zvcm0nKVxuICAsIGluaGVyaXRzICA9IHJlcXVpcmUoJ3V0aWwnKS5pbmhlcml0c1xuICAsIHh0ZW5kICAgICA9IHJlcXVpcmUoJ3h0ZW5kJylcblxuZnVuY3Rpb24gRGVzdHJveWFibGVUcmFuc2Zvcm0ob3B0cykge1xuICBUcmFuc2Zvcm0uY2FsbCh0aGlzLCBvcHRzKVxuICB0aGlzLl9kZXN0cm95ZWQgPSBmYWxzZVxufVxuXG5pbmhlcml0cyhEZXN0cm95YWJsZVRyYW5zZm9ybSwgVHJhbnNmb3JtKVxuXG5EZXN0cm95YWJsZVRyYW5zZm9ybS5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uKGVycikge1xuICBpZiAodGhpcy5fZGVzdHJveWVkKSByZXR1cm5cbiAgdGhpcy5fZGVzdHJveWVkID0gdHJ1ZVxuICBcbiAgdmFyIHNlbGYgPSB0aGlzXG4gIHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24oKSB7XG4gICAgaWYgKGVycilcbiAgICAgIHNlbGYuZW1pdCgnZXJyb3InLCBlcnIpXG4gICAgc2VsZi5lbWl0KCdjbG9zZScpXG4gIH0pXG59XG5cbi8vIGEgbm9vcCBfdHJhbnNmb3JtIGZ1bmN0aW9uXG5mdW5jdGlvbiBub29wIChjaHVuaywgZW5jLCBjYWxsYmFjaykge1xuICBjYWxsYmFjayhudWxsLCBjaHVuaylcbn1cblxuXG4vLyBjcmVhdGUgYSBuZXcgZXhwb3J0IGZ1bmN0aW9uLCB1c2VkIGJ5IGJvdGggdGhlIG1haW4gZXhwb3J0IGFuZFxuLy8gdGhlIC5jdG9yIGV4cG9ydCwgY29udGFpbnMgY29tbW9uIGxvZ2ljIGZvciBkZWFsaW5nIHdpdGggYXJndW1lbnRzXG5mdW5jdGlvbiB0aHJvdWdoMiAoY29uc3RydWN0KSB7XG4gIHJldHVybiBmdW5jdGlvbiAob3B0aW9ucywgdHJhbnNmb3JtLCBmbHVzaCkge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PSAnZnVuY3Rpb24nKSB7XG4gICAgICBmbHVzaCAgICAgPSB0cmFuc2Zvcm1cbiAgICAgIHRyYW5zZm9ybSA9IG9wdGlvbnNcbiAgICAgIG9wdGlvbnMgICA9IHt9XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB0cmFuc2Zvcm0gIT0gJ2Z1bmN0aW9uJylcbiAgICAgIHRyYW5zZm9ybSA9IG5vb3BcblxuICAgIGlmICh0eXBlb2YgZmx1c2ggIT0gJ2Z1bmN0aW9uJylcbiAgICAgIGZsdXNoID0gbnVsbFxuXG4gICAgcmV0dXJuIGNvbnN0cnVjdChvcHRpb25zLCB0cmFuc2Zvcm0sIGZsdXNoKVxuICB9XG59XG5cblxuLy8gbWFpbiBleHBvcnQsIGp1c3QgbWFrZSBtZSBhIHRyYW5zZm9ybSBzdHJlYW0hXG5tb2R1bGUuZXhwb3J0cyA9IHRocm91Z2gyKGZ1bmN0aW9uIChvcHRpb25zLCB0cmFuc2Zvcm0sIGZsdXNoKSB7XG4gIHZhciB0MiA9IG5ldyBEZXN0cm95YWJsZVRyYW5zZm9ybShvcHRpb25zKVxuXG4gIHQyLl90cmFuc2Zvcm0gPSB0cmFuc2Zvcm1cblxuICBpZiAoZmx1c2gpXG4gICAgdDIuX2ZsdXNoID0gZmx1c2hcblxuICByZXR1cm4gdDJcbn0pXG5cblxuLy8gbWFrZSBtZSBhIHJldXNhYmxlIHByb3RvdHlwZSB0aGF0IEkgY2FuIGBuZXdgLCBvciBpbXBsaWNpdGx5IGBuZXdgXG4vLyB3aXRoIGEgY29uc3RydWN0b3IgY2FsbFxubW9kdWxlLmV4cG9ydHMuY3RvciA9IHRocm91Z2gyKGZ1bmN0aW9uIChvcHRpb25zLCB0cmFuc2Zvcm0sIGZsdXNoKSB7XG4gIGZ1bmN0aW9uIFRocm91Z2gyIChvdmVycmlkZSkge1xuICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBUaHJvdWdoMikpXG4gICAgICByZXR1cm4gbmV3IFRocm91Z2gyKG92ZXJyaWRlKVxuXG4gICAgdGhpcy5vcHRpb25zID0geHRlbmQob3B0aW9ucywgb3ZlcnJpZGUpXG5cbiAgICBEZXN0cm95YWJsZVRyYW5zZm9ybS5jYWxsKHRoaXMsIHRoaXMub3B0aW9ucylcbiAgfVxuXG4gIGluaGVyaXRzKFRocm91Z2gyLCBEZXN0cm95YWJsZVRyYW5zZm9ybSlcblxuICBUaHJvdWdoMi5wcm90b3R5cGUuX3RyYW5zZm9ybSA9IHRyYW5zZm9ybVxuXG4gIGlmIChmbHVzaClcbiAgICBUaHJvdWdoMi5wcm90b3R5cGUuX2ZsdXNoID0gZmx1c2hcblxuICByZXR1cm4gVGhyb3VnaDJcbn0pXG5cblxubW9kdWxlLmV4cG9ydHMub2JqID0gdGhyb3VnaDIoZnVuY3Rpb24gKG9wdGlvbnMsIHRyYW5zZm9ybSwgZmx1c2gpIHtcbiAgdmFyIHQyID0gbmV3IERlc3Ryb3lhYmxlVHJhbnNmb3JtKHh0ZW5kKHsgb2JqZWN0TW9kZTogdHJ1ZSwgaGlnaFdhdGVyTWFyazogMTYgfSwgb3B0aW9ucykpXG5cbiAgdDIuX3RyYW5zZm9ybSA9IHRyYW5zZm9ybVxuXG4gIGlmIChmbHVzaClcbiAgICB0Mi5fZmx1c2ggPSBmbHVzaFxuXG4gIHJldHVybiB0MlxufSlcbiIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4vLyBhIGR1cGxleCBzdHJlYW0gaXMganVzdCBhIHN0cmVhbSB0aGF0IGlzIGJvdGggcmVhZGFibGUgYW5kIHdyaXRhYmxlLlxuLy8gU2luY2UgSlMgZG9lc24ndCBoYXZlIG11bHRpcGxlIHByb3RvdHlwYWwgaW5oZXJpdGFuY2UsIHRoaXMgY2xhc3Ncbi8vIHByb3RvdHlwYWxseSBpbmhlcml0cyBmcm9tIFJlYWRhYmxlLCBhbmQgdGhlbiBwYXJhc2l0aWNhbGx5IGZyb21cbi8vIFdyaXRhYmxlLlxuXG5tb2R1bGUuZXhwb3J0cyA9IER1cGxleDtcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBvYmplY3RLZXlzID0gT2JqZWN0LmtleXMgfHwgZnVuY3Rpb24gKG9iaikge1xuICB2YXIga2V5cyA9IFtdO1xuICBmb3IgKHZhciBrZXkgaW4gb2JqKSBrZXlzLnB1c2goa2V5KTtcbiAgcmV0dXJuIGtleXM7XG59XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIHV0aWwgPSByZXF1aXJlKCdjb3JlLXV0aWwtaXMnKTtcbnV0aWwuaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbnZhciBSZWFkYWJsZSA9IHJlcXVpcmUoJy4vX3N0cmVhbV9yZWFkYWJsZScpO1xudmFyIFdyaXRhYmxlID0gcmVxdWlyZSgnLi9fc3RyZWFtX3dyaXRhYmxlJyk7XG5cbnV0aWwuaW5oZXJpdHMoRHVwbGV4LCBSZWFkYWJsZSk7XG5cbmZvckVhY2gob2JqZWN0S2V5cyhXcml0YWJsZS5wcm90b3R5cGUpLCBmdW5jdGlvbihtZXRob2QpIHtcbiAgaWYgKCFEdXBsZXgucHJvdG90eXBlW21ldGhvZF0pXG4gICAgRHVwbGV4LnByb3RvdHlwZVttZXRob2RdID0gV3JpdGFibGUucHJvdG90eXBlW21ldGhvZF07XG59KTtcblxuZnVuY3Rpb24gRHVwbGV4KG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIER1cGxleCkpXG4gICAgcmV0dXJuIG5ldyBEdXBsZXgob3B0aW9ucyk7XG5cbiAgUmVhZGFibGUuY2FsbCh0aGlzLCBvcHRpb25zKTtcbiAgV3JpdGFibGUuY2FsbCh0aGlzLCBvcHRpb25zKTtcblxuICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLnJlYWRhYmxlID09PSBmYWxzZSlcbiAgICB0aGlzLnJlYWRhYmxlID0gZmFsc2U7XG5cbiAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy53cml0YWJsZSA9PT0gZmFsc2UpXG4gICAgdGhpcy53cml0YWJsZSA9IGZhbHNlO1xuXG4gIHRoaXMuYWxsb3dIYWxmT3BlbiA9IHRydWU7XG4gIGlmIChvcHRpb25zICYmIG9wdGlvbnMuYWxsb3dIYWxmT3BlbiA9PT0gZmFsc2UpXG4gICAgdGhpcy5hbGxvd0hhbGZPcGVuID0gZmFsc2U7XG5cbiAgdGhpcy5vbmNlKCdlbmQnLCBvbmVuZCk7XG59XG5cbi8vIHRoZSBuby1oYWxmLW9wZW4gZW5mb3JjZXJcbmZ1bmN0aW9uIG9uZW5kKCkge1xuICAvLyBpZiB3ZSBhbGxvdyBoYWxmLW9wZW4gc3RhdGUsIG9yIGlmIHRoZSB3cml0YWJsZSBzaWRlIGVuZGVkLFxuICAvLyB0aGVuIHdlJ3JlIG9rLlxuICBpZiAodGhpcy5hbGxvd0hhbGZPcGVuIHx8IHRoaXMuX3dyaXRhYmxlU3RhdGUuZW5kZWQpXG4gICAgcmV0dXJuO1xuXG4gIC8vIG5vIG1vcmUgZGF0YSBjYW4gYmUgd3JpdHRlbi5cbiAgLy8gQnV0IGFsbG93IG1vcmUgd3JpdGVzIHRvIGhhcHBlbiBpbiB0aGlzIHRpY2suXG4gIHByb2Nlc3MubmV4dFRpY2sodGhpcy5lbmQuYmluZCh0aGlzKSk7XG59XG5cbmZ1bmN0aW9uIGZvckVhY2ggKHhzLCBmKSB7XG4gIGZvciAodmFyIGkgPSAwLCBsID0geHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgZih4c1tpXSwgaSk7XG4gIH1cbn1cbiIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWRhYmxlO1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIGlzQXJyYXkgPSByZXF1aXJlKCdpc2FycmF5Jyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ2J1ZmZlcicpLkJ1ZmZlcjtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG5SZWFkYWJsZS5SZWFkYWJsZVN0YXRlID0gUmVhZGFibGVTdGF0ZTtcblxudmFyIEVFID0gcmVxdWlyZSgnZXZlbnRzJykuRXZlbnRFbWl0dGVyO1xuXG4vKjxyZXBsYWNlbWVudD4qL1xuaWYgKCFFRS5saXN0ZW5lckNvdW50KSBFRS5saXN0ZW5lckNvdW50ID0gZnVuY3Rpb24oZW1pdHRlciwgdHlwZSkge1xuICByZXR1cm4gZW1pdHRlci5saXN0ZW5lcnModHlwZSkubGVuZ3RoO1xufTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG52YXIgU3RyZWFtID0gcmVxdWlyZSgnc3RyZWFtJyk7XG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgdXRpbCA9IHJlcXVpcmUoJ2NvcmUtdXRpbC1pcycpO1xudXRpbC5pbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxudmFyIFN0cmluZ0RlY29kZXI7XG5cbnV0aWwuaW5oZXJpdHMoUmVhZGFibGUsIFN0cmVhbSk7XG5cbmZ1bmN0aW9uIFJlYWRhYmxlU3RhdGUob3B0aW9ucywgc3RyZWFtKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gIC8vIHRoZSBwb2ludCBhdCB3aGljaCBpdCBzdG9wcyBjYWxsaW5nIF9yZWFkKCkgdG8gZmlsbCB0aGUgYnVmZmVyXG4gIC8vIE5vdGU6IDAgaXMgYSB2YWxpZCB2YWx1ZSwgbWVhbnMgXCJkb24ndCBjYWxsIF9yZWFkIHByZWVtcHRpdmVseSBldmVyXCJcbiAgdmFyIGh3bSA9IG9wdGlvbnMuaGlnaFdhdGVyTWFyaztcbiAgdGhpcy5oaWdoV2F0ZXJNYXJrID0gKGh3bSB8fCBod20gPT09IDApID8gaHdtIDogMTYgKiAxMDI0O1xuXG4gIC8vIGNhc3QgdG8gaW50cy5cbiAgdGhpcy5oaWdoV2F0ZXJNYXJrID0gfn50aGlzLmhpZ2hXYXRlck1hcms7XG5cbiAgdGhpcy5idWZmZXIgPSBbXTtcbiAgdGhpcy5sZW5ndGggPSAwO1xuICB0aGlzLnBpcGVzID0gbnVsbDtcbiAgdGhpcy5waXBlc0NvdW50ID0gMDtcbiAgdGhpcy5mbG93aW5nID0gZmFsc2U7XG4gIHRoaXMuZW5kZWQgPSBmYWxzZTtcbiAgdGhpcy5lbmRFbWl0dGVkID0gZmFsc2U7XG4gIHRoaXMucmVhZGluZyA9IGZhbHNlO1xuXG4gIC8vIEluIHN0cmVhbXMgdGhhdCBuZXZlciBoYXZlIGFueSBkYXRhLCBhbmQgZG8gcHVzaChudWxsKSByaWdodCBhd2F5LFxuICAvLyB0aGUgY29uc3VtZXIgY2FuIG1pc3MgdGhlICdlbmQnIGV2ZW50IGlmIHRoZXkgZG8gc29tZSBJL08gYmVmb3JlXG4gIC8vIGNvbnN1bWluZyB0aGUgc3RyZWFtLiAgU28sIHdlIGRvbid0IGVtaXQoJ2VuZCcpIHVudGlsIHNvbWUgcmVhZGluZ1xuICAvLyBoYXBwZW5zLlxuICB0aGlzLmNhbGxlZFJlYWQgPSBmYWxzZTtcblxuICAvLyBhIGZsYWcgdG8gYmUgYWJsZSB0byB0ZWxsIGlmIHRoZSBvbndyaXRlIGNiIGlzIGNhbGxlZCBpbW1lZGlhdGVseSxcbiAgLy8gb3Igb24gYSBsYXRlciB0aWNrLiAgV2Ugc2V0IHRoaXMgdG8gdHJ1ZSBhdCBmaXJzdCwgYmVjdWFzZSBhbnlcbiAgLy8gYWN0aW9ucyB0aGF0IHNob3VsZG4ndCBoYXBwZW4gdW50aWwgXCJsYXRlclwiIHNob3VsZCBnZW5lcmFsbHkgYWxzb1xuICAvLyBub3QgaGFwcGVuIGJlZm9yZSB0aGUgZmlyc3Qgd3JpdGUgY2FsbC5cbiAgdGhpcy5zeW5jID0gdHJ1ZTtcblxuICAvLyB3aGVuZXZlciB3ZSByZXR1cm4gbnVsbCwgdGhlbiB3ZSBzZXQgYSBmbGFnIHRvIHNheVxuICAvLyB0aGF0IHdlJ3JlIGF3YWl0aW5nIGEgJ3JlYWRhYmxlJyBldmVudCBlbWlzc2lvbi5cbiAgdGhpcy5uZWVkUmVhZGFibGUgPSBmYWxzZTtcbiAgdGhpcy5lbWl0dGVkUmVhZGFibGUgPSBmYWxzZTtcbiAgdGhpcy5yZWFkYWJsZUxpc3RlbmluZyA9IGZhbHNlO1xuXG5cbiAgLy8gb2JqZWN0IHN0cmVhbSBmbGFnLiBVc2VkIHRvIG1ha2UgcmVhZChuKSBpZ25vcmUgbiBhbmQgdG9cbiAgLy8gbWFrZSBhbGwgdGhlIGJ1ZmZlciBtZXJnaW5nIGFuZCBsZW5ndGggY2hlY2tzIGdvIGF3YXlcbiAgdGhpcy5vYmplY3RNb2RlID0gISFvcHRpb25zLm9iamVjdE1vZGU7XG5cbiAgLy8gQ3J5cHRvIGlzIGtpbmQgb2Ygb2xkIGFuZCBjcnVzdHkuICBIaXN0b3JpY2FsbHksIGl0cyBkZWZhdWx0IHN0cmluZ1xuICAvLyBlbmNvZGluZyBpcyAnYmluYXJ5JyBzbyB3ZSBoYXZlIHRvIG1ha2UgdGhpcyBjb25maWd1cmFibGUuXG4gIC8vIEV2ZXJ5dGhpbmcgZWxzZSBpbiB0aGUgdW5pdmVyc2UgdXNlcyAndXRmOCcsIHRob3VnaC5cbiAgdGhpcy5kZWZhdWx0RW5jb2RpbmcgPSBvcHRpb25zLmRlZmF1bHRFbmNvZGluZyB8fCAndXRmOCc7XG5cbiAgLy8gd2hlbiBwaXBpbmcsIHdlIG9ubHkgY2FyZSBhYm91dCAncmVhZGFibGUnIGV2ZW50cyB0aGF0IGhhcHBlblxuICAvLyBhZnRlciByZWFkKClpbmcgYWxsIHRoZSBieXRlcyBhbmQgbm90IGdldHRpbmcgYW55IHB1c2hiYWNrLlxuICB0aGlzLnJhbk91dCA9IGZhbHNlO1xuXG4gIC8vIHRoZSBudW1iZXIgb2Ygd3JpdGVycyB0aGF0IGFyZSBhd2FpdGluZyBhIGRyYWluIGV2ZW50IGluIC5waXBlKClzXG4gIHRoaXMuYXdhaXREcmFpbiA9IDA7XG5cbiAgLy8gaWYgdHJ1ZSwgYSBtYXliZVJlYWRNb3JlIGhhcyBiZWVuIHNjaGVkdWxlZFxuICB0aGlzLnJlYWRpbmdNb3JlID0gZmFsc2U7XG5cbiAgdGhpcy5kZWNvZGVyID0gbnVsbDtcbiAgdGhpcy5lbmNvZGluZyA9IG51bGw7XG4gIGlmIChvcHRpb25zLmVuY29kaW5nKSB7XG4gICAgaWYgKCFTdHJpbmdEZWNvZGVyKVxuICAgICAgU3RyaW5nRGVjb2RlciA9IHJlcXVpcmUoJ3N0cmluZ19kZWNvZGVyLycpLlN0cmluZ0RlY29kZXI7XG4gICAgdGhpcy5kZWNvZGVyID0gbmV3IFN0cmluZ0RlY29kZXIob3B0aW9ucy5lbmNvZGluZyk7XG4gICAgdGhpcy5lbmNvZGluZyA9IG9wdGlvbnMuZW5jb2Rpbmc7XG4gIH1cbn1cblxuZnVuY3Rpb24gUmVhZGFibGUob3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgUmVhZGFibGUpKVxuICAgIHJldHVybiBuZXcgUmVhZGFibGUob3B0aW9ucyk7XG5cbiAgdGhpcy5fcmVhZGFibGVTdGF0ZSA9IG5ldyBSZWFkYWJsZVN0YXRlKG9wdGlvbnMsIHRoaXMpO1xuXG4gIC8vIGxlZ2FjeVxuICB0aGlzLnJlYWRhYmxlID0gdHJ1ZTtcblxuICBTdHJlYW0uY2FsbCh0aGlzKTtcbn1cblxuLy8gTWFudWFsbHkgc2hvdmUgc29tZXRoaW5nIGludG8gdGhlIHJlYWQoKSBidWZmZXIuXG4vLyBUaGlzIHJldHVybnMgdHJ1ZSBpZiB0aGUgaGlnaFdhdGVyTWFyayBoYXMgbm90IGJlZW4gaGl0IHlldCxcbi8vIHNpbWlsYXIgdG8gaG93IFdyaXRhYmxlLndyaXRlKCkgcmV0dXJucyB0cnVlIGlmIHlvdSBzaG91bGRcbi8vIHdyaXRlKCkgc29tZSBtb3JlLlxuUmVhZGFibGUucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbihjaHVuaywgZW5jb2RpbmcpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcblxuICBpZiAodHlwZW9mIGNodW5rID09PSAnc3RyaW5nJyAmJiAhc3RhdGUub2JqZWN0TW9kZSkge1xuICAgIGVuY29kaW5nID0gZW5jb2RpbmcgfHwgc3RhdGUuZGVmYXVsdEVuY29kaW5nO1xuICAgIGlmIChlbmNvZGluZyAhPT0gc3RhdGUuZW5jb2RpbmcpIHtcbiAgICAgIGNodW5rID0gbmV3IEJ1ZmZlcihjaHVuaywgZW5jb2RpbmcpO1xuICAgICAgZW5jb2RpbmcgPSAnJztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVhZGFibGVBZGRDaHVuayh0aGlzLCBzdGF0ZSwgY2h1bmssIGVuY29kaW5nLCBmYWxzZSk7XG59O1xuXG4vLyBVbnNoaWZ0IHNob3VsZCAqYWx3YXlzKiBiZSBzb21ldGhpbmcgZGlyZWN0bHkgb3V0IG9mIHJlYWQoKVxuUmVhZGFibGUucHJvdG90eXBlLnVuc2hpZnQgPSBmdW5jdGlvbihjaHVuaykge1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICByZXR1cm4gcmVhZGFibGVBZGRDaHVuayh0aGlzLCBzdGF0ZSwgY2h1bmssICcnLCB0cnVlKTtcbn07XG5cbmZ1bmN0aW9uIHJlYWRhYmxlQWRkQ2h1bmsoc3RyZWFtLCBzdGF0ZSwgY2h1bmssIGVuY29kaW5nLCBhZGRUb0Zyb250KSB7XG4gIHZhciBlciA9IGNodW5rSW52YWxpZChzdGF0ZSwgY2h1bmspO1xuICBpZiAoZXIpIHtcbiAgICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcik7XG4gIH0gZWxzZSBpZiAoY2h1bmsgPT09IG51bGwgfHwgY2h1bmsgPT09IHVuZGVmaW5lZCkge1xuICAgIHN0YXRlLnJlYWRpbmcgPSBmYWxzZTtcbiAgICBpZiAoIXN0YXRlLmVuZGVkKVxuICAgICAgb25Fb2ZDaHVuayhzdHJlYW0sIHN0YXRlKTtcbiAgfSBlbHNlIGlmIChzdGF0ZS5vYmplY3RNb2RlIHx8IGNodW5rICYmIGNodW5rLmxlbmd0aCA+IDApIHtcbiAgICBpZiAoc3RhdGUuZW5kZWQgJiYgIWFkZFRvRnJvbnQpIHtcbiAgICAgIHZhciBlID0gbmV3IEVycm9yKCdzdHJlYW0ucHVzaCgpIGFmdGVyIEVPRicpO1xuICAgICAgc3RyZWFtLmVtaXQoJ2Vycm9yJywgZSk7XG4gICAgfSBlbHNlIGlmIChzdGF0ZS5lbmRFbWl0dGVkICYmIGFkZFRvRnJvbnQpIHtcbiAgICAgIHZhciBlID0gbmV3IEVycm9yKCdzdHJlYW0udW5zaGlmdCgpIGFmdGVyIGVuZCBldmVudCcpO1xuICAgICAgc3RyZWFtLmVtaXQoJ2Vycm9yJywgZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChzdGF0ZS5kZWNvZGVyICYmICFhZGRUb0Zyb250ICYmICFlbmNvZGluZylcbiAgICAgICAgY2h1bmsgPSBzdGF0ZS5kZWNvZGVyLndyaXRlKGNodW5rKTtcblxuICAgICAgLy8gdXBkYXRlIHRoZSBidWZmZXIgaW5mby5cbiAgICAgIHN0YXRlLmxlbmd0aCArPSBzdGF0ZS5vYmplY3RNb2RlID8gMSA6IGNodW5rLmxlbmd0aDtcbiAgICAgIGlmIChhZGRUb0Zyb250KSB7XG4gICAgICAgIHN0YXRlLmJ1ZmZlci51bnNoaWZ0KGNodW5rKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0YXRlLnJlYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgc3RhdGUuYnVmZmVyLnB1c2goY2h1bmspO1xuICAgICAgfVxuXG4gICAgICBpZiAoc3RhdGUubmVlZFJlYWRhYmxlKVxuICAgICAgICBlbWl0UmVhZGFibGUoc3RyZWFtKTtcblxuICAgICAgbWF5YmVSZWFkTW9yZShzdHJlYW0sIHN0YXRlKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoIWFkZFRvRnJvbnQpIHtcbiAgICBzdGF0ZS5yZWFkaW5nID0gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gbmVlZE1vcmVEYXRhKHN0YXRlKTtcbn1cblxuXG5cbi8vIGlmIGl0J3MgcGFzdCB0aGUgaGlnaCB3YXRlciBtYXJrLCB3ZSBjYW4gcHVzaCBpbiBzb21lIG1vcmUuXG4vLyBBbHNvLCBpZiB3ZSBoYXZlIG5vIGRhdGEgeWV0LCB3ZSBjYW4gc3RhbmQgc29tZVxuLy8gbW9yZSBieXRlcy4gIFRoaXMgaXMgdG8gd29yayBhcm91bmQgY2FzZXMgd2hlcmUgaHdtPTAsXG4vLyBzdWNoIGFzIHRoZSByZXBsLiAgQWxzbywgaWYgdGhlIHB1c2goKSB0cmlnZ2VyZWQgYVxuLy8gcmVhZGFibGUgZXZlbnQsIGFuZCB0aGUgdXNlciBjYWxsZWQgcmVhZChsYXJnZU51bWJlcikgc3VjaCB0aGF0XG4vLyBuZWVkUmVhZGFibGUgd2FzIHNldCwgdGhlbiB3ZSBvdWdodCB0byBwdXNoIG1vcmUsIHNvIHRoYXQgYW5vdGhlclxuLy8gJ3JlYWRhYmxlJyBldmVudCB3aWxsIGJlIHRyaWdnZXJlZC5cbmZ1bmN0aW9uIG5lZWRNb3JlRGF0YShzdGF0ZSkge1xuICByZXR1cm4gIXN0YXRlLmVuZGVkICYmXG4gICAgICAgICAoc3RhdGUubmVlZFJlYWRhYmxlIHx8XG4gICAgICAgICAgc3RhdGUubGVuZ3RoIDwgc3RhdGUuaGlnaFdhdGVyTWFyayB8fFxuICAgICAgICAgIHN0YXRlLmxlbmd0aCA9PT0gMCk7XG59XG5cbi8vIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LlxuUmVhZGFibGUucHJvdG90eXBlLnNldEVuY29kaW5nID0gZnVuY3Rpb24oZW5jKSB7XG4gIGlmICghU3RyaW5nRGVjb2RlcilcbiAgICBTdHJpbmdEZWNvZGVyID0gcmVxdWlyZSgnc3RyaW5nX2RlY29kZXIvJykuU3RyaW5nRGVjb2RlcjtcbiAgdGhpcy5fcmVhZGFibGVTdGF0ZS5kZWNvZGVyID0gbmV3IFN0cmluZ0RlY29kZXIoZW5jKTtcbiAgdGhpcy5fcmVhZGFibGVTdGF0ZS5lbmNvZGluZyA9IGVuYztcbn07XG5cbi8vIERvbid0IHJhaXNlIHRoZSBod20gPiAxMjhNQlxudmFyIE1BWF9IV00gPSAweDgwMDAwMDtcbmZ1bmN0aW9uIHJvdW5kVXBUb05leHRQb3dlck9mMihuKSB7XG4gIGlmIChuID49IE1BWF9IV00pIHtcbiAgICBuID0gTUFYX0hXTTtcbiAgfSBlbHNlIHtcbiAgICAvLyBHZXQgdGhlIG5leHQgaGlnaGVzdCBwb3dlciBvZiAyXG4gICAgbi0tO1xuICAgIGZvciAodmFyIHAgPSAxOyBwIDwgMzI7IHAgPDw9IDEpIG4gfD0gbiA+PiBwO1xuICAgIG4rKztcbiAgfVxuICByZXR1cm4gbjtcbn1cblxuZnVuY3Rpb24gaG93TXVjaFRvUmVhZChuLCBzdGF0ZSkge1xuICBpZiAoc3RhdGUubGVuZ3RoID09PSAwICYmIHN0YXRlLmVuZGVkKVxuICAgIHJldHVybiAwO1xuXG4gIGlmIChzdGF0ZS5vYmplY3RNb2RlKVxuICAgIHJldHVybiBuID09PSAwID8gMCA6IDE7XG5cbiAgaWYgKG4gPT09IG51bGwgfHwgaXNOYU4obikpIHtcbiAgICAvLyBvbmx5IGZsb3cgb25lIGJ1ZmZlciBhdCBhIHRpbWVcbiAgICBpZiAoc3RhdGUuZmxvd2luZyAmJiBzdGF0ZS5idWZmZXIubGVuZ3RoKVxuICAgICAgcmV0dXJuIHN0YXRlLmJ1ZmZlclswXS5sZW5ndGg7XG4gICAgZWxzZVxuICAgICAgcmV0dXJuIHN0YXRlLmxlbmd0aDtcbiAgfVxuXG4gIGlmIChuIDw9IDApXG4gICAgcmV0dXJuIDA7XG5cbiAgLy8gSWYgd2UncmUgYXNraW5nIGZvciBtb3JlIHRoYW4gdGhlIHRhcmdldCBidWZmZXIgbGV2ZWwsXG4gIC8vIHRoZW4gcmFpc2UgdGhlIHdhdGVyIG1hcmsuICBCdW1wIHVwIHRvIHRoZSBuZXh0IGhpZ2hlc3RcbiAgLy8gcG93ZXIgb2YgMiwgdG8gcHJldmVudCBpbmNyZWFzaW5nIGl0IGV4Y2Vzc2l2ZWx5IGluIHRpbnlcbiAgLy8gYW1vdW50cy5cbiAgaWYgKG4gPiBzdGF0ZS5oaWdoV2F0ZXJNYXJrKVxuICAgIHN0YXRlLmhpZ2hXYXRlck1hcmsgPSByb3VuZFVwVG9OZXh0UG93ZXJPZjIobik7XG5cbiAgLy8gZG9uJ3QgaGF2ZSB0aGF0IG11Y2guICByZXR1cm4gbnVsbCwgdW5sZXNzIHdlJ3ZlIGVuZGVkLlxuICBpZiAobiA+IHN0YXRlLmxlbmd0aCkge1xuICAgIGlmICghc3RhdGUuZW5kZWQpIHtcbiAgICAgIHN0YXRlLm5lZWRSZWFkYWJsZSA9IHRydWU7XG4gICAgICByZXR1cm4gMDtcbiAgICB9IGVsc2VcbiAgICAgIHJldHVybiBzdGF0ZS5sZW5ndGg7XG4gIH1cblxuICByZXR1cm4gbjtcbn1cblxuLy8geW91IGNhbiBvdmVycmlkZSBlaXRoZXIgdGhpcyBtZXRob2QsIG9yIHRoZSBhc3luYyBfcmVhZChuKSBiZWxvdy5cblJlYWRhYmxlLnByb3RvdHlwZS5yZWFkID0gZnVuY3Rpb24obikge1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICBzdGF0ZS5jYWxsZWRSZWFkID0gdHJ1ZTtcbiAgdmFyIG5PcmlnID0gbjtcbiAgdmFyIHJldDtcblxuICBpZiAodHlwZW9mIG4gIT09ICdudW1iZXInIHx8IG4gPiAwKVxuICAgIHN0YXRlLmVtaXR0ZWRSZWFkYWJsZSA9IGZhbHNlO1xuXG4gIC8vIGlmIHdlJ3JlIGRvaW5nIHJlYWQoMCkgdG8gdHJpZ2dlciBhIHJlYWRhYmxlIGV2ZW50LCBidXQgd2VcbiAgLy8gYWxyZWFkeSBoYXZlIGEgYnVuY2ggb2YgZGF0YSBpbiB0aGUgYnVmZmVyLCB0aGVuIGp1c3QgdHJpZ2dlclxuICAvLyB0aGUgJ3JlYWRhYmxlJyBldmVudCBhbmQgbW92ZSBvbi5cbiAgaWYgKG4gPT09IDAgJiZcbiAgICAgIHN0YXRlLm5lZWRSZWFkYWJsZSAmJlxuICAgICAgKHN0YXRlLmxlbmd0aCA+PSBzdGF0ZS5oaWdoV2F0ZXJNYXJrIHx8IHN0YXRlLmVuZGVkKSkge1xuICAgIGVtaXRSZWFkYWJsZSh0aGlzKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIG4gPSBob3dNdWNoVG9SZWFkKG4sIHN0YXRlKTtcblxuICAvLyBpZiB3ZSd2ZSBlbmRlZCwgYW5kIHdlJ3JlIG5vdyBjbGVhciwgdGhlbiBmaW5pc2ggaXQgdXAuXG4gIGlmIChuID09PSAwICYmIHN0YXRlLmVuZGVkKSB7XG4gICAgcmV0ID0gbnVsbDtcblxuICAgIC8vIEluIGNhc2VzIHdoZXJlIHRoZSBkZWNvZGVyIGRpZCBub3QgcmVjZWl2ZSBlbm91Z2ggZGF0YVxuICAgIC8vIHRvIHByb2R1Y2UgYSBmdWxsIGNodW5rLCB0aGVuIGltbWVkaWF0ZWx5IHJlY2VpdmVkIGFuXG4gICAgLy8gRU9GLCBzdGF0ZS5idWZmZXIgd2lsbCBjb250YWluIFs8QnVmZmVyID4sIDxCdWZmZXIgMDAgLi4uPl0uXG4gICAgLy8gaG93TXVjaFRvUmVhZCB3aWxsIHNlZSB0aGlzIGFuZCBjb2VyY2UgdGhlIGFtb3VudCB0b1xuICAgIC8vIHJlYWQgdG8gemVybyAoYmVjYXVzZSBpdCdzIGxvb2tpbmcgYXQgdGhlIGxlbmd0aCBvZiB0aGVcbiAgICAvLyBmaXJzdCA8QnVmZmVyID4gaW4gc3RhdGUuYnVmZmVyKSwgYW5kIHdlJ2xsIGVuZCB1cCBoZXJlLlxuICAgIC8vXG4gICAgLy8gVGhpcyBjYW4gb25seSBoYXBwZW4gdmlhIHN0YXRlLmRlY29kZXIgLS0gbm8gb3RoZXIgdmVudWVcbiAgICAvLyBleGlzdHMgZm9yIHB1c2hpbmcgYSB6ZXJvLWxlbmd0aCBjaHVuayBpbnRvIHN0YXRlLmJ1ZmZlclxuICAgIC8vIGFuZCB0cmlnZ2VyaW5nIHRoaXMgYmVoYXZpb3IuIEluIHRoaXMgY2FzZSwgd2UgcmV0dXJuIG91clxuICAgIC8vIHJlbWFpbmluZyBkYXRhIGFuZCBlbmQgdGhlIHN0cmVhbSwgaWYgYXBwcm9wcmlhdGUuXG4gICAgaWYgKHN0YXRlLmxlbmd0aCA+IDAgJiYgc3RhdGUuZGVjb2Rlcikge1xuICAgICAgcmV0ID0gZnJvbUxpc3Qobiwgc3RhdGUpO1xuICAgICAgc3RhdGUubGVuZ3RoIC09IHJldC5sZW5ndGg7XG4gICAgfVxuXG4gICAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMClcbiAgICAgIGVuZFJlYWRhYmxlKHRoaXMpO1xuXG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIC8vIEFsbCB0aGUgYWN0dWFsIGNodW5rIGdlbmVyYXRpb24gbG9naWMgbmVlZHMgdG8gYmVcbiAgLy8gKmJlbG93KiB0aGUgY2FsbCB0byBfcmVhZC4gIFRoZSByZWFzb24gaXMgdGhhdCBpbiBjZXJ0YWluXG4gIC8vIHN5bnRoZXRpYyBzdHJlYW0gY2FzZXMsIHN1Y2ggYXMgcGFzc3Rocm91Z2ggc3RyZWFtcywgX3JlYWRcbiAgLy8gbWF5IGJlIGEgY29tcGxldGVseSBzeW5jaHJvbm91cyBvcGVyYXRpb24gd2hpY2ggbWF5IGNoYW5nZVxuICAvLyB0aGUgc3RhdGUgb2YgdGhlIHJlYWQgYnVmZmVyLCBwcm92aWRpbmcgZW5vdWdoIGRhdGEgd2hlblxuICAvLyBiZWZvcmUgdGhlcmUgd2FzICpub3QqIGVub3VnaC5cbiAgLy9cbiAgLy8gU28sIHRoZSBzdGVwcyBhcmU6XG4gIC8vIDEuIEZpZ3VyZSBvdXQgd2hhdCB0aGUgc3RhdGUgb2YgdGhpbmdzIHdpbGwgYmUgYWZ0ZXIgd2UgZG9cbiAgLy8gYSByZWFkIGZyb20gdGhlIGJ1ZmZlci5cbiAgLy9cbiAgLy8gMi4gSWYgdGhhdCByZXN1bHRpbmcgc3RhdGUgd2lsbCB0cmlnZ2VyIGEgX3JlYWQsIHRoZW4gY2FsbCBfcmVhZC5cbiAgLy8gTm90ZSB0aGF0IHRoaXMgbWF5IGJlIGFzeW5jaHJvbm91cywgb3Igc3luY2hyb25vdXMuICBZZXMsIGl0IGlzXG4gIC8vIGRlZXBseSB1Z2x5IHRvIHdyaXRlIEFQSXMgdGhpcyB3YXksIGJ1dCB0aGF0IHN0aWxsIGRvZXNuJ3QgbWVhblxuICAvLyB0aGF0IHRoZSBSZWFkYWJsZSBjbGFzcyBzaG91bGQgYmVoYXZlIGltcHJvcGVybHksIGFzIHN0cmVhbXMgYXJlXG4gIC8vIGRlc2lnbmVkIHRvIGJlIHN5bmMvYXN5bmMgYWdub3N0aWMuXG4gIC8vIFRha2Ugbm90ZSBpZiB0aGUgX3JlYWQgY2FsbCBpcyBzeW5jIG9yIGFzeW5jIChpZSwgaWYgdGhlIHJlYWQgY2FsbFxuICAvLyBoYXMgcmV0dXJuZWQgeWV0KSwgc28gdGhhdCB3ZSBrbm93IHdoZXRoZXIgb3Igbm90IGl0J3Mgc2FmZSB0byBlbWl0XG4gIC8vICdyZWFkYWJsZScgZXRjLlxuICAvL1xuICAvLyAzLiBBY3R1YWxseSBwdWxsIHRoZSByZXF1ZXN0ZWQgY2h1bmtzIG91dCBvZiB0aGUgYnVmZmVyIGFuZCByZXR1cm4uXG5cbiAgLy8gaWYgd2UgbmVlZCBhIHJlYWRhYmxlIGV2ZW50LCB0aGVuIHdlIG5lZWQgdG8gZG8gc29tZSByZWFkaW5nLlxuICB2YXIgZG9SZWFkID0gc3RhdGUubmVlZFJlYWRhYmxlO1xuXG4gIC8vIGlmIHdlIGN1cnJlbnRseSBoYXZlIGxlc3MgdGhhbiB0aGUgaGlnaFdhdGVyTWFyaywgdGhlbiBhbHNvIHJlYWQgc29tZVxuICBpZiAoc3RhdGUubGVuZ3RoIC0gbiA8PSBzdGF0ZS5oaWdoV2F0ZXJNYXJrKVxuICAgIGRvUmVhZCA9IHRydWU7XG5cbiAgLy8gaG93ZXZlciwgaWYgd2UndmUgZW5kZWQsIHRoZW4gdGhlcmUncyBubyBwb2ludCwgYW5kIGlmIHdlJ3JlIGFscmVhZHlcbiAgLy8gcmVhZGluZywgdGhlbiBpdCdzIHVubmVjZXNzYXJ5LlxuICBpZiAoc3RhdGUuZW5kZWQgfHwgc3RhdGUucmVhZGluZylcbiAgICBkb1JlYWQgPSBmYWxzZTtcblxuICBpZiAoZG9SZWFkKSB7XG4gICAgc3RhdGUucmVhZGluZyA9IHRydWU7XG4gICAgc3RhdGUuc3luYyA9IHRydWU7XG4gICAgLy8gaWYgdGhlIGxlbmd0aCBpcyBjdXJyZW50bHkgemVybywgdGhlbiB3ZSAqbmVlZCogYSByZWFkYWJsZSBldmVudC5cbiAgICBpZiAoc3RhdGUubGVuZ3RoID09PSAwKVxuICAgICAgc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICAvLyBjYWxsIGludGVybmFsIHJlYWQgbWV0aG9kXG4gICAgdGhpcy5fcmVhZChzdGF0ZS5oaWdoV2F0ZXJNYXJrKTtcbiAgICBzdGF0ZS5zeW5jID0gZmFsc2U7XG4gIH1cblxuICAvLyBJZiBfcmVhZCBjYWxsZWQgaXRzIGNhbGxiYWNrIHN5bmNocm9ub3VzbHksIHRoZW4gYHJlYWRpbmdgXG4gIC8vIHdpbGwgYmUgZmFsc2UsIGFuZCB3ZSBuZWVkIHRvIHJlLWV2YWx1YXRlIGhvdyBtdWNoIGRhdGEgd2VcbiAgLy8gY2FuIHJldHVybiB0byB0aGUgdXNlci5cbiAgaWYgKGRvUmVhZCAmJiAhc3RhdGUucmVhZGluZylcbiAgICBuID0gaG93TXVjaFRvUmVhZChuT3JpZywgc3RhdGUpO1xuXG4gIGlmIChuID4gMClcbiAgICByZXQgPSBmcm9tTGlzdChuLCBzdGF0ZSk7XG4gIGVsc2VcbiAgICByZXQgPSBudWxsO1xuXG4gIGlmIChyZXQgPT09IG51bGwpIHtcbiAgICBzdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlO1xuICAgIG4gPSAwO1xuICB9XG5cbiAgc3RhdGUubGVuZ3RoIC09IG47XG5cbiAgLy8gSWYgd2UgaGF2ZSBub3RoaW5nIGluIHRoZSBidWZmZXIsIHRoZW4gd2Ugd2FudCB0byBrbm93XG4gIC8vIGFzIHNvb24gYXMgd2UgKmRvKiBnZXQgc29tZXRoaW5nIGludG8gdGhlIGJ1ZmZlci5cbiAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCAmJiAhc3RhdGUuZW5kZWQpXG4gICAgc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcblxuICAvLyBJZiB3ZSBoYXBwZW5lZCB0byByZWFkKCkgZXhhY3RseSB0aGUgcmVtYWluaW5nIGFtb3VudCBpbiB0aGVcbiAgLy8gYnVmZmVyLCBhbmQgdGhlIEVPRiBoYXMgYmVlbiBzZWVuIGF0IHRoaXMgcG9pbnQsIHRoZW4gbWFrZSBzdXJlXG4gIC8vIHRoYXQgd2UgZW1pdCAnZW5kJyBvbiB0aGUgdmVyeSBuZXh0IHRpY2suXG4gIGlmIChzdGF0ZS5lbmRlZCAmJiAhc3RhdGUuZW5kRW1pdHRlZCAmJiBzdGF0ZS5sZW5ndGggPT09IDApXG4gICAgZW5kUmVhZGFibGUodGhpcyk7XG5cbiAgcmV0dXJuIHJldDtcbn07XG5cbmZ1bmN0aW9uIGNodW5rSW52YWxpZChzdGF0ZSwgY2h1bmspIHtcbiAgdmFyIGVyID0gbnVsbDtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoY2h1bmspICYmXG4gICAgICAnc3RyaW5nJyAhPT0gdHlwZW9mIGNodW5rICYmXG4gICAgICBjaHVuayAhPT0gbnVsbCAmJlxuICAgICAgY2h1bmsgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgIXN0YXRlLm9iamVjdE1vZGUpIHtcbiAgICBlciA9IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgbm9uLXN0cmluZy9idWZmZXIgY2h1bmsnKTtcbiAgfVxuICByZXR1cm4gZXI7XG59XG5cblxuZnVuY3Rpb24gb25Fb2ZDaHVuayhzdHJlYW0sIHN0YXRlKSB7XG4gIGlmIChzdGF0ZS5kZWNvZGVyICYmICFzdGF0ZS5lbmRlZCkge1xuICAgIHZhciBjaHVuayA9IHN0YXRlLmRlY29kZXIuZW5kKCk7XG4gICAgaWYgKGNodW5rICYmIGNodW5rLmxlbmd0aCkge1xuICAgICAgc3RhdGUuYnVmZmVyLnB1c2goY2h1bmspO1xuICAgICAgc3RhdGUubGVuZ3RoICs9IHN0YXRlLm9iamVjdE1vZGUgPyAxIDogY2h1bmsubGVuZ3RoO1xuICAgIH1cbiAgfVxuICBzdGF0ZS5lbmRlZCA9IHRydWU7XG5cbiAgLy8gaWYgd2UndmUgZW5kZWQgYW5kIHdlIGhhdmUgc29tZSBkYXRhIGxlZnQsIHRoZW4gZW1pdFxuICAvLyAncmVhZGFibGUnIG5vdyB0byBtYWtlIHN1cmUgaXQgZ2V0cyBwaWNrZWQgdXAuXG4gIGlmIChzdGF0ZS5sZW5ndGggPiAwKVxuICAgIGVtaXRSZWFkYWJsZShzdHJlYW0pO1xuICBlbHNlXG4gICAgZW5kUmVhZGFibGUoc3RyZWFtKTtcbn1cblxuLy8gRG9uJ3QgZW1pdCByZWFkYWJsZSByaWdodCBhd2F5IGluIHN5bmMgbW9kZSwgYmVjYXVzZSB0aGlzIGNhbiB0cmlnZ2VyXG4vLyBhbm90aGVyIHJlYWQoKSBjYWxsID0+IHN0YWNrIG92ZXJmbG93LiAgVGhpcyB3YXksIGl0IG1pZ2h0IHRyaWdnZXJcbi8vIGEgbmV4dFRpY2sgcmVjdXJzaW9uIHdhcm5pbmcsIGJ1dCB0aGF0J3Mgbm90IHNvIGJhZC5cbmZ1bmN0aW9uIGVtaXRSZWFkYWJsZShzdHJlYW0pIHtcbiAgdmFyIHN0YXRlID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlO1xuICBzdGF0ZS5uZWVkUmVhZGFibGUgPSBmYWxzZTtcbiAgaWYgKHN0YXRlLmVtaXR0ZWRSZWFkYWJsZSlcbiAgICByZXR1cm47XG5cbiAgc3RhdGUuZW1pdHRlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgaWYgKHN0YXRlLnN5bmMpXG4gICAgcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbigpIHtcbiAgICAgIGVtaXRSZWFkYWJsZV8oc3RyZWFtKTtcbiAgICB9KTtcbiAgZWxzZVxuICAgIGVtaXRSZWFkYWJsZV8oc3RyZWFtKTtcbn1cblxuZnVuY3Rpb24gZW1pdFJlYWRhYmxlXyhzdHJlYW0pIHtcbiAgc3RyZWFtLmVtaXQoJ3JlYWRhYmxlJyk7XG59XG5cblxuLy8gYXQgdGhpcyBwb2ludCwgdGhlIHVzZXIgaGFzIHByZXN1bWFibHkgc2VlbiB0aGUgJ3JlYWRhYmxlJyBldmVudCxcbi8vIGFuZCBjYWxsZWQgcmVhZCgpIHRvIGNvbnN1bWUgc29tZSBkYXRhLiAgdGhhdCBtYXkgaGF2ZSB0cmlnZ2VyZWRcbi8vIGluIHR1cm4gYW5vdGhlciBfcmVhZChuKSBjYWxsLCBpbiB3aGljaCBjYXNlIHJlYWRpbmcgPSB0cnVlIGlmXG4vLyBpdCdzIGluIHByb2dyZXNzLlxuLy8gSG93ZXZlciwgaWYgd2UncmUgbm90IGVuZGVkLCBvciByZWFkaW5nLCBhbmQgdGhlIGxlbmd0aCA8IGh3bSxcbi8vIHRoZW4gZ28gYWhlYWQgYW5kIHRyeSB0byByZWFkIHNvbWUgbW9yZSBwcmVlbXB0aXZlbHkuXG5mdW5jdGlvbiBtYXliZVJlYWRNb3JlKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKCFzdGF0ZS5yZWFkaW5nTW9yZSkge1xuICAgIHN0YXRlLnJlYWRpbmdNb3JlID0gdHJ1ZTtcbiAgICBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uKCkge1xuICAgICAgbWF5YmVSZWFkTW9yZV8oc3RyZWFtLCBzdGF0ZSk7XG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbWF5YmVSZWFkTW9yZV8oc3RyZWFtLCBzdGF0ZSkge1xuICB2YXIgbGVuID0gc3RhdGUubGVuZ3RoO1xuICB3aGlsZSAoIXN0YXRlLnJlYWRpbmcgJiYgIXN0YXRlLmZsb3dpbmcgJiYgIXN0YXRlLmVuZGVkICYmXG4gICAgICAgICBzdGF0ZS5sZW5ndGggPCBzdGF0ZS5oaWdoV2F0ZXJNYXJrKSB7XG4gICAgc3RyZWFtLnJlYWQoMCk7XG4gICAgaWYgKGxlbiA9PT0gc3RhdGUubGVuZ3RoKVxuICAgICAgLy8gZGlkbid0IGdldCBhbnkgZGF0YSwgc3RvcCBzcGlubmluZy5cbiAgICAgIGJyZWFrO1xuICAgIGVsc2VcbiAgICAgIGxlbiA9IHN0YXRlLmxlbmd0aDtcbiAgfVxuICBzdGF0ZS5yZWFkaW5nTW9yZSA9IGZhbHNlO1xufVxuXG4vLyBhYnN0cmFjdCBtZXRob2QuICB0byBiZSBvdmVycmlkZGVuIGluIHNwZWNpZmljIGltcGxlbWVudGF0aW9uIGNsYXNzZXMuXG4vLyBjYWxsIGNiKGVyLCBkYXRhKSB3aGVyZSBkYXRhIGlzIDw9IG4gaW4gbGVuZ3RoLlxuLy8gZm9yIHZpcnR1YWwgKG5vbi1zdHJpbmcsIG5vbi1idWZmZXIpIHN0cmVhbXMsIFwibGVuZ3RoXCIgaXMgc29tZXdoYXRcbi8vIGFyYml0cmFyeSwgYW5kIHBlcmhhcHMgbm90IHZlcnkgbWVhbmluZ2Z1bC5cblJlYWRhYmxlLnByb3RvdHlwZS5fcmVhZCA9IGZ1bmN0aW9uKG4pIHtcbiAgdGhpcy5lbWl0KCdlcnJvcicsIG5ldyBFcnJvcignbm90IGltcGxlbWVudGVkJykpO1xufTtcblxuUmVhZGFibGUucHJvdG90eXBlLnBpcGUgPSBmdW5jdGlvbihkZXN0LCBwaXBlT3B0cykge1xuICB2YXIgc3JjID0gdGhpcztcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcblxuICBzd2l0Y2ggKHN0YXRlLnBpcGVzQ291bnQpIHtcbiAgICBjYXNlIDA6XG4gICAgICBzdGF0ZS5waXBlcyA9IGRlc3Q7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDE6XG4gICAgICBzdGF0ZS5waXBlcyA9IFtzdGF0ZS5waXBlcywgZGVzdF07XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgc3RhdGUucGlwZXMucHVzaChkZXN0KTtcbiAgICAgIGJyZWFrO1xuICB9XG4gIHN0YXRlLnBpcGVzQ291bnQgKz0gMTtcblxuICB2YXIgZG9FbmQgPSAoIXBpcGVPcHRzIHx8IHBpcGVPcHRzLmVuZCAhPT0gZmFsc2UpICYmXG4gICAgICAgICAgICAgIGRlc3QgIT09IHByb2Nlc3Muc3Rkb3V0ICYmXG4gICAgICAgICAgICAgIGRlc3QgIT09IHByb2Nlc3Muc3RkZXJyO1xuXG4gIHZhciBlbmRGbiA9IGRvRW5kID8gb25lbmQgOiBjbGVhbnVwO1xuICBpZiAoc3RhdGUuZW5kRW1pdHRlZClcbiAgICBwcm9jZXNzLm5leHRUaWNrKGVuZEZuKTtcbiAgZWxzZVxuICAgIHNyYy5vbmNlKCdlbmQnLCBlbmRGbik7XG5cbiAgZGVzdC5vbigndW5waXBlJywgb251bnBpcGUpO1xuICBmdW5jdGlvbiBvbnVucGlwZShyZWFkYWJsZSkge1xuICAgIGlmIChyZWFkYWJsZSAhPT0gc3JjKSByZXR1cm47XG4gICAgY2xlYW51cCgpO1xuICB9XG5cbiAgZnVuY3Rpb24gb25lbmQoKSB7XG4gICAgZGVzdC5lbmQoKTtcbiAgfVxuXG4gIC8vIHdoZW4gdGhlIGRlc3QgZHJhaW5zLCBpdCByZWR1Y2VzIHRoZSBhd2FpdERyYWluIGNvdW50ZXJcbiAgLy8gb24gdGhlIHNvdXJjZS4gIFRoaXMgd291bGQgYmUgbW9yZSBlbGVnYW50IHdpdGggYSAub25jZSgpXG4gIC8vIGhhbmRsZXIgaW4gZmxvdygpLCBidXQgYWRkaW5nIGFuZCByZW1vdmluZyByZXBlYXRlZGx5IGlzXG4gIC8vIHRvbyBzbG93LlxuICB2YXIgb25kcmFpbiA9IHBpcGVPbkRyYWluKHNyYyk7XG4gIGRlc3Qub24oJ2RyYWluJywgb25kcmFpbik7XG5cbiAgZnVuY3Rpb24gY2xlYW51cCgpIHtcbiAgICAvLyBjbGVhbnVwIGV2ZW50IGhhbmRsZXJzIG9uY2UgdGhlIHBpcGUgaXMgYnJva2VuXG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLCBvbmNsb3NlKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdmaW5pc2gnLCBvbmZpbmlzaCk7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZHJhaW4nLCBvbmRyYWluKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdlcnJvcicsIG9uZXJyb3IpO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ3VucGlwZScsIG9udW5waXBlKTtcbiAgICBzcmMucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIG9uZW5kKTtcbiAgICBzcmMucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIGNsZWFudXApO1xuXG4gICAgLy8gaWYgdGhlIHJlYWRlciBpcyB3YWl0aW5nIGZvciBhIGRyYWluIGV2ZW50IGZyb20gdGhpc1xuICAgIC8vIHNwZWNpZmljIHdyaXRlciwgdGhlbiBpdCB3b3VsZCBjYXVzZSBpdCB0byBuZXZlciBzdGFydFxuICAgIC8vIGZsb3dpbmcgYWdhaW4uXG4gICAgLy8gU28sIGlmIHRoaXMgaXMgYXdhaXRpbmcgYSBkcmFpbiwgdGhlbiB3ZSBqdXN0IGNhbGwgaXQgbm93LlxuICAgIC8vIElmIHdlIGRvbid0IGtub3csIHRoZW4gYXNzdW1lIHRoYXQgd2UgYXJlIHdhaXRpbmcgZm9yIG9uZS5cbiAgICBpZiAoIWRlc3QuX3dyaXRhYmxlU3RhdGUgfHwgZGVzdC5fd3JpdGFibGVTdGF0ZS5uZWVkRHJhaW4pXG4gICAgICBvbmRyYWluKCk7XG4gIH1cblxuICAvLyBpZiB0aGUgZGVzdCBoYXMgYW4gZXJyb3IsIHRoZW4gc3RvcCBwaXBpbmcgaW50byBpdC5cbiAgLy8gaG93ZXZlciwgZG9uJ3Qgc3VwcHJlc3MgdGhlIHRocm93aW5nIGJlaGF2aW9yIGZvciB0aGlzLlxuICBmdW5jdGlvbiBvbmVycm9yKGVyKSB7XG4gICAgdW5waXBlKCk7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBvbmVycm9yKTtcbiAgICBpZiAoRUUubGlzdGVuZXJDb3VudChkZXN0LCAnZXJyb3InKSA9PT0gMClcbiAgICAgIGRlc3QuZW1pdCgnZXJyb3InLCBlcik7XG4gIH1cbiAgLy8gVGhpcyBpcyBhIGJydXRhbGx5IHVnbHkgaGFjayB0byBtYWtlIHN1cmUgdGhhdCBvdXIgZXJyb3IgaGFuZGxlclxuICAvLyBpcyBhdHRhY2hlZCBiZWZvcmUgYW55IHVzZXJsYW5kIG9uZXMuICBORVZFUiBETyBUSElTLlxuICBpZiAoIWRlc3QuX2V2ZW50cyB8fCAhZGVzdC5fZXZlbnRzLmVycm9yKVxuICAgIGRlc3Qub24oJ2Vycm9yJywgb25lcnJvcik7XG4gIGVsc2UgaWYgKGlzQXJyYXkoZGVzdC5fZXZlbnRzLmVycm9yKSlcbiAgICBkZXN0Ll9ldmVudHMuZXJyb3IudW5zaGlmdChvbmVycm9yKTtcbiAgZWxzZVxuICAgIGRlc3QuX2V2ZW50cy5lcnJvciA9IFtvbmVycm9yLCBkZXN0Ll9ldmVudHMuZXJyb3JdO1xuXG5cblxuICAvLyBCb3RoIGNsb3NlIGFuZCBmaW5pc2ggc2hvdWxkIHRyaWdnZXIgdW5waXBlLCBidXQgb25seSBvbmNlLlxuICBmdW5jdGlvbiBvbmNsb3NlKCkge1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2ZpbmlzaCcsIG9uZmluaXNoKTtcbiAgICB1bnBpcGUoKTtcbiAgfVxuICBkZXN0Lm9uY2UoJ2Nsb3NlJywgb25jbG9zZSk7XG4gIGZ1bmN0aW9uIG9uZmluaXNoKCkge1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2Nsb3NlJywgb25jbG9zZSk7XG4gICAgdW5waXBlKCk7XG4gIH1cbiAgZGVzdC5vbmNlKCdmaW5pc2gnLCBvbmZpbmlzaCk7XG5cbiAgZnVuY3Rpb24gdW5waXBlKCkge1xuICAgIHNyYy51bnBpcGUoZGVzdCk7XG4gIH1cblxuICAvLyB0ZWxsIHRoZSBkZXN0IHRoYXQgaXQncyBiZWluZyBwaXBlZCB0b1xuICBkZXN0LmVtaXQoJ3BpcGUnLCBzcmMpO1xuXG4gIC8vIHN0YXJ0IHRoZSBmbG93IGlmIGl0IGhhc24ndCBiZWVuIHN0YXJ0ZWQgYWxyZWFkeS5cbiAgaWYgKCFzdGF0ZS5mbG93aW5nKSB7XG4gICAgLy8gdGhlIGhhbmRsZXIgdGhhdCB3YWl0cyBmb3IgcmVhZGFibGUgZXZlbnRzIGFmdGVyIGFsbFxuICAgIC8vIHRoZSBkYXRhIGdldHMgc3Vja2VkIG91dCBpbiBmbG93LlxuICAgIC8vIFRoaXMgd291bGQgYmUgZWFzaWVyIHRvIGZvbGxvdyB3aXRoIGEgLm9uY2UoKSBoYW5kbGVyXG4gICAgLy8gaW4gZmxvdygpLCBidXQgdGhhdCBpcyB0b28gc2xvdy5cbiAgICB0aGlzLm9uKCdyZWFkYWJsZScsIHBpcGVPblJlYWRhYmxlKTtcblxuICAgIHN0YXRlLmZsb3dpbmcgPSB0cnVlO1xuICAgIHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24oKSB7XG4gICAgICBmbG93KHNyYyk7XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gZGVzdDtcbn07XG5cbmZ1bmN0aW9uIHBpcGVPbkRyYWluKHNyYykge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGRlc3QgPSB0aGlzO1xuICAgIHZhciBzdGF0ZSA9IHNyYy5fcmVhZGFibGVTdGF0ZTtcbiAgICBzdGF0ZS5hd2FpdERyYWluLS07XG4gICAgaWYgKHN0YXRlLmF3YWl0RHJhaW4gPT09IDApXG4gICAgICBmbG93KHNyYyk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGZsb3coc3JjKSB7XG4gIHZhciBzdGF0ZSA9IHNyYy5fcmVhZGFibGVTdGF0ZTtcbiAgdmFyIGNodW5rO1xuICBzdGF0ZS5hd2FpdERyYWluID0gMDtcblxuICBmdW5jdGlvbiB3cml0ZShkZXN0LCBpLCBsaXN0KSB7XG4gICAgdmFyIHdyaXR0ZW4gPSBkZXN0LndyaXRlKGNodW5rKTtcbiAgICBpZiAoZmFsc2UgPT09IHdyaXR0ZW4pIHtcbiAgICAgIHN0YXRlLmF3YWl0RHJhaW4rKztcbiAgICB9XG4gIH1cblxuICB3aGlsZSAoc3RhdGUucGlwZXNDb3VudCAmJiBudWxsICE9PSAoY2h1bmsgPSBzcmMucmVhZCgpKSkge1xuXG4gICAgaWYgKHN0YXRlLnBpcGVzQ291bnQgPT09IDEpXG4gICAgICB3cml0ZShzdGF0ZS5waXBlcywgMCwgbnVsbCk7XG4gICAgZWxzZVxuICAgICAgZm9yRWFjaChzdGF0ZS5waXBlcywgd3JpdGUpO1xuXG4gICAgc3JjLmVtaXQoJ2RhdGEnLCBjaHVuayk7XG5cbiAgICAvLyBpZiBhbnlvbmUgbmVlZHMgYSBkcmFpbiwgdGhlbiB3ZSBoYXZlIHRvIHdhaXQgZm9yIHRoYXQuXG4gICAgaWYgKHN0YXRlLmF3YWl0RHJhaW4gPiAwKVxuICAgICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gaWYgZXZlcnkgZGVzdGluYXRpb24gd2FzIHVucGlwZWQsIGVpdGhlciBiZWZvcmUgZW50ZXJpbmcgdGhpc1xuICAvLyBmdW5jdGlvbiwgb3IgaW4gdGhlIHdoaWxlIGxvb3AsIHRoZW4gc3RvcCBmbG93aW5nLlxuICAvL1xuICAvLyBOQjogVGhpcyBpcyBhIHByZXR0eSByYXJlIGVkZ2UgY2FzZS5cbiAgaWYgKHN0YXRlLnBpcGVzQ291bnQgPT09IDApIHtcbiAgICBzdGF0ZS5mbG93aW5nID0gZmFsc2U7XG5cbiAgICAvLyBpZiB0aGVyZSB3ZXJlIGRhdGEgZXZlbnQgbGlzdGVuZXJzIGFkZGVkLCB0aGVuIHN3aXRjaCB0byBvbGQgbW9kZS5cbiAgICBpZiAoRUUubGlzdGVuZXJDb3VudChzcmMsICdkYXRhJykgPiAwKVxuICAgICAgZW1pdERhdGFFdmVudHMoc3JjKTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBhdCB0aGlzIHBvaW50LCBubyBvbmUgbmVlZGVkIGEgZHJhaW4sIHNvIHdlIGp1c3QgcmFuIG91dCBvZiBkYXRhXG4gIC8vIG9uIHRoZSBuZXh0IHJlYWRhYmxlIGV2ZW50LCBzdGFydCBpdCBvdmVyIGFnYWluLlxuICBzdGF0ZS5yYW5PdXQgPSB0cnVlO1xufVxuXG5mdW5jdGlvbiBwaXBlT25SZWFkYWJsZSgpIHtcbiAgaWYgKHRoaXMuX3JlYWRhYmxlU3RhdGUucmFuT3V0KSB7XG4gICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5yYW5PdXQgPSBmYWxzZTtcbiAgICBmbG93KHRoaXMpO1xuICB9XG59XG5cblxuUmVhZGFibGUucHJvdG90eXBlLnVucGlwZSA9IGZ1bmN0aW9uKGRlc3QpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcblxuICAvLyBpZiB3ZSdyZSBub3QgcGlwaW5nIGFueXdoZXJlLCB0aGVuIGRvIG5vdGhpbmcuXG4gIGlmIChzdGF0ZS5waXBlc0NvdW50ID09PSAwKVxuICAgIHJldHVybiB0aGlzO1xuXG4gIC8vIGp1c3Qgb25lIGRlc3RpbmF0aW9uLiAgbW9zdCBjb21tb24gY2FzZS5cbiAgaWYgKHN0YXRlLnBpcGVzQ291bnQgPT09IDEpIHtcbiAgICAvLyBwYXNzZWQgaW4gb25lLCBidXQgaXQncyBub3QgdGhlIHJpZ2h0IG9uZS5cbiAgICBpZiAoZGVzdCAmJiBkZXN0ICE9PSBzdGF0ZS5waXBlcylcbiAgICAgIHJldHVybiB0aGlzO1xuXG4gICAgaWYgKCFkZXN0KVxuICAgICAgZGVzdCA9IHN0YXRlLnBpcGVzO1xuXG4gICAgLy8gZ290IGEgbWF0Y2guXG4gICAgc3RhdGUucGlwZXMgPSBudWxsO1xuICAgIHN0YXRlLnBpcGVzQ291bnQgPSAwO1xuICAgIHRoaXMucmVtb3ZlTGlzdGVuZXIoJ3JlYWRhYmxlJywgcGlwZU9uUmVhZGFibGUpO1xuICAgIHN0YXRlLmZsb3dpbmcgPSBmYWxzZTtcbiAgICBpZiAoZGVzdClcbiAgICAgIGRlc3QuZW1pdCgndW5waXBlJywgdGhpcyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBzbG93IGNhc2UuIG11bHRpcGxlIHBpcGUgZGVzdGluYXRpb25zLlxuXG4gIGlmICghZGVzdCkge1xuICAgIC8vIHJlbW92ZSBhbGwuXG4gICAgdmFyIGRlc3RzID0gc3RhdGUucGlwZXM7XG4gICAgdmFyIGxlbiA9IHN0YXRlLnBpcGVzQ291bnQ7XG4gICAgc3RhdGUucGlwZXMgPSBudWxsO1xuICAgIHN0YXRlLnBpcGVzQ291bnQgPSAwO1xuICAgIHRoaXMucmVtb3ZlTGlzdGVuZXIoJ3JlYWRhYmxlJywgcGlwZU9uUmVhZGFibGUpO1xuICAgIHN0YXRlLmZsb3dpbmcgPSBmYWxzZTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspXG4gICAgICBkZXN0c1tpXS5lbWl0KCd1bnBpcGUnLCB0aGlzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIHRyeSB0byBmaW5kIHRoZSByaWdodCBvbmUuXG4gIHZhciBpID0gaW5kZXhPZihzdGF0ZS5waXBlcywgZGVzdCk7XG4gIGlmIChpID09PSAtMSlcbiAgICByZXR1cm4gdGhpcztcblxuICBzdGF0ZS5waXBlcy5zcGxpY2UoaSwgMSk7XG4gIHN0YXRlLnBpcGVzQ291bnQgLT0gMTtcbiAgaWYgKHN0YXRlLnBpcGVzQ291bnQgPT09IDEpXG4gICAgc3RhdGUucGlwZXMgPSBzdGF0ZS5waXBlc1swXTtcblxuICBkZXN0LmVtaXQoJ3VucGlwZScsIHRoaXMpO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLy8gc2V0IHVwIGRhdGEgZXZlbnRzIGlmIHRoZXkgYXJlIGFza2VkIGZvclxuLy8gRW5zdXJlIHJlYWRhYmxlIGxpc3RlbmVycyBldmVudHVhbGx5IGdldCBzb21ldGhpbmdcblJlYWRhYmxlLnByb3RvdHlwZS5vbiA9IGZ1bmN0aW9uKGV2LCBmbikge1xuICB2YXIgcmVzID0gU3RyZWFtLnByb3RvdHlwZS5vbi5jYWxsKHRoaXMsIGV2LCBmbik7XG5cbiAgaWYgKGV2ID09PSAnZGF0YScgJiYgIXRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZylcbiAgICBlbWl0RGF0YUV2ZW50cyh0aGlzKTtcblxuICBpZiAoZXYgPT09ICdyZWFkYWJsZScgJiYgdGhpcy5yZWFkYWJsZSkge1xuICAgIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gICAgaWYgKCFzdGF0ZS5yZWFkYWJsZUxpc3RlbmluZykge1xuICAgICAgc3RhdGUucmVhZGFibGVMaXN0ZW5pbmcgPSB0cnVlO1xuICAgICAgc3RhdGUuZW1pdHRlZFJlYWRhYmxlID0gZmFsc2U7XG4gICAgICBzdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlO1xuICAgICAgaWYgKCFzdGF0ZS5yZWFkaW5nKSB7XG4gICAgICAgIHRoaXMucmVhZCgwKTtcbiAgICAgIH0gZWxzZSBpZiAoc3RhdGUubGVuZ3RoKSB7XG4gICAgICAgIGVtaXRSZWFkYWJsZSh0aGlzLCBzdGF0ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlcztcbn07XG5SZWFkYWJsZS5wcm90b3R5cGUuYWRkTGlzdGVuZXIgPSBSZWFkYWJsZS5wcm90b3R5cGUub247XG5cbi8vIHBhdXNlKCkgYW5kIHJlc3VtZSgpIGFyZSByZW1uYW50cyBvZiB0aGUgbGVnYWN5IHJlYWRhYmxlIHN0cmVhbSBBUElcbi8vIElmIHRoZSB1c2VyIHVzZXMgdGhlbSwgdGhlbiBzd2l0Y2ggaW50byBvbGQgbW9kZS5cblJlYWRhYmxlLnByb3RvdHlwZS5yZXN1bWUgPSBmdW5jdGlvbigpIHtcbiAgZW1pdERhdGFFdmVudHModGhpcyk7XG4gIHRoaXMucmVhZCgwKTtcbiAgdGhpcy5lbWl0KCdyZXN1bWUnKTtcbn07XG5cblJlYWRhYmxlLnByb3RvdHlwZS5wYXVzZSA9IGZ1bmN0aW9uKCkge1xuICBlbWl0RGF0YUV2ZW50cyh0aGlzLCB0cnVlKTtcbiAgdGhpcy5lbWl0KCdwYXVzZScpO1xufTtcblxuZnVuY3Rpb24gZW1pdERhdGFFdmVudHMoc3RyZWFtLCBzdGFydFBhdXNlZCkge1xuICB2YXIgc3RhdGUgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGU7XG5cbiAgaWYgKHN0YXRlLmZsb3dpbmcpIHtcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vaXNhYWNzL3JlYWRhYmxlLXN0cmVhbS9pc3N1ZXMvMTZcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBzd2l0Y2ggdG8gb2xkIG1vZGUgbm93LicpO1xuICB9XG5cbiAgdmFyIHBhdXNlZCA9IHN0YXJ0UGF1c2VkIHx8IGZhbHNlO1xuICB2YXIgcmVhZGFibGUgPSBmYWxzZTtcblxuICAvLyBjb252ZXJ0IHRvIGFuIG9sZC1zdHlsZSBzdHJlYW0uXG4gIHN0cmVhbS5yZWFkYWJsZSA9IHRydWU7XG4gIHN0cmVhbS5waXBlID0gU3RyZWFtLnByb3RvdHlwZS5waXBlO1xuICBzdHJlYW0ub24gPSBzdHJlYW0uYWRkTGlzdGVuZXIgPSBTdHJlYW0ucHJvdG90eXBlLm9uO1xuXG4gIHN0cmVhbS5vbigncmVhZGFibGUnLCBmdW5jdGlvbigpIHtcbiAgICByZWFkYWJsZSA9IHRydWU7XG5cbiAgICB2YXIgYztcbiAgICB3aGlsZSAoIXBhdXNlZCAmJiAobnVsbCAhPT0gKGMgPSBzdHJlYW0ucmVhZCgpKSkpXG4gICAgICBzdHJlYW0uZW1pdCgnZGF0YScsIGMpO1xuXG4gICAgaWYgKGMgPT09IG51bGwpIHtcbiAgICAgIHJlYWRhYmxlID0gZmFsc2U7XG4gICAgICBzdHJlYW0uX3JlYWRhYmxlU3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICB9XG4gIH0pO1xuXG4gIHN0cmVhbS5wYXVzZSA9IGZ1bmN0aW9uKCkge1xuICAgIHBhdXNlZCA9IHRydWU7XG4gICAgdGhpcy5lbWl0KCdwYXVzZScpO1xuICB9O1xuXG4gIHN0cmVhbS5yZXN1bWUgPSBmdW5jdGlvbigpIHtcbiAgICBwYXVzZWQgPSBmYWxzZTtcbiAgICBpZiAocmVhZGFibGUpXG4gICAgICBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uKCkge1xuICAgICAgICBzdHJlYW0uZW1pdCgncmVhZGFibGUnKTtcbiAgICAgIH0pO1xuICAgIGVsc2VcbiAgICAgIHRoaXMucmVhZCgwKTtcbiAgICB0aGlzLmVtaXQoJ3Jlc3VtZScpO1xuICB9O1xuXG4gIC8vIG5vdyBtYWtlIGl0IHN0YXJ0LCBqdXN0IGluIGNhc2UgaXQgaGFkbid0IGFscmVhZHkuXG4gIHN0cmVhbS5lbWl0KCdyZWFkYWJsZScpO1xufVxuXG4vLyB3cmFwIGFuIG9sZC1zdHlsZSBzdHJlYW0gYXMgdGhlIGFzeW5jIGRhdGEgc291cmNlLlxuLy8gVGhpcyBpcyAqbm90KiBwYXJ0IG9mIHRoZSByZWFkYWJsZSBzdHJlYW0gaW50ZXJmYWNlLlxuLy8gSXQgaXMgYW4gdWdseSB1bmZvcnR1bmF0ZSBtZXNzIG9mIGhpc3RvcnkuXG5SZWFkYWJsZS5wcm90b3R5cGUud3JhcCA9IGZ1bmN0aW9uKHN0cmVhbSkge1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICB2YXIgcGF1c2VkID0gZmFsc2U7XG5cbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBzdHJlYW0ub24oJ2VuZCcsIGZ1bmN0aW9uKCkge1xuICAgIGlmIChzdGF0ZS5kZWNvZGVyICYmICFzdGF0ZS5lbmRlZCkge1xuICAgICAgdmFyIGNodW5rID0gc3RhdGUuZGVjb2Rlci5lbmQoKTtcbiAgICAgIGlmIChjaHVuayAmJiBjaHVuay5sZW5ndGgpXG4gICAgICAgIHNlbGYucHVzaChjaHVuayk7XG4gICAgfVxuXG4gICAgc2VsZi5wdXNoKG51bGwpO1xuICB9KTtcblxuICBzdHJlYW0ub24oJ2RhdGEnLCBmdW5jdGlvbihjaHVuaykge1xuICAgIGlmIChzdGF0ZS5kZWNvZGVyKVxuICAgICAgY2h1bmsgPSBzdGF0ZS5kZWNvZGVyLndyaXRlKGNodW5rKTtcblxuICAgIC8vIGRvbid0IHNraXAgb3ZlciBmYWxzeSB2YWx1ZXMgaW4gb2JqZWN0TW9kZVxuICAgIC8vaWYgKHN0YXRlLm9iamVjdE1vZGUgJiYgdXRpbC5pc051bGxPclVuZGVmaW5lZChjaHVuaykpXG4gICAgaWYgKHN0YXRlLm9iamVjdE1vZGUgJiYgKGNodW5rID09PSBudWxsIHx8IGNodW5rID09PSB1bmRlZmluZWQpKVxuICAgICAgcmV0dXJuO1xuICAgIGVsc2UgaWYgKCFzdGF0ZS5vYmplY3RNb2RlICYmICghY2h1bmsgfHwgIWNodW5rLmxlbmd0aCkpXG4gICAgICByZXR1cm47XG5cbiAgICB2YXIgcmV0ID0gc2VsZi5wdXNoKGNodW5rKTtcbiAgICBpZiAoIXJldCkge1xuICAgICAgcGF1c2VkID0gdHJ1ZTtcbiAgICAgIHN0cmVhbS5wYXVzZSgpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gcHJveHkgYWxsIHRoZSBvdGhlciBtZXRob2RzLlxuICAvLyBpbXBvcnRhbnQgd2hlbiB3cmFwcGluZyBmaWx0ZXJzIGFuZCBkdXBsZXhlcy5cbiAgZm9yICh2YXIgaSBpbiBzdHJlYW0pIHtcbiAgICBpZiAodHlwZW9mIHN0cmVhbVtpXSA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgICAgICB0eXBlb2YgdGhpc1tpXSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRoaXNbaV0gPSBmdW5jdGlvbihtZXRob2QpIHsgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gc3RyZWFtW21ldGhvZF0uYXBwbHkoc3RyZWFtLCBhcmd1bWVudHMpO1xuICAgICAgfX0oaSk7XG4gICAgfVxuICB9XG5cbiAgLy8gcHJveHkgY2VydGFpbiBpbXBvcnRhbnQgZXZlbnRzLlxuICB2YXIgZXZlbnRzID0gWydlcnJvcicsICdjbG9zZScsICdkZXN0cm95JywgJ3BhdXNlJywgJ3Jlc3VtZSddO1xuICBmb3JFYWNoKGV2ZW50cywgZnVuY3Rpb24oZXYpIHtcbiAgICBzdHJlYW0ub24oZXYsIHNlbGYuZW1pdC5iaW5kKHNlbGYsIGV2KSk7XG4gIH0pO1xuXG4gIC8vIHdoZW4gd2UgdHJ5IHRvIGNvbnN1bWUgc29tZSBtb3JlIGJ5dGVzLCBzaW1wbHkgdW5wYXVzZSB0aGVcbiAgLy8gdW5kZXJseWluZyBzdHJlYW0uXG4gIHNlbGYuX3JlYWQgPSBmdW5jdGlvbihuKSB7XG4gICAgaWYgKHBhdXNlZCkge1xuICAgICAgcGF1c2VkID0gZmFsc2U7XG4gICAgICBzdHJlYW0ucmVzdW1lKCk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBzZWxmO1xufTtcblxuXG5cbi8vIGV4cG9zZWQgZm9yIHRlc3RpbmcgcHVycG9zZXMgb25seS5cblJlYWRhYmxlLl9mcm9tTGlzdCA9IGZyb21MaXN0O1xuXG4vLyBQbHVjayBvZmYgbiBieXRlcyBmcm9tIGFuIGFycmF5IG9mIGJ1ZmZlcnMuXG4vLyBMZW5ndGggaXMgdGhlIGNvbWJpbmVkIGxlbmd0aHMgb2YgYWxsIHRoZSBidWZmZXJzIGluIHRoZSBsaXN0LlxuZnVuY3Rpb24gZnJvbUxpc3Qobiwgc3RhdGUpIHtcbiAgdmFyIGxpc3QgPSBzdGF0ZS5idWZmZXI7XG4gIHZhciBsZW5ndGggPSBzdGF0ZS5sZW5ndGg7XG4gIHZhciBzdHJpbmdNb2RlID0gISFzdGF0ZS5kZWNvZGVyO1xuICB2YXIgb2JqZWN0TW9kZSA9ICEhc3RhdGUub2JqZWN0TW9kZTtcbiAgdmFyIHJldDtcblxuICAvLyBub3RoaW5nIGluIHRoZSBsaXN0LCBkZWZpbml0ZWx5IGVtcHR5LlxuICBpZiAobGlzdC5sZW5ndGggPT09IDApXG4gICAgcmV0dXJuIG51bGw7XG5cbiAgaWYgKGxlbmd0aCA9PT0gMClcbiAgICByZXQgPSBudWxsO1xuICBlbHNlIGlmIChvYmplY3RNb2RlKVxuICAgIHJldCA9IGxpc3Quc2hpZnQoKTtcbiAgZWxzZSBpZiAoIW4gfHwgbiA+PSBsZW5ndGgpIHtcbiAgICAvLyByZWFkIGl0IGFsbCwgdHJ1bmNhdGUgdGhlIGFycmF5LlxuICAgIGlmIChzdHJpbmdNb2RlKVxuICAgICAgcmV0ID0gbGlzdC5qb2luKCcnKTtcbiAgICBlbHNlXG4gICAgICByZXQgPSBCdWZmZXIuY29uY2F0KGxpc3QsIGxlbmd0aCk7XG4gICAgbGlzdC5sZW5ndGggPSAwO1xuICB9IGVsc2Uge1xuICAgIC8vIHJlYWQganVzdCBzb21lIG9mIGl0LlxuICAgIGlmIChuIDwgbGlzdFswXS5sZW5ndGgpIHtcbiAgICAgIC8vIGp1c3QgdGFrZSBhIHBhcnQgb2YgdGhlIGZpcnN0IGxpc3QgaXRlbS5cbiAgICAgIC8vIHNsaWNlIGlzIHRoZSBzYW1lIGZvciBidWZmZXJzIGFuZCBzdHJpbmdzLlxuICAgICAgdmFyIGJ1ZiA9IGxpc3RbMF07XG4gICAgICByZXQgPSBidWYuc2xpY2UoMCwgbik7XG4gICAgICBsaXN0WzBdID0gYnVmLnNsaWNlKG4pO1xuICAgIH0gZWxzZSBpZiAobiA9PT0gbGlzdFswXS5sZW5ndGgpIHtcbiAgICAgIC8vIGZpcnN0IGxpc3QgaXMgYSBwZXJmZWN0IG1hdGNoXG4gICAgICByZXQgPSBsaXN0LnNoaWZ0KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGNvbXBsZXggY2FzZS5cbiAgICAgIC8vIHdlIGhhdmUgZW5vdWdoIHRvIGNvdmVyIGl0LCBidXQgaXQgc3BhbnMgcGFzdCB0aGUgZmlyc3QgYnVmZmVyLlxuICAgICAgaWYgKHN0cmluZ01vZGUpXG4gICAgICAgIHJldCA9ICcnO1xuICAgICAgZWxzZVxuICAgICAgICByZXQgPSBuZXcgQnVmZmVyKG4pO1xuXG4gICAgICB2YXIgYyA9IDA7XG4gICAgICBmb3IgKHZhciBpID0gMCwgbCA9IGxpc3QubGVuZ3RoOyBpIDwgbCAmJiBjIDwgbjsgaSsrKSB7XG4gICAgICAgIHZhciBidWYgPSBsaXN0WzBdO1xuICAgICAgICB2YXIgY3B5ID0gTWF0aC5taW4obiAtIGMsIGJ1Zi5sZW5ndGgpO1xuXG4gICAgICAgIGlmIChzdHJpbmdNb2RlKVxuICAgICAgICAgIHJldCArPSBidWYuc2xpY2UoMCwgY3B5KTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgIGJ1Zi5jb3B5KHJldCwgYywgMCwgY3B5KTtcblxuICAgICAgICBpZiAoY3B5IDwgYnVmLmxlbmd0aClcbiAgICAgICAgICBsaXN0WzBdID0gYnVmLnNsaWNlKGNweSk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICBsaXN0LnNoaWZ0KCk7XG5cbiAgICAgICAgYyArPSBjcHk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gZW5kUmVhZGFibGUoc3RyZWFtKSB7XG4gIHZhciBzdGF0ZSA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZTtcblxuICAvLyBJZiB3ZSBnZXQgaGVyZSBiZWZvcmUgY29uc3VtaW5nIGFsbCB0aGUgYnl0ZXMsIHRoZW4gdGhhdCBpcyBhXG4gIC8vIGJ1ZyBpbiBub2RlLiAgU2hvdWxkIG5ldmVyIGhhcHBlbi5cbiAgaWYgKHN0YXRlLmxlbmd0aCA+IDApXG4gICAgdGhyb3cgbmV3IEVycm9yKCdlbmRSZWFkYWJsZSBjYWxsZWQgb24gbm9uLWVtcHR5IHN0cmVhbScpO1xuXG4gIGlmICghc3RhdGUuZW5kRW1pdHRlZCAmJiBzdGF0ZS5jYWxsZWRSZWFkKSB7XG4gICAgc3RhdGUuZW5kZWQgPSB0cnVlO1xuICAgIHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24oKSB7XG4gICAgICAvLyBDaGVjayB0aGF0IHdlIGRpZG4ndCBnZXQgb25lIGxhc3QgdW5zaGlmdC5cbiAgICAgIGlmICghc3RhdGUuZW5kRW1pdHRlZCAmJiBzdGF0ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgc3RhdGUuZW5kRW1pdHRlZCA9IHRydWU7XG4gICAgICAgIHN0cmVhbS5yZWFkYWJsZSA9IGZhbHNlO1xuICAgICAgICBzdHJlYW0uZW1pdCgnZW5kJyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZm9yRWFjaCAoeHMsIGYpIHtcbiAgZm9yICh2YXIgaSA9IDAsIGwgPSB4cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBmKHhzW2ldLCBpKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpbmRleE9mICh4cywgeCkge1xuICBmb3IgKHZhciBpID0gMCwgbCA9IHhzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGlmICh4c1tpXSA9PT0geCkgcmV0dXJuIGk7XG4gIH1cbiAgcmV0dXJuIC0xO1xufVxuIiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cblxuLy8gYSB0cmFuc2Zvcm0gc3RyZWFtIGlzIGEgcmVhZGFibGUvd3JpdGFibGUgc3RyZWFtIHdoZXJlIHlvdSBkb1xuLy8gc29tZXRoaW5nIHdpdGggdGhlIGRhdGEuICBTb21ldGltZXMgaXQncyBjYWxsZWQgYSBcImZpbHRlclwiLFxuLy8gYnV0IHRoYXQncyBub3QgYSBncmVhdCBuYW1lIGZvciBpdCwgc2luY2UgdGhhdCBpbXBsaWVzIGEgdGhpbmcgd2hlcmVcbi8vIHNvbWUgYml0cyBwYXNzIHRocm91Z2gsIGFuZCBvdGhlcnMgYXJlIHNpbXBseSBpZ25vcmVkLiAgKFRoYXQgd291bGRcbi8vIGJlIGEgdmFsaWQgZXhhbXBsZSBvZiBhIHRyYW5zZm9ybSwgb2YgY291cnNlLilcbi8vXG4vLyBXaGlsZSB0aGUgb3V0cHV0IGlzIGNhdXNhbGx5IHJlbGF0ZWQgdG8gdGhlIGlucHV0LCBpdCdzIG5vdCBhXG4vLyBuZWNlc3NhcmlseSBzeW1tZXRyaWMgb3Igc3luY2hyb25vdXMgdHJhbnNmb3JtYXRpb24uICBGb3IgZXhhbXBsZSxcbi8vIGEgemxpYiBzdHJlYW0gbWlnaHQgdGFrZSBtdWx0aXBsZSBwbGFpbi10ZXh0IHdyaXRlcygpLCBhbmQgdGhlblxuLy8gZW1pdCBhIHNpbmdsZSBjb21wcmVzc2VkIGNodW5rIHNvbWUgdGltZSBpbiB0aGUgZnV0dXJlLlxuLy9cbi8vIEhlcmUncyBob3cgdGhpcyB3b3Jrczpcbi8vXG4vLyBUaGUgVHJhbnNmb3JtIHN0cmVhbSBoYXMgYWxsIHRoZSBhc3BlY3RzIG9mIHRoZSByZWFkYWJsZSBhbmQgd3JpdGFibGVcbi8vIHN0cmVhbSBjbGFzc2VzLiAgV2hlbiB5b3Ugd3JpdGUoY2h1bmspLCB0aGF0IGNhbGxzIF93cml0ZShjaHVuayxjYilcbi8vIGludGVybmFsbHksIGFuZCByZXR1cm5zIGZhbHNlIGlmIHRoZXJlJ3MgYSBsb3Qgb2YgcGVuZGluZyB3cml0ZXNcbi8vIGJ1ZmZlcmVkIHVwLiAgV2hlbiB5b3UgY2FsbCByZWFkKCksIHRoYXQgY2FsbHMgX3JlYWQobikgdW50aWxcbi8vIHRoZXJlJ3MgZW5vdWdoIHBlbmRpbmcgcmVhZGFibGUgZGF0YSBidWZmZXJlZCB1cC5cbi8vXG4vLyBJbiBhIHRyYW5zZm9ybSBzdHJlYW0sIHRoZSB3cml0dGVuIGRhdGEgaXMgcGxhY2VkIGluIGEgYnVmZmVyLiAgV2hlblxuLy8gX3JlYWQobikgaXMgY2FsbGVkLCBpdCB0cmFuc2Zvcm1zIHRoZSBxdWV1ZWQgdXAgZGF0YSwgY2FsbGluZyB0aGVcbi8vIGJ1ZmZlcmVkIF93cml0ZSBjYidzIGFzIGl0IGNvbnN1bWVzIGNodW5rcy4gIElmIGNvbnN1bWluZyBhIHNpbmdsZVxuLy8gd3JpdHRlbiBjaHVuayB3b3VsZCByZXN1bHQgaW4gbXVsdGlwbGUgb3V0cHV0IGNodW5rcywgdGhlbiB0aGUgZmlyc3Rcbi8vIG91dHB1dHRlZCBiaXQgY2FsbHMgdGhlIHJlYWRjYiwgYW5kIHN1YnNlcXVlbnQgY2h1bmtzIGp1c3QgZ28gaW50b1xuLy8gdGhlIHJlYWQgYnVmZmVyLCBhbmQgd2lsbCBjYXVzZSBpdCB0byBlbWl0ICdyZWFkYWJsZScgaWYgbmVjZXNzYXJ5LlxuLy9cbi8vIFRoaXMgd2F5LCBiYWNrLXByZXNzdXJlIGlzIGFjdHVhbGx5IGRldGVybWluZWQgYnkgdGhlIHJlYWRpbmcgc2lkZSxcbi8vIHNpbmNlIF9yZWFkIGhhcyB0byBiZSBjYWxsZWQgdG8gc3RhcnQgcHJvY2Vzc2luZyBhIG5ldyBjaHVuay4gIEhvd2V2ZXIsXG4vLyBhIHBhdGhvbG9naWNhbCBpbmZsYXRlIHR5cGUgb2YgdHJhbnNmb3JtIGNhbiBjYXVzZSBleGNlc3NpdmUgYnVmZmVyaW5nXG4vLyBoZXJlLiAgRm9yIGV4YW1wbGUsIGltYWdpbmUgYSBzdHJlYW0gd2hlcmUgZXZlcnkgYnl0ZSBvZiBpbnB1dCBpc1xuLy8gaW50ZXJwcmV0ZWQgYXMgYW4gaW50ZWdlciBmcm9tIDAtMjU1LCBhbmQgdGhlbiByZXN1bHRzIGluIHRoYXQgbWFueVxuLy8gYnl0ZXMgb2Ygb3V0cHV0LiAgV3JpdGluZyB0aGUgNCBieXRlcyB7ZmYsZmYsZmYsZmZ9IHdvdWxkIHJlc3VsdCBpblxuLy8gMWtiIG9mIGRhdGEgYmVpbmcgb3V0cHV0LiAgSW4gdGhpcyBjYXNlLCB5b3UgY291bGQgd3JpdGUgYSB2ZXJ5IHNtYWxsXG4vLyBhbW91bnQgb2YgaW5wdXQsIGFuZCBlbmQgdXAgd2l0aCBhIHZlcnkgbGFyZ2UgYW1vdW50IG9mIG91dHB1dC4gIEluXG4vLyBzdWNoIGEgcGF0aG9sb2dpY2FsIGluZmxhdGluZyBtZWNoYW5pc20sIHRoZXJlJ2QgYmUgbm8gd2F5IHRvIHRlbGxcbi8vIHRoZSBzeXN0ZW0gdG8gc3RvcCBkb2luZyB0aGUgdHJhbnNmb3JtLiAgQSBzaW5nbGUgNE1CIHdyaXRlIGNvdWxkXG4vLyBjYXVzZSB0aGUgc3lzdGVtIHRvIHJ1biBvdXQgb2YgbWVtb3J5LlxuLy9cbi8vIEhvd2V2ZXIsIGV2ZW4gaW4gc3VjaCBhIHBhdGhvbG9naWNhbCBjYXNlLCBvbmx5IGEgc2luZ2xlIHdyaXR0ZW4gY2h1bmtcbi8vIHdvdWxkIGJlIGNvbnN1bWVkLCBhbmQgdGhlbiB0aGUgcmVzdCB3b3VsZCB3YWl0ICh1bi10cmFuc2Zvcm1lZCkgdW50aWxcbi8vIHRoZSByZXN1bHRzIG9mIHRoZSBwcmV2aW91cyB0cmFuc2Zvcm1lZCBjaHVuayB3ZXJlIGNvbnN1bWVkLlxuXG5tb2R1bGUuZXhwb3J0cyA9IFRyYW5zZm9ybTtcblxudmFyIER1cGxleCA9IHJlcXVpcmUoJy4vX3N0cmVhbV9kdXBsZXgnKTtcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciB1dGlsID0gcmVxdWlyZSgnY29yZS11dGlsLWlzJyk7XG51dGlsLmluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG51dGlsLmluaGVyaXRzKFRyYW5zZm9ybSwgRHVwbGV4KTtcblxuXG5mdW5jdGlvbiBUcmFuc2Zvcm1TdGF0ZShvcHRpb25zLCBzdHJlYW0pIHtcbiAgdGhpcy5hZnRlclRyYW5zZm9ybSA9IGZ1bmN0aW9uKGVyLCBkYXRhKSB7XG4gICAgcmV0dXJuIGFmdGVyVHJhbnNmb3JtKHN0cmVhbSwgZXIsIGRhdGEpO1xuICB9O1xuXG4gIHRoaXMubmVlZFRyYW5zZm9ybSA9IGZhbHNlO1xuICB0aGlzLnRyYW5zZm9ybWluZyA9IGZhbHNlO1xuICB0aGlzLndyaXRlY2IgPSBudWxsO1xuICB0aGlzLndyaXRlY2h1bmsgPSBudWxsO1xufVxuXG5mdW5jdGlvbiBhZnRlclRyYW5zZm9ybShzdHJlYW0sIGVyLCBkYXRhKSB7XG4gIHZhciB0cyA9IHN0cmVhbS5fdHJhbnNmb3JtU3RhdGU7XG4gIHRzLnRyYW5zZm9ybWluZyA9IGZhbHNlO1xuXG4gIHZhciBjYiA9IHRzLndyaXRlY2I7XG5cbiAgaWYgKCFjYilcbiAgICByZXR1cm4gc3RyZWFtLmVtaXQoJ2Vycm9yJywgbmV3IEVycm9yKCdubyB3cml0ZWNiIGluIFRyYW5zZm9ybSBjbGFzcycpKTtcblxuICB0cy53cml0ZWNodW5rID0gbnVsbDtcbiAgdHMud3JpdGVjYiA9IG51bGw7XG5cbiAgaWYgKGRhdGEgIT09IG51bGwgJiYgZGF0YSAhPT0gdW5kZWZpbmVkKVxuICAgIHN0cmVhbS5wdXNoKGRhdGEpO1xuXG4gIGlmIChjYilcbiAgICBjYihlcik7XG5cbiAgdmFyIHJzID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlO1xuICBycy5yZWFkaW5nID0gZmFsc2U7XG4gIGlmIChycy5uZWVkUmVhZGFibGUgfHwgcnMubGVuZ3RoIDwgcnMuaGlnaFdhdGVyTWFyaykge1xuICAgIHN0cmVhbS5fcmVhZChycy5oaWdoV2F0ZXJNYXJrKTtcbiAgfVxufVxuXG5cbmZ1bmN0aW9uIFRyYW5zZm9ybShvcHRpb25zKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBUcmFuc2Zvcm0pKVxuICAgIHJldHVybiBuZXcgVHJhbnNmb3JtKG9wdGlvbnMpO1xuXG4gIER1cGxleC5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuXG4gIHZhciB0cyA9IHRoaXMuX3RyYW5zZm9ybVN0YXRlID0gbmV3IFRyYW5zZm9ybVN0YXRlKG9wdGlvbnMsIHRoaXMpO1xuXG4gIC8vIHdoZW4gdGhlIHdyaXRhYmxlIHNpZGUgZmluaXNoZXMsIHRoZW4gZmx1c2ggb3V0IGFueXRoaW5nIHJlbWFpbmluZy5cbiAgdmFyIHN0cmVhbSA9IHRoaXM7XG5cbiAgLy8gc3RhcnQgb3V0IGFza2luZyBmb3IgYSByZWFkYWJsZSBldmVudCBvbmNlIGRhdGEgaXMgdHJhbnNmb3JtZWQuXG4gIHRoaXMuX3JlYWRhYmxlU3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcblxuICAvLyB3ZSBoYXZlIGltcGxlbWVudGVkIHRoZSBfcmVhZCBtZXRob2QsIGFuZCBkb25lIHRoZSBvdGhlciB0aGluZ3NcbiAgLy8gdGhhdCBSZWFkYWJsZSB3YW50cyBiZWZvcmUgdGhlIGZpcnN0IF9yZWFkIGNhbGwsIHNvIHVuc2V0IHRoZVxuICAvLyBzeW5jIGd1YXJkIGZsYWcuXG4gIHRoaXMuX3JlYWRhYmxlU3RhdGUuc3luYyA9IGZhbHNlO1xuXG4gIHRoaXMub25jZSgnZmluaXNoJywgZnVuY3Rpb24oKSB7XG4gICAgaWYgKCdmdW5jdGlvbicgPT09IHR5cGVvZiB0aGlzLl9mbHVzaClcbiAgICAgIHRoaXMuX2ZsdXNoKGZ1bmN0aW9uKGVyKSB7XG4gICAgICAgIGRvbmUoc3RyZWFtLCBlcik7XG4gICAgICB9KTtcbiAgICBlbHNlXG4gICAgICBkb25lKHN0cmVhbSk7XG4gIH0pO1xufVxuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbihjaHVuaywgZW5jb2RpbmcpIHtcbiAgdGhpcy5fdHJhbnNmb3JtU3RhdGUubmVlZFRyYW5zZm9ybSA9IGZhbHNlO1xuICByZXR1cm4gRHVwbGV4LnByb3RvdHlwZS5wdXNoLmNhbGwodGhpcywgY2h1bmssIGVuY29kaW5nKTtcbn07XG5cbi8vIFRoaXMgaXMgdGhlIHBhcnQgd2hlcmUgeW91IGRvIHN0dWZmIVxuLy8gb3ZlcnJpZGUgdGhpcyBmdW5jdGlvbiBpbiBpbXBsZW1lbnRhdGlvbiBjbGFzc2VzLlxuLy8gJ2NodW5rJyBpcyBhbiBpbnB1dCBjaHVuay5cbi8vXG4vLyBDYWxsIGBwdXNoKG5ld0NodW5rKWAgdG8gcGFzcyBhbG9uZyB0cmFuc2Zvcm1lZCBvdXRwdXRcbi8vIHRvIHRoZSByZWFkYWJsZSBzaWRlLiAgWW91IG1heSBjYWxsICdwdXNoJyB6ZXJvIG9yIG1vcmUgdGltZXMuXG4vL1xuLy8gQ2FsbCBgY2IoZXJyKWAgd2hlbiB5b3UgYXJlIGRvbmUgd2l0aCB0aGlzIGNodW5rLiAgSWYgeW91IHBhc3Ncbi8vIGFuIGVycm9yLCB0aGVuIHRoYXQnbGwgcHV0IHRoZSBodXJ0IG9uIHRoZSB3aG9sZSBvcGVyYXRpb24uICBJZiB5b3Vcbi8vIG5ldmVyIGNhbGwgY2IoKSwgdGhlbiB5b3UnbGwgbmV2ZXIgZ2V0IGFub3RoZXIgY2h1bmsuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLl90cmFuc2Zvcm0gPSBmdW5jdGlvbihjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIHRocm93IG5ldyBFcnJvcignbm90IGltcGxlbWVudGVkJyk7XG59O1xuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLl93cml0ZSA9IGZ1bmN0aW9uKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgdmFyIHRzID0gdGhpcy5fdHJhbnNmb3JtU3RhdGU7XG4gIHRzLndyaXRlY2IgPSBjYjtcbiAgdHMud3JpdGVjaHVuayA9IGNodW5rO1xuICB0cy53cml0ZWVuY29kaW5nID0gZW5jb2Rpbmc7XG4gIGlmICghdHMudHJhbnNmb3JtaW5nKSB7XG4gICAgdmFyIHJzID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgICBpZiAodHMubmVlZFRyYW5zZm9ybSB8fFxuICAgICAgICBycy5uZWVkUmVhZGFibGUgfHxcbiAgICAgICAgcnMubGVuZ3RoIDwgcnMuaGlnaFdhdGVyTWFyaylcbiAgICAgIHRoaXMuX3JlYWQocnMuaGlnaFdhdGVyTWFyayk7XG4gIH1cbn07XG5cbi8vIERvZXNuJ3QgbWF0dGVyIHdoYXQgdGhlIGFyZ3MgYXJlIGhlcmUuXG4vLyBfdHJhbnNmb3JtIGRvZXMgYWxsIHRoZSB3b3JrLlxuLy8gVGhhdCB3ZSBnb3QgaGVyZSBtZWFucyB0aGF0IHRoZSByZWFkYWJsZSBzaWRlIHdhbnRzIG1vcmUgZGF0YS5cblRyYW5zZm9ybS5wcm90b3R5cGUuX3JlYWQgPSBmdW5jdGlvbihuKSB7XG4gIHZhciB0cyA9IHRoaXMuX3RyYW5zZm9ybVN0YXRlO1xuXG4gIGlmICh0cy53cml0ZWNodW5rICE9PSBudWxsICYmIHRzLndyaXRlY2IgJiYgIXRzLnRyYW5zZm9ybWluZykge1xuICAgIHRzLnRyYW5zZm9ybWluZyA9IHRydWU7XG4gICAgdGhpcy5fdHJhbnNmb3JtKHRzLndyaXRlY2h1bmssIHRzLndyaXRlZW5jb2RpbmcsIHRzLmFmdGVyVHJhbnNmb3JtKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBtYXJrIHRoYXQgd2UgbmVlZCBhIHRyYW5zZm9ybSwgc28gdGhhdCBhbnkgZGF0YSB0aGF0IGNvbWVzIGluXG4gICAgLy8gd2lsbCBnZXQgcHJvY2Vzc2VkLCBub3cgdGhhdCB3ZSd2ZSBhc2tlZCBmb3IgaXQuXG4gICAgdHMubmVlZFRyYW5zZm9ybSA9IHRydWU7XG4gIH1cbn07XG5cblxuZnVuY3Rpb24gZG9uZShzdHJlYW0sIGVyKSB7XG4gIGlmIChlcilcbiAgICByZXR1cm4gc3RyZWFtLmVtaXQoJ2Vycm9yJywgZXIpO1xuXG4gIC8vIGlmIHRoZXJlJ3Mgbm90aGluZyBpbiB0aGUgd3JpdGUgYnVmZmVyLCB0aGVuIHRoYXQgbWVhbnNcbiAgLy8gdGhhdCBub3RoaW5nIG1vcmUgd2lsbCBldmVyIGJlIHByb3ZpZGVkXG4gIHZhciB3cyA9IHN0cmVhbS5fd3JpdGFibGVTdGF0ZTtcbiAgdmFyIHJzID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlO1xuICB2YXIgdHMgPSBzdHJlYW0uX3RyYW5zZm9ybVN0YXRlO1xuXG4gIGlmICh3cy5sZW5ndGgpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdjYWxsaW5nIHRyYW5zZm9ybSBkb25lIHdoZW4gd3MubGVuZ3RoICE9IDAnKTtcblxuICBpZiAodHMudHJhbnNmb3JtaW5nKVxuICAgIHRocm93IG5ldyBFcnJvcignY2FsbGluZyB0cmFuc2Zvcm0gZG9uZSB3aGVuIHN0aWxsIHRyYW5zZm9ybWluZycpO1xuXG4gIHJldHVybiBzdHJlYW0ucHVzaChudWxsKTtcbn1cbiIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4vLyBBIGJpdCBzaW1wbGVyIHRoYW4gcmVhZGFibGUgc3RyZWFtcy5cbi8vIEltcGxlbWVudCBhbiBhc3luYyAuX3dyaXRlKGNodW5rLCBjYiksIGFuZCBpdCdsbCBoYW5kbGUgYWxsXG4vLyB0aGUgZHJhaW4gZXZlbnQgZW1pc3Npb24gYW5kIGJ1ZmZlcmluZy5cblxubW9kdWxlLmV4cG9ydHMgPSBXcml0YWJsZTtcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBCdWZmZXIgPSByZXF1aXJlKCdidWZmZXInKS5CdWZmZXI7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuV3JpdGFibGUuV3JpdGFibGVTdGF0ZSA9IFdyaXRhYmxlU3RhdGU7XG5cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciB1dGlsID0gcmVxdWlyZSgnY29yZS11dGlsLWlzJyk7XG51dGlsLmluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG52YXIgU3RyZWFtID0gcmVxdWlyZSgnc3RyZWFtJyk7XG5cbnV0aWwuaW5oZXJpdHMoV3JpdGFibGUsIFN0cmVhbSk7XG5cbmZ1bmN0aW9uIFdyaXRlUmVxKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgdGhpcy5jaHVuayA9IGNodW5rO1xuICB0aGlzLmVuY29kaW5nID0gZW5jb2Rpbmc7XG4gIHRoaXMuY2FsbGJhY2sgPSBjYjtcbn1cblxuZnVuY3Rpb24gV3JpdGFibGVTdGF0ZShvcHRpb25zLCBzdHJlYW0pIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgLy8gdGhlIHBvaW50IGF0IHdoaWNoIHdyaXRlKCkgc3RhcnRzIHJldHVybmluZyBmYWxzZVxuICAvLyBOb3RlOiAwIGlzIGEgdmFsaWQgdmFsdWUsIG1lYW5zIHRoYXQgd2UgYWx3YXlzIHJldHVybiBmYWxzZSBpZlxuICAvLyB0aGUgZW50aXJlIGJ1ZmZlciBpcyBub3QgZmx1c2hlZCBpbW1lZGlhdGVseSBvbiB3cml0ZSgpXG4gIHZhciBod20gPSBvcHRpb25zLmhpZ2hXYXRlck1hcms7XG4gIHRoaXMuaGlnaFdhdGVyTWFyayA9IChod20gfHwgaHdtID09PSAwKSA/IGh3bSA6IDE2ICogMTAyNDtcblxuICAvLyBvYmplY3Qgc3RyZWFtIGZsYWcgdG8gaW5kaWNhdGUgd2hldGhlciBvciBub3QgdGhpcyBzdHJlYW1cbiAgLy8gY29udGFpbnMgYnVmZmVycyBvciBvYmplY3RzLlxuICB0aGlzLm9iamVjdE1vZGUgPSAhIW9wdGlvbnMub2JqZWN0TW9kZTtcblxuICAvLyBjYXN0IHRvIGludHMuXG4gIHRoaXMuaGlnaFdhdGVyTWFyayA9IH5+dGhpcy5oaWdoV2F0ZXJNYXJrO1xuXG4gIHRoaXMubmVlZERyYWluID0gZmFsc2U7XG4gIC8vIGF0IHRoZSBzdGFydCBvZiBjYWxsaW5nIGVuZCgpXG4gIHRoaXMuZW5kaW5nID0gZmFsc2U7XG4gIC8vIHdoZW4gZW5kKCkgaGFzIGJlZW4gY2FsbGVkLCBhbmQgcmV0dXJuZWRcbiAgdGhpcy5lbmRlZCA9IGZhbHNlO1xuICAvLyB3aGVuICdmaW5pc2gnIGlzIGVtaXR0ZWRcbiAgdGhpcy5maW5pc2hlZCA9IGZhbHNlO1xuXG4gIC8vIHNob3VsZCB3ZSBkZWNvZGUgc3RyaW5ncyBpbnRvIGJ1ZmZlcnMgYmVmb3JlIHBhc3NpbmcgdG8gX3dyaXRlP1xuICAvLyB0aGlzIGlzIGhlcmUgc28gdGhhdCBzb21lIG5vZGUtY29yZSBzdHJlYW1zIGNhbiBvcHRpbWl6ZSBzdHJpbmdcbiAgLy8gaGFuZGxpbmcgYXQgYSBsb3dlciBsZXZlbC5cbiAgdmFyIG5vRGVjb2RlID0gb3B0aW9ucy5kZWNvZGVTdHJpbmdzID09PSBmYWxzZTtcbiAgdGhpcy5kZWNvZGVTdHJpbmdzID0gIW5vRGVjb2RlO1xuXG4gIC8vIENyeXB0byBpcyBraW5kIG9mIG9sZCBhbmQgY3J1c3R5LiAgSGlzdG9yaWNhbGx5LCBpdHMgZGVmYXVsdCBzdHJpbmdcbiAgLy8gZW5jb2RpbmcgaXMgJ2JpbmFyeScgc28gd2UgaGF2ZSB0byBtYWtlIHRoaXMgY29uZmlndXJhYmxlLlxuICAvLyBFdmVyeXRoaW5nIGVsc2UgaW4gdGhlIHVuaXZlcnNlIHVzZXMgJ3V0ZjgnLCB0aG91Z2guXG4gIHRoaXMuZGVmYXVsdEVuY29kaW5nID0gb3B0aW9ucy5kZWZhdWx0RW5jb2RpbmcgfHwgJ3V0ZjgnO1xuXG4gIC8vIG5vdCBhbiBhY3R1YWwgYnVmZmVyIHdlIGtlZXAgdHJhY2sgb2YsIGJ1dCBhIG1lYXN1cmVtZW50XG4gIC8vIG9mIGhvdyBtdWNoIHdlJ3JlIHdhaXRpbmcgdG8gZ2V0IHB1c2hlZCB0byBzb21lIHVuZGVybHlpbmdcbiAgLy8gc29ja2V0IG9yIGZpbGUuXG4gIHRoaXMubGVuZ3RoID0gMDtcblxuICAvLyBhIGZsYWcgdG8gc2VlIHdoZW4gd2UncmUgaW4gdGhlIG1pZGRsZSBvZiBhIHdyaXRlLlxuICB0aGlzLndyaXRpbmcgPSBmYWxzZTtcblxuICAvLyBhIGZsYWcgdG8gYmUgYWJsZSB0byB0ZWxsIGlmIHRoZSBvbndyaXRlIGNiIGlzIGNhbGxlZCBpbW1lZGlhdGVseSxcbiAgLy8gb3Igb24gYSBsYXRlciB0aWNrLiAgV2Ugc2V0IHRoaXMgdG8gdHJ1ZSBhdCBmaXJzdCwgYmVjdWFzZSBhbnlcbiAgLy8gYWN0aW9ucyB0aGF0IHNob3VsZG4ndCBoYXBwZW4gdW50aWwgXCJsYXRlclwiIHNob3VsZCBnZW5lcmFsbHkgYWxzb1xuICAvLyBub3QgaGFwcGVuIGJlZm9yZSB0aGUgZmlyc3Qgd3JpdGUgY2FsbC5cbiAgdGhpcy5zeW5jID0gdHJ1ZTtcblxuICAvLyBhIGZsYWcgdG8ga25vdyBpZiB3ZSdyZSBwcm9jZXNzaW5nIHByZXZpb3VzbHkgYnVmZmVyZWQgaXRlbXMsIHdoaWNoXG4gIC8vIG1heSBjYWxsIHRoZSBfd3JpdGUoKSBjYWxsYmFjayBpbiB0aGUgc2FtZSB0aWNrLCBzbyB0aGF0IHdlIGRvbid0XG4gIC8vIGVuZCB1cCBpbiBhbiBvdmVybGFwcGVkIG9ud3JpdGUgc2l0dWF0aW9uLlxuICB0aGlzLmJ1ZmZlclByb2Nlc3NpbmcgPSBmYWxzZTtcblxuICAvLyB0aGUgY2FsbGJhY2sgdGhhdCdzIHBhc3NlZCB0byBfd3JpdGUoY2h1bmssY2IpXG4gIHRoaXMub253cml0ZSA9IGZ1bmN0aW9uKGVyKSB7XG4gICAgb253cml0ZShzdHJlYW0sIGVyKTtcbiAgfTtcblxuICAvLyB0aGUgY2FsbGJhY2sgdGhhdCB0aGUgdXNlciBzdXBwbGllcyB0byB3cml0ZShjaHVuayxlbmNvZGluZyxjYilcbiAgdGhpcy53cml0ZWNiID0gbnVsbDtcblxuICAvLyB0aGUgYW1vdW50IHRoYXQgaXMgYmVpbmcgd3JpdHRlbiB3aGVuIF93cml0ZSBpcyBjYWxsZWQuXG4gIHRoaXMud3JpdGVsZW4gPSAwO1xuXG4gIHRoaXMuYnVmZmVyID0gW107XG5cbiAgLy8gVHJ1ZSBpZiB0aGUgZXJyb3Igd2FzIGFscmVhZHkgZW1pdHRlZCBhbmQgc2hvdWxkIG5vdCBiZSB0aHJvd24gYWdhaW5cbiAgdGhpcy5lcnJvckVtaXR0ZWQgPSBmYWxzZTtcbn1cblxuZnVuY3Rpb24gV3JpdGFibGUob3B0aW9ucykge1xuICB2YXIgRHVwbGV4ID0gcmVxdWlyZSgnLi9fc3RyZWFtX2R1cGxleCcpO1xuXG4gIC8vIFdyaXRhYmxlIGN0b3IgaXMgYXBwbGllZCB0byBEdXBsZXhlcywgdGhvdWdoIHRoZXkncmUgbm90XG4gIC8vIGluc3RhbmNlb2YgV3JpdGFibGUsIHRoZXkncmUgaW5zdGFuY2VvZiBSZWFkYWJsZS5cbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFdyaXRhYmxlKSAmJiAhKHRoaXMgaW5zdGFuY2VvZiBEdXBsZXgpKVxuICAgIHJldHVybiBuZXcgV3JpdGFibGUob3B0aW9ucyk7XG5cbiAgdGhpcy5fd3JpdGFibGVTdGF0ZSA9IG5ldyBXcml0YWJsZVN0YXRlKG9wdGlvbnMsIHRoaXMpO1xuXG4gIC8vIGxlZ2FjeS5cbiAgdGhpcy53cml0YWJsZSA9IHRydWU7XG5cbiAgU3RyZWFtLmNhbGwodGhpcyk7XG59XG5cbi8vIE90aGVyd2lzZSBwZW9wbGUgY2FuIHBpcGUgV3JpdGFibGUgc3RyZWFtcywgd2hpY2ggaXMganVzdCB3cm9uZy5cbldyaXRhYmxlLnByb3RvdHlwZS5waXBlID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuZW1pdCgnZXJyb3InLCBuZXcgRXJyb3IoJ0Nhbm5vdCBwaXBlLiBOb3QgcmVhZGFibGUuJykpO1xufTtcblxuXG5mdW5jdGlvbiB3cml0ZUFmdGVyRW5kKHN0cmVhbSwgc3RhdGUsIGNiKSB7XG4gIHZhciBlciA9IG5ldyBFcnJvcignd3JpdGUgYWZ0ZXIgZW5kJyk7XG4gIC8vIFRPRE86IGRlZmVyIGVycm9yIGV2ZW50cyBjb25zaXN0ZW50bHkgZXZlcnl3aGVyZSwgbm90IGp1c3QgdGhlIGNiXG4gIHN0cmVhbS5lbWl0KCdlcnJvcicsIGVyKTtcbiAgcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbigpIHtcbiAgICBjYihlcik7XG4gIH0pO1xufVxuXG4vLyBJZiB3ZSBnZXQgc29tZXRoaW5nIHRoYXQgaXMgbm90IGEgYnVmZmVyLCBzdHJpbmcsIG51bGwsIG9yIHVuZGVmaW5lZCxcbi8vIGFuZCB3ZSdyZSBub3QgaW4gb2JqZWN0TW9kZSwgdGhlbiB0aGF0J3MgYW4gZXJyb3IuXG4vLyBPdGhlcndpc2Ugc3RyZWFtIGNodW5rcyBhcmUgYWxsIGNvbnNpZGVyZWQgdG8gYmUgb2YgbGVuZ3RoPTEsIGFuZCB0aGVcbi8vIHdhdGVybWFya3MgZGV0ZXJtaW5lIGhvdyBtYW55IG9iamVjdHMgdG8ga2VlcCBpbiB0aGUgYnVmZmVyLCByYXRoZXIgdGhhblxuLy8gaG93IG1hbnkgYnl0ZXMgb3IgY2hhcmFjdGVycy5cbmZ1bmN0aW9uIHZhbGlkQ2h1bmsoc3RyZWFtLCBzdGF0ZSwgY2h1bmssIGNiKSB7XG4gIHZhciB2YWxpZCA9IHRydWU7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKGNodW5rKSAmJlxuICAgICAgJ3N0cmluZycgIT09IHR5cGVvZiBjaHVuayAmJlxuICAgICAgY2h1bmsgIT09IG51bGwgJiZcbiAgICAgIGNodW5rICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICFzdGF0ZS5vYmplY3RNb2RlKSB7XG4gICAgdmFyIGVyID0gbmV3IFR5cGVFcnJvcignSW52YWxpZCBub24tc3RyaW5nL2J1ZmZlciBjaHVuaycpO1xuICAgIHN0cmVhbS5lbWl0KCdlcnJvcicsIGVyKTtcbiAgICBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uKCkge1xuICAgICAgY2IoZXIpO1xuICAgIH0pO1xuICAgIHZhbGlkID0gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHZhbGlkO1xufVxuXG5Xcml0YWJsZS5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbihjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3dyaXRhYmxlU3RhdGU7XG4gIHZhciByZXQgPSBmYWxzZTtcblxuICBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2IgPSBlbmNvZGluZztcbiAgICBlbmNvZGluZyA9IG51bGw7XG4gIH1cblxuICBpZiAoQnVmZmVyLmlzQnVmZmVyKGNodW5rKSlcbiAgICBlbmNvZGluZyA9ICdidWZmZXInO1xuICBlbHNlIGlmICghZW5jb2RpbmcpXG4gICAgZW5jb2RpbmcgPSBzdGF0ZS5kZWZhdWx0RW5jb2Rpbmc7XG5cbiAgaWYgKHR5cGVvZiBjYiAhPT0gJ2Z1bmN0aW9uJylcbiAgICBjYiA9IGZ1bmN0aW9uKCkge307XG5cbiAgaWYgKHN0YXRlLmVuZGVkKVxuICAgIHdyaXRlQWZ0ZXJFbmQodGhpcywgc3RhdGUsIGNiKTtcbiAgZWxzZSBpZiAodmFsaWRDaHVuayh0aGlzLCBzdGF0ZSwgY2h1bmssIGNiKSlcbiAgICByZXQgPSB3cml0ZU9yQnVmZmVyKHRoaXMsIHN0YXRlLCBjaHVuaywgZW5jb2RpbmcsIGNiKTtcblxuICByZXR1cm4gcmV0O1xufTtcblxuZnVuY3Rpb24gZGVjb2RlQ2h1bmsoc3RhdGUsIGNodW5rLCBlbmNvZGluZykge1xuICBpZiAoIXN0YXRlLm9iamVjdE1vZGUgJiZcbiAgICAgIHN0YXRlLmRlY29kZVN0cmluZ3MgIT09IGZhbHNlICYmXG4gICAgICB0eXBlb2YgY2h1bmsgPT09ICdzdHJpbmcnKSB7XG4gICAgY2h1bmsgPSBuZXcgQnVmZmVyKGNodW5rLCBlbmNvZGluZyk7XG4gIH1cbiAgcmV0dXJuIGNodW5rO1xufVxuXG4vLyBpZiB3ZSdyZSBhbHJlYWR5IHdyaXRpbmcgc29tZXRoaW5nLCB0aGVuIGp1c3QgcHV0IHRoaXNcbi8vIGluIHRoZSBxdWV1ZSwgYW5kIHdhaXQgb3VyIHR1cm4uICBPdGhlcndpc2UsIGNhbGwgX3dyaXRlXG4vLyBJZiB3ZSByZXR1cm4gZmFsc2UsIHRoZW4gd2UgbmVlZCBhIGRyYWluIGV2ZW50LCBzbyBzZXQgdGhhdCBmbGFnLlxuZnVuY3Rpb24gd3JpdGVPckJ1ZmZlcihzdHJlYW0sIHN0YXRlLCBjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIGNodW5rID0gZGVjb2RlQ2h1bmsoc3RhdGUsIGNodW5rLCBlbmNvZGluZyk7XG4gIGlmIChCdWZmZXIuaXNCdWZmZXIoY2h1bmspKVxuICAgIGVuY29kaW5nID0gJ2J1ZmZlcic7XG4gIHZhciBsZW4gPSBzdGF0ZS5vYmplY3RNb2RlID8gMSA6IGNodW5rLmxlbmd0aDtcblxuICBzdGF0ZS5sZW5ndGggKz0gbGVuO1xuXG4gIHZhciByZXQgPSBzdGF0ZS5sZW5ndGggPCBzdGF0ZS5oaWdoV2F0ZXJNYXJrO1xuICAvLyB3ZSBtdXN0IGVuc3VyZSB0aGF0IHByZXZpb3VzIG5lZWREcmFpbiB3aWxsIG5vdCBiZSByZXNldCB0byBmYWxzZS5cbiAgaWYgKCFyZXQpXG4gICAgc3RhdGUubmVlZERyYWluID0gdHJ1ZTtcblxuICBpZiAoc3RhdGUud3JpdGluZylcbiAgICBzdGF0ZS5idWZmZXIucHVzaChuZXcgV3JpdGVSZXEoY2h1bmssIGVuY29kaW5nLCBjYikpO1xuICBlbHNlXG4gICAgZG9Xcml0ZShzdHJlYW0sIHN0YXRlLCBsZW4sIGNodW5rLCBlbmNvZGluZywgY2IpO1xuXG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIGRvV3JpdGUoc3RyZWFtLCBzdGF0ZSwgbGVuLCBjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIHN0YXRlLndyaXRlbGVuID0gbGVuO1xuICBzdGF0ZS53cml0ZWNiID0gY2I7XG4gIHN0YXRlLndyaXRpbmcgPSB0cnVlO1xuICBzdGF0ZS5zeW5jID0gdHJ1ZTtcbiAgc3RyZWFtLl93cml0ZShjaHVuaywgZW5jb2RpbmcsIHN0YXRlLm9ud3JpdGUpO1xuICBzdGF0ZS5zeW5jID0gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIG9ud3JpdGVFcnJvcihzdHJlYW0sIHN0YXRlLCBzeW5jLCBlciwgY2IpIHtcbiAgaWYgKHN5bmMpXG4gICAgcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbigpIHtcbiAgICAgIGNiKGVyKTtcbiAgICB9KTtcbiAgZWxzZVxuICAgIGNiKGVyKTtcblxuICBzdHJlYW0uX3dyaXRhYmxlU3RhdGUuZXJyb3JFbWl0dGVkID0gdHJ1ZTtcbiAgc3RyZWFtLmVtaXQoJ2Vycm9yJywgZXIpO1xufVxuXG5mdW5jdGlvbiBvbndyaXRlU3RhdGVVcGRhdGUoc3RhdGUpIHtcbiAgc3RhdGUud3JpdGluZyA9IGZhbHNlO1xuICBzdGF0ZS53cml0ZWNiID0gbnVsbDtcbiAgc3RhdGUubGVuZ3RoIC09IHN0YXRlLndyaXRlbGVuO1xuICBzdGF0ZS53cml0ZWxlbiA9IDA7XG59XG5cbmZ1bmN0aW9uIG9ud3JpdGUoc3RyZWFtLCBlcikge1xuICB2YXIgc3RhdGUgPSBzdHJlYW0uX3dyaXRhYmxlU3RhdGU7XG4gIHZhciBzeW5jID0gc3RhdGUuc3luYztcbiAgdmFyIGNiID0gc3RhdGUud3JpdGVjYjtcblxuICBvbndyaXRlU3RhdGVVcGRhdGUoc3RhdGUpO1xuXG4gIGlmIChlcilcbiAgICBvbndyaXRlRXJyb3Ioc3RyZWFtLCBzdGF0ZSwgc3luYywgZXIsIGNiKTtcbiAgZWxzZSB7XG4gICAgLy8gQ2hlY2sgaWYgd2UncmUgYWN0dWFsbHkgcmVhZHkgdG8gZmluaXNoLCBidXQgZG9uJ3QgZW1pdCB5ZXRcbiAgICB2YXIgZmluaXNoZWQgPSBuZWVkRmluaXNoKHN0cmVhbSwgc3RhdGUpO1xuXG4gICAgaWYgKCFmaW5pc2hlZCAmJiAhc3RhdGUuYnVmZmVyUHJvY2Vzc2luZyAmJiBzdGF0ZS5idWZmZXIubGVuZ3RoKVxuICAgICAgY2xlYXJCdWZmZXIoc3RyZWFtLCBzdGF0ZSk7XG5cbiAgICBpZiAoc3luYykge1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbigpIHtcbiAgICAgICAgYWZ0ZXJXcml0ZShzdHJlYW0sIHN0YXRlLCBmaW5pc2hlZCwgY2IpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFmdGVyV3JpdGUoc3RyZWFtLCBzdGF0ZSwgZmluaXNoZWQsIGNiKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gYWZ0ZXJXcml0ZShzdHJlYW0sIHN0YXRlLCBmaW5pc2hlZCwgY2IpIHtcbiAgaWYgKCFmaW5pc2hlZClcbiAgICBvbndyaXRlRHJhaW4oc3RyZWFtLCBzdGF0ZSk7XG4gIGNiKCk7XG4gIGlmIChmaW5pc2hlZClcbiAgICBmaW5pc2hNYXliZShzdHJlYW0sIHN0YXRlKTtcbn1cblxuLy8gTXVzdCBmb3JjZSBjYWxsYmFjayB0byBiZSBjYWxsZWQgb24gbmV4dFRpY2ssIHNvIHRoYXQgd2UgZG9uJ3Rcbi8vIGVtaXQgJ2RyYWluJyBiZWZvcmUgdGhlIHdyaXRlKCkgY29uc3VtZXIgZ2V0cyB0aGUgJ2ZhbHNlJyByZXR1cm5cbi8vIHZhbHVlLCBhbmQgaGFzIGEgY2hhbmNlIHRvIGF0dGFjaCBhICdkcmFpbicgbGlzdGVuZXIuXG5mdW5jdGlvbiBvbndyaXRlRHJhaW4oc3RyZWFtLCBzdGF0ZSkge1xuICBpZiAoc3RhdGUubGVuZ3RoID09PSAwICYmIHN0YXRlLm5lZWREcmFpbikge1xuICAgIHN0YXRlLm5lZWREcmFpbiA9IGZhbHNlO1xuICAgIHN0cmVhbS5lbWl0KCdkcmFpbicpO1xuICB9XG59XG5cblxuLy8gaWYgdGhlcmUncyBzb21ldGhpbmcgaW4gdGhlIGJ1ZmZlciB3YWl0aW5nLCB0aGVuIHByb2Nlc3MgaXRcbmZ1bmN0aW9uIGNsZWFyQnVmZmVyKHN0cmVhbSwgc3RhdGUpIHtcbiAgc3RhdGUuYnVmZmVyUHJvY2Vzc2luZyA9IHRydWU7XG5cbiAgZm9yICh2YXIgYyA9IDA7IGMgPCBzdGF0ZS5idWZmZXIubGVuZ3RoOyBjKyspIHtcbiAgICB2YXIgZW50cnkgPSBzdGF0ZS5idWZmZXJbY107XG4gICAgdmFyIGNodW5rID0gZW50cnkuY2h1bms7XG4gICAgdmFyIGVuY29kaW5nID0gZW50cnkuZW5jb2Rpbmc7XG4gICAgdmFyIGNiID0gZW50cnkuY2FsbGJhY2s7XG4gICAgdmFyIGxlbiA9IHN0YXRlLm9iamVjdE1vZGUgPyAxIDogY2h1bmsubGVuZ3RoO1xuXG4gICAgZG9Xcml0ZShzdHJlYW0sIHN0YXRlLCBsZW4sIGNodW5rLCBlbmNvZGluZywgY2IpO1xuXG4gICAgLy8gaWYgd2UgZGlkbid0IGNhbGwgdGhlIG9ud3JpdGUgaW1tZWRpYXRlbHksIHRoZW5cbiAgICAvLyBpdCBtZWFucyB0aGF0IHdlIG5lZWQgdG8gd2FpdCB1bnRpbCBpdCBkb2VzLlxuICAgIC8vIGFsc28sIHRoYXQgbWVhbnMgdGhhdCB0aGUgY2h1bmsgYW5kIGNiIGFyZSBjdXJyZW50bHlcbiAgICAvLyBiZWluZyBwcm9jZXNzZWQsIHNvIG1vdmUgdGhlIGJ1ZmZlciBjb3VudGVyIHBhc3QgdGhlbS5cbiAgICBpZiAoc3RhdGUud3JpdGluZykge1xuICAgICAgYysrO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgc3RhdGUuYnVmZmVyUHJvY2Vzc2luZyA9IGZhbHNlO1xuICBpZiAoYyA8IHN0YXRlLmJ1ZmZlci5sZW5ndGgpXG4gICAgc3RhdGUuYnVmZmVyID0gc3RhdGUuYnVmZmVyLnNsaWNlKGMpO1xuICBlbHNlXG4gICAgc3RhdGUuYnVmZmVyLmxlbmd0aCA9IDA7XG59XG5cbldyaXRhYmxlLnByb3RvdHlwZS5fd3JpdGUgPSBmdW5jdGlvbihjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIGNiKG5ldyBFcnJvcignbm90IGltcGxlbWVudGVkJykpO1xufTtcblxuV3JpdGFibGUucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fd3JpdGFibGVTdGF0ZTtcblxuICBpZiAodHlwZW9mIGNodW5rID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2IgPSBjaHVuaztcbiAgICBjaHVuayA9IG51bGw7XG4gICAgZW5jb2RpbmcgPSBudWxsO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNiID0gZW5jb2Rpbmc7XG4gICAgZW5jb2RpbmcgPSBudWxsO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBjaHVuayAhPT0gJ3VuZGVmaW5lZCcgJiYgY2h1bmsgIT09IG51bGwpXG4gICAgdGhpcy53cml0ZShjaHVuaywgZW5jb2RpbmcpO1xuXG4gIC8vIGlnbm9yZSB1bm5lY2Vzc2FyeSBlbmQoKSBjYWxscy5cbiAgaWYgKCFzdGF0ZS5lbmRpbmcgJiYgIXN0YXRlLmZpbmlzaGVkKVxuICAgIGVuZFdyaXRhYmxlKHRoaXMsIHN0YXRlLCBjYik7XG59O1xuXG5cbmZ1bmN0aW9uIG5lZWRGaW5pc2goc3RyZWFtLCBzdGF0ZSkge1xuICByZXR1cm4gKHN0YXRlLmVuZGluZyAmJlxuICAgICAgICAgIHN0YXRlLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgICAgICFzdGF0ZS5maW5pc2hlZCAmJlxuICAgICAgICAgICFzdGF0ZS53cml0aW5nKTtcbn1cblxuZnVuY3Rpb24gZmluaXNoTWF5YmUoc3RyZWFtLCBzdGF0ZSkge1xuICB2YXIgbmVlZCA9IG5lZWRGaW5pc2goc3RyZWFtLCBzdGF0ZSk7XG4gIGlmIChuZWVkKSB7XG4gICAgc3RhdGUuZmluaXNoZWQgPSB0cnVlO1xuICAgIHN0cmVhbS5lbWl0KCdmaW5pc2gnKTtcbiAgfVxuICByZXR1cm4gbmVlZDtcbn1cblxuZnVuY3Rpb24gZW5kV3JpdGFibGUoc3RyZWFtLCBzdGF0ZSwgY2IpIHtcbiAgc3RhdGUuZW5kaW5nID0gdHJ1ZTtcbiAgZmluaXNoTWF5YmUoc3RyZWFtLCBzdGF0ZSk7XG4gIGlmIChjYikge1xuICAgIGlmIChzdGF0ZS5maW5pc2hlZClcbiAgICAgIHByb2Nlc3MubmV4dFRpY2soY2IpO1xuICAgIGVsc2VcbiAgICAgIHN0cmVhbS5vbmNlKCdmaW5pc2gnLCBjYik7XG4gIH1cbiAgc3RhdGUuZW5kZWQgPSB0cnVlO1xufVxuIiwidmFyIFRyYW5zZm9ybSA9IHJlcXVpcmUoJ3JlYWRhYmxlLXN0cmVhbS90cmFuc2Zvcm0nKVxuICAsIGluaGVyaXRzICA9IHJlcXVpcmUoJ3V0aWwnKS5pbmhlcml0c1xuICAsIHh0ZW5kICAgICA9IHJlcXVpcmUoJ3h0ZW5kJylcblxuZnVuY3Rpb24gRGVzdHJveWFibGVUcmFuc2Zvcm0ob3B0cykge1xuICBUcmFuc2Zvcm0uY2FsbCh0aGlzLCBvcHRzKVxuICB0aGlzLl9kZXN0cm95ZWQgPSBmYWxzZVxufVxuXG5pbmhlcml0cyhEZXN0cm95YWJsZVRyYW5zZm9ybSwgVHJhbnNmb3JtKVxuXG5EZXN0cm95YWJsZVRyYW5zZm9ybS5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uKGVycikge1xuICBpZiAodGhpcy5fZGVzdHJveWVkKSByZXR1cm5cbiAgdGhpcy5fZGVzdHJveWVkID0gdHJ1ZVxuICBcbiAgdmFyIHNlbGYgPSB0aGlzXG4gIHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24oKSB7XG4gICAgaWYgKGVycilcbiAgICAgIHNlbGYuZW1pdCgnZXJyb3InLCBlcnIpXG4gICAgc2VsZi5lbWl0KCdjbG9zZScpXG4gIH0pXG59XG5cbi8vIGEgbm9vcCBfdHJhbnNmb3JtIGZ1bmN0aW9uXG5mdW5jdGlvbiBub29wIChjaHVuaywgZW5jLCBjYWxsYmFjaykge1xuICBjYWxsYmFjayhudWxsLCBjaHVuaylcbn1cblxuXG4vLyBjcmVhdGUgYSBuZXcgZXhwb3J0IGZ1bmN0aW9uLCB1c2VkIGJ5IGJvdGggdGhlIG1haW4gZXhwb3J0IGFuZFxuLy8gdGhlIC5jdG9yIGV4cG9ydCwgY29udGFpbnMgY29tbW9uIGxvZ2ljIGZvciBkZWFsaW5nIHdpdGggYXJndW1lbnRzXG5mdW5jdGlvbiB0aHJvdWdoMiAoY29uc3RydWN0KSB7XG4gIHJldHVybiBmdW5jdGlvbiAob3B0aW9ucywgdHJhbnNmb3JtLCBmbHVzaCkge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PSAnZnVuY3Rpb24nKSB7XG4gICAgICBmbHVzaCAgICAgPSB0cmFuc2Zvcm1cbiAgICAgIHRyYW5zZm9ybSA9IG9wdGlvbnNcbiAgICAgIG9wdGlvbnMgICA9IHt9XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB0cmFuc2Zvcm0gIT0gJ2Z1bmN0aW9uJylcbiAgICAgIHRyYW5zZm9ybSA9IG5vb3BcblxuICAgIGlmICh0eXBlb2YgZmx1c2ggIT0gJ2Z1bmN0aW9uJylcbiAgICAgIGZsdXNoID0gbnVsbFxuXG4gICAgcmV0dXJuIGNvbnN0cnVjdChvcHRpb25zLCB0cmFuc2Zvcm0sIGZsdXNoKVxuICB9XG59XG5cblxuLy8gbWFpbiBleHBvcnQsIGp1c3QgbWFrZSBtZSBhIHRyYW5zZm9ybSBzdHJlYW0hXG5tb2R1bGUuZXhwb3J0cyA9IHRocm91Z2gyKGZ1bmN0aW9uIChvcHRpb25zLCB0cmFuc2Zvcm0sIGZsdXNoKSB7XG4gIHZhciB0MiA9IG5ldyBEZXN0cm95YWJsZVRyYW5zZm9ybShvcHRpb25zKVxuXG4gIHQyLl90cmFuc2Zvcm0gPSB0cmFuc2Zvcm1cblxuICBpZiAoZmx1c2gpXG4gICAgdDIuX2ZsdXNoID0gZmx1c2hcblxuICByZXR1cm4gdDJcbn0pXG5cblxuLy8gbWFrZSBtZSBhIHJldXNhYmxlIHByb3RvdHlwZSB0aGF0IEkgY2FuIGBuZXdgLCBvciBpbXBsaWNpdGx5IGBuZXdgXG4vLyB3aXRoIGEgY29uc3RydWN0b3IgY2FsbFxubW9kdWxlLmV4cG9ydHMuY3RvciA9IHRocm91Z2gyKGZ1bmN0aW9uIChvcHRpb25zLCB0cmFuc2Zvcm0sIGZsdXNoKSB7XG4gIGZ1bmN0aW9uIFRocm91Z2gyIChvdmVycmlkZSkge1xuICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBUaHJvdWdoMikpXG4gICAgICByZXR1cm4gbmV3IFRocm91Z2gyKG92ZXJyaWRlKVxuXG4gICAgdGhpcy5vcHRpb25zID0geHRlbmQob3B0aW9ucywgb3ZlcnJpZGUpXG5cbiAgICBEZXN0cm95YWJsZVRyYW5zZm9ybS5jYWxsKHRoaXMsIHRoaXMub3B0aW9ucylcbiAgfVxuXG4gIGluaGVyaXRzKFRocm91Z2gyLCBEZXN0cm95YWJsZVRyYW5zZm9ybSlcblxuICBUaHJvdWdoMi5wcm90b3R5cGUuX3RyYW5zZm9ybSA9IHRyYW5zZm9ybVxuXG4gIGlmIChmbHVzaClcbiAgICBUaHJvdWdoMi5wcm90b3R5cGUuX2ZsdXNoID0gZmx1c2hcblxuICByZXR1cm4gVGhyb3VnaDJcbn0pXG5cblxubW9kdWxlLmV4cG9ydHMub2JqID0gdGhyb3VnaDIoZnVuY3Rpb24gKG9wdGlvbnMsIHRyYW5zZm9ybSwgZmx1c2gpIHtcbiAgdmFyIHQyID0gbmV3IERlc3Ryb3lhYmxlVHJhbnNmb3JtKHh0ZW5kKHsgb2JqZWN0TW9kZTogdHJ1ZSwgaGlnaFdhdGVyTWFyazogMTYgfSwgb3B0aW9ucykpXG5cbiAgdDIuX3RyYW5zZm9ybSA9IHRyYW5zZm9ybVxuXG4gIGlmIChmbHVzaClcbiAgICB0Mi5fZmx1c2ggPSBmbHVzaFxuXG4gIHJldHVybiB0MlxufSlcbiIsIlxuZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gdHJpbTtcblxuZnVuY3Rpb24gdHJpbShzdHIpe1xuICByZXR1cm4gc3RyLnJlcGxhY2UoL15cXHMqfFxccyokL2csICcnKTtcbn1cblxuZXhwb3J0cy5sZWZ0ID0gZnVuY3Rpb24oc3RyKXtcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC9eXFxzKi8sICcnKTtcbn07XG5cbmV4cG9ydHMucmlnaHQgPSBmdW5jdGlvbihzdHIpe1xuICByZXR1cm4gc3RyLnJlcGxhY2UoL1xccyokLywgJycpO1xufTtcbiIsIlxuLyoqXG4gKiBNb2R1bGUgZXhwb3J0cy5cbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGRlcHJlY2F0ZTtcblxuLyoqXG4gKiBNYXJrIHRoYXQgYSBtZXRob2Qgc2hvdWxkIG5vdCBiZSB1c2VkLlxuICogUmV0dXJucyBhIG1vZGlmaWVkIGZ1bmN0aW9uIHdoaWNoIHdhcm5zIG9uY2UgYnkgZGVmYXVsdC5cbiAqXG4gKiBJZiBgbG9jYWxTdG9yYWdlLm5vRGVwcmVjYXRpb24gPSB0cnVlYCBpcyBzZXQsIHRoZW4gaXQgaXMgYSBuby1vcC5cbiAqXG4gKiBJZiBgbG9jYWxTdG9yYWdlLnRocm93RGVwcmVjYXRpb24gPSB0cnVlYCBpcyBzZXQsIHRoZW4gZGVwcmVjYXRlZCBmdW5jdGlvbnNcbiAqIHdpbGwgdGhyb3cgYW4gRXJyb3Igd2hlbiBpbnZva2VkLlxuICpcbiAqIElmIGBsb2NhbFN0b3JhZ2UudHJhY2VEZXByZWNhdGlvbiA9IHRydWVgIGlzIHNldCwgdGhlbiBkZXByZWNhdGVkIGZ1bmN0aW9uc1xuICogd2lsbCBpbnZva2UgYGNvbnNvbGUudHJhY2UoKWAgaW5zdGVhZCBvZiBgY29uc29sZS5lcnJvcigpYC5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiAtIHRoZSBmdW5jdGlvbiB0byBkZXByZWNhdGVcbiAqIEBwYXJhbSB7U3RyaW5nfSBtc2cgLSB0aGUgc3RyaW5nIHRvIHByaW50IHRvIHRoZSBjb25zb2xlIHdoZW4gYGZuYCBpcyBpbnZva2VkXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IGEgbmV3IFwiZGVwcmVjYXRlZFwiIHZlcnNpb24gb2YgYGZuYFxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBkZXByZWNhdGUgKGZuLCBtc2cpIHtcbiAgaWYgKGNvbmZpZygnbm9EZXByZWNhdGlvbicpKSB7XG4gICAgcmV0dXJuIGZuO1xuICB9XG5cbiAgdmFyIHdhcm5lZCA9IGZhbHNlO1xuICBmdW5jdGlvbiBkZXByZWNhdGVkKCkge1xuICAgIGlmICghd2FybmVkKSB7XG4gICAgICBpZiAoY29uZmlnKCd0aHJvd0RlcHJlY2F0aW9uJykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1zZyk7XG4gICAgICB9IGVsc2UgaWYgKGNvbmZpZygndHJhY2VEZXByZWNhdGlvbicpKSB7XG4gICAgICAgIGNvbnNvbGUudHJhY2UobXNnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUud2Fybihtc2cpO1xuICAgICAgfVxuICAgICAgd2FybmVkID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cblxuICByZXR1cm4gZGVwcmVjYXRlZDtcbn1cblxuLyoqXG4gKiBDaGVja3MgYGxvY2FsU3RvcmFnZWAgZm9yIGJvb2xlYW4gdmFsdWVzIGZvciB0aGUgZ2l2ZW4gYG5hbWVgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGNvbmZpZyAobmFtZSkge1xuICAvLyBhY2Nlc3NpbmcgZ2xvYmFsLmxvY2FsU3RvcmFnZSBjYW4gdHJpZ2dlciBhIERPTUV4Y2VwdGlvbiBpbiBzYW5kYm94ZWQgaWZyYW1lc1xuICB0cnkge1xuICAgIGlmICghZ2xvYmFsLmxvY2FsU3RvcmFnZSkgcmV0dXJuIGZhbHNlO1xuICB9IGNhdGNoIChfKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciB2YWwgPSBnbG9iYWwubG9jYWxTdG9yYWdlW25hbWVdO1xuICBpZiAobnVsbCA9PSB2YWwpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIFN0cmluZyh2YWwpLnRvTG93ZXJDYXNlKCkgPT09ICd0cnVlJztcbn1cbiIsIlxudmFyIE4xID0gTWF0aC5wb3coMiwgIDcpXG52YXIgTjIgPSBNYXRoLnBvdygyLCAxNClcbnZhciBOMyA9IE1hdGgucG93KDIsIDIxKVxudmFyIE40ID0gTWF0aC5wb3coMiwgMjgpXG52YXIgTjUgPSBNYXRoLnBvdygyLCAzNSlcbnZhciBONiA9IE1hdGgucG93KDIsIDQyKVxudmFyIE43ID0gTWF0aC5wb3coMiwgNDkpXG52YXIgTjggPSBNYXRoLnBvdygyLCA1NilcbnZhciBOOSA9IE1hdGgucG93KDIsIDYzKVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICByZXR1cm4gKFxuICAgIHZhbHVlIDwgTjEgPyAxXG4gIDogdmFsdWUgPCBOMiA/IDJcbiAgOiB2YWx1ZSA8IE4zID8gM1xuICA6IHZhbHVlIDwgTjQgPyA0XG4gIDogdmFsdWUgPCBONSA/IDVcbiAgOiB2YWx1ZSA8IE42ID8gNlxuICA6IHZhbHVlIDwgTjcgPyA3XG4gIDogdmFsdWUgPCBOOCA/IDhcbiAgOiB2YWx1ZSA8IE45ID8gOVxuICA6ICAgICAgICAgICAgICAxMFxuICApXG59XG4iLCJ2YXIgY3JlYXRlRWxlbWVudCA9IHJlcXVpcmUoXCIuL3Zkb20vY3JlYXRlLWVsZW1lbnQuanNcIilcblxubW9kdWxlLmV4cG9ydHMgPSBjcmVhdGVFbGVtZW50XG4iLCJ2YXIgZGlmZiA9IHJlcXVpcmUoXCIuL3Z0cmVlL2RpZmYuanNcIilcblxubW9kdWxlLmV4cG9ydHMgPSBkaWZmXG4iLCJ2YXIgaCA9IHJlcXVpcmUoXCIuL3ZpcnR1YWwtaHlwZXJzY3JpcHQvaW5kZXguanNcIilcblxubW9kdWxlLmV4cG9ydHMgPSBoXG4iLCJ2YXIgZGlmZiA9IHJlcXVpcmUoXCIuL2RpZmYuanNcIilcclxudmFyIHBhdGNoID0gcmVxdWlyZShcIi4vcGF0Y2guanNcIilcclxudmFyIGggPSByZXF1aXJlKFwiLi9oLmpzXCIpXHJcbnZhciBjcmVhdGUgPSByZXF1aXJlKFwiLi9jcmVhdGUtZWxlbWVudC5qc1wiKVxyXG52YXIgVk5vZGUgPSByZXF1aXJlKCcuL3Zub2RlL3Zub2RlLmpzJylcclxudmFyIFZUZXh0ID0gcmVxdWlyZSgnLi92bm9kZS92dGV4dC5qcycpXHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIGRpZmY6IGRpZmYsXHJcbiAgICBwYXRjaDogcGF0Y2gsXHJcbiAgICBoOiBoLFxyXG4gICAgY3JlYXRlOiBjcmVhdGUsXHJcbiAgICBWTm9kZTogVk5vZGUsXHJcbiAgICBWVGV4dDogVlRleHRcclxufVxyXG4iLCJ2YXIgcGF0Y2ggPSByZXF1aXJlKFwiLi92ZG9tL3BhdGNoLmpzXCIpXG5cbm1vZHVsZS5leHBvcnRzID0gcGF0Y2hcbiIsInZhciBpc09iamVjdCA9IHJlcXVpcmUoXCJpcy1vYmplY3RcIilcbnZhciBpc0hvb2sgPSByZXF1aXJlKFwiLi4vdm5vZGUvaXMtdmhvb2suanNcIilcblxubW9kdWxlLmV4cG9ydHMgPSBhcHBseVByb3BlcnRpZXNcblxuZnVuY3Rpb24gYXBwbHlQcm9wZXJ0aWVzKG5vZGUsIHByb3BzLCBwcmV2aW91cykge1xuICAgIGZvciAodmFyIHByb3BOYW1lIGluIHByb3BzKSB7XG4gICAgICAgIHZhciBwcm9wVmFsdWUgPSBwcm9wc1twcm9wTmFtZV1cblxuICAgICAgICBpZiAocHJvcFZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJlbW92ZVByb3BlcnR5KG5vZGUsIHByb3BOYW1lLCBwcm9wVmFsdWUsIHByZXZpb3VzKTtcbiAgICAgICAgfSBlbHNlIGlmIChpc0hvb2socHJvcFZhbHVlKSkge1xuICAgICAgICAgICAgcmVtb3ZlUHJvcGVydHkobm9kZSwgcHJvcE5hbWUsIHByb3BWYWx1ZSwgcHJldmlvdXMpXG4gICAgICAgICAgICBpZiAocHJvcFZhbHVlLmhvb2spIHtcbiAgICAgICAgICAgICAgICBwcm9wVmFsdWUuaG9vayhub2RlLFxuICAgICAgICAgICAgICAgICAgICBwcm9wTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgcHJldmlvdXMgPyBwcmV2aW91c1twcm9wTmFtZV0gOiB1bmRlZmluZWQpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoaXNPYmplY3QocHJvcFZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHBhdGNoT2JqZWN0KG5vZGUsIHByb3BzLCBwcmV2aW91cywgcHJvcE5hbWUsIHByb3BWYWx1ZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG5vZGVbcHJvcE5hbWVdID0gcHJvcFZhbHVlXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmZ1bmN0aW9uIHJlbW92ZVByb3BlcnR5KG5vZGUsIHByb3BOYW1lLCBwcm9wVmFsdWUsIHByZXZpb3VzKSB7XG4gICAgaWYgKHByZXZpb3VzKSB7XG4gICAgICAgIHZhciBwcmV2aW91c1ZhbHVlID0gcHJldmlvdXNbcHJvcE5hbWVdXG5cbiAgICAgICAgaWYgKCFpc0hvb2socHJldmlvdXNWYWx1ZSkpIHtcbiAgICAgICAgICAgIGlmIChwcm9wTmFtZSA9PT0gXCJhdHRyaWJ1dGVzXCIpIHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBhdHRyTmFtZSBpbiBwcmV2aW91c1ZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKGF0dHJOYW1lKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvcE5hbWUgPT09IFwic3R5bGVcIikge1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgaW4gcHJldmlvdXNWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBub2RlLnN0eWxlW2ldID0gXCJcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHByZXZpb3VzVmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICBub2RlW3Byb3BOYW1lXSA9IFwiXCJcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbm9kZVtwcm9wTmFtZV0gPSBudWxsXG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAocHJldmlvdXNWYWx1ZS51bmhvb2spIHtcbiAgICAgICAgICAgIHByZXZpb3VzVmFsdWUudW5ob29rKG5vZGUsIHByb3BOYW1lLCBwcm9wVmFsdWUpXG4gICAgICAgIH1cbiAgICB9XG59XG5cbmZ1bmN0aW9uIHBhdGNoT2JqZWN0KG5vZGUsIHByb3BzLCBwcmV2aW91cywgcHJvcE5hbWUsIHByb3BWYWx1ZSkge1xuICAgIHZhciBwcmV2aW91c1ZhbHVlID0gcHJldmlvdXMgPyBwcmV2aW91c1twcm9wTmFtZV0gOiB1bmRlZmluZWRcblxuICAgIC8vIFNldCBhdHRyaWJ1dGVzXG4gICAgaWYgKHByb3BOYW1lID09PSBcImF0dHJpYnV0ZXNcIikge1xuICAgICAgICBmb3IgKHZhciBhdHRyTmFtZSBpbiBwcm9wVmFsdWUpIHtcbiAgICAgICAgICAgIHZhciBhdHRyVmFsdWUgPSBwcm9wVmFsdWVbYXR0ck5hbWVdXG5cbiAgICAgICAgICAgIGlmIChhdHRyVmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKGF0dHJOYW1lKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBub2RlLnNldEF0dHJpYnV0ZShhdHRyTmFtZSwgYXR0clZhbHVlKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYocHJldmlvdXNWYWx1ZSAmJiBpc09iamVjdChwcmV2aW91c1ZhbHVlKSAmJlxuICAgICAgICBnZXRQcm90b3R5cGUocHJldmlvdXNWYWx1ZSkgIT09IGdldFByb3RvdHlwZShwcm9wVmFsdWUpKSB7XG4gICAgICAgIG5vZGVbcHJvcE5hbWVdID0gcHJvcFZhbHVlXG4gICAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICghaXNPYmplY3Qobm9kZVtwcm9wTmFtZV0pKSB7XG4gICAgICAgIG5vZGVbcHJvcE5hbWVdID0ge31cbiAgICB9XG5cbiAgICB2YXIgcmVwbGFjZXIgPSBwcm9wTmFtZSA9PT0gXCJzdHlsZVwiID8gXCJcIiA6IHVuZGVmaW5lZFxuXG4gICAgZm9yICh2YXIgayBpbiBwcm9wVmFsdWUpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gcHJvcFZhbHVlW2tdXG4gICAgICAgIG5vZGVbcHJvcE5hbWVdW2tdID0gKHZhbHVlID09PSB1bmRlZmluZWQpID8gcmVwbGFjZXIgOiB2YWx1ZVxuICAgIH1cbn1cblxuZnVuY3Rpb24gZ2V0UHJvdG90eXBlKHZhbHVlKSB7XG4gICAgaWYgKE9iamVjdC5nZXRQcm90b3R5cGVPZikge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKVxuICAgIH0gZWxzZSBpZiAodmFsdWUuX19wcm90b19fKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZS5fX3Byb3RvX19cbiAgICB9IGVsc2UgaWYgKHZhbHVlLmNvbnN0cnVjdG9yKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZS5jb25zdHJ1Y3Rvci5wcm90b3R5cGVcbiAgICB9XG59XG4iLCJ2YXIgZG9jdW1lbnQgPSByZXF1aXJlKFwiZ2xvYmFsL2RvY3VtZW50XCIpXG5cbnZhciBhcHBseVByb3BlcnRpZXMgPSByZXF1aXJlKFwiLi9hcHBseS1wcm9wZXJ0aWVzXCIpXG5cbnZhciBpc1ZOb2RlID0gcmVxdWlyZShcIi4uL3Zub2RlL2lzLXZub2RlLmpzXCIpXG52YXIgaXNWVGV4dCA9IHJlcXVpcmUoXCIuLi92bm9kZS9pcy12dGV4dC5qc1wiKVxudmFyIGlzV2lkZ2V0ID0gcmVxdWlyZShcIi4uL3Zub2RlL2lzLXdpZGdldC5qc1wiKVxudmFyIGhhbmRsZVRodW5rID0gcmVxdWlyZShcIi4uL3Zub2RlL2hhbmRsZS10aHVuay5qc1wiKVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNyZWF0ZUVsZW1lbnRcblxuZnVuY3Rpb24gY3JlYXRlRWxlbWVudCh2bm9kZSwgb3B0cykge1xuICAgIHZhciBkb2MgPSBvcHRzID8gb3B0cy5kb2N1bWVudCB8fCBkb2N1bWVudCA6IGRvY3VtZW50XG4gICAgdmFyIHdhcm4gPSBvcHRzID8gb3B0cy53YXJuIDogbnVsbFxuXG4gICAgdm5vZGUgPSBoYW5kbGVUaHVuayh2bm9kZSkuYVxuXG4gICAgaWYgKGlzV2lkZ2V0KHZub2RlKSkge1xuICAgICAgICByZXR1cm4gdm5vZGUuaW5pdCgpXG4gICAgfSBlbHNlIGlmIChpc1ZUZXh0KHZub2RlKSkge1xuICAgICAgICByZXR1cm4gZG9jLmNyZWF0ZVRleHROb2RlKHZub2RlLnRleHQpXG4gICAgfSBlbHNlIGlmICghaXNWTm9kZSh2bm9kZSkpIHtcbiAgICAgICAgaWYgKHdhcm4pIHtcbiAgICAgICAgICAgIHdhcm4oXCJJdGVtIGlzIG5vdCBhIHZhbGlkIHZpcnR1YWwgZG9tIG5vZGVcIiwgdm5vZGUpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICB2YXIgbm9kZSA9ICh2bm9kZS5uYW1lc3BhY2UgPT09IG51bGwpID9cbiAgICAgICAgZG9jLmNyZWF0ZUVsZW1lbnQodm5vZGUudGFnTmFtZSkgOlxuICAgICAgICBkb2MuY3JlYXRlRWxlbWVudE5TKHZub2RlLm5hbWVzcGFjZSwgdm5vZGUudGFnTmFtZSlcblxuICAgIHZhciBwcm9wcyA9IHZub2RlLnByb3BlcnRpZXNcbiAgICBhcHBseVByb3BlcnRpZXMobm9kZSwgcHJvcHMpXG5cbiAgICB2YXIgY2hpbGRyZW4gPSB2bm9kZS5jaGlsZHJlblxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgY2hpbGROb2RlID0gY3JlYXRlRWxlbWVudChjaGlsZHJlbltpXSwgb3B0cylcbiAgICAgICAgaWYgKGNoaWxkTm9kZSkge1xuICAgICAgICAgICAgbm9kZS5hcHBlbmRDaGlsZChjaGlsZE5vZGUpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbm9kZVxufVxuIiwiLy8gTWFwcyBhIHZpcnR1YWwgRE9NIHRyZWUgb250byBhIHJlYWwgRE9NIHRyZWUgaW4gYW4gZWZmaWNpZW50IG1hbm5lci5cbi8vIFdlIGRvbid0IHdhbnQgdG8gcmVhZCBhbGwgb2YgdGhlIERPTSBub2RlcyBpbiB0aGUgdHJlZSBzbyB3ZSB1c2Vcbi8vIHRoZSBpbi1vcmRlciB0cmVlIGluZGV4aW5nIHRvIGVsaW1pbmF0ZSByZWN1cnNpb24gZG93biBjZXJ0YWluIGJyYW5jaGVzLlxuLy8gV2Ugb25seSByZWN1cnNlIGludG8gYSBET00gbm9kZSBpZiB3ZSBrbm93IHRoYXQgaXQgY29udGFpbnMgYSBjaGlsZCBvZlxuLy8gaW50ZXJlc3QuXG5cbnZhciBub0NoaWxkID0ge31cblxubW9kdWxlLmV4cG9ydHMgPSBkb21JbmRleFxuXG5mdW5jdGlvbiBkb21JbmRleChyb290Tm9kZSwgdHJlZSwgaW5kaWNlcywgbm9kZXMpIHtcbiAgICBpZiAoIWluZGljZXMgfHwgaW5kaWNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIHt9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgaW5kaWNlcy5zb3J0KGFzY2VuZGluZylcbiAgICAgICAgcmV0dXJuIHJlY3Vyc2Uocm9vdE5vZGUsIHRyZWUsIGluZGljZXMsIG5vZGVzLCAwKVxuICAgIH1cbn1cblxuZnVuY3Rpb24gcmVjdXJzZShyb290Tm9kZSwgdHJlZSwgaW5kaWNlcywgbm9kZXMsIHJvb3RJbmRleCkge1xuICAgIG5vZGVzID0gbm9kZXMgfHwge31cblxuXG4gICAgaWYgKHJvb3ROb2RlKSB7XG4gICAgICAgIGlmIChpbmRleEluUmFuZ2UoaW5kaWNlcywgcm9vdEluZGV4LCByb290SW5kZXgpKSB7XG4gICAgICAgICAgICBub2Rlc1tyb290SW5kZXhdID0gcm9vdE5vZGVcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciB2Q2hpbGRyZW4gPSB0cmVlLmNoaWxkcmVuXG5cbiAgICAgICAgaWYgKHZDaGlsZHJlbikge1xuXG4gICAgICAgICAgICB2YXIgY2hpbGROb2RlcyA9IHJvb3ROb2RlLmNoaWxkTm9kZXNcblxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0cmVlLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgcm9vdEluZGV4ICs9IDFcblxuICAgICAgICAgICAgICAgIHZhciB2Q2hpbGQgPSB2Q2hpbGRyZW5baV0gfHwgbm9DaGlsZFxuICAgICAgICAgICAgICAgIHZhciBuZXh0SW5kZXggPSByb290SW5kZXggKyAodkNoaWxkLmNvdW50IHx8IDApXG5cbiAgICAgICAgICAgICAgICAvLyBza2lwIHJlY3Vyc2lvbiBkb3duIHRoZSB0cmVlIGlmIHRoZXJlIGFyZSBubyBub2RlcyBkb3duIGhlcmVcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXhJblJhbmdlKGluZGljZXMsIHJvb3RJbmRleCwgbmV4dEluZGV4KSkge1xuICAgICAgICAgICAgICAgICAgICByZWN1cnNlKGNoaWxkTm9kZXNbaV0sIHZDaGlsZCwgaW5kaWNlcywgbm9kZXMsIHJvb3RJbmRleClcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByb290SW5kZXggPSBuZXh0SW5kZXhcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBub2Rlc1xufVxuXG4vLyBCaW5hcnkgc2VhcmNoIGZvciBhbiBpbmRleCBpbiB0aGUgaW50ZXJ2YWwgW2xlZnQsIHJpZ2h0XVxuZnVuY3Rpb24gaW5kZXhJblJhbmdlKGluZGljZXMsIGxlZnQsIHJpZ2h0KSB7XG4gICAgaWYgKGluZGljZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIHZhciBtaW5JbmRleCA9IDBcbiAgICB2YXIgbWF4SW5kZXggPSBpbmRpY2VzLmxlbmd0aCAtIDFcbiAgICB2YXIgY3VycmVudEluZGV4XG4gICAgdmFyIGN1cnJlbnRJdGVtXG5cbiAgICB3aGlsZSAobWluSW5kZXggPD0gbWF4SW5kZXgpIHtcbiAgICAgICAgY3VycmVudEluZGV4ID0gKChtYXhJbmRleCArIG1pbkluZGV4KSAvIDIpID4+IDBcbiAgICAgICAgY3VycmVudEl0ZW0gPSBpbmRpY2VzW2N1cnJlbnRJbmRleF1cblxuICAgICAgICBpZiAobWluSW5kZXggPT09IG1heEluZGV4KSB7XG4gICAgICAgICAgICByZXR1cm4gY3VycmVudEl0ZW0gPj0gbGVmdCAmJiBjdXJyZW50SXRlbSA8PSByaWdodFxuICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRJdGVtIDwgbGVmdCkge1xuICAgICAgICAgICAgbWluSW5kZXggPSBjdXJyZW50SW5kZXggKyAxXG4gICAgICAgIH0gZWxzZSAgaWYgKGN1cnJlbnRJdGVtID4gcmlnaHQpIHtcbiAgICAgICAgICAgIG1heEluZGV4ID0gY3VycmVudEluZGV4IC0gMVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gYXNjZW5kaW5nKGEsIGIpIHtcbiAgICByZXR1cm4gYSA+IGIgPyAxIDogLTFcbn1cbiIsInZhciBhcHBseVByb3BlcnRpZXMgPSByZXF1aXJlKFwiLi9hcHBseS1wcm9wZXJ0aWVzXCIpXG5cbnZhciBpc1dpZGdldCA9IHJlcXVpcmUoXCIuLi92bm9kZS9pcy13aWRnZXQuanNcIilcbnZhciBWUGF0Y2ggPSByZXF1aXJlKFwiLi4vdm5vZGUvdnBhdGNoLmpzXCIpXG5cbnZhciB1cGRhdGVXaWRnZXQgPSByZXF1aXJlKFwiLi91cGRhdGUtd2lkZ2V0XCIpXG5cbm1vZHVsZS5leHBvcnRzID0gYXBwbHlQYXRjaFxuXG5mdW5jdGlvbiBhcHBseVBhdGNoKHZwYXRjaCwgZG9tTm9kZSwgcmVuZGVyT3B0aW9ucykge1xuICAgIHZhciB0eXBlID0gdnBhdGNoLnR5cGVcbiAgICB2YXIgdk5vZGUgPSB2cGF0Y2gudk5vZGVcbiAgICB2YXIgcGF0Y2ggPSB2cGF0Y2gucGF0Y2hcblxuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICBjYXNlIFZQYXRjaC5SRU1PVkU6XG4gICAgICAgICAgICByZXR1cm4gcmVtb3ZlTm9kZShkb21Ob2RlLCB2Tm9kZSlcbiAgICAgICAgY2FzZSBWUGF0Y2guSU5TRVJUOlxuICAgICAgICAgICAgcmV0dXJuIGluc2VydE5vZGUoZG9tTm9kZSwgcGF0Y2gsIHJlbmRlck9wdGlvbnMpXG4gICAgICAgIGNhc2UgVlBhdGNoLlZURVhUOlxuICAgICAgICAgICAgcmV0dXJuIHN0cmluZ1BhdGNoKGRvbU5vZGUsIHZOb2RlLCBwYXRjaCwgcmVuZGVyT3B0aW9ucylcbiAgICAgICAgY2FzZSBWUGF0Y2guV0lER0VUOlxuICAgICAgICAgICAgcmV0dXJuIHdpZGdldFBhdGNoKGRvbU5vZGUsIHZOb2RlLCBwYXRjaCwgcmVuZGVyT3B0aW9ucylcbiAgICAgICAgY2FzZSBWUGF0Y2guVk5PREU6XG4gICAgICAgICAgICByZXR1cm4gdk5vZGVQYXRjaChkb21Ob2RlLCB2Tm9kZSwgcGF0Y2gsIHJlbmRlck9wdGlvbnMpXG4gICAgICAgIGNhc2UgVlBhdGNoLk9SREVSOlxuICAgICAgICAgICAgcmVvcmRlckNoaWxkcmVuKGRvbU5vZGUsIHBhdGNoKVxuICAgICAgICAgICAgcmV0dXJuIGRvbU5vZGVcbiAgICAgICAgY2FzZSBWUGF0Y2guUFJPUFM6XG4gICAgICAgICAgICBhcHBseVByb3BlcnRpZXMoZG9tTm9kZSwgcGF0Y2gsIHZOb2RlLnByb3BlcnRpZXMpXG4gICAgICAgICAgICByZXR1cm4gZG9tTm9kZVxuICAgICAgICBjYXNlIFZQYXRjaC5USFVOSzpcbiAgICAgICAgICAgIHJldHVybiByZXBsYWNlUm9vdChkb21Ob2RlLFxuICAgICAgICAgICAgICAgIHJlbmRlck9wdGlvbnMucGF0Y2goZG9tTm9kZSwgcGF0Y2gsIHJlbmRlck9wdGlvbnMpKVxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIGRvbU5vZGVcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHJlbW92ZU5vZGUoZG9tTm9kZSwgdk5vZGUpIHtcbiAgICB2YXIgcGFyZW50Tm9kZSA9IGRvbU5vZGUucGFyZW50Tm9kZVxuXG4gICAgaWYgKHBhcmVudE5vZGUpIHtcbiAgICAgICAgcGFyZW50Tm9kZS5yZW1vdmVDaGlsZChkb21Ob2RlKVxuICAgIH1cblxuICAgIGRlc3Ryb3lXaWRnZXQoZG9tTm9kZSwgdk5vZGUpO1xuXG4gICAgcmV0dXJuIG51bGxcbn1cblxuZnVuY3Rpb24gaW5zZXJ0Tm9kZShwYXJlbnROb2RlLCB2Tm9kZSwgcmVuZGVyT3B0aW9ucykge1xuICAgIHZhciBuZXdOb2RlID0gcmVuZGVyT3B0aW9ucy5yZW5kZXIodk5vZGUsIHJlbmRlck9wdGlvbnMpXG5cbiAgICBpZiAocGFyZW50Tm9kZSkge1xuICAgICAgICBwYXJlbnROb2RlLmFwcGVuZENoaWxkKG5ld05vZGUpXG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcmVudE5vZGVcbn1cblxuZnVuY3Rpb24gc3RyaW5nUGF0Y2goZG9tTm9kZSwgbGVmdFZOb2RlLCB2VGV4dCwgcmVuZGVyT3B0aW9ucykge1xuICAgIHZhciBuZXdOb2RlXG5cbiAgICBpZiAoZG9tTm9kZS5ub2RlVHlwZSA9PT0gMykge1xuICAgICAgICBkb21Ob2RlLnJlcGxhY2VEYXRhKDAsIGRvbU5vZGUubGVuZ3RoLCB2VGV4dC50ZXh0KVxuICAgICAgICBuZXdOb2RlID0gZG9tTm9kZVxuICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBwYXJlbnROb2RlID0gZG9tTm9kZS5wYXJlbnROb2RlXG4gICAgICAgIG5ld05vZGUgPSByZW5kZXJPcHRpb25zLnJlbmRlcih2VGV4dCwgcmVuZGVyT3B0aW9ucylcblxuICAgICAgICBpZiAocGFyZW50Tm9kZSAmJiBuZXdOb2RlICE9PSBkb21Ob2RlKSB7XG4gICAgICAgICAgICBwYXJlbnROb2RlLnJlcGxhY2VDaGlsZChuZXdOb2RlLCBkb21Ob2RlKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ld05vZGVcbn1cblxuZnVuY3Rpb24gd2lkZ2V0UGF0Y2goZG9tTm9kZSwgbGVmdFZOb2RlLCB3aWRnZXQsIHJlbmRlck9wdGlvbnMpIHtcbiAgICB2YXIgdXBkYXRpbmcgPSB1cGRhdGVXaWRnZXQobGVmdFZOb2RlLCB3aWRnZXQpXG4gICAgdmFyIG5ld05vZGVcblxuICAgIGlmICh1cGRhdGluZykge1xuICAgICAgICBuZXdOb2RlID0gd2lkZ2V0LnVwZGF0ZShsZWZ0Vk5vZGUsIGRvbU5vZGUpIHx8IGRvbU5vZGVcbiAgICB9IGVsc2Uge1xuICAgICAgICBuZXdOb2RlID0gcmVuZGVyT3B0aW9ucy5yZW5kZXIod2lkZ2V0LCByZW5kZXJPcHRpb25zKVxuICAgIH1cblxuICAgIHZhciBwYXJlbnROb2RlID0gZG9tTm9kZS5wYXJlbnROb2RlXG5cbiAgICBpZiAocGFyZW50Tm9kZSAmJiBuZXdOb2RlICE9PSBkb21Ob2RlKSB7XG4gICAgICAgIHBhcmVudE5vZGUucmVwbGFjZUNoaWxkKG5ld05vZGUsIGRvbU5vZGUpXG4gICAgfVxuXG4gICAgaWYgKCF1cGRhdGluZykge1xuICAgICAgICBkZXN0cm95V2lkZ2V0KGRvbU5vZGUsIGxlZnRWTm9kZSlcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3Tm9kZVxufVxuXG5mdW5jdGlvbiB2Tm9kZVBhdGNoKGRvbU5vZGUsIGxlZnRWTm9kZSwgdk5vZGUsIHJlbmRlck9wdGlvbnMpIHtcbiAgICB2YXIgcGFyZW50Tm9kZSA9IGRvbU5vZGUucGFyZW50Tm9kZVxuICAgIHZhciBuZXdOb2RlID0gcmVuZGVyT3B0aW9ucy5yZW5kZXIodk5vZGUsIHJlbmRlck9wdGlvbnMpXG5cbiAgICBpZiAocGFyZW50Tm9kZSAmJiBuZXdOb2RlICE9PSBkb21Ob2RlKSB7XG4gICAgICAgIHBhcmVudE5vZGUucmVwbGFjZUNoaWxkKG5ld05vZGUsIGRvbU5vZGUpXG4gICAgfVxuXG4gICAgcmV0dXJuIG5ld05vZGVcbn1cblxuZnVuY3Rpb24gZGVzdHJveVdpZGdldChkb21Ob2RlLCB3KSB7XG4gICAgaWYgKHR5cGVvZiB3LmRlc3Ryb3kgPT09IFwiZnVuY3Rpb25cIiAmJiBpc1dpZGdldCh3KSkge1xuICAgICAgICB3LmRlc3Ryb3koZG9tTm9kZSlcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHJlb3JkZXJDaGlsZHJlbihkb21Ob2RlLCBtb3Zlcykge1xuICAgIHZhciBjaGlsZE5vZGVzID0gZG9tTm9kZS5jaGlsZE5vZGVzXG4gICAgdmFyIGtleU1hcCA9IHt9XG4gICAgdmFyIG5vZGVcbiAgICB2YXIgcmVtb3ZlXG4gICAgdmFyIGluc2VydFxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtb3Zlcy5yZW1vdmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHJlbW92ZSA9IG1vdmVzLnJlbW92ZXNbaV1cbiAgICAgICAgbm9kZSA9IGNoaWxkTm9kZXNbcmVtb3ZlLmZyb21dXG4gICAgICAgIGlmIChyZW1vdmUua2V5KSB7XG4gICAgICAgICAgICBrZXlNYXBbcmVtb3ZlLmtleV0gPSBub2RlXG4gICAgICAgIH1cbiAgICAgICAgZG9tTm9kZS5yZW1vdmVDaGlsZChub2RlKVxuICAgIH1cblxuICAgIHZhciBsZW5ndGggPSBjaGlsZE5vZGVzLmxlbmd0aFxuICAgIGZvciAodmFyIGogPSAwOyBqIDwgbW92ZXMuaW5zZXJ0cy5sZW5ndGg7IGorKykge1xuICAgICAgICBpbnNlcnQgPSBtb3Zlcy5pbnNlcnRzW2pdXG4gICAgICAgIG5vZGUgPSBrZXlNYXBbaW5zZXJ0LmtleV1cbiAgICAgICAgLy8gdGhpcyBpcyB0aGUgd2VpcmRlc3QgYnVnIGkndmUgZXZlciBzZWVuIGluIHdlYmtpdFxuICAgICAgICBkb21Ob2RlLmluc2VydEJlZm9yZShub2RlLCBpbnNlcnQudG8gPj0gbGVuZ3RoKysgPyBudWxsIDogY2hpbGROb2Rlc1tpbnNlcnQudG9dKVxuICAgIH1cbn1cblxuZnVuY3Rpb24gcmVwbGFjZVJvb3Qob2xkUm9vdCwgbmV3Um9vdCkge1xuICAgIGlmIChvbGRSb290ICYmIG5ld1Jvb3QgJiYgb2xkUm9vdCAhPT0gbmV3Um9vdCAmJiBvbGRSb290LnBhcmVudE5vZGUpIHtcbiAgICAgICAgb2xkUm9vdC5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChuZXdSb290LCBvbGRSb290KVxuICAgIH1cblxuICAgIHJldHVybiBuZXdSb290O1xufVxuIiwidmFyIGRvY3VtZW50ID0gcmVxdWlyZShcImdsb2JhbC9kb2N1bWVudFwiKVxudmFyIGlzQXJyYXkgPSByZXF1aXJlKFwieC1pcy1hcnJheVwiKVxuXG52YXIgcmVuZGVyID0gcmVxdWlyZShcIi4vY3JlYXRlLWVsZW1lbnRcIilcbnZhciBkb21JbmRleCA9IHJlcXVpcmUoXCIuL2RvbS1pbmRleFwiKVxudmFyIHBhdGNoT3AgPSByZXF1aXJlKFwiLi9wYXRjaC1vcFwiKVxubW9kdWxlLmV4cG9ydHMgPSBwYXRjaFxuXG5mdW5jdGlvbiBwYXRjaChyb290Tm9kZSwgcGF0Y2hlcywgcmVuZGVyT3B0aW9ucykge1xuICAgIHJlbmRlck9wdGlvbnMgPSByZW5kZXJPcHRpb25zIHx8IHt9XG4gICAgcmVuZGVyT3B0aW9ucy5wYXRjaCA9IHJlbmRlck9wdGlvbnMucGF0Y2ggJiYgcmVuZGVyT3B0aW9ucy5wYXRjaCAhPT0gcGF0Y2hcbiAgICAgICAgPyByZW5kZXJPcHRpb25zLnBhdGNoXG4gICAgICAgIDogcGF0Y2hSZWN1cnNpdmVcbiAgICByZW5kZXJPcHRpb25zLnJlbmRlciA9IHJlbmRlck9wdGlvbnMucmVuZGVyIHx8IHJlbmRlclxuXG4gICAgcmV0dXJuIHJlbmRlck9wdGlvbnMucGF0Y2gocm9vdE5vZGUsIHBhdGNoZXMsIHJlbmRlck9wdGlvbnMpXG59XG5cbmZ1bmN0aW9uIHBhdGNoUmVjdXJzaXZlKHJvb3ROb2RlLCBwYXRjaGVzLCByZW5kZXJPcHRpb25zKSB7XG4gICAgdmFyIGluZGljZXMgPSBwYXRjaEluZGljZXMocGF0Y2hlcylcblxuICAgIGlmIChpbmRpY2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gcm9vdE5vZGVcbiAgICB9XG5cbiAgICB2YXIgaW5kZXggPSBkb21JbmRleChyb290Tm9kZSwgcGF0Y2hlcy5hLCBpbmRpY2VzKVxuICAgIHZhciBvd25lckRvY3VtZW50ID0gcm9vdE5vZGUub3duZXJEb2N1bWVudFxuXG4gICAgaWYgKCFyZW5kZXJPcHRpb25zLmRvY3VtZW50ICYmIG93bmVyRG9jdW1lbnQgIT09IGRvY3VtZW50KSB7XG4gICAgICAgIHJlbmRlck9wdGlvbnMuZG9jdW1lbnQgPSBvd25lckRvY3VtZW50XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbmRpY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBub2RlSW5kZXggPSBpbmRpY2VzW2ldXG4gICAgICAgIHJvb3ROb2RlID0gYXBwbHlQYXRjaChyb290Tm9kZSxcbiAgICAgICAgICAgIGluZGV4W25vZGVJbmRleF0sXG4gICAgICAgICAgICBwYXRjaGVzW25vZGVJbmRleF0sXG4gICAgICAgICAgICByZW5kZXJPcHRpb25zKVxuICAgIH1cblxuICAgIHJldHVybiByb290Tm9kZVxufVxuXG5mdW5jdGlvbiBhcHBseVBhdGNoKHJvb3ROb2RlLCBkb21Ob2RlLCBwYXRjaExpc3QsIHJlbmRlck9wdGlvbnMpIHtcbiAgICBpZiAoIWRvbU5vZGUpIHtcbiAgICAgICAgcmV0dXJuIHJvb3ROb2RlXG4gICAgfVxuXG4gICAgdmFyIG5ld05vZGVcblxuICAgIGlmIChpc0FycmF5KHBhdGNoTGlzdCkpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXRjaExpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIG5ld05vZGUgPSBwYXRjaE9wKHBhdGNoTGlzdFtpXSwgZG9tTm9kZSwgcmVuZGVyT3B0aW9ucylcblxuICAgICAgICAgICAgaWYgKGRvbU5vZGUgPT09IHJvb3ROb2RlKSB7XG4gICAgICAgICAgICAgICAgcm9vdE5vZGUgPSBuZXdOb2RlXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBuZXdOb2RlID0gcGF0Y2hPcChwYXRjaExpc3QsIGRvbU5vZGUsIHJlbmRlck9wdGlvbnMpXG5cbiAgICAgICAgaWYgKGRvbU5vZGUgPT09IHJvb3ROb2RlKSB7XG4gICAgICAgICAgICByb290Tm9kZSA9IG5ld05vZGVcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByb290Tm9kZVxufVxuXG5mdW5jdGlvbiBwYXRjaEluZGljZXMocGF0Y2hlcykge1xuICAgIHZhciBpbmRpY2VzID0gW11cblxuICAgIGZvciAodmFyIGtleSBpbiBwYXRjaGVzKSB7XG4gICAgICAgIGlmIChrZXkgIT09IFwiYVwiKSB7XG4gICAgICAgICAgICBpbmRpY2VzLnB1c2goTnVtYmVyKGtleSkpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gaW5kaWNlc1xufVxuIiwidmFyIGlzV2lkZ2V0ID0gcmVxdWlyZShcIi4uL3Zub2RlL2lzLXdpZGdldC5qc1wiKVxuXG5tb2R1bGUuZXhwb3J0cyA9IHVwZGF0ZVdpZGdldFxuXG5mdW5jdGlvbiB1cGRhdGVXaWRnZXQoYSwgYikge1xuICAgIGlmIChpc1dpZGdldChhKSAmJiBpc1dpZGdldChiKSkge1xuICAgICAgICBpZiAoXCJuYW1lXCIgaW4gYSAmJiBcIm5hbWVcIiBpbiBiKSB7XG4gICAgICAgICAgICByZXR1cm4gYS5pZCA9PT0gYi5pZFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGEuaW5pdCA9PT0gYi5pbml0XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2Vcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIEV2U3RvcmUgPSByZXF1aXJlKCdldi1zdG9yZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEV2SG9vaztcblxuZnVuY3Rpb24gRXZIb29rKHZhbHVlKSB7XG4gICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIEV2SG9vaykpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBFdkhvb2sodmFsdWUpO1xuICAgIH1cblxuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbn1cblxuRXZIb29rLnByb3RvdHlwZS5ob29rID0gZnVuY3Rpb24gKG5vZGUsIHByb3BlcnR5TmFtZSkge1xuICAgIHZhciBlcyA9IEV2U3RvcmUobm9kZSk7XG4gICAgdmFyIHByb3BOYW1lID0gcHJvcGVydHlOYW1lLnN1YnN0cigzKTtcblxuICAgIGVzW3Byb3BOYW1lXSA9IHRoaXMudmFsdWU7XG59O1xuXG5Fdkhvb2sucHJvdG90eXBlLnVuaG9vayA9IGZ1bmN0aW9uKG5vZGUsIHByb3BlcnR5TmFtZSkge1xuICAgIHZhciBlcyA9IEV2U3RvcmUobm9kZSk7XG4gICAgdmFyIHByb3BOYW1lID0gcHJvcGVydHlOYW1lLnN1YnN0cigzKTtcblxuICAgIGVzW3Byb3BOYW1lXSA9IHVuZGVmaW5lZDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gU29mdFNldEhvb2s7XG5cbmZ1bmN0aW9uIFNvZnRTZXRIb29rKHZhbHVlKSB7XG4gICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFNvZnRTZXRIb29rKSkge1xuICAgICAgICByZXR1cm4gbmV3IFNvZnRTZXRIb29rKHZhbHVlKTtcbiAgICB9XG5cbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG59XG5cblNvZnRTZXRIb29rLnByb3RvdHlwZS5ob29rID0gZnVuY3Rpb24gKG5vZGUsIHByb3BlcnR5TmFtZSkge1xuICAgIGlmIChub2RlW3Byb3BlcnR5TmFtZV0gIT09IHRoaXMudmFsdWUpIHtcbiAgICAgICAgbm9kZVtwcm9wZXJ0eU5hbWVdID0gdGhpcy52YWx1ZTtcbiAgICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgaXNBcnJheSA9IHJlcXVpcmUoJ3gtaXMtYXJyYXknKTtcblxudmFyIFZOb2RlID0gcmVxdWlyZSgnLi4vdm5vZGUvdm5vZGUuanMnKTtcbnZhciBWVGV4dCA9IHJlcXVpcmUoJy4uL3Zub2RlL3Z0ZXh0LmpzJyk7XG52YXIgaXNWTm9kZSA9IHJlcXVpcmUoJy4uL3Zub2RlL2lzLXZub2RlJyk7XG52YXIgaXNWVGV4dCA9IHJlcXVpcmUoJy4uL3Zub2RlL2lzLXZ0ZXh0Jyk7XG52YXIgaXNXaWRnZXQgPSByZXF1aXJlKCcuLi92bm9kZS9pcy13aWRnZXQnKTtcbnZhciBpc0hvb2sgPSByZXF1aXJlKCcuLi92bm9kZS9pcy12aG9vaycpO1xudmFyIGlzVlRodW5rID0gcmVxdWlyZSgnLi4vdm5vZGUvaXMtdGh1bmsnKTtcblxudmFyIHBhcnNlVGFnID0gcmVxdWlyZSgnLi9wYXJzZS10YWcuanMnKTtcbnZhciBzb2Z0U2V0SG9vayA9IHJlcXVpcmUoJy4vaG9va3Mvc29mdC1zZXQtaG9vay5qcycpO1xudmFyIGV2SG9vayA9IHJlcXVpcmUoJy4vaG9va3MvZXYtaG9vay5qcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGg7XG5cbmZ1bmN0aW9uIGgodGFnTmFtZSwgcHJvcGVydGllcywgY2hpbGRyZW4pIHtcbiAgICB2YXIgY2hpbGROb2RlcyA9IFtdO1xuICAgIHZhciB0YWcsIHByb3BzLCBrZXksIG5hbWVzcGFjZTtcblxuICAgIGlmICghY2hpbGRyZW4gJiYgaXNDaGlsZHJlbihwcm9wZXJ0aWVzKSkge1xuICAgICAgICBjaGlsZHJlbiA9IHByb3BlcnRpZXM7XG4gICAgICAgIHByb3BzID0ge307XG4gICAgfVxuXG4gICAgcHJvcHMgPSBwcm9wcyB8fCBwcm9wZXJ0aWVzIHx8IHt9O1xuICAgIHRhZyA9IHBhcnNlVGFnKHRhZ05hbWUsIHByb3BzKTtcblxuICAgIC8vIHN1cHBvcnQga2V5c1xuICAgIGlmIChwcm9wcy5oYXNPd25Qcm9wZXJ0eSgna2V5JykpIHtcbiAgICAgICAga2V5ID0gcHJvcHMua2V5O1xuICAgICAgICBwcm9wcy5rZXkgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLy8gc3VwcG9ydCBuYW1lc3BhY2VcbiAgICBpZiAocHJvcHMuaGFzT3duUHJvcGVydHkoJ25hbWVzcGFjZScpKSB7XG4gICAgICAgIG5hbWVzcGFjZSA9IHByb3BzLm5hbWVzcGFjZTtcbiAgICAgICAgcHJvcHMubmFtZXNwYWNlID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8vIGZpeCBjdXJzb3IgYnVnXG4gICAgaWYgKHRhZyA9PT0gJ0lOUFVUJyAmJlxuICAgICAgICAhbmFtZXNwYWNlICYmXG4gICAgICAgIHByb3BzLmhhc093blByb3BlcnR5KCd2YWx1ZScpICYmXG4gICAgICAgIHByb3BzLnZhbHVlICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgIWlzSG9vayhwcm9wcy52YWx1ZSlcbiAgICApIHtcbiAgICAgICAgcHJvcHMudmFsdWUgPSBzb2Z0U2V0SG9vayhwcm9wcy52YWx1ZSk7XG4gICAgfVxuXG4gICAgdHJhbnNmb3JtUHJvcGVydGllcyhwcm9wcyk7XG5cbiAgICBpZiAoY2hpbGRyZW4gIT09IHVuZGVmaW5lZCAmJiBjaGlsZHJlbiAhPT0gbnVsbCkge1xuICAgICAgICBhZGRDaGlsZChjaGlsZHJlbiwgY2hpbGROb2RlcywgdGFnLCBwcm9wcyk7XG4gICAgfVxuXG5cbiAgICByZXR1cm4gbmV3IFZOb2RlKHRhZywgcHJvcHMsIGNoaWxkTm9kZXMsIGtleSwgbmFtZXNwYWNlKTtcbn1cblxuZnVuY3Rpb24gYWRkQ2hpbGQoYywgY2hpbGROb2RlcywgdGFnLCBwcm9wcykge1xuICAgIGlmICh0eXBlb2YgYyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgY2hpbGROb2Rlcy5wdXNoKG5ldyBWVGV4dChjKSk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgYyA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgY2hpbGROb2Rlcy5wdXNoKG5ldyBWVGV4dChTdHJpbmcoYykpKTtcbiAgICB9IGVsc2UgaWYgKGlzQ2hpbGQoYykpIHtcbiAgICAgICAgY2hpbGROb2Rlcy5wdXNoKGMpO1xuICAgIH0gZWxzZSBpZiAoaXNBcnJheShjKSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGFkZENoaWxkKGNbaV0sIGNoaWxkTm9kZXMsIHRhZywgcHJvcHMpO1xuICAgICAgICB9XG4gICAgfSBlbHNlIGlmIChjID09PSBudWxsIHx8IGMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm47XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgVW5leHBlY3RlZFZpcnR1YWxFbGVtZW50KHtcbiAgICAgICAgICAgIGZvcmVpZ25PYmplY3Q6IGMsXG4gICAgICAgICAgICBwYXJlbnRWbm9kZToge1xuICAgICAgICAgICAgICAgIHRhZ05hbWU6IHRhZyxcbiAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzOiBwcm9wc1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHRyYW5zZm9ybVByb3BlcnRpZXMocHJvcHMpIHtcbiAgICBmb3IgKHZhciBwcm9wTmFtZSBpbiBwcm9wcykge1xuICAgICAgICBpZiAocHJvcHMuaGFzT3duUHJvcGVydHkocHJvcE5hbWUpKSB7XG4gICAgICAgICAgICB2YXIgdmFsdWUgPSBwcm9wc1twcm9wTmFtZV07XG5cbiAgICAgICAgICAgIGlmIChpc0hvb2sodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChwcm9wTmFtZS5zdWJzdHIoMCwgMykgPT09ICdldi0nKSB7XG4gICAgICAgICAgICAgICAgLy8gYWRkIGV2LWZvbyBzdXBwb3J0XG4gICAgICAgICAgICAgICAgcHJvcHNbcHJvcE5hbWVdID0gZXZIb29rKHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gaXNDaGlsZCh4KSB7XG4gICAgcmV0dXJuIGlzVk5vZGUoeCkgfHwgaXNWVGV4dCh4KSB8fCBpc1dpZGdldCh4KSB8fCBpc1ZUaHVuayh4KTtcbn1cblxuZnVuY3Rpb24gaXNDaGlsZHJlbih4KSB7XG4gICAgcmV0dXJuIHR5cGVvZiB4ID09PSAnc3RyaW5nJyB8fCBpc0FycmF5KHgpIHx8IGlzQ2hpbGQoeCk7XG59XG5cbmZ1bmN0aW9uIFVuZXhwZWN0ZWRWaXJ0dWFsRWxlbWVudChkYXRhKSB7XG4gICAgdmFyIGVyciA9IG5ldyBFcnJvcigpO1xuXG4gICAgZXJyLnR5cGUgPSAndmlydHVhbC1oeXBlcnNjcmlwdC51bmV4cGVjdGVkLnZpcnR1YWwtZWxlbWVudCc7XG4gICAgZXJyLm1lc3NhZ2UgPSAnVW5leHBlY3RlZCB2aXJ0dWFsIGNoaWxkIHBhc3NlZCB0byBoKCkuXFxuJyArXG4gICAgICAgICdFeHBlY3RlZCBhIFZOb2RlIC8gVnRodW5rIC8gVldpZGdldCAvIHN0cmluZyBidXQ6XFxuJyArXG4gICAgICAgICdnb3Q6XFxuJyArXG4gICAgICAgIGVycm9yU3RyaW5nKGRhdGEuZm9yZWlnbk9iamVjdCkgK1xuICAgICAgICAnLlxcbicgK1xuICAgICAgICAnVGhlIHBhcmVudCB2bm9kZSBpczpcXG4nICtcbiAgICAgICAgZXJyb3JTdHJpbmcoZGF0YS5wYXJlbnRWbm9kZSlcbiAgICAgICAgJ1xcbicgK1xuICAgICAgICAnU3VnZ2VzdGVkIGZpeDogY2hhbmdlIHlvdXIgYGgoLi4uLCBbIC4uLiBdKWAgY2FsbHNpdGUuJztcbiAgICBlcnIuZm9yZWlnbk9iamVjdCA9IGRhdGEuZm9yZWlnbk9iamVjdDtcbiAgICBlcnIucGFyZW50Vm5vZGUgPSBkYXRhLnBhcmVudFZub2RlO1xuXG4gICAgcmV0dXJuIGVycjtcbn1cblxuZnVuY3Rpb24gZXJyb3JTdHJpbmcob2JqKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KG9iaiwgbnVsbCwgJyAgICAnKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBTdHJpbmcob2JqKTtcbiAgICB9XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBzcGxpdCA9IHJlcXVpcmUoJ2Jyb3dzZXItc3BsaXQnKTtcblxudmFyIGNsYXNzSWRTcGxpdCA9IC8oW1xcLiNdP1thLXpBLVowLTlcXHUwMDdGLVxcdUZGRkZfOi1dKykvO1xudmFyIG5vdENsYXNzSWQgPSAvXlxcLnwjLztcblxubW9kdWxlLmV4cG9ydHMgPSBwYXJzZVRhZztcblxuZnVuY3Rpb24gcGFyc2VUYWcodGFnLCBwcm9wcykge1xuICAgIGlmICghdGFnKSB7XG4gICAgICAgIHJldHVybiAnRElWJztcbiAgICB9XG5cbiAgICB2YXIgbm9JZCA9ICEocHJvcHMuaGFzT3duUHJvcGVydHkoJ2lkJykpO1xuXG4gICAgdmFyIHRhZ1BhcnRzID0gc3BsaXQodGFnLCBjbGFzc0lkU3BsaXQpO1xuICAgIHZhciB0YWdOYW1lID0gbnVsbDtcblxuICAgIGlmIChub3RDbGFzc0lkLnRlc3QodGFnUGFydHNbMV0pKSB7XG4gICAgICAgIHRhZ05hbWUgPSAnRElWJztcbiAgICB9XG5cbiAgICB2YXIgY2xhc3NlcywgcGFydCwgdHlwZSwgaTtcblxuICAgIGZvciAoaSA9IDA7IGkgPCB0YWdQYXJ0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBwYXJ0ID0gdGFnUGFydHNbaV07XG5cbiAgICAgICAgaWYgKCFwYXJ0KSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHR5cGUgPSBwYXJ0LmNoYXJBdCgwKTtcblxuICAgICAgICBpZiAoIXRhZ05hbWUpIHtcbiAgICAgICAgICAgIHRhZ05hbWUgPSBwYXJ0O1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICcuJykge1xuICAgICAgICAgICAgY2xhc3NlcyA9IGNsYXNzZXMgfHwgW107XG4gICAgICAgICAgICBjbGFzc2VzLnB1c2gocGFydC5zdWJzdHJpbmcoMSwgcGFydC5sZW5ndGgpKTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnIycgJiYgbm9JZCkge1xuICAgICAgICAgICAgcHJvcHMuaWQgPSBwYXJ0LnN1YnN0cmluZygxLCBwYXJ0Lmxlbmd0aCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY2xhc3Nlcykge1xuICAgICAgICBpZiAocHJvcHMuY2xhc3NOYW1lKSB7XG4gICAgICAgICAgICBjbGFzc2VzLnB1c2gocHJvcHMuY2xhc3NOYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHByb3BzLmNsYXNzTmFtZSA9IGNsYXNzZXMuam9pbignICcpO1xuICAgIH1cblxuICAgIHJldHVybiBwcm9wcy5uYW1lc3BhY2UgPyB0YWdOYW1lIDogdGFnTmFtZS50b1VwcGVyQ2FzZSgpO1xufVxuIiwidmFyIGlzVk5vZGUgPSByZXF1aXJlKFwiLi9pcy12bm9kZVwiKVxudmFyIGlzVlRleHQgPSByZXF1aXJlKFwiLi9pcy12dGV4dFwiKVxudmFyIGlzV2lkZ2V0ID0gcmVxdWlyZShcIi4vaXMtd2lkZ2V0XCIpXG52YXIgaXNUaHVuayA9IHJlcXVpcmUoXCIuL2lzLXRodW5rXCIpXG5cbm1vZHVsZS5leHBvcnRzID0gaGFuZGxlVGh1bmtcblxuZnVuY3Rpb24gaGFuZGxlVGh1bmsoYSwgYikge1xuICAgIHZhciByZW5kZXJlZEEgPSBhXG4gICAgdmFyIHJlbmRlcmVkQiA9IGJcblxuICAgIGlmIChpc1RodW5rKGIpKSB7XG4gICAgICAgIHJlbmRlcmVkQiA9IHJlbmRlclRodW5rKGIsIGEpXG4gICAgfVxuXG4gICAgaWYgKGlzVGh1bmsoYSkpIHtcbiAgICAgICAgcmVuZGVyZWRBID0gcmVuZGVyVGh1bmsoYSwgbnVsbClcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBhOiByZW5kZXJlZEEsXG4gICAgICAgIGI6IHJlbmRlcmVkQlxuICAgIH1cbn1cblxuZnVuY3Rpb24gcmVuZGVyVGh1bmsodGh1bmssIHByZXZpb3VzKSB7XG4gICAgdmFyIHJlbmRlcmVkVGh1bmsgPSB0aHVuay52bm9kZVxuXG4gICAgaWYgKCFyZW5kZXJlZFRodW5rKSB7XG4gICAgICAgIHJlbmRlcmVkVGh1bmsgPSB0aHVuay52bm9kZSA9IHRodW5rLnJlbmRlcihwcmV2aW91cylcbiAgICB9XG5cbiAgICBpZiAoIShpc1ZOb2RlKHJlbmRlcmVkVGh1bmspIHx8XG4gICAgICAgICAgICBpc1ZUZXh0KHJlbmRlcmVkVGh1bmspIHx8XG4gICAgICAgICAgICBpc1dpZGdldChyZW5kZXJlZFRodW5rKSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwidGh1bmsgZGlkIG5vdCByZXR1cm4gYSB2YWxpZCBub2RlXCIpO1xuICAgIH1cblxuICAgIHJldHVybiByZW5kZXJlZFRodW5rXG59XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGlzVGh1bmtcclxuXHJcbmZ1bmN0aW9uIGlzVGh1bmsodCkge1xyXG4gICAgcmV0dXJuIHQgJiYgdC50eXBlID09PSBcIlRodW5rXCJcclxufVxyXG4iLCJtb2R1bGUuZXhwb3J0cyA9IGlzSG9va1xuXG5mdW5jdGlvbiBpc0hvb2soaG9vaykge1xuICAgIHJldHVybiBob29rICYmXG4gICAgICAodHlwZW9mIGhvb2suaG9vayA9PT0gXCJmdW5jdGlvblwiICYmICFob29rLmhhc093blByb3BlcnR5KFwiaG9va1wiKSB8fFxuICAgICAgIHR5cGVvZiBob29rLnVuaG9vayA9PT0gXCJmdW5jdGlvblwiICYmICFob29rLmhhc093blByb3BlcnR5KFwidW5ob29rXCIpKVxufVxuIiwidmFyIHZlcnNpb24gPSByZXF1aXJlKFwiLi92ZXJzaW9uXCIpXG5cbm1vZHVsZS5leHBvcnRzID0gaXNWaXJ0dWFsTm9kZVxuXG5mdW5jdGlvbiBpc1ZpcnR1YWxOb2RlKHgpIHtcbiAgICByZXR1cm4geCAmJiB4LnR5cGUgPT09IFwiVmlydHVhbE5vZGVcIiAmJiB4LnZlcnNpb24gPT09IHZlcnNpb25cbn1cbiIsInZhciB2ZXJzaW9uID0gcmVxdWlyZShcIi4vdmVyc2lvblwiKVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzVmlydHVhbFRleHRcblxuZnVuY3Rpb24gaXNWaXJ0dWFsVGV4dCh4KSB7XG4gICAgcmV0dXJuIHggJiYgeC50eXBlID09PSBcIlZpcnR1YWxUZXh0XCIgJiYgeC52ZXJzaW9uID09PSB2ZXJzaW9uXG59XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGlzV2lkZ2V0XG5cbmZ1bmN0aW9uIGlzV2lkZ2V0KHcpIHtcbiAgICByZXR1cm4gdyAmJiB3LnR5cGUgPT09IFwiV2lkZ2V0XCJcbn1cbiIsIm1vZHVsZS5leHBvcnRzID0gXCIyXCJcbiIsInZhciB2ZXJzaW9uID0gcmVxdWlyZShcIi4vdmVyc2lvblwiKVxudmFyIGlzVk5vZGUgPSByZXF1aXJlKFwiLi9pcy12bm9kZVwiKVxudmFyIGlzV2lkZ2V0ID0gcmVxdWlyZShcIi4vaXMtd2lkZ2V0XCIpXG52YXIgaXNUaHVuayA9IHJlcXVpcmUoXCIuL2lzLXRodW5rXCIpXG52YXIgaXNWSG9vayA9IHJlcXVpcmUoXCIuL2lzLXZob29rXCIpXG5cbm1vZHVsZS5leHBvcnRzID0gVmlydHVhbE5vZGVcblxudmFyIG5vUHJvcGVydGllcyA9IHt9XG52YXIgbm9DaGlsZHJlbiA9IFtdXG5cbmZ1bmN0aW9uIFZpcnR1YWxOb2RlKHRhZ05hbWUsIHByb3BlcnRpZXMsIGNoaWxkcmVuLCBrZXksIG5hbWVzcGFjZSkge1xuICAgIHRoaXMudGFnTmFtZSA9IHRhZ05hbWVcbiAgICB0aGlzLnByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzIHx8IG5vUHJvcGVydGllc1xuICAgIHRoaXMuY2hpbGRyZW4gPSBjaGlsZHJlbiB8fCBub0NoaWxkcmVuXG4gICAgdGhpcy5rZXkgPSBrZXkgIT0gbnVsbCA/IFN0cmluZyhrZXkpIDogdW5kZWZpbmVkXG4gICAgdGhpcy5uYW1lc3BhY2UgPSAodHlwZW9mIG5hbWVzcGFjZSA9PT0gXCJzdHJpbmdcIikgPyBuYW1lc3BhY2UgOiBudWxsXG5cbiAgICB2YXIgY291bnQgPSAoY2hpbGRyZW4gJiYgY2hpbGRyZW4ubGVuZ3RoKSB8fCAwXG4gICAgdmFyIGRlc2NlbmRhbnRzID0gMFxuICAgIHZhciBoYXNXaWRnZXRzID0gZmFsc2VcbiAgICB2YXIgaGFzVGh1bmtzID0gZmFsc2VcbiAgICB2YXIgZGVzY2VuZGFudEhvb2tzID0gZmFsc2VcbiAgICB2YXIgaG9va3NcblxuICAgIGZvciAodmFyIHByb3BOYW1lIGluIHByb3BlcnRpZXMpIHtcbiAgICAgICAgaWYgKHByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkocHJvcE5hbWUpKSB7XG4gICAgICAgICAgICB2YXIgcHJvcGVydHkgPSBwcm9wZXJ0aWVzW3Byb3BOYW1lXVxuICAgICAgICAgICAgaWYgKGlzVkhvb2socHJvcGVydHkpICYmIHByb3BlcnR5LnVuaG9vaykge1xuICAgICAgICAgICAgICAgIGlmICghaG9va3MpIHtcbiAgICAgICAgICAgICAgICAgICAgaG9va3MgPSB7fVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGhvb2tzW3Byb3BOYW1lXSA9IHByb3BlcnR5XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcbiAgICAgICAgdmFyIGNoaWxkID0gY2hpbGRyZW5baV1cbiAgICAgICAgaWYgKGlzVk5vZGUoY2hpbGQpKSB7XG4gICAgICAgICAgICBkZXNjZW5kYW50cyArPSBjaGlsZC5jb3VudCB8fCAwXG5cbiAgICAgICAgICAgIGlmICghaGFzV2lkZ2V0cyAmJiBjaGlsZC5oYXNXaWRnZXRzKSB7XG4gICAgICAgICAgICAgICAgaGFzV2lkZ2V0cyA9IHRydWVcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFoYXNUaHVua3MgJiYgY2hpbGQuaGFzVGh1bmtzKSB7XG4gICAgICAgICAgICAgICAgaGFzVGh1bmtzID0gdHJ1ZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIWRlc2NlbmRhbnRIb29rcyAmJiAoY2hpbGQuaG9va3MgfHwgY2hpbGQuZGVzY2VuZGFudEhvb2tzKSkge1xuICAgICAgICAgICAgICAgIGRlc2NlbmRhbnRIb29rcyA9IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICghaGFzV2lkZ2V0cyAmJiBpc1dpZGdldChjaGlsZCkpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgY2hpbGQuZGVzdHJveSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgaGFzV2lkZ2V0cyA9IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICghaGFzVGh1bmtzICYmIGlzVGh1bmsoY2hpbGQpKSB7XG4gICAgICAgICAgICBoYXNUaHVua3MgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5jb3VudCA9IGNvdW50ICsgZGVzY2VuZGFudHNcbiAgICB0aGlzLmhhc1dpZGdldHMgPSBoYXNXaWRnZXRzXG4gICAgdGhpcy5oYXNUaHVua3MgPSBoYXNUaHVua3NcbiAgICB0aGlzLmhvb2tzID0gaG9va3NcbiAgICB0aGlzLmRlc2NlbmRhbnRIb29rcyA9IGRlc2NlbmRhbnRIb29rc1xufVxuXG5WaXJ0dWFsTm9kZS5wcm90b3R5cGUudmVyc2lvbiA9IHZlcnNpb25cblZpcnR1YWxOb2RlLnByb3RvdHlwZS50eXBlID0gXCJWaXJ0dWFsTm9kZVwiXG4iLCJ2YXIgdmVyc2lvbiA9IHJlcXVpcmUoXCIuL3ZlcnNpb25cIilcblxuVmlydHVhbFBhdGNoLk5PTkUgPSAwXG5WaXJ0dWFsUGF0Y2guVlRFWFQgPSAxXG5WaXJ0dWFsUGF0Y2guVk5PREUgPSAyXG5WaXJ0dWFsUGF0Y2guV0lER0VUID0gM1xuVmlydHVhbFBhdGNoLlBST1BTID0gNFxuVmlydHVhbFBhdGNoLk9SREVSID0gNVxuVmlydHVhbFBhdGNoLklOU0VSVCA9IDZcblZpcnR1YWxQYXRjaC5SRU1PVkUgPSA3XG5WaXJ0dWFsUGF0Y2guVEhVTksgPSA4XG5cbm1vZHVsZS5leHBvcnRzID0gVmlydHVhbFBhdGNoXG5cbmZ1bmN0aW9uIFZpcnR1YWxQYXRjaCh0eXBlLCB2Tm9kZSwgcGF0Y2gpIHtcbiAgICB0aGlzLnR5cGUgPSBOdW1iZXIodHlwZSlcbiAgICB0aGlzLnZOb2RlID0gdk5vZGVcbiAgICB0aGlzLnBhdGNoID0gcGF0Y2hcbn1cblxuVmlydHVhbFBhdGNoLnByb3RvdHlwZS52ZXJzaW9uID0gdmVyc2lvblxuVmlydHVhbFBhdGNoLnByb3RvdHlwZS50eXBlID0gXCJWaXJ0dWFsUGF0Y2hcIlxuIiwidmFyIHZlcnNpb24gPSByZXF1aXJlKFwiLi92ZXJzaW9uXCIpXG5cbm1vZHVsZS5leHBvcnRzID0gVmlydHVhbFRleHRcblxuZnVuY3Rpb24gVmlydHVhbFRleHQodGV4dCkge1xuICAgIHRoaXMudGV4dCA9IFN0cmluZyh0ZXh0KVxufVxuXG5WaXJ0dWFsVGV4dC5wcm90b3R5cGUudmVyc2lvbiA9IHZlcnNpb25cblZpcnR1YWxUZXh0LnByb3RvdHlwZS50eXBlID0gXCJWaXJ0dWFsVGV4dFwiXG4iLCJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKFwiaXMtb2JqZWN0XCIpXG52YXIgaXNIb29rID0gcmVxdWlyZShcIi4uL3Zub2RlL2lzLXZob29rXCIpXG5cbm1vZHVsZS5leHBvcnRzID0gZGlmZlByb3BzXG5cbmZ1bmN0aW9uIGRpZmZQcm9wcyhhLCBiKSB7XG4gICAgdmFyIGRpZmZcblxuICAgIGZvciAodmFyIGFLZXkgaW4gYSkge1xuICAgICAgICBpZiAoIShhS2V5IGluIGIpKSB7XG4gICAgICAgICAgICBkaWZmID0gZGlmZiB8fCB7fVxuICAgICAgICAgICAgZGlmZlthS2V5XSA9IHVuZGVmaW5lZFxuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGFWYWx1ZSA9IGFbYUtleV1cbiAgICAgICAgdmFyIGJWYWx1ZSA9IGJbYUtleV1cblxuICAgICAgICBpZiAoYVZhbHVlID09PSBiVmFsdWUpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH0gZWxzZSBpZiAoaXNPYmplY3QoYVZhbHVlKSAmJiBpc09iamVjdChiVmFsdWUpKSB7XG4gICAgICAgICAgICBpZiAoZ2V0UHJvdG90eXBlKGJWYWx1ZSkgIT09IGdldFByb3RvdHlwZShhVmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgZGlmZiA9IGRpZmYgfHwge31cbiAgICAgICAgICAgICAgICBkaWZmW2FLZXldID0gYlZhbHVlXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlzSG9vayhiVmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgIGRpZmYgPSBkaWZmIHx8IHt9XG4gICAgICAgICAgICAgICAgIGRpZmZbYUtleV0gPSBiVmFsdWVcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIG9iamVjdERpZmYgPSBkaWZmUHJvcHMoYVZhbHVlLCBiVmFsdWUpXG4gICAgICAgICAgICAgICAgaWYgKG9iamVjdERpZmYpIHtcbiAgICAgICAgICAgICAgICAgICAgZGlmZiA9IGRpZmYgfHwge31cbiAgICAgICAgICAgICAgICAgICAgZGlmZlthS2V5XSA9IG9iamVjdERpZmZcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkaWZmID0gZGlmZiB8fCB7fVxuICAgICAgICAgICAgZGlmZlthS2V5XSA9IGJWYWx1ZVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZm9yICh2YXIgYktleSBpbiBiKSB7XG4gICAgICAgIGlmICghKGJLZXkgaW4gYSkpIHtcbiAgICAgICAgICAgIGRpZmYgPSBkaWZmIHx8IHt9XG4gICAgICAgICAgICBkaWZmW2JLZXldID0gYltiS2V5XVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGRpZmZcbn1cblxuZnVuY3Rpb24gZ2V0UHJvdG90eXBlKHZhbHVlKSB7XG4gIGlmIChPYmplY3QuZ2V0UHJvdG90eXBlT2YpIHtcbiAgICByZXR1cm4gT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKVxuICB9IGVsc2UgaWYgKHZhbHVlLl9fcHJvdG9fXykge1xuICAgIHJldHVybiB2YWx1ZS5fX3Byb3RvX19cbiAgfSBlbHNlIGlmICh2YWx1ZS5jb25zdHJ1Y3Rvcikge1xuICAgIHJldHVybiB2YWx1ZS5jb25zdHJ1Y3Rvci5wcm90b3R5cGVcbiAgfVxufVxuIiwidmFyIGlzQXJyYXkgPSByZXF1aXJlKFwieC1pcy1hcnJheVwiKVxuXG52YXIgVlBhdGNoID0gcmVxdWlyZShcIi4uL3Zub2RlL3ZwYXRjaFwiKVxudmFyIGlzVk5vZGUgPSByZXF1aXJlKFwiLi4vdm5vZGUvaXMtdm5vZGVcIilcbnZhciBpc1ZUZXh0ID0gcmVxdWlyZShcIi4uL3Zub2RlL2lzLXZ0ZXh0XCIpXG52YXIgaXNXaWRnZXQgPSByZXF1aXJlKFwiLi4vdm5vZGUvaXMtd2lkZ2V0XCIpXG52YXIgaXNUaHVuayA9IHJlcXVpcmUoXCIuLi92bm9kZS9pcy10aHVua1wiKVxudmFyIGhhbmRsZVRodW5rID0gcmVxdWlyZShcIi4uL3Zub2RlL2hhbmRsZS10aHVua1wiKVxuXG52YXIgZGlmZlByb3BzID0gcmVxdWlyZShcIi4vZGlmZi1wcm9wc1wiKVxuXG5tb2R1bGUuZXhwb3J0cyA9IGRpZmZcblxuZnVuY3Rpb24gZGlmZihhLCBiKSB7XG4gICAgdmFyIHBhdGNoID0geyBhOiBhIH1cbiAgICB3YWxrKGEsIGIsIHBhdGNoLCAwKVxuICAgIHJldHVybiBwYXRjaFxufVxuXG5mdW5jdGlvbiB3YWxrKGEsIGIsIHBhdGNoLCBpbmRleCkge1xuICAgIGlmIChhID09PSBiKSB7XG4gICAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHZhciBhcHBseSA9IHBhdGNoW2luZGV4XVxuICAgIHZhciBhcHBseUNsZWFyID0gZmFsc2VcblxuICAgIGlmIChpc1RodW5rKGEpIHx8IGlzVGh1bmsoYikpIHtcbiAgICAgICAgdGh1bmtzKGEsIGIsIHBhdGNoLCBpbmRleClcbiAgICB9IGVsc2UgaWYgKGIgPT0gbnVsbCkge1xuXG4gICAgICAgIC8vIElmIGEgaXMgYSB3aWRnZXQgd2Ugd2lsbCBhZGQgYSByZW1vdmUgcGF0Y2ggZm9yIGl0XG4gICAgICAgIC8vIE90aGVyd2lzZSBhbnkgY2hpbGQgd2lkZ2V0cy9ob29rcyBtdXN0IGJlIGRlc3Ryb3llZC5cbiAgICAgICAgLy8gVGhpcyBwcmV2ZW50cyBhZGRpbmcgdHdvIHJlbW92ZSBwYXRjaGVzIGZvciBhIHdpZGdldC5cbiAgICAgICAgaWYgKCFpc1dpZGdldChhKSkge1xuICAgICAgICAgICAgY2xlYXJTdGF0ZShhLCBwYXRjaCwgaW5kZXgpXG4gICAgICAgICAgICBhcHBseSA9IHBhdGNoW2luZGV4XVxuICAgICAgICB9XG5cbiAgICAgICAgYXBwbHkgPSBhcHBlbmRQYXRjaChhcHBseSwgbmV3IFZQYXRjaChWUGF0Y2guUkVNT1ZFLCBhLCBiKSlcbiAgICB9IGVsc2UgaWYgKGlzVk5vZGUoYikpIHtcbiAgICAgICAgaWYgKGlzVk5vZGUoYSkpIHtcbiAgICAgICAgICAgIGlmIChhLnRhZ05hbWUgPT09IGIudGFnTmFtZSAmJlxuICAgICAgICAgICAgICAgIGEubmFtZXNwYWNlID09PSBiLm5hbWVzcGFjZSAmJlxuICAgICAgICAgICAgICAgIGEua2V5ID09PSBiLmtleSkge1xuICAgICAgICAgICAgICAgIHZhciBwcm9wc1BhdGNoID0gZGlmZlByb3BzKGEucHJvcGVydGllcywgYi5wcm9wZXJ0aWVzKVxuICAgICAgICAgICAgICAgIGlmIChwcm9wc1BhdGNoKSB7XG4gICAgICAgICAgICAgICAgICAgIGFwcGx5ID0gYXBwZW5kUGF0Y2goYXBwbHksXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXcgVlBhdGNoKFZQYXRjaC5QUk9QUywgYSwgcHJvcHNQYXRjaCkpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGFwcGx5ID0gZGlmZkNoaWxkcmVuKGEsIGIsIHBhdGNoLCBhcHBseSwgaW5kZXgpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGFwcGx5ID0gYXBwZW5kUGF0Y2goYXBwbHksIG5ldyBWUGF0Y2goVlBhdGNoLlZOT0RFLCBhLCBiKSlcbiAgICAgICAgICAgICAgICBhcHBseUNsZWFyID0gdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYXBwbHkgPSBhcHBlbmRQYXRjaChhcHBseSwgbmV3IFZQYXRjaChWUGF0Y2guVk5PREUsIGEsIGIpKVxuICAgICAgICAgICAgYXBwbHlDbGVhciA9IHRydWVcbiAgICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaXNWVGV4dChiKSkge1xuICAgICAgICBpZiAoIWlzVlRleHQoYSkpIHtcbiAgICAgICAgICAgIGFwcGx5ID0gYXBwZW5kUGF0Y2goYXBwbHksIG5ldyBWUGF0Y2goVlBhdGNoLlZURVhULCBhLCBiKSlcbiAgICAgICAgICAgIGFwcGx5Q2xlYXIgPSB0cnVlXG4gICAgICAgIH0gZWxzZSBpZiAoYS50ZXh0ICE9PSBiLnRleHQpIHtcbiAgICAgICAgICAgIGFwcGx5ID0gYXBwZW5kUGF0Y2goYXBwbHksIG5ldyBWUGF0Y2goVlBhdGNoLlZURVhULCBhLCBiKSlcbiAgICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaXNXaWRnZXQoYikpIHtcbiAgICAgICAgaWYgKCFpc1dpZGdldChhKSkge1xuICAgICAgICAgICAgYXBwbHlDbGVhciA9IHRydWVcbiAgICAgICAgfVxuXG4gICAgICAgIGFwcGx5ID0gYXBwZW5kUGF0Y2goYXBwbHksIG5ldyBWUGF0Y2goVlBhdGNoLldJREdFVCwgYSwgYikpXG4gICAgfVxuXG4gICAgaWYgKGFwcGx5KSB7XG4gICAgICAgIHBhdGNoW2luZGV4XSA9IGFwcGx5XG4gICAgfVxuXG4gICAgaWYgKGFwcGx5Q2xlYXIpIHtcbiAgICAgICAgY2xlYXJTdGF0ZShhLCBwYXRjaCwgaW5kZXgpXG4gICAgfVxufVxuXG5mdW5jdGlvbiBkaWZmQ2hpbGRyZW4oYSwgYiwgcGF0Y2gsIGFwcGx5LCBpbmRleCkge1xuICAgIHZhciBhQ2hpbGRyZW4gPSBhLmNoaWxkcmVuXG4gICAgdmFyIG9yZGVyZWRTZXQgPSByZW9yZGVyKGFDaGlsZHJlbiwgYi5jaGlsZHJlbilcbiAgICB2YXIgYkNoaWxkcmVuID0gb3JkZXJlZFNldC5jaGlsZHJlblxuXG4gICAgdmFyIGFMZW4gPSBhQ2hpbGRyZW4ubGVuZ3RoXG4gICAgdmFyIGJMZW4gPSBiQ2hpbGRyZW4ubGVuZ3RoXG4gICAgdmFyIGxlbiA9IGFMZW4gPiBiTGVuID8gYUxlbiA6IGJMZW5cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgdmFyIGxlZnROb2RlID0gYUNoaWxkcmVuW2ldXG4gICAgICAgIHZhciByaWdodE5vZGUgPSBiQ2hpbGRyZW5baV1cbiAgICAgICAgaW5kZXggKz0gMVxuXG4gICAgICAgIGlmICghbGVmdE5vZGUpIHtcbiAgICAgICAgICAgIGlmIChyaWdodE5vZGUpIHtcbiAgICAgICAgICAgICAgICAvLyBFeGNlc3Mgbm9kZXMgaW4gYiBuZWVkIHRvIGJlIGFkZGVkXG4gICAgICAgICAgICAgICAgYXBwbHkgPSBhcHBlbmRQYXRjaChhcHBseSxcbiAgICAgICAgICAgICAgICAgICAgbmV3IFZQYXRjaChWUGF0Y2guSU5TRVJULCBudWxsLCByaWdodE5vZGUpKVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgd2FsayhsZWZ0Tm9kZSwgcmlnaHROb2RlLCBwYXRjaCwgaW5kZXgpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNWTm9kZShsZWZ0Tm9kZSkgJiYgbGVmdE5vZGUuY291bnQpIHtcbiAgICAgICAgICAgIGluZGV4ICs9IGxlZnROb2RlLmNvdW50XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAob3JkZXJlZFNldC5tb3Zlcykge1xuICAgICAgICAvLyBSZW9yZGVyIG5vZGVzIGxhc3RcbiAgICAgICAgYXBwbHkgPSBhcHBlbmRQYXRjaChhcHBseSwgbmV3IFZQYXRjaChcbiAgICAgICAgICAgIFZQYXRjaC5PUkRFUixcbiAgICAgICAgICAgIGEsXG4gICAgICAgICAgICBvcmRlcmVkU2V0Lm1vdmVzXG4gICAgICAgICkpXG4gICAgfVxuXG4gICAgcmV0dXJuIGFwcGx5XG59XG5cbmZ1bmN0aW9uIGNsZWFyU3RhdGUodk5vZGUsIHBhdGNoLCBpbmRleCkge1xuICAgIC8vIFRPRE86IE1ha2UgdGhpcyBhIHNpbmdsZSB3YWxrLCBub3QgdHdvXG4gICAgdW5ob29rKHZOb2RlLCBwYXRjaCwgaW5kZXgpXG4gICAgZGVzdHJveVdpZGdldHModk5vZGUsIHBhdGNoLCBpbmRleClcbn1cblxuLy8gUGF0Y2ggcmVjb3JkcyBmb3IgYWxsIGRlc3Ryb3llZCB3aWRnZXRzIG11c3QgYmUgYWRkZWQgYmVjYXVzZSB3ZSBuZWVkXG4vLyBhIERPTSBub2RlIHJlZmVyZW5jZSBmb3IgdGhlIGRlc3Ryb3kgZnVuY3Rpb25cbmZ1bmN0aW9uIGRlc3Ryb3lXaWRnZXRzKHZOb2RlLCBwYXRjaCwgaW5kZXgpIHtcbiAgICBpZiAoaXNXaWRnZXQodk5vZGUpKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygdk5vZGUuZGVzdHJveSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICBwYXRjaFtpbmRleF0gPSBhcHBlbmRQYXRjaChcbiAgICAgICAgICAgICAgICBwYXRjaFtpbmRleF0sXG4gICAgICAgICAgICAgICAgbmV3IFZQYXRjaChWUGF0Y2guUkVNT1ZFLCB2Tm9kZSwgbnVsbClcbiAgICAgICAgICAgIClcbiAgICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaXNWTm9kZSh2Tm9kZSkgJiYgKHZOb2RlLmhhc1dpZGdldHMgfHwgdk5vZGUuaGFzVGh1bmtzKSkge1xuICAgICAgICB2YXIgY2hpbGRyZW4gPSB2Tm9kZS5jaGlsZHJlblxuICAgICAgICB2YXIgbGVuID0gY2hpbGRyZW4ubGVuZ3RoXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBjaGlsZCA9IGNoaWxkcmVuW2ldXG4gICAgICAgICAgICBpbmRleCArPSAxXG5cbiAgICAgICAgICAgIGRlc3Ryb3lXaWRnZXRzKGNoaWxkLCBwYXRjaCwgaW5kZXgpXG5cbiAgICAgICAgICAgIGlmIChpc1ZOb2RlKGNoaWxkKSAmJiBjaGlsZC5jb3VudCkge1xuICAgICAgICAgICAgICAgIGluZGV4ICs9IGNoaWxkLmNvdW50XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzVGh1bmsodk5vZGUpKSB7XG4gICAgICAgIHRodW5rcyh2Tm9kZSwgbnVsbCwgcGF0Y2gsIGluZGV4KVxuICAgIH1cbn1cblxuLy8gQ3JlYXRlIGEgc3ViLXBhdGNoIGZvciB0aHVua3NcbmZ1bmN0aW9uIHRodW5rcyhhLCBiLCBwYXRjaCwgaW5kZXgpIHtcbiAgICB2YXIgbm9kZXMgPSBoYW5kbGVUaHVuayhhLCBiKVxuICAgIHZhciB0aHVua1BhdGNoID0gZGlmZihub2Rlcy5hLCBub2Rlcy5iKVxuICAgIGlmIChoYXNQYXRjaGVzKHRodW5rUGF0Y2gpKSB7XG4gICAgICAgIHBhdGNoW2luZGV4XSA9IG5ldyBWUGF0Y2goVlBhdGNoLlRIVU5LLCBudWxsLCB0aHVua1BhdGNoKVxuICAgIH1cbn1cblxuZnVuY3Rpb24gaGFzUGF0Y2hlcyhwYXRjaCkge1xuICAgIGZvciAodmFyIGluZGV4IGluIHBhdGNoKSB7XG4gICAgICAgIGlmIChpbmRleCAhPT0gXCJhXCIpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2Vcbn1cblxuLy8gRXhlY3V0ZSBob29rcyB3aGVuIHR3byBub2RlcyBhcmUgaWRlbnRpY2FsXG5mdW5jdGlvbiB1bmhvb2sodk5vZGUsIHBhdGNoLCBpbmRleCkge1xuICAgIGlmIChpc1ZOb2RlKHZOb2RlKSkge1xuICAgICAgICBpZiAodk5vZGUuaG9va3MpIHtcbiAgICAgICAgICAgIHBhdGNoW2luZGV4XSA9IGFwcGVuZFBhdGNoKFxuICAgICAgICAgICAgICAgIHBhdGNoW2luZGV4XSxcbiAgICAgICAgICAgICAgICBuZXcgVlBhdGNoKFxuICAgICAgICAgICAgICAgICAgICBWUGF0Y2guUFJPUFMsXG4gICAgICAgICAgICAgICAgICAgIHZOb2RlLFxuICAgICAgICAgICAgICAgICAgICB1bmRlZmluZWRLZXlzKHZOb2RlLmhvb2tzKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIClcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2Tm9kZS5kZXNjZW5kYW50SG9va3MgfHwgdk5vZGUuaGFzVGh1bmtzKSB7XG4gICAgICAgICAgICB2YXIgY2hpbGRyZW4gPSB2Tm9kZS5jaGlsZHJlblxuICAgICAgICAgICAgdmFyIGxlbiA9IGNoaWxkcmVuLmxlbmd0aFxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IGNoaWxkcmVuW2ldXG4gICAgICAgICAgICAgICAgaW5kZXggKz0gMVxuXG4gICAgICAgICAgICAgICAgdW5ob29rKGNoaWxkLCBwYXRjaCwgaW5kZXgpXG5cbiAgICAgICAgICAgICAgICBpZiAoaXNWTm9kZShjaGlsZCkgJiYgY2hpbGQuY291bnQpIHtcbiAgICAgICAgICAgICAgICAgICAgaW5kZXggKz0gY2hpbGQuY291bnRcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzVGh1bmsodk5vZGUpKSB7XG4gICAgICAgIHRodW5rcyh2Tm9kZSwgbnVsbCwgcGF0Y2gsIGluZGV4KVxuICAgIH1cbn1cblxuZnVuY3Rpb24gdW5kZWZpbmVkS2V5cyhvYmopIHtcbiAgICB2YXIgcmVzdWx0ID0ge31cblxuICAgIGZvciAodmFyIGtleSBpbiBvYmopIHtcbiAgICAgICAgcmVzdWx0W2tleV0gPSB1bmRlZmluZWRcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0XG59XG5cbi8vIExpc3QgZGlmZiwgbmFpdmUgbGVmdCB0byByaWdodCByZW9yZGVyaW5nXG5mdW5jdGlvbiByZW9yZGVyKGFDaGlsZHJlbiwgYkNoaWxkcmVuKSB7XG4gICAgLy8gTyhNKSB0aW1lLCBPKE0pIG1lbW9yeVxuICAgIHZhciBiQ2hpbGRJbmRleCA9IGtleUluZGV4KGJDaGlsZHJlbilcbiAgICB2YXIgYktleXMgPSBiQ2hpbGRJbmRleC5rZXlzXG4gICAgdmFyIGJGcmVlID0gYkNoaWxkSW5kZXguZnJlZVxuXG4gICAgaWYgKGJGcmVlLmxlbmd0aCA9PT0gYkNoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY2hpbGRyZW46IGJDaGlsZHJlbixcbiAgICAgICAgICAgIG1vdmVzOiBudWxsXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBPKE4pIHRpbWUsIE8oTikgbWVtb3J5XG4gICAgdmFyIGFDaGlsZEluZGV4ID0ga2V5SW5kZXgoYUNoaWxkcmVuKVxuICAgIHZhciBhS2V5cyA9IGFDaGlsZEluZGV4LmtleXNcbiAgICB2YXIgYUZyZWUgPSBhQ2hpbGRJbmRleC5mcmVlXG5cbiAgICBpZiAoYUZyZWUubGVuZ3RoID09PSBhQ2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjaGlsZHJlbjogYkNoaWxkcmVuLFxuICAgICAgICAgICAgbW92ZXM6IG51bGxcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIE8oTUFYKE4sIE0pKSBtZW1vcnlcbiAgICB2YXIgbmV3Q2hpbGRyZW4gPSBbXVxuXG4gICAgdmFyIGZyZWVJbmRleCA9IDBcbiAgICB2YXIgZnJlZUNvdW50ID0gYkZyZWUubGVuZ3RoXG4gICAgdmFyIGRlbGV0ZWRJdGVtcyA9IDBcblxuICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCBhIGFuZCBtYXRjaCBhIG5vZGUgaW4gYlxuICAgIC8vIE8oTikgdGltZSxcbiAgICBmb3IgKHZhciBpID0gMCA7IGkgPCBhQ2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGFJdGVtID0gYUNoaWxkcmVuW2ldXG4gICAgICAgIHZhciBpdGVtSW5kZXhcblxuICAgICAgICBpZiAoYUl0ZW0ua2V5KSB7XG4gICAgICAgICAgICBpZiAoYktleXMuaGFzT3duUHJvcGVydHkoYUl0ZW0ua2V5KSkge1xuICAgICAgICAgICAgICAgIC8vIE1hdGNoIHVwIHRoZSBvbGQga2V5c1xuICAgICAgICAgICAgICAgIGl0ZW1JbmRleCA9IGJLZXlzW2FJdGVtLmtleV1cbiAgICAgICAgICAgICAgICBuZXdDaGlsZHJlbi5wdXNoKGJDaGlsZHJlbltpdGVtSW5kZXhdKVxuXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBvbGQga2V5ZWQgaXRlbXNcbiAgICAgICAgICAgICAgICBpdGVtSW5kZXggPSBpIC0gZGVsZXRlZEl0ZW1zKytcbiAgICAgICAgICAgICAgICBuZXdDaGlsZHJlbi5wdXNoKG51bGwpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBNYXRjaCB0aGUgaXRlbSBpbiBhIHdpdGggdGhlIG5leHQgZnJlZSBpdGVtIGluIGJcbiAgICAgICAgICAgIGlmIChmcmVlSW5kZXggPCBmcmVlQ291bnQpIHtcbiAgICAgICAgICAgICAgICBpdGVtSW5kZXggPSBiRnJlZVtmcmVlSW5kZXgrK11cbiAgICAgICAgICAgICAgICBuZXdDaGlsZHJlbi5wdXNoKGJDaGlsZHJlbltpdGVtSW5kZXhdKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBUaGVyZSBhcmUgbm8gZnJlZSBpdGVtcyBpbiBiIHRvIG1hdGNoIHdpdGhcbiAgICAgICAgICAgICAgICAvLyB0aGUgZnJlZSBpdGVtcyBpbiBhLCBzbyB0aGUgZXh0cmEgZnJlZSBub2Rlc1xuICAgICAgICAgICAgICAgIC8vIGFyZSBkZWxldGVkLlxuICAgICAgICAgICAgICAgIGl0ZW1JbmRleCA9IGkgLSBkZWxldGVkSXRlbXMrK1xuICAgICAgICAgICAgICAgIG5ld0NoaWxkcmVuLnB1c2gobnVsbClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBsYXN0RnJlZUluZGV4ID0gZnJlZUluZGV4ID49IGJGcmVlLmxlbmd0aCA/XG4gICAgICAgIGJDaGlsZHJlbi5sZW5ndGggOlxuICAgICAgICBiRnJlZVtmcmVlSW5kZXhdXG5cbiAgICAvLyBJdGVyYXRlIHRocm91Z2ggYiBhbmQgYXBwZW5kIGFueSBuZXcga2V5c1xuICAgIC8vIE8oTSkgdGltZVxuICAgIGZvciAodmFyIGogPSAwOyBqIDwgYkNoaWxkcmVuLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIHZhciBuZXdJdGVtID0gYkNoaWxkcmVuW2pdXG5cbiAgICAgICAgaWYgKG5ld0l0ZW0ua2V5KSB7XG4gICAgICAgICAgICBpZiAoIWFLZXlzLmhhc093blByb3BlcnR5KG5ld0l0ZW0ua2V5KSkge1xuICAgICAgICAgICAgICAgIC8vIEFkZCBhbnkgbmV3IGtleWVkIGl0ZW1zXG4gICAgICAgICAgICAgICAgLy8gV2UgYXJlIGFkZGluZyBuZXcgaXRlbXMgdG8gdGhlIGVuZCBhbmQgdGhlbiBzb3J0aW5nIHRoZW1cbiAgICAgICAgICAgICAgICAvLyBpbiBwbGFjZS4gSW4gZnV0dXJlIHdlIHNob3VsZCBpbnNlcnQgbmV3IGl0ZW1zIGluIHBsYWNlLlxuICAgICAgICAgICAgICAgIG5ld0NoaWxkcmVuLnB1c2gobmV3SXRlbSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChqID49IGxhc3RGcmVlSW5kZXgpIHtcbiAgICAgICAgICAgIC8vIEFkZCBhbnkgbGVmdG92ZXIgbm9uLWtleWVkIGl0ZW1zXG4gICAgICAgICAgICBuZXdDaGlsZHJlbi5wdXNoKG5ld0l0ZW0pXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgc2ltdWxhdGUgPSBuZXdDaGlsZHJlbi5zbGljZSgpXG4gICAgdmFyIHNpbXVsYXRlSW5kZXggPSAwXG4gICAgdmFyIHJlbW92ZXMgPSBbXVxuICAgIHZhciBpbnNlcnRzID0gW11cbiAgICB2YXIgc2ltdWxhdGVJdGVtXG5cbiAgICBmb3IgKHZhciBrID0gMDsgayA8IGJDaGlsZHJlbi5sZW5ndGg7KSB7XG4gICAgICAgIHZhciB3YW50ZWRJdGVtID0gYkNoaWxkcmVuW2tdXG4gICAgICAgIHNpbXVsYXRlSXRlbSA9IHNpbXVsYXRlW3NpbXVsYXRlSW5kZXhdXG5cbiAgICAgICAgLy8gcmVtb3ZlIGl0ZW1zXG4gICAgICAgIHdoaWxlIChzaW11bGF0ZUl0ZW0gPT09IG51bGwgJiYgc2ltdWxhdGUubGVuZ3RoKSB7XG4gICAgICAgICAgICByZW1vdmVzLnB1c2gocmVtb3ZlKHNpbXVsYXRlLCBzaW11bGF0ZUluZGV4LCBudWxsKSlcbiAgICAgICAgICAgIHNpbXVsYXRlSXRlbSA9IHNpbXVsYXRlW3NpbXVsYXRlSW5kZXhdXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXNpbXVsYXRlSXRlbSB8fCBzaW11bGF0ZUl0ZW0ua2V5ICE9PSB3YW50ZWRJdGVtLmtleSkge1xuICAgICAgICAgICAgLy8gaWYgd2UgbmVlZCBhIGtleSBpbiB0aGlzIHBvc2l0aW9uLi4uXG4gICAgICAgICAgICBpZiAod2FudGVkSXRlbS5rZXkpIHtcbiAgICAgICAgICAgICAgICBpZiAoc2ltdWxhdGVJdGVtICYmIHNpbXVsYXRlSXRlbS5rZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgYW4gaW5zZXJ0IGRvZXNuJ3QgcHV0IHRoaXMga2V5IGluIHBsYWNlLCBpdCBuZWVkcyB0byBtb3ZlXG4gICAgICAgICAgICAgICAgICAgIGlmIChiS2V5c1tzaW11bGF0ZUl0ZW0ua2V5XSAhPT0gayArIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZXMucHVzaChyZW1vdmUoc2ltdWxhdGUsIHNpbXVsYXRlSW5kZXgsIHNpbXVsYXRlSXRlbS5rZXkpKVxuICAgICAgICAgICAgICAgICAgICAgICAgc2ltdWxhdGVJdGVtID0gc2ltdWxhdGVbc2ltdWxhdGVJbmRleF1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSByZW1vdmUgZGlkbid0IHB1dCB0aGUgd2FudGVkIGl0ZW0gaW4gcGxhY2UsIHdlIG5lZWQgdG8gaW5zZXJ0IGl0XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNpbXVsYXRlSXRlbSB8fCBzaW11bGF0ZUl0ZW0ua2V5ICE9PSB3YW50ZWRJdGVtLmtleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydHMucHVzaCh7a2V5OiB3YW50ZWRJdGVtLmtleSwgdG86IGt9KVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXRlbXMgYXJlIG1hdGNoaW5nLCBzbyBza2lwIGFoZWFkXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW11bGF0ZUluZGV4KytcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydHMucHVzaCh7a2V5OiB3YW50ZWRJdGVtLmtleSwgdG86IGt9KVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpbnNlcnRzLnB1c2goe2tleTogd2FudGVkSXRlbS5rZXksIHRvOiBrfSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaysrXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBhIGtleSBpbiBzaW11bGF0ZSBoYXMgbm8gbWF0Y2hpbmcgd2FudGVkIGtleSwgcmVtb3ZlIGl0XG4gICAgICAgICAgICBlbHNlIGlmIChzaW11bGF0ZUl0ZW0gJiYgc2ltdWxhdGVJdGVtLmtleSkge1xuICAgICAgICAgICAgICAgIHJlbW92ZXMucHVzaChyZW1vdmUoc2ltdWxhdGUsIHNpbXVsYXRlSW5kZXgsIHNpbXVsYXRlSXRlbS5rZXkpKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc2ltdWxhdGVJbmRleCsrXG4gICAgICAgICAgICBrKytcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIHJlbW92ZSBhbGwgdGhlIHJlbWFpbmluZyBub2RlcyBmcm9tIHNpbXVsYXRlXG4gICAgd2hpbGUoc2ltdWxhdGVJbmRleCA8IHNpbXVsYXRlLmxlbmd0aCkge1xuICAgICAgICBzaW11bGF0ZUl0ZW0gPSBzaW11bGF0ZVtzaW11bGF0ZUluZGV4XVxuICAgICAgICByZW1vdmVzLnB1c2gocmVtb3ZlKHNpbXVsYXRlLCBzaW11bGF0ZUluZGV4LCBzaW11bGF0ZUl0ZW0gJiYgc2ltdWxhdGVJdGVtLmtleSkpXG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIG9ubHkgbW92ZXMgd2UgaGF2ZSBhcmUgZGVsZXRlcyB0aGVuIHdlIGNhbiBqdXN0XG4gICAgLy8gbGV0IHRoZSBkZWxldGUgcGF0Y2ggcmVtb3ZlIHRoZXNlIGl0ZW1zLlxuICAgIGlmIChyZW1vdmVzLmxlbmd0aCA9PT0gZGVsZXRlZEl0ZW1zICYmICFpbnNlcnRzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY2hpbGRyZW46IG5ld0NoaWxkcmVuLFxuICAgICAgICAgICAgbW92ZXM6IG51bGxcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAgIGNoaWxkcmVuOiBuZXdDaGlsZHJlbixcbiAgICAgICAgbW92ZXM6IHtcbiAgICAgICAgICAgIHJlbW92ZXM6IHJlbW92ZXMsXG4gICAgICAgICAgICBpbnNlcnRzOiBpbnNlcnRzXG4gICAgICAgIH1cbiAgICB9XG59XG5cbmZ1bmN0aW9uIHJlbW92ZShhcnIsIGluZGV4LCBrZXkpIHtcbiAgICBhcnIuc3BsaWNlKGluZGV4LCAxKVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgZnJvbTogaW5kZXgsXG4gICAgICAgIGtleToga2V5XG4gICAgfVxufVxuXG5mdW5jdGlvbiBrZXlJbmRleChjaGlsZHJlbikge1xuICAgIHZhciBrZXlzID0ge31cbiAgICB2YXIgZnJlZSA9IFtdXG4gICAgdmFyIGxlbmd0aCA9IGNoaWxkcmVuLmxlbmd0aFxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgY2hpbGQgPSBjaGlsZHJlbltpXVxuXG4gICAgICAgIGlmIChjaGlsZC5rZXkpIHtcbiAgICAgICAgICAgIGtleXNbY2hpbGQua2V5XSA9IGlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZyZWUucHVzaChpKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAga2V5czoga2V5cywgICAgIC8vIEEgaGFzaCBvZiBrZXkgbmFtZSB0byBpbmRleFxuICAgICAgICBmcmVlOiBmcmVlICAgICAgLy8gQW4gYXJyYXkgb2YgdW5rZXllZCBpdGVtIGluZGljZXNcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGFwcGVuZFBhdGNoKGFwcGx5LCBwYXRjaCkge1xuICAgIGlmIChhcHBseSkge1xuICAgICAgICBpZiAoaXNBcnJheShhcHBseSkpIHtcbiAgICAgICAgICAgIGFwcGx5LnB1c2gocGF0Y2gpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhcHBseSA9IFthcHBseSwgcGF0Y2hdXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXBwbHlcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gcGF0Y2hcbiAgICB9XG59XG4iLCJ2YXIgU2ltcGxlUGVlciA9IHJlcXVpcmUoJ3NpbXBsZS1wZWVyJylcbnZhciBldmVudHMgPSByZXF1aXJlKCdldmVudHMnKVxudmFyIHRocm91Z2ggPSByZXF1aXJlKCd0aHJvdWdoMicpXG52YXIgY3VpZCA9IHJlcXVpcmUoJ2N1aWQnKVxudmFyIG9uY2UgPSByZXF1aXJlKCdvbmNlJylcbnZhciBkZWJ1ZyA9IHJlcXVpcmUoJ2RlYnVnJykoJ3dlYnJ0Yy1zd2FybScpXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGh1Yiwgb3B0cykge1xuICBpZiAoIW9wdHMpIG9wdHMgPSB7fVxuICB2YXIgd3JhcCA9IG9wdHMud3JhcCB8fCBmdW5jdGlvbiAoZGF0YSkgeyByZXR1cm4gZGF0YSB9XG4gIHZhciB1bndyYXAgPSBvcHRzLnVud3JhcCB8fCBmdW5jdGlvbiAoZGF0YSkgeyByZXR1cm4gZGF0YSB9XG5cbiAgdmFyIHN3YXJtID0gbmV3IGV2ZW50cy5FdmVudEVtaXR0ZXIoKVxuICB2YXIgcmVtb3RlcyA9IHt9XG4gIHZhciBtZSA9IG9wdHMudXVpZCB8fCBjdWlkKClcbiAgZGVidWcoJ215IHV1aWQ6JywgbWUpXG5cbiAgc3dhcm0ubWF4UGVlcnMgPSBvcHRzLm1heFBlZXJzIHx8IEluZmluaXR5XG4gIHN3YXJtLnBlZXJzID0gW11cblxuICB2YXIgc2V0dXAgPSBmdW5jdGlvbiAocGVlciwgaWQpIHtcbiAgICBwZWVyLm9uKCdjb25uZWN0JywgZnVuY3Rpb24gKCkge1xuICAgICAgZGVidWcoJ2Nvbm5lY3RlZCB0byBwZWVyJywgaWQpXG4gICAgICBzd2FybS5wZWVycy5wdXNoKHBlZXIpXG4gICAgICBzd2FybS5lbWl0KCdwZWVyJywgcGVlciwgaWQpXG4gICAgICBzd2FybS5lbWl0KCdjb25uZWN0JywgcGVlciwgaWQpXG4gICAgfSlcblxuICAgIHZhciBvbmNsb3NlID0gb25jZShmdW5jdGlvbiAoZXJyKSB7XG4gICAgICBkZWJ1ZygnZGlzY29ubmVjdGVkIGZyb20gcGVlcicsIGlkLCBlcnIpXG4gICAgICBpZiAocmVtb3Rlc1tpZF0gPT09IHBlZXIpIGRlbGV0ZSByZW1vdGVzW2lkXVxuICAgICAgdmFyIGkgPSBzd2FybS5wZWVycy5pbmRleE9mKHBlZXIpXG4gICAgICBpZiAoaSA+IC0xKSBzd2FybS5wZWVycy5zcGxpY2UoaSwgMSlcbiAgICAgIHN3YXJtLmVtaXQoJ2Rpc2Nvbm5lY3QnLCBwZWVyLCBpZClcbiAgICB9KVxuXG4gICAgdmFyIHNpZ25hbHMgPSBbXVxuICAgIHZhciBzZW5kaW5nID0gZmFsc2VcblxuICAgIHZhciBraWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKHNlbmRpbmcgfHwgIXNpZ25hbHMubGVuZ3RoKSByZXR1cm5cbiAgICAgIHNlbmRpbmcgPSB0cnVlXG4gICAgICB2YXIgZGF0YSA9IHtmcm9tOiBtZSwgc2lnbmFsOiBzaWduYWxzLnNoaWZ0KCl9XG4gICAgICBkYXRhID0gd3JhcChkYXRhLCBpZClcbiAgICAgIGh1Yi5icm9hZGNhc3QoaWQsIGRhdGEsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc2VuZGluZyA9IGZhbHNlXG4gICAgICAgIGtpY2soKVxuICAgICAgfSlcbiAgICB9XG5cbiAgICBwZWVyLm9uKCdzaWduYWwnLCBmdW5jdGlvbiAoc2lnKSB7XG4gICAgICBzaWduYWxzLnB1c2goc2lnKVxuICAgICAga2ljaygpXG4gICAgfSlcblxuICAgIHBlZXIub24oJ2Vycm9yJywgb25jbG9zZSlcbiAgICBwZWVyLm9uY2UoJ2Nsb3NlJywgb25jbG9zZSlcbiAgfVxuXG4gIGh1Yi5zdWJzY3JpYmUoJ2FsbCcpLnBpcGUodGhyb3VnaC5vYmooZnVuY3Rpb24gKGRhdGEsIGVuYywgY2IpIHtcbiAgICBkYXRhID0gdW53cmFwKGRhdGEsICdhbGwnKVxuICAgIGlmICghZGF0YSkgcmV0dXJuIGNiKClcblxuICAgIGRlYnVnKCcvYWxsJywgZGF0YSlcbiAgICBpZiAoZGF0YS5mcm9tID09PSBtZSkge1xuICAgICAgZGVidWcoJ3NraXBwaW5nIHNlbGYnLCBkYXRhLmZyb20pXG4gICAgICByZXR1cm4gY2IoKVxuICAgIH1cblxuICAgIGlmIChkYXRhLnR5cGUgPT09ICdjb25uZWN0Jykge1xuICAgICAgaWYgKHN3YXJtLnBlZXJzLmxlbmd0aCA+PSBzd2FybS5tYXhQZWVycykge1xuICAgICAgICBkZWJ1Zygnc2tpcHBpbmcgYmVjYXVzZSBtYXhQZWVycyBpcyBtZXQnLCBkYXRhLmZyb20pXG4gICAgICAgIHJldHVybiBjYigpXG4gICAgICB9XG4gICAgICBpZiAocmVtb3Rlc1tkYXRhLmZyb21dKSB7XG4gICAgICAgIGRlYnVnKCdza2lwcGluZyBleGlzdGluZyByZW1vdGUnLCBkYXRhLmZyb20pXG4gICAgICAgIHJldHVybiBjYigpXG4gICAgICB9XG5cbiAgICAgIGRlYnVnKCdjb25uZWN0aW5nIHRvIG5ldyBwZWVyIChhcyBpbml0aWF0b3IpJywgZGF0YS5mcm9tKVxuICAgICAgdmFyIHBlZXIgPSBuZXcgU2ltcGxlUGVlcih7XG4gICAgICAgIHdydGM6IG9wdHMud3J0YyxcbiAgICAgICAgaW5pdGlhdG9yOiB0cnVlLFxuICAgICAgICBjb25maWc6IG9wdHMuY29uZmlnXG4gICAgICB9KVxuXG4gICAgICBzZXR1cChwZWVyLCBkYXRhLmZyb20pXG4gICAgICByZW1vdGVzW2RhdGEuZnJvbV0gPSBwZWVyXG4gICAgfVxuXG4gICAgY2IoKVxuICB9KSlcblxuICB2YXIgY29ubmVjdCA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoc3dhcm0ucGVlcnMubGVuZ3RoID49IHN3YXJtLm1heFBlZXJzKSByZXR1cm5cbiAgICB2YXIgZGF0YSA9IHt0eXBlOiAnY29ubmVjdCcsIGZyb206IG1lfVxuICAgIGRhdGEgPSB3cmFwKGRhdGEsICdhbGwnKVxuICAgIGh1Yi5icm9hZGNhc3QoJ2FsbCcsIGRhdGEsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHNldFRpbWVvdXQoY29ubmVjdCwgTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMjAwMCkgKyAoc3dhcm0ucGVlcnMubGVuZ3RoID8gMTMwMDAgOiAzMDAwKSlcbiAgICB9KVxuICB9XG5cbiAgaHViLnN1YnNjcmliZShtZSkub25jZSgnb3BlbicsIGNvbm5lY3QpLnBpcGUodGhyb3VnaC5vYmooZnVuY3Rpb24gKGRhdGEsIGVuYywgY2IpIHtcbiAgICBkYXRhID0gdW53cmFwKGRhdGEsIG1lKVxuICAgIGlmICghZGF0YSkgcmV0dXJuIGNiKClcblxuICAgIHZhciBwZWVyID0gcmVtb3Rlc1tkYXRhLmZyb21dXG4gICAgaWYgKCFwZWVyKSB7XG4gICAgICBpZiAoIWRhdGEuc2lnbmFsIHx8IGRhdGEuc2lnbmFsLnR5cGUgIT09ICdvZmZlcicpIHtcbiAgICAgICAgZGVidWcoJ3NraXBwaW5nIG5vbi1vZmZlcicsIGRhdGEpXG4gICAgICAgIHJldHVybiBjYigpXG4gICAgICB9XG5cbiAgICAgIGRlYnVnKCdjb25uZWN0aW5nIHRvIG5ldyBwZWVyIChhcyBub3QgaW5pdGlhdG9yKScsIGRhdGEuZnJvbSlcbiAgICAgIHBlZXIgPSByZW1vdGVzW2RhdGEuZnJvbV0gPSBuZXcgU2ltcGxlUGVlcih7XG4gICAgICAgIHdydGM6IG9wdHMud3J0YyxcbiAgICAgICAgY29uZmlnOiBvcHRzLmNvbmZpZ1xuICAgICAgfSlcblxuICAgICAgc2V0dXAocGVlciwgZGF0YS5mcm9tKVxuICAgIH1cblxuICAgIGRlYnVnKCdzaWduYWxsaW5nJywgZGF0YS5mcm9tLCBkYXRhLnNpZ25hbClcbiAgICBwZWVyLnNpZ25hbChkYXRhLnNpZ25hbClcbiAgICBjYigpXG4gIH0pKVxuXG4gIHJldHVybiBzd2FybVxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWRhYmxlO1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIHByb2Nlc3NOZXh0VGljayA9IHJlcXVpcmUoJ3Byb2Nlc3MtbmV4dGljay1hcmdzJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIGlzQXJyYXkgPSByZXF1aXJlKCdpc2FycmF5Jyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ2J1ZmZlcicpLkJ1ZmZlcjtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG5SZWFkYWJsZS5SZWFkYWJsZVN0YXRlID0gUmVhZGFibGVTdGF0ZTtcblxudmFyIEVFID0gcmVxdWlyZSgnZXZlbnRzJyk7XG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgRUVsaXN0ZW5lckNvdW50ID0gZnVuY3Rpb24oZW1pdHRlciwgdHlwZSkge1xuICByZXR1cm4gZW1pdHRlci5saXN0ZW5lcnModHlwZSkubGVuZ3RoO1xufTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG5cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBTdHJlYW07XG4oZnVuY3Rpb24gKCl7dHJ5e1xuICBTdHJlYW0gPSByZXF1aXJlKCdzdCcgKyAncmVhbScpO1xufWNhdGNoKF8pe31maW5hbGx5e1xuICBpZiAoIVN0cmVhbSlcbiAgICBTdHJlYW0gPSByZXF1aXJlKCdldmVudHMnKS5FdmVudEVtaXR0ZXI7XG59fSgpKVxuLyo8L3JlcGxhY2VtZW50PiovXG5cbnZhciBCdWZmZXIgPSByZXF1aXJlKCdidWZmZXInKS5CdWZmZXI7XG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgdXRpbCA9IHJlcXVpcmUoJ2NvcmUtdXRpbC1pcycpO1xudXRpbC5pbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgZGVidWdVdGlsID0gcmVxdWlyZSgndXRpbCcpO1xudmFyIGRlYnVnO1xuaWYgKGRlYnVnVXRpbCAmJiBkZWJ1Z1V0aWwuZGVidWdsb2cpIHtcbiAgZGVidWcgPSBkZWJ1Z1V0aWwuZGVidWdsb2coJ3N0cmVhbScpO1xufSBlbHNlIHtcbiAgZGVidWcgPSBmdW5jdGlvbiAoKSB7fTtcbn1cbi8qPC9yZXBsYWNlbWVudD4qL1xuXG52YXIgU3RyaW5nRGVjb2RlcjtcblxudXRpbC5pbmhlcml0cyhSZWFkYWJsZSwgU3RyZWFtKTtcblxudmFyIER1cGxleDtcbmZ1bmN0aW9uIFJlYWRhYmxlU3RhdGUob3B0aW9ucywgc3RyZWFtKSB7XG4gIER1cGxleCA9IER1cGxleCB8fCByZXF1aXJlKCcuL19zdHJlYW1fZHVwbGV4Jyk7XG5cbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgLy8gb2JqZWN0IHN0cmVhbSBmbGFnLiBVc2VkIHRvIG1ha2UgcmVhZChuKSBpZ25vcmUgbiBhbmQgdG9cbiAgLy8gbWFrZSBhbGwgdGhlIGJ1ZmZlciBtZXJnaW5nIGFuZCBsZW5ndGggY2hlY2tzIGdvIGF3YXlcbiAgdGhpcy5vYmplY3RNb2RlID0gISFvcHRpb25zLm9iamVjdE1vZGU7XG5cbiAgaWYgKHN0cmVhbSBpbnN0YW5jZW9mIER1cGxleClcbiAgICB0aGlzLm9iamVjdE1vZGUgPSB0aGlzLm9iamVjdE1vZGUgfHwgISFvcHRpb25zLnJlYWRhYmxlT2JqZWN0TW9kZTtcblxuICAvLyB0aGUgcG9pbnQgYXQgd2hpY2ggaXQgc3RvcHMgY2FsbGluZyBfcmVhZCgpIHRvIGZpbGwgdGhlIGJ1ZmZlclxuICAvLyBOb3RlOiAwIGlzIGEgdmFsaWQgdmFsdWUsIG1lYW5zIFwiZG9uJ3QgY2FsbCBfcmVhZCBwcmVlbXB0aXZlbHkgZXZlclwiXG4gIHZhciBod20gPSBvcHRpb25zLmhpZ2hXYXRlck1hcms7XG4gIHZhciBkZWZhdWx0SHdtID0gdGhpcy5vYmplY3RNb2RlID8gMTYgOiAxNiAqIDEwMjQ7XG4gIHRoaXMuaGlnaFdhdGVyTWFyayA9IChod20gfHwgaHdtID09PSAwKSA/IGh3bSA6IGRlZmF1bHRId207XG5cbiAgLy8gY2FzdCB0byBpbnRzLlxuICB0aGlzLmhpZ2hXYXRlck1hcmsgPSB+fnRoaXMuaGlnaFdhdGVyTWFyaztcblxuICB0aGlzLmJ1ZmZlciA9IFtdO1xuICB0aGlzLmxlbmd0aCA9IDA7XG4gIHRoaXMucGlwZXMgPSBudWxsO1xuICB0aGlzLnBpcGVzQ291bnQgPSAwO1xuICB0aGlzLmZsb3dpbmcgPSBudWxsO1xuICB0aGlzLmVuZGVkID0gZmFsc2U7XG4gIHRoaXMuZW5kRW1pdHRlZCA9IGZhbHNlO1xuICB0aGlzLnJlYWRpbmcgPSBmYWxzZTtcblxuICAvLyBhIGZsYWcgdG8gYmUgYWJsZSB0byB0ZWxsIGlmIHRoZSBvbndyaXRlIGNiIGlzIGNhbGxlZCBpbW1lZGlhdGVseSxcbiAgLy8gb3Igb24gYSBsYXRlciB0aWNrLiAgV2Ugc2V0IHRoaXMgdG8gdHJ1ZSBhdCBmaXJzdCwgYmVjYXVzZSBhbnlcbiAgLy8gYWN0aW9ucyB0aGF0IHNob3VsZG4ndCBoYXBwZW4gdW50aWwgXCJsYXRlclwiIHNob3VsZCBnZW5lcmFsbHkgYWxzb1xuICAvLyBub3QgaGFwcGVuIGJlZm9yZSB0aGUgZmlyc3Qgd3JpdGUgY2FsbC5cbiAgdGhpcy5zeW5jID0gdHJ1ZTtcblxuICAvLyB3aGVuZXZlciB3ZSByZXR1cm4gbnVsbCwgdGhlbiB3ZSBzZXQgYSBmbGFnIHRvIHNheVxuICAvLyB0aGF0IHdlJ3JlIGF3YWl0aW5nIGEgJ3JlYWRhYmxlJyBldmVudCBlbWlzc2lvbi5cbiAgdGhpcy5uZWVkUmVhZGFibGUgPSBmYWxzZTtcbiAgdGhpcy5lbWl0dGVkUmVhZGFibGUgPSBmYWxzZTtcbiAgdGhpcy5yZWFkYWJsZUxpc3RlbmluZyA9IGZhbHNlO1xuXG4gIC8vIENyeXB0byBpcyBraW5kIG9mIG9sZCBhbmQgY3J1c3R5LiAgSGlzdG9yaWNhbGx5LCBpdHMgZGVmYXVsdCBzdHJpbmdcbiAgLy8gZW5jb2RpbmcgaXMgJ2JpbmFyeScgc28gd2UgaGF2ZSB0byBtYWtlIHRoaXMgY29uZmlndXJhYmxlLlxuICAvLyBFdmVyeXRoaW5nIGVsc2UgaW4gdGhlIHVuaXZlcnNlIHVzZXMgJ3V0ZjgnLCB0aG91Z2guXG4gIHRoaXMuZGVmYXVsdEVuY29kaW5nID0gb3B0aW9ucy5kZWZhdWx0RW5jb2RpbmcgfHwgJ3V0ZjgnO1xuXG4gIC8vIHdoZW4gcGlwaW5nLCB3ZSBvbmx5IGNhcmUgYWJvdXQgJ3JlYWRhYmxlJyBldmVudHMgdGhhdCBoYXBwZW5cbiAgLy8gYWZ0ZXIgcmVhZCgpaW5nIGFsbCB0aGUgYnl0ZXMgYW5kIG5vdCBnZXR0aW5nIGFueSBwdXNoYmFjay5cbiAgdGhpcy5yYW5PdXQgPSBmYWxzZTtcblxuICAvLyB0aGUgbnVtYmVyIG9mIHdyaXRlcnMgdGhhdCBhcmUgYXdhaXRpbmcgYSBkcmFpbiBldmVudCBpbiAucGlwZSgpc1xuICB0aGlzLmF3YWl0RHJhaW4gPSAwO1xuXG4gIC8vIGlmIHRydWUsIGEgbWF5YmVSZWFkTW9yZSBoYXMgYmVlbiBzY2hlZHVsZWRcbiAgdGhpcy5yZWFkaW5nTW9yZSA9IGZhbHNlO1xuXG4gIHRoaXMuZGVjb2RlciA9IG51bGw7XG4gIHRoaXMuZW5jb2RpbmcgPSBudWxsO1xuICBpZiAob3B0aW9ucy5lbmNvZGluZykge1xuICAgIGlmICghU3RyaW5nRGVjb2RlcilcbiAgICAgIFN0cmluZ0RlY29kZXIgPSByZXF1aXJlKCdzdHJpbmdfZGVjb2Rlci8nKS5TdHJpbmdEZWNvZGVyO1xuICAgIHRoaXMuZGVjb2RlciA9IG5ldyBTdHJpbmdEZWNvZGVyKG9wdGlvbnMuZW5jb2RpbmcpO1xuICAgIHRoaXMuZW5jb2RpbmcgPSBvcHRpb25zLmVuY29kaW5nO1xuICB9XG59XG5cbnZhciBEdXBsZXg7XG5mdW5jdGlvbiBSZWFkYWJsZShvcHRpb25zKSB7XG4gIER1cGxleCA9IER1cGxleCB8fCByZXF1aXJlKCcuL19zdHJlYW1fZHVwbGV4Jyk7XG5cbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFJlYWRhYmxlKSlcbiAgICByZXR1cm4gbmV3IFJlYWRhYmxlKG9wdGlvbnMpO1xuXG4gIHRoaXMuX3JlYWRhYmxlU3RhdGUgPSBuZXcgUmVhZGFibGVTdGF0ZShvcHRpb25zLCB0aGlzKTtcblxuICAvLyBsZWdhY3lcbiAgdGhpcy5yZWFkYWJsZSA9IHRydWU7XG5cbiAgaWYgKG9wdGlvbnMgJiYgdHlwZW9mIG9wdGlvbnMucmVhZCA9PT0gJ2Z1bmN0aW9uJylcbiAgICB0aGlzLl9yZWFkID0gb3B0aW9ucy5yZWFkO1xuXG4gIFN0cmVhbS5jYWxsKHRoaXMpO1xufVxuXG4vLyBNYW51YWxseSBzaG92ZSBzb21ldGhpbmcgaW50byB0aGUgcmVhZCgpIGJ1ZmZlci5cbi8vIFRoaXMgcmV0dXJucyB0cnVlIGlmIHRoZSBoaWdoV2F0ZXJNYXJrIGhhcyBub3QgYmVlbiBoaXQgeWV0LFxuLy8gc2ltaWxhciB0byBob3cgV3JpdGFibGUud3JpdGUoKSByZXR1cm5zIHRydWUgaWYgeW91IHNob3VsZFxuLy8gd3JpdGUoKSBzb21lIG1vcmUuXG5SZWFkYWJsZS5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uKGNodW5rLCBlbmNvZGluZykge1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuXG4gIGlmICghc3RhdGUub2JqZWN0TW9kZSAmJiB0eXBlb2YgY2h1bmsgPT09ICdzdHJpbmcnKSB7XG4gICAgZW5jb2RpbmcgPSBlbmNvZGluZyB8fCBzdGF0ZS5kZWZhdWx0RW5jb2Rpbmc7XG4gICAgaWYgKGVuY29kaW5nICE9PSBzdGF0ZS5lbmNvZGluZykge1xuICAgICAgY2h1bmsgPSBuZXcgQnVmZmVyKGNodW5rLCBlbmNvZGluZyk7XG4gICAgICBlbmNvZGluZyA9ICcnO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZWFkYWJsZUFkZENodW5rKHRoaXMsIHN0YXRlLCBjaHVuaywgZW5jb2RpbmcsIGZhbHNlKTtcbn07XG5cbi8vIFVuc2hpZnQgc2hvdWxkICphbHdheXMqIGJlIHNvbWV0aGluZyBkaXJlY3RseSBvdXQgb2YgcmVhZCgpXG5SZWFkYWJsZS5wcm90b3R5cGUudW5zaGlmdCA9IGZ1bmN0aW9uKGNodW5rKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gIHJldHVybiByZWFkYWJsZUFkZENodW5rKHRoaXMsIHN0YXRlLCBjaHVuaywgJycsIHRydWUpO1xufTtcblxuUmVhZGFibGUucHJvdG90eXBlLmlzUGF1c2VkID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcgPT09IGZhbHNlO1xufTtcblxuZnVuY3Rpb24gcmVhZGFibGVBZGRDaHVuayhzdHJlYW0sIHN0YXRlLCBjaHVuaywgZW5jb2RpbmcsIGFkZFRvRnJvbnQpIHtcbiAgdmFyIGVyID0gY2h1bmtJbnZhbGlkKHN0YXRlLCBjaHVuayk7XG4gIGlmIChlcikge1xuICAgIHN0cmVhbS5lbWl0KCdlcnJvcicsIGVyKTtcbiAgfSBlbHNlIGlmIChjaHVuayA9PT0gbnVsbCkge1xuICAgIHN0YXRlLnJlYWRpbmcgPSBmYWxzZTtcbiAgICBvbkVvZkNodW5rKHN0cmVhbSwgc3RhdGUpO1xuICB9IGVsc2UgaWYgKHN0YXRlLm9iamVjdE1vZGUgfHwgY2h1bmsgJiYgY2h1bmsubGVuZ3RoID4gMCkge1xuICAgIGlmIChzdGF0ZS5lbmRlZCAmJiAhYWRkVG9Gcm9udCkge1xuICAgICAgdmFyIGUgPSBuZXcgRXJyb3IoJ3N0cmVhbS5wdXNoKCkgYWZ0ZXIgRU9GJyk7XG4gICAgICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlKTtcbiAgICB9IGVsc2UgaWYgKHN0YXRlLmVuZEVtaXR0ZWQgJiYgYWRkVG9Gcm9udCkge1xuICAgICAgdmFyIGUgPSBuZXcgRXJyb3IoJ3N0cmVhbS51bnNoaWZ0KCkgYWZ0ZXIgZW5kIGV2ZW50Jyk7XG4gICAgICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHN0YXRlLmRlY29kZXIgJiYgIWFkZFRvRnJvbnQgJiYgIWVuY29kaW5nKVxuICAgICAgICBjaHVuayA9IHN0YXRlLmRlY29kZXIud3JpdGUoY2h1bmspO1xuXG4gICAgICBpZiAoIWFkZFRvRnJvbnQpXG4gICAgICAgIHN0YXRlLnJlYWRpbmcgPSBmYWxzZTtcblxuICAgICAgLy8gaWYgd2Ugd2FudCB0aGUgZGF0YSBub3csIGp1c3QgZW1pdCBpdC5cbiAgICAgIGlmIChzdGF0ZS5mbG93aW5nICYmIHN0YXRlLmxlbmd0aCA9PT0gMCAmJiAhc3RhdGUuc3luYykge1xuICAgICAgICBzdHJlYW0uZW1pdCgnZGF0YScsIGNodW5rKTtcbiAgICAgICAgc3RyZWFtLnJlYWQoMCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyB1cGRhdGUgdGhlIGJ1ZmZlciBpbmZvLlxuICAgICAgICBzdGF0ZS5sZW5ndGggKz0gc3RhdGUub2JqZWN0TW9kZSA/IDEgOiBjaHVuay5sZW5ndGg7XG4gICAgICAgIGlmIChhZGRUb0Zyb250KVxuICAgICAgICAgIHN0YXRlLmJ1ZmZlci51bnNoaWZ0KGNodW5rKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgIHN0YXRlLmJ1ZmZlci5wdXNoKGNodW5rKTtcblxuICAgICAgICBpZiAoc3RhdGUubmVlZFJlYWRhYmxlKVxuICAgICAgICAgIGVtaXRSZWFkYWJsZShzdHJlYW0pO1xuICAgICAgfVxuXG4gICAgICBtYXliZVJlYWRNb3JlKHN0cmVhbSwgc3RhdGUpO1xuICAgIH1cbiAgfSBlbHNlIGlmICghYWRkVG9Gcm9udCkge1xuICAgIHN0YXRlLnJlYWRpbmcgPSBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBuZWVkTW9yZURhdGEoc3RhdGUpO1xufVxuXG5cbi8vIGlmIGl0J3MgcGFzdCB0aGUgaGlnaCB3YXRlciBtYXJrLCB3ZSBjYW4gcHVzaCBpbiBzb21lIG1vcmUuXG4vLyBBbHNvLCBpZiB3ZSBoYXZlIG5vIGRhdGEgeWV0LCB3ZSBjYW4gc3RhbmQgc29tZVxuLy8gbW9yZSBieXRlcy4gIFRoaXMgaXMgdG8gd29yayBhcm91bmQgY2FzZXMgd2hlcmUgaHdtPTAsXG4vLyBzdWNoIGFzIHRoZSByZXBsLiAgQWxzbywgaWYgdGhlIHB1c2goKSB0cmlnZ2VyZWQgYVxuLy8gcmVhZGFibGUgZXZlbnQsIGFuZCB0aGUgdXNlciBjYWxsZWQgcmVhZChsYXJnZU51bWJlcikgc3VjaCB0aGF0XG4vLyBuZWVkUmVhZGFibGUgd2FzIHNldCwgdGhlbiB3ZSBvdWdodCB0byBwdXNoIG1vcmUsIHNvIHRoYXQgYW5vdGhlclxuLy8gJ3JlYWRhYmxlJyBldmVudCB3aWxsIGJlIHRyaWdnZXJlZC5cbmZ1bmN0aW9uIG5lZWRNb3JlRGF0YShzdGF0ZSkge1xuICByZXR1cm4gIXN0YXRlLmVuZGVkICYmXG4gICAgICAgICAoc3RhdGUubmVlZFJlYWRhYmxlIHx8XG4gICAgICAgICAgc3RhdGUubGVuZ3RoIDwgc3RhdGUuaGlnaFdhdGVyTWFyayB8fFxuICAgICAgICAgIHN0YXRlLmxlbmd0aCA9PT0gMCk7XG59XG5cbi8vIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LlxuUmVhZGFibGUucHJvdG90eXBlLnNldEVuY29kaW5nID0gZnVuY3Rpb24oZW5jKSB7XG4gIGlmICghU3RyaW5nRGVjb2RlcilcbiAgICBTdHJpbmdEZWNvZGVyID0gcmVxdWlyZSgnc3RyaW5nX2RlY29kZXIvJykuU3RyaW5nRGVjb2RlcjtcbiAgdGhpcy5fcmVhZGFibGVTdGF0ZS5kZWNvZGVyID0gbmV3IFN0cmluZ0RlY29kZXIoZW5jKTtcbiAgdGhpcy5fcmVhZGFibGVTdGF0ZS5lbmNvZGluZyA9IGVuYztcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vLyBEb24ndCByYWlzZSB0aGUgaHdtID4gOE1CXG52YXIgTUFYX0hXTSA9IDB4ODAwMDAwO1xuZnVuY3Rpb24gY29tcHV0ZU5ld0hpZ2hXYXRlck1hcmsobikge1xuICBpZiAobiA+PSBNQVhfSFdNKSB7XG4gICAgbiA9IE1BWF9IV007XG4gIH0gZWxzZSB7XG4gICAgLy8gR2V0IHRoZSBuZXh0IGhpZ2hlc3QgcG93ZXIgb2YgMlxuICAgIG4tLTtcbiAgICBuIHw9IG4gPj4+IDE7XG4gICAgbiB8PSBuID4+PiAyO1xuICAgIG4gfD0gbiA+Pj4gNDtcbiAgICBuIHw9IG4gPj4+IDg7XG4gICAgbiB8PSBuID4+PiAxNjtcbiAgICBuKys7XG4gIH1cbiAgcmV0dXJuIG47XG59XG5cbmZ1bmN0aW9uIGhvd011Y2hUb1JlYWQobiwgc3RhdGUpIHtcbiAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCAmJiBzdGF0ZS5lbmRlZClcbiAgICByZXR1cm4gMDtcblxuICBpZiAoc3RhdGUub2JqZWN0TW9kZSlcbiAgICByZXR1cm4gbiA9PT0gMCA/IDAgOiAxO1xuXG4gIGlmIChuID09PSBudWxsIHx8IGlzTmFOKG4pKSB7XG4gICAgLy8gb25seSBmbG93IG9uZSBidWZmZXIgYXQgYSB0aW1lXG4gICAgaWYgKHN0YXRlLmZsb3dpbmcgJiYgc3RhdGUuYnVmZmVyLmxlbmd0aClcbiAgICAgIHJldHVybiBzdGF0ZS5idWZmZXJbMF0ubGVuZ3RoO1xuICAgIGVsc2VcbiAgICAgIHJldHVybiBzdGF0ZS5sZW5ndGg7XG4gIH1cblxuICBpZiAobiA8PSAwKVxuICAgIHJldHVybiAwO1xuXG4gIC8vIElmIHdlJ3JlIGFza2luZyBmb3IgbW9yZSB0aGFuIHRoZSB0YXJnZXQgYnVmZmVyIGxldmVsLFxuICAvLyB0aGVuIHJhaXNlIHRoZSB3YXRlciBtYXJrLiAgQnVtcCB1cCB0byB0aGUgbmV4dCBoaWdoZXN0XG4gIC8vIHBvd2VyIG9mIDIsIHRvIHByZXZlbnQgaW5jcmVhc2luZyBpdCBleGNlc3NpdmVseSBpbiB0aW55XG4gIC8vIGFtb3VudHMuXG4gIGlmIChuID4gc3RhdGUuaGlnaFdhdGVyTWFyaylcbiAgICBzdGF0ZS5oaWdoV2F0ZXJNYXJrID0gY29tcHV0ZU5ld0hpZ2hXYXRlck1hcmsobik7XG5cbiAgLy8gZG9uJ3QgaGF2ZSB0aGF0IG11Y2guICByZXR1cm4gbnVsbCwgdW5sZXNzIHdlJ3ZlIGVuZGVkLlxuICBpZiAobiA+IHN0YXRlLmxlbmd0aCkge1xuICAgIGlmICghc3RhdGUuZW5kZWQpIHtcbiAgICAgIHN0YXRlLm5lZWRSZWFkYWJsZSA9IHRydWU7XG4gICAgICByZXR1cm4gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHN0YXRlLmxlbmd0aDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbjtcbn1cblxuLy8geW91IGNhbiBvdmVycmlkZSBlaXRoZXIgdGhpcyBtZXRob2QsIG9yIHRoZSBhc3luYyBfcmVhZChuKSBiZWxvdy5cblJlYWRhYmxlLnByb3RvdHlwZS5yZWFkID0gZnVuY3Rpb24obikge1xuICBkZWJ1ZygncmVhZCcsIG4pO1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICB2YXIgbk9yaWcgPSBuO1xuXG4gIGlmICh0eXBlb2YgbiAhPT0gJ251bWJlcicgfHwgbiA+IDApXG4gICAgc3RhdGUuZW1pdHRlZFJlYWRhYmxlID0gZmFsc2U7XG5cbiAgLy8gaWYgd2UncmUgZG9pbmcgcmVhZCgwKSB0byB0cmlnZ2VyIGEgcmVhZGFibGUgZXZlbnQsIGJ1dCB3ZVxuICAvLyBhbHJlYWR5IGhhdmUgYSBidW5jaCBvZiBkYXRhIGluIHRoZSBidWZmZXIsIHRoZW4ganVzdCB0cmlnZ2VyXG4gIC8vIHRoZSAncmVhZGFibGUnIGV2ZW50IGFuZCBtb3ZlIG9uLlxuICBpZiAobiA9PT0gMCAmJlxuICAgICAgc3RhdGUubmVlZFJlYWRhYmxlICYmXG4gICAgICAoc3RhdGUubGVuZ3RoID49IHN0YXRlLmhpZ2hXYXRlck1hcmsgfHwgc3RhdGUuZW5kZWQpKSB7XG4gICAgZGVidWcoJ3JlYWQ6IGVtaXRSZWFkYWJsZScsIHN0YXRlLmxlbmd0aCwgc3RhdGUuZW5kZWQpO1xuICAgIGlmIChzdGF0ZS5sZW5ndGggPT09IDAgJiYgc3RhdGUuZW5kZWQpXG4gICAgICBlbmRSZWFkYWJsZSh0aGlzKTtcbiAgICBlbHNlXG4gICAgICBlbWl0UmVhZGFibGUodGhpcyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBuID0gaG93TXVjaFRvUmVhZChuLCBzdGF0ZSk7XG5cbiAgLy8gaWYgd2UndmUgZW5kZWQsIGFuZCB3ZSdyZSBub3cgY2xlYXIsIHRoZW4gZmluaXNoIGl0IHVwLlxuICBpZiAobiA9PT0gMCAmJiBzdGF0ZS5lbmRlZCkge1xuICAgIGlmIChzdGF0ZS5sZW5ndGggPT09IDApXG4gICAgICBlbmRSZWFkYWJsZSh0aGlzKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8vIEFsbCB0aGUgYWN0dWFsIGNodW5rIGdlbmVyYXRpb24gbG9naWMgbmVlZHMgdG8gYmVcbiAgLy8gKmJlbG93KiB0aGUgY2FsbCB0byBfcmVhZC4gIFRoZSByZWFzb24gaXMgdGhhdCBpbiBjZXJ0YWluXG4gIC8vIHN5bnRoZXRpYyBzdHJlYW0gY2FzZXMsIHN1Y2ggYXMgcGFzc3Rocm91Z2ggc3RyZWFtcywgX3JlYWRcbiAgLy8gbWF5IGJlIGEgY29tcGxldGVseSBzeW5jaHJvbm91cyBvcGVyYXRpb24gd2hpY2ggbWF5IGNoYW5nZVxuICAvLyB0aGUgc3RhdGUgb2YgdGhlIHJlYWQgYnVmZmVyLCBwcm92aWRpbmcgZW5vdWdoIGRhdGEgd2hlblxuICAvLyBiZWZvcmUgdGhlcmUgd2FzICpub3QqIGVub3VnaC5cbiAgLy9cbiAgLy8gU28sIHRoZSBzdGVwcyBhcmU6XG4gIC8vIDEuIEZpZ3VyZSBvdXQgd2hhdCB0aGUgc3RhdGUgb2YgdGhpbmdzIHdpbGwgYmUgYWZ0ZXIgd2UgZG9cbiAgLy8gYSByZWFkIGZyb20gdGhlIGJ1ZmZlci5cbiAgLy9cbiAgLy8gMi4gSWYgdGhhdCByZXN1bHRpbmcgc3RhdGUgd2lsbCB0cmlnZ2VyIGEgX3JlYWQsIHRoZW4gY2FsbCBfcmVhZC5cbiAgLy8gTm90ZSB0aGF0IHRoaXMgbWF5IGJlIGFzeW5jaHJvbm91cywgb3Igc3luY2hyb25vdXMuICBZZXMsIGl0IGlzXG4gIC8vIGRlZXBseSB1Z2x5IHRvIHdyaXRlIEFQSXMgdGhpcyB3YXksIGJ1dCB0aGF0IHN0aWxsIGRvZXNuJ3QgbWVhblxuICAvLyB0aGF0IHRoZSBSZWFkYWJsZSBjbGFzcyBzaG91bGQgYmVoYXZlIGltcHJvcGVybHksIGFzIHN0cmVhbXMgYXJlXG4gIC8vIGRlc2lnbmVkIHRvIGJlIHN5bmMvYXN5bmMgYWdub3N0aWMuXG4gIC8vIFRha2Ugbm90ZSBpZiB0aGUgX3JlYWQgY2FsbCBpcyBzeW5jIG9yIGFzeW5jIChpZSwgaWYgdGhlIHJlYWQgY2FsbFxuICAvLyBoYXMgcmV0dXJuZWQgeWV0KSwgc28gdGhhdCB3ZSBrbm93IHdoZXRoZXIgb3Igbm90IGl0J3Mgc2FmZSB0byBlbWl0XG4gIC8vICdyZWFkYWJsZScgZXRjLlxuICAvL1xuICAvLyAzLiBBY3R1YWxseSBwdWxsIHRoZSByZXF1ZXN0ZWQgY2h1bmtzIG91dCBvZiB0aGUgYnVmZmVyIGFuZCByZXR1cm4uXG5cbiAgLy8gaWYgd2UgbmVlZCBhIHJlYWRhYmxlIGV2ZW50LCB0aGVuIHdlIG5lZWQgdG8gZG8gc29tZSByZWFkaW5nLlxuICB2YXIgZG9SZWFkID0gc3RhdGUubmVlZFJlYWRhYmxlO1xuICBkZWJ1ZygnbmVlZCByZWFkYWJsZScsIGRvUmVhZCk7XG5cbiAgLy8gaWYgd2UgY3VycmVudGx5IGhhdmUgbGVzcyB0aGFuIHRoZSBoaWdoV2F0ZXJNYXJrLCB0aGVuIGFsc28gcmVhZCBzb21lXG4gIGlmIChzdGF0ZS5sZW5ndGggPT09IDAgfHwgc3RhdGUubGVuZ3RoIC0gbiA8IHN0YXRlLmhpZ2hXYXRlck1hcmspIHtcbiAgICBkb1JlYWQgPSB0cnVlO1xuICAgIGRlYnVnKCdsZW5ndGggbGVzcyB0aGFuIHdhdGVybWFyaycsIGRvUmVhZCk7XG4gIH1cblxuICAvLyBob3dldmVyLCBpZiB3ZSd2ZSBlbmRlZCwgdGhlbiB0aGVyZSdzIG5vIHBvaW50LCBhbmQgaWYgd2UncmUgYWxyZWFkeVxuICAvLyByZWFkaW5nLCB0aGVuIGl0J3MgdW5uZWNlc3NhcnkuXG4gIGlmIChzdGF0ZS5lbmRlZCB8fCBzdGF0ZS5yZWFkaW5nKSB7XG4gICAgZG9SZWFkID0gZmFsc2U7XG4gICAgZGVidWcoJ3JlYWRpbmcgb3IgZW5kZWQnLCBkb1JlYWQpO1xuICB9XG5cbiAgaWYgKGRvUmVhZCkge1xuICAgIGRlYnVnKCdkbyByZWFkJyk7XG4gICAgc3RhdGUucmVhZGluZyA9IHRydWU7XG4gICAgc3RhdGUuc3luYyA9IHRydWU7XG4gICAgLy8gaWYgdGhlIGxlbmd0aCBpcyBjdXJyZW50bHkgemVybywgdGhlbiB3ZSAqbmVlZCogYSByZWFkYWJsZSBldmVudC5cbiAgICBpZiAoc3RhdGUubGVuZ3RoID09PSAwKVxuICAgICAgc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICAvLyBjYWxsIGludGVybmFsIHJlYWQgbWV0aG9kXG4gICAgdGhpcy5fcmVhZChzdGF0ZS5oaWdoV2F0ZXJNYXJrKTtcbiAgICBzdGF0ZS5zeW5jID0gZmFsc2U7XG4gIH1cblxuICAvLyBJZiBfcmVhZCBwdXNoZWQgZGF0YSBzeW5jaHJvbm91c2x5LCB0aGVuIGByZWFkaW5nYCB3aWxsIGJlIGZhbHNlLFxuICAvLyBhbmQgd2UgbmVlZCB0byByZS1ldmFsdWF0ZSBob3cgbXVjaCBkYXRhIHdlIGNhbiByZXR1cm4gdG8gdGhlIHVzZXIuXG4gIGlmIChkb1JlYWQgJiYgIXN0YXRlLnJlYWRpbmcpXG4gICAgbiA9IGhvd011Y2hUb1JlYWQobk9yaWcsIHN0YXRlKTtcblxuICB2YXIgcmV0O1xuICBpZiAobiA+IDApXG4gICAgcmV0ID0gZnJvbUxpc3Qobiwgc3RhdGUpO1xuICBlbHNlXG4gICAgcmV0ID0gbnVsbDtcblxuICBpZiAocmV0ID09PSBudWxsKSB7XG4gICAgc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICBuID0gMDtcbiAgfVxuXG4gIHN0YXRlLmxlbmd0aCAtPSBuO1xuXG4gIC8vIElmIHdlIGhhdmUgbm90aGluZyBpbiB0aGUgYnVmZmVyLCB0aGVuIHdlIHdhbnQgdG8ga25vd1xuICAvLyBhcyBzb29uIGFzIHdlICpkbyogZ2V0IHNvbWV0aGluZyBpbnRvIHRoZSBidWZmZXIuXG4gIGlmIChzdGF0ZS5sZW5ndGggPT09IDAgJiYgIXN0YXRlLmVuZGVkKVxuICAgIHN0YXRlLm5lZWRSZWFkYWJsZSA9IHRydWU7XG5cbiAgLy8gSWYgd2UgdHJpZWQgdG8gcmVhZCgpIHBhc3QgdGhlIEVPRiwgdGhlbiBlbWl0IGVuZCBvbiB0aGUgbmV4dCB0aWNrLlxuICBpZiAobk9yaWcgIT09IG4gJiYgc3RhdGUuZW5kZWQgJiYgc3RhdGUubGVuZ3RoID09PSAwKVxuICAgIGVuZFJlYWRhYmxlKHRoaXMpO1xuXG4gIGlmIChyZXQgIT09IG51bGwpXG4gICAgdGhpcy5lbWl0KCdkYXRhJywgcmV0KTtcblxuICByZXR1cm4gcmV0O1xufTtcblxuZnVuY3Rpb24gY2h1bmtJbnZhbGlkKHN0YXRlLCBjaHVuaykge1xuICB2YXIgZXIgPSBudWxsO1xuICBpZiAoIShCdWZmZXIuaXNCdWZmZXIoY2h1bmspKSAmJlxuICAgICAgdHlwZW9mIGNodW5rICE9PSAnc3RyaW5nJyAmJlxuICAgICAgY2h1bmsgIT09IG51bGwgJiZcbiAgICAgIGNodW5rICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICFzdGF0ZS5vYmplY3RNb2RlKSB7XG4gICAgZXIgPSBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIG5vbi1zdHJpbmcvYnVmZmVyIGNodW5rJyk7XG4gIH1cbiAgcmV0dXJuIGVyO1xufVxuXG5cbmZ1bmN0aW9uIG9uRW9mQ2h1bmsoc3RyZWFtLCBzdGF0ZSkge1xuICBpZiAoc3RhdGUuZW5kZWQpIHJldHVybjtcbiAgaWYgKHN0YXRlLmRlY29kZXIpIHtcbiAgICB2YXIgY2h1bmsgPSBzdGF0ZS5kZWNvZGVyLmVuZCgpO1xuICAgIGlmIChjaHVuayAmJiBjaHVuay5sZW5ndGgpIHtcbiAgICAgIHN0YXRlLmJ1ZmZlci5wdXNoKGNodW5rKTtcbiAgICAgIHN0YXRlLmxlbmd0aCArPSBzdGF0ZS5vYmplY3RNb2RlID8gMSA6IGNodW5rLmxlbmd0aDtcbiAgICB9XG4gIH1cbiAgc3RhdGUuZW5kZWQgPSB0cnVlO1xuXG4gIC8vIGVtaXQgJ3JlYWRhYmxlJyBub3cgdG8gbWFrZSBzdXJlIGl0IGdldHMgcGlja2VkIHVwLlxuICBlbWl0UmVhZGFibGUoc3RyZWFtKTtcbn1cblxuLy8gRG9uJ3QgZW1pdCByZWFkYWJsZSByaWdodCBhd2F5IGluIHN5bmMgbW9kZSwgYmVjYXVzZSB0aGlzIGNhbiB0cmlnZ2VyXG4vLyBhbm90aGVyIHJlYWQoKSBjYWxsID0+IHN0YWNrIG92ZXJmbG93LiAgVGhpcyB3YXksIGl0IG1pZ2h0IHRyaWdnZXJcbi8vIGEgbmV4dFRpY2sgcmVjdXJzaW9uIHdhcm5pbmcsIGJ1dCB0aGF0J3Mgbm90IHNvIGJhZC5cbmZ1bmN0aW9uIGVtaXRSZWFkYWJsZShzdHJlYW0pIHtcbiAgdmFyIHN0YXRlID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlO1xuICBzdGF0ZS5uZWVkUmVhZGFibGUgPSBmYWxzZTtcbiAgaWYgKCFzdGF0ZS5lbWl0dGVkUmVhZGFibGUpIHtcbiAgICBkZWJ1ZygnZW1pdFJlYWRhYmxlJywgc3RhdGUuZmxvd2luZyk7XG4gICAgc3RhdGUuZW1pdHRlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICBpZiAoc3RhdGUuc3luYylcbiAgICAgIHByb2Nlc3NOZXh0VGljayhlbWl0UmVhZGFibGVfLCBzdHJlYW0pO1xuICAgIGVsc2VcbiAgICAgIGVtaXRSZWFkYWJsZV8oc3RyZWFtKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBlbWl0UmVhZGFibGVfKHN0cmVhbSkge1xuICBkZWJ1ZygnZW1pdCByZWFkYWJsZScpO1xuICBzdHJlYW0uZW1pdCgncmVhZGFibGUnKTtcbiAgZmxvdyhzdHJlYW0pO1xufVxuXG5cbi8vIGF0IHRoaXMgcG9pbnQsIHRoZSB1c2VyIGhhcyBwcmVzdW1hYmx5IHNlZW4gdGhlICdyZWFkYWJsZScgZXZlbnQsXG4vLyBhbmQgY2FsbGVkIHJlYWQoKSB0byBjb25zdW1lIHNvbWUgZGF0YS4gIHRoYXQgbWF5IGhhdmUgdHJpZ2dlcmVkXG4vLyBpbiB0dXJuIGFub3RoZXIgX3JlYWQobikgY2FsbCwgaW4gd2hpY2ggY2FzZSByZWFkaW5nID0gdHJ1ZSBpZlxuLy8gaXQncyBpbiBwcm9ncmVzcy5cbi8vIEhvd2V2ZXIsIGlmIHdlJ3JlIG5vdCBlbmRlZCwgb3IgcmVhZGluZywgYW5kIHRoZSBsZW5ndGggPCBod20sXG4vLyB0aGVuIGdvIGFoZWFkIGFuZCB0cnkgdG8gcmVhZCBzb21lIG1vcmUgcHJlZW1wdGl2ZWx5LlxuZnVuY3Rpb24gbWF5YmVSZWFkTW9yZShzdHJlYW0sIHN0YXRlKSB7XG4gIGlmICghc3RhdGUucmVhZGluZ01vcmUpIHtcbiAgICBzdGF0ZS5yZWFkaW5nTW9yZSA9IHRydWU7XG4gICAgcHJvY2Vzc05leHRUaWNrKG1heWJlUmVhZE1vcmVfLCBzdHJlYW0sIHN0YXRlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBtYXliZVJlYWRNb3JlXyhzdHJlYW0sIHN0YXRlKSB7XG4gIHZhciBsZW4gPSBzdGF0ZS5sZW5ndGg7XG4gIHdoaWxlICghc3RhdGUucmVhZGluZyAmJiAhc3RhdGUuZmxvd2luZyAmJiAhc3RhdGUuZW5kZWQgJiZcbiAgICAgICAgIHN0YXRlLmxlbmd0aCA8IHN0YXRlLmhpZ2hXYXRlck1hcmspIHtcbiAgICBkZWJ1ZygnbWF5YmVSZWFkTW9yZSByZWFkIDAnKTtcbiAgICBzdHJlYW0ucmVhZCgwKTtcbiAgICBpZiAobGVuID09PSBzdGF0ZS5sZW5ndGgpXG4gICAgICAvLyBkaWRuJ3QgZ2V0IGFueSBkYXRhLCBzdG9wIHNwaW5uaW5nLlxuICAgICAgYnJlYWs7XG4gICAgZWxzZVxuICAgICAgbGVuID0gc3RhdGUubGVuZ3RoO1xuICB9XG4gIHN0YXRlLnJlYWRpbmdNb3JlID0gZmFsc2U7XG59XG5cbi8vIGFic3RyYWN0IG1ldGhvZC4gIHRvIGJlIG92ZXJyaWRkZW4gaW4gc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gY2xhc3Nlcy5cbi8vIGNhbGwgY2IoZXIsIGRhdGEpIHdoZXJlIGRhdGEgaXMgPD0gbiBpbiBsZW5ndGguXG4vLyBmb3IgdmlydHVhbCAobm9uLXN0cmluZywgbm9uLWJ1ZmZlcikgc3RyZWFtcywgXCJsZW5ndGhcIiBpcyBzb21ld2hhdFxuLy8gYXJiaXRyYXJ5LCBhbmQgcGVyaGFwcyBub3QgdmVyeSBtZWFuaW5nZnVsLlxuUmVhZGFibGUucHJvdG90eXBlLl9yZWFkID0gZnVuY3Rpb24obikge1xuICB0aGlzLmVtaXQoJ2Vycm9yJywgbmV3IEVycm9yKCdub3QgaW1wbGVtZW50ZWQnKSk7XG59O1xuXG5SZWFkYWJsZS5wcm90b3R5cGUucGlwZSA9IGZ1bmN0aW9uKGRlc3QsIHBpcGVPcHRzKSB7XG4gIHZhciBzcmMgPSB0aGlzO1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuXG4gIHN3aXRjaCAoc3RhdGUucGlwZXNDb3VudCkge1xuICAgIGNhc2UgMDpcbiAgICAgIHN0YXRlLnBpcGVzID0gZGVzdDtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMTpcbiAgICAgIHN0YXRlLnBpcGVzID0gW3N0YXRlLnBpcGVzLCBkZXN0XTtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICBzdGF0ZS5waXBlcy5wdXNoKGRlc3QpO1xuICAgICAgYnJlYWs7XG4gIH1cbiAgc3RhdGUucGlwZXNDb3VudCArPSAxO1xuICBkZWJ1ZygncGlwZSBjb3VudD0lZCBvcHRzPSVqJywgc3RhdGUucGlwZXNDb3VudCwgcGlwZU9wdHMpO1xuXG4gIHZhciBkb0VuZCA9ICghcGlwZU9wdHMgfHwgcGlwZU9wdHMuZW5kICE9PSBmYWxzZSkgJiZcbiAgICAgICAgICAgICAgZGVzdCAhPT0gcHJvY2Vzcy5zdGRvdXQgJiZcbiAgICAgICAgICAgICAgZGVzdCAhPT0gcHJvY2Vzcy5zdGRlcnI7XG5cbiAgdmFyIGVuZEZuID0gZG9FbmQgPyBvbmVuZCA6IGNsZWFudXA7XG4gIGlmIChzdGF0ZS5lbmRFbWl0dGVkKVxuICAgIHByb2Nlc3NOZXh0VGljayhlbmRGbik7XG4gIGVsc2VcbiAgICBzcmMub25jZSgnZW5kJywgZW5kRm4pO1xuXG4gIGRlc3Qub24oJ3VucGlwZScsIG9udW5waXBlKTtcbiAgZnVuY3Rpb24gb251bnBpcGUocmVhZGFibGUpIHtcbiAgICBkZWJ1Zygnb251bnBpcGUnKTtcbiAgICBpZiAocmVhZGFibGUgPT09IHNyYykge1xuICAgICAgY2xlYW51cCgpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG9uZW5kKCkge1xuICAgIGRlYnVnKCdvbmVuZCcpO1xuICAgIGRlc3QuZW5kKCk7XG4gIH1cblxuICAvLyB3aGVuIHRoZSBkZXN0IGRyYWlucywgaXQgcmVkdWNlcyB0aGUgYXdhaXREcmFpbiBjb3VudGVyXG4gIC8vIG9uIHRoZSBzb3VyY2UuICBUaGlzIHdvdWxkIGJlIG1vcmUgZWxlZ2FudCB3aXRoIGEgLm9uY2UoKVxuICAvLyBoYW5kbGVyIGluIGZsb3coKSwgYnV0IGFkZGluZyBhbmQgcmVtb3ZpbmcgcmVwZWF0ZWRseSBpc1xuICAvLyB0b28gc2xvdy5cbiAgdmFyIG9uZHJhaW4gPSBwaXBlT25EcmFpbihzcmMpO1xuICBkZXN0Lm9uKCdkcmFpbicsIG9uZHJhaW4pO1xuXG4gIHZhciBjbGVhbmVkVXAgPSBmYWxzZTtcbiAgZnVuY3Rpb24gY2xlYW51cCgpIHtcbiAgICBkZWJ1ZygnY2xlYW51cCcpO1xuICAgIC8vIGNsZWFudXAgZXZlbnQgaGFuZGxlcnMgb25jZSB0aGUgcGlwZSBpcyBicm9rZW5cbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdjbG9zZScsIG9uY2xvc2UpO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2ZpbmlzaCcsIG9uZmluaXNoKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdkcmFpbicsIG9uZHJhaW4pO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgb25lcnJvcik7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcigndW5waXBlJywgb251bnBpcGUpO1xuICAgIHNyYy5yZW1vdmVMaXN0ZW5lcignZW5kJywgb25lbmQpO1xuICAgIHNyYy5yZW1vdmVMaXN0ZW5lcignZW5kJywgY2xlYW51cCk7XG4gICAgc3JjLnJlbW92ZUxpc3RlbmVyKCdkYXRhJywgb25kYXRhKTtcblxuICAgIGNsZWFuZWRVcCA9IHRydWU7XG5cbiAgICAvLyBpZiB0aGUgcmVhZGVyIGlzIHdhaXRpbmcgZm9yIGEgZHJhaW4gZXZlbnQgZnJvbSB0aGlzXG4gICAgLy8gc3BlY2lmaWMgd3JpdGVyLCB0aGVuIGl0IHdvdWxkIGNhdXNlIGl0IHRvIG5ldmVyIHN0YXJ0XG4gICAgLy8gZmxvd2luZyBhZ2Fpbi5cbiAgICAvLyBTbywgaWYgdGhpcyBpcyBhd2FpdGluZyBhIGRyYWluLCB0aGVuIHdlIGp1c3QgY2FsbCBpdCBub3cuXG4gICAgLy8gSWYgd2UgZG9uJ3Qga25vdywgdGhlbiBhc3N1bWUgdGhhdCB3ZSBhcmUgd2FpdGluZyBmb3Igb25lLlxuICAgIGlmIChzdGF0ZS5hd2FpdERyYWluICYmXG4gICAgICAgICghZGVzdC5fd3JpdGFibGVTdGF0ZSB8fCBkZXN0Ll93cml0YWJsZVN0YXRlLm5lZWREcmFpbikpXG4gICAgICBvbmRyYWluKCk7XG4gIH1cblxuICBzcmMub24oJ2RhdGEnLCBvbmRhdGEpO1xuICBmdW5jdGlvbiBvbmRhdGEoY2h1bmspIHtcbiAgICBkZWJ1Zygnb25kYXRhJyk7XG4gICAgdmFyIHJldCA9IGRlc3Qud3JpdGUoY2h1bmspO1xuICAgIGlmIChmYWxzZSA9PT0gcmV0KSB7XG4gICAgICAvLyBJZiB0aGUgdXNlciB1bnBpcGVkIGR1cmluZyBgZGVzdC53cml0ZSgpYCwgaXQgaXMgcG9zc2libGVcbiAgICAgIC8vIHRvIGdldCBzdHVjayBpbiBhIHBlcm1hbmVudGx5IHBhdXNlZCBzdGF0ZSBpZiB0aGF0IHdyaXRlXG4gICAgICAvLyBhbHNvIHJldHVybmVkIGZhbHNlLlxuICAgICAgaWYgKHN0YXRlLnBpcGVzQ291bnQgPT09IDEgJiZcbiAgICAgICAgICBzdGF0ZS5waXBlc1swXSA9PT0gZGVzdCAmJlxuICAgICAgICAgIHNyYy5saXN0ZW5lckNvdW50KCdkYXRhJykgPT09IDEgJiZcbiAgICAgICAgICAhY2xlYW5lZFVwKSB7XG4gICAgICAgIGRlYnVnKCdmYWxzZSB3cml0ZSByZXNwb25zZSwgcGF1c2UnLCBzcmMuX3JlYWRhYmxlU3RhdGUuYXdhaXREcmFpbik7XG4gICAgICAgIHNyYy5fcmVhZGFibGVTdGF0ZS5hd2FpdERyYWluKys7XG4gICAgICB9XG4gICAgICBzcmMucGF1c2UoKTtcbiAgICB9XG4gIH1cblxuICAvLyBpZiB0aGUgZGVzdCBoYXMgYW4gZXJyb3IsIHRoZW4gc3RvcCBwaXBpbmcgaW50byBpdC5cbiAgLy8gaG93ZXZlciwgZG9uJ3Qgc3VwcHJlc3MgdGhlIHRocm93aW5nIGJlaGF2aW9yIGZvciB0aGlzLlxuICBmdW5jdGlvbiBvbmVycm9yKGVyKSB7XG4gICAgZGVidWcoJ29uZXJyb3InLCBlcik7XG4gICAgdW5waXBlKCk7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBvbmVycm9yKTtcbiAgICBpZiAoRUVsaXN0ZW5lckNvdW50KGRlc3QsICdlcnJvcicpID09PSAwKVxuICAgICAgZGVzdC5lbWl0KCdlcnJvcicsIGVyKTtcbiAgfVxuICAvLyBUaGlzIGlzIGEgYnJ1dGFsbHkgdWdseSBoYWNrIHRvIG1ha2Ugc3VyZSB0aGF0IG91ciBlcnJvciBoYW5kbGVyXG4gIC8vIGlzIGF0dGFjaGVkIGJlZm9yZSBhbnkgdXNlcmxhbmQgb25lcy4gIE5FVkVSIERPIFRISVMuXG4gIGlmICghZGVzdC5fZXZlbnRzIHx8ICFkZXN0Ll9ldmVudHMuZXJyb3IpXG4gICAgZGVzdC5vbignZXJyb3InLCBvbmVycm9yKTtcbiAgZWxzZSBpZiAoaXNBcnJheShkZXN0Ll9ldmVudHMuZXJyb3IpKVxuICAgIGRlc3QuX2V2ZW50cy5lcnJvci51bnNoaWZ0KG9uZXJyb3IpO1xuICBlbHNlXG4gICAgZGVzdC5fZXZlbnRzLmVycm9yID0gW29uZXJyb3IsIGRlc3QuX2V2ZW50cy5lcnJvcl07XG5cblxuICAvLyBCb3RoIGNsb3NlIGFuZCBmaW5pc2ggc2hvdWxkIHRyaWdnZXIgdW5waXBlLCBidXQgb25seSBvbmNlLlxuICBmdW5jdGlvbiBvbmNsb3NlKCkge1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2ZpbmlzaCcsIG9uZmluaXNoKTtcbiAgICB1bnBpcGUoKTtcbiAgfVxuICBkZXN0Lm9uY2UoJ2Nsb3NlJywgb25jbG9zZSk7XG4gIGZ1bmN0aW9uIG9uZmluaXNoKCkge1xuICAgIGRlYnVnKCdvbmZpbmlzaCcpO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2Nsb3NlJywgb25jbG9zZSk7XG4gICAgdW5waXBlKCk7XG4gIH1cbiAgZGVzdC5vbmNlKCdmaW5pc2gnLCBvbmZpbmlzaCk7XG5cbiAgZnVuY3Rpb24gdW5waXBlKCkge1xuICAgIGRlYnVnKCd1bnBpcGUnKTtcbiAgICBzcmMudW5waXBlKGRlc3QpO1xuICB9XG5cbiAgLy8gdGVsbCB0aGUgZGVzdCB0aGF0IGl0J3MgYmVpbmcgcGlwZWQgdG9cbiAgZGVzdC5lbWl0KCdwaXBlJywgc3JjKTtcblxuICAvLyBzdGFydCB0aGUgZmxvdyBpZiBpdCBoYXNuJ3QgYmVlbiBzdGFydGVkIGFscmVhZHkuXG4gIGlmICghc3RhdGUuZmxvd2luZykge1xuICAgIGRlYnVnKCdwaXBlIHJlc3VtZScpO1xuICAgIHNyYy5yZXN1bWUoKTtcbiAgfVxuXG4gIHJldHVybiBkZXN0O1xufTtcblxuZnVuY3Rpb24gcGlwZU9uRHJhaW4oc3JjKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc3RhdGUgPSBzcmMuX3JlYWRhYmxlU3RhdGU7XG4gICAgZGVidWcoJ3BpcGVPbkRyYWluJywgc3RhdGUuYXdhaXREcmFpbik7XG4gICAgaWYgKHN0YXRlLmF3YWl0RHJhaW4pXG4gICAgICBzdGF0ZS5hd2FpdERyYWluLS07XG4gICAgaWYgKHN0YXRlLmF3YWl0RHJhaW4gPT09IDAgJiYgRUVsaXN0ZW5lckNvdW50KHNyYywgJ2RhdGEnKSkge1xuICAgICAgc3RhdGUuZmxvd2luZyA9IHRydWU7XG4gICAgICBmbG93KHNyYyk7XG4gICAgfVxuICB9O1xufVxuXG5cblJlYWRhYmxlLnByb3RvdHlwZS51bnBpcGUgPSBmdW5jdGlvbihkZXN0KSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG5cbiAgLy8gaWYgd2UncmUgbm90IHBpcGluZyBhbnl3aGVyZSwgdGhlbiBkbyBub3RoaW5nLlxuICBpZiAoc3RhdGUucGlwZXNDb3VudCA9PT0gMClcbiAgICByZXR1cm4gdGhpcztcblxuICAvLyBqdXN0IG9uZSBkZXN0aW5hdGlvbi4gIG1vc3QgY29tbW9uIGNhc2UuXG4gIGlmIChzdGF0ZS5waXBlc0NvdW50ID09PSAxKSB7XG4gICAgLy8gcGFzc2VkIGluIG9uZSwgYnV0IGl0J3Mgbm90IHRoZSByaWdodCBvbmUuXG4gICAgaWYgKGRlc3QgJiYgZGVzdCAhPT0gc3RhdGUucGlwZXMpXG4gICAgICByZXR1cm4gdGhpcztcblxuICAgIGlmICghZGVzdClcbiAgICAgIGRlc3QgPSBzdGF0ZS5waXBlcztcblxuICAgIC8vIGdvdCBhIG1hdGNoLlxuICAgIHN0YXRlLnBpcGVzID0gbnVsbDtcbiAgICBzdGF0ZS5waXBlc0NvdW50ID0gMDtcbiAgICBzdGF0ZS5mbG93aW5nID0gZmFsc2U7XG4gICAgaWYgKGRlc3QpXG4gICAgICBkZXN0LmVtaXQoJ3VucGlwZScsIHRoaXMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gc2xvdyBjYXNlLiBtdWx0aXBsZSBwaXBlIGRlc3RpbmF0aW9ucy5cblxuICBpZiAoIWRlc3QpIHtcbiAgICAvLyByZW1vdmUgYWxsLlxuICAgIHZhciBkZXN0cyA9IHN0YXRlLnBpcGVzO1xuICAgIHZhciBsZW4gPSBzdGF0ZS5waXBlc0NvdW50O1xuICAgIHN0YXRlLnBpcGVzID0gbnVsbDtcbiAgICBzdGF0ZS5waXBlc0NvdW50ID0gMDtcbiAgICBzdGF0ZS5mbG93aW5nID0gZmFsc2U7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKVxuICAgICAgZGVzdHNbaV0uZW1pdCgndW5waXBlJywgdGhpcyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyB0cnkgdG8gZmluZCB0aGUgcmlnaHQgb25lLlxuICB2YXIgaSA9IGluZGV4T2Yoc3RhdGUucGlwZXMsIGRlc3QpO1xuICBpZiAoaSA9PT0gLTEpXG4gICAgcmV0dXJuIHRoaXM7XG5cbiAgc3RhdGUucGlwZXMuc3BsaWNlKGksIDEpO1xuICBzdGF0ZS5waXBlc0NvdW50IC09IDE7XG4gIGlmIChzdGF0ZS5waXBlc0NvdW50ID09PSAxKVxuICAgIHN0YXRlLnBpcGVzID0gc3RhdGUucGlwZXNbMF07XG5cbiAgZGVzdC5lbWl0KCd1bnBpcGUnLCB0aGlzKTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbi8vIHNldCB1cCBkYXRhIGV2ZW50cyBpZiB0aGV5IGFyZSBhc2tlZCBmb3Jcbi8vIEVuc3VyZSByZWFkYWJsZSBsaXN0ZW5lcnMgZXZlbnR1YWxseSBnZXQgc29tZXRoaW5nXG5SZWFkYWJsZS5wcm90b3R5cGUub24gPSBmdW5jdGlvbihldiwgZm4pIHtcbiAgdmFyIHJlcyA9IFN0cmVhbS5wcm90b3R5cGUub24uY2FsbCh0aGlzLCBldiwgZm4pO1xuXG4gIC8vIElmIGxpc3RlbmluZyB0byBkYXRhLCBhbmQgaXQgaGFzIG5vdCBleHBsaWNpdGx5IGJlZW4gcGF1c2VkLFxuICAvLyB0aGVuIGNhbGwgcmVzdW1lIHRvIHN0YXJ0IHRoZSBmbG93IG9mIGRhdGEgb24gdGhlIG5leHQgdGljay5cbiAgaWYgKGV2ID09PSAnZGF0YScgJiYgZmFsc2UgIT09IHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZykge1xuICAgIHRoaXMucmVzdW1lKCk7XG4gIH1cblxuICBpZiAoZXYgPT09ICdyZWFkYWJsZScgJiYgdGhpcy5yZWFkYWJsZSkge1xuICAgIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gICAgaWYgKCFzdGF0ZS5yZWFkYWJsZUxpc3RlbmluZykge1xuICAgICAgc3RhdGUucmVhZGFibGVMaXN0ZW5pbmcgPSB0cnVlO1xuICAgICAgc3RhdGUuZW1pdHRlZFJlYWRhYmxlID0gZmFsc2U7XG4gICAgICBzdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlO1xuICAgICAgaWYgKCFzdGF0ZS5yZWFkaW5nKSB7XG4gICAgICAgIHByb2Nlc3NOZXh0VGljayhuUmVhZGluZ05leHRUaWNrLCB0aGlzKTtcbiAgICAgIH0gZWxzZSBpZiAoc3RhdGUubGVuZ3RoKSB7XG4gICAgICAgIGVtaXRSZWFkYWJsZSh0aGlzLCBzdGF0ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlcztcbn07XG5SZWFkYWJsZS5wcm90b3R5cGUuYWRkTGlzdGVuZXIgPSBSZWFkYWJsZS5wcm90b3R5cGUub247XG5cbmZ1bmN0aW9uIG5SZWFkaW5nTmV4dFRpY2soc2VsZikge1xuICBkZWJ1ZygncmVhZGFibGUgbmV4dHRpY2sgcmVhZCAwJyk7XG4gIHNlbGYucmVhZCgwKTtcbn1cblxuLy8gcGF1c2UoKSBhbmQgcmVzdW1lKCkgYXJlIHJlbW5hbnRzIG9mIHRoZSBsZWdhY3kgcmVhZGFibGUgc3RyZWFtIEFQSVxuLy8gSWYgdGhlIHVzZXIgdXNlcyB0aGVtLCB0aGVuIHN3aXRjaCBpbnRvIG9sZCBtb2RlLlxuUmVhZGFibGUucHJvdG90eXBlLnJlc3VtZSA9IGZ1bmN0aW9uKCkge1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICBpZiAoIXN0YXRlLmZsb3dpbmcpIHtcbiAgICBkZWJ1ZygncmVzdW1lJyk7XG4gICAgc3RhdGUuZmxvd2luZyA9IHRydWU7XG4gICAgcmVzdW1lKHRoaXMsIHN0YXRlKTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG5cbmZ1bmN0aW9uIHJlc3VtZShzdHJlYW0sIHN0YXRlKSB7XG4gIGlmICghc3RhdGUucmVzdW1lU2NoZWR1bGVkKSB7XG4gICAgc3RhdGUucmVzdW1lU2NoZWR1bGVkID0gdHJ1ZTtcbiAgICBwcm9jZXNzTmV4dFRpY2socmVzdW1lXywgc3RyZWFtLCBzdGF0ZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzdW1lXyhzdHJlYW0sIHN0YXRlKSB7XG4gIGlmICghc3RhdGUucmVhZGluZykge1xuICAgIGRlYnVnKCdyZXN1bWUgcmVhZCAwJyk7XG4gICAgc3RyZWFtLnJlYWQoMCk7XG4gIH1cblxuICBzdGF0ZS5yZXN1bWVTY2hlZHVsZWQgPSBmYWxzZTtcbiAgc3RyZWFtLmVtaXQoJ3Jlc3VtZScpO1xuICBmbG93KHN0cmVhbSk7XG4gIGlmIChzdGF0ZS5mbG93aW5nICYmICFzdGF0ZS5yZWFkaW5nKVxuICAgIHN0cmVhbS5yZWFkKDApO1xufVxuXG5SZWFkYWJsZS5wcm90b3R5cGUucGF1c2UgPSBmdW5jdGlvbigpIHtcbiAgZGVidWcoJ2NhbGwgcGF1c2UgZmxvd2luZz0laicsIHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyk7XG4gIGlmIChmYWxzZSAhPT0gdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nKSB7XG4gICAgZGVidWcoJ3BhdXNlJyk7XG4gICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nID0gZmFsc2U7XG4gICAgdGhpcy5lbWl0KCdwYXVzZScpO1xuICB9XG4gIHJldHVybiB0aGlzO1xufTtcblxuZnVuY3Rpb24gZmxvdyhzdHJlYW0pIHtcbiAgdmFyIHN0YXRlID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlO1xuICBkZWJ1ZygnZmxvdycsIHN0YXRlLmZsb3dpbmcpO1xuICBpZiAoc3RhdGUuZmxvd2luZykge1xuICAgIGRvIHtcbiAgICAgIHZhciBjaHVuayA9IHN0cmVhbS5yZWFkKCk7XG4gICAgfSB3aGlsZSAobnVsbCAhPT0gY2h1bmsgJiYgc3RhdGUuZmxvd2luZyk7XG4gIH1cbn1cblxuLy8gd3JhcCBhbiBvbGQtc3R5bGUgc3RyZWFtIGFzIHRoZSBhc3luYyBkYXRhIHNvdXJjZS5cbi8vIFRoaXMgaXMgKm5vdCogcGFydCBvZiB0aGUgcmVhZGFibGUgc3RyZWFtIGludGVyZmFjZS5cbi8vIEl0IGlzIGFuIHVnbHkgdW5mb3J0dW5hdGUgbWVzcyBvZiBoaXN0b3J5LlxuUmVhZGFibGUucHJvdG90eXBlLndyYXAgPSBmdW5jdGlvbihzdHJlYW0pIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgdmFyIHBhdXNlZCA9IGZhbHNlO1xuXG4gIHZhciBzZWxmID0gdGhpcztcbiAgc3RyZWFtLm9uKCdlbmQnLCBmdW5jdGlvbigpIHtcbiAgICBkZWJ1Zygnd3JhcHBlZCBlbmQnKTtcbiAgICBpZiAoc3RhdGUuZGVjb2RlciAmJiAhc3RhdGUuZW5kZWQpIHtcbiAgICAgIHZhciBjaHVuayA9IHN0YXRlLmRlY29kZXIuZW5kKCk7XG4gICAgICBpZiAoY2h1bmsgJiYgY2h1bmsubGVuZ3RoKVxuICAgICAgICBzZWxmLnB1c2goY2h1bmspO1xuICAgIH1cblxuICAgIHNlbGYucHVzaChudWxsKTtcbiAgfSk7XG5cbiAgc3RyZWFtLm9uKCdkYXRhJywgZnVuY3Rpb24oY2h1bmspIHtcbiAgICBkZWJ1Zygnd3JhcHBlZCBkYXRhJyk7XG4gICAgaWYgKHN0YXRlLmRlY29kZXIpXG4gICAgICBjaHVuayA9IHN0YXRlLmRlY29kZXIud3JpdGUoY2h1bmspO1xuXG4gICAgLy8gZG9uJ3Qgc2tpcCBvdmVyIGZhbHN5IHZhbHVlcyBpbiBvYmplY3RNb2RlXG4gICAgaWYgKHN0YXRlLm9iamVjdE1vZGUgJiYgKGNodW5rID09PSBudWxsIHx8IGNodW5rID09PSB1bmRlZmluZWQpKVxuICAgICAgcmV0dXJuO1xuICAgIGVsc2UgaWYgKCFzdGF0ZS5vYmplY3RNb2RlICYmICghY2h1bmsgfHwgIWNodW5rLmxlbmd0aCkpXG4gICAgICByZXR1cm47XG5cbiAgICB2YXIgcmV0ID0gc2VsZi5wdXNoKGNodW5rKTtcbiAgICBpZiAoIXJldCkge1xuICAgICAgcGF1c2VkID0gdHJ1ZTtcbiAgICAgIHN0cmVhbS5wYXVzZSgpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gcHJveHkgYWxsIHRoZSBvdGhlciBtZXRob2RzLlxuICAvLyBpbXBvcnRhbnQgd2hlbiB3cmFwcGluZyBmaWx0ZXJzIGFuZCBkdXBsZXhlcy5cbiAgZm9yICh2YXIgaSBpbiBzdHJlYW0pIHtcbiAgICBpZiAodGhpc1tpXSA9PT0gdW5kZWZpbmVkICYmIHR5cGVvZiBzdHJlYW1baV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRoaXNbaV0gPSBmdW5jdGlvbihtZXRob2QpIHsgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gc3RyZWFtW21ldGhvZF0uYXBwbHkoc3RyZWFtLCBhcmd1bWVudHMpO1xuICAgICAgfTsgfShpKTtcbiAgICB9XG4gIH1cblxuICAvLyBwcm94eSBjZXJ0YWluIGltcG9ydGFudCBldmVudHMuXG4gIHZhciBldmVudHMgPSBbJ2Vycm9yJywgJ2Nsb3NlJywgJ2Rlc3Ryb3knLCAncGF1c2UnLCAncmVzdW1lJ107XG4gIGZvckVhY2goZXZlbnRzLCBmdW5jdGlvbihldikge1xuICAgIHN0cmVhbS5vbihldiwgc2VsZi5lbWl0LmJpbmQoc2VsZiwgZXYpKTtcbiAgfSk7XG5cbiAgLy8gd2hlbiB3ZSB0cnkgdG8gY29uc3VtZSBzb21lIG1vcmUgYnl0ZXMsIHNpbXBseSB1bnBhdXNlIHRoZVxuICAvLyB1bmRlcmx5aW5nIHN0cmVhbS5cbiAgc2VsZi5fcmVhZCA9IGZ1bmN0aW9uKG4pIHtcbiAgICBkZWJ1Zygnd3JhcHBlZCBfcmVhZCcsIG4pO1xuICAgIGlmIChwYXVzZWQpIHtcbiAgICAgIHBhdXNlZCA9IGZhbHNlO1xuICAgICAgc3RyZWFtLnJlc3VtZSgpO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gc2VsZjtcbn07XG5cblxuLy8gZXhwb3NlZCBmb3IgdGVzdGluZyBwdXJwb3NlcyBvbmx5LlxuUmVhZGFibGUuX2Zyb21MaXN0ID0gZnJvbUxpc3Q7XG5cbi8vIFBsdWNrIG9mZiBuIGJ5dGVzIGZyb20gYW4gYXJyYXkgb2YgYnVmZmVycy5cbi8vIExlbmd0aCBpcyB0aGUgY29tYmluZWQgbGVuZ3RocyBvZiBhbGwgdGhlIGJ1ZmZlcnMgaW4gdGhlIGxpc3QuXG5mdW5jdGlvbiBmcm9tTGlzdChuLCBzdGF0ZSkge1xuICB2YXIgbGlzdCA9IHN0YXRlLmJ1ZmZlcjtcbiAgdmFyIGxlbmd0aCA9IHN0YXRlLmxlbmd0aDtcbiAgdmFyIHN0cmluZ01vZGUgPSAhIXN0YXRlLmRlY29kZXI7XG4gIHZhciBvYmplY3RNb2RlID0gISFzdGF0ZS5vYmplY3RNb2RlO1xuICB2YXIgcmV0O1xuXG4gIC8vIG5vdGhpbmcgaW4gdGhlIGxpc3QsIGRlZmluaXRlbHkgZW1wdHkuXG4gIGlmIChsaXN0Lmxlbmd0aCA9PT0gMClcbiAgICByZXR1cm4gbnVsbDtcblxuICBpZiAobGVuZ3RoID09PSAwKVxuICAgIHJldCA9IG51bGw7XG4gIGVsc2UgaWYgKG9iamVjdE1vZGUpXG4gICAgcmV0ID0gbGlzdC5zaGlmdCgpO1xuICBlbHNlIGlmICghbiB8fCBuID49IGxlbmd0aCkge1xuICAgIC8vIHJlYWQgaXQgYWxsLCB0cnVuY2F0ZSB0aGUgYXJyYXkuXG4gICAgaWYgKHN0cmluZ01vZGUpXG4gICAgICByZXQgPSBsaXN0LmpvaW4oJycpO1xuICAgIGVsc2UgaWYgKGxpc3QubGVuZ3RoID09PSAxKVxuICAgICAgcmV0ID0gbGlzdFswXTtcbiAgICBlbHNlXG4gICAgICByZXQgPSBCdWZmZXIuY29uY2F0KGxpc3QsIGxlbmd0aCk7XG4gICAgbGlzdC5sZW5ndGggPSAwO1xuICB9IGVsc2Uge1xuICAgIC8vIHJlYWQganVzdCBzb21lIG9mIGl0LlxuICAgIGlmIChuIDwgbGlzdFswXS5sZW5ndGgpIHtcbiAgICAgIC8vIGp1c3QgdGFrZSBhIHBhcnQgb2YgdGhlIGZpcnN0IGxpc3QgaXRlbS5cbiAgICAgIC8vIHNsaWNlIGlzIHRoZSBzYW1lIGZvciBidWZmZXJzIGFuZCBzdHJpbmdzLlxuICAgICAgdmFyIGJ1ZiA9IGxpc3RbMF07XG4gICAgICByZXQgPSBidWYuc2xpY2UoMCwgbik7XG4gICAgICBsaXN0WzBdID0gYnVmLnNsaWNlKG4pO1xuICAgIH0gZWxzZSBpZiAobiA9PT0gbGlzdFswXS5sZW5ndGgpIHtcbiAgICAgIC8vIGZpcnN0IGxpc3QgaXMgYSBwZXJmZWN0IG1hdGNoXG4gICAgICByZXQgPSBsaXN0LnNoaWZ0KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGNvbXBsZXggY2FzZS5cbiAgICAgIC8vIHdlIGhhdmUgZW5vdWdoIHRvIGNvdmVyIGl0LCBidXQgaXQgc3BhbnMgcGFzdCB0aGUgZmlyc3QgYnVmZmVyLlxuICAgICAgaWYgKHN0cmluZ01vZGUpXG4gICAgICAgIHJldCA9ICcnO1xuICAgICAgZWxzZVxuICAgICAgICByZXQgPSBuZXcgQnVmZmVyKG4pO1xuXG4gICAgICB2YXIgYyA9IDA7XG4gICAgICBmb3IgKHZhciBpID0gMCwgbCA9IGxpc3QubGVuZ3RoOyBpIDwgbCAmJiBjIDwgbjsgaSsrKSB7XG4gICAgICAgIHZhciBidWYgPSBsaXN0WzBdO1xuICAgICAgICB2YXIgY3B5ID0gTWF0aC5taW4obiAtIGMsIGJ1Zi5sZW5ndGgpO1xuXG4gICAgICAgIGlmIChzdHJpbmdNb2RlKVxuICAgICAgICAgIHJldCArPSBidWYuc2xpY2UoMCwgY3B5KTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgIGJ1Zi5jb3B5KHJldCwgYywgMCwgY3B5KTtcblxuICAgICAgICBpZiAoY3B5IDwgYnVmLmxlbmd0aClcbiAgICAgICAgICBsaXN0WzBdID0gYnVmLnNsaWNlKGNweSk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICBsaXN0LnNoaWZ0KCk7XG5cbiAgICAgICAgYyArPSBjcHk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gZW5kUmVhZGFibGUoc3RyZWFtKSB7XG4gIHZhciBzdGF0ZSA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZTtcblxuICAvLyBJZiB3ZSBnZXQgaGVyZSBiZWZvcmUgY29uc3VtaW5nIGFsbCB0aGUgYnl0ZXMsIHRoZW4gdGhhdCBpcyBhXG4gIC8vIGJ1ZyBpbiBub2RlLiAgU2hvdWxkIG5ldmVyIGhhcHBlbi5cbiAgaWYgKHN0YXRlLmxlbmd0aCA+IDApXG4gICAgdGhyb3cgbmV3IEVycm9yKCdlbmRSZWFkYWJsZSBjYWxsZWQgb24gbm9uLWVtcHR5IHN0cmVhbScpO1xuXG4gIGlmICghc3RhdGUuZW5kRW1pdHRlZCkge1xuICAgIHN0YXRlLmVuZGVkID0gdHJ1ZTtcbiAgICBwcm9jZXNzTmV4dFRpY2soZW5kUmVhZGFibGVOVCwgc3RhdGUsIHN0cmVhbSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZW5kUmVhZGFibGVOVChzdGF0ZSwgc3RyZWFtKSB7XG4gIC8vIENoZWNrIHRoYXQgd2UgZGlkbid0IGdldCBvbmUgbGFzdCB1bnNoaWZ0LlxuICBpZiAoIXN0YXRlLmVuZEVtaXR0ZWQgJiYgc3RhdGUubGVuZ3RoID09PSAwKSB7XG4gICAgc3RhdGUuZW5kRW1pdHRlZCA9IHRydWU7XG4gICAgc3RyZWFtLnJlYWRhYmxlID0gZmFsc2U7XG4gICAgc3RyZWFtLmVtaXQoJ2VuZCcpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZvckVhY2ggKHhzLCBmKSB7XG4gIGZvciAodmFyIGkgPSAwLCBsID0geHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgZih4c1tpXSwgaSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaW5kZXhPZiAoeHMsIHgpIHtcbiAgZm9yICh2YXIgaSA9IDAsIGwgPSB4cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBpZiAoeHNbaV0gPT09IHgpIHJldHVybiBpO1xuICB9XG4gIHJldHVybiAtMTtcbn1cbiIsInZhciBUcmFuc2Zvcm0gPSByZXF1aXJlKCdyZWFkYWJsZS1zdHJlYW0vdHJhbnNmb3JtJylcbiAgLCBpbmhlcml0cyAgPSByZXF1aXJlKCd1dGlsJykuaW5oZXJpdHNcbiAgLCB4dGVuZCAgICAgPSByZXF1aXJlKCd4dGVuZCcpXG5cbmZ1bmN0aW9uIERlc3Ryb3lhYmxlVHJhbnNmb3JtKG9wdHMpIHtcbiAgVHJhbnNmb3JtLmNhbGwodGhpcywgb3B0cylcbiAgdGhpcy5fZGVzdHJveWVkID0gZmFsc2Vcbn1cblxuaW5oZXJpdHMoRGVzdHJveWFibGVUcmFuc2Zvcm0sIFRyYW5zZm9ybSlcblxuRGVzdHJveWFibGVUcmFuc2Zvcm0ucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbihlcnIpIHtcbiAgaWYgKHRoaXMuX2Rlc3Ryb3llZCkgcmV0dXJuXG4gIHRoaXMuX2Rlc3Ryb3llZCA9IHRydWVcbiAgXG4gIHZhciBzZWxmID0gdGhpc1xuICBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uKCkge1xuICAgIGlmIChlcnIpXG4gICAgICBzZWxmLmVtaXQoJ2Vycm9yJywgZXJyKVxuICAgIHNlbGYuZW1pdCgnY2xvc2UnKVxuICB9KVxufVxuXG4vLyBhIG5vb3AgX3RyYW5zZm9ybSBmdW5jdGlvblxuZnVuY3Rpb24gbm9vcCAoY2h1bmssIGVuYywgY2FsbGJhY2spIHtcbiAgY2FsbGJhY2sobnVsbCwgY2h1bmspXG59XG5cblxuLy8gY3JlYXRlIGEgbmV3IGV4cG9ydCBmdW5jdGlvbiwgdXNlZCBieSBib3RoIHRoZSBtYWluIGV4cG9ydCBhbmRcbi8vIHRoZSAuY3RvciBleHBvcnQsIGNvbnRhaW5zIGNvbW1vbiBsb2dpYyBmb3IgZGVhbGluZyB3aXRoIGFyZ3VtZW50c1xuZnVuY3Rpb24gdGhyb3VnaDIgKGNvbnN0cnVjdCkge1xuICByZXR1cm4gZnVuY3Rpb24gKG9wdGlvbnMsIHRyYW5zZm9ybSwgZmx1c2gpIHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMgPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZmx1c2ggICAgID0gdHJhbnNmb3JtXG4gICAgICB0cmFuc2Zvcm0gPSBvcHRpb25zXG4gICAgICBvcHRpb25zICAgPSB7fVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdHJhbnNmb3JtICE9ICdmdW5jdGlvbicpXG4gICAgICB0cmFuc2Zvcm0gPSBub29wXG5cbiAgICBpZiAodHlwZW9mIGZsdXNoICE9ICdmdW5jdGlvbicpXG4gICAgICBmbHVzaCA9IG51bGxcblxuICAgIHJldHVybiBjb25zdHJ1Y3Qob3B0aW9ucywgdHJhbnNmb3JtLCBmbHVzaClcbiAgfVxufVxuXG5cbi8vIG1haW4gZXhwb3J0LCBqdXN0IG1ha2UgbWUgYSB0cmFuc2Zvcm0gc3RyZWFtIVxubW9kdWxlLmV4cG9ydHMgPSB0aHJvdWdoMihmdW5jdGlvbiAob3B0aW9ucywgdHJhbnNmb3JtLCBmbHVzaCkge1xuICB2YXIgdDIgPSBuZXcgRGVzdHJveWFibGVUcmFuc2Zvcm0ob3B0aW9ucylcblxuICB0Mi5fdHJhbnNmb3JtID0gdHJhbnNmb3JtXG5cbiAgaWYgKGZsdXNoKVxuICAgIHQyLl9mbHVzaCA9IGZsdXNoXG5cbiAgcmV0dXJuIHQyXG59KVxuXG5cbi8vIG1ha2UgbWUgYSByZXVzYWJsZSBwcm90b3R5cGUgdGhhdCBJIGNhbiBgbmV3YCwgb3IgaW1wbGljaXRseSBgbmV3YFxuLy8gd2l0aCBhIGNvbnN0cnVjdG9yIGNhbGxcbm1vZHVsZS5leHBvcnRzLmN0b3IgPSB0aHJvdWdoMihmdW5jdGlvbiAob3B0aW9ucywgdHJhbnNmb3JtLCBmbHVzaCkge1xuICBmdW5jdGlvbiBUaHJvdWdoMiAob3ZlcnJpZGUpIHtcbiAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgVGhyb3VnaDIpKVxuICAgICAgcmV0dXJuIG5ldyBUaHJvdWdoMihvdmVycmlkZSlcblxuICAgIHRoaXMub3B0aW9ucyA9IHh0ZW5kKG9wdGlvbnMsIG92ZXJyaWRlKVxuXG4gICAgRGVzdHJveWFibGVUcmFuc2Zvcm0uY2FsbCh0aGlzLCB0aGlzLm9wdGlvbnMpXG4gIH1cblxuICBpbmhlcml0cyhUaHJvdWdoMiwgRGVzdHJveWFibGVUcmFuc2Zvcm0pXG5cbiAgVGhyb3VnaDIucHJvdG90eXBlLl90cmFuc2Zvcm0gPSB0cmFuc2Zvcm1cblxuICBpZiAoZmx1c2gpXG4gICAgVGhyb3VnaDIucHJvdG90eXBlLl9mbHVzaCA9IGZsdXNoXG5cbiAgcmV0dXJuIFRocm91Z2gyXG59KVxuXG5cbm1vZHVsZS5leHBvcnRzLm9iaiA9IHRocm91Z2gyKGZ1bmN0aW9uIChvcHRpb25zLCB0cmFuc2Zvcm0sIGZsdXNoKSB7XG4gIHZhciB0MiA9IG5ldyBEZXN0cm95YWJsZVRyYW5zZm9ybSh4dGVuZCh7IG9iamVjdE1vZGU6IHRydWUsIGhpZ2hXYXRlck1hcms6IDE2IH0sIG9wdGlvbnMpKVxuXG4gIHQyLl90cmFuc2Zvcm0gPSB0cmFuc2Zvcm1cblxuICBpZiAoZmx1c2gpXG4gICAgdDIuX2ZsdXNoID0gZmx1c2hcblxuICByZXR1cm4gdDJcbn0pXG4iLCIvLyBSZXR1cm5zIGEgd3JhcHBlciBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSB3cmFwcGVkIGNhbGxiYWNrXG4vLyBUaGUgd3JhcHBlciBmdW5jdGlvbiBzaG91bGQgZG8gc29tZSBzdHVmZiwgYW5kIHJldHVybiBhXG4vLyBwcmVzdW1hYmx5IGRpZmZlcmVudCBjYWxsYmFjayBmdW5jdGlvbi5cbi8vIFRoaXMgbWFrZXMgc3VyZSB0aGF0IG93biBwcm9wZXJ0aWVzIGFyZSByZXRhaW5lZCwgc28gdGhhdFxuLy8gZGVjb3JhdGlvbnMgYW5kIHN1Y2ggYXJlIG5vdCBsb3N0IGFsb25nIHRoZSB3YXkuXG5tb2R1bGUuZXhwb3J0cyA9IHdyYXBweVxuZnVuY3Rpb24gd3JhcHB5IChmbiwgY2IpIHtcbiAgaWYgKGZuICYmIGNiKSByZXR1cm4gd3JhcHB5KGZuKShjYilcblxuICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKVxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ25lZWQgd3JhcHBlciBmdW5jdGlvbicpXG5cbiAgT2JqZWN0LmtleXMoZm4pLmZvckVhY2goZnVuY3Rpb24gKGspIHtcbiAgICB3cmFwcGVyW2tdID0gZm5ba11cbiAgfSlcblxuICByZXR1cm4gd3JhcHBlclxuXG4gIGZ1bmN0aW9uIHdyYXBwZXIoKSB7XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aClcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIGFyZ3NbaV0gPSBhcmd1bWVudHNbaV1cbiAgICB9XG4gICAgdmFyIHJldCA9IGZuLmFwcGx5KHRoaXMsIGFyZ3MpXG4gICAgdmFyIGNiID0gYXJnc1thcmdzLmxlbmd0aC0xXVxuICAgIGlmICh0eXBlb2YgcmV0ID09PSAnZnVuY3Rpb24nICYmIHJldCAhPT0gY2IpIHtcbiAgICAgIE9iamVjdC5rZXlzKGNiKS5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7XG4gICAgICAgIHJldFtrXSA9IGNiW2tdXG4gICAgICB9KVxuICAgIH1cbiAgICByZXR1cm4gcmV0XG4gIH1cbn1cbiIsInZhciBuYXRpdmVJc0FycmF5ID0gQXJyYXkuaXNBcnJheVxudmFyIHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZ1xuXG5tb2R1bGUuZXhwb3J0cyA9IG5hdGl2ZUlzQXJyYXkgfHwgaXNBcnJheVxuXG5mdW5jdGlvbiBpc0FycmF5KG9iaikge1xuICAgIHJldHVybiB0b1N0cmluZy5jYWxsKG9iaikgPT09IFwiW29iamVjdCBBcnJheV1cIlxufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgd2luZG93ID0gcmVxdWlyZShcImdsb2JhbC93aW5kb3dcIilcbnZhciBvbmNlID0gcmVxdWlyZShcIm9uY2VcIilcbnZhciBpc0Z1bmN0aW9uID0gcmVxdWlyZShcImlzLWZ1bmN0aW9uXCIpXG52YXIgcGFyc2VIZWFkZXJzID0gcmVxdWlyZShcInBhcnNlLWhlYWRlcnNcIilcbnZhciB4dGVuZCA9IHJlcXVpcmUoXCJ4dGVuZFwiKVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNyZWF0ZVhIUlxuY3JlYXRlWEhSLlhNTEh0dHBSZXF1ZXN0ID0gd2luZG93LlhNTEh0dHBSZXF1ZXN0IHx8IG5vb3BcbmNyZWF0ZVhIUi5YRG9tYWluUmVxdWVzdCA9IFwid2l0aENyZWRlbnRpYWxzXCIgaW4gKG5ldyBjcmVhdGVYSFIuWE1MSHR0cFJlcXVlc3QoKSkgPyBjcmVhdGVYSFIuWE1MSHR0cFJlcXVlc3QgOiB3aW5kb3cuWERvbWFpblJlcXVlc3RcblxuZm9yRWFjaEFycmF5KFtcImdldFwiLCBcInB1dFwiLCBcInBvc3RcIiwgXCJwYXRjaFwiLCBcImhlYWRcIiwgXCJkZWxldGVcIl0sIGZ1bmN0aW9uKG1ldGhvZCkge1xuICAgIGNyZWF0ZVhIUlttZXRob2QgPT09IFwiZGVsZXRlXCIgPyBcImRlbFwiIDogbWV0aG9kXSA9IGZ1bmN0aW9uKHVyaSwgb3B0aW9ucywgY2FsbGJhY2spIHtcbiAgICAgICAgb3B0aW9ucyA9IGluaXRQYXJhbXModXJpLCBvcHRpb25zLCBjYWxsYmFjaylcbiAgICAgICAgb3B0aW9ucy5tZXRob2QgPSBtZXRob2QudG9VcHBlckNhc2UoKVxuICAgICAgICByZXR1cm4gX2NyZWF0ZVhIUihvcHRpb25zKVxuICAgIH1cbn0pXG5cbmZ1bmN0aW9uIGZvckVhY2hBcnJheShhcnJheSwgaXRlcmF0b3IpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGl0ZXJhdG9yKGFycmF5W2ldKVxuICAgIH1cbn1cblxuZnVuY3Rpb24gaXNFbXB0eShvYmope1xuICAgIGZvcih2YXIgaSBpbiBvYmope1xuICAgICAgICBpZihvYmouaGFzT3duUHJvcGVydHkoaSkpIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZVxufVxuXG5mdW5jdGlvbiBpbml0UGFyYW1zKHVyaSwgb3B0aW9ucywgY2FsbGJhY2spIHtcbiAgICB2YXIgcGFyYW1zID0gdXJpXG5cbiAgICBpZiAoaXNGdW5jdGlvbihvcHRpb25zKSkge1xuICAgICAgICBjYWxsYmFjayA9IG9wdGlvbnNcbiAgICAgICAgaWYgKHR5cGVvZiB1cmkgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHBhcmFtcyA9IHt1cmk6dXJpfVxuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcGFyYW1zID0geHRlbmQob3B0aW9ucywge3VyaTogdXJpfSlcbiAgICB9XG5cbiAgICBwYXJhbXMuY2FsbGJhY2sgPSBjYWxsYmFja1xuICAgIHJldHVybiBwYXJhbXNcbn1cblxuZnVuY3Rpb24gY3JlYXRlWEhSKHVyaSwgb3B0aW9ucywgY2FsbGJhY2spIHtcbiAgICBvcHRpb25zID0gaW5pdFBhcmFtcyh1cmksIG9wdGlvbnMsIGNhbGxiYWNrKVxuICAgIHJldHVybiBfY3JlYXRlWEhSKG9wdGlvbnMpXG59XG5cbmZ1bmN0aW9uIF9jcmVhdGVYSFIob3B0aW9ucykge1xuICAgIHZhciBjYWxsYmFjayA9IG9wdGlvbnMuY2FsbGJhY2tcbiAgICBpZih0eXBlb2YgY2FsbGJhY2sgPT09IFwidW5kZWZpbmVkXCIpe1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJjYWxsYmFjayBhcmd1bWVudCBtaXNzaW5nXCIpXG4gICAgfVxuICAgIGNhbGxiYWNrID0gb25jZShjYWxsYmFjaylcblxuICAgIGZ1bmN0aW9uIHJlYWR5c3RhdGVjaGFuZ2UoKSB7XG4gICAgICAgIGlmICh4aHIucmVhZHlTdGF0ZSA9PT0gNCkge1xuICAgICAgICAgICAgbG9hZEZ1bmMoKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0Qm9keSgpIHtcbiAgICAgICAgLy8gQ2hyb21lIHdpdGggcmVxdWVzdFR5cGU9YmxvYiB0aHJvd3MgZXJyb3JzIGFycm91bmQgd2hlbiBldmVuIHRlc3RpbmcgYWNjZXNzIHRvIHJlc3BvbnNlVGV4dFxuICAgICAgICB2YXIgYm9keSA9IHVuZGVmaW5lZFxuXG4gICAgICAgIGlmICh4aHIucmVzcG9uc2UpIHtcbiAgICAgICAgICAgIGJvZHkgPSB4aHIucmVzcG9uc2VcbiAgICAgICAgfSBlbHNlIGlmICh4aHIucmVzcG9uc2VUeXBlID09PSBcInRleHRcIiB8fCAheGhyLnJlc3BvbnNlVHlwZSkge1xuICAgICAgICAgICAgYm9keSA9IHhoci5yZXNwb25zZVRleHQgfHwgeGhyLnJlc3BvbnNlWE1MXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNKc29uKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGJvZHkgPSBKU09OLnBhcnNlKGJvZHkpXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7fVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGJvZHlcbiAgICB9XG5cbiAgICB2YXIgZmFpbHVyZVJlc3BvbnNlID0ge1xuICAgICAgICAgICAgICAgIGJvZHk6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7fSxcbiAgICAgICAgICAgICAgICBzdGF0dXNDb2RlOiAwLFxuICAgICAgICAgICAgICAgIG1ldGhvZDogbWV0aG9kLFxuICAgICAgICAgICAgICAgIHVybDogdXJpLFxuICAgICAgICAgICAgICAgIHJhd1JlcXVlc3Q6IHhoclxuICAgICAgICAgICAgfVxuXG4gICAgZnVuY3Rpb24gZXJyb3JGdW5jKGV2dCkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dFRpbWVyKVxuICAgICAgICBpZighKGV2dCBpbnN0YW5jZW9mIEVycm9yKSl7XG4gICAgICAgICAgICBldnQgPSBuZXcgRXJyb3IoXCJcIiArIChldnQgfHwgXCJVbmtub3duIFhNTEh0dHBSZXF1ZXN0IEVycm9yXCIpIClcbiAgICAgICAgfVxuICAgICAgICBldnQuc3RhdHVzQ29kZSA9IDBcbiAgICAgICAgY2FsbGJhY2soZXZ0LCBmYWlsdXJlUmVzcG9uc2UpXG4gICAgfVxuXG4gICAgLy8gd2lsbCBsb2FkIHRoZSBkYXRhICYgcHJvY2VzcyB0aGUgcmVzcG9uc2UgaW4gYSBzcGVjaWFsIHJlc3BvbnNlIG9iamVjdFxuICAgIGZ1bmN0aW9uIGxvYWRGdW5jKCkge1xuICAgICAgICBpZiAoYWJvcnRlZCkgcmV0dXJuXG4gICAgICAgIHZhciBzdGF0dXNcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRUaW1lcilcbiAgICAgICAgaWYob3B0aW9ucy51c2VYRFIgJiYgeGhyLnN0YXR1cz09PXVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy9JRTggQ09SUyBHRVQgc3VjY2Vzc2Z1bCByZXNwb25zZSBkb2Vzbid0IGhhdmUgYSBzdGF0dXMgZmllbGQsIGJ1dCBib2R5IGlzIGZpbmVcbiAgICAgICAgICAgIHN0YXR1cyA9IDIwMFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3RhdHVzID0gKHhoci5zdGF0dXMgPT09IDEyMjMgPyAyMDQgOiB4aHIuc3RhdHVzKVxuICAgICAgICB9XG4gICAgICAgIHZhciByZXNwb25zZSA9IGZhaWx1cmVSZXNwb25zZVxuICAgICAgICB2YXIgZXJyID0gbnVsbFxuXG4gICAgICAgIGlmIChzdGF0dXMgIT09IDApe1xuICAgICAgICAgICAgcmVzcG9uc2UgPSB7XG4gICAgICAgICAgICAgICAgYm9keTogZ2V0Qm9keSgpLFxuICAgICAgICAgICAgICAgIHN0YXR1c0NvZGU6IHN0YXR1cyxcbiAgICAgICAgICAgICAgICBtZXRob2Q6IG1ldGhvZCxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7fSxcbiAgICAgICAgICAgICAgICB1cmw6IHVyaSxcbiAgICAgICAgICAgICAgICByYXdSZXF1ZXN0OiB4aHJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmKHhoci5nZXRBbGxSZXNwb25zZUhlYWRlcnMpeyAvL3JlbWVtYmVyIHhociBjYW4gaW4gZmFjdCBiZSBYRFIgZm9yIENPUlMgaW4gSUVcbiAgICAgICAgICAgICAgICByZXNwb25zZS5oZWFkZXJzID0gcGFyc2VIZWFkZXJzKHhoci5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGVyciA9IG5ldyBFcnJvcihcIkludGVybmFsIFhNTEh0dHBSZXF1ZXN0IEVycm9yXCIpXG4gICAgICAgIH1cbiAgICAgICAgY2FsbGJhY2soZXJyLCByZXNwb25zZSwgcmVzcG9uc2UuYm9keSlcblxuICAgIH1cblxuICAgIHZhciB4aHIgPSBvcHRpb25zLnhociB8fCBudWxsXG5cbiAgICBpZiAoIXhocikge1xuICAgICAgICBpZiAob3B0aW9ucy5jb3JzIHx8IG9wdGlvbnMudXNlWERSKSB7XG4gICAgICAgICAgICB4aHIgPSBuZXcgY3JlYXRlWEhSLlhEb21haW5SZXF1ZXN0KClcbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICB4aHIgPSBuZXcgY3JlYXRlWEhSLlhNTEh0dHBSZXF1ZXN0KClcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBrZXlcbiAgICB2YXIgYWJvcnRlZFxuICAgIHZhciB1cmkgPSB4aHIudXJsID0gb3B0aW9ucy51cmkgfHwgb3B0aW9ucy51cmxcbiAgICB2YXIgbWV0aG9kID0geGhyLm1ldGhvZCA9IG9wdGlvbnMubWV0aG9kIHx8IFwiR0VUXCJcbiAgICB2YXIgYm9keSA9IG9wdGlvbnMuYm9keSB8fCBvcHRpb25zLmRhdGEgfHwgbnVsbFxuICAgIHZhciBoZWFkZXJzID0geGhyLmhlYWRlcnMgPSBvcHRpb25zLmhlYWRlcnMgfHwge31cbiAgICB2YXIgc3luYyA9ICEhb3B0aW9ucy5zeW5jXG4gICAgdmFyIGlzSnNvbiA9IGZhbHNlXG4gICAgdmFyIHRpbWVvdXRUaW1lclxuXG4gICAgaWYgKFwianNvblwiIGluIG9wdGlvbnMpIHtcbiAgICAgICAgaXNKc29uID0gdHJ1ZVxuICAgICAgICBoZWFkZXJzW1wiYWNjZXB0XCJdIHx8IGhlYWRlcnNbXCJBY2NlcHRcIl0gfHwgKGhlYWRlcnNbXCJBY2NlcHRcIl0gPSBcImFwcGxpY2F0aW9uL2pzb25cIikgLy9Eb24ndCBvdmVycmlkZSBleGlzdGluZyBhY2NlcHQgaGVhZGVyIGRlY2xhcmVkIGJ5IHVzZXJcbiAgICAgICAgaWYgKG1ldGhvZCAhPT0gXCJHRVRcIiAmJiBtZXRob2QgIT09IFwiSEVBRFwiKSB7XG4gICAgICAgICAgICBoZWFkZXJzW1wiY29udGVudC10eXBlXCJdIHx8IGhlYWRlcnNbXCJDb250ZW50LVR5cGVcIl0gfHwgKGhlYWRlcnNbXCJDb250ZW50LVR5cGVcIl0gPSBcImFwcGxpY2F0aW9uL2pzb25cIikgLy9Eb24ndCBvdmVycmlkZSBleGlzdGluZyBhY2NlcHQgaGVhZGVyIGRlY2xhcmVkIGJ5IHVzZXJcbiAgICAgICAgICAgIGJvZHkgPSBKU09OLnN0cmluZ2lmeShvcHRpb25zLmpzb24pXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gcmVhZHlzdGF0ZWNoYW5nZVxuICAgIHhoci5vbmxvYWQgPSBsb2FkRnVuY1xuICAgIHhoci5vbmVycm9yID0gZXJyb3JGdW5jXG4gICAgLy8gSUU5IG11c3QgaGF2ZSBvbnByb2dyZXNzIGJlIHNldCB0byBhIHVuaXF1ZSBmdW5jdGlvbi5cbiAgICB4aHIub25wcm9ncmVzcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gSUUgbXVzdCBkaWVcbiAgICB9XG4gICAgeGhyLm9udGltZW91dCA9IGVycm9yRnVuY1xuICAgIHhoci5vcGVuKG1ldGhvZCwgdXJpLCAhc3luYywgb3B0aW9ucy51c2VybmFtZSwgb3B0aW9ucy5wYXNzd29yZClcbiAgICAvL2hhcyB0byBiZSBhZnRlciBvcGVuXG4gICAgaWYoIXN5bmMpIHtcbiAgICAgICAgeGhyLndpdGhDcmVkZW50aWFscyA9ICEhb3B0aW9ucy53aXRoQ3JlZGVudGlhbHNcbiAgICB9XG4gICAgLy8gQ2Fubm90IHNldCB0aW1lb3V0IHdpdGggc3luYyByZXF1ZXN0XG4gICAgLy8gbm90IHNldHRpbmcgdGltZW91dCBvbiB0aGUgeGhyIG9iamVjdCwgYmVjYXVzZSBvZiBvbGQgd2Via2l0cyBldGMuIG5vdCBoYW5kbGluZyB0aGF0IGNvcnJlY3RseVxuICAgIC8vIGJvdGggbnBtJ3MgcmVxdWVzdCBhbmQganF1ZXJ5IDEueCB1c2UgdGhpcyBraW5kIG9mIHRpbWVvdXQsIHNvIHRoaXMgaXMgYmVpbmcgY29uc2lzdGVudFxuICAgIGlmICghc3luYyAmJiBvcHRpb25zLnRpbWVvdXQgPiAwICkge1xuICAgICAgICB0aW1lb3V0VGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICBhYm9ydGVkPXRydWUvL0lFOSBtYXkgc3RpbGwgY2FsbCByZWFkeXN0YXRlY2hhbmdlXG4gICAgICAgICAgICB4aHIuYWJvcnQoXCJ0aW1lb3V0XCIpXG4gICAgICAgICAgICB2YXIgZSA9IG5ldyBFcnJvcihcIlhNTEh0dHBSZXF1ZXN0IHRpbWVvdXRcIilcbiAgICAgICAgICAgIGUuY29kZSA9IFwiRVRJTUVET1VUXCJcbiAgICAgICAgICAgIGVycm9yRnVuYyhlKVxuICAgICAgICB9LCBvcHRpb25zLnRpbWVvdXQgKVxuICAgIH1cblxuICAgIGlmICh4aHIuc2V0UmVxdWVzdEhlYWRlcikge1xuICAgICAgICBmb3Ioa2V5IGluIGhlYWRlcnMpe1xuICAgICAgICAgICAgaWYoaGVhZGVycy5oYXNPd25Qcm9wZXJ0eShrZXkpKXtcbiAgICAgICAgICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihrZXksIGhlYWRlcnNba2V5XSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0gZWxzZSBpZiAob3B0aW9ucy5oZWFkZXJzICYmICFpc0VtcHR5KG9wdGlvbnMuaGVhZGVycykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSGVhZGVycyBjYW5ub3QgYmUgc2V0IG9uIGFuIFhEb21haW5SZXF1ZXN0IG9iamVjdFwiKVxuICAgIH1cblxuICAgIGlmIChcInJlc3BvbnNlVHlwZVwiIGluIG9wdGlvbnMpIHtcbiAgICAgICAgeGhyLnJlc3BvbnNlVHlwZSA9IG9wdGlvbnMucmVzcG9uc2VUeXBlXG4gICAgfVxuXG4gICAgaWYgKFwiYmVmb3JlU2VuZFwiIGluIG9wdGlvbnMgJiZcbiAgICAgICAgdHlwZW9mIG9wdGlvbnMuYmVmb3JlU2VuZCA9PT0gXCJmdW5jdGlvblwiXG4gICAgKSB7XG4gICAgICAgIG9wdGlvbnMuYmVmb3JlU2VuZCh4aHIpXG4gICAgfVxuXG4gICAgeGhyLnNlbmQoYm9keSlcblxuICAgIHJldHVybiB4aHJcblxuXG59XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuIiwibW9kdWxlLmV4cG9ydHMgPSBvbmNlXG5cbm9uY2UucHJvdG8gPSBvbmNlKGZ1bmN0aW9uICgpIHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEZ1bmN0aW9uLnByb3RvdHlwZSwgJ29uY2UnLCB7XG4gICAgdmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBvbmNlKHRoaXMpXG4gICAgfSxcbiAgICBjb25maWd1cmFibGU6IHRydWVcbiAgfSlcbn0pXG5cbmZ1bmN0aW9uIG9uY2UgKGZuKSB7XG4gIHZhciBjYWxsZWQgPSBmYWxzZVxuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIGlmIChjYWxsZWQpIHJldHVyblxuICAgIGNhbGxlZCA9IHRydWVcbiAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKVxuICB9XG59XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGV4dGVuZFxuXG52YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuXG5mdW5jdGlvbiBleHRlbmQoKSB7XG4gICAgdmFyIHRhcmdldCA9IHt9XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldXG5cbiAgICAgICAgZm9yICh2YXIga2V5IGluIHNvdXJjZSkge1xuICAgICAgICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRhcmdldFxufVxuIiwibW9kdWxlLmV4cG9ydHMgPSBleHRlbmRcblxudmFyIGhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcblxuZnVuY3Rpb24gZXh0ZW5kKHRhcmdldCkge1xuICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV1cblxuICAgICAgICBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7XG4gICAgICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHtcbiAgICAgICAgICAgICAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGFyZ2V0XG59XG4iXX0=